<!--

debugCAL = false;

// function to set the Status Bar message
function setStatusBar(msg) {
  if (document.images) {
    window.status = msg
    return true
  }
  return false
}

// BROWSER DETECTION
// netscape4 won't see these because they are not contained within the starting homepage
var isNS4 = (document.layers);
var isIE4 = (document.all && !document.getElementById);
var isIE5 = (document.all && document.getElementById);
var isNS6 = (!document.all && document.getElementById);
if(debugCAL) {
  if(isNS4) alert('netscape4');
  else if( isIE4 ) alert('iexplorer4');
  else if( isIE5 ) alert('iexplorer5+');
  else if( isNS6 ) alert('netscape6');
}
//if(isNS4 || isNS6){ document.captureEvents(Event.CLICK); }
// document.onclick = trackMouse;



// MOUSE POSITION
// display mouse position
// relative to window use event.x event.y for ie, event.clientX event.clientY for netscape
var SCREENX = 50;
var SCREENY = 50;
function trackMouse( e, cal_object ) {
  if(debugCAL) alert('trackMouse()');
  if( isIE5 ) {
    cal_object.x = event.screenX;
    cal_object.y = event.screenY;
    if(debugCAL) alert('iexplorer5+\ncoordinates.x = ' + cal_object.x + ' coordinates.y = ' + cal_object.y);
  } else if( isNS4 || isNS6 ) {
    cal_object.x = e.screenX;
    cal_object.y = e.screenY;
    // for some reason, docengines is adding 420 to the y coordinate for netscape4, remove next link for general purpose use
    if(isNS4 && cal_object.y > 420) { cal_object.y -= 420; } 
    if(debugCAL) alert('netscape 4 or netscape 6\ncoordinates.x = ' + cal_object.x + ' coordinates.y = ' + cal_object.y);
  } else {
    cal_object.x = false;
    cal_object.y = false;
  }    
  if( cal_object.x == null || cal_object.x == false ) cal_object.x = SCREENX;
  if( cal_object.y == null || cal_object.y == false ) cal_object.y = SCREENY;
  cal_object.x += 15;
  cal_object.y += 15;
}




// CALENDAR POPUP
// if two digit year input dates after this year considered 20 century.
var NUM_CENTYEAR = 30;
// is time input control required by default
var BUL_TIMECOMPONENT = false;
// are year scrolling buttons required by default
var BUL_YEARSCROLL = true;
// default date format
var DATEFORMAT = "mm/dd/yyyy";

var calendars = [];
var RE_NUM = /^\-?\d+$/;

function calendar( obj_target ) {
  if(debugCAL){ alert('create calendar object'); }

  // methods
  this.gen_date = cal_gen_date;
  this.gen_time = cal_gen_time;
  this.gen_tsmp = cal_gen_tsmp;
  this.prs_date = cal_prs_date;
  this.prs_time = cal_prs_time;
  this.prs_tsmp = cal_prs_tsmp;
  this.popup    = cal_popup;
  this.popup2   = cal_popup2;

  // validate input parameters
  if (!obj_target)
    return cal_error("Error calling the calendar: no target control specified");
  if (obj_target.value == null)
    return cal_error("Error calling the calendar: parameter specified is not valid target control");
  this.target = obj_target;
  this.time_comp = BUL_TIMECOMPONENT;
  this.year_scroll = BUL_YEARSCROLL;
  this.format = DATEFORMAT;
  this.x = SCREENX;
  this.y = SCREENY;
  // register in global collections
  this.id = calendars.length;
  calendars[this.id] = this;
}

// call this the first time with a path defined on where to find calendar.html
function cal_popup( str_datetime, calendar_path ) {
  if(debugCAL){ alert('call calendar.html\ncalX = ' + this.x + ' calY = ' + this.y); }
  if( this.x == null || this.x == false ) { this.x = 50; }
  if( this.y == null || this.y == false ) { this.y = 50; }
  this.dt_current = this.prs_tsmp(str_datetime ? str_datetime : this.target.value);
  if (!this.dt_current) return;
  var obj_calwindow = window.open( calendar_path + 'calendar.html?datetime=' + this.dt_current.valueOf() + '&id=' + this.id,'Calendar', 'width=200,height='+(this.time_comp ? 240 : 215)+',status=no,resizable=no,left=' +this.x+ ',top=' +this.y+ ',dependent=yes,alwaysRaised=yes' );
  obj_calwindow.opener = window;
  obj_calwindow.focus();
}

