// JavaScript Document
// contains objects used for validating form objects on the client-side

var parseChar= "/";
var minYear=1900;
var maxYear=2100;
var oFocus = ""; 
			
function highlightObject(o,activate) {
	if (activate) {o.style.backgroundColor = "FFFFCC";}
	else {o.style.backgroundColor = "F9F9FB";}
}
function isNotNull(obj,t) {
	switch(obj.type) {
		case "radio":
			if (obj.checked) {highlightObject(obj,false);return true;}
			break;
		case "checkbox":
			if (obj.checked) {highlightObject(obj,false);return true;}
			break;
		case "select-multiple":
			if (obj.length>0) {highlightObject(obj,false);return true;}
			break;
		default:
			if (obj.value) {highlightObject(obj,false);return true;}
			break;																						
		}
	if (t) {alert("The " + t + " option cannot be empty.  Please enter a value before proceeding.");}
	else {alert("This option cannot be empty.  Please enter a value before proceeding.");}
	highlightObject(obj,true);
	setFocus(obj);
	return false;
}				
function isInteger(s){
//used to validate characters as number
	var i;
	for (i = 0; i < s.length; i++){   
		// Check that current character is number.
		var c = s.charAt(i);
		if (((c < "0") || (c > "9"))) return false;
	}
	// All characters are numbers.
	return true;
}

function isValidNumber(obj) {
//o = object to test for number value
	if (!obj.value) {return true;}	
	if(obj.value) {
		if (!isInteger(obj.value)) {
			alert("Please enter a valid whole number (no decimal points or commas)");
			highlightObject(obj,true);
			setFocus(obj);
			return false;
		}
	}
	highlightObject(obj,false);
	return true;
}
function isNotZero(obj) {
//o = object to test for number value
	if (obj.value=="0")  {
		alert("Please enter a value greater than zero");
		highlightObject(obj,true);
		setFocus(obj);
		return false;
	}
	highlightObject(obj,false);
	return true;
}
function isCurrency(obj) {	
	if (obj.value) {	
		var tval = obj.value;
		var c = "0123456789."; 
		//check for valid characters
		for (i=0; i<tval.length; i++) {
			if (c.indexOf(tval.charAt(i)) == -1) {
				alert("Please enter a valid currency value (e.g. 1.00 or 0.75).  Do not inlclude a dollar sign ($) or commas (,) with your entry");
				highlightObject(obj,true);
				setFocus(obj);
				return false;
			}
		}
		//checks for (.) at proper location
		if (tval.charAt(tval.length-3) != ".") {
				alert("Please enter a valid currency value (e.g. 1.00 or 0.75).  Do not inlclude a dollar sign ($) or commas (,) with your entry");
				highlightObject(obj,true);
				setFocus(obj);
				return false;		
		}
	}				 	
}	
function stripCharsInBag(s, bag){
//used to trim out characters within string
	var i;
	var returnString = "";
	// Search through strings characters one by one.
	// If character is not in bag, append to returnString.
	for (i = 0; i < s.length; i++){   
		var c = s.charAt(i);
		if (bag.indexOf(c) == -1) returnString += c;
	}
	return returnString;
}

function daysInFebruary (y){
//darn leap year -- needed to verify february max days
	// February has 29 days in any year evenly divisible by four,
	// EXCEPT for centurial years which are not also divisible by 400.
	return (((y % 4 == 0) && ( (!(y % 100 == 0)) || (y % 400 == 0))) ? 29 : 28 );
}

function DaysArray(n) {
	for (var i = 1; i <= n; i++) {
		this[i] = 31;
		if (i==4 || i==6 || i==9 || i==11) {this[i] = 30;}
		if (i==2) {this[i] = 29;}
   } 
   return this
}

