
// DEFINE VARIABLES

// This script checks and unchecks boxes on a form
// Checks and unchecks unlimited number in the group...
// Pass the Checkbox group name and call buttons as so:
//checkAll(document.[Name of Form].[Name of Checkboxes List])"
//uncheckAll(document.[Name of Form].[Name of Checkboxes List])"
//
function GetDocumentObject(oDoc, sObjName) {

	if (oDoc.all)
		return(oDoc.all(sObjName));
	else
		if (oDoc.getElementById)
			return(oDoc.getElementById(sObjName));
	
}

function isValidYear(tTxt, sName)
{
	if (!isValidDate('01/01/' + tTxt.value))
	{
		alert(sName + ' is invalid.');
		tTxt.focus();
		tTxt.select();
		return false;
	}
    return true;
}


function checkAll(field, bOn)
{
for (i = 0; i < field.length; i++)
	field[i].checked = bOn ;
}

// whitespace characters
var whitespace = " \t\n\r";
var MAX_LONG_INT = 2147483647;

function valTextStrMin(bReq, tTxt, sName, nMinLen, nMaxLen)
{
	var bRet = true;
	var sVal = RTrim(String(tTxt.value));
	tTxt.value = sVal;
	
	if ((bReq) && (sVal == "")) {
		bRet = false;
		alert(sName + " is a required field.");
	}
	
	if ((bRet) && (sVal.length >= nMaxLen) || (sVal.length < nMinLen)) {
		bRet = false;
		alert(sName + " must be between " + String(nMinLen) + " and " + String(nMaxLen) + " characters in length.");
	}
	
	if (!bRet) {
		tTxt.focus();
		tTxt.select();
	}

	return(bRet);
}

function valTextEmail(tTxt, sName)
{
	if (!valTextStr(true, tTxt, sName, 255))
		return false;

	if (!isEmail(tTxt.value))
	{
		alert(sName + ' is not valid.');
		tTxt.focus();
		tTxt.select();
		return false;
	}
	return true;
}
function valTextStr(bReq, tTxt, sName, nMaxLen) {

	var bRet = true;
	var sVal = RTrim(String(tTxt.value));
	tTxt.value = sVal;
	
	if ((bReq) && (sVal == "")) {
		bRet = false;
		alert(sName + " is a required field.");
	}
	
	if ((bRet) && (sVal.length > nMaxLen)) {
		bRet = false;
		alert(sName + " cannot exceed " + String(nMaxLen) + " characters in length.");
	}
	
	if (!bRet) {
		tTxt.focus();
		tTxt.select();
	}

	return(bRet);
}

function valTextNum(bReq, bBlToZero, tTxt, sName) {

	var bRet = true;
	var sVal = RTrim(String(tTxt.value));

	if ((bBlToZero) && (sVal == ""))
		sVal = "0";

	tTxt.value = sVal;
	
	if ((sVal == "") && (bReq)) {
		alert(sName + " is a required field.");
		bRet = false;
	}
	
	if ((bRet) && (isNaN(Math.abs(sVal)))) {
		alert(sName + " must be a numeric value.");
		bRet = false;
	}
	
	if (!bRet) {
		tTxt.focus();
		tTxt.select();
	}
		
	return(bRet);
	
}

function valTextNumRange(bReq, tTxt, sName, nMin, nMax) {

	var bRet = valTextNum(bReq, true, tTxt, sName);
	
	if (bRet) {
		var nVal = Number(RTrim(String(tTxt.value)));
		if ((nVal > nMax) || (nVal < nMin)) {
			alert(sName + " must be a value between " + String(nMin) + " and " + String(nMax) + ".");
			tTxt.focus();
			tTxt.select();
			bRet = false;
		}
	}
	
	return(bRet);
}

function valTextDt(bReq, tTxt, sName) {
	var bRet = true;
	
	var sVal = RTrim(String(tTxt.value));
	
	if ((bReq) && (sVal == "")) {
		bRet = false;
		alert(sName + " is a required field.");
	}
	
	if ((bRet) && (sVal != "") && (!isValidDate(sVal))) {
		bRet = false;
		alert(sName + " is not a valid date.");
	}

	if (!bRet) {
		tTxt.focus();
		tTxt.select();
	}
		
	return(bRet);
}

function StringReplace(sVal, sFind, sReplace) {
	var nFLen = sFind.length;
	var nRLen = sReplace.length;
	var nPos = sVal.indexOf(sFind, 0);
	while (nPos > -1) {
		sVal = sVal.substr(0, nPos) + sReplace + sVal.substr(nPos + nFLen);
		nPos = sVal.indexOf(sFind, nPos + nRLen);
	}
	return(sVal);
}

