/******************************************************************************************************
Author : Lea Smart
Source : www.totallysmartit.com
Date : 7/3/2001
DHTML Calendar
Version 1.2

You are free to use this code if you retain this header.
******************************************************************************************************/
	
var timeoutDelay=2000;            // milliseconds, change this if you like, set to 0 for the calendar to never auto disappear
var g_startDay=1;                 // 0=sunday, 1=monday
var imgDir='/forms/images/';      // local directory storing button images
var yearFormat='yy';              // yy (02) or yyyy (2002)
var monthFormat='short';          // Short (Jan) or Full (January) note: only if date format id dd-mmm-yy (3m's)

// preload images
var imgUp=new Image(8,12);
imgUp.src=imgDir+'cal_up.gif';
var imgDown=new Image(8,12);
imgDown.src=imgDir+'cal_down.gif';

// used by timeout auto hide functions
var timeoutId=false;

// the now standard browser sniffer class
function Browser() {
  this.dom=document.getElementById?1:0;
  this.ie4=(document.all&&!this.dom)?1:0;
  this.ns4=(document.layers&&!this.dom)?1:0;
  this.ns6=(this.dom&&!document.all)?1:0;
  this.ie5=(this.dom&&document.all)?1:0;
  this.ok=this.dom||this.ie4||this.ns4;
  this.platform=navigator.platform;
}

var browser=new Browser();

if (browser.dom || browser.ie4){
  var containerStyle='';
  var thisContainer='';
  browser.platform=='Win32'?width=180:width=200;
  browser.platform=='Win32'?height=42:height=42;
  containerStyle+=' style="';
  containerStyle+='position:absolute; ';
  containerStyle+='left:100px; ';
  containerStyle+='top:100px; ';
  containerStyle+='width:'+width+'px; ';
  containerStyle+='height:'+height+'px; ';
  containerStyle+='clip:rect(1px '+width+6+"px "+height+0+'px 1px); ';
  containerStyle+='visibility:hidden; ';
  containerStyle+='background-color:#FFFFFF; ';
  containerStyle+='z-index:999; ';
  //containerStyle+='overflow:hidden; ';
  containerStyle+='" ';

  thisContainer+='<div id="container"'+containerStyle;
  if (timeoutDelay) { thisContainer+=' onmouseout="calendarTimeout();" onmouseover="if (timeoutId) clearTimeout(timeoutId);"'; }
  thisContainer+='></div>';

  document.write(thisContainer);
}

var myCalendar;  // global to hold the calendar reference, set by constructor

function calendarTimeout() {
  if (browser.ie4||browser.ie5) {
    if (window.event.srcElement&&window.event.srcElement.name!='month') {
      timeoutId=setTimeout('myCalendar.hide();',timeoutDelay);
    }
  }
  if (browser.ns6||browser.ns4) {
    timeoutId=setTimeout('myCalendar.hide();',timeoutDelay);
  }
}

// constructor for calendar class
function Calendar() {
  myCalendar=this;
  // some constants needed throughout the program
  this.daysOfWeek=new Array('Su','Mo','Tu','We','Th','Fr','Sa');
  this.months=new Array('January','February','March','April','May','June','July','August','September','October','November','December');
  this.daysInMonth=new Array(31,28,31,30,31,30,31,31,30,31,30,31);

  if (browser.ns4) {
    var tmpLayer=new Layer(127);
    if (timeoutDelay) {
      tmpLayer.captureEvents(Event.MOUSEOVER|Event.MOUSEOUT);
      tmpLayer.onmouseover=function(event) { if (timeoutId) clearTimeout(timeoutId); };
      tmpLayer.onmouseout=function(event) { timeoutId=setTimeout('myCalendar.hide()',timeoutDelay);};
    }
    tmpLayer.x=100;
    tmpLayer.y=100;
    tmpLayer.bgColor='#FFFFFF';
  }
  if (browser.dom||browser.ie4) { var tmpLayer=browser.dom?document.getElementById('container'):document.all.container; }
  this.containerLayer=tmpLayer;
  if (browser.ns4&&browser.platform=='Win32') {
    this.containerLayer.clip.height=134;
    this.containerLayer.clip.width=127;
  }
}

