var dateIn=null;
var dateOut=null;
var flightIn=null;
var flightOut=null;
var preventBooking=false;
var previousVehicles=null;
var calendarMode=null;
var lastEM=null;
var globalError=null;
var globalFocus=null;
var startup=true;
var calendarCtl=null;
var formPosted=false;
var globalLabel=[];
var cardProcessingFee=1.00;
var eftposProcessingFee=1.00;
var lateDiscount=0.0;
var firstFocus=null;

function getParent(e,tag)
{
  var p=e.parentNode;
  while (p && p.tagName.toLowerCase() != tag.toLowerCase())
    p=p.parentNode;
  return p;        
}

function hidePopup()
{
  document.body.removeChild($('shadow'));    
  document.body.removeChild($('loading'));    
}

function pleaseWait(msg)
{
  var d=disableBrowser(true);
    
  var s=new Element('div',{id: 'loading'});
  s.style.textAlign='center';
  s.style.top=parseInt((document.viewport.getHeight()-120)/2)+document.viewport.getScrollOffsets().top+'px';
  s.style.left=0;
  s.style.backgroundColor='#eee';
  s.style.position='absolute';
  s.style.zIndex=1000;
  s.style.width=document.viewport.getWidth()+'px';
  s.style.height='120px';
  s.update((msg ? msg : '<h2>Please wait, retrieving your details..')+'<br /><br /><img src="/images/loading.gif" />');
  document.body.appendChild(s);

}

function stringToNumber(num)
{
    var noJunk = ""
    var withDollar = ""
    var foundDecimal = 0
    var foundAlphaChar = 0
    num += "";

    if (num == "") { return(0); }
    for (i=0; i <= num.length; i++)
    {
        var thisChar = num.substring(i, i+1);
        if (thisChar == ".")
        {
          foundDecimal = 1;
          noJunk = noJunk + thisChar;
        }
        if ((thisChar < "0") || (thisChar > "9"))
        {
          if ((thisChar != "$") && (thisChar !=".") && (thisChar != ",") && (thisChar != " ") && (thisChar !="")) foundAlphaChar = 1;
        }
        else 
 {
    withDollar = withDollar + thisChar
    noJunk = noJunk + thisChar
 }

 if ((thisChar == "$") || (thisChar == ".") || (thisChar == ","))
 {
   withDollar = withDollar + thisChar
 }
  }
     if (foundDecimal) { return parseFloat(noJunk); }
     else if (noJunk.length > 0) { return parseFloat(noJunk); }
     else return 0;
}

function dateValid(year,month,day)
{
  if (year.length==2) 
    if (year > 70)  
      year=1900+(year-0); 
    else 
      year=2000+(year-0); 

    if (day <1 || day >31)
      return 0;
    if (month==2) {
        // Check for leap year
        if ( ( (year%4==0)&&(year%100 != 0) ) || (year%400==0) ) { // leap year
            if (day > 29){ return 0; }
            }
        else { if (day > 28) { return 0; } }
        }
    if ((month==4)||(month==6)||(month==9)||(month==11)) {
        if (day > 30) { return 0; }
        }  
  return 1;          
}

function selectByValue(sb,v)
{
  for (var i=0; i < sb.options.length; i++) 
    if (sb.options[i].value==v) {
      sb.selectedIndex=i;
      break;    
    }   
}

function calcRate(start,days,cat,uc,late)
{
  var s=parseInt(formatDate(start,'yyyyMMdd'));
  lateDiscount=0.0;
  if (rateCard)
    for (var i=0; i < rateCard.length; i++) {
      if (rateCard[i].s <= s && rateCard[i].e >= s) {
        if (rateCard[i].card)
          for (var j=0; j < rateCard[i].card.length; j++)
            if (rateCard[i].card[j].d <= days ) {
              if (late)  
                if (rateCard[i].td.length >= days)
                  lateDiscount=parseFloat(rateCard[i].td[days-1]);
                else    
                  lateDiscount=parseFloat(rateCard[i].td.length ? rateCard[i].td[rateCard[i].td.length-1] : 0.0);
              if (uc)
                return (parseFloat(rateCard[i].card[j].ur)+parseFloat(days-rateCard[i].card[j].d)*rateCard[i].ub)*(cat ? $H(rateCard[i]).get('f'+cat) : 1.0)-lateDiscount;    
              else  
                return (parseFloat(rateCard[i].card[j].r)+parseFloat(days-rateCard[i].card[j].d)*rateCard[i].b)*(cat ? $H(rateCard[i]).get('f'+cat) : 1.0)-lateDiscount;    
            }    
        // no rate matrix
        return (days*(uc ? rateCard[i].ub : rateCard[i].b))*(os ? rateCard[i].o : 1.0);    
      }    
    }    
  return 0;  
}

// get the date time object for the date/time combo prefixed by prefix
function getDateTime(prefix,notime)
{
  var f=document.forms['bf'] ? document.forms['bf'] : document.forms['edf'] ;
  var y,m,d,yd,md,dd,h=0,n=0,t=0,dt=null;
  
  if (prefix=='a' && typeof(b_sd) != 'undefined') 
    return b_sd;
  if (!notime && typeof(f.elements[prefix+'_time']) != 'undefined' && f.elements[prefix+'_time'].selectedIndex <= 0)
    return null;  
  yd=f.elements[prefix+'_year'];
  md=f.elements[prefix+'_month'];
  dd=f.elements[prefix+'_day'];

  if (yd.selectedIndex < 0 || dd.selectedIndex < 0 || md.selectedIndex < 0)
    return null;
  y=yd.options[yd.selectedIndex].value;
  d=dd.options[dd.selectedIndex].value;
  m=md.options[md.selectedIndex].value;
  if (!notime && typeof(f.elements[prefix+'_time']) != 'undefined') {
    t=getFlightTime(f.elements[prefix+'_time']);
    h=parseInt(t/100);
    n=parseInt(t%100);
  }  
  if (y && m && d && dateValid(y,m,d))
    return new Date(y,m-1,d,h,n,0,0);
  else
    return null;    
}

