/* In Use By: */

/* validation.js
MAIN VALIDATION FUNCTIONS ARE AT THE BOTTOM OF THIS PAGE,
in order to incorporate the functions written within this page.

global variable--reference to input field and owning frame
being validated when validate() is called*/
var gField
var gForm
var gFrame
var gLabel	/*field name to be referred to in alert*/

/*		onChange PROBLEMS
		alert('Tell what went wrong!')
		window.gFrame.event.cancelBubble=true; 	//try this for ie5
		window.gFrame.event.returnValue = false; //this puts focus on location bar; IE 5 doesnt respond to return false
		gFrame.event.cancelBubble = true; // this does nothing because onChange event doesn't bubble
		gField.focus();			//works in IE 4 and Netscape 4
		gField.select();		//in IE 4 this fails to select
		return false;		    //in IE5 this fails to stop onChange from moving focus to next
*/

/**************************************************/
/**************************
Begin utility validation and support routines
***************************/
//strip hyphens
function striphyphens(inputStr)
{
	var marker
	while (inputStr.indexOf("-") != -1)
	{
		marker = inputStr.indexOf("-")
		inputStr = inputStr.substring(0,marker) + inputStr.substring(marker+1,inputStr.length)
	}
	return inputStr
}


//strip phone number entry slashes and parentheses
function stripslashparens(inputStr)
{
	var marker
	while (inputStr.indexOf("/") != -1)
	{
		marker = inputStr.indexOf("/")
		inputStr = inputStr.substring(0,marker) + inputStr.substring(marker+1,inputStr.length)
	}
	while (inputStr.indexOf("(") != -1)
	{
		marker = inputStr.indexOf("(")
		inputStr = inputStr.substring(0,marker) + inputStr.substring(marker+1,inputStr.length)
	}
	while (inputStr.indexOf(")") != -1)
	{
		marker = inputStr.indexOf(")")
		inputStr = inputStr.substring(0,marker) + inputStr.substring(marker+1,inputStr.length)
	}
	while (inputStr.indexOf(" ") != -1)
	{
		marker = inputStr.indexOf(" ")
		inputStr = inputStr.substring(0,marker) + inputStr.substring(marker+1,inputStr.length)
	}
	return inputStr
}

function stripzeros(inputStr)
{
	var result = inputStr
	while (result.substring(0,1) == "0")
	{
		result = result.substring(1,result.length)
	}
	return result
}

//insert hyphens into phone number
function restorephonehyphens(inputStr)
{
	var beg = inputStr.substring(0,3);
	var mid = inputStr.substring(3,6);;
	var end = inputStr.substring(6,10)
	return (beg + "-" + mid + "-" + end)
}

//insert hyphens into phone number without area code
function restorephonehyphensshort(inputStr)
{
	var beg = inputStr.substring(0,3);;
	var mid = inputStr.substring(3,7)
	return (beg + "-" + mid)
}

/**************************************************/

//input field is not empty
function isnotempty()
{
	if (gField.value =="" || gField.value==null)
	{
		//alert("The " + gLabel + " cannot be left empty.");
		alert("Please include a value in the " + gLabel + " field.")
		gField.focus();
		gField.select();	
		return
	}
	else
	{
		/* remove blank spaces and see if anything is there*/
		temp = ""
		inputStr = gField.value
		for (var i = 0; i < inputStr.length; i++)
		{
			var oneChar = inputStr.charAt(i)
			if (oneChar != " ")
			{
				temp += oneChar
			}
		}
		if (temp == "")
		{
			alert("The " + gLabel + " cannot be left empty.");
			gField.focus();
			gField.select();	
			return		
		}		
	}
	return true
}

function isselected()
{
	if (gField.selectedIndex == 0)
	{
		alert("Please make a choice from the " + gLabel + " dropdown list.");
		gField.focus();
		return	
	}
	return true
}

//input value is a positive integer of any length
function ispositiveinteger()
{
	var inputStr = gField.value
	if (inputStr.length == 0)
	{
		return true;
	}
	for (var i = 0; i < inputStr.length; i++)
	{
		var oneChar = inputStr.charAt(i)
		if (oneChar < "0" || oneChar>"9")
		{
			alert("The " + gLabel + " must be a number greater than zero (no letters or punctuation are allowed).");
			gField.focus();
			gField.select();	
			return;
		}
	}
	if (gField.value==0)
	{
		alert("The " + gLabel + " must be a number greater than zero (no letters or punctuation are allowed).");
		gField.focus();
		gField.select();	
		return;
	}
	return true;
}
//input value is an integer of any length 0 through 9
function iszeroorabove()
{
	var inputStr = gField.value
	if (inputStr.length == 0)
	{
		return true;
	}
	for (var i = 0; i < inputStr.length; i++)
	{
		var oneChar = inputStr.charAt(i)
		if (oneChar < "0" || oneChar>"9")
		{
			alert("The " + gLabel + " must be a number zero or above (no letters or punctuation are allowed).");
			gField.focus();
			gField.select();	
			return;
		}
	}
	return true;
}

