/****************************************************************************
date_functions.js
Purpose: Common JavaScript functions for dates
****************************************************************************/
var dateversion    = "mdy"; //"ymd"
var browser        = new String ("unknown");
var browserversion = new String(parseFloat(navigator.appVersion))
if (navigator.appName == "Microsoft Internet Explorer") browser="MSIE";
else if (navigator.appName == "Netscape") browser="Netscape";
else browser      = "Unknown";
var goodDateMonth = "";
var goodDateYear  = "";
var goodDateDay   = "";
var days          = new Array(12);
var dateWindow    = null;
var todayDate     = new Date();
var todayDay      = todayDate.getDate();
var todayMonth    = todayDate.getMonth() + 1;
var todayYear     = todayDate.getFullYear();

days[0] = days[2] = days[4] = days[6] = days[7] = days[9] = days[11] = 31;
days[3] = days[5] = days[8] = days[10] = 30;
days[1] = 28;

function openDateWindow(inField, minDate, maxDate) {
	if (browser=="MSIE") jsOpenIEDateWindow(inField, minDate, maxDate);
	else jsOpenOthDateWindow(inField, minDate, maxDate);
}	//openDateWindow

function jsOpenOthDateWindow(inField, minDate, maxDate) {
  if (typeof inField == "string") {
		var oDateField = jsGetObjectRef(inField);
	} else if (typeof inField == "object") {
		var oDateField = inField;
	} else return;
	var sURL         = "dialogFS.aspx";
	sURL            += "?windowname=" + " Popup%20Calendar";
	var nWidth       = 315;
	var nHeight      = 285;
	if (typeof oDateField == "object") {
	var sDateField = oDateField.id;
	if (sDateField == undefined) sDateField = oDateField.name;
	var sDate      = oDateField.value;
	var bDateOK    = jsIsDate(sDate);  //from include/calendarFunctions.js
	if (!bDateOK)  sDate = todayDate;  //from include/calendarFunctions.js
	} else {
		var sDate      = todayDate;  //from include/calendarFunctions.js
	}
	var sContentHTML = "";
	var sContentURL  = "PopCalendar.aspx?infield=" + sDateField + "&indate=" + sDate;
	var sButtonHTML  = '';
	sButtonHTML     += '<TABLE border="0" cellpadding="0" cellspacing="0" width="100%">';
	sButtonHTML     += '<TR><TD align="left" valign="top" class="cSmSelect"></TD>';
	sButtonHTML     += '<TD align="right" valign="top" class="cDataEntryR">';
	sButtonHTML     += '<INPUT TYPE="button" id="btnClose" name="btnClose" class="cRegButtons" VALUE="Cancel" onClick="parent.jsCloseCancel()">&nbsp;';
	sButtonHTML     += '</TD></TR></TABLE>';
	var sArgs		     = jsSetParamStr("OpenStr", "?", sKeySep, sValSep);
	sArgs           += jsSetParamStr("PairSep", "=", sKeySep, sValSep);
	sArgs           += jsSetParamStr("GroupSep", "&", sKeySep, sValSep);
	sArgs           += jsSetParamStr("indate", sDate, sKeySep, sValSep);
	sArgs           += jsSetParamStr("datefield", sDateField, sKeySep, sValSep);
	sScreenLoc       = "center";
	sWinAttrs        = ",resizable=yes";
	jsOpenDialog(sURL,nWidth,nHeight,jsRetDate,sContentHTML,sContentURL,sButtonHTML,sArgs,sScreenLoc,sWinAttrs);
} //jsOpenOthDateWindow

function jsRetDate() {
	var sRetVal      = dialogWin.returnedValue.substr(1);
	var sReturn      = "";
	var sTmpInr      = String.fromCharCode(61); //special separator--replaces sKeySep
	var sTmpOutr     = String.fromCharCode(38); //special separator--replaces sValSep
	if(sRetVal!=null && sRetVal != ""){
		var sReturnDate = jsGetParamStr("hidReturnDate", sRetVal, sTmpInr, sTmpOutr);
		var sDateField  = jsGetParamStr("hidCallingField",  sRetVal, sTmpInr, sTmpOutr);
		var oField      = jsGetObjectRef(sDateField);
		if (typeof oField == "object") oField.value = sReturnDate;
	}
} //jsRetDate
    
