/**
 * calendar.js
 *
 * Version 0.8 20050707
 *
 * @author name: Andreas Reichert
 * @author email: reichert@top21.de
 * @author company: Top 21 GmbH
 * @author copyright: (c) Top 21 GmbH, Andreas Reichert
 *
 * @ToDo: 		Nach M\u00f6glichkeit umschreiben auf reines Dom an Stelle der String-Concatinierung (wenns ?berhaupt geht [ie-problematik beim schreiben von scripten])
 *				Umschreiben auf reines css ohne Background-Colors etc.
 *				title-Attribute der Kalenderzellen ?berarbeiten
 *
 * @required: prototype.js
 * Based on:
 *
 * @author original Scripter: TengYong Ng
 * @author original url http://www.rainforestnet.com
 * @author original Copyright (c) 2003 TengYong Ng
 *
 */

/**
 * Globale Variablen f?r den Kalender
 *
 * @author andi r.
 * @version 20040408
 */
//Global variables
var winCal;
var dtToday = new Date();
var Cal;
var docCal;
var exDateTime;
//Existing Date and Time
var WeekChar = 2;
//number of character for week day. if 2 then Mo,Tu,We. if 3 then Mon,Tue,Wed.
var CellWidth = 20;
//Width of day cell.
var DateSeparator = ".";
//Date Separator, you can change it to "/" if you want.
var TimeMode = 24;
//default TimeMode value. 12 or 24
var ShowLongMonth = true;
//Show long month name in Calendar header. example: "January".
var ShowMonthYear = true;
//Show Month and Year in Calendar header.
var ShowSeconds = false;
//Show Seconds in Editor or not
var MonthYearColor = "#cc0033";
//Font Color of Month and Year in Calendar header.
var WeekHeadColor = "#AAAAAA";
//Background Color in Week header.
var SundayColor = "#6699FF";
//Background color of Sunday.
var SaturdayColor = "#CCCCFF";
//Background color of Saturday.
var WeekDayColor1 = "#FFFFFF";
//Background color of weekdays.
var WeekDayColor2 = "#EEEEEE";
// Background color of holydays
var HolidayColor = "#FFD700";
//Background color of weekdays.
var FontColor = "blue";
//color of font in Calendar day cell.
var TodayColor = "#FFFF33";
//Background color of today.
var SelDateColor = "#FFFF99";
//Backgrond color of selected date in textbox.
var YrSelColor = "#cc0033";
//color of font of Year selector.
var ThemeBg = "";
//Background image of Calendar window.
//end Global variable

function NewCal(pCtrl, pFormat, ev)
{
   ti = 100;
   Cal = new Calendar(dtToday);
   Cal.initDate = new Date();
   if(pFormat.indexOf('m') != - 1 || pFormat.indexOf('H') != - 1 || pFormat.indexOf('h') != - 1)
   {
      Cal.ShowTime = true;
      if(pFormat.indexOf('H') != - 1)
      {
         TimeMode = 24;
      }
      else if(pFormat.indexOf('h') != - 1)
      {
         TimeMode = 12;
      }
   }
   if(pCtrl != null) Cal.Ctrl = pCtrl;
   if(pFormat != null) Cal.Format = pFormat;
   exDateTime = document.getElementById(pCtrl).value;
   if(exDateTime != "") //Parse Date String
   {
   	  // create initDate
   			fieldVal = new String(document.getElementById(pCtrl).value);
	  			Cal.initDate = fieldVal.getDateFromFormat(pFormat);
      //parse month
      Cal.Month = Cal.initDate.getMonth();
      //end parse month
      //parse Date
      Cal.Date = Cal.initDate.getDate();
      //end parse Date
      //parse year
      Cal.Year = Cal.initDate.getFullYear();
      //end parse year
      //parse time
      /* edit 06.07.2005 */
      if(Cal.ShowTime == true)
      {
         Cal.SetHour(Cal.initDate.getHours());
         Cal.SetMinute(Cal.initDate.getMinutes());
         Cal.SetSecond(Cal.initDate.getSeconds());
      }
   }
   // Extention BechtleIntranet
   CalCreateLayer(ev);
   // focus setzen
   try
   {
      document.getElementById('MonthSelector').focus();
   }
   catch(e)
   {
   }
}

