// EXPERIMENTAL FORM SCRIPTS (Updated 2010-12-02)

// Rewrite of validateForm in jQuery compliant format. Works cross-browser.
// IMPORTANT: The validate mode 'cc' -REQUIRES- jQuery/cc.js to work. Otherwise, it will not.
// IMPORTANT: Conforms to HTML 5 standards. All custom attributes are prefixed with 'DATA-'.
// TODO: wholesalerActiveDates and notZeroActive modes (May not do these at all)
//
// Optional Args:
// @context: Validate fields that meet this context only. Defaults to the calling form tag. Used to validate specific sections of the form only.
function validateForm(id) {
	var validate = true;
	var formtag  = jQuery("form#" + id);
	var context  = (arguments.length > 1) ? jQuery(arguments[1]) : formtag;
	var formid   = jQuery(formtag).attr("id");
	var formname = jQuery(formtag).attr("name");

	// Validate All Input Elements with the Validate Attribute
	jQuery("input[data-validate],textarea[data-validate]",context).each(function() {
		var elemtype        = jQuery(this).attr("type");
		var elemid          = jQuery(this).attr("id");
		var elemvalue       = trim(jQuery(this).val());
		var elemdefault     = trim(jQuery(this).attr("default"));
		var validatemode    = jQuery(this).attr("data-validate").toLowerCase();
		var validatename    = jQuery(this).attr("data-validatename");
		var validatemessage = jQuery(this).attr("data-validatemessage");

		if(!validatename || validatename == "" || validatename == "undefined") validatename = elemid;
		if(!validatemessage || validatemessage == "" || validatemessage == "undefined") validatemessage = "";

		if(validatemode == "email") {
			if(!isValidEmail(elemvalue)) {
				if(validatemessage == "") { validatemessage = "The field " + validatename + " must be a valid email address."; }
				alert(validatemessage);
				validate = false;
			}
		} else if(validatemode == "cc") {
			if(!validCCForm(this) || elemvalue == "" || elemvalue == NULL) { validate = false; }
		} else if(validatemode == "requireddefault") {
			if(elemvalue == "") {
				if(validatemessage == "") validatemessage = "Please enter " +  validatename + " before submitting this form.";

				alert(validatemessage);
				validate = false;
			} else if(typeof(elemdefault) != 'undefined' && trim(elemdefault) == trim(elemvalue)) {
				if(validatemessage == "") validatemessage = "You must enter " +  validatename + " before submitting this form.";

				alert(validatemessage);
				validate = false;
			}
		} else if(validatemode == "notzero") {
			if(elemvalue == "" || elemvalue == "0" || elemvalue == 0 || elemvalue == 0.00) {
				if(validatemessage == "") validatemessage = validatename + " must be greater than 0.";

				alert(validatemessage);
				validate = false;
			}
		} else if(elemvalue == "" || elemvalue == elemdefault) {
			if(validatemessage == "") validatemessage = "You must enter " +  validatename + " before submitting this form.";

			alert(validatemessage);
			validate = false;
		}

		if(validate == false) {
			if(jQuery(this).is(":visible")) jQuery("html:not(:animated),body:not(:animated)").animate({ scrollTop: jQuery(this).offset().top },200);
			jQuery(this).select();
			jQuery(this).focus();
			return false;
		}
	});

	// Validate All Selects with the Validate Attribute
	if(validate == true) {
		jQuery("select[data-validate]",context).each(function() {
			var elemid          = jQuery(this).attr("id");
			var elemvalue       = jQuery.trim(jQuery(this).val());
			var elemdefault     = jQuery.trim(jQuery(this).attr("default"));
			var validatemode    = jQuery(this).attr("data-validate").toLowerCase();
			var validatename    = jQuery(this).attr("data-validatename");
			var validatemessage = jQuery(this).attr("data-validatemessage");
	
			if(!validatename || validatename == "" || validatename == "undefined") { validatename = elemid; }
			if(!validatemessage || validatemessage == "" || validatemessage == "undefined") { validatemessage = ""; }

			if(validatemode == "requireddefault") {
				if(validatemessage == "") validatemessage = "Please choose " +  validatename + " before submitting this form.";

				if(elemvalue == "") {
					alert(validatemessage);
					validate = false;
				} else if(typeof(elemdefault) != 'undefined' && trim(elemdefault) == trim(elemvalue)) {
					alert(validatemessage);
					validate = false;
				}
			} else if(validatemode == "notzero") {
				if(elemvalue == "" || elemvalue == 0 || elemvalue == 0.00) {
					if(validatemessage == "") validatemessage = validatename + " must be greater than 0.";

					alert(validatemessage);
					validate = false;
				}
			} else if(elemvalue == "" || elemvalue == elemdefault) {
				if(validatemessage == "") validatemessage = "Please choose " +  validatename + " before submitting this form.";

				alert(validatemessage);
				validate = false;
			}

			if(validate == false) {
				if(jQuery(this).is(":visible")) jQuery("html:not(:animated),body:not(:animated)").animate({ scrollTop: jQuery(this).offset().top },200);
				jQuery(this).select();
				jQuery(this).focus();
				return false;
			}
		});
	}

	// Loop and disable marked form elements.
	if(validate == true) {
		jQuery("[data-disableonsubmit]",context).each(function() {
			var disableItem = jQuery(this).attr("data-disableonsubmit");
			if(disableItem == true || disableItem.toLowerCase() == "yes" || disableItem.toLowerCase() == "true" || parseInt(disableItem) == 1) { jQuery(this).attr("disabled", true); }
		});

		// Record form_name in the FORM for submission
		if(!formname || trim(formname) == "") formname = formid;
		if(jQuery("#form_name",formtag).length == 0) jQuery(formtag).append('<INPUT TYPE="hidden" NAME="form_name" ID="form_name" VALUE="' + formname + '">');
	}

	return validate;
}