function getDateTime2(prefix,notime)
{
  var f=document.forms['bf'] ? document.forms['bf'] : document.forms['edf'] ;
  var y,m,d,yd,md,dd,h=0,n=0,t=0,dt=null;
  var a;
  if (prefix=='a' && typeof(b_sd) != 'undefined') 
    return b_sd;
  if (!notime && typeof(f.elements[prefix+'_time']) != 'undefined' && f.elements[prefix+'_time'].selectedIndex <= 0)
    return null;  
  yd=f.elements[prefix+'_year'];
  dd=f.elements[prefix+'_day'];

  if (yd.selectedIndex < 1 || dd.selectedIndex < 0)
    return null;
  
  a=yd.options[yd.selectedIndex].value.split('-');
  y=a[0];
  m=a[1];
  d=dd.options[dd.selectedIndex].value;
  if (!notime && typeof(f.elements[prefix+'_time']) != 'undefined') {
    t=getFlightTime(f.elements[prefix+'_time']);
    h=parseInt(t/100);
    n=parseInt(t%100);
  }  
  if (y && m && d && dateValid(y,m,d))
    return new Date(y,m-1,d,h,n,0,0);
  else
    return null;    
}
function formatCurrency(num) {
num = num.toString().replace(/\$|\,/g,'');
if(isNaN(num))
num = "0";
sign = (num == (num = Math.abs(num)));
num = Math.floor(num*100+0.50000000001);
cents = num%100;
num = Math.floor(num/100).toString();
if(cents<10)
cents = "0" + cents;
for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)
num = num.substring(0,num.length-(4*i+3))+','+
num.substring(num.length-(4*i+3));
return (((sign)?'':'-') + '$' + num + '.' + cents);
}
  
function calendarDays(dateIn,dateOut)
{
  if (!dateIn || !dateOut || dateOut.getTime() < dateIn.getTime())
    return 0;
  // zero times  
  dateIn.setHours(0);
  dateOut.setHours(0);
  return parseInt((dateOut.getTime()-dateIn.getTime()+3600000)/86400000)+1;
}

function getFlightTime(lb)
{
  var t=lb.options[lb.selectedIndex].value;
  var tm=0;
  for (var i=0; i < t.length; i++)
    if (t.substring(i,1) != '0') {
      tm=parseInt(t.substring(i,t.length)); 
      break;
    }    
  return tm;  
}

 function setCalendarDatesAdmin(f,y,m,d)
{
  set_lb_val(f.elements[calendarMode+'_year'],y);
  f.elements[calendarMode+'_day'].selectedIndex=d;
  f.elements[calendarMode+'_month'].selectedIndex=m;
  updateRate(f.elements[calendarMode+'_day']);
}

function get_lb_val(lb)
{
  return lb.selectedIndex >= 0 ? lb.options[lb.selectedIndex].value : null;    
}

function set_lb_val(lb,v)
{
  for (var i=0; i < lb.options.length; i++)
    if (lb.options[i].value==v) {
      lb.selectedIndex=i;
      break;    
    }    
}

function c_move(e,ctl,n)
{
  var evtobj=window.event? event : e //distinguish between IE's explicit event object (window.event) and Firefox's implicit.
  var unicode=evtobj.charCode? evtobj.charCode : evtobj.keyCode
  if (unicode >= 48 && unicode <= 57 && ctl.value.length==4) 
    ctl.form.elements['c_num_'+n].focus();      
}

function resetError()
{
  var l;
  firstFocus=null;
  globalError='';
  globalFocus=null; 
  if (globalLabel)
    for (var i=0; i < globalLabel.length; i++)  {
      l=$$('.v-'+globalLabel[i]);
      for (var j=0; j < l.length; j++)
        l[j].style.border='';    
    }
  globalLabel=[]; 
}

function setError(error,label,anchor)
{
  var l;
  if(error)
   globalError+='<li>'+error+'</li>';
  if (label) {
    if (!globalLabel)
      globalLabel=[];
    globalLabel.push(label);  
  }  
  if(!firstFocus && typeof(anchor) != 'undefined')
    firstFocus=anchor;
}

function setLabels(frm)
{
  var labels=frm.getElementsByTagName('label');
  var l;
  for (var i=0; i < labels.length; i++) {
    l=labels[i].getAttribute('title');  
    labels[i].style.color=(globalLabel && globalLabel.indexOf(l) >= 0) ? '#ff3333' : '';    
  }
  // do some additional work...
  if (globalLabel) 
    for (var i=0; i < globalLabel.length; i++) {
      labels=$$('.v-'+globalLabel[i]);  
      for (var j=0; j < labels.length; j++)
        labels[j].style.border='1px solid #ff0000';
    }  
}

function showError(title,prefix)
{
  if (firstFocus)
    window.location.hash=firstFocus;
  createPopup(title ? title : 'Cairns Airport Parking - Notice',(prefix ? prefix : 'Unable to process your request. Please correct the following - <ul>')+globalError+'</ul>',true,false);      
}

function showNotice(msg)
{
  return createPopup('Cairns Airport Parking - Notice',msg,true,false);    
}

/* new ajax functions qf8 */
function disableBrowser(greyed)
{
  var s=new Element('div',{id: 'shadow'});
  s.style.top=0;
  s.style.left=0;
  s.style.position='absolute';
  s.style.zIndex=1000;
  var b=$(document.body);    /* ie6 requires!! */
  s.style.width=b.getWidth()+'px';
  s.style.height=b.getHeight()+'px';
  if (greyed) {
    s.style.backgroundColor='#000';
    s.setOpacity(0.6);
  }
  document.body.appendChild(s);
  return s;    
}

function createPopup(title,html,greyed,outsideClose)
{
  var d;
  if (!(d=$('shadow'))) 
    d=disableBrowser(greyed);
  // create popup window
  var p=new Element('div',{'class' : 'popup'});
  p.update('<h5>'+title+'<a title="close" href="javascript:void(0)">x close window</a></h5><div class="inner">'+html+'<p align="center"><input type="button" value="close window" title="close" /></p></div>');
  document.body.appendChild(p);
  p.style.top=parseInt((document.viewport.getHeight()-p.getHeight())/2)+document.viewport.getScrollOffsets().top+'px';
  p.style.left=parseInt((document.viewport.getWidth()-p.getWidth())/2)+document.viewport.getScrollOffsets().left+'px';
  if (outsideClose)
    d.onclick=function() { document.body.removeChild(d); document.body.removeChild(p); };
  var l=p.select("[title=close]");
  for (var i=0; i < l.length; i++)
    l[i].onclick=function() { document.body.removeChild(d); document.body.removeChild(p); };
  return p;
}

