/*******************************************************************
	BEGIN GENERIC FORM VALIDATION FUNCTIONS
*******************************************************************/
addEvent(window, "load", initializeForm);

function initializeForm(){

	var rf = getObjectRefByID('requiredFields');
	var theForm = getObjectRefByID('form');
	
	if(rf && theForm){
		rf = rf.value.split(',');
		for(var i=0;i<rf.length;i++){
			require(rf[i]);
		}
	}

	if(theForm){
		theForm.onsubmit = validateForm;
	}
}



function getObjectRefByID(objectId)	{
	var	element	= false;

	// cross-browser function to get an	object given its id
	if(document.getElementById && document.getElementById(objectId)) {
		// W3C DOM
		element	= document.getElementById(objectId);
	} 
	else if	(document.all && document.all(objectId)) {
		// MSIE	4 DOM
		element	= document.all(objectId);
	} 
	else if	(document.layers &&	document.layers[objectId]) {
		// NN 4	DOM.. note:	this won't find	nested layers
		element	= document.layers[objectId];
	} 

	return element;
} 


// these arrays are used to build the formValidate function at the end of a document
// loading
var jsRequiredFields = new Array(0);

var errMsg = '';

function require(field){
	/* field needs to be the ID of the object */
		// make sure the field being required isn't already required
		unrequire(field);
		// attempt to require the field
		jsRequiredFields.push(field);

		// make the field look required
		lookRequired(field);
}

function lookRequired(field){
	var vObj = getObjectRefByID(field).parentNode;

	if(vObj){
		vObj=removeRequirementClasses(vObj);
		vObj.className = vObj.className + ' required';
	}

}
function removeRequirementClasses(obj){
		obj.className = obj.className.replace(' optional','');
		obj.className = obj.className.replace(' required','');
		return obj
}
function lookUnRequired(field){
	var vObj = getObjectRefByID(field).parentNode;
	if(vObj){
		vObj=removeRequirementClasses(vObj);
		vObj.className = 'optional';
	}
}

function setFailedLook(obj){
	obj.className = obj.className + ' failedField';
}
function setPassedLook(obj){
	obj.className = obj.className.replace(' failedField','');
}

function insertSpanSibling(obj,msg,cssClass){
	var newSpan = document.createElement('SPAN');
	newSpan.innerHTML = msg;
	obj = obj.nextSibling;
	if(obj.readOnly)
		obj = obj.nextSibling;
	if(cssClass)
		newSpan.className = cssClass;

	obj.parentNode.insertBefore(newSpan,obj);
}



function unrequire(field){
	// find the field and remove it from the array - then remove
	// the correlating type and discription.
	for (i=0; i < jsRequiredFields.length; i++){
		if (jsRequiredFields[i] == field) {
			jsRequiredFields.pop(i);
		}
	}

	// make the field look unrequired
		lookUnRequired(field);
}



function displayEntryWarning(obj){
	var msg = obj.title + ' is not a valid ' + obj.className;
		switch (obj.className.toUpperCase()) {
		case 'NUMBER':
			msg = msg + '\n it must be a number';
			break;
		case 'DATE':
			msg = msg + '\n must in format mm/dd/yyyy';
			break;
		case 'EMAIL':
			msg = msg + ' address';
			break
		case 'SSN':
			msg = msg + '\n use format 999-99-9999 or 99999999';
			break
		case 'ZIPCODE':
			msg = msg + '\n use format 99999 or 99999-9999';
			break;
		default:
			break;
		
		}
	

	alert(msg);
}


function isRequired(field){
	var Fields = jsRequiredFields;
	var isrequired = false;
	var fcount = 0;

	for(fcount=0;fcount<Fields.length;fcount++){
		if(Fields[fcount] == field){
			isrequired = true;
			break;
		}
	
	}

	return isrequired;
	

}

function validateForm(){

	var Fields = jsRequiredFields;

	var formgood = true;
	// make sure all of the required fields are supplied

	for (var fieldcount=0; fieldcount < Fields.length; fieldcount++){
		if (Fields[fieldcount]) {
			var objField = getObjectRefByID(Fields[fieldcount]);
			if (!objField){
				BuildMsg('error occured when validating field ' + Fields[fieldcount]);
			}else {
				/* remove any bogus classnames that might cause us problems... */
				var fieldType = objField.className.replace(' failedField','');
				fieldType = fieldType.replace(' focus','');


				if(!hasValue(objField,fieldType)) {
					BuildMsg(objField.title);
					setFailedLook(objField);
				} else {
					setPassedLook(objField);
				}
			}
		}
	}

	// items havn't been supplied that are required
	if (errMsg.length) {
		dspMsg();
		formgood = false;
	}
	// all required items are available
	return formgood;
}

function BuildMsg(msg){
	errMsg = errMsg + msg + '\n';
}

function ClearMsg(){
	errMsg = '';
}