/* validates string for at least one embedded @ and at least one dot as standard email address */
function isemailaddress()
{
	var inputStr = gField.value
	var fieldlength = inputStr.length;
	if (fieldlength == 0)
	{
		return true;
	}
	var hasDot = 0;
	var hasAtSign = 0;
	var hasCommaOrSpace = 0;
	if (inputStr.indexOf(".") > 0  && inputStr.lastIndexOf(".") <= fieldlength - 3 && inputStr.indexOf("..") == -1)  //"." can't be first or last and can't be doubled"
	{
		hasDot = 1;
	}
	if (inputStr.indexOf("@") > 0  && inputStr.lastIndexOf("@") <= fieldlength - 3 && inputStr.indexOf("@.") == -1) //@ can't be first or last or second last or next to "."
	{
		hasAtSign = 1;
	}
	if (inputStr.indexOf(",") > -1 || inputStr.indexOf(" ") > -1) // commas, spaces disallowed)
	{
		hasCommaOrSpace = 1;
	}
	if (hasDot == 0 || hasAtSign == 0 || hasCommaOrSpace == 1)
	{
		giveAlert(parrErrMsg["invalidemail"]);
		gField.focus();
		return false;
	}
	//enforce one dot after the @ sign
	var afterAt = inputStr.substring(inputStr.indexOf("@") + 1,inputStr.length)
	if (afterAt.indexOf(".") == -1 || afterAt.indexOf("@") > -1)  //at least one dot after "@" and no second "@"
	{
		giveAlert(parrErrMsg["invalidemail"]);
		gField.focus();
		return false;
	}
	return true;
}

function ischr0thruz()
{
	var inputStr = gField.value
	if (inputStr.length == 0)
	{
		return true
	}
	for (var i = 0; i < inputStr.length; i++)
	{
		var oneChar = inputStr.charAt(i)
		oneChar = oneChar.toUpperCase()
		if ((oneChar < "0" || oneChar > "9") && (oneChar < "A" || oneChar > "Z"))
		{
			alert("The " + gLabel + " must be a number or a letter.");
			gField.focus();
			gField.select();	
			return
		}
	}
	return true
}

/*input value is 2 characters*/
function is2chr()
{
	var inputStr = gField.value
	if (inputStr.length < 2)
	{
		alert("The " + gLabel + " must be 2 characters.");
		gField.focus();
		gField.select();	
		return
	}
	//	inputStr.toUpperCase()
	//	return inputStr
	return true
}

//checks date
function isdate()
{
	var inputStr = gField.value
	if (inputStr.length==0) return true
	//convert hyphen delimiters to slashes
		while (inputStr.indexOf("-") != -1)
		{
			inputStr = replacestring(inputStr,"-","/")
		}
		var delim1 = inputStr.indexOf("/")
		var delim2 = inputStr.lastIndexOf("/")
		if (delim1 != -1 && delim1 == delim2)//there is only one delilmeter in the string
		{
			alert ("The date entry is not in an acceptable format.\n\nYou can enter dates in the following formats: mmddyyyy, mm/dd/yyyy, or mm-dd-yyyy.")
			gField.focus();
			gField.select();
			return false;
		}
		if (inputStr.length == 10 && delim1 == -1)
		{
			alert ("The date entry is not in an acceptable format.\n\nYou can enter dates in the following formats: mmddyyyy, mm/dd/yyyy, or mm-dd-yyyy.")
			gField.focus();
			gField.select();
			return false;
		}
		if (delim1 != -1)
		{
			//there are delimiters; extract component values
			var mm = parseInt(inputStr.substring(0,delim1),10)
			var dd = parseInt(inputStr.substring(delim1 + 1,delim2),10)
			var yyyy = parseInt(inputStr.substring(delim2 + 1,inputStr.length),10)
		}
		else
		{
			var mm = parseInt(inputStr.substring(0,2),10)
			var dd = parseInt(inputStr.substring(2,4),10)
			var yyyy = parseInt(inputStr.substring(4,inputStr.length),10)
		}
		if (isNaN(mm) || isNaN(dd) || isNaN(yyyy))
		{
			//there is a non-numeric character in one of the component values
			alert ("The date entry is not in an acceptable format.\n\nYou can enter dates in the following formats: mmddyyyy, mm/dd/yyyy, or mm-dd-yyyy.")
			gField.focus();
			gField.select();
			return false;
		}
		if (mm < 1 || mm > 12) 
		{
			//month value is not 1 thru 12
			alert("Months must be entered between the range of 01 (January) and 12 (December).")
			gField.focus();
			gField.select();
			return false;
		}
		if (dd < 1 || dd > 31)
		{
			alert("Days must be entered between the range of 01 and a maximum of 31 (depending on the month and year).")
			gField.focus();
			gField.select();
			return false;
		}
		if (yyyy < 100)
		{
			//entered value is two digits, which we allow for 
			if (yyyy >= 50) 
			{
				yyyy += 1900
			}
			else
			{
				yyyy += 2000
			}
		}
		if (yyyy > 100 && yyyy < 1000)
		{
			alert ("The date entry is not in an acceptable format.\n\nYou can enter dates in the following formats: mmddyyyy, mm/dd/yyyy, or mm-dd-yyyy.")
			gField.focus();
			gField.select();
			return false;
		}
		if (yyyy > 9999)
		{
			alert ("The date entry is not in an acceptable format.\n\nYou can enter dates in the following formats: mmddyyyy, mm/dd/yyyy, or mm-dd-yyyy.")
			gField.focus();
			gField.select();
			return false;
		}
		if (yyyy < 1900)//sql does not allow dates before 1753
		{
			alert ("Please enter a date that is later than 1900.")
			gField.focus();
			gField.select();
			return false;
		}
		if (!checkmonthlength(mm,dd))
		{
			gField.focus();
			gField.select();
			return false;
		}
		if (mm == 2)
		{
			if (!checkleapmonth(mm,dd,yyyy))
			{
			gField.focus();
			gField.select();
			return false;
		}
	}
	gField.value = monthdayformat(mm) + "/" + monthdayformat(dd) + "/" + yyyy;
	return true;
}