function init_calendar_view(frm,callback)
{
  if (!calendarCtl) {
    calendarCtl=Calendar.setup(
      {
        parentElement: 'calendar-view'
      });
    calendarCtl.isPopup=true;  
    calendarCtl.form=frm;
    calendarCtl.closeHandler=function(c) 
      {  
        c.shouldClose=false; 
        callback(c.form,c.date.getFullYear(),c.date.getMonth()+1,c.date.getDate()) ;
        c.hide();
      }; 
    calendarCtl.shouldClose=false;   
  }
  else
    calendarCtl.form=frm;  
  return calendarCtl;
}

function doCalendarView(prefix,offset)
{
  var d;
  calendarMode=prefix;
  d=getDateTime(prefix,true);
  if (d)
    calendarCtl.update(d); 
  $('calendar-view').style.left=$(prefix+'_cal').offsetLeft+((offset && $(offset)) ? $(offset).offsetLeft : 0)+'px';
  $('calendar-view').style.top=$(prefix+'_cal').offsetTop+((offset && $(offset)) ? $(offset).offsetTop : 0)+'px';
  $('calendar-view').style.display='block';   
  calendarCtl.show();    
}

function doCalendarView2(prefix,offset)
{
  var d;
  calendarMode=prefix;
  d=getDateTime2(prefix,true);
  if (d)
    calendarCtl.update(d); 
  $('calendar-view').style.left=$(prefix+'_cal').offsetLeft+((offset && $(offset)) ? $(offset).offsetLeft : 0)+'px';
  $('calendar-view').style.top=$(prefix+'_cal').offsetTop+((offset && $(offset)) ? $(offset).offsetTop : 0)+'px';
  $('calendar-view').style.display='block';   
  calendarCtl.show();    
}

function formatTime(t)
{
  var tm;
  for (var i=0; i < t.length; i++)
    if (t.substring(i,1) != '0') {
      tm=parseInt(t.substring(i,t.length)); 
      break;
    }    
  return (tm < 100 ? 12 : parseInt(tm/100)-(tm >= 1300 ? 12 : 0))+":"+(tm%100 < 10 ? '0' : '')+(tm%100)+(tm < 1200 ? 'am' : 'pm');   
}
/* date.js */
var MONTH_NAMES=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 DAY_NAMES=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);value["M"]=M;value["MM"]=LZ(M);value["MMM"]=MONTH_NAMES[M-1];value["NNN"]=MONTH_NAMES[M+11];value["d"]=d;value["dd"]=LZ(d);value["E"]=DAY_NAMES[E+7];value["EE"]=DAY_NAMES[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(var i=0;i<val.length;i++){if(digits.indexOf(val.charAt(i))==-1){return false;}}
return true;}
function _getInt(str,i,minlength,maxlength){for(var 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"||token=="NNN"){month=0;for(var i=0;i<MONTH_NAMES.length;i++){var month_name=MONTH_NAMES[i];if(val.substring(i_val,i_val+month_name.length).toLowerCase()==month_name.toLowerCase()){if(token=="MMM"||(token=="NNN"&&i>11)){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(var i=0;i<DAY_NAMES.length;i++){var day_name=DAY_NAMES[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 0;}}
else{if(date>28){return 0;}}}
if((month==4)||(month==6)||(month==9)||(month==11)){if(date>30){return 0;}}
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();}
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;}
/* end date.js */
function validateEmailv2(email)
{
    if(email.length <= 0)
    {
      return true;
    }
    var splitted = email.match("^(.+)@(.+)$");
    if(splitted == null) return false;
    if(splitted[1] != null )
    {
      var regexp_user=/^\"?[\w-_\.]*\"?$/;
      if(splitted[1].match(regexp_user) == null) return false;
    }
    if(splitted[2] != null)
    {
      var regexp_domain=/^[\w-\.]*\.[A-Za-z]{2,4}$/;
      if(splitted[2].match(regexp_domain) == null) 
      {
        var regexp_ip =/^\[\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\]$/;
        if(splitted[2].match(regexp_ip) == null) return false;
      }// if
      return true;
    }
return false;
}
/*
 * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
 * Digest Algorithm, as defined in RFC 1321.
 * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
 * Distributed under the BSD License
 * See http://pajhome.org.uk/crypt/md5 for more info.
 */