Calendar.prototype.getFirstDOM=function() {
  var thedate=new Date();
  thedate.setDate(1);
  thedate.setMonth(this.month);
  thedate.setFullYear(this.year);
  return thedate.getDay();
}

Calendar.prototype.getDaysInMonth=function () {
  if (this.month!=1) {
    return this.daysInMonth[this.month]
  } else {
    // is it a leap year
    if (Date.isLeapYear(this.year)) {
      return 29;
    } else {
      return 28;
    }
  }
}

Calendar.prototype.buildString=function() {
  var tmpStr;
  if (browser.ns4||browser.ns6) {  // Netscape
    tmpStr='<form onSubmit="this.year.blur();return false;"><table width="100%" border="0" cellspacing="0" cellpadding="1" class="calBorderColor"><tr><td valign="top"><table width="100%" border="0" cellspacing="0" cellpadding="0" class="calBgColor">';
  } else {
    tmpStr='<table width="100%" border="0" cellspacing="0" cellpadding="1" class="calBorderColor"><form onSubmit="this.year.blur();return false;"><tr><td valign="top"><table width="100%" border="0" cellspacing="1" cellpadding="1" class="calBgColor">';
  }
  tmpStr+='<tr>';
  tmpStr+='<td width="60%" class="cal" align="left">';
  if (this.hasDropDown) {
    tmpStr+='<select class="month" name="month" onchange="myCalendar.selectChange();">';
    for (var i=0;i<this.months.length;i++) {
      tmpStr+='<option value="'+i+'"' 
      if (i == this.month) tmpStr+=' selected';
      tmpStr+='>'+this.months[i]+'</option>';
    }
    tmpStr+='</select>';
  } else {
    tmpStr+='<table border="0" cellspacing="0" cellpadding="0"><tr><td><a href="javascript: myCalendar.changeMonth(-1);"><img name="calendar" src="'+imgDir+'cal_down.gif" width="8" height="12" border="0" alt=""></a></td><td class="cal" width="100%" align="center">'+this.months[this.month]+'</td><td class="cal"><a href="javascript: myCalendar.changeMonth(+1);"><img name="calendar" src="'+imgDir+'cal_up.gif" width="8" height="12" border="0" alt=""></a></td></tr></table>';
  }
  tmpStr+='</td>';
  tmpStr+='<td width="40%" align="right" class="cal">';
  if (this.hasDropDown) { 
    tmpStr+='<input class="year" type="text" size="';
    // get round NS4 win32 lenght of year input problem
    (browser.ns4&&browser.platform=='Win32')?tmpStr+=1:tmpStr+=4;
  tmpStr+='" name="year" maxlength="4" onBlur="myCalendar.inputChange();" value="'+this.year+'">';
  } else {
    tmpStr+='<table height="1%" border="0" cellspacing="0" cellpadding="0"><tr><td class="cal"><a href="javascript: myCalendar.changeYear(-1);"><img name="calendar" src="'+imgDir+'cal_down.gif" width="8" height="12" border="0" alt=""></a></td><td class="cal" width="100%" align="center">'+this.year+'</td><td class="cal"><a href="javascript: myCalendar.changeYear(+1);"><img name="calendar" src="'+imgDir+'cal_up.gif" width="8" height="12" border="0" alt=""></a></td></tr></table>'
  }
  tmpStr+='</td>';
  tmpStr+='</tr>';
  tmpStr+='</table>';
  var iCount=1;
  var iFirstDOM=(7+this.getFirstDOM()-g_startDay)%7; // to prevent calling it in a loop
  var iDaysInMonth=this.getDaysInMonth(); // to prevent calling it in a loop

  tmpStr+='<table width="100%" height="1%" border="0" cellspacing="1" cellpadding="1" class="calBgColor">';
  tmpStr+='<tr>';
  for (var i=0;i<7;i++) {
    tmpStr+='<td align="center" class="calDaysColor">'+this.daysOfWeek[(g_startDay+i)%7]+'</td>';
  }
  tmpStr+='</tr>';
  var tmpFrom=parseInt(''+this.dateFromYear+this.dateFromMonth+this.dateFromDay,10);
  var tmpTo=parseInt(''+this.dateToYear+this.dateToMonth+this.dateToDay,10);
  var tmpCompare;
  for (var j=1;j<=6;j++) {
    tmpStr+='<tr>';
    for (var i=1;i<=7;i++) {
      tmpStr+='<td width="16" align="center" '
      if ((7*(j-1)+i)>=iFirstDOM+1&&iCount<=iDaysInMonth) {
        if ((iCount==this.day&&this.year==this.oYear&&this.month==this.oMonth)||(iCount==this.day&&String(this.year)==('200'+parseInt(this.oYear,10))&&this.month==this.oMonth)||(iCount==this.day&&String(this.year)==('20'+parseInt(this.oYear,10))&&this.month==this.oMonth)) tmpStr+='class="calHighlightColor"';     // check for 2 digit years!!
      else {
        if (i==7-g_startDay||i==((7-g_startDay)%7)+1) tmpStr+='class="calWeekend"';
          else tmpStr+='class="cal"';
        }
        tmpStr+='>';
        tmpCompare=parseInt(''+this.year+padZero(this.month)+padZero(iCount),10);
        if (tmpCompare>=tmpFrom&&tmpCompare<=tmpTo) {
          tmpStr+='<a class="cal" href="javascript: myCalendar.clickDay('+iCount+');">'+iCount+'</a>';
        } else {
          tmpStr+='<span class="cal">'+iCount+'</span>';
        }
        iCount++;
      } else {
        if  (i==7-g_startDay||i==((7-g_startDay)%7)+1) tmpStr+='class="calWeekend"'; else tmpStr +='class="cal"';
        tmpStr+='>&nbsp;';
      }
      tmpStr+='</td>'
    }
    tmpStr+='</tr>'
  }
  if (browser.ns4||browser.ns6) {  // Netscape
    tmpStr+='<td colspan="7" align="right" valign="top" class="calDaysColor"><span class="cal">close</span>&nbsp;<a href="javascript:;" onClick="myCalendar.hide();"><img src="'+imgDir+'cross2.gif" _height="13" _width="13" border="0"></a></td></tr></table></td></tr></table></form>'
  } else {
	tmpStr+='<td colspan="7" align="right" valign="top" class="calDaysColor"><span class="cal">close</span>&nbsp;<a href="javascript:;" onClick="myCalendar.hide();"><img src="'+imgDir+'cross2.gif" _height="13" _width="13" border="0"></a></td></tr></table></td></tr></form></table>'
  }
  return tmpStr;
}