function dspMsg(quiet){
		errMsg = 'This form requires the following:  \n \n' +
				 errMsg + '\n';
		alert(errMsg);
		ClearMsg();
}



function isValidPhoneNumber(s){
	var pat = "^";
	var exp;
		// BEGIN THE ARA CODE GROUPING
		pat = pat + "(";
			// OPTIONAL OPENING (
			pat = pat + "\\(?";
			// 3 DIGIT AREA CODE
			pat = pat + "\\d{3}";
			// OPTIONAL CLOSING )
			pat = pat + "\\)?";
			// OPTIONAL DASH OR SPACE BETWEEN AREA CODE AND PREFIX
			pat = pat + "(\\-| )?";
		// END THE AREA CODE GROUPING
		pat = pat + ")?";
	// PREFIX
	pat = pat + "\\d{3}";
	//OPTIONAL DASH OR SPACE BETWEEN PREFIX AND SUFFIX
	pat = pat + "(\\-| )?";
	// SUFFIX
	pat = pat + "\\d{4}";
	// OPTIONAL SPACE
	pat = pat + "\\s?";
	// OPTIONAL EXTENSION ID - xt, ext, x, space, or dash
	pat = pat + "(\\-|x|X|ext|EXT|ex|EX| )?";
	// OPTIONAL SPACE
	pat = pat + "\\s?";
	// OPTIONAL EXTENSION UP TO 6 NUMBERS
	pat = pat + "\\d{0,6}?";
	// END OF INPUT
	pat = pat + "$";
	exp = new RegExp(pat);
	return exp.test(s);
}



function isValidZipCode(s) {
	return s.match(/\d{5}(-\d{4})?/) != null;
}

function isValidSelectBox(o) {
	return (o.options[o.selectedIndex].value != "_none_" && 
			o.options[o.selectedIndex].value.trim() != "")
}

function isValidEmailAddress(s) {
	var temp = s.replace(/\s/g, "")
	return temp.match(/^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$/);
}

function isValidDate(s){
	return s.match(/^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/);
}

function isValidState(s,cc){
		// compare states
	if(cc == 'usa') {
		return s.match(/^(AK|AL|AR|AZ|CA|CO|CT|DC|DE|FL|GA|HI|IA|ID|IL|IN|KS|KY|LA|MA|MD|ME|MI|MN|MO|MS|MT|NB|NC|ND|NH|NJ|NM|NV|NY|OH|OK|OR|PA|RI|SC|SD|TN|TX|UT|VA|VT|WA|WI|WV|WY)$/i);
	}else if(cc == 'canada') {
		return s.match(/^(AB|BC|MB|NB|NL|NT|NS|NU|ON|PE|QC|SK|YT)$/i);	
	}
}

function isValidSSN(s){
	return s.match(/^\d{3}\-\d{2}\-\d{4}$/);
}

function isValidTime(s){
	return s.match(/^([1-9]|1[0-2]):[0-5]\d$/);
}
function isValidIPAddress(s){
	return s.match(/^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/);
}
function isValidCurrency(s){
	return s.match(/\$\d{1,3}(,\d{3})*\.\d{2}/);
}

function isNumeric(s){
	return (!isNaN(s.trim()) && s.trim().length>0);
}

function fixFloat(val,dec,sep)
{ // fixed decimal fields 
  var sign= ( val < 0 ? '-': '' );
  val= Number(Math.round(Math.abs(val)*Math.pow(10,dec))).toString();
  while(val.length < dec) val= '0'+val;
  var len= val.length;
  val= sign + ( len == dec ? '0' : val.substring(0,len-dec) ) + '.' + val.substring(len-dec,len+1);

  return val;
}

function isValidData(obj,obj_type){
	var goodValue = false;
	var maxlength = 0;

	if(obj.value.length){
		switch (obj_type.toUpperCase()) {
		case 'NUMBER':
			goodValue = isNumeric(obj.value);
			break;
		case 'DATE':
			goodValue = isValidDate(obj.value);
			break;
		case 'PHONE':
			goodValue = isValidPhoneNumber(obj.value);
			break;
		case 'EMAIL':
			goodValue = isValidEmailAddress(obj.value);
			break
		case 'SSN':
			goodValue = isValidSSN(obj.value);
			break
		case 'ZIPCODE':
			goodValue = isValidZipCode(obj.value);
			break;
		default:
			goodValue = true;
			break;
		
		}
	} else {
		goodValue = true;
	}


	// make sure the content of the object isn't more than the allowable limit
	if (obj.getAttribute('maxlength')){
		maxlength = parseInt(obj.getAttribute('maxlength'));
		if(obj.value.length > maxlength){
			obj.value = obj.value.substring(0,maxlength);
		}
	}

	return goodValue;
}

function textAreasMaxLengthInit() {

	// Find all textareas attach some javascript to limit their maxLength values
	if (!document.getElementsByTagName) return;

	objs = document.getElementsByTagName("textarea");
	for (oi=0;oi<objs.length;oi++) {
		thisObj = objs[oi];
		addMaxLength(thisObj);
		thisObj.onchange = saveEntryValue;
	}

}