var hexcase=0;function hex_md5(a){return rstr2hex(rstr_md5(str2rstr_utf8(a)))}function hex_hmac_md5(a,b){return rstr2hex(rstr_hmac_md5(str2rstr_utf8(a),str2rstr_utf8(b)))}function md5_vm_test(){return hex_md5("abc").toLowerCase()=="900150983cd24fb0d6963f7d28e17f72"}function rstr_md5(a){return binl2rstr(binl_md5(rstr2binl(a),a.length*8))}function rstr_hmac_md5(c,f){var e=rstr2binl(c);if(e.length>16){e=binl_md5(e,c.length*8)}var a=Array(16),d=Array(16);for(var b=0;b<16;b++){a[b]=e[b]^909522486;d[b]=e[b]^1549556828}var g=binl_md5(a.concat(rstr2binl(f)),512+f.length*8);return binl2rstr(binl_md5(d.concat(g),512+128))}function rstr2hex(c){try{hexcase}catch(g){hexcase=0}var f=hexcase?"0123456789ABCDEF":"0123456789abcdef";var b="";var a;for(var d=0;d<c.length;d++){a=c.charCodeAt(d);b+=f.charAt((a>>>4)&15)+f.charAt(a&15)}return b}function str2rstr_utf8(c){var b="";var d=-1;var a,e;while(++d<c.length){a=c.charCodeAt(d);e=d+1<c.length?c.charCodeAt(d+1):0;if(55296<=a&&a<=56319&&56320<=e&&e<=57343){a=65536+((a&1023)<<10)+(e&1023);d++}if(a<=127){b+=String.fromCharCode(a)}else{if(a<=2047){b+=String.fromCharCode(192|((a>>>6)&31),128|(a&63))}else{if(a<=65535){b+=String.fromCharCode(224|((a>>>12)&15),128|((a>>>6)&63),128|(a&63))}else{if(a<=2097151){b+=String.fromCharCode(240|((a>>>18)&7),128|((a>>>12)&63),128|((a>>>6)&63),128|(a&63))}}}}}return b}function rstr2binl(b){var a=Array(b.length>>2);for(var c=0;c<a.length;c++){a[c]=0}for(var c=0;c<b.length*8;c+=8){a[c>>5]|=(b.charCodeAt(c/8)&255)<<(c%32)}return a}function binl2rstr(b){var a="";for(var c=0;c<b.length*32;c+=8){a+=String.fromCharCode((b[c>>5]>>>(c%32))&255)}return a}function binl_md5(p,k){p[k>>5]|=128<<((k)%32);p[(((k+64)>>>9)<<4)+14]=k;var o=1732584193;var n=-271733879;var m=-1732584194;var l=271733878;for(var g=0;g<p.length;g+=16){var j=o;var h=n;var f=m;var e=l;o=md5_ff(o,n,m,l,p[g+0],7,-680876936);l=md5_ff(l,o,n,m,p[g+1],12,-389564586);m=md5_ff(m,l,o,n,p[g+2],17,606105819);n=md5_ff(n,m,l,o,p[g+3],22,-1044525330);o=md5_ff(o,n,m,l,p[g+4],7,-176418897);l=md5_ff(l,o,n,m,p[g+5],12,1200080426);m=md5_ff(m,l,o,n,p[g+6],17,-1473231341);n=md5_ff(n,m,l,o,p[g+7],22,-45705983);o=md5_ff(o,n,m,l,p[g+8],7,1770035416);l=md5_ff(l,o,n,m,p[g+9],12,-1958414417);m=md5_ff(m,l,o,n,p[g+10],17,-42063);n=md5_ff(n,m,l,o,p[g+11],22,-1990404162);o=md5_ff(o,n,m,l,p[g+12],7,1804603682);l=md5_ff(l,o,n,m,p[g+13],12,-40341101);m=md5_ff(m,l,o,n,p[g+14],17,-1502002290);n=md5_ff(n,m,l,o,p[g+15],22,1236535329);o=md5_gg(o,n,m,l,p[g+1],5,-165796510);l=md5_gg(l,o,n,m,p[g+6],9,-1069501632);m=md5_gg(m,l,o,n,p[g+11],14,643717713);n=md5_gg(n,m,l,o,p[g+0],20,-373897302);o=md5_gg(o,n,m,l,p[g+5],5,-701558691);l=md5_gg(l,o,n,m,p[g+10],9,38016083);m=md5_gg(m,l,o,n,p[g+15],14,-660478335);n=md5_gg(n,m,l,o,p[g+4],20,-405537848);o=md5_gg(o,n,m,l,p[g+9],5,568446438);l=md5_gg(l,o,n,m,p[g+14],9,-1019803690);m=md5_gg(m,l,o,n,p[g+3],14,-187363961);n=md5_gg(n,m,l,o,p[g+8],20,1163531501);o=md5_gg(o,n,m,l,p[g+13],5,-1444681467);l=md5_gg(l,o,n,m,p[g+2],9,-51403784);m=md5_gg(m,l,o,n,p[g+7],14,1735328473);n=md5_gg(n,m,l,o,p[g+12],20,-1926607734);o=md5_hh(o,n,m,l,p[g+5],4,-378558);l=md5_hh(l,o,n,m,p[g+8],11,-2022574463);m=md5_hh(m,l,o,n,p[g+11],16,1839030562);n=md5_hh(n,m,l,o,p[g+14],23,-35309556);o=md5_hh(o,n,m,l,p[g+1],4,-1530992060);l=md5_hh(l,o,n,m,p[g+4],11,1272893353);m=md5_hh(m,l,o,n,p[g+7],16,-155497632);n=md5_hh(n,m,l,o,p[g+10],23,-1094730640);o=md5_hh(o,n,m,l,p[g+13],4,681279174);l=md5_hh(l,o,n,m,p[g+0],11,-358537222);m=md5_hh(m,l,o,n,p[g+3],16,-722521979);n=md5_hh(n,m,l,o,p[g+6],23,76029189);o=md5_hh(o,n,m,l,p[g+9],4,-640364487);l=md5_hh(l,o,n,m,p[g+12],11,-421815835);m=md5_hh(m,l,o,n,p[g+15],16,530742520);n=md5_hh(n,m,l,o,p[g+2],23,-995338651);o=md5_ii(o,n,m,l,p[g+0],6,-198630844);l=md5_ii(l,o,n,m,p[g+7],10,1126891415);m=md5_ii(m,l,o,n,p[g+14],15,-1416354905);n=md5_ii(n,m,l,o,p[g+5],21,-57434055);o=md5_ii(o,n,m,l,p[g+12],6,1700485571);l=md5_ii(l,o,n,m,p[g+3],10,-1894986606);m=md5_ii(m,l,o,n,p[g+10],15,-1051523);n=md5_ii(n,m,l,o,p[g+1],21,-2054922799);o=md5_ii(o,n,m,l,p[g+8],6,1873313359);l=md5_ii(l,o,n,m,p[g+15],10,-30611744);m=md5_ii(m,l,o,n,p[g+6],15,-1560198380);n=md5_ii(n,m,l,o,p[g+13],21,1309151649);o=md5_ii(o,n,m,l,p[g+4],6,-145523070);l=md5_ii(l,o,n,m,p[g+11],10,-1120210379);m=md5_ii(m,l,o,n,p[g+2],15,718787259);n=md5_ii(n,m,l,o,p[g+9],21,-343485551);o=safe_add(o,j);n=safe_add(n,h);m=safe_add(m,f);l=safe_add(l,e)}return Array(o,n,m,l)}function md5_cmn(h,e,d,c,g,f){return safe_add(bit_rol(safe_add(safe_add(e,h),safe_add(c,f)),g),d)}function md5_ff(g,f,k,j,e,i,h){return md5_cmn((f&k)|((~f)&j),g,f,e,i,h)}function md5_gg(g,f,k,j,e,i,h){return md5_cmn((f&j)|(k&(~j)),g,f,e,i,h)}function md5_hh(g,f,k,j,e,i,h){return md5_cmn(f^k^j,g,f,e,i,h)}function md5_ii(g,f,k,j,e,i,h){return md5_cmn(k^(f|(~j)),g,f,e,i,h)}function safe_add(a,d){var c=(a&65535)+(d&65535);var b=(a>>16)+(d>>16)+(c>>16);return(b<<16)|(c&65535)}function bit_rol(a,b){return(a<<b)|(a>>>(32-b))};