function RenderCal()
{
   var vCalHeader;
   var vCalData;
   var vCalTime;
   var i;
   var j;
   var SelectStr;
   var vDayCount = 0;
   var vFirstDay;
   var CalStr = new String();

   CalStr += '<form name="Calendar">';
   CalStr += '<div class="calHead"><a href="javascript:closeCalendar()" class="calHead" title="Kalender schlie&szlig;en">x</a></div>\n';
   vCalHeader = '<table align="center" valign="top">\n';
   //Month Selector
   vCalHeader += '<tr>\n<td colspan="8"><table><tr><td align="left">\n';
   vCalHeader += '<select name="MonthSelector" id="MonthSelector" tabindex="' + ti+++ '"  onChange="javascript:Cal.SwitchMth(this.selectedIndex);RenderCal();">\n';
   for(i = 0; i < 12; i++)
   {
      if(i == Cal.Month)
      {
         SelectStr = ' selected="selected"';
      }
      else
      {
         SelectStr = "";
      }
      vCalHeader += '<option' + SelectStr + ' value="' + MONTH_NAMES[i] + '">' + MONTH_NAMES[i] + '</option>\n';
   }
   vCalHeader += '</select></td>';
   //Year selector
   vCalHeader += '\n<td align="right"><strong style="color: ' + YrSelColor + '; text-decoration: none"><a href="javascript:Cal.DecYear();RenderCal()" tabindex="' + ti+++ '" style="color: ' + YrSelColor + '; text-decoration: none"><</a>&nbsp;' + Cal.Year + '&nbsp;<a href="javascript:Cal.IncYear();RenderCal()" tabindex="' + ti+++ '" style="color: ' + YrSelColor + '; text-decoration: none">></a></strong></td></tr></table></td>\n';
   vCalHeader += '</tr>';
   //Calendar header shows Month and Year
   if(ShowMonthYear) vCalHeader += '<tr><td colspan="8"><strong style="' + MonthYearColor + '">' + Cal.GetMonthName(ShowLongMonth) + " " + Cal.Year + '</strong></td></tr>\n';
   //Week day header
   vCalHeader += '<tr style="background-color: ' + WeekHeadColor + '">';
   for(i = 0; i < 7; i++)
   {
      vCalHeader += '<td style="text-aling: center">' + DAY_NAMES[i].substr(0, WeekChar) + '</td>';
   }
   vCalHeader += '<td>KW</td></tr>';
   CalStr += vCalHeader;
   WeekDayColor = WeekDayColor1;
   //Calendar detail
   CalDate = new Date(Cal.Year, Cal.Month);
   CalDate.setDate(1);
   vFirstDay = CalDate.getDay();
   vCalData = '<tr>';
   for(i = 0; i < vFirstDay; i++)
   {
      vCalData = vCalData + GenCell();
      vDayCount = vDayCount + 1;
   }
   for(j = 1; j <= Cal.GetMonDays(); j++)
   {
      var strCell;
      vDayCount = vDayCount + 1;
      var ad = CalDate;
      ad.setDate(j);
      if(isHoliday(ad)) strCell = GenCell(j, false, HolidayColor, isHoliday(ad));
      else if((j == dtToday.getDate()) &&(Cal.Month == dtToday.getMonth()) &&(Cal.Year == dtToday.getFullYear()))
      {
         strCell = GenCell(j, true, TodayColor, 'Heute');
      }
      //Highlight today's date
      else
      {
         if(j == Cal.Date)
         {
            strCell = GenCell(j, true, SelDateColor);
         }
         else
         {
            if(vDayCount % 7 == 0) strCell = GenCell(j, false, SaturdayColor);
            else if((vDayCount + 6) % 7 == 0) strCell = GenCell(j, false, SundayColor);
            else strCell = GenCell(j, null, WeekDayColor);
         }
      }
      vCalData = vCalData + strCell;
      if((vDayCount % 7 == 0) &&(j < Cal.GetMonDays()))
      {
         vCalData = vCalData + '<td style="text-align: center">' + Cal.getCalWeek(j) + '</td></tr>\n<tr>';
         if(WeekDayColor == WeekDayColor1) WeekDayColor = WeekDayColor2;
         else WeekDayColor = WeekDayColor1;
      }
   }
   while(vDayCount % 7 != 0)
   {
      vCalData = vCalData + GenCell();
      vDayCount = vDayCount + 1;
   }
   CalStr += vCalData;
   CalStr += '<td style="text-align: center">' + Cal.getCalWeek(j) + '</td><tr>\n';
   //Time picker
   if(Cal.ShowTime)
   {
      var showHour;
      showHour = Cal.getShowHour();
      vCalTime = '<td colspan="8" align="center">';
      vCalTime += '<input type="text" name="hour" maxlength="2" size="1" style="width: 22px" value="' + showHour + '" onblur="Cal.SetHour(this.value)">';
      vCalTime += ' : ';
      vCalTime += '<input type="text" name="minute" maxlength="2" size="1" style="width: 22px" value="' + Cal.Minutes + '" onblur="Cal.SetMinute(this.value)">';
      if(ShowSeconds)
      {
         vCalTime += ' : ';
         vCalTime += '<input type="text" name="second" maxlength="2" size="1" style="width: 22px" value="' + Cal.Seconds + '" onblur="Cal.SetSecond(this.value)">';
      }
      else
      {
         vCalTime += '<input type="hidden" name="second" value="00"/>';
      }
      if(TimeMode == 12)
      {
         var SelectAm =(parseInt(Cal.Hours, 10) < 12) ? ' selected="selected"' : '';
         var SelectPm =(parseInt(Cal.Hours, 10) >= 12) ? ' selected="selected"' : '';
         vCalTime += '<select name="ampm" onchange="javascript:Cal.SetAmPm(this.options[this.selectedIndex].value);">';
         vCalTime += '<option' + SelectAm + ' value="AM">AM</option>';
         vCalTime += '<option' + SelectPm + ' value="PM">PM<option>';
         vCalTime += '</select>';
      }
      vCalTime += '\n</td>\n</tr>';
      CalStr += vCalTime;
   }
   //end time picker
   CalStr += '\n</table>';
   '</form>';
   document.getElementById("CalDiv").innerHTML = CalStr;
}