function isdate_OLD()
{
	var inputStr = gField.value
	if (inputStr.length==0)
	{
		return true
	}
	//convert hyphen delimiters to slashes
	while (inputStr.indexOf("-") != -1)
	{
		inputStr = replacestring(inputStr,"-","/")
	}
	
	var delim1 = inputStr.indexOf("/")
	var delim2 = inputStr.lastIndexOf("/")
	
	if (delim1 != -1 && delim1 == delim2)//there is only one delilmeter in the string
	{
		alert ("The " + gLabel + " entry is not in an acceptable format.\n\nPlease use these formats: mm/dd/yy or mm-dd-yy.");
		gField.focus();
		gField.select();	
		return
	}
	if (delim1 != -1)
	{
		//there are delimiters; extract component values
		var mm = parseInt(inputStr.substring(0,delim1),10);
		var dd = parseInt(inputStr.substring(delim1 + 1,delim2),10);
		var yyyy = parseInt(inputStr.substring(delim2 + 1,inputStr.length),10);
	}
	if (isNaN(mm) || isNaN(dd) || isNaN(yyyy))
	{
		//there is a non-numeric character in one of the component values
		alert ("The " + gLabel + " entry is not in an acceptable format.\n\nPlease use these formats: mm/dd/yy or mm-dd-yy.");
		gField.focus();
		gField.select();	
		return
	}
	if (isNaN(inputStr.substring(0,delim1)) || isNaN(inputStr.substring(delim1 + 1,delim2)) || isNaN(inputStr.substring(delim2 + 1,inputStr.length)))
	{
		//there is a non-numeric character in one of the component values
		alert ("The " + gLabel + " entry is not in an acceptable format.\n\nPlease use these formats: mm/dd/yy or mm-dd-yy.");
		gField.focus();
		gField.select();	
		return;
	}
	if (mm < 1 || mm > 12) 
	{
		//month value is not 1 thru 12
		alert("Month entered must be between 01 (January) and 12 (December).");
		gField.focus();
		gField.select();	
		return
	}
	if (dd < 1 || dd > 31)
	{
		alert("Day entered must be between 01 and 28,29,30 or 31 (depending on the month and year).");
		gField.focus();
		gField.select();	
		return
	}
	if (yyyy < 100)
	{
		//entered value is two digits, which we allow for 
		if (yyyy >= 50) 
		{
			yyyy += 1900
		}
		else
		{
			yyyy += 2000
		}
	}
	if (yyyy > 100 && yyyy < 1000)
	{
		alert ("Please enter a date that is later than 1900.");
		gField.focus();
		gField.select();	
		return
	}
	if (yyyy > 9999)
	{
		alert ("Please enter a date that is earlier than 9999.");
		gField.focus();
		gField.select();	
		return
	}
	if (yyyy < 1900)//sql does not allow dates before 1753
	{
		alert ("Please enter a date that is later than 1900.");
		gField.focus();
		gField.select();	
		return
	}
	if (!checkmonthlength(mm,dd))
	{
		gField.focus();
		gField.select();	
		return
	}
	if (mm == 2)
	{
		if (!checkleapmonth(mm,dd,yyyy))
		{
			gField.focus();
			gField.select();	
			return
		}
	}
	gField.value = monthdayformat(mm) + "/" + monthdayformat(dd) + "/" + yyyy
	return true
}

