﻿//jQuery Form Validation for ShopRite Loyalty
   //resource:http://docs.jquery.com/Plugins/Validation

///<reference path="lib/jquery-1.2.6-vsdoc.js" />
///<reference path="lib/jquery.validate.js" />
///<reference path="lib/jquery.maskedinput.js" />
///<reference path="lib/jquery.metadata.js" />

//Custom validation method for BirthDate fields
jQuery.validator.addMethod("dob", function(value, element) {
    var bdate = value.toString();
    var today = new Date();
    var dead = new Date(); //if your birth day is before this day you are DEAD so stop surfing the net!
    dead.setFullYear(1900, 0, 1);

    if (bdate != "") {//if there is a value break out pieces
        var mm = bdate.substr(0, 2);
        var dd = bdate.substr(3, 2);
        var yyyy = bdate.substr(6, 9);

        //convert form data to date type
        bdate = new Date();
        bdate.setFullYear(yyyy, (mm - 1), dd); //validate (not fullproof, but its not far off)
        if (bdate > today || bdate < dead || (dd > 31 || dd < 1) || (mm > 12 || mm < 1))
            return false;
        else
            return true;
    }
    else { return this.optional(element); }
}, "Please enter a valid date of birth.");



$(function() {//execute when page is ready(loaded)
    //add asterisk to required fields (frmEnroll & frmUpdate only)
    $(".inputR, .drpDwnR", "#frmEnroll, #frmUpdate").after("<span class='redTxt'>*</span>");

    //declare input field masks
    $("#phone").mask("(999) 999-9999");
    $("#mobile").mask("(999) 999-9999");
    $("#dob").mask("99/99/9999");

    //give password fields red border upon returning to form to indicate password needs to be re-entered
    if ($("#returnUser").val() == "true")
        $(".passPrompt").addClass("error");

    $("#oldPass").change(function() {//password functionality for UpdateProfile.aspx
        if ($(this).val() != "") {//if value exists in oldPass then validate new password fields
            $("#newPass1").rules("add", { required: true, minlength: 2, maxlength: 8 });
            $("#newPass2").rules("add", { required: true, equalTo: "#newPass1" });
        }
        else {
            $("#newPass1").rules("remove");
            $("#newPass2").rules("remove");
        }
    });

    //Check for customer existence via AJAX
    $(".ccf").bind("change", function() {
        var ready = true;
        $(".ccf").each(function() {
            if ($(this).val() != "") {
                if (!$("#frmEnroll").validate().element(this)) {
                    ready = false;
                }
            } else { ready = false; };
        });
        if (ready) {//if all fields are valid, make ajax call
            var custData = $(".ccf").serialize();
            $.get("WakefernCustomerCheck.aspx?", custData, function(data) {
                //ensure duplicate elements do not occur
                if ($("#customerCheck").val()) { $("#customerCheck").remove(); }

                $("#frmEnroll").prepend(data);

                if ($("#customerCheck").val() == "True") {//disable form submit and show message
                    $("#frmEnroll").before("<h2 id='customerExistErr'>An account with this information already exists. Please contact customer service for help.</h2>").focus();
                    $("#fromSubmit").attr("disabled", "disabled");
                }
                else {//restore form if required
                    if ($("#customerExistErr").text()) {
                        $("#customerExistErr").remove();
                        $("#fromSubmit").removeAttr("disabled");
                    }
                }
            }, "html");
        }
    });

    //Validation for frmLogin - found on multiple pages    
    $("#frmLogin").validate({
        errorPlacement: function(error, element) { error.appendTo($('#loginErrLbl')); },
        submitHandler: function(form) {
            if ($("#fpSubmit").attr("clicked") == "true") {
                form.postBack.value = 2;
            } else {
                form.postBack.value = 1;
            }
            form.submit();
        },
        rules: {
            login_email: {
                required: true,
                email: true
            },
            login_password: {
                required: true
            }
        },
        messages: {
            login_email: {
                required: "Enter your email address.",
                email: "Invalid email entered."
            },
            login_password: {
                required: "Enter your password."
            }
        }
    });

    //Validation for frmFSNLogin - found on multiple pages
    $("#frmFSNLogin").validate({
        errorPlacement: function(error, element) { error.appendTo($('#fsnLoginErrLbl')); },
        submitHandler: function(form) { form.postBack.value = 2; form.submit(); },
        rules: {
            ppcnumber: {
                required: true,
                digits: true
            },
            lastname: {
                required: true,
                minlength: 2
            }
        },
        messages: {
            ppcnumber: {
                required: "Please enter your PPC #.",
                digits: "Invalid PPC #."
            },
            lastname: {
                required: "Your last name is required.",
                minlength: "Your name must be at least 2 characters long."
            }
        }
    });

    //Validation for frmStdAddPrompt - StdAddressPrompt.aspx
    $("#frmStdAddPrompt").validate({
        submitHandler: function(form) { form.postBack.value = 1; form.submit(); },
        rules: { AddPick: { required: true} }
    });

    //Validation for Registration.aspx
    var registrationValidator = $("#frmEnroll").validate({
        debug: true,
        errorElement: "em",
        errorContainer: $("#summary"),
        errorPlacement: function(error, element) {
            error.appendTo(element.parent("td").next("td"));
        },
        submitHandler: function(form) {
            //insert loading gif to show that something is happening
            $("#captchaCell").append("<img id='captchaLoading' src='images/loading.gif' alt='loading...'/>");

            //ensure that the result field does not exist prior to ajax call(only needed for testing)
            if ($("#captchaResult")) $("#captchaResult").remove();
            if ($("#captchaErr").is(".error")) $("#captchaErr").remove();

            var challengeField = $("input#recaptcha_challenge_field").val();
            var responseField = $("input#recaptcha_response_field").val();

            $.get("RecaptchaHelper.aspx", "challenge=" + challengeField + "&response=" + responseField,
                    function(data) {
                        $("#captchaLoading").remove(); //remove loading gif
                        $("#captchaCell").append(data);
                        if ($("#captchaResult").val() == "fail" && $("#captchaResult").attr("errorCode") == "incorrect-captcha-sol") {
                            //if captcha validation fails from user error                           
                            Recaptcha.reload(); //get a new captcha 
                            $("#captchaCell").append("<em id='captchaErr' class='error'>The words entered were not correct, please try again.</em>");
                            $("#captchaResult").remove(); //remove hidden field to prevent duplicates
                        }
                        else if ($("#captchaResult").val() == "fail" && $("#captchaResult").attr("errorCode") != "incorrect-captcha-sol") {
                            //if captcha validation fails for some other reason
                            Recaptcha.reload(); //get a new captcha 
                            $("#captchaCell").append("<em id='captchaErr' class='error'>There was en error processing your captcha. Please try again later.</em>");
                            $("#captchaResult").remove(); //remove hidden field to prevent duplicates
                        }
                        else if ($("#captchaResult").val() == "pass") {
                            //if all is well - trim field values and submit
                            $(".inputR").each(function() { $(this).val($.trim($(this).val())); });
                            form.postBack.value = 1; form.submit();
                        }
                        else {
                            //if form is invalid when form submitted
                            Recaptcha.reload();
                            $("#captchaResult").remove(); //remove hidden field to prevent duplicates
                        }
                    }, "html");
        },
        rules: {//validation rules are defined here 
            first: {
                required: true,
                minlength: 2,
                maxlength: 12
            },
            last: {
                required: true,
                minlength: 2,
                maxlength: 18
            },
            add1: {
                required: true
            },
            city: {
                required: true,
                minlength: 2,
                maxlength: 13
            },
            state: {
                required: true
            },
            zip: {
                required: true,
                minlength: 5,
                maxlength: 10,
                digits: true
            },
            email1: {
                required: true,
                email: true
            },
            email2: {
                required: true,
                email: true,
                equalTo: "#email1"
            },
            pass1: {
                required: true,
                minlength: 5
            },
            pass2: {
                required: true,
                equalTo: "#pass1"
            },
            dob: {
                required: false,
                dob: true
            }
        },
        messages: {//custom error messages are defined here (optional)
            first: {
                required: "Your first name is required.",
                minlength: "Your first name must consist of at least 2 characters.",
                maxlength: "Your first name must be less than 13 characters."
            },
            last: {
                required: "Your last name is required.",
                minlength: "Your last name must consist of at least 2 characters.",
                maxlength: "Your last name must be less than 19 characters."

            },
            add1: "Your street address is required.",
            city: {
                required: "The city that you live in is required.",
                minlength: "The city must be at least 2 characters long.",
                maxlength: "The city cannot be longer than 13 characters. Abbreviate if necessary."
            },
            state: "The state that you live in is required.",
            zip: {
                required: "Your zip code is required.",
                minlength: "Please enter a valid 5-digit zip code.",
                digits: "Please enter a valid 5-digit zip code."
            },
            email1: {
                required: "Your email address is required.",
                email: "Please enter a valid email address."
            },
            email2: {
                required: "Please confirm your email address.",
                equalTo: "This email does not match the one you entered above."
            },
            pass1: {
                required: "A password is required.",
                minlength: "Your password must be at least 5 characters long."
            },
            pass2: {
                required: "Please confirm your password.",
                equalTo: "This password does not match the one you entered above."
            }
        }
    });

    //Validation for Registration.aspx
    var updateValidator = $("#frmUpdate").bind("invalid-form.validate", function() {
        $("#summary").html("Your form contains " + updateValidator.numberOfInvalids() + " errors, see details below.").addClass("redTxt").show();
    }).validate({
        debug: true,
        errorElement: "em",
        errorContainer: $("#summary"),
        errorPlacement: function(error, element) { error.appendTo(element.parent("td").next("td")); },
        submitHandler: function(form) {
            var changed = $("#addChanged").val();
            var checked = $("#addChecked").val();
            //add changed not checked
            if (changed == "true" && checked == "false") {
                $("#checkAddCell").append("<em id='addChkErr' class='error'>Please click \"Standardize Address\" before submitting changes.</em>").focus();
                return false;
            } //add changed and checked || add never changed (not checked either)
            else if (($("#addChanged").val() == "true" && $("#addChecked").val() == "true")
                        || ($("#addChanged").val() == "false" && $("#addChecked").val() == "false")) {
                form.postBack.value = 1; form.submit();
            }
        },
        rules: {//validation rules are defined here 
            first: {
                required: true,
                minlength: 2,
                maxlength: 12
            },
            last: {
                required: true,
                minlength: 2,
                maxlength: 18
            },
            add1: {
                required: true
            },
            add2: {
                required: false
            },
            city: {
                required: true,
                minlength: 2,
                maxlength: 13
            },
            state: {
                required: true
            },
            zip: {
                required: true,
                minlength: 5,
                maxlength: 10,
                digits: true
            },
            email: {
                required: true,
                email: true
            },
            currentPass: {
                required: true
            },
            newPass1: {
                equalTo: "#newPass2"
            },
            newPass2: {
                equalTo: "#newPass1"
            },
            dob: {
                required: false,
                dob: true
            }
        },
        messages: {
            first: {
                required: "Your first name is required.",
                minlength: "At least 2 characters required.",
                maxlength: "Must be less than 13 characters."
            },
            last: {
                required: "Your last name is required.",
                minlength: "At least 2 characters required.",
                maxlength: "Must be less than 19 characters."
            },
            add1: "A Street address is required.",
            city: {
                required: "The city is required.",
                minlength: "Must be at least 2 characters.",
                maxlength: "Must be less than 14 characters."
            },
            state: "The state is required.",
            zip: {
                required: "Your zip code is required.",
                minlength: "Enter a valid 5-digit zip code.",
                digits: "Enter a valid 5-digit zip code."
            },
            email: {
                required: "Your email address is required.",
                email: "Please enter a valid email address."
            },
            currentPass: {
                required: "Your password is required to make updates."
            },
            newPass2: {
                equalTo: "Please enter your password as entered above."
            },
            newPass1: {
                equalTo: "Please re-enter your password below."
            }
        }
    });
});
