
function objDatePicker(objTextBox, strDateFormat, strThisObjName) {

  var _objFinalTextBox = (typeof objTextBox == 'object') ? objTextBox : document.getElementById(objTextBox);

  //var _objFinalTextBox = objTextBox;
  var _strDateFormat = strDateFormat;
  var _THIS = strThisObjName;
  var _THISDateForm = "_" + _THIS + "_dateobject";
  var _btnPosTop;
  var _btnPosLeft;
  var _calObj;
  var _months = new Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
  var _days = new Array("Su", "Mo", "Tu", "We", "Th", "Fr", "Sa");
  var _dDate;
  var _dMonth;
  var _dYear;
  var _objMonthBox;
  var _objYearBox;
  var _objDateBox;

  this._GetAbsoluteTopAndLeft = function(objObject) {
    var locs = new Array;
    //var oCurrentNode = objObject;
    var oCurrentNode = _objFinalTextBox;
    locs['left'] = 0;
    locs['top'] = 0;
    while (oCurrentNode.tagName != "BODY") {
      locs['left'] += oCurrentNode.offsetLeft;
      locs['top'] += oCurrentNode.offsetTop;
      oCurrentNode = oCurrentNode.offsetParent;
    }
    locs['top'] = (_objFinalTextBox.offsetHeight) ? locs['top'] + _objFinalTextBox.offsetHeight : 22;
//    locs['left'] = _objFinalTextBox.offsetLeft;
//    locs['top'] = _objFinalTextBox.offsetTop;

    return locs;
  }

  this._GetDate = function(objDateValue) {
    var nDate = _strDateFormat;
    if (!objDateValue) {
      var d = new Date();
      var yy = "0000" + d.getFullYear(); yy = yy.substring(yy.length-4);
      var mm = "00" + (d.getMonth() + 1); mm = mm.substring(mm.length-2);
      var dd = "00" + d.getDate();       dd = dd.substring(dd.length-2);
      nDate = nDate.replace(/%Y/, yy);
      nDate = nDate.replace(/%M/, mm);
      nDate = nDate.replace(/%D/, dd);
      _objFinalTextBox.value = nDate;
      objDateValue = nDate;
    }

    var fmtArr = _strDateFormat.split("-");
    var dateArr = objDateValue.split("-");
    for (var zz=0; zz<fmtArr.length; zz++) {
      switch (fmtArr[zz]) {
        case "%Y" : _dYear = dateArr[zz]; break;
        case "%M" : _dMonth = dateArr[zz]; break;
        case "%D" : _dDate = dateArr[zz]; break;
      }
    }

    _objMonthBox.selectedIndex = _dMonth - 1;
    _objYearBox.value = _dYear;

    this._GenerateCalendar();

  }

  this.SetDate = function(strNewDay) {
    var nDate = _strDateFormat;
    _dDate = strNewDay;

    var yy = "0000" + _dYear; yy = yy.substring(yy.length-4);
    var mm = "00" + _dMonth;  mm = mm.substring(mm.length-2);
    var dd = "00" + _dDate;   dd = dd.substring(dd.length-2);

    nDate = nDate.replace(/%Y/, yy);
    nDate = nDate.replace(/%M/, mm);
    nDate = nDate.replace(/%D/, dd);
    _objFinalTextBox.value = nDate;
    this.CloseCalendar();
  }

  this.ChangeMonth = function() {
    _dMonth = _objMonthBox.selectedIndex + 1;
    this._GenerateCalendar();
  }

  this.ChangeYearUp = function() {
    _dYear++;
    this._GenerateCalendar();
    _objYearBox.value = _dYear;
  }

  this.ChangeYearDown = function() {
    _dYear--;
    this._GenerateCalendar();
    _objYearBox.value = _dYear;
  }

  this._GenerateCalendar = function() {
    var d = new Date();
    var dArr = new Array(42);
    var iStart = 0;
    var iDay = 0;

    d.setDate(1);
    d.setMonth(_dMonth - 1);
    d.setFullYear(_dYear);

    _dMonth = d.getMonth() + 1;
    iStart = d.getDay();


    // loop through the month until the month changes due to overflowing
    var exitloop = 0;
    while (exitloop == 0) {
      d.setDate(iDay+1);
      if (d.getMonth() == (_dMonth - 1)) {
        dArr[iStart+iDay] = iDay+1;
        iDay++;
      } else {
        exitloop = 1;
      }
    }

    var BUFF = "";
    BUFF = '<table class="dpDaysTable">';
    BUFF = BUFF + '<tr class="dpDaysHeading">';
    for (var zz=0;zz<_days.length;zz++) { BUFF = BUFF + '<td>' + _days[zz] + '</td>'; }
    BUFF = BUFF + '</tr>';
    iDay = 0;
    for (var zz=0; zz<dArr.length; zz++) {
      if (iDay == 0) {
        if (zz > 7 && typeof(dArr[zz]) == 'undefined') {
          break;
        } else {
          BUFF = BUFF + '<tr>';
        }
      }
      if (dArr[zz] > 0) {
        BUFF = BUFF + "<td class=\"dpDayItem\" onMouseOver=\"this.className='dpDayItemHover';\" onMouseOut=\"this.className='dpDayItem';\"";
        BUFF = BUFF + " onClick=\""+_THIS+".SetDate('"+dArr[zz]+"');\">";
        BUFF = BUFF + (dArr[zz] > 0 ? dArr[zz] : "&nbsp;");
        BUFF = BUFF + '</td>';
      } else {
        BUFF = BUFF + '<td class="dpDayItem">&nbsp;</td>';
      }
      iDay++;
      if (iDay > 6) { iDay = 0; }
    }

    BUFF = BUFF + '</tr>';
    BUFF = BUFF + '</table>';
    _objDateBox.innerHTML = BUFF;
  }

  this.OpenCalendar = function(btnObj) {
    var _myLocs = this._GetAbsoluteTopAndLeft(btnObj);
    //alert("left: "+_myLocs['left']+", top: "+_myLocs['top']);

    this._GetDate(_objFinalTextBox.value);
    _calObj.style.top = _myLocs['top'];
    _calObj.style.left = _myLocs['left'];
    _calObj.style.display = '';

  }

  this.CloseCalendar = function() {
    _calObj.style.display = 'none';
  }

  this.DrawButton = function() {

    document.write('<input type="image" src="calendar.gif" style="width: 22px; height: 21px; vertical-align: top;" onClick="'+_THIS+'.OpenCalendar(this); return false;">');
    document.write('<span id="'+_THISDateForm+'" style="position:absolute; display:none;">');
    document.write('<table class="dpTable">');
    document.write('<tr>');
    document.write('<td>');

    document.write('<table class="dpToolbar" width="100%">');
    document.write('<tr>');
    document.write('<td style="text-align:left;"> Calendar </td>');
    document.write('<td style="text-align:right;" class="dpControlX" onClick="'+_THIS+'.CloseCalendar();">X</td>');
    document.write('</tr>');
    document.write('</table>');

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

    document.write('<table class="dpMonthYear" width="100%">');
    document.write('<tr>');
    document.write('<td style="text-align: left;">');
    document.write('<select class="dpMonthBox" id="'+_THISDateForm+'_monthselect" size=1 onChange="'+_THIS+'.ChangeMonth();">');
    for (var zz=0;zz<_months.length;zz++) { document.write('<option value="'+zz+'">'+_months[zz]+'</options>'); }
    document.write('</select>');
    document.write('</td>');
    document.write('<td style="text-align: right; vertical-align: middle;">');
    document.write('<span class="dpYearModifier" onMouseOver="this.className='+"'dpYearModifierHover'"+'" onMouseOut="this.className='+"'dpYearModifier'"+'" onClick="'+_THIS+'.ChangeYearDown();">');
    document.write('&lt;');
    document.write('</span>&nbsp;');
    document.write('<input type=text id="'+_THISDateForm+'_yearbox" class="dpYearBox" size=4 maxlength=4 readonly>');
    document.write('&nbsp;<span class="dpYearModifier" onMouseOver="this.className='+"'dpYearModifierHover'"+'" onMouseOut="this.className='+"'dpYearModifier'"+'" onClick="'+_THIS+'.ChangeYearUp();">');
    document.write('&gt;');
    document.write('</span>');
    document.write('</td>');
    document.write('</tr>');
    document.write('</table>');

    document.write('</td>');
    document.write('</tr>');
    document.write('<tr>');
    document.write('<td id="'+_THISDateForm+'_dates">');
    document.write('</td>');

    document.write('</td>');
    document.write('</tr>');
    document.write('</table>');
    document.write('</span>');

  }

  this.DrawButton();
  _calObj = document.getElementById(_THISDateForm);
  _objMonthBox = document.getElementById(_THISDateForm+"_monthselect");
  _objYearBox = document.getElementById(_THISDateForm+"_yearbox");
  _objDateBox = document.getElementById(_THISDateForm+"_dates");

}