//checks for mm/yy format
function isMonthYear()
{
	var inputStr = gField.value
	if (inputStr.length==0)
	{
		return true;
	}
	//convert hyphen delimiters to slashes
	while (inputStr.indexOf("-") != -1)
	{
		inputStr = replacestring(inputStr,"-","/")
	}
	var delim = inputStr.indexOf("/")
	if (delim != -1)
	{
		//there are delimiters; extract component values
		var mm = parseInt(inputStr.substring(0,delim),10);
		var yy = parseInt(inputStr.substring(delim + 1,inputStr.length),10);
	}
	else
	{
		//add the slash if 4 digit number entered (mmyy)
		if (!isNaN(inputStr) && inputStr.length==4)
		{
			var mm = inputStr.substring(0,2)
			var yy = inputStr.substring(2,4);
			inputStr = mm + "/" + yy;
			delim = inputStr.indexOf("/")
		}
	}
	if (isNaN(mm) || isNaN(yy))
	{
		//there is a non-numeric character in one of the component values
		alert ("The " + gLabel + " entry is not in an acceptable format.\n\nPlease use these formats: mm/yy or mm-yy.");
		gField.focus();
		gField.select();	
		return
	}
	if (isNaN(inputStr.substring(0,delim)) || isNaN(inputStr.substring(delim + 1,inputStr.length)))
	{
		//there is a non-numeric character in one of the component values
		alert ("The " + gLabel + " entry is not in an acceptable format.\n\nPlease use these formats: mm/yy or mm-yy.");
		gField.focus();
		gField.select();	
		return;
	}
	if (mm < 1 || mm > 12) 
	{
		//month value is not 1 thru 12
		alert("Month entered must be between 01 (January) and 12 (December).");
		gField.focus();
		gField.select();	
		return
	}
	sYY = "" + yy + "";
	//make it a string and add back the leading zero if necessary
	if (sYY.length == 1)
	{
		yy = "0" + sYY;
	}
	else
	{
		yy = sYY;
	}
	if (yy.length != 2)
	{
		alert("Year must be entered as two numbers.");
		gField.focus();
		gField.select();
		return
	}
	
	gField.value = mm + "/" + yy
	return true;
}

function notpastdate()
/* checks a date that has already passed isdate
	, and therefore is already in mm/dd/yyyy format
	, to see if it is greater than yesterday */
{
	var datefield = new Date(gField.value);
	var datefieldInMS = datefield.getTime(); /* milliseconds since 1970 */
	var now = new Date(); /* 12:00 am today */
//	alert(datefield);
//	alert(now);
	var nowInMS = now.getTime();
	var yesterdayInMS = nowInMS - (60 * 60 * 24 * 1000); /*   */
	if (datefieldInMS < yesterdayInMS)
	{
		alert("The " + gLabel +" may not be in the past.");
		gField.focus();
		gField.select();	
		return;
	}
	else if ((datefieldInMS < nowInMS) && (gLabel == "Requested Due Date"))
	{
		if (!confirm("Your " + gLabel + " is today and may need\n\nto be negotiated with your Pacific Bell Representative."))
		{
			gField.focus();
			gField.select();	
			return;
		}
	}

	return true;
}

function notfuturedate()
/* checks a date that has already passed isdate
	, and therefore is already in mm/dd/yyyy format
	, to see if it is less than tomorrow */
{
	var datefield = new Date(gField.value);
	var datefieldInMS = datefield.getTime(); /* milliseconds since 1970 */
	var now = new Date(); /* 12:00 am today */
//	alert(datefield);
//	alert(now);
	var nowInMS = now.getTime();
	var tomorrowInMS = nowInMS + (60 * 60 * 24 * 1000); /*   */
//alert(nowInMS);
//alert(tomorrowInMS);
//alert(datefieldInMS);
	if (datefieldInMS > nowInMS)
	{
		alert("The " + gLabel +" cannot be in the future.  Please re-enter.");
		gField.focus();
		gField.select();	
		return;
	}
	return true;
}