Calendar.prototype.selectChange=function() {
  this.month=browser.ns6?this.containerLayer.ownerDocument.forms[0].month.selectedIndex:this.containerLayer.document.forms[0].month.selectedIndex;
  this.writeString(this.buildString());
}

Calendar.prototype.inputChange=function() {
  var tmp=browser.ns6?this.containerLayer.ownerDocument.forms[0].year:this.containerLayer.document.forms[0].year;
  if (tmp.value >=1900||tmp.value <=2100) {
    this.year=tmp.value;
    this.writeString(this.buildString());
  } else {
    tmp.value=this.year;
  }
}

Calendar.prototype.changeYear=function(incr) {
  (incr==1)?this.year++:this.year--;
  this.writeString(this.buildString());
}

Calendar.prototype.changeMonth=function(incr) {
  if (this.month==11&&incr==1) {
    this.month=0;
    this.year++;
  } else {
    if (this.month==0&&incr==-1) {
      this.month=11;
      this.year--;
    } else {
      (incr==1)?this.month++:this.month--;
    }
  }
  this.writeString(this.buildString());
}

Calendar.prototype.clickDay=function(day) {
  var tmp=eval('document.'+this.target);
  tmp.value=this.formatDateAsString(day,this.month,this.year);
  if (browser.ns4) this.containerLayer.hidden=true;
  if (browser.dom||browser.ie4) {
    this.containerLayer.style.visibility='hidden';
  }
  updateDD();
}

