if( typeof(ecarlist) !== 'object' ){ ecarlist = {}; }
ecarlist.form_validator = {
	init: function(){
		// SELECTS ALL FORMS ON THE PAGE AND APPLIES VALIDATION EVENT TO FORM ELEMENTS
		$('form').each(function(){ 
			var that = this;
			var form_settings = $(this).metadata();
			$(this).find(":input").each(function(){
				var ele_settings = $(this).metadata();
				if( $(this).hasClass('validation') ){
					ecarlist.form_validator.returnFunction([ ele_settings.event,
															 form_settings.event,
															 ecarlist.form_validator.onBlur ])(this);
					if( ele_settings.required ){
						$(this).parents('li:first').addClass('required');
					}
				}
			});
			$(this).bind('submit', function() { 
				var submit = ecarlist.form_validator.returnFunction([ form_settings.submit,
																	  ecarlist.form_validator.validateForm ])(that);
				return submit;
			});

			if (typeof(form_settings.focus) === 'object' && typeof(form_settings.focus.omniture) === 'object' && typeof(s_t) === 'function'){
				$(this).find(":input").each(function(){
					$(this).bind('focus',function(){
						if ($.data($(that).get(0),'lead_initialized')){
							return;
						}
						s_t(form_settings.focus.omniture);
						$.data($(that).get(0),'lead_initialized', true);
					});
				});
			};
		});
	},
	returnFunction: function(args){
		// RETURNS FIRST VALID FUNCTION
		for( var i = 0; i < args.length; i++ ){
			if( typeof(args[i]) == 'function' ){
				return args[i];
			}
		}
	},
	registerFunction: function(args){
		for( var i = 0; i < args.length; i++){
			ecarlist.form_validator[args[i].functionType][args[i].type] = args[i].func;
		}
	},
	onBlur: function(ele){
		// APPLIES VALIDATE FUNCTION TO BLUR EVENT - default action, can be overridden at the element or form level
		$(ele).bind('blur', function(){ ecarlist.form_validator.validateElement(ele); });
	},
	validateForm: function(form){
		valid = true;
		var form_settings = $(form).metadata();
		$(form).find(":input").each(function(){
			if( $(this).hasClass('validation') ){
				var valid_ele = ecarlist.form_validator.validateElement(this);
				if( valid_ele == false && valid ){
					valid = false;
				}
			}
		});
		if(valid){
			return true;
		} else {
			ecarlist.form_validator.returnFunction([	form_settings.form_failure,
																								ecarlist.form_validator.formFailure ])(form);
			return false;
		}
	},
	validateElement: function(ele){
		var form_settings = $(ele).parents('form').metadata();
		var ele_settings = $(ele).metadata();
		// REMOVE ANY MESSAGES ON CURRENT ELEMENT
		ecarlist.form_validator.returnFunction([	ele_settings.remove,
																							form_settings.remove,
																							ecarlist.form_validator.remove[ele_settings.type],
																							ecarlist.form_validator.remove.text ])(ele);
		if( !(ele_settings.required) && (!(ele.value) || ele.value == "" || ele.value == "-") ){
			return;
		}
		var valid = ecarlist.form_validator.returnFunction([	ele_settings.validator,
																													form_settings.validator,
																													ecarlist.form_validator.validators[ele_settings.type],
																													ecarlist.form_validator.validators.text ])(ele, ele_settings);
		if( valid ){
			ecarlist.form_validator.returnFunction([	ele_settings.success,
																								form_settings.success,
																								ecarlist.form_validator.success[form_settings.success],
																								ecarlist.form_validator.success[ele_settings.type],
																								ecarlist.form_validator.success.text ])(ele);
			return true;
		} else {
			ecarlist.form_validator.returnFunction([	ele_settings.failure,
																								form_settings.failure,
																								ecarlist.form_validator.failure[form_settings.failure],
																								ecarlist.form_validator.failure[ele_settings.type],
																								ecarlist.form_validator.failure.text ])(ele);
			return false;
		}
	},
	formFailure: function(form){
	},
	insertIcon: function(ele){
		if( $(ele).find('.validationIcon').length > 0 ){
			return;
		}
		var icon_div = document.createElement('div');
		$(icon_div).addClass('validationIcon');
		$(ele).append(icon_div);
	},
	failure: {
		text: function(ele){
			ecarlist.form_validator.failure.standard_failure(ele, 'Please complete required fields');
		},
		full_name: function(ele){
			ecarlist.form_validator.failure.standard_failure(ele, 'Please provide your first and last name');
		},
		numeric_only: function(ele){
			ecarlist.form_validator.failure.standard_failure(ele, 'Please enter a valid number (no commas)');
		},
		notify_numeric_only: function(ele){
			ecarlist.form_validator.failure.standard_failure(ele, 'Please select a start and end date');
		},
		email: function(ele){
			ecarlist.form_validator.failure.standard_failure(ele, 'Valid email required');
		},
		phone: function(ele){
			ecarlist.form_validator.failure.standard_failure(ele, 'Example: 555-555-5555');
		},
		zip_code: function(ele){
			ecarlist.form_validator.failure.standard_failure(ele, 'Example: 12345 or 12345-7879');
		},
		matched: function(ele, message){
			var mess = message || "Fields do not match";
			ecarlist.form_validator.failure.standard_failure(ele, mess);
		},
		no_message: function(ele){
			ecarlist.form_validator.failure.standard_failure(ele);
		},
		grouped: function(ele){
			var parent = $(ele).parents('li:first');
			ecarlist.form_validator.insertIcon(parent);
			$(parent).addClass('failure');
			var message = ecarlist.form_validator.failure.failure_message('Please complete required fields');
			$(ele).before(message);
		},
		standard_failure: function(ele, text){
			var parent = $(ele).parent();
			ecarlist.form_validator.insertIcon(parent);
			$(parent).addClass('failure');
			if(text){
				var message = ecarlist.form_validator.failure.failure_message(text);
				$(ele).before(message);
			}
		},
		failure_message: function(text){
			var message = document.createElement('p')
			$(message).html(text)
				.addClass('error_msg')
			return message;
		}
	},
	success: {
		text: function(ele){
			var parent = $(ele).parent();
			ecarlist.form_validator.insertIcon(parent);
			$(parent).addClass('success');
			$(ele).siblings('.error_msg').remove();
		},
		grouped: function(ele){
			var parent = $(ele).parents('li:first');
			ecarlist.form_validator.insertIcon(parent);
			$(parent).addClass('success');
			$(ele).siblings('.error_msg').remove();
		}
	},
	remove: {
		text: function(ele){
			$(ele).parent().removeClass('failure');
			$(ele).parent().removeClass('success');
			$(ele).siblings('.error_msg').remove();
		},
		grouped: function(ele){
			var parent = $(ele).parents('li:first');
			parent.removeClass('failure');
			parent.removeClass('success');
			$(ele).siblings('.error_msg').remove();
		}
	},
	validators: {
		text: function(ele, settings){
			if( ele.value && ele.value != "" ){
				return true;
			}
			return false;
		},
		full_name: function(ele, settings){
			var space = ele.value.indexOf(' ');
			if( ele.value && ele.value != "" && ( space > 0 && space < ele.value.length - 1 ) ){
				return true;
			}
			return false;
		},
		numeric_only: function(ele, settings){
			var numeric_regex = /^[0-9]+(\.[0-9]{0,2})?$/; ///^[0-9]*$/;
			if( $(ele).attr('value') && $(ele).attr('value') != "" ){
				return numeric_regex.test(ele.value);
			}
			return false;
		},
		notify_numeric_only: function(ele, settings){ 
			var numeric_regex =  /^[0-9]*$/;
			if( $(ele).attr('value') && $(ele).attr('value') != "" ){
				return numeric_regex.test(ele.value);
			}
			return false;
		},
		phone: function(ele, settings){
			var phone_regex = /^(1\s*[-\/\.]?)?(\((\d{3})\)|(\d{3}))\s*[-\/\.]?\s*(\d{3})\s*[-\/\.]?\s*(\d{4})\s*(([xX]|[eE][xX][tT])\.?\s*(\d+))*$/;
			return phone_regex.test(ele.value);
		},
		email: function(ele, settings){
			if( ele.value.indexOf('@') > 0 && (ele.value.lastIndexOf('.') > ele.value.indexOf('@') && ele.value.lastIndexOf('.') < ele.value.length - 2) ){
				return true;
			}
			return false;
		},
		zip_code: function(ele, settings){
			var zipcode_regex = /^\d{5}([\-]\d{4})?$/;
			return zipcode_regex.test(ele.value);
		},
		matched: function(ele, settings){
			matched_ele = $('#' + settings.matched_ele);
			if( ele.value == $(matched_ele).attr('value') && !($(matched_ele).parent('li:first').hasClass('failure')) ){
				return true;
			} else {
				return false; 
			}
		},
		grouped: function(ele, settings){
			var all_valid = true;
			$('.' + settings.group_name).each(function(){
				var that = this;
				var form_settings = $(this).parents('form').metadata();
				var ele_settings = $(this).metadata(); 
				var valid = ecarlist.form_validator.validators.text(this, ele_settings);
				if( !(valid) && all_valid ){
					all_valid = false;
				}
			});
			return all_valid;
		}
	}
}

$(document).ready(function(){
	ecarlist.form_validator.init();
});

