﻿// Helper functions for validating an address form.
// Requires that the field names are consistent.
// Call "validateAddressForm" from the form element that should be validated.

$("document").ready(function () {
    $.validator.addMethod("phoneUS",
                function (value, element) {
                    var pattern = new RegExp(/^(1[\.\- ]?)?[\.\- ]?(\([2-9]\d{2}\)|[2-9]\d{2})[\.\- ]?[2-9]\d{2}[\.\- ]?\d{4}$/);
                    return value == '' || pattern.test(value);
                },
                "Phone number is invalid."
            );

    $.validator.addMethod("zipUS",
                function (value, element) {
                    var pattern = new RegExp(/^\d{5}(-\d{4})?$/);
                    return value == '' || pattern.test(value);
                },
                "Zip Code is invalid."
            );

    $.validator.addMethod("addressField",
                function (value, element) {
                    var pattern = new RegExp(/^[ A-Za-z\d\-\.\,\']*$/);
                    return pattern.test(value);
                },
                "Some characters in this field are invalid."
            );

    $.fn.extend({
        validateAddressForm: function () {
            return $(this).validate({
                errorElement: "span",
                errorClass: "error",
                rules: {
                    Email: {
                        email: true,
                        remote: "/Account/ValidateEmailNotTaken"
                    },
                    Password: {
                        minlength: 6
                    },
                    ConfirmPassword: {
                        required: function () { return $("#Password").val() != ''; },
                        equalTo: "#Password"
                    }
                },
                messages: {
                    FirstName: { required: "First Name is required." },
                    LastName: { required: "Last Name is required." },
                    AddressLine1: { required: "Address Line 1 is required." },
                    City: { required: "City is required." },
                    StateList: { required: "State is required." },
                    ZipCode: {
                        required: "Zip Code is required.",
                        zipUS: "Please enter a valid US Zip Code."
                    },
                    Phone1: {
                        required: "Please enter at least one phone number.",
                        phoneUS: "Phone number is invalid."
                    },
                    Email: {
                        required: "Email address is required.",
                        email: "Please enter a valid email address.",
                        remote: "This email is already registered.  Please try again."
                    },
                    Password: {
                        required: "Password is required.",
                        minlength: "Password must be at least six characters."
                    },
                    ConfirmPassword: {
                        required: "Please confirm your password.",
                        equalTo: "Password confirmation does not match."
                    },
                    CurrentPassword: {
                        required: "Please enter your current password to make changes to your account."
                    }
                }
            });
        },
        serializeAddressForm: function () {
            var fields = ['AddressKey', 'FirstName', 'LastName', 'AddressLine1', 'AddressLine2', 'City', 'StateList', 'ZipCode', 'Phone1', 'Phone2'];
            var result = '{';
            var separator = '';
            var form = $(this);
            $.each(fields, function () {
                var input = form.find(":input[name='" + this + "']");
                if (input.val() != null) {
                    if (input.is("select")) {
                        result += separator + input.attr('entityType') + ":{" + input.attr('entityVal') + ":" + input.val() + "}";
                    }
                    else {
                        result += separator + this + ":'" + input.val().replace("'", "\\'") + "'";
                    }
                    separator = ',';
                }
            });

            result += '}';
            return result;
        }
    });
});
