$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;
}
}
}