// Form Validation
var val_errors = '';


/********************************************************************************
 * function validateForm
 ********************************************************************************
 *
 * Description
 * ---------------
 * Performs error checking on the form and
 *
 * @param form: 	Form to check for errors
 *
 * @return bool:	Whether or not the form is error free
 *
 ********************************************************************************/

function validateForm(form) {
	val_errors = '';
	inputs = form.getElementsByTagName('input');
	textareas = form.getElementsByTagName('textarea');
	selects = form.getElementsByTagName('select');
	
	for ( var x = 0; x < inputs.length; x++ ) {
		if ( inputs[x].getAttribute('rel') ) {
			if ( inputs[x].tagName == 'INPUT' ) {
				if ( inputs[x].type == 'radio' ) {
					val_errors += validateRadio(form, inputs[x], inputs[x].getAttribute('rel'), inputs[x].getAttribute('valmsg'));
				} else {
					val_errors += validateInput(inputs[x], inputs[x].getAttribute('rel'), inputs[x].getAttribute('valmsg'));
				}
			}
		}
	}
	
	for ( var x = 0; x < textareas.length; x++ ) {
		if ( textareas[x].getAttribute('rel') ) {
			val_errors += validateInput(textareas[x], textareas[x].getAttribute('rel'), textareas[x].getAttribute('valmsg'));
		}
	}
	
	for ( var x = 0; x < selects.length; x++ ) {
		if ( selects[x].getAttribute('rel') ) {
			if ( selects[x].tagName == 'SELECT' ) {
				val_errors += validateSelect(selects[x], selects[x].getAttribute('rel'), selects[x].getAttribute('valmsg'));
			}
		}
	}
	
	if ( val_errors ) {
		if ( document.getElementById('maskArea') ) {
			throwMessage('Form Submission Error', val_errors.replace(/\n/g, "<br/>"),  true);
		} else {
			alert(val_errors);
		}
		return false;
	} else {
		return true;
	}
}



/********************************************************************************
 * function validateInput
 ********************************************************************************
 *
 * Description
 * ---------------
 * Helper function for attaching events to elements, removing the need to do 
 * browser-related checks everywhere.
 *
 * @param elem: 	Element being checked
 * @param rules: 	Validation rules to apply
 * @param valmsg: 	Message to show if validation fails
 *
 * @return string:	Any error message for this element
 *
 ********************************************************************************/

function validateInput(elem, rules, valmsg) {
	if ( elem.getAttribute('fieldname') ) {
		var fName = elem.getAttribute('fieldname');
	} else {
		var fName = elem.name;
	}
	
	// Do required field checking
	if ( rules.indexOf('required') != -1 ) {
		if ( elem.type == 'checkbox' ) {
			if ( !elem.checked ) {
				elem.className += ' formError';
				
				if ( valmsg ) {
					return valmsg + "\n";
				} else {
					return fName + " must be checked.\n";
				}
			}
		} else if ( elem.type == 'radio' ) {
			// Handled elsewhere
		} else if ( elem.type == 'submit' ) {
			// No checking!
		} else if ( elem.type == 'button' ) {
			// No checking!
		} else if ( elem.type == 'image' ) {
			// No checking!
		} else {
			if ( elem.value.length < 1 ) {
				elem.className += ' formError';
				
				if ( valmsg ) {
					return valmsg + "\n";
				} else {
					return fName + " is a required field.\n";
				}
			}
		}
	}
	
	// Do int checking
	if ( rules.indexOf('int') != -1 ) {
		if ( elem.type == 'text' ) {
			if ( !(parseInt(elem.value) == elem.value && parseInt(elem.value).toString() == elem.value.toString())  ) {
				elem.className += ' formError';
				return fName + " must be a number.\n";
			}
		}
	}
	
	// Do float checking
	if ( rules.indexOf('float') != -1 ) {
		if ( elem.type == 'text' ) {
			if ( !(parseFloat(elem.value) == elem.value && parseFloat(elem.value).toString() == elem.value.toString())  ) {
				elem.className += ' formError';
				return fName + " must be a number.\n";
			}
		}
	}
	
	// Remove error class on element since there were no errors
	elem.className = elem.className.replace(/formError/g, '');
	
	return '';
}



/********************************************************************************
 * function validateRadio
 ********************************************************************************
 *
 * Description
 * ---------------
 * Does some special checking to see if a radio button is selected from a group
 * of options
 *
 * @param form: 	Form that is being checked for errors
 * @param elem: 	Element being checked
 * @param rules: 	Validation rules to apply
 * @param valmsg: 	Message to show if validation fails
 *
 * @return string:	Any error message for this element
 *
 ********************************************************************************/

function validateRadio(form, elem, rules, valmsg) {
	if ( elem.getAttribute('fieldname') ) {
		var fName = elem.getAttribute('fieldname');
	} else {
		var fName = elem.name;
	}
	
	// Do required field checking
	if ( rules.indexOf('required') != -1 ) {
		var radios = form[elem.name].length;
		var checked = false;
		
		for ( idx = 0; idx < radios; idx++ ) {
			if ( form[elem.name][idx].checked ) {
				checked = true;
			}
		}
		
		if ( !checked ) {
			if ( valmsg ) {
				return valmsg + "\n";
			} else {
				return fName + " is a required field.\n";
			}
		}
	}
	
	return '';
}



/********************************************************************************
 * function validateSelect
 ********************************************************************************
 *
 * Description
 * ---------------
 * Does some special checking to see if a select box has been appropriately 
 * changed
 *
 * @param elem: 	Element being checked
 * @param rules: 	Validation rules to apply
 * @param valmsg: 	Message to show if validation fails
 *
 * @return string:	Any error message for this element
 *
 ********************************************************************************/

function validateSelect(elem, rules, valmsg) {
	if ( elem.getAttribute('fieldname') ) {
		var fName = elem.getAttribute('fieldname');
	} else {
		var fName = elem.name;
	}
	
	// Do required field checking
	if ( rules.indexOf('required') != -1 ) {
		
		if ( !elem.options[elem.selectedIndex].value ) {
			elem.className += ' formError';
				
			if ( valmsg ) {
				return valmsg + "\n";
			} else {
				return fName + " is a required field.\n";
			}
		}
	}
	
	// Remove error class on element since there were no errors
	elem.className = elem.className.replace(/formError/g, '');
	
	return '';
}