var dp, seldt, todaydt;
var dpHide = null;
var dpDays = new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday');
var dpMonths = new Array('January','February','March','April','May','June','July','August','September','October','November','December');
dp_init();

function dp_init(){
  document.write('<div id="dpDiv" style="position:absolute;visibility:hidden;" onmouseover="if(dpHide) clearTimeout(dpHide);" onmouseout="setDivHide(500);"></div>');
  document.write(dpStyle());
  dp = new datepicker('dp','','')
}

//Constructor
function datepicker(id,dt,ctlid,fmt,orig){
  this.id = id;
  this.ctl = ctlid;
  this.format = fmt;
  if(isDate(dt)) dt = new Date(dt);
  else dt = new Date();
  if(orig==1) seldt=(dt.getMonth()+1)+'/'+dt.getDate()+'/'+dt.getFullYear()
  this.dateObject = dt;
  this.write = writeDp;
  this.month = dt.getMonth();
  this.date = dt.getDate();
  this.year = dt.getFullYear();
  this.length = daysInMonth(this.month, this.year);
  dt.setDate(1); // day of week for first day in month
  this.firstDay = dt.getDay();
  dt.setDate(this.date); // reset to correct day
  var dttmp = new Date();
  todaydt = (dttmp.getMonth()+1)+'/'+dttmp.getDate()+'/'+dttmp.getFullYear()
}

function getFormattedDate(d,f){
  switch(f){
  case 'm/d/yyyy':
    return (d.getMonth()+1) + '/' + d.getDate() + '/' + d.getFullYear();
  case 'mm/dd/yyyy':
    var m = '0'+(d.getMonth()+1);
    (m.length==2)?m=m:m=m.substring(1,3);
    var dy = '0'+d.getDate();
    (dy.length==2)?dy=dy:dy=dy.substring(1,3);
    return m + '/' + dy + '/' + d.getFullYear();
  case 'abbr':
    return dpDays[(d.getDay())].substring(0,3) + ', ' + dpMonths[d.getMonth()].substring(0,3) + ' ' + d.getDate() + ', ' + d.getFullYear();
  case 'long':
    return dpDays[(d.getDay())] + ', ' + dpMonths[d.getMonth()] + ' ' + d.getDate() + ', ' + d.getFullYear();
  default:
    return (d.getMonth()+1) + '/' + d.getDate() + '/' + d.getFullYear();
  }
}

function writeDp(){
  var s='<table id="dp' + this.id + '" cellspacing=0 class=dpTable>';

  // nav row
  s+='<tr>';
  s+='<td class=dpnav onClick="changeMonth(-12,\'' + this.id + '\')" title="previous year">&lt;&lt;</td>';
  s+='<td class=dpnav onClick="changeMonth(-1,\'' + this.id + '\')" title="previous month">&lt;</td>';
  s+='<td class=dpnav colspan=3 onClick="today(\'' + this.id + '\')" title="current month">' + dpMonths[this.month].substring(0,3) + ', ' + this.year + '</td>';
  s+='<td class=dpnav onClick="changeMonth(1,\'' + this.id + '\')" title="next month">&gt;</td>';
  s+='<td class=dpnav onClick="changeMonth(12,\'' + this.id + '\')" title="next year">&gt;&gt;</td>';
  s+='</tr>';

  // days of week
  s+='<tr>';
  for(i=0;i<7;i++) s+='<th class=dpwday>' + dpDays[i].substring(0,2) + '</th>';
  s+='</tr>';

  // days
  s+='<tr>';
  for(j=0;j<42;j++){
    var daynum = (j-this.firstDay+1);
    var curdt = ((this.month+1)+'/'+daynum+'/'+this.year);
    if(j<this.firstDay){ // leading empty cells
      s+='<td class=dpempty>&nbsp;</td>';
    }else if(curdt==seldt){ // hilite selected day
      s+='<td id="' + this.id +'selected" class=dpselday onClick="javascript:changeDate(this,\'' + this.id + '\')" title="current selected day">' + daynum + '</td>';
    }else if(curdt==todaydt){ // hilite today
      s+='<td id="' + this.id +'selected" class=dptoday onClick="javascript:changeDate(this,\'' + this.id + '\')" title="today">' + daynum + '</td>';
    }else if(daynum > this.length){ // trailing empty cells
      s+='<td class=dpempty>&nbsp;</td>';
    }else{ // month days
      s+='<td id="" class=dpday onClick="javascript:changeDate(this,\'' + this.id + '\')" onmouseover="this.className=\'dphilite\';" onmouseout="this.className=\'dpday\';">' + daynum + '</td>';
    }
    if(j%7==6){ // end of row
      if(daynum >= this.length) break;
      else s+='</tr><tr>';
    }
  }
  s+='</tr></table>';
  return s;
}