// exact copy of cal_popup() except you do not define where to find the calendar.html file because it already knows where to find it
function cal_popup2( str_datetime ) {
  if(debugCAL){ alert('call calendar.html\ncalX = ' + this.x + ' calY = ' + this.y); }
  if( this.x == null || this.x == false ) { this.x = 50; }
  if( this.y == null || this.y == false ) { this.y = 50; }
  this.dt_current = this.prs_tsmp(str_datetime ? str_datetime : this.target.value);
  if (!this.dt_current) return;
  var obj_calwindow = window.open( 'calendar.html?datetime=' + this.dt_current.valueOf() + '&id=' + this.id,'Calendar', 'width=200,height='+(this.time_comp ? 240 : 215)+',status=no,resizable=no,left=' +this.x+ ',top=' +this.y+ ',dependent=yes,alwaysRaised=yes' );
  obj_calwindow.opener = window;
  obj_calwindow.focus();
}

// timestamp generating function
function cal_gen_tsmp( dt_datetime ) {
  if(debugCAL){ alert('timestamp generating function'); }
  return(this.gen_date(dt_datetime) + ' ' + this.gen_time(dt_datetime));
}

// date generating function
function cal_gen_date( dt_datetime ) {
  if(debugCAL){ alert('date generating function\nformat = ' + this.format); }
  switch(this.format) {
    case "mm/dd/yy" :
    case "mm/dd/yyyy" :
      return (
        (dt_datetime.getMonth() < 9 ? '0' : '') + (dt_datetime.getMonth() + 1) + "/"
        + (dt_datetime.getDate() < 10 ? '0' : '') + dt_datetime.getDate() + "/"
        + (this.format == "mm/dd/yy" ? dt_datetime.getFullYear().toString().substring(2,4) : dt_datetime.getFullYear())
      );
    case "yy/mm/dd" :
    case "yyyy/mm/dd" :
      return (
        (this.format == "yy/mm/dd" ? dt_datetime.getFullYear().toString().substring(2,4) : dt_datetime.getFullYear()) + "/"
        + (dt_datetime.getMonth() < 9 ? '0' : '') + (dt_datetime.getMonth() + 1) + "/"
        + (dt_datetime.getDate() < 10 ? '0' : '') + dt_datetime.getDate()
      );
    default :
      // if no format set, return nothing; good for disabling calendar function
      return ("");
   }
}
// time generating function
function cal_gen_time( dt_datetime ) {
  if(debugCAL){ alert('timestamp generating function'); }
  return (
    (dt_datetime.getHours() < 10 ? '0' : '') + dt_datetime.getHours() + ":"
    + (dt_datetime.getMinutes() < 10 ? '0' : '') + (dt_datetime.getMinutes()) + ":"
    + (dt_datetime.getSeconds() < 10 ? '0' : '') + (dt_datetime.getSeconds())
  );
}

// timestamp parsing function
function cal_prs_tsmp( str_datetime ) {
  if(debugCAL){ alert('timestamp parsing function'); }
  // if no parameter specified return current timestamp
  if (!str_datetime)
    return (new Date());

  // if positive integer treat as milliseconds from epoch
  if (RE_NUM.exec(str_datetime))
    return new Date(str_datetime);
    
  // else treat as date in string format
  var arr_datetime = str_datetime.split(' ');
  return this.prs_time(arr_datetime[1], this.prs_date(arr_datetime[0]));
}