function areDatesValid(sDate,eDate) {
//used to verify that start and end dates valid
	//checks for nulls
	if (!sDate.value || !eDate.value) {
		alert("Please enter both a start and end date for your report");
		return false;
	}	
	//verifies date formats
	if (isValidDateFormat(sDate)==false) {return false;}
	if (isValidDateFormat(eDate)==false) {return false;}
			
	//verifies that start and end dates within range
	var dStart = new Date(sDate.value)
	var dEnd = new Date(eDate.value);
	//verifies that start date equal or after end date
	if (dStart>dEnd) {
		alert("Please make sure your start date is equal to or less than your end date");
		return false;
	}
		
	return true;
}

function isValidDateFormat(obj){
//verifies required date format using mm/dd/yyyy as base
	
	//if null, get out now
	if (!obj.value) {return true;}
	
	var s = obj.value;	
	var daysInMonth = DaysArray(12);
	var pos1=s.indexOf(parseChar);
	var pos2=s.indexOf(parseChar,pos1+1);
	var m=s.substring(0,pos1);
	var d=s.substring(pos1+1,pos2);
	var y=s.substring(pos2+1);
	var yy=y;

	//adjusts date object strings for zero padding
	if (d.charAt(0)=="0") {
		if (d.length>2) {
			alert("Please enter a valid day");
			highlightObject(obj,true);
			setFocus(obj);
			return false;
		}
		else {d=d.substring(1);}
	}
	if (m.charAt(0)=="0") {
		if (m.length>2) {
			alert("Please enter a valid month");
			highlightObject(obj,true);
			setFocus(obj);
			return false;
		}
		else {m=m.substring(1);}
	}
	for (var i = 1; i <= 3; i++) {
		if (yy.charAt(0)=="0" && yy.length>1) {yy=yy.substring(1);}
	}
	
	//gets numbers for required date objects
	var month=parseInt(m);
	var day=parseInt(d);
	var year=parseInt(yy);

	//verifies date format
	if (pos1==-1 || pos2==-1){
		alert("Please enter the date using a MM/DD/YYYY format (e.g. 01/01/2004)");
		highlightObject(obj,true);
		setFocus(obj);
		return false;
	}
	//verifies that month is entered and within range
	if (m.length<1 || month<1 || month>12){
		alert("Please enter a valid month");
		highlightObject(obj,true);
		setFocus(obj);
		return false;
	}
	//verifies that day entered and within range
	if (d.length<1 || day<1 || day>31 || (month==2 && day>daysInFebruary(year)) || day > daysInMonth[month]){
		alert("Please enter a valid day");
		highlightObject(obj,true);
		setFocus(obj);
		return false;
	}
	//verifies that year entered and within range
	if (y.length != 4 || year==0 || year<minYear || year>maxYear){
		alert("Please enter a valid 4 digit year between "+minYear+" and "+maxYear);
		highlightObject(obj,true);		
		setFocus(obj);
		return false;
	}
	//verifies that only valid characters present
	if (s.indexOf(parseChar,pos2+1)!=-1 || isInteger(stripCharsInBag(s, parseChar))==false){
		alert("Please enter a valid date");
		highlightObject(obj,true);
		setFocus(obj);
		return false;
	}
	highlightObject(obj,false);
	return true;

}

function setFocus(obj) {
//used to return focus to form control that violated validation
	if (obj) {
	  oFocus = obj;
	  setTimeout("oFocus.focus()",250); 
		setTimeout("oFocus.select()",250);
	}
}

function isValidLength(obj, l, t) {
//function used to verify that form control has not exceeded required length
//obj = the form object to validate
//l = the max length of the object
//t = the label or name of the object being checked
	if (obj) {
		if (obj.value.length > l) {
			alert("The " + t + " cannot exceed " + l + " characters");
			setFocus(obj);
			return false;
		}
		else {return true;}	
	}
	else {return true;}
}