function changeDate(td,p){
  p = eval(p);
  p.dateObject.setDate(td.firstChild.nodeValue);
  document.getElementById(p.ctl).value = getFormattedDate(p.dateObject, p.format);
  setDivHide(1);
}

function today(p){
  p = eval(p);
  p.dateObject = new Date();
  p = new datepicker(p.id,p.dateObject);
  document.getElementById('dpDiv').innerHTML = p.write();
}

function changeMonth(mo,p){
  p = eval(p);
  var d = new Date(p.dateObject);
  var maxcurr = daysInMonth(d.getMonth(), d.getFullYear());
  var mm = (d.getMonth() + mo) % 12;
  if(mm < 0) mm += 12;
  var yy = d.getFullYear() + Math.floor((mo + d.getMonth()) / 12);
  var maxnext = daysInMonth(mm, yy);
  var i = (maxnext < d.getDate()) ? (maxnext - d.getDate()) : 0;
  p.dateObject =  new Date(d.getFullYear(), d.getMonth()+mo, d.getDate()+i)
  p = new datepicker(p.id,p.dateObject);
  document.getElementById('dpDiv').innerHTML = p.write();
}

function daysInMonth(m,y) {
  switch (m) {
    case 1:
      if((y%4==0&&y%100!=0)||y%400==0) return 29; //leap year
      else return 28;
    case 3: case 5: case 8: case 10: return 30
    default: return 31;
  }
}

function getPageOffsetLeft(el){
  var ol=el.offsetLeft;
  while((el=el.offsetParent) != null)
    ol += el.offsetLeft;
  return ol;
  }

function getPageOffsetTop(el){
  var ot=el.offsetTop;
  while((el=el.offsetParent) != null)
    ot += el.offsetTop;
  return ot;
  }

function isDate(str){
  var dstr = new Date(str);
  return isNaN(dstr)? false : true;
}

function showDp(t,f){
  if(dp.ctl!=t){
    //document.getElementById('debug').innerHTML='different '+Math.random(0);
    var div = document.getElementById('dpDiv');
    var ctl = document.getElementById(t);
    if(div.style.top != 0) toggleSelect(div, 1);
    var ctlx, ctlw, ctly, ctlh;
    ctlx = getPageOffsetLeft(ctl);
    ctly = getPageOffsetTop(ctl);
    ctlw = ctl.clientWidth;
    ctlh = ctl.clientHeight;
    dp = new datepicker('dp', ctl.value, t, f, 1);
    div.innerHTML = dp.write();
    if(parseInt(ctly+ctlh-document.body.scrollTop+div.clientHeight) > document.body.clientHeight)
      div.style.top = ctly-div.clientHeight;  // show above
    else
      div.style.top = ctly+ctlh+4; // show below
    if(parseInt(ctlx-document.body.scrollLeft+div.clientWidth) > document.body.clientWidth)
      div.style.left = ctlx+ctlw-div.clientWidth+3;  // show to left
    else
      div.style.left = ctlx; // show to right
    toggleSelect(div, 0);
    div.style.visibility = 'visible';
    setDivHide(2500);
  }
  else{
    //setDivHide(1);    // FF gets confused here...
    //document.getElementById('debug').innerHTML='same';
  }
}