function is2alphas()
//used for state code verification
//checks for 2 alpha characters, and converts to Upper Case
{
	var inputStr = gField.value
	inputStr = inputStr.toUpperCase()
	if (inputStr.length == 0) return true
	for (var i = 0; i < inputStr.length; i++)
	{
		var oneChar = inputStr.charAt(i)
		if (oneChar < "A" || oneChar > "Z" || inputStr.length < 2 || inputStr.length > 2)
		{
			alert("The " + gLabel +" must be two letters.");
			gField.focus();
			gField.select();	
			return
		}
	}
	gField.value = inputStr
	return true
}

//checks first five digits of zip
function iszip()
{
	if (gField.value.length == 0) 
	{
		return true
	}
	var inputStr = gField.value;
	if (ispositiveinteger())
	{
		if (inputStr.length!= 5)
		{
			alert("Enter the first five digits of the ZIP code in this field.");
			gField.focus();
			gField.select();	
			return
		}
		return true
	}
	return false
}

//checks for valid phone numbers; expands number-only with hyphens
function isphone()
{   
	var inputStr = gField.value;
	if (inputStr.length == 0) return true;
	inputStr = striphyphens(inputStr) ;

	inputStr = stripslashparens(inputStr) ;
	for (var i = 0; i < inputStr.length; i++)
	{
		var oneChar = inputStr.charAt(i)
		if (oneChar < "0" || oneChar > "9")
		{
		alert("The " + gLabel + " must be numbers only, including Area Code.\n\nThe entry format is \'555-555-5555'\ or \'5555555555'\.");
		gField.focus();
		gField.select();	
		return false;
		}
	}
	if (inputStr.length != 10)
	{
		alert("The " + gLabel + " entry contains " + inputStr.length + " number(s) instead of the required 10.\n\nThe entry format is \'555-555-5555'\ or \'5555555555'\.");
		gField.value=inputStr;
		gField.focus();
		gField.select();	
		return false;
	}
	inputStr = restorephonehyphens(inputStr)
	gField.value = inputStr
	return true;
}

//checks for valid phone numbers without areacode; expands number-only with hyphens
function isphoneshort()
{
	var inputStr = gField.value
	if (inputStr.length == 0) return true
	inputStr = striphyphens(inputStr)
	inputStr = stripslashparens(inputStr)
	for (var i = 0; i < inputStr.length; i++)
	{
		var oneChar = inputStr.charAt(i)
		if (oneChar < "0" || oneChar > "9")
		{
		alert("A phone number must be numbers only.  The entry format is \'###-####'\ or \'#######'\.");
		gField.focus();
		gField.select();	
		return
		}
	}
	if (inputStr.length != 7)
	{
		alert("The selected entry contains " + inputStr.length + " number(s) instead of the required 7.");
		gField.focus();
		gField.select();	
		return
	}
	inputStr = restorephonehyphensshort(inputStr)
	gField.value = inputStr
	return true
}


function isnum(n)
{
	if (ispositiveinteger())
	{
		var inputStr = gField.value;
		if (inputStr.length != n)
		{
			alert("The " + gLabel + " requires a number " + n + " digits long.");
			gField.focus();
			gField.select();	
			return
		}
		return true
	}
	return false
}

//date field validation ( called by other validation functions that specify minYear/maxYear
	
// get JS-friendly year
function getYear()
{
	var thisYear = (new Date()).getYear()
	thisYear = (thisYear < 100)? thisYear + 1900: thisYear
	return thisYear
}

//check the entered month for too high a value
function checkmonthlength(mm,dd)
{
	var months = new Array("","January","February","March","April","May","June","July","August","September","October","November","December")
	if ((mm == 4 || mm == 6 || mm == 9 || mm == 11) & dd > 30)
	{
		alert(months[mm] + " has only 30 days.");
		return false
	}
	else if (dd >31)
	{
		alert(months[mm] + " has only 31 days.");
		return false
	}
	return true
}

//check the entered February date for too high a value
function checkleapmonth(mm,dd,yyyy)
{
	if (yyyy % 4 > 0 & dd  > 28)
	{
		alert("February of " + yyyy + " has only 28 days.");
		return false
	}
	else if (dd > 29)
	{
		alert("February of " + yyyy + " has only 29 days.");
		return false
	}
	return true
}

function yearcheck(val)
{
	if (val == 1)
	{
		alert("1");
	}
}

//convert month or day number to string, padding with leading zero if needed
function monthdayformat(val)
{
	if (isNaN(val) || val == 0)
	{
		return "01"
	}
	else if (val < 10)
	{
		return "0" + val
	}
	return "" + val
}

//Generic TIN component validator
function isTINcomponent(len,type)
{
	var inputStr = gField.value
	if (inputStr == null || inputStr == "")
	{
		return true
	}
	if (isnum(len))
	{
		inputStr = parseInt(stripzeros(inputStr),10)
		if (inputStr == 0 || isNaN(inputStr))
		{
			alert("All zeros are not allowed in any " + type + " number field.");
			gField.focus();
			gField.select();	
			return
		}
		return true
	}
	return false
}