function GenCell(pValue, pHighLight, pColor, Ctitle) //Generate table cell with value
{
   var PValue;
   var PCellStr;
   var vColor;
   var vHLstr1;
   var titleStr;
   //HighLight string
   var vHlstr2;
   var vTimeStr;
   if(pValue == null)
   {
      PValue = "";
   }
   else
   {
      PValue = pValue;
   }
   if(pColor != null)
   {
      vColor = ' background-color: ' + pColor;
   }
   else
   {
      vColor = "";
   }
   if((pHighLight != null) &&(pHighLight))
   {
      vHLstr1 = " color: red;";
   }
   else
   {
      vHLstr1 = "";
   }

   if(Ctitle) titleStr = ' title="' + Ctitle + '"';

   PCellStr = '<td style="text-align: center; width: ' + CellWidth + ';' + vHLstr1 + vColor + '"' + titleStr + '>';
   if(PValue != "")
   {
      PCellStr += '<a href="javascript:document.getElementById(\'' + Cal.Ctrl + '\').value=Cal.FormatDate(' + PValue + ');closeCalendar();" tabindex="' + ti+++ '">' + PValue + '</a></td>';
   }
   else
   {
      PCellStr += '&nbsp;</td>';
   }
   return PCellStr;
}

function Calendar(pDate, pCtrl)
{
   //Properties
   this.gDate = pDate;
   this.Date = pDate.getDate();
   //selected date
   this.Month = pDate.getMonth();
   //selected month number
   this.Year = pDate.getFullYear();
   //selected year in 4 digits
   this.Hours = pDate.getHours();
   fm = this.Month + 1;
   fd = this.Date + 1;
   if(this.Date < 9)
   {
      this.fullDate = "0" + fd.toString();
   }
   else
   {
      this.fullDate = fd.toString();
   }
   if(this.Month < 9)
   {
      this.fullMonth = "0" + fm.toString();
   }
   else
   {
      this.fullMonth = fm.toString();
   }
   if(pDate.getMinutes() < 10)
   {
      this.Minutes = "0" + pDate.getMinutes();
   }
   else
   {
      this.Minutes = pDate.getMinutes();
   }
   if(pDate.getSeconds() < 10)
   {
      this.Seconds = "0" + pDate.getSeconds();
   }
   else
   {
      this.Seconds = pDate.getSeconds();
   }
   this.MyWindow = winCal;
   this.Ctrl = pCtrl;
   this.Format = "dd.MM.yyyy";
   this.Separator = DateSeparator;
   this.ShowTime = false;
   if(pDate.getHours() < 12)
   {
      this.AMorPM = "AM";
   }
   else
   {
      this.AMorPM = "PM";
   }
}
Calendar.prototype.GetMonthIndex = function(shortMonthName)
{
   for(i = 0; i < 12; i++)
   {
      if(MONTH_NAMES[i].substring(0, 3).toUpperCase() == shortMonthName.toUpperCase())
      {
         return i;
      }
   }
}
Calendar.prototype.IncYear = function()
{
   Cal.Year++;
}
Calendar.prototype.DecYear = function()
{
   Cal.Year--;
}
Calendar.prototype.SwitchMth = function(intMth)
{
   Cal.Month = intMth;
}
Calendar.prototype.SetHour = function(intHour)
{
   var MaxHour;
   var MinHour;
   if(TimeMode == 24)
   {
      MaxHour = 23;
      MinHour = 0;
   }
   else if(TimeMode == 12)
   {
      MaxHour = 12;
      MinHour = 1;
   }
   else alert("TimeMode can only be 12 or 24");
   var HourExp = new RegExp("^\\d\\d$");
   if(HourExp.test(intHour) &&(parseInt(intHour, 10) <= MaxHour) &&(parseInt(intHour, 10) >= MinHour))
   {
      if((TimeMode == 12) &&(Cal.AMorPM == "PM"))
      {
         if(parseInt(intHour, 10) == 12)
         {
            Cal.Hours = 12;
         }
         else
         {
            Cal.Hours = parseInt(intHour, 10) + 12;
         }
      }
      else if((TimeMode == 12) &&(Cal.AMorPM == "AM"))
      {
         if(intHour == 12)
         {
            intHour -= 12;
         }
         Cal.Hours = parseInt(intHour, 10);
      }
      else if(TimeMode == 24)
      {
         Cal.Hours = parseInt(intHour, 10);
      }
   }
}
Calendar.prototype.SetMinute = function(intMin)
{
   var MinExp = new RegExp("^\\d\\d$");
   if(MinExp.test(intMin) &&(intMin < 60))
   {
      Cal.Minutes = intMin;
   }
}
Calendar.prototype.SetSecond = function(intSec)
{
   var SecExp = new RegExp("^\\d\\d$");
   if(SecExp.test(intSec) &&(intSec < 60))
   {
      Cal.Seconds = intSec;
   }
}
Calendar.prototype.SetAmPm = function(pvalue)
{
   this.AMorPM = pvalue;
   if(pvalue == "PM")
   {
      this.Hours =(parseInt(this.Hours, 10)) + 12;
      if(this.Hours == 24)
      {
         this.Hours = 12;
      }
   }
   else if(pvalue == "AM")
   {
      this.Hours -= 12;
   }
}
Calendar.prototype.getShowHour = function()
{
   var finalHour;
   if(TimeMode == 12)
   {
      if(parseInt(this.Hours, 10) == 0)
      {
         this.AMorPM = "AM";
         finalHour = parseInt(this.Hours, 10) + 12;
      }
      else if(parseInt(this.Hours, 10) == 12)
      {
         this.AMorPM = "PM";
         finalHour = 12;
      }
      else if(this.Hours > 12)
      {
         this.AMorPM = "PM";
         if((this.Hours - 12) < 10)
         {
            finalHour = "0" +((parseInt(this.Hours, 10)) - 12);
         }
         else
         {
            finalHour = parseInt(this.Hours, 10) - 12;
         }
      }
      else
      {
         this.AMorPM = "AM";
         if(this.Hours < 10)
         {
            finalHour = "0" + parseInt(this.Hours, 10);
         }
         else
         {
            finalHour = this.Hours;
         }
      }
   }
   else if(TimeMode == 24)
   {
      if(this.Hours < 10)
      {
         finalHour = "0" + parseInt(this.Hours, 10);
      }
      else
      {
         finalHour = this.Hours;
      }
   }
   return finalHour;
}
Calendar.prototype.GetMonthName = function(IsLong)
{
   var Month = MONTH_NAMES[this.Month];
   if(IsLong)
   {
      return Month;
   }
   else
   {
      return Month.substr(0, 3);
   }
}
Calendar.prototype.GetMonDays = function() //Get number of days in a month
{
   var DaysInMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
   if(this.IsLeapYear())
   {
      DaysInMonth[1] = 29;
   }
   return DaysInMonth[this.Month];
}
Calendar.prototype.IsLeapYear = function()
{
   if((this.Year % 4) == 0)
   {
      if((this.Year % 100 == 0) &&(this.Year % 400) != 0)
      {
         return false;
      }
      else
      {
         return true;
      }
   }
   else
   {
      return false;
   }
}
Calendar.prototype.FormatDate = function(pDate)
{
   var dt = new Date(this.Year, dualNumberFormat((this.Month)), dualNumberFormat(pDate), this.Hours, this.Minutes);
   return dt.formatDate(this.Format);
}
/**
 * macht aus einer Zahl einen 2-stelligen String
 *
 * @argument number zahl
 * @return string 2-stelliger string der Zahl (1->01)
 *
 * @author andi r.
 * @version 20040109
 *
 */

