// Ajax Form

EasyAjax_Form = function () { var config = {}; config = { errorMsgs: { required: '*', email: 'Not Valid.', phone: 'Example: 111-222-3333.', lengthInput: '50 or fewer characters for this field.', lengthText: '5000 or fewer characters for this field.', ajaxTimeout: 'An error occurred when saving your request, please try again.' + 'If this problem persists, please try again later.'
}, fades: { validation: 200, ajax: 500
}, ajaxTimers: { pause: 2000, timeout: 10000
}, valClasses: { requiredField: 'required', emailField: 'email', phoneField: 'phone', charLengthInput: 'length_input', charLengthText: 'length_text', optionalField: 'optional'
}, formClasses: { validateOnly: 'validate', ajaxOnly: 'ajax', disable: 'disable', choose: 'choose'
}, cssSelectors: { validationPass: 'pass', validationFail: 'fail', ajaxLoading: '#form_load', ajaxTimeout: "AJAX_TIMEOUT", ajaxResponse: "AJAX_RESPONSE"
}, regExps: { email: /^\w+([\.\-]?\w+)*@\w+([\.\-]?\w+)*(\.\w{2,3})+$/, phone: /^\(?(\d{3})\)?[\.\-\/ ]?(\d{3})[\.\-\/ ]?(\d{4})$/
}, charLimit: { input: 50, textArea: 5000
}
}; function appendSpan(allFields) { $.each(allFields, function (i, field) { $('<span></span>').insertAfter(this);});}
function hasClassArray_maker(currentField, formLevel) { var hasClassArray = [], Classes = config.valClasses, j = 0; if (formLevel) { Classes = config.formClasses;}
$.each(Classes, function (k, currentClass) { if ($(currentField).hasClass(currentClass)) { hasClassArray[j] = currentClass; j = j + 1;}
}); return hasClassArray;}
function fieldProperty_maker(currentField) { var valTypes = config.valClasses, fieldProperties = {}; $.each(valTypes, function (l, currentType) { fieldProperties[l] = false;}); return fieldProperties;}
function calcFieldProperties(fieldProperties, hasClassArray) { $.each(hasClassArray, function (m, currentClass) { switch (currentClass) { case config.valClasses.emailField:
fieldProperties.emailField = true; break; case config.valClasses.requiredField:
fieldProperties.requiredField = true; break; case config.valClasses.phoneField:
fieldProperties.phoneField = true; break; case config.valClasses.charLengthInput:
fieldProperties.charLengthInput = true; break; case config.valClasses.charLengthText:
fieldProperties.charLengthText = true; break; default:
break;}
}); return fieldProperties;}
function boolObjDecoder(boolObj, retFalseIf) { var x = 0; $.each(boolObj, function (p, currentBool) { var booleanKeepGoing; if (currentBool === retFalseIf) { x = 1; booleanKeepGoing = false;}
}); if (x === 1) { return false;}
return true;}
function ajaxError(daddy, thisForm) { $(config.cssSelectors.ajaxLoading).fadeOut(config.fades.ajax / 4, function () { $(config.cssSelectors.ajaxLoading).remove();}); $('<div id="Response">' + '<p class=' + config.cssSelectors.ajaxTimeout + '>' + config.errorMsgs.ajaxTimeout + '</p>' + '</div>').hide().appendTo(daddy).fadeIn(config.fades.ajax); $('<div id="Refresh">' + '<p><a href ="#">Click here</a> to re-enter form information.</p>' + '</div>').hide().appendTo(daddy).fadeIn(config.fades.ajax); $('#Refresh').click(function () { $('#Response, #Refresh').fadeOut(config.fades.ajax / 2, function () { $('#Response, #Refresh').remove(); $(thisForm).fadeIn(config.fades.ajax / 2);}); return false;}); return true;}
function ajaxSuccess(serverResponse, daddy, thisForm) { $(config.cssSelectors.ajaxLoading).fadeOut(config.fades.ajax / 4, function () { $(this).remove();}); $('<div id="Response">' + '<p class=' + config.cssSelectors.ajaxResponse + '>' + serverResponse + '</p>' + '</div>').hide().appendTo(daddy).fadeIn(config.fades.ajax); $('<div id="Refresh">' + '<p><a href ="#">Click Here</a> to re-enter form information.</p>' + '</div>').hide().appendTo(daddy).fadeIn(config.fades.ajax); $('#Refresh').click(function () { $('#Response, #Refresh').fadeOut(config.fades.ajax / 2, function () { $('#Response, #Refresh').remove(); $(thisForm).fadeIn(config.fades.ajax / 2);}); return false;}); return true;}
function requiredValidator(currentField, input) { var thisError = config.errorMsgs.required, hasReqErr = false; if (input === '') { $(currentField).next().removeClass(config.cssSelectors.validationPass); $(currentField).next().hide().addClass(config.cssSelectors.validationFail).
text(thisError).fadeIn(config.fades.validation); hasReqErr = true;}
return hasReqErr;}
function emailValidator(currentField, input) { var thisError = config.errorMsgs.email, hasEmailErr = false, reEmail = config.regExps.email; if (!reEmail.test(input)) { $(currentField).next().removeClass(config.cssSelectors.validationPass); $(currentField).next().hide().addClass(config.cssSelectors.validationFail).
text(thisError).fadeIn(config.fades.validation); hasEmailErr = true;}
return hasEmailErr;}
function phoneValidator(currentField, input) { var thisError = config.errorMsgs.phone, hasPhoneErr = false, rePhone = config.regExps.phone; if (!rePhone.test(input)) { $(currentField).next().removeClass(config.cssSelectors.validationPass); $(currentField).next().hide().addClass(config.cssSelectors.validationFail).
text(thisError).fadeIn(config.fades.validation); hasPhoneErr = true;}
return hasPhoneErr;}
function inputLengthValidator(currentField, input) { var thisError = config.errorMsgs.lengthInput, hasInputLengthErr = false; if (input.length > config.charLimit.input) { $(currentField).next().removeClass(config.cssSelectors.validationPass); $(currentField).next().hide().addClass(config.cssSelectors.validationFail).
text(thisError).fadeIn(config.fades.validation); hasInputLengthErr = true;}
return hasInputLengthErr;}
function textLengthValidator(currentField, input) { var thisError = config.errorMsgs.lengthText, hasTextLengthErr = false; if (input.length > config.charLimit.textArea) { $(currentField).next().removeClass(config.cssSelectors.validationPass); $(currentField).next().hide().addClass(config.cssSelectors.validationFail).
text(thisError).fadeIn(config.fades.validation); hasTextLengthErr = true;}
return hasTextLengthErr;}
function fieldValidator(fieldProperties, input, currentField) { var errorObject = {}; errorObject = { requiredError: false, emailError: false, phoneError: false, inputLengthError: false, textLengthError: false
}; if (fieldProperties.requiredField) { errorObject.requiredError = requiredValidator(currentField, input); if (errorObject.requiredError) { return errorObject;}
}
if (fieldProperties.emailField) { errorObject.emailError = emailValidator(currentField, input); if (errorObject.emailError) { return errorObject;}
}
if (fieldProperties.phoneField) { errorObject.phoneError = phoneValidator(currentField, input); if (errorObject.phoneError) { return errorObject;}
}
if (fieldProperties.charLengthInput) { errorObject.inputLengthError = inputLengthValidator(currentField, input); if (errorObject.inputLengthError) { return errorObject;}
}
if (fieldProperties.charLengthText) { errorObject.textLengthError = textLengthValidator(currentField, input); if (errorObject.textLengthError) { return errorObject;}
}
return errorObject;}
function greenChecker(currentField) { $(currentField).next().removeClass('fail'); if ($(currentField).next().hasClass("pass")) { return;}
$(currentField).next().hide().addClass("pass").text('').fadeIn(config.fades.validation);}
function validate_onBlur(formID, allInputs) { $(allInputs).blur(function () { var allValClasses = {}, currentField = this, input = $(currentField).val(), blankOptInput = false, hasClassArray = [], fieldProperties = {}, validationTracker = {}, validationResults = true; allValClasses = config.valClasses; hasClassArray = hasClassArray_maker(currentField); fieldProperties = fieldProperty_maker(currentField); if (input === '' && $(currentField).hasClass(config.valClasses.optionalField)) { blankOptInput = true;}
if (hasClassArray.length !== 0) { fieldProperties = calcFieldProperties(fieldProperties, hasClassArray); if (!blankOptInput) { validationTracker = fieldValidator(fieldProperties, input, currentField);}
validationResults = boolObjDecoder(validationTracker, true);}
if (validationResults) { greenChecker(currentField);}
});}
function validate_onSubmit(formID, allFields) { $("" + formID + "").submit(function () { var allValClasses = {}, allGood = [], formValid = false; allValClasses = config.valClasses; $.each(allFields, function (r, currentField) { var input = $(currentField).val(), blankOptInput = false, hasClassArray = [], fieldProperties = {}, validationTracker = {}, validationResults = true; allGood[r] = false; hasClassArray = hasClassArray_maker(currentField); fieldProperties = fieldProperty_maker(currentField); if (input === '' && $(currentField).hasClass(config.valClasses.optionalField)) { blankOptInput = true;}
if (hasClassArray.length !== 0) { fieldProperties = calcFieldProperties(fieldProperties, hasClassArray); if (!blankOptInput) { validationTracker = fieldValidator(fieldProperties, input, currentField);}
validationResults = boolObjDecoder(validationTracker, true);}
if (validationResults) { allGood[r] = true; greenChecker(currentField);}
}); formValid = boolObjDecoder(allGood, false); if (formValid) { return true;}
return false;});}
function ajaxOnly(formID, allFields) { $("" + formID + "").submit(function () { var thisForm = this, toFile = this.action, daddy = $(this).parent(), dataString = $(this).serialize(); $(thisForm).fadeOut(config.fades.ajax, function () { $("<div id='form_load'/>").hide().appendTo(daddy).show();}); $.ajax({ type: "post", url: toFile, data: dataString, timeout: config.ajaxTimers.timeout, error: function (XMLHttpRequest, timeout) { setTimeout(function () { ajaxError(daddy, thisForm);}, config.fades.ajax + 10);}, success: function (serverResponse) { setTimeout(function () { ajaxSuccess(serverResponse, daddy, thisForm);}, config.fades.ajax + config.ajaxTimers.pause);}
}); return false;});}
function validatePlusAjax_onSubmit(formID, allFields) { $("" + formID + "").submit(function () { var allValClasses = {}, allGood = [], formValid = false, thisForm = this, toFile = this.action, daddy = $(this).parent(), dataString = $(this).serialize(); allValClasses = config.valClasses; $.each(allFields, function (r, currentField) { var input = $(currentField).val(), blankOptInput = false, hasClassArray = [], fieldProperties = {}, validationTracker = {}, validationResults = true; allGood[r] = false; hasClassArray = hasClassArray_maker(currentField); fieldProperties = fieldProperty_maker(currentField); if (input === '' && $(currentField).hasClass(config.valClasses.optionalField)) { blankOptInput = true;}
if (hasClassArray.length !== 0) { fieldProperties = calcFieldProperties(fieldProperties, hasClassArray); if (!blankOptInput) { validationTracker = fieldValidator(fieldProperties, input, currentField);}
validationResults = boolObjDecoder(validationTracker, true);}
if (validationResults) { allGood[r] = true; greenChecker(currentField);}
}); formValid = boolObjDecoder(allGood, false); if (formValid) { $(thisForm).fadeOut(config.fades.ajax, function () { $("<div id='form_load')'/>").hide().appendTo(daddy).show();}); $.ajax({ type: "post", url: toFile, data: dataString, timeout: config.ajaxTimers.timeout, error: function (XMLHttpRequest, timeout) { setTimeout(function () { ajaxError(daddy, thisForm);}, config.fades.ajax + 10);}, success: function (serverResponse) { setTimeout(function () { ajaxSuccess(serverResponse, daddy, thisForm);}, config.fades.ajax + config.ajaxTimers.pause);}
});}
return false;});}
function chooseID(formID) { var allFields; if (formID) { formID = '#' + formID;} else { formID = "form";}
allFields = $('' + formID + ' :input:not(:submit):not(:button)'); if ($(formID).hasClass(config.formClasses.validateOnly)) { validate_onBlur(formID, allFields); validate_onSubmit(formID, allFields); return;} else if ($(formID).hasClass(config.formClasses.ajaxOnly)) { ajaxOnly(formID, allFields); return;} else { validate_onBlur(formID, allFields); validatePlusAjax_onSubmit(formID, allFields); return;}
}
function init() { var formID = "form", allFields = $('' + formID + ' :input:not(:submit):not(:button)'); appendSpan(allFields); if ($(formID).hasClass(config.formClasses.disable)) { return;} else if ($(formID).hasClass(config.formClasses.choose)) { return;} else if ($(formID).hasClass(config.formClasses.validateOnly)) { validate_onBlur(formID, allFields); validate_onSubmit(formID, allFields); return;} else if ($(formID).hasClass(config.formClasses.ajaxOnly)) { ajaxOnly(formID, allFields); return;} else { validate_onBlur(formID, allFields); validatePlusAjax_onSubmit(formID, allFields); return;}
}
return { CustomMessages: config.errorMsgs, CustomFades: config.fades, CustomTimers: config.ajaxTimers, CustomCharLimits: config.charLimit, Go: init, ByID: chooseID
};}(); $(function () { EasyAjax_Form.Go();}); 
	
EasyAjax_Form.CustomFades.validation = 1000;