/*string utilities for search/replace functions; extract front
part of string prior to searchString*/
function getfront(mainStr,searchStr)
{
	foundOffset = mainStr.indexOf(searchStr)
	if (foundOffset == -1)
	{
		return null
	}
	return mainStr.substring(0,foundOffset)
}

//extract back end of string after searchString
function getend(mainStr,searchStr)
{
	foundOffset = mainStr.indexOf(searchStr)
	if (foundOffset == -1)
	{
		return null
	}
	return mainStr.substring(foundOffset+searchStr.length,mainStr.length)
}

//insert insertstring immediately before searchstring
function insertstring(mainStr,searchStr,insertStr)
{
	var front = getfront(mainStr,searchStr)
	var end = getend(mainStr,searchStr)
	if (front != null && end != null)
	{
		return front + insertStr + searchStr + end
	}
	return null
}

//remove deletestring
function deletestring(mainStr,deleteStr)
{
	return replacestring(mainStr,deleteStr,"")
}

//replace searchstring with replacestring
function replacestring(mainStr,searchStr,replaceStr)
{
	var front = getfront(mainStr,searchStr)
	var end = getend(mainStr,searchStr)
	if (front != null && end != null)
	{
		return front + replaceStr + end
	}
	return null
}

//convert string to upper case
function parseleadingzerotonum(inputStr)
{
	if (inputStr.substring(0,1) == "0")
	{
		var num = parseInt(inputStr.substring(1, 2))
	}
	else
	{
		var num = parseInt(inputStr.substring(0, 2))
	}
	return num
}		

//check hour
function ishour()
{
	if (gField.value.length == 0)
	{
		return true
	}
	/* strip space characters*/
	if (gField.value.indexOf(" ") > -1)
	{
		gField.value = deletestring(gField.value," ");
	}	
	if (ispositiveinteger())
	{
		if (gField.value < 1 || gField.value > 12)
		{
			alert("The " + gLabel + " requires a number between 1 and 12.");
			gField.focus();
			gField.select();	
			return
		}
		return true
	}
	return false		
}

//check minutes
function isminutes()
{
	if (gField.value.length == 0)
	{
		return true
	}
		
	/* strip space characters*/
	if (gField.value.indexOf(" ") > -1)
	{
		gField.value = deletestring(gField.value," ");
	}	
	if (iszeroorabove())
	{
		var min = parseInt(gField.value)
		if (min < 0 || min > 59)
			{
				alert("The " + gLabel + " requires a number between 0 and 59.");
			gField.focus();
			gField.select();	
			return
			}
		if (gField.value.length == 1)
		{
			gField.value = "0" + gField.value
		}
		return true
	}
	return false	
}

function ismaxtext()
{
var inputStr = gField.value
var strLength = inputStr.length
	if (strLength > 2000)
	{
		alert("The " + gLabel + " allows only 2,000 characters.\nYour current entry is " + strLength + ". \nPlease adjust your entry.");
		gField.focus();
		return
	}
  	return true
}

function ismaxtext1925()
{
var inputStr = gField.value
var strLength = inputStr.length
	if (strLength > 1925)
	{
		alert("The " + gLabel + " allows only 1925 characters.\nYour current entry is " + strLength + ". \nPlease adjust your entry.");
		gField.focus();
		return
	}
  	return true
}

function ismaxtext99()
{
	var inputStr = gField.value
	var strLength = inputStr.length
	if (strLength > 99)
	{
		alert("The " + gLabel + " allows only 99 characters.\nYour current entry is " + strLength + ". \nPlease adjust your entry.");
		gField.focus();
		return
	}
	return true
}

function ismaxtext255()
{
	var inputStr = gField.value
	var strLength = inputStr.length
	if (strLength > 255)
	{
		alert("The " + gLabel + " allows only 255 characters.\nYour current entry is " + strLength + ". \nPlease adjust your entry.");
		gField.focus();
		return
	}
	return true
}

function ismaxtext8000()
{
	var inputStr = gField.value
	var strLength = inputStr.length
	if (strLength > 8000)
	{
		alert("The " + gLabel + " allows only 8000 characters.\nYour current entry is " + strLength + ". \nPlease adjust your entry.");
		gField.focus();
		return false ;
	}
  	return true;
}

function ispassword()
{
var inputStr = gField.value
var strLength = inputStr.length
	if (ispositiveinteger())
	{
		if (strLength < 4 || strLength > 12)
		{
			alert("The " + gLabel + " requires an entry that is not less than 4 characters and not greater than 12 characters.");
			gField.focus();
			return	
		}
		return true
	}
	return false
}