function dualNumberFormat(nr)
{
   if(nr.toString().length < 2)
   {
      nrReturn = "0" + nr.toString();
   }
   else
   {
      nrReturn = nr.toString();
   }
   return nrReturn;
}
/**
 * Berechnung der Kalenderwoche
 *
 * @argument day tag des Monats
 *
 * @author andi r.
 * @version 20040109
 *
 */
Calendar.prototype.getCalWeek = function(day)
{
   datum = new Date(this.Year, this.Month, day);
   var jh = datum.getYear();
   if(jh < 1900)
   {
      jh += 1900;
   }
   jh++;
   var kalwo = kaldiff(datum, jh);
   while(kalwo < 1)
   {
      jh--;
      kalwo = kaldiff(datum, jh);
   }
   return kalwo;
}

function kaldiff(datum, jahr)
{
   var d4j = new Date(jahr, 0, 4);
   var wt4j =(d4j.getDay() + 6) % 7;
   return Math.floor(1.05 +(datum.getTime() - d4j.getTime()) /6048e5+wt4j/ 7);
}
/**
 * erstellen und positionieren eines Div-Containers zur darstellung des Kalenders
 *
 * @argument ev (Event) Click-Event des Buttons
 *
 * @author andi r.
 * @version 20040402
 *
 */

