<!--
// written by Ryan Schaeffer, gsk - 4/01/02

		var requiredObjArray = [], formatObjArray = [], ErrorOrderArray = [];
		var validateForm = null;
		
		var TextSelectRequiredErr=0, RadioCheckRequiredErr=1, FormatErr=2, OtherErr=3;
		var ErrorTypeArray = ["TextSelectRequiredErr", "RadioCheckRequiredErr", "FormatErr", "OtherErr"];
		
		// Object containing error information
		var ErrorObj = new Object();
		ErrorObj.ConfigError = '';
		
		// build alert box or window msg
		var alertObj = new Object();
		
		// default values - to be used in alert box
		alertObj.windowFunction = "alert";
		alertObj.lineBreakChar = "\\n";
		alertObj.tabChar = "\\t";
		alertObj.evalEscape = "\\";
		
		var validationWinObj = null;
		
		// initialer helper function to build required object array and parameters
		function addRequired(display, field) {
			if ( !display || !field ) {
				ErrorObj.ConfigError += "\taddRequired('"+display+"','"+field+"') :\n"+
					"\t\tusage: addRequired( display, field )\n"+
					"\t\tdisplay : Human readable field name, i.e. displayed to client on error.\n"+
					"\t\tfield : Array of form field names (relative to form as defined in setValidateForm).\n\n";
				return false;
			}
			var pos = requiredObjArray.length;
			requiredObjArray[pos] = new Object();
			requiredObjArray[pos].display = display;
			requiredObjArray[pos].field = field; 
			if (arguments.length > 2) {
				requiredObjArray[pos].trigger = arguments[2];
				requiredObjArray[pos].extra = [];
				for (var i=3; i < arguments.length; i+=2) {
					var extrapos = requiredObjArray[pos].extra.length;
					requiredObjArray[pos].extra[extrapos] = new Object();
					requiredObjArray[pos].extra[extrapos].display = arguments[i];
					requiredObjArray[pos].extra[extrapos].field = arguments[i+1];
				}
			}
		}
		
		// initialer helper function to build format array and parameters
		function addFormat(display, fieldName, fmt) {
			if ( !display || !fieldName || !fmt ) {
				ErrorObj.ConfigError += "\taddFormat('"+display+"','"+fieldName+"','"+fmt+"') :\n"+
					"\t\tusage: addFormat( display, field, format )\n"+
					"\t\tdisplay : Human readable field name, i.e. displayed to client on error.\n"+
					"\t\tfield : Array of form field names (relative to form as defined in setValidateForm).\n"+
					"\t\tformat : Check given format. Available format options are: number,email,date,time\n\n";
				return false;
			}
			var pos = formatObjArray.length;
			formatObjArray[pos] = new Object();
			formatObjArray[pos].display = display;
			formatObjArray[pos].field = fieldName;
			formatObjArray[pos].format = fmt;
		}

		// check if valid date and meets format
		function isDate(thedate, theformat) {
			if ( !thedate || !theformat ) {
				ErrorObj.ConfigError += "\tisDate('"+thedate+"','"+theformat+"') :\n"+
					"\t\tusage: isDate( date, format )\n"+
					"\t\tdate : A valid date.\n"+
					"\t\tformat : Check format for given date.\n\n";
				return false;
			}
			var aDaysInMonth=new Array(31,28,31,30,31,30,31,31,30,31,30,31);

			// Fetch the date separator from the user's input
			var sSepDate = thedate.charAt(thedate.search(/\D/));
			// Fetch the date separator from the format
			var sSepFormat=theformat.charAt(theformat.search(/[^MDY]/i));
			// Compare separators
			if (sSepDate!=sSepFormat) return false;

			// Fetch the three pieces of the date from the user's input and the format
			var aValueMDY=thedate.split(sSepDate,3);
			var aFormatMDY=theformat.split(sSepFormat,3);

			// Assign day, month, year based on format
			var iMonth,iDay,iYear;
			iMonth = aValueMDY[0];
			iDay   = aValueMDY[1];
			iYear  = aValueMDY[2];

			// Validate that all pieces of the date are numbers
			if ( !/\d/.test( iMonth ) || !/\d/.test( iDay ) || !/\d/.test( iYear ) )
				return false;

			// Require format digit year
			if(iYear.length!=aFormatMDY[2].length)	return false;

			// Check for leap year
			var iDaysInMonth=(iMonth!=2)?aDaysInMonth[iMonth-1]:
			((iYear%4==0 && iYear%100!=0 || iYear % 400==0)?29:28);

			return (iDay!=null && iMonth!=null && iYear!=null && iMonth<13 && iMonth>0 && iDay>0 && iDay<=iDaysInMonth);		
		}
		
		// check if valid time and meets format
		function isTime(thetime, theformat) {
			if ( !thetime || !theformat ) {
				ErrorObj.ConfigError += "\tisTime('"+thetime+"','"+theformat+"') :\n"+
					"\t\tusage: isTime( time, format )\n"+
					"\t\ttime : A valid time.\n"+
					"\t\tformat : Check format for given time.\n\n";
				return false;
			}
			// Fetch the date separator from the user's input
			var sSepDate = thetime.charAt(thetime.search(/\D/));
			// Fetch the date separator from the format
			var sSepFormat=theformat.charAt(theformat.search(/[^HM]/i));
			// Compare separators
			if (sSepDate!=sSepFormat) return false;

			// Fetch the three pieces of the date from the user's input and the format
			var aValueHM=thetime.split(sSepDate,2);
			var aFormatHM=theformat.split(sSepFormat,2);

			// Assign day, month, year based on format
			var iHour,iMinute;
			iHour 	= aValueHM[0];
			iMinute	= aValueHM[1];

			// Validate that all pieces of the date are numbers
			if ( !/\d/.test( iHour ) || !/\d/.test( iMinute ) )
				return false;

			return (iHour!=null && iMinute!=null && iHour<24 && iHour>=0 && iMinute>=0 && iMinute<60);		
		}		
		
		function isValidLength( _value, _length )
		{
			return ( _value.length > 0 && _value.length < _length )
		}
		
		function checkRequiredAge( minAge, birthDate, format ) {
			format = format || "MM-DD-YYYY";
			if ( !minAge || !birthDate ) {
				ErrorObj.ConfigError += "\tcheckRequiredAge('"+ minAge+"','"+birthDate+"','"+format+"') :\n"+
					"\t\tusage: checkRequiredAge( minAge, date, format )\n"+
					"\t\tminAge : Age minimum requirement.\n"+
					"\t\tbirthDate : Check date in format as defined in the format parameter.\n"+
					"\t\tformat (optional - default MM-DD-YYYY): Check format for given date.\n\n";
				return false;
			}
			if (!isDate( birthDate, format ) ) {
				addFormatError("Invalid Date : "+format);
    	       	return false;
       		} else { // check if at least of age
				var bdate = new Date( birthDate );
    	        var birth = new Object;
        	    birth.mm = bdate.getMonth() + 1;
            	birth.dd = bdate.getDate();
	            birth.yyyy = bdate.getFullYear();

				var today = new Date();
        	    var now = new Object;
            	now.mm = today.getMonth() + 1;
	            now.dd = today.getDate();
    	        now.yyyy = today.getFullYear();

				var age = now.yyyy - birth.yyyy;
				if ( (now.mm < birth.mm) || (now.mm==birth.mm && now.dd<birth.dd)) { age--; }
	            if ( (age<minAge) ){
    	        	addFormatError("Date of Birth: Must be " + minAge + " years old or older");
        	        return false;
            	}
	           	return true;
	    	}		
		}
		// checks specified format for each case - and builds error string
		function checkFormat() {
			if ( !validateForm ) {
				ErrorObj.ConfigError += "\tcheckFormat : No validation form has been specified.\n\n";
				return false;
			}
			for (var i=0; i < formatObjArray.length; i++) {
				var elem = formatObjArray[i];
				switch (elem.format) {
					case "number" :
						var done = false;
						for (var f=0; (f < elem.field.length && !done); f++) {
							var formvalue = eval("validateForm."+elem.field[f]+".value");
							if (formvalue!="" && /\D/.test(formvalue)) {
								addFormatError(elem.display);
								done = true;
							}
						}
						break;
					case "email" :
						var formvalue = eval("validateForm."+elem.field[0]+".value");
						if (formvalue!="" && !/^[\w_-]+(\.[\w_-]+)*@[\w_-]+(\.[\w_-]+)*\.\w{2,4}$/.test(formvalue)) {
							addFormatError(elem.display);
						}
						break
					case "date" :
						var formvalue = eval("validateForm."+elem.field[0]+".value");
						var sFormat = "MM-DD-YYYY";
						if ( formvalue!="" && !isDate(formvalue, sFormat) ) {
							addFormatError(elem.display);
						}
						break;
					case "time" :
						var formvalue = eval("validateForm."+elem.field[0]+".value");
						var sFormat = "HH:MM"
						if ( formvalue!="" && !isTime(formvalue, sFormat) ) {
							addFormatError(elem.display);
						}
						break;					
				}
			}
		}
			
		// resets the error message for before each required check
		function resetErrorMessage() {
			ErrorObj.TextSelectRequiredErr = '', ErrorObj.RadioCheckRequiredErr = '', ErrorObj.FormatErr = '', ErrorObj.OtherErr = '', ErrorObj.ConfigError = '';
			ErrorOrderArray = [];
		}

		// add validation error message
		function addValidationError( type, str ) {	
			var availTypFlg = false;
			for ( var i=0; i < ErrorTypeArray.length; i++ ) {
				if ( ErrorTypeArray[i] == type ) {
					availTypFlg = true;
					break;
				}
			}
			if ( !availTypFlg )
				ErrorObj.ConfigError += "addValidationError: '"+type+"' is not a valid error type.\n";
			if ( eval( "ErrorObj." + type ) == "" ) ErrorOrderArray[ErrorOrderArray.length] = type;
			eval( "ErrorObj." + type + "+= \"" + alertObj.tabChar + str + alertObj.evalEscape + alertObj.lineBreakChar + "\"" );
		}

		function addFormatError( str ) {	
			addValidationError( ErrorTypeArray[FormatErr], str );
		}

		function addOtherError( str ) {	
			addValidationError( ErrorTypeArray[OtherErr], str );
		}
		
		function setOtherError( str ) {	
			addValidationError( ErrorTypeArray[OtherErr], str );
		}
		
		function setValidateForm( formObj ) { 
			resetErrorMessage();
			validateForm = formObj; 
		}

		// runs through specified requiredObjArray and checks validity for based on field type
		function checkRequired(reqarray) {
			if ( !validateForm ) {
				ErrorObj.ConfigError += "\tcheckRequired : No validation form has been specified.\n\n";
				return false;
			}
			for (var i=0; i < reqarray.length; i++) {
				var elem = reqarray[i];
				var formelem = eval("validateForm."+elem.field[0]);
				if (!formelem) alert("validateForm."+elem.field[0]);
				switch (formelem.type || formelem[0].type) {
					case "text" : case "textarea" : case "password" :
						var done = false;
						for (var f=0; (f < elem.field.length && !done); f++) {
							formelem = eval("validateForm."+elem.field[f]);
							if ( !isTrigger( elem, formelem.value ) && formelem.value == "" ) {
								addValidationError( ErrorTypeArray[TextSelectRequiredErr], elem.display );
								done = true;
							}
						}
						break;
					case "select-one" :
						if ( !isTrigger( elem, formelem.options[formelem.selectedIndex].value ) && ( formelem.options[formelem.selectedIndex].value == "" ) ) {
								addValidationError( ErrorTypeArray[TextSelectRequiredErr], elem.display );
						}
						break;
					case "radio" :
						var done = null;
						for (var r=0; (r < formelem.length && !done); r++) {
							if (formelem[r].checked) done = formelem[r].value
						}
						if (done == null) {
							addValidationError( ErrorTypeArray[RadioCheckRequiredErr], elem.display );
						} else { isTrigger( elem, done ); }
						break;
					case "checkbox" :
						var done = false;
						for (var c=0; (c < elem.field.length && !done); c++) {
							var chbxelem = eval("validateForm."+elem.field[c]);
							if (chbxelem.checked) done = true;
						}
						if (!done) {
							addValidationError( ErrorTypeArray[RadioCheckRequiredErr], elem.display );
						} else { isTrigger( elem, done ); }
						break;
				}
			}
		}

		// check if form element is a trigger for more require fields
		function isTrigger( reqElem, formElemVal ) {
			if ( reqElem.trigger == formElemVal ) { 		
				checkRequired(reqElem.extra);
				return true;
			}
			return false;
		}
		
		function setErrorWindow( location, features, windowName, childDisplayFunction, lineBreakChar, tabChar ) {
			if ( !location ) {
				ErrorObj.ConfigError += "\tsetErrorWindow : No location specified.\n\n";
				return false;
			}
			alertObj.windowName 		= ( windowName || "validationWinObj" );
			alertObj.windowFunction 	= "self.open('" + location + "','" + alertObj.windowName + "','" + features + "')";
			alertObj.childDisplayFunction 	= childDisplayFunction;
			alertObj.lineBreakChar 		= lineBreakChar || "<br>";
			alertObj.tabChar 		= tabChar || "&nbsp;&nbsp;&nbsp;&nbsp;";
			alertObj.evalEscape = "";
		}
		
		function displayErrorWindow( alertStr ) {
			if ( alertStr == "" )
				return true;
			else {
				if (  validationWinObj != null )
					validationWinObj.close();
				if ( !alertObj.childDisplayFunction ) {
					eval( alertObj.windowFunction + "(\"" + alertStr + "\")" );
				}
				else {
					validationWinObj = eval( alertObj.windowFunction );
					eval( alertObj.childDisplayFunction + "(\"" + alertStr + "\")" );
					validationWinObj.focus();
				}
				return false;
			}
		}
		
		function generateMessageBody( staticMsg, dynamicMsg ) {
			return staticMsg+alertObj.lineBreakChar+dynamicMsg+alertObj.lineBreakChar;			
		}
		
		// builds error message from the requiredObjArray and alert the user
		function validateRequired() {
			checkRequired(requiredObjArray);
			checkFormat();
			
			if ( ErrorObj.ConfigError!='' ) {
				alert( "Please check to see if page is fully loaded.");
				return false;
			}
			var errorMsg = '';
			for (var i=0; i < ErrorOrderArray.length; i++) {
				if (ErrorOrderArray[i] == ErrorTypeArray[TextSelectRequiredErr]) 
					errorMsg += generateMessageBody("The following fields are missing:",ErrorObj.TextSelectRequiredErr);
				else if (ErrorOrderArray[i] == ErrorTypeArray[RadioCheckRequiredErr]) 
					errorMsg += generateMessageBody("The following questions require a selection:",ErrorObj.RadioCheckRequiredErr);
				else if (ErrorOrderArray[i] == ErrorTypeArray[OtherErr]) 
					errorMsg += generateMessageBody("These other errors occurred:",ErrorObj.OtherErr);
				else if (ErrorOrderArray[i] == ErrorTypeArray[FormatErr]) 
					errorMsg += generateMessageBody("The following fields had format input error(s):",ErrorObj.FormatErr);
			}
			return displayErrorWindow( errorMsg );			
		}

//-->