Calendar.prototype.formatDateAsString = function(day,month,year){
  var tmpMonth=month;
  var tmpYear=year.toString();
  if (monthFormat.toLowerCase()=='full') {
    tmpMonth=this.months[month]
  } else {
    tmpMonth=this.months[month].substr(0,3)
  }
  if (tmpYear.length==4&&yearFormat=='yy') { newTmpYear=tmpYear.charAt(2)+tmpYear.charAt(3); tmpYear=newTmpYear; }     // shorten to 2 digits for display
  var delim=eval('/\\'+this.dateDelim+'/g');
   switch (this.dateFormat.replace(delim,'')){
     case 'ddmmmyyyy': return padZero(day)+this.dateDelim+tmpMonth+this.dateDelim+tmpYear;
	 case 'ddmmyyyy': return padZero(day)+this.dateDelim+padZero(month+1)+this.dateDelim+tmpYear;
	 case 'mmddyyyy': return padZero((month+1))+this.dateDelim+padZero(day)+this.dateDelim+tmpYear;
     case 'yyyymmdd': return tmpYear+this.dateDelim+padZero(month+1)+this.dateDelim+padZero(day);
	 default: alert('unsupported date format');
   }
}

Calendar.prototype.writeString=function(str) {
  if (browser.ns4) {
    this.containerLayer.document.open();
    this.containerLayer.document.write(str);
    this.containerLayer.document.close();
  } 
  if (browser.dom||browser.ie4) { this.containerLayer.innerHTML=str; }
}

Calendar.prototype.show=function(event,target,bHasDropDown,dateFormat,dateFrom,dateTo) {
  // calendar can restrict choices between 2 dates,if however no restrictions
  // are made,let them choose any date between now and now +1 yr
  if (dateFrom) this.dateFrom=dateFrom; else this.dateFrom=new Date();//1900,0,1
  this.dateFromDay=padZero(this.dateFrom.getDate());
  this.dateFromMonth=padZero(this.dateFrom.getMonth());
  this.dateFromYear=this.dateFrom.getFullYear();
  if (dateTo) this.dateTo=dateTo; else this.dateTo=new Date(this.dateFrom.getFullYear()+2,this.dateFrom.getMonth(),this.dateFrom.getDate());//3000,0,1
  this.dateToDay=padZero(this.dateTo.getDate());
  this.dateToMonth=padZero(this.dateTo.getMonth());
  this.dateToYear=this.dateTo.getFullYear();
  this.hasDropDown=bHasDropDown;
  if (dateFormat) this.dateFormat=dateFormat; else this.dateFormat='dd-mmm-yyyy';
  switch (this.dateFormat) {
    case 'dd-mmm-yyyy':
    case 'dd-mm-yyyy':
    case 'yyyy-mm-dd':
      this.dateDelim='-';
      break;
    case 'dd/mm/yyyy':
    case 'mm/dd/yyyy':
    case 'dd/mmm/yyyy':
      this.dateDelim='/';
      break;
  }
  if (browser.ns4) {
    if (!this.containerLayer.hidden) {
      this.containerLayer.hidden=true;
      return;
    }
  }
  if (browser.dom||browser.ie4) {
    if (this.containerLayer.style.visibility=='visible') {
      this.containerLayer.style.visibility='hidden';
      return;
    }  
  }
  if (browser.ie5||browser.ie4) {
    var event=window.event;
  }
  if (browser.ns4) {
    this.containerLayer.x=event.x+10;
    this.containerLayer.y=event.y-5;
  }
  if (browser.ie5||browser.ie4) {
    var obj=event.srcElement;
    x=0;
    while (obj.offsetParent!=null) {
      x+=obj.offsetLeft;
      obj=obj.offsetParent;
    }
    x+=obj.offsetLeft;
    y=0;
    var obj=event.srcElement;
    while (obj.offsetParent!=null) {
      y+=obj.offsetTop;
      obj=obj.offsetParent;
    }
    y+=obj.offsetTop;
		
    this.containerLayer.style.left=x+17;
    if (event.y>0)this.containerLayer.style.top=y-1;
  }
  if (browser.ns6) {
    this.containerLayer.style.left=event.pageX+10;
    this.containerLayer.style.top=event.pageY-5;
  }
  this.target=target;
  var tmp=eval('document.'+this.target);
  if (tmp&&tmp.value&&tmp.value.split(this.dateDelim).length==3&&tmp.value.indexOf('d')==-1) {
    var atmp=tmp.value.split(this.dateDelim)
    switch (this.dateFormat) {
      case 'dd-mmm-yyyy':
      case 'dd/mmm/yyyy':
        for (var i=0;i<this.months.length;i++) {
          if (atmp[1].toLowerCase()==this.months[i].substr(0,3).toLowerCase()) {
            this.month=this.oMonth=i;
            break;
          }
        }
        this.day=parseInt(atmp[0],10);
        this.year=this.oYear=parseInt(atmp[2],10);
        break;
      case 'dd/mm/yyyy':
      case 'dd-mm-yyyy':
        this.month=this.oMonth=parseInt(atmp[1]-1,10); 
        this.day=parseInt(atmp[0],10);
        this.year=this.oYear=parseInt(atmp[2],10);
        break;
      case 'mm/dd/yyyy':
      case 'mm-dd-yyyy':
        this.month=this.oMonth=parseInt(atmp[0]-1,10);
        this.day=parseInt(atmp[1],10);
        this.year=this.oYear=parseInt(atmp[2],10);
        break;
      case 'yyyy-mm-dd':
        this.month=this.oMonth=parseInt(atmp[1]-1,10);
        this.day=parseInt(atmp[2],10);
        this.year=this.oYear=parseInt(atmp[0],10);
        break;
    }
  } else { // no date set,default to today
    var theDate=new Date();
    this.year=this.oYear=theDate.getFullYear();
    this.month=this.oMonth=theDate.getMonth();
    this.day=this.oDay=theDate.getDate();
  }
  // try to handle single and double chr years
  var test=String(this.year);
  if (test.length==1) { this.year=parseInt('200'+this.year,10); }
  if (test.length==2) { this.year=parseInt('20'+this.year,10); }
  this.writeString(this.buildString());

  // and then show it!
  if (browser.ns4) {
    this.containerLayer.hidden=false;
  }
  if (browser.dom||browser.ie4) {
    this.containerLayer.style.visibility='visible';
  }
}

