var monthName  = new Array('JAN','FEB','MAR','APR','MAY','JUN','JUL','AUG','SEP','OCT','NOV','DEC');
var monthDays  = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
var returnDate = new Array(42);
var inputObj   = null;

function init() {
  var i;
  var j;

  document.write('<table id="calendar" style="z-index: 2; border-collapse: collapse; background: #FFFFFF; border: 1px solid #ABABAB; position: absolute; left: 0px; top: 0px; display: none;" cellpadding="2">');
  document.write('<tr><td style="cursor: pointer;" onclick="event.cancelBubble=true; monthTrans(-1);"><</td><td colspan="5" id="monthName" style="text-align: center; font: bold 13px Arial;"></td><td style="text-align: right; cursor:pointer;" onclick="event.cancelBubble=true; monthTrans(1);">></td></tr>');
  document.write('<tr><td style="text-align: center; background: #ABABAB; font: 12px Arial;">S</td><td style="text-align: center; background: #ABABAB; font: 12px Arial;">M</td><td style="text-align: center; background: #ABABAB; font: 12px Arial;">T</td><td style="text-align: center; background: #ABABAB; font: 12px Arial;">W</td><td style="text-align: center; background: #ABABAB; font: 12px Arial;">T</td><td style="text-align: center; background: #ABABAB; font: 12px Arial;">F</td><td style="text-align: center; background: #ABABAB; font: 12px Arial;">S</td></tr>');

  for(i = 0; i <= 5; i++) {
    document.write('<tr>');

    for(j = 0; j <= 6; j++) {
      n = 7 * i + j;
      document.write('<td id="tdDay_' + n + '" style="width: 18px; height: 18px; text-align: center; border: 1px solid #6487AE; background-color: #C4D3EA;"></td>');
    }

    document.write('</tr>');
  }

  document.write('</table>');
  document.write('<div id="curDate" style="display: none;"></div>');
  document.all?document.attachEvent('onclick', checkClick):document.addEventListener('click', checkClick, false);

  var calendarObj = new getObj('calendar');
  calendarObj.style.left = "10px";
  calendarObj.style.top  = "10px";
}

function prepCal(date) {
  var i;
  var text;
  var textColor;
  var temp     = date.split("-");
  var curDay   = parseInt(temp[2]);
  var curMonth = parseInt(temp[1]);
  var curYear  = parseInt(temp[0]);
  var begDate  = new Date();
  var endDay;
  var prevEndDay;

  begDate.setFullYear(curYear, (curMonth - 1), 1);

  if (curMonth > 1)
    prevMonth = curMonth - 2;
  else
    prevMonth = 11;

  endDay     = monthDays[curMonth - 1];
  prevEndDay = monthDays[prevMonth];

  // Leap year and current month is feb
  if ((curYear % 4 == 0) && (curYear % 100 != 0) && (curYear % 400 != 0) && (curMonth == 2)) 
    endDay += 1;

  // Leap year and previous month is feb
  if ((curYear % 4 == 0) && (curYear % 100 != 0) && (curYear % 400 != 0) && (curMonth == 3)) 
    prevEndDay += 1;

  for (i = 0; i <= 41; i++) {
    var tdDayObj = new getObj('tdDay_' + i);

    if ((i >= begDate.getDay()) && (i <= (endDay + begDate.getDay() - 1))) {
      tdDayObj.obj.innerHTML = i - begDate.getDay() + 1;
      enable(tdDayObj.obj);
      returnDate[i] = curMonth + "/" + (i - begDate.getDay() + 1) + "/" + curYear;
    } else if (i < begDate.getDay()) {
      tdDayObj.obj.innerHTML = prevEndDay - begDate.getDay() + i + 1;
      disable(tdDayObj.obj);
    } else if (i > (endDay + begDate.getDay() - 1)) {
      tdDayObj.obj.innerHTML = i - begDate.getDay() - endDay + 1;
      disable(tdDayObj.obj);
    } else {
      tdDayObj.obj.innerHTML = "";
      disable(tdDayObj.obj);
    }
  }

  var curDateObj   = new getObj('curDate');
  var monthNameObj = new getObj('monthName');

  monthNameObj.obj.innerHTML = monthName[curMonth - 1] + " - " + curYear;
  curDateObj.obj.innerHTML   = date;
}