//used on VoiceMail
function ispin()
{
	var inputStr = gField.value
	var strLength = inputStr.length
	if(gField.value.length == 0) return true
	{
		if (ispositiveinteger())
		{
			if (strLength < 4)
			{
				alert("The " + gLabel + " requires an entry that is 4 characters.");
				gField.focus();
				gField.select();	
				return
			}
			return true
		}
		return false
	}
}


/*******Begin validation dispatching mechanism*****/
//validation function object constructor
function dispatcher(validationFunc)
{
	this.doValidate = validationFunc
	}
	
	var dispatchLookup = new Array
	dispatchLookup["isnotempty"] = new dispatcher(isnotempty)
	dispatchLookup["ispositiveinteger"] = new dispatcher(ispositiveinteger)
	dispatchLookup["iszeroorabove"] = new dispatcher(iszeroorabove)
	dispatchLookup["is2chr"] = new dispatcher(is2chr)
	dispatchLookup["ischr0thruz"] = new dispatcher(ischr0thruz)
	dispatchLookup["is2alphas"] = new dispatcher(is2alphas)
	dispatchLookup["iszip"] = new dispatcher(iszip)
	dispatchLookup["isphone"] = new dispatcher(isphone)
	dispatchLookup["isdate"] = new dispatcher(isdate)
	dispatchLookup["ishour"] = new dispatcher(ishour)
	dispatchLookup["isminutes"] = new dispatcher(isminutes)
	dispatchLookup["ismaxtext"] = new dispatcher(ismaxtext)
	dispatchLookup["ismaxtext1925"] = new dispatcher(ismaxtext1925)
	dispatchLookup["ismaxtext99"] = new dispatcher(ismaxtext99)
	dispatchLookup["ismaxtext255"] = new dispatcher(ismaxtext255)
	dispatchLookup["ismaxtext8000"] = new dispatcher(ismaxtext8000)
	dispatchLookup["isselected"] = new dispatcher(isselected)
	dispatchLookup["isphoneshort"] = new dispatcher(isphoneshort)
	dispatchLookup["ispassword"] = new dispatcher(ispassword)
	dispatchLookup["ispin"] = new dispatcher(ispin)
	dispatchLookup["isemailaddress"] = new dispatcher(isemailaddress)
	dispatchLookup["notpastdate"] = new dispatcher(notpastdate)
	dispatchLookup["notfuturedate"] = new dispatcher(notfuturedate)
	dispatchLookup["isMonthYear"] = new dispatcher(isMonthYear)
	
//main validation function called by form event handlers
function validate(frame, field, label, method)
{	
	gFrame = frame
	//alert("in validate - field coming in =  " + field.name);
	//alert("in validate - frame coming in =  " + frame.name);
	gField = eval("window.document.forms[0]." + field.name)
	if (label !=null)
	{
		gLabel = label
	}
	else
	{
		gLabel = "field"
	}	
	var args = validate.arguments
	for (i=3; i<args.length; i++)
	{
		if (!dispatchLookup[args[i]].doValidate())
		{
			return false
		}
	}
	return true
}


/*********************************************************/
/*********************************************************/

//input field is not empty
function relisnotempty()
{
	if (gField1checked == true)
	{
		if (gField2.value == "" || gField2.value==null)
		{
			alert("If " + gLabel1 + " has been selected, the " + gLabel2 + " cannot be left empty.");
			gField2.focus();
			gField2.select();	
			return
		}
		else
		{
			/* remove blank spaces and see if anything is there*/
			temp = ""
			inputStr = gField2.value
			for (var i = 0; i < inputStr.length; i++)
			{
				var oneChar = inputStr.charAt(i);
				if (oneChar != " ")
				{
					temp += oneChar;
				}
			}
			if (temp == "")
			{
				alert("If " + gLabel1 + " has been selected, the " + gLabel2 + " cannot be left empty.");
				gField2.value="";
				gField2.focus();
				gField2.select();
				return		;
			}		
		}
	}
	return true;
}

// if field1 text has been entered, field2 text is required
// Date CircuitID ==> Location Address
//i_data_circuits_disc.cfm
function reltxtisnotempty()
{
	if (gField1checked == true)// value true passed here if textfield.value.length > 0
	{
		if (gField2.value.length == 0)
		{
			alert("If " + gLabel1 + " has been entered, the " + gLabel2 + " cannot be left empty.");
			gField2.focus();
			gField2.select();	
			return
		}
		else
		{
			/* remove blank spaces and see if anything is there*/
			temp = ""
			inputStr = gField2.value
			for (var i = 0; i < inputStr.length; i++)
			{
				var oneChar = inputStr.charAt(i);
				if (oneChar != " ")
				{
					temp += oneChar;
				}
			}
			if (temp == "")
			{
				alert("If " + gLabel1 + " has been entered, the " + gLabel2 + " cannot be left empty.");
				gField2.value="";
				gField2.focus();
				gField2.select();
				return		;
			}		
		}
	}
	return true;
}