Calendar.prototype.hide=function() {
  if (browser.ns4) this.containerLayer.hidden=true;
  if (browser.dom||browser.ie4) {
    this.containerLayer.style.visibility='hidden';
  }
}

function handleDocumentClick(e) {
  if (browser.ie4||browser.ie5) e=window.event;
  if (browser.ns6) {
    var bTest=(e.pageX>parseInt(myCalendar.containerLayer.style.left,10)&&e.pageX<(parseInt(myCalendar.containerLayer.style.left,10)+125)&&e.pageY<(parseInt(myCalendar.containerLayer.style.top,10)+125)&&e.pageY>parseInt(myCalendar.containerLayer.style.top,10));
    if (e.target.name!='imgCalendar'&&e.target.name!='month' &&e.target.name!='year'&&e.target.name!='calendar'&&!bTest) {
      myCalendar.hide(); 
    }
  }
  if (browser.ie4||browser.ie5) {
    // extra test to see if user clicked inside the calendar but not on a valid date,we don't want it to disappear in this case
    var bTest=(e.x>parseInt(myCalendar.containerLayer.style.left,10)&&e.x< (parseInt(myCalendar.containerLayer.style.left,10)+125)&&e.y<(parseInt(myCalendar.containerLayer.style.top,10)+125)&&e.y>parseInt(myCalendar.containerLayer.style.top,10));
    if (e.srcElement.name!='imgCalendar'&&e.srcElement.name!='month'&&e.srcElement.name!='year'&&!bTest & typeof(e.srcElement)!='object') {
      myCalendar.hide(); 
    }
  }
  if (browser.ns4) myCalendar.hide();
}

// utility function
function padZero(num) {
  return ((num<=9) ? ("0"+num):num);
}

// Finally licked extending native date object;
Date.isLeapYear=function(year) { if (year%4==0&&((year%100!=0)||(year%400==0))) return true; else return false; }
Date.daysInYear=function(year) { if (Date.isLeapYear(year)) return 366; else return 365;}
var Day=1000*60*60*24;
Date.prototype.addDays=function(num) {
  return new Date((num*Day)+this.valueOf());
}	

// events capturing, careful you don't override this by setting something in the onload event of the body tag
document.onload=setTimeout('loadCalendar()',250);

function loadCalendar() {
  new Calendar(new Date());
  if (browser.ns4) {
    if (typeof document.NSfix=='undefined') {
      document.NSfix=new Object();
      document.NSfix.initWidth=window.innerWidth;
      document.NSfix.initHeight=window.innerHeight;
    }
  }
}