function jsOpenIEDateWindow(inField, minDate, maxDate) { 
  var curDay    = "";
  var curMonth  = "";
  var curYear   = "";
  var state     =  0;
  var ch        = "";
  var retMilli  =  0;
  if (typeof inField == "string") {
    var thisField = eval(inField);
  } else {
    var thisField = inField;
  }  
  if (thisField.disabled == true) { return; }
	var thisval   = thisField.value;
	if (thisval.length == 0) thisval = buildToday();
  for (var x = 0; x <= thisval.length; x++) {
    if (dateversion == "ymd") {
      if (thisval.charAt(x) == "-") state++;
      else {
        ch = thisval.charAt(x);
        if (ch >= '0' && ch <= '9')
          if      (state == 0)    curYear  += ch;
          else if (state == 1)    curMonth += ch;
          else                    curDay   += ch;
      }
      } else { // "mdy"
			if (thisval.charAt(x) == "/") state++;
      else {
        ch = thisval.charAt(x);
        if (ch >= '0' && ch <= '9')
          if      (state == 0)    curMonth += ch;
          else if (state == 1)    curDay   += ch;
          else                    curYear  += ch;
      }
		} //dateversion check 
  }

	curDate  = new Date (curYear + "/" + curMonth + "/" + curDay);

	curTime  = curDate.getTime();
  //if (minDate == null) minDate = curDate - 8766; //-24 years
  //if (maxDate == null) maxDate = curDate + 8766; //+24 years
  var lparams  = "dialogHeight=315px; dialogWidth=360px;" ;
      lparams += "help:no; resizable:no; status:no;" ;
	retMilli = showModalDialog("include/calendarPopup.html", curTime, lparams);
  if (retMilli >= 0 ) {
    thisField.value = buildCharDate(retMilli);  //repaint full format.
  }
  else {
	thisField.value = "";
  }
} //jsOpenIEDateWindow

function buildCharDate(inMilli) {
	var buildDate  = new Date(inMilli);
	var buildMonth = buildDate.getMonth() + 1;
	var buildDay   = buildDate.getDate();
	var buildYear  = buildDate.getFullYear();
	if (buildMonth == 13) {
	  buildMonth  = 1;
	buildYear  += 1;
	}
	buildMonth = buildMonth + "";
	buildDay   = buildDay   + "";
	buildYear  = buildYear  + "";

	if (buildMonth.length == 1)
	  buildMonth = "0" + buildMonth;
	if (buildDay.length == 1)
	  buildDay   = "0" + buildDay;
  if (dateversion == "mdy") {
	  outDate    = buildMonth + "/" + buildDay + "/" + buildYear;
	} else { // ymd
		outDate    = buildYear + "-" + buildMonth + "-" + buildDay;
	}  
	return outDate;
} //buildCharDate()

function isNumber(data, xtrachars) {
  var numStr = "0123456789";
	numStr += xtrachars;
  for (i = 0; i < data.length; i++) {
    thisChar = data.charAt(i);
    if (numStr.indexOf(thisChar) == -1)
    return false;
  }
  return true;
}

function buildToday() {
	if (todayMonth == 13) {
	  todayYear += 1;
	todayMonth = 1;
	}
  if (dateversion == "mdy") {
	  retString  = todayMonth + "/" + todayDay + "/" + todayYear;
	} else { // ymd
    retString  = todayYear + "-" + todayMonth + "-" + todayDay;
  }
	return retString;
} //buildToday

function handleDateChange(oField, hideAlert) {
  var retMsg = "";
  var testDate = oField.value ;
  testDate = xjsREPLACE(testDate) ;  //clr spaces
  if (testDate == "?") retMsg = "";
  else {
    retMsg =  buildGoodDate(oField, hideAlert);
  }
  return retMsg;
} //handleDateChange()
    
function jsIsDate(testDate, DateFormat) {
	//NOTE: function test testDate to see if it is a valid date; returns true or false
	if (DateFormat == undefined) DateFormat = "mdy";
	var rDash     = /-/;
  testDate      = xjsREPLACE(testDate);  //remove spaces..
	testDate      = testDate.toLowerCase();
	if ( testDate.length == 0  || testDate.length > 10) {
    return false;
	}
	if ( testDate.search(rDash) > 0 ) {
		/*yyyy-mm-dd format*/
		sDateFormat   = "ymd";
    goodDateNums  = isNumber(testDate, "-");
	} else {
		/*mm/dd/yyyy format*/
		sDateFormat   = "mdy";
    testDate      = xjsREPLACE(testDate, ".", "/") ; //allow various separators:
    testDate      = xjsREPLACE(testDate, ",", "/") ;
    goodDateNums  = isNumber(testDate, "/");
	}
  if (goodDateNums == false) {
    return false;
  } else { //goodDateNums = true
		return true;
	}
	
} //jsIsDate