function XML_unencode(sVal) {
    sVal = StringReplace(sVal, '&gt;', '>');
    sVal = StringReplace(sVal, '&lt;', '<');
    sVal = StringReplace(sVal, '&quot;', '"');
    sVal = StringReplace(sVal, '&amp;', '&');
    return(sVal);
}

function XML_encode(sVal) {
    sVal = StringReplace(sVal, '&', '&amp;');
    sVal = StringReplace(sVal, '"', '&quot;');
    sVal = StringReplace(sVal, '<', '&lt;');
    sVal = StringReplace(sVal, '>', '&gt;');
    return(sVal);
}

function custom_escape(sVal) {
	sVal = escape(sVal);
	var iPos = sVal.indexOf("+", 0);
	while (iPos > -1) {
		sVal = sVal.substr(0, iPos) + "%2B" + sVal.substr(iPos + 1);
		iPos = sVal.indexOf("+", iPos + 3);
	}
	return(sVal);
}

function isValidDate(dateStr) {
    // dateStr must be of format month day year with either slashes
    // or dashes separating the parts. Some minor changes would have
    // to be made to use day month year or another format.
    // This function returns True if the date is valid.
    var slash1 = dateStr.indexOf("/");
    if (slash1 == -1) { slash1 = dateStr.indexOf("-"); }
    // if no slashes or dashes, invalid date
    if (slash1 == -1) { return false; }
    var dateMonth = dateStr.substring(0, slash1)
    var dateMonthAndYear = dateStr.substring(slash1+1, dateStr.length);
    var slash2 = dateMonthAndYear.indexOf("/");
    if (slash2 == -1) { slash2 = dateMonthAndYear.indexOf("-"); }
    // if not a second slash or dash, invalid date
    if (slash2 == -1) { return false; }
    var dateDay = dateMonthAndYear.substring(0, slash2);
    var dateYear = dateMonthAndYear.substring(slash2+1, dateMonthAndYear.length);
    if ( (dateMonth == "") || (dateDay == "") || (dateYear == "") ) { return false; }
    // if any non-digits in the month, invalid date
    for (var x=0; x < dateMonth.length; x++) {
        var digit = dateMonth.substring(x, x+1);
        if ((digit < "0") || (digit > "9")) { return false; }
    }
    // convert the text month to a number
    var numMonth = 0;
    for (var x=0; x < dateMonth.length; x++) {
        digit = dateMonth.substring(x, x+1);
        numMonth *= 10;
        numMonth += parseInt(digit);
    }
    if ((numMonth <= 0) || (numMonth > 12)) { return false; }
    // if any non-digits in the day, invalid date
    for (var x=0; x < dateDay.length; x++) {
        digit = dateDay.substring(x, x+1);
        if ((digit < "0") || (digit > "9")) { return false; }
    }
    // convert the text day to a number
    var numDay = 0;
    for (var x=0; x < dateDay.length; x++) {
        digit = dateDay.substring(x, x+1);
        numDay *= 10;
        numDay += parseInt(digit);
    }
    if ((numDay <= 0) || (numDay > 31)) { return false; }
    // February can't be greater than 29 (leap year calculation comes later)
    if ((numMonth == 2) && (numDay > 29)) { return false; }
    // check for months with only 30 days
    if ((numMonth == 4) || (numMonth == 6) || (numMonth == 9) || (numMonth == 11)) { 
        if (numDay > 30) { return false; } 
    }
    // if any non-digits in the year, invalid date
    for (var x=0; x < dateYear.length; x++) {
        digit = dateYear.substring(x, x+1);
        if ((digit < "0") || (digit > "9")) { return false; }
    }
    // convert the text year to a number
    var numYear = 0;
    for (var x=0; x < dateYear.length; x++) {
        digit = dateYear.substring(x, x+1);
        numYear *= 10;
        numYear += parseInt(digit);
    }
    // Year must be a 2-digit year or a 4-digit year
    if ( (dateYear.length != 2) && (dateYear.length != 4) ) { return false; }
    // if 2-digit year, use 50 as a pivot date
    if ( (numYear < 50) && (dateYear.length == 2) ) { numYear += 2000; }
    if ( (numYear < 100) && (dateYear.length == 2) ) { numYear += 1900; }
    if ((numYear <= 0) || (numYear > 9999)) { return false; }
    // check for leap year if the month and day is Feb 29
    if ((numMonth == 2) && (numDay == 29)) {
        var div4 = numYear % 4;
        var div100 = numYear % 100;
        var div400 = numYear % 400;
        // if not divisible by 4, then not a leap year so Feb 29 is invalid
        if (div4 != 0) { return false; }
        // at this point, year is divisible by 4. So if year is divisible by
        // 100 and not 400, then it's not a leap year so Feb 29 is invalid
        if ((div100 == 0) && (div400 != 0)) { return false; }
    }
    // date is valid
    return true;
}