if (browser.ns4) window.onresize=function() { // ns4 resize bug workaround
  if (document.NSfix.initWidth!=window.innerWidth||document.NSfix.initHeight!=window.innerHeight) window.location.reload(false);
}

window.document.onclick=handleDocumentClick;
//window.onerror=function(msg,url,line) { alert('******* an error has occurred ('+msg+','+url+','+line+')********'); }

/******************************************************************************************************
functions to validate date
Author: Matt Kruse <matt@mattkruse.com>
http://www.mattkruse.com/
******************************************************************************************************/
var monthNames=new Array('January','February','March','April','May','June','July','August','September','October','November','December','Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
var dayNames=new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sun','Mon','Tue','Wed','Thu','Fri','Sat');

function LZ(x) {
  return(x<0||x>9?'':'0')+x
}

function isDate(val,format) {
  var date=getDateFromFormat(val,format);
  if(date==0) { return false; }
  return true;
}

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;
}

function formatDate(date,format) {
  format=format+'';
  var result='';
  var i_format=0;
  var c='';
  var token='';
  var y=date.getYear()+'';
  var M=date.getMonth()+1;
  var d=date.getDate();
  var E=date.getDay();
  var H=date.getHours();
  var m=date.getMinutes();
  var s=date.getSeconds();
  var yyyy,yy,MMM,MM,dd,hh,h,mm,ss,ampm,HH,H,KK,K,kk,k;
  var value=new Object();
  if (y.length<4) {
    y=''+(y-0+1900);
  }
  value['y']=''+y;
  value['yyyy']=y;
  value['yy']=y.substring(2,4);
  if (yearFormat=='yy') { value['yyyy']=y.substring(2,4);value['yy']=y.substring(2,4);value['y']=y.substring(2,4); }
  value['M']=M;
  value['MM']=LZ(M);
  value['MMM']=monthNames[M-1];
  if (monthFormat.toLowerCase()!='full') { value['MMM']=monthNames[M-1].substr(0,3) }
  value['d']=d;
  value['dd']=LZ(d);
  value['E']=dayNames[E+7];
  value['EE']=dayNames[E];
  value['H']=H;
  value['HH']=LZ(H);
  if (H==0) {
    value['h']=12;
  } else if (H>12) {
    value['h']=H-12;
  } else {
    value['h']=H;
  }
  value['hh']=LZ(value['h']);
  if (H>11) {
    value['K']=H-12;
  } else {
    value['K']=H;
  }
  value['k']=H+1;
  value['KK']=LZ(value['K']);
  value['kk']=LZ(value['k']);
  if (H>11) {
    value['a']='PM';
  } else {
    value['a']='AM';
  }
  value['m']=m;
  value['mm']=LZ(m);
  value['s']=s;
  value['ss']=LZ(s);
  while (i_format<format.length) {
    c=format.charAt(i_format);
    token='';
    while ((format.charAt(i_format)==c)&&(i_format<format.length)) {
      token+=format.charAt(i_format++);
    }
    if (value[token]!=null) {
      result=result+value[token];
    } else {
      result=result+token;
    }
  }
  return result;
}

function _isInteger(val) {
  var digits='1234567890';
  for (i=0;i<val.length;i++) {
    if(digits.indexOf(val.charAt(i))==-1) { return false; }
  }
  return true;
}

function _getInt(str,i,minlength,maxlength) {
  for(x=maxlength;x>=minlength;x--) {
    var token=str.substring(i,i+x);
    if (token.length<minlength) { return null; }
    if (_isInteger(token)) { return token; }
  }
  return null;
}