/*
SUPERNOTE v1.0beta (c) 2005-2006 Angus Turnbull, http://www.twinhelix.com
Altering this notice or redistributing this file is prohibited.
*/
if(typeof addEvent!='function'){var addEvent=function(o,t,f,l){var d='addEventListener',n='on'+t,rO=o,rT=t,rF=f,rL=l;if(o[d]&&!l)return o[d](t,f,false);if(!o._evts)o._evts={};if(!o._evts[t]){o._evts[t]=o[n]?{b:o[n]}:{};o[n]=new Function('e','var r=true,o=this,a=o._evts["'+t+'"],i;for(i in a){o._f=a[i];r=o._f(e||window.event)!=false&&r;o._f=null}return r');if(t!='unload')addEvent(window,'unload',function(){removeEvent(rO,rT,rF,rL)})}if(!f._i)f._i=addEvent._i++;o._evts[t][f._i]=f};addEvent._i=1;var removeEvent=function(o,t,f,l){var d='removeEventListener';if(o[d]&&!l)return o[d](t,f,false);if(o._evts&&o._evts[t]&&f._i)delete o._evts[t][f._i]}}function cancelEvent(e,c){e.returnValue=false;if(e.preventDefault)e.preventDefault();if(c){e.cancelBubble=true;if(e.stopPropagation)e.stopPropagation()}};function SuperNote(myName,config){var defaults={myName:myName,allowNesting:false,cssProp:'visibility',cssVis:'inherit',cssHid:'hidden',IESelectBoxFix:true,showDelay:0,hideDelay:500,animInSpeed:0.1,animOutSpeed:0.1,animations:[],mouseX:0,mouseY:0,notes:{},rootElm:null,onshow:null,onhide:null};for(var p in defaults)this[p]=(typeof config[p]=='undefined')?defaults[p]:config[p];var obj=this;addEvent(document,'mouseover',function(evt){obj.mouseHandler(evt,1)});addEvent(document,'click',function(evt){obj.mouseHandler(evt,2)});addEvent(document,'mousemove',function(evt){obj.mouseTrack(evt)});addEvent(document,'mouseout',function(evt){obj.mouseHandler(evt,0)});this.instance=SuperNote.instances.length;SuperNote.instances[this.instance]=this}SuperNote.instances=[];SuperNote.prototype.bTypes={};SuperNote.prototype.pTypes={};SuperNote.prototype.pTypes.mouseoffset=function(obj,noteID,nextVis,nextAnim){with(obj){var note=notes[noteID];if(nextVis&&!note.animating&&!note.visible){note.ref.style.left=checkWinX(mouseX,note)+'px';note.ref.style.top=checkWinY(mouseY,note)+'px'}}};SuperNote.prototype.pTypes.mousetrack=function(obj,noteID,nextVis,nextAnim){with(obj){var note=notes[noteID];if(nextVis&&!note.animating&&!note.visible){var posString='with('+myName+'){var note=notes["'+noteID+'"];note.ref.style.left=checkWinX(mouseX,note)+"px";note.ref.style.top=checkWinY(mouseY,note)+"px"}';eval(posString);obj.IEFrameFix(noteID,1);if(!note.trackTimer)note.trackTimer=setInterval(posString,50)}else if(!nextVis&&!nextAnim){clearInterval(note.trackTimer);note.trackTimer=null}}};SuperNote.prototype.pTypes.triggeroffset=function(obj,noteID,nextVis,nextAnim){with(obj){var note=notes[noteID];if(nextVis&&!note.animating&&!note.visible){var x=0,y=0,elm=note.trigRef;while(elm){x+=elm.offsetLeft;y+=elm.offsetTop;elm=elm.offsetParent}note.ref.style.left=checkWinX(x,note)+'px';note.ref.style.top=checkWinY(y,note)+'px'}}};SuperNote.prototype.bTypes.pinned=function(obj,noteID,nextVis){with(obj){return(!nextVis)?false:true}};SuperNote.prototype.docBody=function(){return document[(document.compatMode&&document.compatMode.indexOf('CSS')>-1)?'documentElement':'body']};SuperNote.prototype.getWinW=function(){return this.docBody().clientWidth||window.innerWidth||0};SuperNote.prototype.getWinH=function(){return this.docBody().clientHeight||window.innerHeight||0};SuperNote.prototype.getScrX=function(){return this.docBody().scrollLeft||window.scrollX||0};SuperNote.prototype.getScrY=function(){return this.docBody().scrollTop||window.scrollY||0};SuperNote.prototype.checkWinX=function(newX,note){with(this){return Math.max(getScrX(),Math.min(newX,getScrX()+getWinW()-note.ref.offsetWidth-8))}};SuperNote.prototype.checkWinY=function(newY,note){with(this){return Math.max(getScrY(),Math.min(newY,getScrY()+getWinH()-note.ref.offsetHeight-8))}};SuperNote.prototype.mouseTrack=function(evt){with(this){mouseX=evt.pageX||evt.clientX+getScrX()||0;mouseY=evt.pageY||evt.clientY+getScrY()||0}};SuperNote.prototype.mouseHandler=function(evt,show){with(this){if(!document.documentElement)return true;var srcElm=evt.target||evt.srcElement,trigRE=new RegExp(myName+'-(hover|click)-([a-z0-9]+)','i'),targRE=new RegExp(myName+'-(note)-([a-z0-9]+)','i'),trigFind=1,foundNotes={};if(srcElm.nodeType!=1)srcElm=srcElm.parentNode;var elm=srcElm;while(elm&&elm!=rootElm){if(targRE.test(elm.id)||(trigFind&&trigRE.test(elm.className))){if(!allowNesting)trigFind=0;var click=RegExp.$1=='click'?1:0,noteID=RegExp.$2,ref=document.getElementById(myName+'-note-'+noteID),trigRef=trigRE.test(elm.className)?elm:null;if(ref){if(!notes[noteID]){notes[noteID]={click:click,ref:ref,trigRef:null,visible:0,animating:0,timer:null};ref._sn_obj=this;ref._sn_id=noteID}var note=notes[noteID];if(!note.click||(trigRef!=srcElm))foundNotes[noteID]=true;if(!note.click||(show==2)){if(trigRef)notes[noteID].trigRef=notes[noteID].ref._sn_trig=elm;display(noteID,show);if(note.click&&(srcElm==trigRef))cancelEvent(evt)}}}if(elm._sn_trig){trigFind=1;elm=elm._sn_trig}else{elm=elm.parentNode}}if(show==2)for(var n in notes){if(notes[n].click&&notes[n].visible&&!foundNotes[n])display(n,0)}}};SuperNote.prototype.display=function(noteID,show){with(this){with(notes[noteID]){clearTimeout(timer);if(!animating||(show?!visible:visible)){var tmt=animating?1:(show?showDelay||1:hideDelay||1);timer=setTimeout('SuperNote.instances['+instance+'].setVis("'+noteID+'",'+show+',false)',tmt)}}}};SuperNote.prototype.checkType=function(noteID,nextVis,nextAnim){with(this){var note=notes[noteID],bType,pType;if((/snp-([a-z]+)/).test(note.ref.className))pType=RegExp.$1;if((/snb-([a-z]+)/).test(note.ref.className))bType=RegExp.$1;if(nextAnim&&bType&&bTypes[bType]&&(bTypes[bType](this,noteID,nextVis)==false))return false;if(pType&&pTypes[pType])pTypes[pType](this,noteID,nextVis,nextAnim);return true}};SuperNote.prototype.setVis=function(noteID,show,now){with(this){var note=notes[noteID];if(note&&checkType(noteID,show,1)||now){note.visible=show;note.animating=1;animate(noteID,show,now)}}};SuperNote.prototype.animate=function(noteID,show,now){with(this){var note=notes[noteID];if(!note.animTimer)note.animTimer=0;if(!note.animC)note.animC=0;with(note){clearTimeout(animTimer);var speed=(animations.length&&!now)?(show?animInSpeed:animOutSpeed):1;if(show&&!animC){if(onshow)this.onshow(noteID);IEFrameFix(noteID,1);ref.style[cssProp]=cssVis}animC=Math.max(0,Math.min(1,animC+speed*(show?1:-1)));if(document.getElementById&&speed<1)for(var a=0;a<animations.length;a++)animations[a](ref,animC);if(!show&&!animC){if(onhide)this.onhide(noteID);IEFrameFix(noteID,0);ref.style[cssProp]=cssHid}if(animC!=parseInt(animC)){animTimer=setTimeout(myName+'.animate("'+noteID+'",'+show+')',50)}else{checkType(noteID,animC?1:0,0);note.animating=0}}}};SuperNote.prototype.IEFrameFix=function(noteID,show){with(this){if(!window.createPopup||!IESelectBoxFix)return;var note=notes[noteID],ifr=note.iframe;if(!ifr){ifr=notes[noteID].iframe=document.createElement('iframe');ifr.style.filter='progid:DXImageTransform.Microsoft.Alpha(opacity=0)';ifr.style.position='absolute';ifr.style.borderWidth='0';note.ref.parentNode.insertBefore(ifr,note.ref.parentNode.firstChild)}if(show){ifr.style.left=note.ref.offsetLeft+'px';ifr.style.top=note.ref.offsetTop+'px';ifr.style.width=note.ref.offsetWidth+'px';ifr.style.height=note.ref.offsetHeight+'px';ifr.style.visibility='inherit'}else{ifr.style.visibility='hidden'}}};
/* calendarview */
var Calendar=Class.create()
Calendar.VERSION='1.2'
Calendar.DAY_NAMES=new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday')
Calendar.SHORT_DAY_NAMES=new Array('S','M','T','W','T','F','S','S')
Calendar.MONTH_NAMES=new Array('January','February','March','April','May','June','July','August','September','October','November','December')
Calendar.SHORT_MONTH_NAMES=new Array('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec')
Calendar.NAV_PREVIOUS_YEAR=-2
Calendar.NAV_PREVIOUS_MONTH=-1
Calendar.NAV_TODAY=0
Calendar.NAV_NEXT_MONTH=1
Calendar.NAV_NEXT_YEAR=2
Calendar._checkCalendar=function(event){if(!window._popupCalendar)
return false
if(Element.descendantOf(Event.element(event),window._popupCalendar.container))
return
window._popupCalendar.callCloseHandler()
return Event.stop(event)}
Calendar.handleMouseDownEvent=function(event)
{Event.observe(document,'mouseup',Calendar.handleMouseUpEvent)
Event.stop(event)}
Calendar.handleMouseUpEvent=function(event)
{var el=Event.element(event)
var calendar=el.calendar
var isNewDate=false
if(!calendar)return false
if(typeof el.navAction=='undefined')
{if(calendar.currentDateElement){Element.removeClassName(calendar.currentDateElement,'selected')
Element.addClassName(el,'selected')
calendar.shouldClose=(calendar.currentDateElement==el)
if(!calendar.shouldClose)calendar.currentDateElement=el}
calendar.date.setDateOnly(el.date)
isNewDate=true
calendar.shouldClose=!el.hasClassName('otherDay')
var isOtherMonth=!calendar.shouldClose
if(isOtherMonth)calendar.update(calendar.date)}
else
{var date=new Date(calendar.date)
if(el.navAction==Calendar.NAV_TODAY)
date.setDateOnly(new Date())
var year=date.getFullYear()
var mon=date.getMonth()
function setMonth(m){var day=date.getDate()
var max=date.getMonthDays(m)
if(day>max)date.setDate(max)
date.setMonth(m)}
switch(el.navAction){case Calendar.NAV_PREVIOUS_YEAR:if(year>calendar.minYear)
date.setFullYear(year-1)
break
case Calendar.NAV_PREVIOUS_MONTH:if(mon>0){setMonth(mon-1)}
else if(year-->calendar.minYear){date.setFullYear(year)
setMonth(11)}
break
case Calendar.NAV_TODAY:break
case Calendar.NAV_NEXT_MONTH:if(mon<11){setMonth(mon+1)}
else if(year<calendar.maxYear){date.setFullYear(year+1)
setMonth(0)}
break
case Calendar.NAV_NEXT_YEAR:if(year<calendar.maxYear)
date.setFullYear(year+1)
break}
if(!date.equalsTo(calendar.date)){calendar.setDate(date)
isNewDate=true}else if(el.navAction==0){isNewDate=(calendar.shouldClose=true)}}
if(isNewDate)event&&calendar.callSelectHandler()
if(calendar.shouldClose)event&&calendar.callCloseHandler()
Event.stopObserving(document,'mouseup',Calendar.handleMouseUpEvent)
return Event.stop(event)}
Calendar.defaultSelectHandler=function(calendar)
{if(!calendar.dateField)return false
if(calendar.dateField.tagName=='DIV')
Element.update(calendar.dateField,calendar.date.print(calendar.dateFormat))
else if(calendar.dateField.tagName=='INPUT'){calendar.dateField.value=calendar.date.print(calendar.dateFormat)}
if(typeof calendar.dateField.onchange=='function')
calendar.dateField.onchange()
if(calendar.shouldClose)calendar.callCloseHandler()}
Calendar.defaultCloseHandler=function(calendar)
{calendar.hide()}
Calendar.setup=function(params)
{function param_default(name,def){if(!params[name])params[name]=def}
param_default('dateField',null)
param_default('triggerElement',null)
param_default('parentElement',null)
param_default('selectHandler',null)
param_default('closeHandler',null)
if(params.parentElement)
{var calendar=new Calendar(params.parentElement)
calendar.setSelectHandler(params.selectHandler||Calendar.defaultSelectHandler)
if(params.dateFormat)
calendar.setDateFormat(params.dateFormat)
if(params.dateField){calendar.setDateField(params.dateField)
calendar.parseDate(calendar.dateField.innerHTML||calendar.dateField.value)}
calendar.show()
return calendar}
else
{var triggerElement=$(params.triggerElement||params.dateField)
triggerElement.onclick=function(){var calendar=new Calendar()
calendar.setSelectHandler(params.selectHandler||Calendar.defaultSelectHandler)
calendar.setCloseHandler(params.closeHandler||Calendar.defaultCloseHandler)
if(params.dateFormat)
calendar.setDateFormat(params.dateFormat)
if(params.dateField){calendar.setDateField(params.dateField)
calendar.parseDate(calendar.dateField.innerHTML||calendar.dateField.value)}
if(params.dateField)
Date.parseDate(calendar.dateField.value||calendar.dateField.innerHTML,calendar.dateFormat)
calendar.showAtElement(triggerElement)
return calendar}}}
Calendar.prototype={container:null,selectHandler:null,closeHandler:null,minYear:1900,maxYear:2100,dateFormat:'%Y-%m-%d',date:new Date(),currentDateElement:null,shouldClose:false,isPopup:true,dateField:null,initialize:function(parent)
{if(parent)
this.create($(parent))
else
this.create()},update:function(date)
{var calendar=this
var today=new Date()
var thisYear=today.getFullYear()
var thisMonth=today.getMonth()
var thisDay=today.getDate()
var month=date.getMonth();var dayOfMonth=date.getDate();if(date.getFullYear()<this.minYear)
date.setFullYear(this.minYear)
else if(date.getFullYear()>this.maxYear)
date.setFullYear(this.maxYear)
this.date=new Date(date)
date.setDate(1)
date.setDate(-(date.getDay())+1)
Element.getElementsBySelector(this.container,'tbody tr').each(function(row,i){var rowHasDays=false
row.immediateDescendants().each(function(cell,j){var day=date.getDate()
var dayOfWeek=date.getDay()
var isCurrentMonth=(date.getMonth()==month)
cell.className=''
cell.date=new Date(date)
cell.update(day)
if(!isCurrentMonth)
cell.addClassName('otherDay')
else
rowHasDays=true
if(isCurrentMonth&&day==dayOfMonth){cell.addClassName('selected')
calendar.currentDateElement=cell}
if(date.getFullYear()==thisYear&&date.getMonth()==thisMonth&&day==thisDay)
cell.addClassName('today')
if([0,6].indexOf(dayOfWeek)!=-1)
cell.addClassName('weekend')
date.setDate(day+1)});!rowHasDays?row.hide():row.show()})
this.container.getElementsBySelector('td.title')[0].update(Calendar.MONTH_NAMES[month]+' '+this.date.getFullYear())},create:function(parent)
{if(!parent){parent=document.getElementsByTagName('body')[0]
this.isPopup=true}else{this.isPopup=false}
var table=new Element('table')
var thead=new Element('thead')
table.appendChild(thead)
var row=new Element('tr')
var cell=new Element('td',{colSpan:7})
cell.addClassName('title')
row.appendChild(cell)
thead.appendChild(row)
row=new Element('tr')
this._drawButtonCell(row,'&#x00ab;',1,Calendar.NAV_PREVIOUS_YEAR)
this._drawButtonCell(row,'&#x2039;',1,Calendar.NAV_PREVIOUS_MONTH)
this._drawButtonCell(row,'Today',3,Calendar.NAV_TODAY)
this._drawButtonCell(row,'&#x203a;',1,Calendar.NAV_NEXT_MONTH)
this._drawButtonCell(row,'&#x00bb;',1,Calendar.NAV_NEXT_YEAR)
thead.appendChild(row)
row=new Element('tr')
for(var i=0;i<7;++i){cell=new Element('th').update(Calendar.SHORT_DAY_NAMES[i])
if(i==0||i==6)
cell.addClassName('weekend')
row.appendChild(cell)}
thead.appendChild(row)
var tbody=table.appendChild(new Element('tbody'))
for(i=6;i>0;--i){row=tbody.appendChild(new Element('tr'))
row.addClassName('days')
for(var j=7;j>0;--j){cell=row.appendChild(new Element('td'))
cell.calendar=this}}
this.container=new Element('div')
this.container.addClassName('calendar')
if(this.isPopup){this.container.setStyle({position:'absolute',display:'none'})
this.container.addClassName('popup')}
this.container.appendChild(table)
this.update(this.date)
Event.observe(this.container,'mousedown',Calendar.handleMouseDownEvent)
parent.appendChild(this.container)},_drawButtonCell:function(parent,text,colSpan,navAction)
{var cell=new Element('td')
if(colSpan>1)cell.colSpan=colSpan
cell.className='button'
cell.calendar=this
cell.navAction=navAction
cell.innerHTML=text
cell.unselectable='on'
parent.appendChild(cell)
return cell},callSelectHandler:function()
{if(this.selectHandler)
this.selectHandler(this,this.date.print(this.dateFormat))},callCloseHandler:function()
{if(this.closeHandler)
this.closeHandler(this)},show:function()
{this.container.show()
if(this.isPopup){window._popupCalendar=this
Event.observe(document,'mousedown',Calendar._checkCalendar)}},showAt:function(x,y)
{this.container.setStyle({left:x+'px',top:y+'px'})
this.show()},showAtElement:function(element)
{var pos=Position.cumulativeOffset(element)
this.showAt(pos[0],pos[1])},hide:function()
{if(this.isPopup)
Event.stopObserving(document,'mousedown',Calendar._checkCalendar)
this.container.hide()},parseDate:function(str,format)
{if(!format)
format=this.dateFormat
this.setDate(Date.parseDate(str,format))},setSelectHandler:function(selectHandler)
{this.selectHandler=selectHandler},setCloseHandler:function(closeHandler)
{this.closeHandler=closeHandler},setDate:function(date)
{if(!date.equalsTo(this.date))
this.update(date)},setDateFormat:function(format)
{this.dateFormat=format},setDateField:function(field)
{this.dateField=$(field)},setRange:function(minYear,maxYear)
{this.minYear=minYear
this.maxYear=maxYear}}
window._popupCalendar=null
Date.DAYS_IN_MONTH=new Array(31,28,31,30,31,30,31,31,30,31,30,31)
Date.SECOND=1000
Date.MINUTE=60*Date.SECOND
Date.HOUR=60*Date.MINUTE
Date.DAY=24*Date.HOUR
Date.WEEK=7*Date.DAY
Date.parseDate=function(str,fmt){var today=new Date();var y=0;var m=-1;var d=0;var a=str.split(/\W+/);var b=fmt.match(/%./g);var i=0,j=0;var hr=0;var min=0;for(i=0;i<a.length;++i){if(!a[i])continue;switch(b[i]){case"%d":case"%e":d=parseInt(a[i],10);break;case"%m":m=parseInt(a[i],10)-1;break;case"%Y":case"%y":y=parseInt(a[i],10);(y<100)&&(y+=(y>29)?1900:2000);break;case"%b":case"%B":for(j=0;j<12;++j){if(Calendar.MONTH_NAMES[j].substr(0,a[i].length).toLowerCase()==a[i].toLowerCase()){m=j;break;}}
break;case"%H":case"%I":case"%k":case"%l":hr=parseInt(a[i],10);break;case"%P":case"%p":if(/pm/i.test(a[i])&&hr<12)
hr+=12;else if(/am/i.test(a[i])&&hr>=12)
hr-=12;break;case"%M":min=parseInt(a[i],10);break;}}
if(isNaN(y))y=today.getFullYear();if(isNaN(m))m=today.getMonth();if(isNaN(d))d=today.getDate();if(isNaN(hr))hr=today.getHours();if(isNaN(min))min=today.getMinutes();if(y!=0&&m!=-1&&d!=0)
return new Date(y,m,d,hr,min,0);y=0;m=-1;d=0;for(i=0;i<a.length;++i){if(a[i].search(/[a-zA-Z]+/)!=-1){var t=-1;for(j=0;j<12;++j){if(Calendar.MONTH_NAMES[j].substr(0,a[i].length).toLowerCase()==a[i].toLowerCase()){t=j;break;}}
if(t!=-1){if(m!=-1){d=m+1;}
m=t;}}else if(parseInt(a[i],10)<=12&&m==-1){m=a[i]-1;}else if(parseInt(a[i],10)>31&&y==0){y=parseInt(a[i],10);(y<100)&&(y+=(y>29)?1900:2000);}else if(d==0){d=a[i];}}
if(y==0)
y=today.getFullYear();if(m!=-1&&d!=0)
return new Date(y,m,d,hr,min,0);return today;};Date.prototype.getMonthDays=function(month){var year=this.getFullYear()
if(typeof month=="undefined")
month=this.getMonth()
if(((0==(year%4))&&((0!=(year%100))||(0==(year%400))))&&month==1)
return 29
else
return Date.DAYS_IN_MONTH[month]};Date.prototype.getDayOfYear=function(){var now=new Date(this.getFullYear(),this.getMonth(),this.getDate(),0,0,0);var then=new Date(this.getFullYear(),0,0,0,0,0);var time=now-then;return Math.floor(time/Date.DAY);};Date.prototype.getWeekNumber=function(){var d=new Date(this.getFullYear(),this.getMonth(),this.getDate(),0,0,0);var DoW=d.getDay();d.setDate(d.getDate()-(DoW+6)%7+3);var ms=d.valueOf();d.setMonth(0);d.setDate(4);return Math.round((ms-d.valueOf())/(7*864e5))+1;};Date.prototype.equalsTo=function(date){return((this.getFullYear()==date.getFullYear())&&(this.getMonth()==date.getMonth())&&(this.getDate()==date.getDate())&&(this.getHours()==date.getHours())&&(this.getMinutes()==date.getMinutes()));};Date.prototype.setDateOnly=function(date){var tmp=new Date(date);this.setDate(1);this.setFullYear(tmp.getFullYear());this.setMonth(tmp.getMonth());this.setDate(tmp.getDate());};Date.prototype.print=function(str){var m=this.getMonth();var d=this.getDate();var y=this.getFullYear();var wn=this.getWeekNumber();var w=this.getDay();var s={};var hr=this.getHours();var pm=(hr>=12);var ir=(pm)?(hr-12):hr;var dy=this.getDayOfYear();if(ir==0)
ir=12;var min=this.getMinutes();var sec=this.getSeconds();s["%a"]=Calendar.SHORT_DAY_NAMES[w];s["%A"]=Calendar.DAY_NAMES[w];s["%b"]=Calendar.SHORT_MONTH_NAMES[m];s["%B"]=Calendar.MONTH_NAMES[m];s["%C"]=1+Math.floor(y/100);s["%d"]=(d<10)?("0"+d):d;s["%e"]=d;s["%H"]=(hr<10)?("0"+hr):hr;s["%I"]=(ir<10)?("0"+ir):ir;s["%j"]=(dy<100)?((dy<10)?("00"+dy):("0"+dy)):dy;s["%k"]=hr;s["%l"]=ir;s["%m"]=(m<9)?("0"+(1+m)):(1+m);s["%M"]=(min<10)?("0"+min):min;s["%n"]="\n";s["%p"]=pm?"PM":"AM";s["%P"]=pm?"pm":"am";s["%s"]=Math.floor(this.getTime()/1000);s["%S"]=(sec<10)?("0"+sec):sec;s["%t"]="\t";s["%U"]=s["%W"]=s["%V"]=(wn<10)?("0"+wn):wn;s["%u"]=w+1;s["%w"]=w;s["%y"]=(''+y).substr(2,2);s["%Y"]=y;s["%%"]="%";return str.gsub(/%./,function(match){return s[match]||match});};Date.prototype.__msh_oldSetFullYear=Date.prototype.setFullYear;Date.prototype.setFullYear=function(y){var d=new Date(this);d.__msh_oldSetFullYear(y);if(d.getMonth()!=this.getMonth())
this.setDate(28);this.__msh_oldSetFullYear(y);}
