// ### Validation Functions ### //

var PHPForm = new Object();
PHPForm.val_required = Array();
PHPForm.val_regex = Array();
PHPForm.val_numeric = Array();
PHPForm.val_callback = Array();

PHPForm.add_required = function add_required (elname, form, valnum) {
	// Add element name to required array
	PHPForm.val_required.push (Array(elname, form, valnum));
}

PHPForm.add_numeric = function (elname, form, valnum) {
	// Add element name to numeric array
	PHPForm.val_numeric.push (Array(elname, form, valnum));
}

PHPForm.add_regex = function (elname, form, valnum, regex) {
	// Add element name to regex array
	PHPForm.val_regex.push (Array(elname, form, valnum, regex));
}

PHPForm.add_callback = function (elname, form, valnum, callback) {
	// Add element name to callback array
	PHPForm.val_callback.push (Array(elname, form, valnum, callback));
}

PHPForm.do_regex_validate = function (formel) {
	var returnval = true;

	// Loop regex
	for (var i = 0; i < PHPForm.val_regex.length; i++ ) {
		// Get variables
		var temp = PHPForm.val_regex[i];
		var elname = temp[0];
		var form = temp[1];
		var valnum = temp[2];
		var regex = temp[3]

		// Check form
		if (typeof(formel.__FORM.value) != 'string' || form != formel.__FORM.value) { continue; }

		// Get element
		el = formel.elements[elname];
		el_value = PHPForm.get_value(el);

		// Check regex
		if (!el_value.match(regex)) {
			// Show validator
			PHPForm.show(form + '_validator_' + valnum);
			returnval = false;
		} else {
			// Hide validator
			PHPForm.hide (form + '_validator_' + valnum);
		}
	}

	return returnval;
}

PHPForm.do_callback_validate = function (formel) {
	var returnval = true;

	for (var i = 0; i < PHPForm.val_callback.length; i++ ) {
		// Get variables
		var temp = PHPForm.val_callback[i];
		var elname = temp[0];
		var form = temp[1];
		var valnum = temp[2];
		var callback = temp[3];

		// Check form
		if (typeof(formel.__FORM.value) != 'string' || form != formel.__FORM.value) { continue; }

		// Get element
		el = formel.elements[elname];
		el_value = PHPForm.get_value(el);

		// Create code
		code = "if (window." + callback + ") {\n";
			code = code + "if (typeof(el_value) == 'string' && " + callback + "(el_value) == true) {\n";
			code = code + "result = true;\n";
			code = code + "} else {\n";
			code = code + "result = false;\n";
			code = code + "}\n";
		code = code + "} else {\n";
		code = code + "result = null;\n";
		code = code + "}";

		// Execute code
		eval(code);

		// Check result
		if (result == false) {
			// Show validator
			PHPForm.show(form + '_validator_' + valnum);
			returnval = false;
		} else if (result == true) {
			// Hide validator
			PHPForm.hide (form + '_validator_' + valnum);
		} 
	}

	return returnval;
}

PHPForm.do_required_validate = function (formel) {
	var returnval = true;

	// Loop required
	for (var i = 0; i < PHPForm.val_required.length; i++ ) {
		// Get variables
		var temp = PHPForm.val_required[i];
		var elname = temp[0];
		var form = temp[1];
		var valnum = temp[2];

		// Check form
		if (typeof(formel.__FORM.value) != 'string' || form != formel.__FORM.value) { continue; }

		// Get element
		el = formel.elements[elname];
		el_value = PHPForm.get_value(el);

		// Check value
		if (el_value == null || el_value == '') {
			// Show validator
			PHPForm.show(form + '_validator_' + valnum);
			returnval = false;
		} else {
			// Hide validator
			PHPForm.hide (form + '_validator_' + valnum);
		}
	}

	return returnval;
}

PHPForm.do_numeric_validate = function (formel) {
	var returnval = true;

	// Loop numeric
	for (var i = 0; i < PHPForm.val_numeric.length; i++ ) {
		// Get variables
		var temp = PHPForm.val_numeric[i];
		var elname = temp[0];
		var form = temp[1];
		var valnum = temp[2];

		// Check form
		if (typeof(formel.__FORM.value) != 'string' || form != formel.__FORM.value) { continue; }

		// Get element
		// Get element
		el = formel.elements[elname];
		el_value = PHPForm.get_value(el);

		// Check value
		if (el_value == null || PHPForm.IsNumeric(el_value) == false) {
			// Show validator
			PHPForm.show(form + '_validator_' + valnum);
			returnval = false;
		} else {
			// Hide validator
			PHPForm.hide (form + '_validator_' + valnum);
		}
	}

	return returnval;
}