function getDateFromFormat(val,format) {
  val=val+'';
  format=format+'';
  var i_val=0;
  var i_format=0;
  var c='';
  var token='';
  var token2='';
  var x,y;
  var now=new Date();
  var year=now.getYear();
  var month=now.getMonth()+1;
  var date=1;
  var hh=now.getHours();
  var mm=now.getMinutes();
  var ss=now.getSeconds();
  var ampm='';
  while (i_format<format.length) {
    c=format.charAt(i_format);
    token='';
      while ((format.charAt(i_format)==c)&&(i_format<format.length)) { token+=format.charAt(i_format++); }
      if (token=='yyyy'||token=='yy'||token=='y') {
        if (token=='yyyy') {
          x=4;
          y=4;
        }
        if (token=='yy') {
          x=2;
          y=2;
        }
        if (token=='y') {
          x=2;
          y=4;
        }
        year=_getInt(val,i_val,x,y);
        if (year==null) { return 0; }
        i_val+=year.length;
        if (year.length==2) {
          if (year>70) {
            year=1900+(year-0);
          } else {
            year=2000+(year-0);
          }
        }
      } else if (token=='MMM') {
        month=0;
        for (i=0;i<monthNames.length;i++) {
          var month_name=monthNames[i];
          if (val.substring(i_val,i_val+month_name.length).toLowerCase()==month_name.toLowerCase()) {
            month=i+1;
            if (month>12) { month-=12; }
            i_val+=month_name.length;
            break;
          }
        }
        if ((month<1)||(month>12)) { return 0;}
      } else if (token=='EE'||token=='E') {
        for (i=0;i<dayNames.length;i++) {
          var day_name=dayNames[i];
          if(val.substring(i_val,i_val+day_name.length).toLowerCase()==day_name.toLowerCase()) {
            i_val+=day_name.length;
            break;
          }
        }
      } else if (token=='MM'||token=='M') {
        month=_getInt(val,i_val,token.length,2);
        if (month==null||(month<1)||(month>12)) { return 0; }
        i_val+=month.length;
      } else if (token=='dd'||token=='d') {
        date=_getInt(val,i_val,token.length,2);
        if (date==null||(date<1)||(date>31)) { return 0; }
        i_val+=date.length;
      } else if (token=='hh'||token=='h') {
        hh=_getInt(val,i_val,token.length,2);
        if (hh==null||(hh<1)||(hh>12)) { return 0; }
        i_val+=hh.length;
      } else if (token=='HH'||token=='H') {
        hh=_getInt(val,i_val,token.length,2);
        if (hh==null||(hh<0)||(hh>23)) { return 0; }
        i_val+=hh.length;
      } else if (token=='KK'||token=='K') {
        hh=_getInt(val,i_val,token.length,2);
        if (hh==null||(hh<0)||(hh>11)) { return 0; }
        i_val+=hh.length;
      } else if (token=='kk'||token=='k') {
        hh=_getInt(val,i_val,token.length,2);
        if (hh==null||(hh<1)||(hh>24)) { return 0; }
        i_val+=hh.length;hh--;
      } else if (token=='mm'||token=='m') {
        mm=_getInt(val,i_val,token.length,2);
        if (mm==null||(mm<0)||(mm>59)) { return 0; }
        i_val+=mm.length;
      } else if (token=='ss'||token=='s') {
        ss=_getInt(val,i_val,token.length,2);
        if (ss==null||(ss<0)||(ss>59)) { return 0; }
        i_val+=ss.length;
      } else if (token=='a') {
        if(val.substring(i_val,i_val+2).toLowerCase()=='am') {
          ampm='AM';
        } else if (val.substring(i_val,i_val+2).toLowerCase()=='pm') {
          ampm='PM';
        } else {
          return 0;
        }
        i_val+=2;
      } else {
        if (val.substring(i_val,i_val+token.length)!=token) {
          return 0;
        } else {
          i_val+=token.length;
        }
      }
    }
    if (i_val!=val.length) { return 0; }
    if (month==2) {
      if (((year%4==0)&&(year%100!=0))||(year%400==0)) {
        if (date>29) { return false; }
      } else {
        if (date>28) { return false; }
      }
    }
    if ((month==4)||(month==6)||(month==9)||(month==11)) {
      if (date>30) { return false; }
    }
    if (hh<12&&ampm=='PM') {
      hh=hh-0+12;
    } else if (hh>11&&ampm=='AM') {
      hh-=12;
    }
    var newdate=new Date(year,month-1,date,hh,mm,ss);
    return newdate.getTime();
}

