$j(document).ready(function(){ // Customer Info Input fields var custFirstNameField = $j('#custFirstName'); var custLastNameField = $j('#custLastName'); var custPhoneField = $j('#custPhone'); var custEmailField = $j('#custEmail'); // Shipping Info Input fields var shipFirstNameField = $j('#shipFirstName'); var shipLastNameField = $j('#shipLastName'); var shipPhoneField = $j('#shipPhone'); var shipEmailField = $j('#shipEmail'); var shipAddress1Field = $j('#shipAddress1'); var shipAddress2Field = $j('#shipAddress2'); var shipCityField = $j('#shipCity'); var shipStateField = $j('#shipState'); var shipZipField = $j('#shipZip'); var shipUrbanizationField = $j('#shipUrbanization'); // Same as above check-box var sameAsAboveCheckBox = $j('#sameAsAboveCheckbox'); // Check out now button var checkoutButton = $j('#checkoutBtn'); // Error message display div var guestErrorDisplay = $j('#guestErrors'); // Regex for validation var addrTest = /^[A-Za-z0-9\s\"\?\#\&\(\)\+\,\-\.\/\@\']{1,50}$/; var stateTest = /^[A-Za-z]{2}$/; var zipTest = /^(\d{5}-\d{4})|(\d{5})$/; var nameTest = /^[A-Za-z\s\-\.\']{1,50}$/; var emailTest = /(^['_A-Za-z0-9+-]+(\.['_A-Za-z0-9+-]+)*@([A-Za-z0-9-])+(\.[A-Za-z0-9-]+)*((\.[A-Za-z0-9]{2,})|(\.[A-Za-z0-9]{2,}\.[A-Za-z0-9]{2,}))$)/; var phoneTest = /^1?\W*([2-9][0-8][0-9])\W*([2-9][0-9]{2})\W*([0-9]{4})(\se?x?t?(\d*))?$/; /* Object for field errors * @param field The field * @param required true if field is required, false otherwise * @param regex Pattern for field validation * @param blankError Error message if required field is left blank * @param invalidError Error message if input for field is invalid */ function fieldInfo(field, required, regex, blankError, invalidError) { this.field = field; this.fieldErr = field.siblings(".error-message"); this.required = required; this.regex = regex; this.blankError = blankError; this.invalidError = invalidError; this.hideFieldError = hideFieldError; this.showFieldError = showFieldError; this.setErrorMsg = setErrorMsg; } // fieldInfo method: hides field error message function hideFieldError() { this.field.parent().removeClass("error"); } // fieldInfo method: shows field error message function showFieldError() { this.field.parent().addClass("error"); } // fieldInfo method: set field error message to given message function setErrorMsg(message) { this.fieldErr.text(message); } /***************************** * Field validation ****************************/ // Field validation setup var custFirstName = new fieldInfo(custFirstNameField, true, nameTest, "Please enter first name", "First name contains invalid characters"); var custLastName = new fieldInfo(custLastNameField, true, nameTest, "Please enter last name", "Last name contains invalid characters"); var custPhone = new fieldInfo(custPhoneField, true, phoneTest, "Please enter phone number", "Phone number is invalid"); var custEmail = new fieldInfo(custEmailField, true, emailTest, "Please enter email", "Email contains invalid characters"); var shipFirstName = new fieldInfo(shipFirstNameField, true, nameTest, "Please enter first name", "First name contains invalid characters"); var shipLastName = new fieldInfo(shipLastNameField, true, nameTest, "Please enter last name", "Last name contains invalid characters"); var shipPhone = new fieldInfo(shipPhoneField, true, phoneTest, "Please enter phone number", "Phone number is invalid"); var shipEmail = new fieldInfo(shipEmailField, true, emailTest, "Please enter email", "Email contains invalid characters"); var shipAddress1 = new fieldInfo(shipAddress1Field, true, addrTest, "Please enter address", "Address contains invalid characters"); var shipAddress2 = new fieldInfo(shipAddress2Field, false, addrTest, "Please enter address", "Address contains invalid characters"); var shipCity = new fieldInfo(shipCityField, true, addrTest, "Please enter city", "City contains invalid characters"); var shipState = new fieldInfo(shipStateField, true, stateTest, "Please select state or province", "State contains invalid characters"); var shipZip = new fieldInfo(shipZipField, true, zipTest, "Please enter ZIP or postal code", "ZIP contains invalid characters"); var shipUrbanization = new fieldInfo(shipUrbanizationField, false, addrTest, "Please enter urbanization", "Urbanization contains invalid characters"); var allFields = [custFirstName, custLastName, custPhone, custEmail, shipFirstName, shipLastName, shipPhone, shipEmail, shipAddress1, shipAddress2, shipCity, shipState, shipZip, shipUrbanization]; /* * Validates a field and displays/hides error messages * returns true if filed is valid, false otherwise */ function validateField(fieldInfo) { if (isBlank(fieldInfo.field.val())) { if (fieldInfo.required) { // Blank required field: error fieldInfo.setErrorMsg(fieldInfo.blankError); fieldInfo.showFieldError(); return false; } else { // Blank non-required field: no error fieldInfo.hideFieldError(); return true; } } else if (!fieldInfo.regex.test(fieldInfo.field.val())) { // Invalid input: error fieldInfo.setErrorMsg(fieldInfo.invalidError); fieldInfo.showFieldError(); return false; } else { // No errors found fieldInfo.hideFieldError(); return true; } } function validateFieldOnBlur(fieldInfo) { fieldInfo.field.on('blur', function() { validateField(fieldInfo); }); } for (var i = 0; i < allFields.length; i++) { validateFieldOnBlur(allFields[i]); clearFieldErrorOnFocus(allFields[i]); } /* * Validate before form submission */ /*$j('#guestShippingForm').submit(function(e) { if (checkRequiredFields()) { amsValidate(); } else { return false; } }); */ /* * Validate before form submission */ $j('#moveToBillingBtn').click(function(e) { if (checkRequiredFields()) { amsValidate(); } else { return false; } }); /* * Removes all field errors */ function clearErrors() { arrLength = allFields.length; for (var i = 0; i < arrLength; i++) { allFields[i].hideFieldError(); } } /* /* * Removes field error message while editing field */ function clearFieldErrorOnFocus(fieldInfo) { fieldInfo.field.on('focus', function() { fieldInfo.hideFieldError(); }); } /* * Validates all fields and shows error messages. * Returns true if all fields are valid, false otherwise */ function checkRequiredFields() { clearErrors(); var allFieldsValid = true; for (var i = 0; i < allFields.length; i++) { if (!validateField(allFields[i])) { allFieldsValid = false; }; } return allFieldsValid; } /* * Copies the customer first name, last name, phone, and email to the * shipping fields when 'same as above' check-box gets checked. */ sameAsAboveCheckBox.on('click touch', function() { // Copy fields if checked if ($j('#sameAsAboveCheckbox').is(':checked')) { shipFirstNameField.val(custFirstNameField.val()); shipLastNameField.val(custLastNameField.val()); shipPhoneField.val(custPhoneField.val()); shipEmailField.val(custEmailField.val()); // Remove errors from filled in ship fields for (var i = 4; i < 8; i++) { validateField(allFields[i]); } } }); // Show urbanization field when PR selected $j(document).on('change','#shipState',function(e){ e.preventDefault; if($j(this).val()=='PR'){ $j('.urbanization-code-wrapper.collapse').addClass('show'); }else{ $j('.urbanization-code-wrapper.collapse').removeClass('show'); shipUrbanizationField.val(""); } }); $j(document).on('focusout','#custFirstName',function(e){ if ($j('#sameAsAboveCheckbox').is(':checked')) { shipFirstNameField.val(custFirstNameField.val()); validateField(allFields[4]); } }); $j(document).on('focusout','#custLastName',function(e){ if ($j('#sameAsAboveCheckbox').is(':checked')) { shipLastNameField.val(custLastNameField.val()); validateField(allFields[5]); } }); $j(document).on('focusout','#custPhone',function(e){ if ($j('#sameAsAboveCheckbox').is(':checked')) { shipPhoneField.val(custPhoneField.val()); validateField(allFields[6]); } }); $j(document).on('focusout','#custEmail',function(e){ if ($j('#sameAsAboveCheckbox').is(':checked')) { shipEmailField.val(custEmailField.val()); validateField(allFields[7]); } }); /********************************** * AMS Validation *********************************/ function createAmsRequestData() { return {'validate':'{"verifyAddressRequest":{"address":{\ "addr1":"' + shipAddress1Field.val() + '",\ "addr2":"' + shipAddress2Field.val() + '",\ "city":"' + shipCityField.val() + '",\ "state":"' + shipStateField.val() + '",\ "zip":"' + shipZipField.val() + '"}}}'}; } function updateAddressFromAmsResponse(response) { shipAddress1Field.val(response.verifyAddressResponse.address[0].addr1); shipAddress2Field.val(response.verifyAddressResponse.address[0].addr2); shipCityField.val(response.verifyAddressResponse.address[0].city); shipStateField.val(response.verifyAddressResponse.address[0].state); shipZipField.val(splitZip(response.verifyAddressResponse.address[0].zip)); } function amsValidate() { var host = window.location.host; var protocol = window.location.protocol; var ams_url = "/AMS/AddressValidationServlet"; $j.ajaxSetup({cache:false}); var jqxhr = $j.getJSON(protocol + "//" + host + ams_url, createAmsRequestData(), function(response) { if (typeof response.verifyAddressResponse.address != 'undefined') { // Success: Update address and proceed updateAddressFromAmsResponse(response); $("#createAndMoveToBilling").click(); } else if (typeof response.verifyAddressResponse.error != 'undefined'){ // AMS Error: Display error message if (response.verifyAddressResponse.error.code == "ADDRESS_ERROR") { guestErrorDisplay.html('' + response.verifyAddressResponse.error.message + ''); } else if (response.verifyAddressResponse.error.code == "SERVICE_UNAVAILABLE") { guestErrorDisplay.html('' + response.verifyAddressResponse.error.message + ''); } else { guestErrorDisplay.html('' + response.verifyAddressResponse.error.message + ''); } } }).fail(function(XMLHttpRequest, textStatus, errorThrown) { // AMS not available: Display error message var errMsg = "The service is unavailable at this time please try again later."; guestErrorDisplay.html('' + errMsg + ''); }); } }); /* * Check if input string is blank */ function isBlank(str) { return (!str || /^\s*$/.test(str)); } /* * Split 9 digit zip into format 12345-6789 */ function splitZip(input){ if (!isBlank(input)) { if (input.length > 5) { return input.substring(0,5)+"-"+input.substring(5,input.length); } else { return input; } } }