// date parsing function
function cal_prs_date( str_date ) {
  if(debugCAL){ alert('date parsing function\nformat = ' + this.format); }

  switch(this.format) {
    case "mm/dd/yy" :
    case "mm/dd/yyyy":
      var arr_date = str_date.split('/');
      if (arr_date.length != 3) return alert ("Invalid date format: '" + str_date + "'.\nFormat accepted is mm/dd/yyyy.");
      if (!arr_date[1]) return alert ("Invalid date format: '" + str_date + "'.\nNo day of month value can be found.");
      if (!RE_NUM.exec(arr_date[1])) return alert ("Invalid day of month value: '" + arr_date[1] + "'.\nAllowed values are unsigned integers.");
      if (!arr_date[0]) return alert ("Invalid date format: '" + str_date + "'.\nNo month value can be found.");
      if (!RE_NUM.exec(arr_date[0])) return alert ("Invalid month value: '" + arr_date[0] + "'.\nAllowed values are unsigned integers.");
      if (!arr_date[2]) return alert ("Invalid date format: '" + str_date + "'.\nNo year value can be found.");
      if (!RE_NUM.exec(arr_date[2])) return alert ("Invalid year value: '" + arr_date[2] + "'.\nAllowed values are unsigned integers.");
    
      var dt_date = new Date();
      dt_date.setDate(1);
    
      if (arr_date[0] < 1 || arr_date[0] > 12) return alert ("Invalid month value: '" + arr_date[0] + "'.\nAllowed range is 01-12.");
      dt_date.setMonth(arr_date[0]-1);
       
      if (arr_date[2] < 100) arr_date[2] = Number(arr_date[2]) + (arr_date[2] < NUM_CENTYEAR ? 2000 : 1900);
      dt_date.setFullYear(arr_date[2]);
    
      var dt_numdays = new Date(arr_date[2], arr_date[0], 0);
      dt_date.setDate(arr_date[1]);
      if (dt_date.getMonth() != (arr_date[0]-1)) return alert ("Invalid day of month value: '" + arr_date[1] + "'.\nAllowed range is 01-"+dt_numdays.getDate()+".");
    
      return (dt_date);
    case "yy/mm/dd" :
    case "yyyy/mm/dd" :
      var arr_date = str_date.split('/');
      if (arr_date.length != 3) return alert ("Invalid date format: '" + str_date + "'.\nFormat accepted is mm/dd/yyyy.");
      if (!arr_date[2]) return alert ("Invalid date format: '" + str_date + "'.\nNo day of month value can be found.");
      if (!RE_NUM.exec(arr_date[2])) return alert ("Invalid day of month value: '" + arr_date[1] + "'.\nAllowed values are unsigned integers.");
      if (!arr_date[1]) return alert ("Invalid date format: '" + str_date + "'.\nNo month value can be found.");
      if (!RE_NUM.exec(arr_date[1])) return alert ("Invalid month value: '" + arr_date[0] + "'.\nAllowed values are unsigned integers.");
      if (!arr_date[0]) return alert ("Invalid date format: '" + str_date + "'.\nNo year value can be found.");
      if (!RE_NUM.exec(arr_date[0])) return alert ("Invalid year value: '" + arr_date[2] + "'.\nAllowed values are unsigned integers.");
    
      var dt_date = new Date();
      dt_date.setDate(1);
    
      if (arr_date[1] < 1 || arr_date[1] > 12) return alert ("Invalid month value: '" + arr_date[1] + "'.\nAllowed range is 01-12.");
      dt_date.setMonth(arr_date[1]-1);
       
      if (arr_date[0] < 100) arr_date[0] = Number(arr_date[0]) + (arr_date[0] < NUM_CENTYEAR ? 2000 : 1900);
      dt_date.setFullYear(arr_date[0]);
    
      var dt_numdays = new Date(arr_date[0], arr_date[1], 0);
      dt_date.setDate(arr_date[2]);
      if (dt_date.getMonth() != (arr_date[1]-1)) return alert ("Invalid day of month value: '" + arr_date[2] + "'.\nAllowed range is 01-"+dt_numdays.getDate()+".");
    
      return (dt_date);
    }
}

// time parsing function
function cal_prs_time( str_time, dt_date ) {
  if(debugCAL){ alert('time parsing function'); }

  if (!dt_date) return null;
  var arr_time = String(str_time ? str_time : '').split(':');

  if (!arr_time[0]) dt_date.setHours(0);
  else if (RE_NUM.exec(arr_time[0])) 
    if (arr_time[0] < 24) dt_date.setHours(arr_time[0]);
    else return cal_error ("Invalid hours value: '" + arr_time[0] + "'.\nAllowed range is 00-23.");
  else return cal_error ("Invalid hours value: '" + arr_time[0] + "'.\nAllowed values are unsigned integers.");
  
  if (!arr_time[1]) dt_date.setMinutes(0);
  else if (RE_NUM.exec(arr_time[1]))
    if (arr_time[1] < 60) dt_date.setMinutes(arr_time[1]);
    else return cal_error ("Invalid minutes value: '" + arr_time[1] + "'.\nAllowed range is 00-59.");
  else return cal_error ("Invalid minutes value: '" + arr_time[1] + "'.\nAllowed values are unsigned integers.");

  if (!arr_time[2]) dt_date.setSeconds(0);
  else if (RE_NUM.exec(arr_time[2]))
    if (arr_time[2] < 60) dt_date.setSeconds(arr_time[2]);
    else return cal_error ("Invalid seconds value: '" + arr_time[2] + "'.\nAllowed range is 00-59.");
  else return cal_error ("Invalid seconds value: '" + arr_time[2] + "'.\nAllowed values are unsigned integers.");

  dt_date.setMilliseconds(0);
  return dt_date;
}

function cal_error( str_message ) {
  alert (str_message);
  return null;
}

//-->