// DateDiff equivalent
function DateDiff(dFrom,dTo) {
  if ((isDate(dFrom,'d-MMM-y')==true)&&(isDate(dTo,'d-MMM-y')==true)) {
    // Return number of whole days from Date object dFrom
    // to Date object dTo,midday to roughly midday.
    // WARNING!!!! VALIDATE THE DATE FIRST!!

    //split out the date-entered in Day-MonthName-Year
    Months=new Array('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
    var Delimiter='-';
    if (dFrom.indexOf('/')>-1) { Delimiter='/' }
    var dFromArr=dFrom.split(Delimiter);
    var dToArr=dTo.split(Delimiter);
    dFromNum=dFromArr[1];     // Month
    for (i=0;i<12;i++) {
      if (Months[i].substr(0,3).toUpperCase()==dFromNum.substr(0,3).toUpperCase()) { dFromNum=i; i=12; }
    }
    dToNum=dToArr[1];     // Month
    for (i=0;i<12;i++) {
      if (Months[i].substr(0,3).toUpperCase()==dToNum.substr(0,3).toUpperCase()) { dToNum=i; i=12; }
    }
    var dFromYear=parseInt(dFromArr[2],10);
    if(dFromYear.length==1) { dFromYear='200'+dFromYear }
    if(dFromYear.length==2) { dFromYear='20'+dFromYear }
    var dToYear=parseInt(dToArr[2],10);
    if(dToYear.length==1) { dToYear='200'+dToYear }
    if(dToYear.length==2) { dToYear='20'+dToYear }
    var df=new Date(dFromYear,dFromNum,parseInt(dFromArr[0],10));
    var dt=new Date(dToYear,dToNum,parseInt(dToArr[0],10));
    return Math.floor(dt.valueOf()/(24*60*60*1000)-df.valueOf()/(24*60*60*1000) );
  } else {
    return -1;
  }
}

// DateAdd equivalent
function DateAdd(dFrom,Add) {
  if (isDate(dFrom,'d-MMM-y')==true) {

	//split out the date-entered in Day-MonthName-Year
    Months=new Array('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
    var Delimiter='-';
    if (dFrom.indexOf('/')>-1) { Delimiter='/' }
    var dFromArr=dFrom.split(Delimiter);
    dFromDate=parseInt(dFromArr[0],10);
    dFromMonth=dFromArr[1];
    dFromYear=dFromArr[2];
    for (i=0;i<12;i++) {
      if (Months[i].substr(0,3).toUpperCase()==dFromMonth.substr(0,3).toUpperCase()) { dFromMonth=i; i=12; }
    }
    if(dFromYear.length==1) { dFromYear='200'+dFromYear }
    if(dFromYear.length==2) { dFromYear='20'+dFromYear }
    var tmpDate=new Date(dFromYear,dFromMonth,dFromDate);
    var retDate=new Date(Date.parse(tmpDate)+(Add*(24*60*60*1000)))
    //alert('tmpDate:'+tmpDate);
    //alert('retDate:'+retDate);
    return formatDate(retDate,'d-MMM-y')
  }
}

// DatePart equivalent
function DatePart(date,Part) {
  var y=date.getYear()+'';
  var M=date.getMonth()+1;
  var d=date.getDate();
  var E=date.getDay();
  var H=date.getHours();
  var m=date.getMinutes();
  var s=date.getSeconds();
  var result;

  switch (Part.toLowerCase()) {
    case 'y':
    case 'yy':
    case 'year':
      result=y;
      break;
    case 'm':
    case 'month':
      result=M;
      break;
    case 'd':
    case 'day':
      result=d;
      break;
    default:
      result=date;
      break;
  }
  return result;
}

// Returns the last day of a given month
function LastDayOfMonth(date) {
  var m=new Number(date.getMonth());     // Starts from 0
  var y=new Number(date.getFullYear());
  if (Date.isLeapYear(y)) {
    var Days=new Array(31,29,31,30,31,30,31,31,30,31,30,31);
  } else {
    var Days=new Array(31,28,31,30,31,30,31,31,30,31,30,31);
  }
  return Days[m];
}

// Returns number for a given text month name
function MonthNum(Month) {
  var Months=new Array('','January','February','March','April','May','June','July','August','September','October','November','December');
  for (i=0;i<Months.length;i++) {
    if (Month.toUpperCase()==Months[i].substr(0,Month.length).toUpperCase()) {
      break;
	}
  }
  return i;
}