//input field is not empty
//text entry required if checkbox NOT checked
function relisnotemptyunchk()
{
	if (gField1checked != true)
	{
		if (gField2.value == "" || gField2.value==null)
		{
			alert("If " + gLabel1 + " has not been selected, the " + gLabel2 + " cannot be left empty.");
			gField2.focus();
			gField2.select();	
			return
		}
		else
		{
			/* remove blank spaces and see if anything is there*/
			temp = ""
			inputStr = gField2.value
			for (var i = 0; i < inputStr.length; i++)
			{
				var oneChar = inputStr.charAt(i);
				if (oneChar != " ")
				{
					temp += oneChar;
				}
			}
			if (temp == "")
			{
				alert("If " + gLabel1 + " has not been selected, the " + gLabel2 + " cannot be left empty.");
				gField2.value="";
				gField2.focus();
				gField2.select();
				return		;
			}		
		}
	}
	return true;
}

/* checks that one option has been selected */
function reloptnotselected()
{
	if (gField1checked == true)
	{
		var onechecked="";
		for (var iOpts=0;iOpts<gField2.length; iOpts++)
		{
			if (gField2[iOpts].checked)
			{
				onechecked="true";
			}
		}
		if (onechecked!="true")
		{
			alert("If " + gLabel1 + " has been selected, please select " + gLabel2 + ".");
			gField2[0].focus();
			return;
		}
	}
	return true;
}

/** related selection has been made**/
function relisselected()
{
	if (gField1checked == true)
	{
		if (gField2.selectedIndex == 0)
		{
			alert("Since " + gLabel1 + " has been selected, " + gLabel2 + " must be selected also.");
			gField2.focus();
			//gField2.select();
			if (gCalledby=='atsubmit')
			{
				return;
			}
		}
	}
	return true;
}

function reliftextthensel()
{
	if (gField2.value != "" && gField2.value != null)
	{
		if (gField1checked == false)
		{
			alert("If " + gLabel2 + " has been entered, the " + gLabel1 + " must be selected.");
			gField1.focus();
			if (gCalledby=='atsubmit')
			{
				return;
			}
		}
	}
	return true;
}
/*******Begin second validation dispatching mechanism*****/
var gField1
var gLabel1
var gField1checked
var gField2
var gLabel2
var gCalledby
//relatedvalidation function object constructor
function reldispatcher(relvalidationFunc)
{
	this.doValidate = relvalidationFunc
}
	
	var reldispatchLookup = new Array
	reldispatchLookup["relisnotempty"] = new reldispatcher(relisnotempty)
	reldispatchLookup["relisnotemptyunchk"] = new reldispatcher(relisnotemptyunchk)
	reldispatchLookup["relisselected"] = new reldispatcher(relisselected)
	reldispatchLookup["reloptnotselected"] = new reldispatcher(reloptnotselected)
	reldispatchLookup["reliftextthensel"] = new reldispatcher(reliftextthensel)
	reldispatchLookup["reltxtisnotempty"] = new reldispatcher(reltxtisnotempty)
	
//main relatedvalidation function called by form event handlers
function relvalidate(frame, field1, label1, field1checked, field2, label2, calledby, method)
{
	gFrame = frame;
	gField1 = eval("window." + frame.name + ".document.forms[0]." + field1.name);
	if (method == "reloptnotselected")
	{
		gField2 = eval("window." + frame.name + ".document.forms[0]." + field2[0].name);
	}
	else
	{
		gField2 = eval("window." + frame.name + ".document.forms[0]." + field2.name);
	}
	//alert(gField1);
	//alert(gField2);
	gLabel1 = label1;
	gField1checked = field1checked;
	gLabel2 = label2;
	gCalledby = calledby;
	var args = relvalidate.arguments
	for (i=7; i<args.length; i++)
	{
		if (!reldispatchLookup[args[i]].doValidate())
		{
			return false;
		}
	}
	return true;
}

function isradiochecked(frame, field, label)
{
	var onechecked="";
	for (var iOpts=0; iOpts < field.length; iOpts++)
	{
		if (field[iOpts].checked)
		{
			onechecked="true";
		}
	}
	if (onechecked!="true")
	{
		alert("Please select a " + label + ".");
		field[0].focus();
		return false;
	}
	return true;
}