function monthTrans(amount) {
  var transMonth;
  var transYear;
  var transDay;

  var curDateObj = new getObj('curDate');
  var date       = curDateObj.obj.innerHTML;
  var temp       = date.split("-");
  transMonth     = parseInt(temp[1]) + parseInt(amount);

  if (transMonth < 1) {
    transYear = parseInt(temp[0]) - 1;
    transMonth = 12;
  } else if (transMonth > 12) {
    transYear = parseInt(temp[0]) + 1;
    transMonth = 1;
  } else {
    transYear = temp[0];
  }

  prepCal(transYear + '-' + transMonth + '-01');
}

function over(e) {
  evtTgt(evtObj(e)).style.background = '#FFCC66';
}

function out(e) {
  evtTgt(evtObj(e)).style.background = '#C4D3EA';
}

function click(e) {
  var calendarObj = new getObj('calendar');

  inputObj.value = returnDate[evtTgt(evtObj(e)).id.substring(6, evtTgt(evtObj(e)).id.length)];
  calendarObj.style.display = 'none';
}

function enable(obj) {
  obj.style.color  = "#000000";
  obj.style.cursor = "pointer";
  obj.onmouseover  = over;
  obj.onmouseout   = out;
  obj.onclick      = click;
}

function disable(obj) {
  obj.style.color  = "#999999";
  obj.style.cursor = null;
  obj.onmouseover  = null;
  obj.onmouseout   = null;
  obj.onclick      = null;
}

function evtTgt(e) {
  var el;

  if (e.target)
    el = e.target;
  else if (e.srcElement)
    el = e.srcElement;

  if (el.nodeType == 3)
    el = el.parentNode; // defeat Safari bug

  return el;
}

function evtObj(e) {
  if (!e) 
    e = window.event;
  return e;
}

function checkClick(e) {
  e?evt = e:evt = event;
  CSE = evt.target?evt.target:evt.srcElement;

  var calendar = new getObj('calendar');

  if (calendar)
    if (!isChild(CSE, calendar))
      calendar.style.display = 'none';
}

function isChild(s,d) {
  while(s) {
    if (s == d)
      return true;
      s = s.parentNode;
    }
  return false;
}

function getObj(name) {
  if (document.getElementById) {
    this.obj = document.getElementById(name);
    this.style = document.getElementById(name).style;
  } else if (document.all) {
    this.obj = document.all[name];
    this.style = document.all[name].style;
  } else if (document.layers) {
    this.obj = document.layers[name];
    this.style = document.layers[name];
  }
}

function createCal(curDate, response) {
  inputObj = response;
  var temp = curDate.split('-');
  curDate = trimNumber(temp[0]) + "-" + trimNumber(temp[1]) + "-" + temp[2];
  prepCal(curDate);

  var calendarObj = new getObj('calendar');
  calendarObj.style.left    = left(inputObj) + "px";
  calendarObj.style.top     = (top(inputObj) + 22) + "px";
  calendarObj.style.display = '';
}

function left(obj) {
  var curleft = 0;

  if (obj.offsetParent) {
    while (obj.offsetParent) {
      curleft += obj.offsetLeft
      obj      = obj.offsetParent;
    }

  } else if (obj.x) {
    curleft += obj.x;
  }

  return curleft;
}

function top(obj) {
  var curtop = 0;

  if (obj.offsetParent) {
    while (obj.offsetParent) {
      curtop += obj.offsetTop
      obj     = obj.offsetParent;
    }

  } else if (obj.y) {
    curtop += obj.y;
  }

  return curtop;
}

function trimNumber(s) {
  while (s.substr(0,1) == '0' && s.length > 1) {
    s = s.substr(1,9999);
  }

  return s;
}

init();