function buildGoodDate(oField, hideAlert) {
	var sTestDate = oField.value + "";
	var sReturn   = jsTestDate(sTestDate, hideAlert);
	var aReturn   = sReturn.split("|");
	var sRetDate  = aReturn[0];
	var sRetMsg   = aReturn[1];
	if (sTestDate != sRetDate) {
		oField.value = sRetDate;
	}
	if (!hideAlert) {
		window.alert(sRetMsg);
	}	
	return sReturn;
} //buildGoodDate	
    
function jsTestDate(inputDate, hideAlert) {
  var datemask  = dateversion == "mdy"? "mm/dd/yyyy": "yyyy-mm-dd";
  curDate       = new Date();
  goodDateDay   = "";
  goodDateMonth = "";
  goodDateYear  = "";
  state         = 0;
  resetDate     = false;
  testDate      = xjsREPLACE(inputDate) ;  //remove spaces..
	testDate      = testDate.toLowerCase();
	if ( testDate.length == 0 ) {
		return "";
	}
  var goodDateNums = true;
	var sDateFormat = "";
	var rDash       = /-/;
  if (hideAlert == null) hideAlert = false;
	if ( testDate == 'today' ) {
		goodDateYear  = curDate.getFullYear() + "";
		goodDateMonth = (curDate.getMonth() + 1) + "";
  	goodDateDay   = curDate.getDate() + "";
		testDate      = goodDateMonth + "/" + goodDateDay + "/" + goodDateYear;
	}
	if ( testDate.search(rDash) > 0 ) {
		/*yyyy-mm-dd format*/
		sDateFormat   = "ymd";
    goodDateNums  = isNumber(testDate, "-");

	} else {
		/*mm/dd/yyyy format*/
		sDateFormat   = "mdy";
    testDate      = xjsREPLACE(testDate, ".", "/") ; //allow various separators:
    testDate      = xjsREPLACE(testDate, ",", "/") ;
    goodDateNums  = isNumber(testDate, "/");
	}
  var outputDate    = "";
  var outMsg    = "";

  if (inputDate.length == 0) {
    goodDateNums = false;
    outMsg = testDate + " is too short. It must be in the format: " + datemask ;
  }
	else if (inputDate.length > 10) {
    goodDateNums = false;
    outMsg = testDate + " is too long. It must be in the format: " + datemask ;
	}
  else if (goodDateNums == false) {
    outMsg = testDate + " contains invalid characters. It must be in the format: " + datemask ;
  }
  else { //goodDateNums = true
		var sTempStr = testDate;
		if (sDateFormat  == "mdy") { /*mm/dd/yyyy*/
			if ( sTempStr.search("/") > 0 ) {
				goodDateMonth  = sTempStr.substr(0, sTempStr.search("/"));
				sTempStr       = sTempStr.substr(sTempStr.search("/") + 1, sTempStr.length);
				if ( sTempStr.search("/") > 0 ) {
					goodDateDay  = sTempStr.substr(0, sTempStr.search("/"));
					sTempStr     = sTempStr.substr(sTempStr.search("/") + 1, sTempStr.length);
				} else {
  				goodDateDay  = curDate.getDate() + "";
				} //day
				if ( sTempStr.length > 0 ) {
					goodDateYear = sTempStr;
				} else {
					goodDateYear = curDate.getFullYear() + "";
				} //year
			} else {
				goodDateYear   =  sTempStr // curDate.getFullYear() + "";
				goodDateMonth  = (curDate.getMonth() + 1) + "";
  			goodDateDay    = curDate.getDate() + "";
        resetDate      = true;
			} //no date
		} else { /*ymd - yyyy-mm-dd*/
			goodDateYear     = sTempStr.substr(0, sTempStr.search(/-/) );
			sTempStr         = sTempStr.substr(sTempStr.search(/-/) + 1, sTempStr.length);
			if ( sTempStr.search(/-/) > 0) {
				goodDateMonth  = sTempStr.substr(0, sTempStr.search(/-/) );
				sTempStr       = sTempStr.substr(sTempStr.search(/-/) + 1, sTempStr.length);
			} else {
				goodDateMonth  = (curDate.getMonth() + 1) + "";
			} //month
			if ( sTempStr.length > 0) {
				goodDateDay    = sTempStr;
			} else {
  			goodDateDay    = curDate.getDate() + "";
			} //day
		} //ymd
    if (goodDateYear.length > 4) {
      goodDateYear = goodDateYear.substr(1, 4);
    }
    else if (goodDateYear.length == 3) {
      if (parseInt(goodDateYear) >= 900)
        goodDateYear = "1"  + goodDateYear;
      else
        goodDateYear = "2"  + goodDateYear;
    }
    else if (goodDateYear.length == 0) {
      var tmpDate  = new Date();
      goodDateYear = tmpDate.getFullYear() + "";
    }
    else if (goodDateYear.length < 3) {
			var sFYear  = curDate.getFullYear() + "";
			var sYrStub = "1" + sFYear.substr(2, 2);
			var nYrTest = sYrStub - 50;
			//resetDate   = true;
      if (goodDateYear.length == 1)
        goodDateYear = "0" + goodDateYear;
			if ( parseInt(goodDateYear) > nYrTest)
        goodDateYear = "19" + goodDateYear;
      else
        goodDateYear = "20" + goodDateYear;
      }
    if (goodDateMonth == "") {
      goodDateMonth = "" + (curDate.getMonth() + 1);
      resetDate     = true;
    }
    else if (goodDateMonth < 1) {
      goodDateMonth = "01";
      resetDate     = true;
    }
    else if (goodDateMonth > 12) {
      goodDateMonth = "12";
      resetDate     = true;
    }
    if (goodDateDay == "") {
      goodDateDay = "" + curDate.getDate();
      resetDate   = true;
    }
    else if (goodDateDay < 1) {
      goodDateDay = "01";
      resetDate   = true;
    }
    else if (goodDateMonth == 2 && (goodDateYear % 4) == 0 && goodDateDay >= 29) {
      goodDateDay = "29";
      resetDate   = true;
    }
    else if (goodDateDay > days[goodDateMonth-1]) {
      goodDateDay = "" + days[goodDateMonth-1];
      resetDate   = true;
    }
    if (isNaN(goodDateYear))
      goodDateYear = curDate.getYear();
    if (goodDateDay.length == 1)  goodDateDay   = "0" + goodDateDay;
    if (goodDateMonth.length== 1) goodDateMonth = "0" + goodDateMonth;
    if (dateversion == "mdy") {
			outputDate       = goodDateMonth + "/" + goodDateDay + "/" + goodDateYear;
    } else {
			outputDate       = goodDateYear + "-" + goodDateMonth + "-" + goodDateDay;
		}		
    //oField.value = outputDate;
    if (inputDate == outputDate) resetDate = false ;  //07/19/00 - added inputDate/outputDate check
    if (resetDate == true) {
      outMsg = "has been reset from [" + inputDate + "] to [" + outputDate + "].";
    }
  }  //goodDate = true
  if (goodDateNums == false || resetDate == true) {
    outMsg = "- The date field " + oField.id + " " + outMsg ;
    if (hideAlert == true) {
      if (goodDateNums == false)
        var fixtype = "correct";
      else var fixtype = "confirm";
      outMsg += "  You must " + fixtype + " this date before saving.";
    }
    else {
      outMsg = "WARNING:\n" + outMsg ;
      //window.alert(outMsg);
    }
	}
return outputDate + "|" + outMsg;
} //buildGoodDate