// Simple Regex Match for Email Addresses
function isValidEmail(e) { return (e.search(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/) != -1); }

// Limits the number of characters that can be in any given field.
// Main reason for this function is text areas, which do not have a maxlength attribute.
function charLimit(field, number) { if(field.value.length > number) field.value = field.value.slice(0, number+1); }

//strips everything but numbers,letters,dashes,and underscores
function requireAlphaNumeric(obj) {
	var regex     = new RegExp("[^0-9A-Za-z_-]","g");
	var newValue  = obj.value;
	newValue      = newValue.replace(regex,'');

	if(obj.value != newValue) obj.value = newValue;
}

//strips all non-numeric characters from a form field value
function requireNumeric(obj) {
	var numericType   = (arguments.length > 1) ? arguments[1] : "real"; // real(can have decimal point) or integer(cannot have decimal point)
	var allownegative = (arguments.length > 2 && arguments[2] == true) ? true : false;
	var regex         = new RegExp("[^0-9.]", "g");
	var newValue      = obj.value;
	var isnegative    = (allownegative == true && newValue.substring(0,1) == "-") ? true : false;

	if(numericType == "integer") regex = new RegExp("[^0-9]", "g");

	newValue = newValue.replace(regex,'');
	newValue = (isnegative == true) ? ("-" + newValue) : newValue;

	if(numericType != "integer") newValue = stripAdditionalDecimals(newValue);
	if(obj.value != newValue) obj.value = newValue;
}

//strip additional decimals
function stripAdditionalDecimals(item) {
	var newItem  = item;
	var decimals = newItem.split(".");
	var dLen     = decimals.length;
	var d        = 0;

	if(dLen > 1) {
		for (d; d < dLen; d++) {
			if (d == 0) {
				newItem = decimals[d] + ".";
			} else {
				newItem = newItem + "" + decimals[d];
			}
		}
	}

	return newItem;
}

function requireRange(obj,start,stop) {
	requireNumeric(obj,"real",true);

	var newValue = obj.value;

	if(newValue < start) newValue = start;
	if(newValue > stop) newValue = stop;

	if(obj.value != newValue) obj.value = newValue;
}

// jQuery to initialize on document ready
jQuery(document).ready(function() {
	jQuery("form input[type='text'][data-focusable='1'][data-blurdefault!='']")
		.unbind("focus")
		.unbind("blur")
		.focus(function() { if(jQuery(this).val() == jQuery(this).attr("data-blurdefault")) jQuery(this).val("").removeClass("blurred"); })
		.blur(function() { if(jQuery(this).val() == "") jQuery(this).val(jQuery(this).attr("data-blurdefault")).removeClass("blurred").addClass("blurred"); })
		.trigger("blur");
});