function setDivHide(x){
  if(dpHide) clearTimeout(dpHide);
  dpHide = setTimeout('divHide();', x);
}

function divHide(){
  var div = document.getElementById('dpDiv');
  toggleSelect(div, 1);
  div.style.left = 0;
  div.style.top = 0;
  div.style.visibility='hidden';
  dp.ctl='';
}

function toggleSelect(dv, vis){
  var appVer = navigator.appVersion.toLowerCase();
  var iePos = appVer.indexOf('msie');
  if (iePos !=-1) {
    var is_minor = parseFloat(appVer.substring(iePos+5,appVer.indexOf(';',iePos)));
    var is_major = parseInt(is_minor);
  }
  if (navigator.appName.substring(0,9) == "Microsoft") {// Check if IE version is 6 or older
    if (is_major <= 6) {
      var x=dv.offsetLeft;var y=dv.offsetTop;var w=dv.offsetWidth;var h=dv.offsetHeight;
      var selx,sely,selw,selh,i;
      var sel=document.getElementsByTagName("SELECT");
      for(i=0;i<sel.length;i++){
        selx=0;sely=0;var selp;
        if(sel[i].offsetParent){selp=sel[i];
          while(selp.offsetParent){selp=selp.offsetParent;selx+=selp.offsetLeft;sely+=selp.offsetTop;}}
        selx+=sel[i].offsetLeft;sely+=sel[i].offsetTop;selw=sel[i].offsetWidth;selh=sel[i].offsetHeight;
        if(selx+selw>x && selx<x+w && sely+selh>y && sely<y+h)
          if(vis==0)sel[i].style.visibility="hidden";
          else sel[i].style.visibility="visible";
}}}}

function dpStyle(){
  var s = '<style>\n';
  s+='.dpTable{\n';
  s+='  width: 140px;\n';
  s+='  border-top:1px black solid;\n';
  s+='  border-left:1px black solid;\n';
  s+='  border-right:1px black solid;\n';
  s+='}\n';
  s+='.dpnav, .dpwday, .dpempty, .dpday, .dphilite, .dpselday, .dptoday{\n';
  s+='  font: 11px arial,sans-serif;\n';
  s+='}\n';
  s+='.dpnav, .dpday, .dphilite, .dpselday, .dptoday{\n';
//  s+='  cursor: pointer; cursor: hand;\n';
  s+='  cursor: pointer;\n';
  s+='}\n';
  s+='.dpnav{\n';
  s+='  background-color: navy;\n';
  s+='  color: white;\n';
  s+='  font-weight:bold;\n';
  s+='  text-align:center;\n';
  s+='}\n';
  s+='.dpwday{\n';
  s+='  color: black;\n';
  s+='  background-color: #F0F0F0;\n';
  s+='  border-bottom: 1px black solid;\n';
  s+='  font-weight: bold;\n';
  s+='  width: 14%;\n';
  s+='}\n';
  s+='.dpempty, .dpday, .dphilite, .dpselday, .dptoday{\n';
  s+='  border-bottom: 1px black solid;\n';
  s+='  border-right: 1px black solid;\n';
  s+='  text-align:right;\n';
  s+='  color: #000000;\n';
  s+='}\n';
  s+='.dpempty{\n';
  s+='  background-color: #F0F0F0;\n';
  s+='}\n';
  s+='.dpday{\n';
  s+='  background-color: #FFFFFF;\n';
  s+='}\n';
  s+='.dphilite{\n';
  s+='  background-color: #CCCCFF;\n';
  s+='}\n';
  s+='.dpselday{\n';
  s+='  background-color: #FFCCCC;\n';
  s+='}';
  s+='.dptoday{\n';
  s+='  background-color: #FFFF99;\n';
  s+='}';
  s+='</style>\n';
  return s;
}