function isValidEmail(obj) {
//function used to verify key characters in email address input
	if (obj.value) {
		if (obj.value.indexOf('@')==-1 || obj.value.indexOf('.')==-1) {
			alert("Please make sure you have entered a valid email address");
			setFocus(obj);
			return false;
		}
	}
	return true;
}

function getUrlFormElements(frm, doEncode, delim) {
//function used to acquire parameters needed for url action
//returns string of form element names and values that can be used in a url
// e.g. p_1=x&p_2=y&p_3=z
//params --
// frm = form to extract object name and values from
// doEncode = indicates if the url string should be encoded.  by default, encoding is done
// delimChar
	var pName;
	var pVal;
	var pString = "";
	var pValid;
	var pDelim = "|";
	
	if (delim) {pDelim=delim};
	
	for (i=0;i<frm.length;i++) {
		if (frm.elements[i].name) {					
			pValid = true;
			pName="";
			pVal="";
			switch(frm.elements[i].type) {
				case "radio":
					if (frm.elements[i].checked) {
						pString = pString + frm.elements[i].name + "=" + frm.elements[i].value;
					}
					else {pValid=false;}
					break;
				case "checkbox":
					if (frm.elements[i].checked) {
						pString = pString + frm.elements[i].name + "=" + frm.elements[i].value;
					}
					else {pValid=false;}
					break;
				case "select-multiple":
					pName = frm.elements[i].name;
					for (x=0; x<frm.elements[i].length; x++) {
						pVal = pVal + frm.elements[i].options[x].value;
						if (x<frm.elements[i].length-1) {pVal = pVal+pDelim;}									
					}
					pString = pString + pName + "=" + pVal;
					break;
				default:
					pString = pString + frm.elements[i].name + "=" + frm.elements[i].value;
					break;																						
			}
		}
		else {pValid=false;}
		if (i<frm.length-1&&pValid) {pString=pString+"&";}
	}
	//trims trailing '&'
	if (pString.substr(pString.length-1,1) == "&") {pString = pString.substr(0,pString.length-1);}
	if(doEncode) {pString=escape(pString);}
	return pString;
}	
function getFormPageRedirectParams(f,p,bu,ndelim,vdelim) {
//function used to build a URL call to the default GLOBAL.pkg_pageUtilities.prc_doPageRedirect method
//this can be used if the url needs to be created on the fly due to current client-side form selections
//returns url string to global method 
//e.g. GLOBAL.pkg_pageUtilities.prc_doPageRedirect?p_pageId=2&p_paramNames=p_name|p_date&p_paramValues=Me|today...etc
//params --
// f - form object
// p - GLOBAL.WEB_PAGE.WEB_PAGE_ID of page to direct to
// bu - back url (return back to url)
// ndelim - character that is delimiter for parameter names.  default = "|"
// vdelim - character that is delimiter for parameter values w/ multiple values. default = ":"					
	var u = "";
	var uBack = "";
	if (bu) {uBack=bu;}
	if (f) {
		var d = "|";
		var vd = ":";
		if (ndelim) {d=ndelim;}
		if (vdelim) {vd=vdelim;}
		var e = getUrlFormElements(f,false,vd); 
		var eArray = e.split("&");
		var pNames="";
		var pValues="";
		for (i=0;i<eArray.length;i++) {
			pNames=pNames+eArray[i].substring(0,eArray[i].indexOf("="))+d;
			pValues=pValues+eArray[i].substring(eArray[i].indexOf("=")+1,eArray[i].length)+d;
		}
		if (pNames.substr(pNames.length-1,1) == d) {pNames = pNames.substr(0,pNames.length-1);}  
		if (pValues.substr(pValues.length-1,1) == d) {pValues = pValues.substr(0,pValues.length-1);}
		u="GLOBAL.pkg_pageUtilities.prc_doPageRedirect?p_pageId="+p+"&p_paramNames="+pNames+"&p_paramValues="+pValues+"&p_backUrl="+escape(uBack);
	}  
	return u;                    			
} 