function CalCreateLayer(ev)
{
   var pyo;
   var myTarget = ev.srcElement;
   var t = new String();
   var l = new String();
   var top = 0;
   var left = 0;
   // ermittlung der Position des Eventausl\u00f6senden Elements
   while(myTarget != document.body)
   {
      try
      {
         top += myTarget.offsetTop;
         left += myTarget.offsetLeft;
         myTarget = myTarget.offsetParent;
      }
      catch(e) //Notbremse: bei Volldarstellung im Framework wird der Body nicht gefunden (IE)
      {
         break;
      }
   }
   var calDiv = document.createElement("div");
   calDiv.setAttribute("id", "CalDiv");
   document.body.appendChild(calDiv);
   pyo = document.documentElement.scrollTop;
   if(ev != null && ev)
   {
      // select boxen verstecken
      selectBoxes = document.getElementsByTagName('select');
      for(var i = 0; i < selectBoxes.length; i++)
      {
         selectBoxes[i].style.visibility = "hidden";
      }
      RenderCal();
      // Positionierung in Abh\u00e4ngigkeit der Position des Images
      // wenn am rechten Bildrand wird der Kalender nach links ausgerichtet,
      // ansonsten in Richtung Rechts
      if((calDiv.offsetWidth + left) < document.body.offsetWidth)
      {
         l = left - 2 + "px";
      }
      else
      {
         l =(left - calDiv.offsetWidth + 12) + "px";
      }
      t = top - 2 + "px";
      calDiv.style.top = t;
      calDiv.style.left = l;
      shieldDiv();
   }
}