function compareDates(inDate1, inDate2, inOperator) {
  var testDate1 = new Date(inDate1);
  var testDate2 = new Date(inDate2);
  var logRetVal = true;
  switch (inOperator) {
    case "=":  {
      logRetVal = (testDate1 == testDate2);
    break;     } //=
  case ">":  {
      logRetVal = (testDate1  > testDate2);
    break;     } //>
  case "<":  {
      logRetVal = (testDate1  < testDate2);
    break;     } //<
  case ("!=" || "<>") : {
      logRetVal = (testDate1 != testDate2);
    break;     } //!=
    case ">=": {
      logRetVal = (testDate1 >= testDate2);
  break;     } //>=
    case "<=": {
      logRetVal = (testDate1 <= testDate2);
    break;     } //<=
  default:
    window.alert("DEVELOPER'S ALERT\nThe Operator you passed to compareDates (" +
    	inOperator + ") is not valid and cannot be tested.  The function will return TRUE");
  break;     // default
  } //switch
  return logRetVal;
} //END: compareDates()

/* Add,subtract days to the input date string - return date as text string. */
function jfDateBump(xDate,xBy) {
    var xDi = new Date(xDate) ;
    var xM = Date.parse(xDi) ;
    xM = xM + (xBy * 60 * 60 * 24 * 1000) ;  //millisecs ...
    return buildCharDate(xM) ;
}  /* END: jfDateBump() */

function xjsREPLACE(xs,os,ns)  {
  if (os) {var xo = os} else {var xo = " "}  //space default
  if (ns) {var xn = ns} else {var xn = ""}   //empty default
  /* note:30nov99: indexOf() NOT search() .. don't use regExp..so can replace . and other stuff */
    while (xs.indexOf(xo) !== -1) { xs = xs.replace(xo,xn) }
    return xs ;
}
