/*
	Paladin Systems North Form Validation Library
	Jason M. Knight, June 2008
*/

var errorMode='numeric';


function classExtract(value,prefix) {
	searchList=value.split(/ /);
	for (var t=0; t<searchList.length; t++) {
		if (searchList[t].search(prefix)==0) {
			return searchList[t].replace(prefix,'');
		}
	}
	return (errorMode=='numeric' ? -1 : 'error');
}

function labelText(target) {
	var tmp=target.parentNode.innerHTML.replace(/[\0\n\f\r\t\v]/g,'');
	var t=tmp.search(/</);
	return tmp.substr(0,t);
}

function verifyFormElement(target) {
	var errorString='';
	target.className=target.className.replace(' v_error','');
	if (target.className.search(/\bv_/)!=-1) {
		if (target.value=='') {
			if (target.className.search(/\bv_required\b/)!=-1) {
				errorString+=labelText(target)+' is a required field\n';
				target.className+=' v_error';
			}
		} else {
			verifyType=classExtract(target.className,'v_value_');
			switch (verifyType) {
				case 'email':
	      	var check=target.value.indexOf('@');
	        if (check<1 || check>(target.value.length-5)) {
	        	errorString+=labelText(target)+' must contain a valid e-mail address.\n';
						target.className+=' v_error';
	        }
				break;
				case 'integer':
				case 'real':
					var check=parseFloat(target.value);
					if ((verifyType=='integer') && (check!=Math.floor(check))) {
	        	errorString+=target.name+' must contain a numeric value .\n';
						target.className+=' v_error';
					} else {
						if (isNAN(check)) {
		        	errorString+=target.name+' must contain a number.\n';
							target.className+=' v_error';
	        	} else {
	        		errorMode='alpha';
	        		min=classExtract(target.className,'v_min_');
	        		max=classExtract(target.className,'v_max_');
	        		if (min=='error') {
	        			if ((max!='error') && (check>max)) {
	        				errorString+=target.name+' must be less than or equal to '+max+'\n';
									target.className+=' v_error';
	        			}
	        		} else {
	        			if ((max=='error') && (check<min)) {
	        				errorString+=target.name+' must be greater than or equal to'+min+'\n';
	        			} else if ((check<min) || (check>max)) {
	        				errorString+=target.name+' must be between '+min+' and '+max+'\n';
	        			}
								target.className+=' v_error';
	        		}
	        		errorMode='numeric';
	        	}
	        }
				break;
			}
		}
	}
	return errorString;
}

function verifyForms(target) {
	var errorString='';
	var processList=target.getElementsByTagName('input');
	for (var t=0; t<processList.length; t++) {
		errorString+=verifyFormElement(processList[t]);
	}
	var processList=target.getElementsByTagName('textarea');
	for (t=0; t<processList.length; t++) {
		errorString+=verifyFormElement(processList[t]);
	}
	if (errorString!='') {
		alert(
			'The following errors were detected\n\n'+
			errorString+
			'\nPlease correct these errors and try again.\n '
		);
		return false;
	} else return true;
}