/**
 * Funktion zur Berechnung der beweglichen Feiertage
 * Ausgehend vom Ostersonntag werden im Julianischen Kalender
 * diverse Feiertage berechnet. Zus\u00e4tzlich werden statische Feiertage angegeben
 *
 * @argument dat (date)
 * @return Name des Feiertages/null
 * @version 20040503
 * @author andi r.
 *
 */

function isHoliday(dat)
{
   var Jahr = dat.getFullYear();
   var vgldat = dat.formatDate('yyyyMMdd');
   var HolidayArray = new Array();
   HolidayArray[Jahr.toString() + "0101"]  = ['Neujahr'];
   HolidayArray[Jahr.toString() + "0106"]  = ['Heilige 3 K\u00f6nige'];
   HolidayArray[movableHoliday(Jahr, -2)]  = ['Karfreitag'];
   HolidayArray[movableHoliday(Jahr, 0)]   = ['Ostersonntag'];
   HolidayArray[movableHoliday(Jahr, +1)]  = ['Ostermontag'];
   HolidayArray[Jahr.toString() + "0501"]  = ['Tag der Arbeit'];
   HolidayArray[movableHoliday(Jahr, +39)] = ['Christi Himmelfahrt'];
   HolidayArray[movableHoliday(Jahr, +49)] = ['Pfingstsonntag'];
   HolidayArray[movableHoliday(Jahr, +50)] = ['Pfingstmontag'];
   HolidayArray[movableHoliday(Jahr, +60)] = ['Fronleichnam'];
   HolidayArray[Jahr.toString() + "1003"]  = ['Tag der deutschen Einheit'];
   HolidayArray[Jahr.toString() + "1101"]  = ['Allerheiligen'];
   HolidayArray[Jahr.toString() + "1224"]  = ['Heiliger Abend'];
   HolidayArray[Jahr.toString() + "1225"]  = ['1. Weihnachtsfeiertag'];
   HolidayArray[Jahr.toString() + "1226"]  = ['2. Weihnachtsfeiertag'];
   HolidayArray[Jahr.toString() + "1231"]  = ['Silvester'];

   if(HolidayArray[vgldat])
   {
      return HolidayArray[vgldat];
   }
   else
   {
      return null;
   }
}

function movableHoliday(Jahr, TagesDifferenz)
{
   var a = Jahr % 19;
   var d =(19 * a + 24) % 30;
   var Tag = d +(2 *(Jahr % 4) + 4 *(Jahr % 7) + 6 * d + 5) % 7;
   if((Tag == 35) ||((Tag == 34) &&(d == 28) &&(a > 10)))
   {
      Tag -= 7;
   }
   var HolidayDate = new Date(Jahr, 2, 22);
   // 86400000 = 24 h * 60 min * 60 s * 1000 ms
   HolidayDate.setTime(HolidayDate.getTime() + 86400000 * TagesDifferenz + 86400000 * Tag); // Uhrzeit aus dem Datum entfernen
   HolidayDate = HolidayDate.formatDate('yyyyMMdd');
   return HolidayDate;
}

/**
 * div-container, der unter dem kalender liegt und gleichzeitiges editieren
 * au\u00dferhalb des Kalenders unterbindet
 *
 *
 * @author andi r.
 * @version 20040122
 *
 */

