/*
 * Form Validator
 * 
 * Each field that you want validated should have a class of required as well as a validation type.
 * Supported Validation Types:
 * 
 * 		alpha
 * 		numeric
 * 		alphanumeric
 * 		email
 * 		selected
 * 		fileinpit
 * 
 * Example:
 * 		<input type="text" name="email_address" id="email_address" class="required email" />
 */
if(!tvh) var tvh = {};
tvh.FormValidator = (function(){
	var invalid_fields = new Array();
	var display_mode = 'box_above';
	
	function alpha(element, title, default_label) {
		var msg = 'Only alphabetic characters allowed';
		var regex = /\d/g;
		if(empty(element.value) || element.value == default_label) {
			msg = 'Please enter a value';
			invalid_fields.push({element:element, message:title+' - '+msg });
		} else if(element.value.search(regex)!=-1) { 
			invalid_fields.push({element:element, message:title+' - '+msg });	
		}
	};
	function numeric(element, title, default_label) {
		var msg = 'Only numeric characters allowed';
		var regex = /\D/g;
		if(empty(element.value) || element.value == default_label) {
			msg = 'Please enter a value';
			invalid_fields.push({element:element, message:title+' - '+msg });
		} else if(element.value.search(regex)!=-1) {
			invalid_fields.push({element:element, message:title+' - '+msg });	
		}
	};
	function alphanumeric(element, title, default_label) {
		var msg = 'Please enter a value';
		if(empty(element.value)) {
			invalid_fields.push({element:element, message:title+' - '+msg });
		}
	};
	function checked(element, title, number_checked, max_checked) {
	
		number_checked = number_checked ? number_checked : 1;
		max_checked = max_checked ? max_checked : "0";  /* 0 = unlimited */
		
		var msg = 'You must check at least '+number_checked+' checkbox(es).';
		var max_msg = 'You cannot check more than '+max_checked+' checkboxes.';
		var checked = 0;
		var input = element.getElementsByTagName('input')[0];
		var inputs = element.getElementsByTagName('input');
		
		var radios = (input.type == 'radio');
		if(!radios) { // CHECKBOXES
			for(var i=0; i<inputs.length; i++) {
				if(inputs[i].checked) {
					number_checked--;
					
					if(max_checked !== 0)
					{
						checked++;
					}
				}
			}
			
			if(number_checked <= 0 && max_checked == 0)
			{
				return;
			}
			 else if(number_checked <= 0 && max_checked == checked)
			{
				return;
			}
			
			invalid_fields.push({element:element, message:title+' - '+msg });
		} else {
			for(var i=0; i<inputs.length; i++) {
				if(inputs[i].checked) {
					return;
				}
			}
			invalid_fields.push({element:element, message:title+' - '+msg });
		}
	};
	function selected(element, title) {
		var msg = 'Please select an option.';
		var selected = element.options[element.selectedIndex];
		if(selected.value == -1) {
			invalid_fields.push({element:element, message:title+' - '+msg });	
		}
	};		
	function fileinput(element, title) {
		var msg = 'You need to choose a file to upload';
		if(empty(element.value)) {
			invalid_fields.push( {element:element, message:title+' - '+msg } );
		}
	};
	function terms(element, title) {
		var msg = 'You must accept the terms & conditions to submit your application.';
		if(!element.checked) {
			invalid_fields.push( {element:element, message:msg } );
		}
	};
	function email(element, title, default_label) {
		var msg = 'Email not in the correct format';
		var regex = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*\.(\w{2,})$/;
		if(element.value == "" || element.value == default_label) {
			invalid_fields.push({element:element, message:title+' - '+msg });
		} else if(element.value.search(regex) == -1) {
			invalid_fields.push({element:element, message:title+' - '+msg });
		}
	};		
	function empty(value){
		if(value == '') {
			return true;
		} else {
			return false;
		}
	};
	
	return function(form, requiredFields) {
		var required = requiredFields;
		this.clear_notifications = function(){
			invalid_fields = new Array();
			var n = required.length;
			for(var i=0; i<n; i++) {
				var cssClass = required[i].className.toString();
				if(cssClass.indexOf('error')!=-1) {
					required[i].className = cssClass.replace('error', '');
				}
			}
		};
		this.validate = function(){
			this.clear_notifications();
			if(required) {
				var n = required.length; var validation_type;
				for(var i=0; i<n; i++) {
					validation_type = required[i].className.replace('required', '');
					validation_type = validation_type.replace('alternate', '');
					validation_type = validation_type.replace('error', '');
					
					if(validation_type.indexOf('-')!=-1) {						
						var params = validation_type.split("-");						
						validation_type = params[0];						
						eval(validation_type).call(this, required[i], required[i].title, params[1], params[2]);
					} else {
						eval(validation_type).call(this, required[i], required[i].title, '');
					}
				}
				var n = invalid_fields.length;
				if(n > 0) {
					document.body.className = 'show-errors';
					return false;
				} else {
					return true;
				}
			}
		};
	};
})();
