$.extend($.ford, {validation: {}});
$.extend($.ford, {Validation: $.ford.validation});
$.extend($.ford.validation, {types: ['required', 'postal', 'email', 'email2', 'phone', 'year', 'number']});
$.extend($.ford.validation, {init: function() {
	$.each($('form[data-validate="true"] :input[data-validation]'), function(key, item) {
		var validation = $(item).attr('data-validation');
			$(item).bind('change', function() {
				return Ford.Validation.validate.input(item);
			});
			$(item).bind('keyup, focusout', function() {
				return Ford.Validation.validate.input(item);
			});
	});
}});
$.extend($.ford.validation, {hasLocation: function() {
	return !($.ford.vars.get('prov') == 'UN' && $.cookie('zip_ignore') == null);
}});
$.extend($.ford.validation, {isCalZip: function(zip) {
	// Matches Canadian PostalCode formats with or without spaces (e.g., "T2X 1V4" or "T2X1V4")
	// ^[ABCEGHJKLMNPRSTVXY]{1}\d{1}[A-Z]{1} *\d{1}[A-Z]{1}\d{1}$
	if(zip) {
		var regx = new RegExp('^[ABCEGHJKLMNPRSTVXY]{1}\\d{1}[A-Z]{1} *\\d{1}[A-Z]{1}\\d{1}$');
		return regx.test(zip.toUpperCase());		
	} else {
		return false;
	}
}});
$.extend($.ford.validation, {isNumber: function(val) {
	if(val.length == 0) {
		return true;
	}
	var regx = new RegExp('^-?(\\d?,?\\d)+(?:\\.\\d+)?$');
	return regx.test(val);	
}});
$.extend($.ford.validation, {isPostal: function(string) {
	// Matches Canadian PostalCode formats with or without spaces (e.g., "T2X 1V4" or "T2X1V4")
	// ^[ABCEGHJKLMNPRSTVXY]{1}\d{1}[A-Z]{1} *\d{1}[A-Z]{1}\d{1}$
	var regx = new RegExp('^[ABCEGHJKLMNPRSTVXY]{1}\\d{1}[A-Z]{1} *\\d{1}[A-Z]{1}\\d{1}$');
	return regx.test(string.toUpperCase());	
}});

$.extend($.ford.validation, {validate: {}});
$.extend($.ford.validation.validate, {form: function(form, markInvalid) {
	var valid = true;
	$.each($(form).find(":input[data-validation]"), function(key, obj) {
		if($(obj).data('validation').indexOf('visible') > -1) {
			if($.ford.validation.check.visible(obj) == false) {
				return true;
			}
		}
		$.each($.ford.validation.types, function(key, type) {
			if($(obj).data('validation').indexOf(type) == -1) return;
			if(eval('$.ford.validation.check.' + type)(obj)) {
				if(markInvalid) {
					$(obj).addClass('error');
				}
				valid = false;
			}
		});
	});
	return valid;
}});
$.extend($.ford.validation.validate, {input: function(obj) {
	$(obj).removeClass('error');
	if($(obj).data('validation').indexOf('visible') > -1) {
		if($.ford.validation.check.visible(obj) == false) {
			return true;
		}
	}
	$.each($.ford.validation.types, function(key, type) {
		if($(obj).data('validation').indexOf(type) == -1) return;
		if(eval('$.ford.validation.check.' + type)(obj)) {
			$(obj).addClass('error');
			return false;
		}
	});
	return true;
}});

// $.ford.validation.input methods
$.extend($.ford.validation, {check: {}});
$.extend($.ford.validation.check, {visible: function(obj) {
	return $(obj).is(':visible');
}});
$.extend($.ford.validation.check, {required: function(obj) {
	return $.ford.validation.input.isEmpty(obj);
}});
$.extend($.ford.validation.check, {postal: function(obj) {
	return !$.ford.validation.input.isCaZip(obj);
}});
$.extend($.ford.validation.check, {email: function(obj) {
	return !$.ford.validation.input.isEmail(obj);
}});
$.extend($.ford.validation.check, {email2: function(obj) {
	return !$.ford.validation.input.isEmail2(obj);
}});
$.extend($.ford.validation.check, {phone: function(obj) {
	return !$.ford.validation.input.isPhone(obj);
}});
$.extend($.ford.validation.check, {number: function(obj) {
	return !$.ford.validation.isNumber($(obj).val());
}});
$.extend($.ford.validation.check, {year: function(obj) {
	var length = $(obj).val().length;
	if(length == 0) {
		return false;
	} else if(length == 4) {
		var regx = new RegExp('^\\d\{4}$');
		return !regx.test($(obj).val());
	}
	return true;
}});

// $.ford.validation.input methods
$.extend($.ford.validation, {input: {}});
$.extend($.ford.validation.input, {isCaZip: function(obj) {
	// Matches Canadian PostalCode formats with or without spaces (e.g., "T2X 1V4" or "T2X1V4")
	// ^[ABCEGHJKLMNPRSTVXY]{1}\d{1}[A-Z]{1} *\d{1}[A-Z]{1}\d{1}$
	var regx = new RegExp('^[ABCEGHJKLMNPRSTVXY]{1}\\d{1}[A-Z]{1} *\\d{1}[A-Z]{1}\\d{1}$');
	return regx.test($(obj).val().toUpperCase());
}});
$.extend($.ford.validation.input, {isEmpty: function(obj) {
	var val;
	if($(obj).attr('type') == "select-one") {
		val = $(obj).children('option:selected').val();
	} else if($(obj).attr('type') == 'checkbox') {
		return !$(obj).is(':checked');
	} else {
		val = $(obj).val();
	}
	return val == "";
}});
$.extend($.ford.validation.input, {isEmail: function(obj) {
	var regx = new RegExp('^([0-9a-zA-Z]([-\\.\\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\\w]*[0-9a-zA-Z]\\.)+[a-zA-Z]{2,9})$');
	return regx.test($(obj).val());	
}});
$.extend($.ford.validation.input, {isEmail2: function(obj) {
	if($("#email2").val() == $("#email").val()){
		return $("#email2").val();
	}
}});
$.extend($.ford.validation.input, {isPhone: function(obj) {
	var regx = new RegExp('^(\\+?1[- ]?)?\\(?(\\d{3})\\)?[\\s-]?(\\d{3})[\\s-]?(\\d{4})$');
	return regx.test($(obj).val());
}});