// isEmail (STRING s [, BOOLEAN emptyOK])
// 
// Email address must be of form a@b.c ... in other words:
// * there must be at least one character before the @
// * there must be at least one character before and after the .
// * the characters @ and . are both required
//
// For explanation of optional argument emptyOK,
// see comments of function isInteger.

function isEmail (s)
{
	/*
   if (isEmpty(s)) 
       if (isEmail.arguments.length == 1) return defaultEmptyOK;
       else return (isEmail.arguments[1] == true);
   */
   
    // is s whitespace?
    //if (isWhitespace(s)) return false;
    
    // there must be >= 1 character before @, so we
    // start looking at character position 1 
    // (i.e. second character)
    var i = 1;
    var sLength = s.length;

    // look for @
    while ((i < sLength) && (s.charAt(i) != "@"))
    { i++
    }

    if ((i >= sLength) || (s.charAt(i) != "@")) return false;
    else i += 2;

    // look for .
    while ((i < sLength) && (s.charAt(i) != "."))
    { i++
    }

    // there must be at least one character after the .
    if ((i >= sLength - 1) || (s.charAt(i) != ".")) return false;
    else return true;
}

/****************************************************************/

// Right trims the string...  Useful for SQL datatypes of CHAR

function RTrim(str)
{
	var c;

	for (var i = str.length - 1; i >= 0 ; i -= 1) {
		c = str.charAt(i);
		if (whitespace.indexOf(c) == -1)
			break;
	}

	return str.substring(0, i + 1);
}

/****************************************************************/

// Left trims the string...

function LTrim(strTrim)
{
	var str = new String(strTrim);
	var i = 0;
	var c = "";
	var startpos = 0

	for (i = 0; i <= str.length && startpos == 0; i = i + 1) {
		c = str.charAt(i);
		if (whitespace.indexOf(c) == -1)
			startpos = i;
	}

	return str.substring(startpos - 1, str.length - startpos + 1);
}

function KeepChecked(chk) {
	if ((chk.checked == false) && (chk.value == 1)) {
		chk.checked = true;
	}
}

function ValidateDateRange(txtF, txtT, bReq) {

		var sF = RTrim(String(txtF.value));
		if ((sF=='') && (bReq)) {
			alert('The start date is missing.');
			txtF.focus();
			txtF.select();
			return(false);
		}
		var sT = RTrim(String(txtT.value));
		if ((sT=='') && (bReq)) {
			alert('The end date is missing.');
			txtT.focus();
			txtT.select();
			return(false);
		}	
		if ((sF != "") && (!(isValidDate(sF)))) {
			alert('The start date is invalid.');
			txtF.focus();
			txtF.select();
			return(false);
		}
		if ((sT != "") && (!(isValidDate(sT)))) {
			alert('The end date is invalid.');
			txtT.focus();
			txtT.select();
			return(false);
		}
		if ((sF != "") && (sT != "")) {
			var dtF=new Date(sF);
			var dtT=new Date(sT);
			if (dtT < dtF) {
				alert('The date range you entered is invalid.');
				txtT.focus();
				txtT.select();
				return(false);
			}
		}
		return(true);
}

function PopUpWindow(sURL, nW, nH, sName) {

  var winl = (screen.width - nW)/2;
  var wint = (screen.height - nH)/2;
  var sAttr  = 'height='+nH+',width='+nW+',top='+wint+',left='+winl+',scrollbars=yes,resizable=yes,status=yes';
  return window.open(sURL,sName,sAttr);
}

function LstLookup(lst, sVal, sDefVal) {

	var bFnd = false;
	
	for (var i = 0; i < lst.length; i++) {
		if (lst.options[i].value == sVal) {
			lst.selectedIndex = i;
			bFnd = true;
			break;
		}
	}
	
	if (!bFnd) {
		for (i = 0; i < lst.length; i++) {
			if (lst.options[i].value == sDefVal) {
				lst.selectedIndex = i;
				break;
			}
		}
	}

}