PHPForm.do_validate = function (e) {
	var cancel_submit = false;

	// Hide all error messages first
	PHPForm.hide_validators();

	// Get caller form name
	var formel = PHPForm.getTarget(e);

	// Do Required Validate
	if (PHPForm.do_required_validate(formel) == false) { cancel_submit = true; }

	// Do Numeric Validate
	if (PHPForm.do_numeric_validate(formel) == false) { cancel_submit = true; }

	// Do Regex Validate
	if (PHPForm.do_regex_validate(formel) == false) { cancel_submit = true; }

	// Do Callback Validate
	if (PHPForm.do_callback_validate(formel) == false) { cancel_submit = true; }

	// Should we stop the form from submitting?
	if (cancel_submit == true)
	{
		if (e && e.preventDefault) {
		e.preventDefault(); // DOM style
		}

		return false; // IE style
	}
}

PHPForm.hide_validators = function () {
	var spans = document.getElementsByTagName('span');

	// Loop through each span
	for (var i=0; i < spans.length;i++) {
		// Classname equals php_form_validator?
		if (spans[i].className == 'php_form_validator') {
			PHPForm.hide (spans[i]);
		}
	}
}

PHPForm.getElementByName = function (name, ownerform) {
	var els = document.getElementsByName(name);
	
	// Any matches?
	if (els.length < 1)	{ return null; }

	// Should we look for a particular form?
	if (ownerform == '' || ownerform == null) {
		// Make sure we actually return an object
		for (var i = 0;i < els.length;i++ ) {
			if (els[i].name) {
				return els[i];
			}
		}
	}

	for (var i = 0;i < els.length;i++ ) {
		// Correct form?
		if (els[i].form && els[i].form.__FORM.value == ownerform) {
			return els[i];
		}
	}
}

PHPForm.IsNumeric = function (strString) {
	var strValidChars = "0123456789.-,";
	var strChar;
	var blnResult = true;

	if (strString.length == 0) return false;

	//  test strString consists of valid characters listed above
	for (i = 0; i < strString.length && blnResult == true; i++) {
		strChar = strString.charAt(i);

		if (strValidChars.indexOf(strChar) == -1) {
			blnResult = false;
		}
	}

	return blnResult;
}

PHPForm.hide = function (element) {
	if (typeof(element) == 'string') {
		el = document.getElementById(element);
	} else if (typeof(element) == 'object') {
		el = element;
	} else {
		return false;
	}

	if (typeof(el) == 'object' && el != null && el.style) {
			el.style.display = 'none';
	}
}

PHPForm.show = function(element, display) {
	if (typeof(element) == 'string') {
		el = document.getElementById(element);
	} else if (typeof(element) == 'object') {
		el = element;
	} else {
		return false;
	}

	if (typeof(el) == 'object' && el != null && el.style) {
			el.style.display = '';
	}
}

PHPForm.addEventListener = function (target,type,callback,captures) {
	if (target.addEventListener) {
		// EOMB
		target.addEventListener(type,callback,captures);
	} else if (target.attachEvent) {
		// IE
		target.attachEvent('on'+type,callback,captures);
	} else {
		// IE 5 Mac and some others
		target['on'+type] = callback;
	}
}

PHPForm.getTarget = function(event) {
	if (event.target) {
		targ = event.target;
	} else if (event.srcElement) {
		targ = event.srcElement;
	}

	// Defeat Safari bug
	if (targ.nodeType == 3)	{
		targ = targ.parentNode;
	}

	return targ;
}

PHPForm.get_value = function (el) {
	// Is nodeList or not?
	if (typeof(el[0]) != 'object') {
		// Nope, just return value
		return el.value;
	}

	// Yes, nodeList: loop through it
	for (var i=0; i < el.length; i++) {
		var el_child = el[i];

		// Is checked?
		if (el_child.checked == true) {
			return el_child.value
		}
	}

	// If we reach this, then nothing has been checked
	return null;
}

// For Backwards Compatibility (with PHP:Form 1.0)
function add_required (elname, form, valnum) { PHPForm.add_required(elname, form, valnum); }
function add_numeric (elname, form, valnum) { PHPForm.add_numeric(elname, form, valnum); }
function add_regex (elname, form, valnum, regex) { PHPForm.add_regex(elname, form, valnum, regex); }
function add_callback (elname, form, valnum, callback) { PHPForm.add_callback(elname, form, valnum, callback); }
function do_validate (e) { return PHPForm.do_validate(e); }
function getElementByName (name, ownerform) { return PHPForm.getElementByName(name, ownerform); }
function addEventListener(target,type,callback,captures) { PHPForm.addEventListener(target,type,callback,captures); }