function addMaxLength(thisObj){
	if (thisObj.getAttribute('maxlength')){
		thisObj.onkeyup = forceMaxLength;
		insertSpanSibling(thisObj,thisObj.value.length + '/' + thisObj.getAttribute('maxlength') + ' of maximum length used');
	}
}

function forceMaxLength(){
	var maxLength = parseInt(this.getAttribute('maxlength'));
	if(this.value.length > maxLength){
		this.value = this.value.substring(0,maxLength);
	}

	this.nextSibling.innerHTML = this.value.length + '/' + maxLength + ' of maximum length used';
}

function hasValue(obj,obj_type){
	var goodValue;
		switch (obj_type.toUpperCase())
		{
		case 'TEXT':
			if (obj.value.trim().length == 0) 
				goodValue = false;
			else
				goodValue = true;
			break;

		case 'NUMBER':
			goodValue = isNumeric(obj.value.trim());
			break;
		case 'PASSWORD':
			if (obj.value.trim().length == 0) 
				goodValue = false;
			else
				goodValue = true;
			break;
		case 'CONFIRM': /* only usable on secondary password field when primary password field id is 'txtPassword' */
			if (obj.value.trim().length == 0) {
				goodValue = false;
			} else {
				var pw = getObjectRefByID('txtPassword');
				if(pw.value != obj.value){
					goodValue = false;
				} else {
					goodValue = true;
				}
			}
			break;
		case 'DATE':
			goodValue = isValidDate(obj.value);
			break;
		case 'PHONE':
			goodValue = isValidPhoneNumber(obj.value);
			break;
		case 'EMAIL':
			goodValue = isValidEmailAddress(obj.value);
			break

		case 'SSN':
			goodValue = isValidSSN(obj.value);
			break
			
		case 'ZIPCODE':
			goodValue = isValidZipCode(obj.value);
			break;

		case 'SELECT':
			goodValue = false;
			for (i=0; i < obj.length; i++) {
				if (obj.options[i].selected && (obj.options[i].value != '' && obj.options[i].value != 0)) 
					goodValue = true;
			}
			break;

		case 'RADIO':
			goodValue = false;

			if (obj.length) {
				for (i=0; i < obj.length; i++) {
					if (obj[i].checked)
						goodValue = true;
				}
			}
			else {
				goodValue = obj.checked;
			}
			break;
		case 'CHECKBOX':
			goodValue = false;

			if (obj.length) {
				for (i=0; i < obj.length; i++) {
					if (obj[i].checked)
						goodValue = true;
				}
			}
			else {
				goodValue = obj.checked;
			}
			break;
			

		default:
			goodValue = false;
			break;
		
		}
		return goodValue
}
/*******************************************************************
	END GENERIC FORM VALIDATION FUNCTIONS
*******************************************************************/

/*************************************************************************/
/*  BEGIN OF onblur Event Handlers
/*************************************************************************/

function textFieldBlurHandler() {
	this.value = this.value.trim()
}


function timeFieldBlurHandler() {
	var t = new Time(this.value)
	if (!isNaN(t)) this.value = t.getHumanTimeString()
}

function phoneFieldBlurHandler() {
	var temp = this.value.stripNonDecimal()

	if (temp.length > 9 && temp.length < 26){
		if (temp.length == 10) {
			this.value = "(" + temp.substring(0,3) + ")" 
			this.value += temp.substring(3,6) + "-" + temp.substring(6,10)
		}
	}
}

function zipcodeFieldBlurHandler() {
	var temp = this.value.stripNonDecimal()

	if (temp.length == 5 || temp.length == 9) { 
		if (temp.length == 5) this.value = temp
		else this.value = temp.substring(0,5) + "-" + temp.substring(5,9)
	}
}


function floatFieldBlurHandler(){
	if(this.value.length){
		var thisValue = parseFloat(this.value);
		thisValue = fixFloat(thisValue,1,".");
		this.value = thisValue;
	}
}

function intFieldBlurHandler(){
	var tv = this.value;
	if(tv.length){
		tv = parseInt(tv);
	} else{
		tv = ''
	}

	if(isNaN(tv))
		tv = '';
	this.value = tv;
}

function ssnFieldBlurHandler(){
  var val = this.value.stripNonDecimal();
  this.value= val.substring(0,3)+'-'+val.substring(3,5)+'-'+val.substring(5,12);
}

function dateFieldBlurHandler() {
		var d = new Date(this.value)
		if (!isNaN(d)) {
			// if the user didn't specify the century/millenium,
			// then assume the present.
			if (this.value.search(/\d{3}/) == -1) 
				d.setYear(Math.floor((new Date()).getFullYear() / 100) * 100 + d.getFullYear() % 100);

			this.value = d.getDateString();
		}
}