function shieldDiv()
{
   var sDiv = document.createElement("div");
   sDiv.setAttribute("id", "shieldDiv");
   sDiv.setAttribute("onclick", "alert('bitte erst ein Datum ausw\u00e4hlen')");
   document.body.appendChild(sDiv);
   var shieldDiv = document.getElementById('shieldDiv');
   shieldDiv.style.width = document.body.offsetWidth + "px";
   shieldDiv.style.height = document.body.offsetHeight + "px";
}
/**
 * Schlie\u00dft den Kalender und den shieldDiv wieder
 *
 *
 * @author andi r.
 * @version 20040122
 *
 */

function closeCalendar()
{
   sDiv = document.getElementById('shieldDiv');
   calDiv = document.getElementById('CalDiv');
   document.body.removeChild(sDiv);
   document.body.removeChild(calDiv);
   // select boxen wieder sichtbar machen
   selectBoxes = document.getElementsByTagName('select');
   for(var i = 0; i < selectBoxes.length; i++)
   {
      selectBoxes[i].style.visibility = "visible";
   }
   try
   {
      di = "date_" + Cal.Ctrl;
      document.getElementById(di).focus();
   }
   catch(e)
   {
   };
}
// ------------------------------------------------------------------
// isDate ( date_string, format_string )
// Returns true if date string matches format of format string and
// is a valid date. Else returns false.
// It is recommended that you trim whitespace around the value before
// passing it to this function, as whitespace is NOT ignored!
// ------------------------------------------------------------------

function isDate(val, format)
{
   var date = getDateFromFormat(val, format);
   if(date == 0)
   {
      return false;
   }
   return true;
}
// -------------------------------------------------------------------
// compareDates(date1,date1format,date2,date2format)
//   Compare two date strings to see which is greater.
//   Returns:
//   1 if date1 is greater than date2
//   0 if date2 is greater than date1 of if they are the same
//  -1 if either of the dates is in an invalid format
// -------------------------------------------------------------------

function compareDates(date1, dateformat1, date2, dateformat2)
{
   var d1 = getDateFromFormat(date1, dateformat1);
   var d2 = getDateFromFormat(date2, dateformat2);
   if(d1 == 0 || d2 == 0)
   {
      return - 1;
   }
   else if(d1 > d2)
   {
      return 1;
   }
   return 0;
}
// ------------------------------------------------------------------
// parseDate( date_string [, prefer_euro_format] )
//
// This function takes a date string and tries to match it to a
// number of possible date formats to get the value. It will try to
// match against the following international formats, in this order:
// y-M-d   MMM d, y   MMM d,y   y-MMM-d   d-MMM-y  MMM d
// M/d/y   M-d-y      M.d.y     MMM-d     M/d      M-d
// d/M/y   d-M-y      d.M.y     d-MMM     d/M      d-M
// A second argument may be passed to instruct the method to search
// for formats like d/M/y (european format) before M/d/y (American).
// Returns a Date object or null if no patterns match.
// ------------------------------------------------------------------

function parseDate(val)
{
   var preferEuro =(arguments.length == 2) ? arguments[1] : false;
   generalFormats = new Array('y-M-d', 'MMM d, y', 'MMM d,y', 'y-MMM-d', 'd-MMM-y', 'MMM d');
   monthFirst = new Array('M/d/y', 'M-d-y', 'M.d.y', 'MMM-d', 'M/d', 'M-d');
   dateFirst = new Array('d/M/y', 'd-M-y', 'd.M.y', 'd-MMM', 'd/M', 'd-M');
   var checkList = new Array('generalFormats', preferEuro ? 'dateFirst' : 'monthFirst', preferEuro ? 'monthFirst' : 'dateFirst');
   var d = null;
   for(var i = 0; i < checkList.length; i++)
   {
      var l = window[checkList[i]];
      for(var j = 0; j < l.length; j++)
      {
         d = getDateFromFormat(val, l[j]);
         if(d != 0)
         {
            return new Date(d);
         }
      }
   }
   return null;
}
