var PageForm = 0; // index of form to validate. default = 0 (1st form)
var checkboxDone; // string to store checkbox/radio validation attempts so we don't validate them more than once
var ErrorArray; // array to hold error field objects
var Req = new Object(); // true means that this is a required field -- set by user
var Label = new Object(); // label of the field -- set by user
var Type = new Object(); // field type: text, select, checkbox, etc - set by user
var Spec = new Object(); // special attributes: length for text, invalid item index for selection, etc -- set by user
var SpecLabel = new Object(); 
var Text = new Object(); // text for the field validation failure passed by the validation script
var wd = 500; // window default width

/*
* Also accepts 2 integer arguments which set window Width and Height
*/
function validate() { 
	ErrorArray = new Array();
	checkboxDone = "";	
	for ( f=0; f<document.forms[PageForm].length; f++ ) {	
		validateThisField( document.forms[PageForm].elements[f] );
	}	
	if ( ErrorArray.length > 0 ) {
		if ( validate.arguments.length == 1 ) {
			wd = validate.arguments[0];
		}
		displayValidationErrors();
		return false;
	} else {
		return true;
	}
}
function validateThisField( field ) { 
	//field.name = field.name.indexOf("[]") == -1 ? field.name : field.name.slice(0,field.name.indexOf("[]"));
	if ( field.name.indexOf('[]') != -1 ) { return; }
	var fType = Type[field.name]; 
	var fLbl = Label[field.name]; 
	if ( Req[field.name] == true ) {
		if ( fType == "text" ) {
			validateTextField( field );
		} else if ( fType == "integer" ) {
			validateIntegerField( field );
		} else if ( fType == "float" ) {
			validateFloatField( field );
		} else if ( fType == "select" ) {
			validateSelectField( field );
		} else if ( fType == "multiple" ) {
			validateSelectMultipleField( field );
		} else if ( fType == "date" ) {
			validateDateField( field );
		} else if ( fType == "checkbox" | fType == "radio" ) {
			validateCheckboxField( field );
		} else if ( fType == "email" ) {
			validateEmailField( field );
		} else if ( fType == "url" ) {
			validateURLField( field );
		}
	}
}
function validateTextField( field ) {	
	if ( field.value == "" ) {
		ErrorArray[ErrorArray.length] = field; 
		Text[field.name] = Label[field.name] + " is a required field";
	} else if ( field.value.length < Spec[field.name] ) {
		ErrorArray[ErrorArray.length] = field; 
		Text[field.name] = Label[field.name] + " requires a minimum of " + Spec[field.name] + " characters";
	}
}
function validateIntegerField( field ) {	
	if ( field.value != "" ) {
		field.value = parseInt( field.value );		
	}

	if ( ( field.value == "" ) | ( field.value == "NaN" ) )  {
		ErrorArray[ErrorArray.length] = field; 
		Text[field.name] = Label[field.name] + " is a Required field";
	} else if ( field.value.length < Spec[field.name] ) {
		ErrorArray[ErrorArray.length] = field; 
		Text[field.name] = Label[field.name] + " Requires a minimum of " + Spec[field.name] + " characters";
	}
}
function validateFloatField( field ) {
	if ( field.value != "" ) {
		field.value = parseFloat( field.value );
	}

	if ( ( field.value == "" ) | ( field.value == "NaN" ) )  {
		ErrorArray[ErrorArray.length] = field; 
		Text[field.name] = Label[field.name] + " is a Required field";
	} else if ( field.value.length < Spec[field.name] ) {
		ErrorArray[ErrorArray.length] = field; 
		Text[field.name] = Label[field.name] + " Requires a minimum of " + Spec[field.name] + " characters";
	}
}
function validateSelectField( field ) {
	if ( Spec[field.name] == field.selectedIndex ) {
		ErrorArray[ErrorArray.length] = field; 
		Text[field.name] = Label[field.name] + " is a required field";
	}	
}
function validateSelectMultipleField( field ) {
	var found = false;
	for ( m=0; m<document.forms[PageForm].elements[field.name].options.length; m++ ) {
		if ( document.forms[PageForm].elements[field.name].options[m].selected ) {
			found = true;
		}
	}
	if ( !found ) {
		ErrorArray[ErrorArray.length] = field; 
		Text[field.name] = Label[field.name] + " is a required field";
	}
}
function validateDateField( field ) {
	dValue = field.value;

	if ( dValue.indexOf('/') != -1 ) {
		dSep = '/';
	} else if ( dValue.indexOf('.') != -1 ) {
		dSep = '.';
	} else if ( dValue.indexOf('-') != -1 ) {
		dSep = '-';
	} else {
		dSep = "";
	}

	dFormat = "EU";
	if ( dFormat == "EU" ) {
		dAlertTxt = "DD"+dSep+"MM"+dSep+"YYYY";
	} else {
		dAlertTxt = "MM"+dSep+"DD"+dSep+"YYYY";
	}

	if ( dValue == "" ) {
		ErrorArray[ErrorArray.length] = field;
		Text[field.name] = Label[field.name] + " is a required field";		
	} else if ( !getDate(dValue,dFormat,dSep) ) {
		ErrorArray[ErrorArray.length] = field; 
		Text[field.name] = Label[field.name] + " requires the following format " + dAlertTxt;
	} else if ( Spec[field.name] ) {
		dSpecial = Spec[field.name];
		if ( dSpecial.indexOf('<=') != -1 ) {
			dSpecSep = '<=';
		} else if ( dSpecial.indexOf('>=') != -1 ) {
			dSpecSep = '>=';
		} else if ( dSpecial.indexOf('<') != -1 ) {
			dSpecSep = '<';
		} else if ( dSpecial.indexOf('>') != -1 ) {
			dSpecSep = '>';
		}

		dSpecSplit = dSpecial.split(dSpecSep);
		if ( dSpecSplit.length != 2 ) {
			return;
		}
		dField1 = getDate(document.forms[PageForm].elements[dSpecSplit[0]].value,dFormat,dSep);
		dField2 = getDate(document.forms[PageForm].elements[dSpecSplit[1]].value,dFormat,dSep);
		
		if ( !dField1 | !dField2 ) {
			return;
		}
	
		dPass = eval(dField1.getTime() + " " + dSpecSep + " " + dField2.getTime());

		if ( !dPass ) {
			ErrorArray[ErrorArray.length] = field; 
			Text[field.name] = SpecLabel[field.name];
		} 			
	}
}
function getDate(dValue,dFormat,dSep) {
	if ( dValue == "" ) {
		return false;
	}

	dSplit = dValue.split(dSep);
	if ( dSplit.length != 3 ) {
		return false;
	}

	if ( dFormat == "EU" ) {
		dDay = parseInt(parseFloat(dSplit[0]));
		dMon = parseInt(parseFloat(dSplit[1]));
		dYr = parseInt(parseFloat(dSplit[2]));				
	} else {
		dDay = parseInt(parseFloat(dSplit[1]));
		dMon = parseInt(parseFloat(dSplit[0]));
		dYr = parseInt(parseFloat(dSplit[2]));	
	}

	if (( dDay == "NaN" ) | dDay == "") { return false; }
	if (( dMon == "NaN" ) | dMon == "") { return false; }
	if (( dYr == "NaN" ) | dYr == "") { return false; }
	
	dDate_new = new Date(dYr,dMon-1,dDay);
	if ( dDay != dDate_new.getDate() ) { return false; }
	if ( dYr != dDate_new.getFullYear() ) { return false; }
	if ( dMon != dDate_new.getMonth()+1 ) { return false; }
	return dDate_new;
}
function validateCheckboxField( field ) {
	if ( checkboxDone.indexOf( field.name ) == -1 ) {
		var found = false;
		if ( document.forms[PageForm].elements[field.name] ) {
			var cb_obj = document.forms[PageForm].elements[field.name];
		} else if ( document.forms[PageForm].elements[field.name+"[]"] ) {
			var cb_obj = document.forms[PageForm].elements[field.name+"[]"];
		}
		for ( i=0; i<cb_obj.length; i++ ) {
			if ( cb_obj[i].checked ) {
				found = true;
				i = cb_obj.length;
			}
		}
		if ( !found ) {
			ErrorArray[ErrorArray.length] = field; 
			Text[field.name] = Label[field.name] + " is a required field";			
		}
		checkboxDone += field.name + "&";
	}
}
function validateEmailField( field ) {
	if ( field.value == "" ) {
		ErrorArray[ErrorArray.length] = field; 
		Text[field.name] = Label[field.name] + " is a required field";
	} else if ( field.value.indexOf("@") == -1 ) {
		ErrorArray[ErrorArray.length] = field; 
		Text[field.name] = Label[field.name] + " requires properly formatted email address";
	}
}
function validateURLField( field ) {
	if ( field.value == "" ) {
		ErrorArray[ErrorArray.length] = field; 
		Text[field.name] = Label[field.name] + " is a required field";
	} else if (( field.value.indexOf("http://") == -1 ) && ( field.value.indexOf("https://") == -1 )) {
		ErrorArray[ErrorArray.length] = field; 
		Text[field.name] = Label[field.name] + " requires properly formatted URL";
	}
}
function displayValidationErrors() {
	var errwin = window.open( "", "Validation", "status=no,width="+wd+",height="+(ErrorArray.length*30+(65))+",top="+(screen.height-(ErrorArray.length*30+(65)))/2+",left=" +(screen.width-wd)/2+",scrollbars=no,resizable=yes" );
	errwin.document.open( "text/html" );
	errwin.document.write( "<html>\n" );
	errwin.document.write( "<head><title>Validation Error<\/title>\n" );
	errwin.document.write( "\n<script type=\"text/javascript\" language=\"javascript\">\n" );
	errwin.document.write( "function goTo( field ) { \n" );
	errwin.document.write( "\tvar fobj = opener.document.forms["+PageForm+"].elements[field] ? opener.document.forms["+PageForm+"].elements[field] : opener.document.forms["+PageForm+"].elements[field+\"[]\"];\n" );
	errwin.document.write( "\tif ( opener ) {\n" );
	errwin.document.write( "\t\tif ( fobj.type != null ) {\n" );
	errwin.document.write( "\t\t\tfobj.focus();\n" );
	errwin.document.write( "\t\t} else {\n" );
	errwin.document.write( "\t\t\tfobj[0].focus();\n" );
	errwin.document.write( "\t\t}\n" );
	errwin.document.write( "\t\twindow.close();\n" );
	errwin.document.write( "\t}\n" );
	errwin.document.write( "}\n" );
	errwin.document.write( "<\/script>\n" );
	errwin.document.write( "\n<style type=\"text/css\">\n" );	
	errwin.document.write( "body { background-color: #efefef; color: black; }\n" );
	errwin.document.write( ".Error { border: solid 2px silver; width=100%; padding: 1px; }\n" );
	errwin.document.write( ".Title { font-family: verdana; font-weight: bold; font-size: 10pt; text-align: center; color: black; background-color: silver; padding: 0px; }\n" );
	errwin.document.write( ".TitleHeader { font-family: verdana; font-size: 9pt; color: black; background-color: silver; padding: 0px; text-decoration: underline; }\n" );
	errwin.document.write( ".Item, .Item:hover { font-family: verdana; font-size: 9pt; color: black; padding: 0px; }\n" );
	errwin.document.write( "<\/style>\n" );
	errwin.document.write( "\n<\/head>\n" );
	errwin.document.write( "<body>\n" );
	errwin.document.write( "<div align=center><table class=Error border=0 cellspacing=0 cellpadding=5>\n" );
	errwin.document.write( "<tr class='Title' align='center' valign='center'><td>"+ErrorArray.length+" Validation Error(s) Found<\/td><\/tr>\n" );
	errwin.document.write( "<tr class='TitleHeader'><td>Error Description</td></tr>\n" );
	for ( i in ErrorArray ) {
		errwin.document.write( "<tr class='Item'"  + ( i % 2 == 0 ? " bgcolor=white>" : ">" ) );
		errwin.document.write( "<td valign=top>"+(parseInt(i)+1)+") <a href='javascript:goTo( \"" + ErrorArray[i].name + "\" );' class=\'Item\'>" + Text[ErrorArray[i].name] + "</a><\/td>" );
		errwin.document.write( "<\/tr>\n" );
	}
	errwin.document.write( "<\/table></div>\n" );
	errwin.document.write( "<\/body>\n" );
	errwin.document.write( "<\/html>" );
	errwin.document.close();
	errwin.focus();
}


/* example 
Req.Date1=true;
Label.Date1="Date 1 FIELD";
Type.Date1="date";

Req.Date2=true;
Label.Date2="Date 2 FIELD";
Type.Date2="date";
Spec.Date2="Date2<Date1";
SpecLabel.Date2="Date 2 must be less than Date 1";


Req.Date3=true;
Label.Date3="Date three (3) FIELD";
Type.Date3="date";
*/