
function daysInFebruary(year) {
    // February has 29 days in any year evenly divisible by four,
    // EXCEPT for centurial years which are not also divisible by 400.
    return (((year % 4 === 0) && ((!(year % 100 === 0)) || (year % 400 === 0))) ? 29 : 28);
}

function DaysArray(n) {
    for (var i = 1; i <= n; i++) {
        this[i] = 31;
        if (i === 4 || i === 6 || i === 9 || i === 11) { this[i] = 30 }
        if (i === 2) { this[i] = 29 }
    }
    return this;
}

// On DOM ready
jQuery(document).ready(function() {

    // Globals 
    var daysInMonth = DaysArray(12);
    var strErrorStyle = "error";
    var elemFrmRegister = jQuery("#frmRegister");
    var elemForename = jQuery("#forename");
    var elemSurname = jQuery("#surname");
    var elemDOBDay = jQuery("#dob_day");
    var elemDOBMonth = jQuery("#dob_month");
    var elemDOBYear = jQuery("#dob_year");
    var elemEDDDay = jQuery("#edd_day");
    var elemEDDMonth = jQuery("#edd_month");
    var elemEDDYear = jQuery("#edd_year");
    var elemChild = jQuery("#child");
    var elemFirstChild = jQuery("input[name='child_first']");
    var elemMilksBrands = jQuery("#milk_brands");
    var elemBottleFeeding = jQuery('input[name="bottlefeeding"]');
    var elemHomeAddressManually = jQuery("#home_address_manually");
    var elemPostcodeFind = jQuery("#postcode_find");
    var elemPostcodeLookup = jQuery("#post_code_lookup");
    var elemAddressSelection = jQuery("#address_selecion");
    var elemCheckboxOptinAll = jQuery("input#checkbox_optin_all");
    var elemCheckboxOptinEmail = jQuery("input#checkbox_optin_email");
    var elemCheckboxOptinPost = jQuery("input#checkbox_optin_post");
    var elemCheckboxOptinSMS = jQuery("input#checkbox_optin_sms");
    var elemCheckboxOptinMilks = jQuery("input#checkbox_optin_milks");
    var elemCheckboxFriendFinder = jQuery("input#checkbox_friend_finder");
    var elemAccountEmail = jQuery("#accountemail");
    var elemAccountPostCode = jQuery("#accountpostcode");
    var elemFeedingTitle = jQuery("#feeding_title");
    var elemContactDetails = jQuery("#contact_details");
    var elemMilkDetails = jQuery("#milks");
    var elemAddressDetails = jQuery("#address");
    var elemSmsDetails = jQuery("#sms");
    var strAddressAnchor = "/register/task/#address";

    function postDetails() {
        contactDetails();
        // hide or show post details
        if (elemCheckboxOptinPost.is(":checked")) {
            elemAddressDetails.show();
            jQuery("#address .optin_fields").show();
        }
        else {
            elemAddressDetails.hide();
            jQuery("#address .optin_fields").hide();
        }
    }

    function smsDetails() {
        contactDetails();
        // hide or show sms details
        if (elemCheckboxOptinSMS.is(":checked")) {
            elemSmsDetails.show();
            jQuery("#sms .optin_fields").show();
        }
        else {
            elemSmsDetails.hide();
            jQuery("#sms .optin_fields").hide();
        }
    }

    function contactDetails() {
        // hide or show Contact details
        if (elemCheckboxOptinPost.is(":checked") || elemCheckboxOptinSMS.is(":checked")) {
            elemContactDetails.show();
        }
        else {
            elemContactDetails.hide();
        }
    }

    function milkDetails() {
        // hide or show milks details and brand info
        if (elemCheckboxOptinMilks.is(":checked")) {
            milkBrands();
        }
        else {
            hideMilkBrands();
        }
    }

    function showMilkBrands() {
        elemMilkDetails.show();
        elemMilksBrands.show();
    }

    function hideMilkBrands() {
        elemMilkDetails.hide();
        elemMilksBrands.hide();
    }

    function milkBrands() {
        var strTitle = "are you feeding your baby?";
        // hide or show milk brand
        if (elemFirstChild.attr('checked')) {
            // true (First baby = yes)
            // Check to see if opt for milks selected
            if (elemCheckboxOptinMilks.is(':checked')) {
                var eddDate = new Date();
                var today = new Date();

                // Check edd is not in the future
                if (elemEDDDay.val() > 0 && elemEDDMonth.val() > 0 && elemEDDYear.val() > 0) {
                    // Set date based on selection (Month is 0 based in JS)
                    eddDate.setFullYear(elemEDDYear.val(), elemEDDMonth.val() - 1, elemEDDDay.val());
                    if (eddDate <= today) {
                        showMilkBrands();
                    }
                    else {
                        // Do not show milk brands as the babys edd is in the future so the cannot answer how they feed there baby yet
                        hideMilkBrands();
                        // Reset selected radio if checked
                        elemBottleFeeding.removeAttr("checked");
                    }
                }
            }
        }
        else {
            strTitle = "did you feed your last baby?";
            // false (First baby = no)
            if (elemCheckboxOptinMilks.is(':checked')) {
                showMilkBrands();
            }
        }

        // Set Feeding Title
        if (elemFeedingTitle.length) {
            elemFeedingTitle.html(strTitle);
        }

    }

    function childDetails() {
        var eddDate = new Date();
        var today = new Date();
        if (elemEDDDay.val() > 0 && elemEDDMonth.val() > 0 && elemEDDYear.val() > 0) {
            try {
                // Set date based on selection (Month is 0 based in JS)
                eddDate.setFullYear(elemEDDYear.val(), elemEDDMonth.val() - 1, elemEDDDay.val());
                if (eddDate <= today) {
                    elemChild.show();
                }
                else {
                    elemChild.hide();
                }
            }
            catch (err) {
                // unable to check date
                elemChild.hide();
            }
        }
    }


    // Check default value
    jQuery.validator.addMethod("defaultInvalid", function(value, element) {
        var valid = false;
        if (element.value == "First Name" || element.value == "Last Name") {
            valid = false;
        }
        else {
            valid = true;
        }
        return valid;
    });

    // DOB invalid
    jQuery.validator.addMethod("dobInvalid", function(value, element) {
        var valid = false;
        if (elemDOBDay.val() > 0 && elemDOBMonth.val() > 0 && elemDOBYear.val() > 0) {
            // Check for invalid days
            if ((elemDOBMonth.val() == 2 && elemDOBDay.val() > daysInFebruary(elemDOBYear.val())) || elemDOBDay.val() > daysInMonth[elemDOBMonth.val()]) {
                valid = false;
            }
            else {
                valid = true;
                // Clean up styles
                elemDOBDay.removeClass(strErrorStyle);
                elemDOBMonth.removeClass(strErrorStyle);
                elemDOBYear.removeClass(strErrorStyle);
                // Refocus on EDD to it can check it is valid now we have a valid DOB
                //elemEDDDay.focus();
            }
        }
        return valid;
    }, "Please select a valid Date of Birth");

    // EDD invalid
    jQuery.validator.addMethod("eddInvalid", function(value, element) {
        var valid = false;

        // Hide Child data, if date selecting
        elemChild.hide();

        // Check Day, Month & Year has been selected
        if (elemEDDDay.val() > 0 && elemEDDMonth.val() > 0 && elemEDDYear.val() > 0) {
            // Check for invalid days
            if ((elemEDDMonth.val() == 2 && elemEDDDay.val() > daysInFebruary(elemEDDYear.val())) || elemEDDDay.val() > daysInMonth[elemEDDMonth.val()]) {
                valid = false;
            }
            else {
                var eddDate = new Date();
                try {
                    // Set date based on selection (Month is 0 based in JS)
                    eddDate.setFullYear(elemEDDYear.val(), elemEDDMonth.val() - 1, elemEDDDay.val());
                    // Remove 280 days from EDD date
                    var eddDateFuture = new Date(eddDate.getTime());
                    eddDateFuture.setDate(eddDate.getDate() - 280);
                    var today = new Date();
                    if (eddDateFuture > today) {
                        // The Due Date is more than 280 in the future. This is impossible for normal human beings
                        valid = false;
                    }
                    else {

                        // Now check against DOB incase they are saying they have had child before they where even born
                        if (elemDOBDay.valid() && elemDOBMonth.valid() && elemDOBYear.valid()) {
                            var dobDate = new Date();
                            try {
                                // Set dob date based on selection (Month is 0 based in JS)
                                dobDate.setFullYear(elemDOBYear.val(), elemDOBMonth.val() - 1, elemDOBDay.val());
                                // Test for the impossible someone having a baby before the Mum or Dad are even born
                                if (dobDate < eddDate) {
                                    valid = true;
                                    // Clean up styles
                                    elemEDDDay.removeClass(strErrorStyle);
                                    elemEDDMonth.removeClass(strErrorStyle);
                                    elemEDDYear.removeClass(strErrorStyle);
                                    // Child EDD/DOB is before or is today so show Child form fields
                                    childDetails();
                                    // Check to hide or show milk brands
                                    milkBrands();
                                }
                                else {
                                    valid = false;
                                }
                            }
                            catch (err) {
                                valid = false;
                            }
                        }
                    }
                }
                catch (err) {
                    valid = false;
                }
            }
        }
        return valid;
    }, "Please select a valid Due Date or Date Of Birth");

    // Check for valid UK postcode
    jQuery.validator.addMethod("ukPostcode", function(value, element) {
        var strPostcode = jQuery.trim(value).toUpperCase();
        if (strPostcode.length < 6 || strPostcode.length > 8) {
            return false;
        }
        else {
            return /^([A-PR-UWYZ0-9][A-HK-Y0-9][AEHMNPRTVXY0-9]?[ABEHMNPRVWXY0-9]? {1,2}[0-9][ABD-HJLN-UW-Z]{2}|GIR 0AA)$/.test(strPostcode);
        }
    }, 'Please enter a correctly formatted UK postcode');

    // Check for valid UK phone
    jQuery.validator.addMethod("ukPhone", function(value, element) {
        var phone_number = value.replace(/\s+/g, "");
        return this.optional(element) || phone_number.length > 9 &&
		    phone_number.match(/^(((\+44)? ?(\(0\))? ?)|(0))( ?[0-9]{3,4}){3}$/);
    }, "Please enter a correctly formatted telephone number including area code");


    // Check for valid Mobile phone
    jQuery.validator.addMethod("mobilePhone", function(value, element) {
        var mobile_number = value.replace(/\s+/g, "");
        if (elemCheckboxOptinSMS.is(':checked')) {
            return mobile_number.length > 9 && mobile_number.match(/^(\+44\s?7\d{3}|\(?07\d{3}\)?)\s?\d{3}\s?\d{3}$/);
        }
        else {
            return true;
        }
    }, "Please enter a correctly formatted mobile number");

    // Check for valid password
    jQuery.validator.addMethod("passwordInvalid", function(value, element) {
        var password = value.replace(/\s+/g, "");
        return password.match(/(?=^.{8,}$)((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$/);
    }, "Your password must include at least one upper case letter, one lower case letter, and one numeric digit");


    // Check that email address is not being supplied
    jQuery.validator.addMethod("notEmail", function(value, element) {
        var field = value.replace(/\s+/g, "").toLowerCase();
        return !field.match(/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/);
    }, "Sorry, an email address is not valid");


    // Validate form
    elemFrmRegister.validate({
        rules: {
            gender: {
                required: true
            },
            forename: {
                required: true,
                minlength: 2,
                maxlength: 30,
                defaultInvalid: true
            },
            surname: {
                required: true,
                minlength: 2,
                maxlength: 50,
                defaultInvalid: true
            },
            dob_day: {
                dobInvalid: true
            },
            dob_month: {
                dobInvalid: true
            },
            dob_year: {
                dobInvalid: true
            },
            edd_day: {
                eddInvalid: true
            },
            edd_month: {
                eddInvalid: true
            },
            edd_year: {
                eddInvalid: true
            },
            child_first: {
                required: true
            },
            postcode_find: {
                required: function(element) {
                    return elemCheckboxOptinPost.is(':checked') && elemHomeAddressManually.val() == 0;
                },
                ukPostcode: {
                    depends: function(element) {
                        return elemCheckboxOptinPost.is(':checked') && elemHomeAddressManually.val() == 0;
                    }
                }
            },
            home_addr1: {
                required: function(element) {
                    return elemCheckboxOptinPost.is(':checked') && elemHomeAddressManually.val() == 1;
                }
            },
            home_town: {
                required: function(element) {
                    return elemCheckboxOptinPost.is(':checked') && elemHomeAddressManually.val() == 1;
                }
            },
            home_county: {
                required: function(element) {
                    return elemCheckboxOptinPost.is(':checked') && elemHomeAddressManually.val() == 1;
                }
            },
            home_postcode: {
                required: function(element) {
                    return elemCheckboxOptinPost.is(':checked') && elemHomeAddressManually.val() == 1;
                },
                ukPostcode: {
                    depends: function(element) {
                        return elemCheckboxOptinPost.is(':checked') && elemHomeAddressManually.val() == 1;
                    }
                }
            },
            home_tel: {
                ukPhone: true
            },
            mobile: {
                required: function(element) {
                    return elemCheckboxOptinSMS.is(':checked');
                },
                mobilePhone: {
                    depends: function(element) {
                        return elemCheckboxOptinSMS.is(':checked');
                    }
                }
            },
            email: {
                required: true,
                email: true,
                remote: "/services/verifyUserAvailability.aspx"
            },
            postcode: {
                required: function(element) {
                    return !elemCheckboxOptinPost.is(':checked');
                },
                ukPostcode: {
                    depends: function(element) {
                        return !elemCheckboxOptinPost.is(':checked');
                    }
                }
            },
            profile_name: {
                required: true,
                maxlength: 30,
                notEmail: true,
                remote: "/services/verifyUserAvailability.aspx"
            },
            password: {
                required: true,
                minlength: 8,
                maxlength: 15
            },
            password_confirmation: {
                required: true,
                minlength: 8,
                equalTo: "#password"
            },
            recruitment_code: {
                remote: "/services/verifyRecruitmentCode.aspx"
            },
            accept: "required"
        },
        groups: {
            dob: "dob_day dob_month dob_year",
            edd: "edd_day edd_month edd_year"
        },
        errorPlacement: function(error, element) {
            if (element.attr("id") == "dob_day" || element.attr("id") == "dob_month" || element.attr("id") == "dob_year") {
                error.insertAfter("#dob_year");
            }
            else if (element.attr("id") == "edd_day" || element.attr("id") == "edd_month" || element.attr("id") == "edd_year") {
                error.insertAfter("#edd_year");
            }
            else if (element.attr("id") == "accept") {
                error.appendTo("#acceptterms");
            }
            else {
                error.insertAfter(element);
            }
        },
        messages: {
            gender: {
                required: "Please tell us whether you are a mum or dad"
            },
            forename: {
                required: "Please enter your First Name",
                defaultInvalid: "Please enter your First Name",
                minlength: jQuery.format("Enter at least {0} characters"),
                maxlength: jQuery.format("Enter less than {0} characters")
            },
            surname: {
                required: "Please enter your Last Name",
                defaultInvalid: "Please enter your Last Name",
                minlength: jQuery.format("Enter at least {0} characters"),
                maxlength: jQuery.format("Enter less than {0} characters")
            },
            child_first: {
                required: "Please let us know if this is your first child"
            },
            postcode_find: {
                required: "Please enter your postcode"
            },
            home_addr1: {
                required: "Please enter your address"
            },
            home_town: {
                required: "Please enter your Town or City"
            },
            home_county: {
                required: "Please enter your County"
            },
            home_postcode: {
                required: "Please enter your postcode"
            },
            mobile: {
                required: "Please enter your mobile phone number"
            },
            email: {
                required: "Please enter your email address",
                remote: "The email address has already been registered"
            },
            postcode: {
                required: "Please enter your postcode",
                ukPostcode: "Please enter a correctly formatted UK postcode"
            },
            profile_name: {
                required: "Please enter your nickname",
                notEmail: "Sorry, an email address is not a valid nickname",
                remote: "Sorry, that nickname is already being used by somebody else"
            },
            password: {
                required: "Please enter a Password",
                rangelength: jQuery.format("Enter at least {0} characters")
            },
            password_confirmation: {
                required: "Please confirm your Password",
                minlength: jQuery.format("Enter at least {0} characters"),
                equalTo: "Enter the same password as above"
            },
            recruitment_code: {
                remote: "Sorry, that code is not valid"
            },
            accept: " "
        },
        // set this class to error-labels to indicate valid fields
        success: function(label) {
            // set &nbsp; as text for IE
            label.html("&nbsp;").addClass("checked");
        }


    });

    // Set to validate on submit button, this is done to allow postcode look up
    jQuery("#btnsubmit").click(function() {
        if (elemFrmRegister.valid()) {
            // Add hidden x/y coordinates for image button to pass mouse positons for task due to IE bug
            jQuery("#submit_coordinates").append("<input type='hidden' name='_TASK_ACTION_NEXT.x' value='1' /><input type='hidden' name='_TASK_ACTION_NEXT.y' value='1' />");
            jQuery("#btnsubmit").disabled = true;
            return true;
        }
        else {
            return false;
        }
    });


    // First name helper
    var defaultFirstName = "First Name";
    if (elemForename.length) {
        if (elemForename.val() == "") {
            // Set field
            elemForename.val(defaultFirstName);
        }
        elemForename.focus(
	      function() {
	          if (elemForename.val() == defaultFirstName) {
	              // Clear field
	              elemForename.val("");
	          }
	      });
    }

    // Last name helper
    var defaultLastName = "Last Name";
    if (elemSurname.length) {
        if (elemSurname.val() == "") {
            // Set field
            elemSurname.val(defaultLastName);
        }
        elemSurname.focus(
		      function() {
		          if (elemSurname.val() == defaultLastName) {
		              // Clear field
		              elemSurname.val("");
		          }
		      });
    }

    // Change Mum/Dad text depending on parents gender
    jQuery('.gender').click(function() {
        if (jQuery(this).is(':checked')) {
            strMumDad = "Mum/Dad";
            switch (jQuery(this).val()) {
                case 'F':
                    strMumDad = "mum";
                    break;
                case 'M':
                    strMumDad = "dad";
                    break;
                default:
                    strMumDad = "Mum/Dad";
            }
            // Update Mum/Dad text
            jQuery(".mum_dad").text(strMumDad);
        }
    });

    // Change Son/Daughter's text depending on child gender
    jQuery('.child_gender').click(function() {
        if (jQuery(this).is(':checked')) {
            strChildGender = "son/daughter's";
            switch (jQuery(this).val()) {
                case 'F':
                    strChildGender = "daughter's";
                    break;
                case 'M':
                    strChildGender = "son's";
                    break;
                default:
                    strChildGender = "son/daughter's";
            }
            // Update Son/Daughter's text
            jQuery(".mychild").text(strChildGender);
        }
    });


    // Hide All optin fields by default unless the actual checkmark has been clicked
    jQuery("div.optin_fields").hide();
    elemContactDetails.hide();
    elemMilkDetails.hide();

    // Optin in to all
    elemCheckboxOptinAll.click(function() {
        if (jQuery(this).is(':checked')) {
            // Make sure all optins are checkmarked
            jQuery("input.optin").each(function(i) {
                jQuery(this).attr("checked", "checked");
            });
            // Postcode not required as it will now be captured as optin
            elemAccountPostCode.hide();
            // Check to hide or show milk brands
            milkBrands();
            milkDetails();
            // Check to hide or show post details
            postDetails();
            // Check to hide or show sms details
            smsDetails();
        };
    });


    // Show opt in fields
    jQuery('input.optin').click(function() {
        var currentId = jQuery(this).attr("id");
        var emailCompareId = jQuery("#checkbox_optin_email").attr("id");
        var postcodeCompareId = jQuery("#checkbox_optin_post").attr("id");

        if (jQuery(this).is(':checked')) {
            // jQuery(this).parent().siblings("div.optin_fields").show();
            // If opted in to post, then hide account postcode field for login
            if (currentId == postcodeCompareId) {
                elemAccountPostCode.hide();
            }
            // Check to hide or show milk brands
            if (currentId == elemCheckboxOptinMilks.attr("id")) {
                milkBrands();
            }
        }
        else {
            jQuery(this).parent().siblings("div.optin_fields").hide();
            // Make sure opt in to all is reset
            elemCheckboxOptinAll.removeAttr("checked");
            // If not opted in to post, then show account postcode field for login
            if (currentId == postcodeCompareId) {
                elemAccountPostCode.show();
            }
        }
    });

    // Enter home adress manully
    function enterAddressManually(status) {
        if (status == "show") {
            jQuery("#enter_home_address span").text("Find address using my postcode");
            jQuery("#enter_home_address span").attr("title", "I want to enter my post code to find address");
            elemPostcodeFind.val("");
            jQuery("#home_address").removeClass("hide").addClass("show");
            elemPostcodeLookup.hide();
            elemHomeAddressManually.val("1");
        }
        else if (status == "hide") {
            jQuery("#enter_home_address span").text("Enter address manually");
            jQuery("#enter_home_address span").attr("title", "I want to enter my address manually");
            jQuery("#home_address").removeClass("show").addClass("hide");
            elemPostcodeLookup.show();
            elemHomeAddressManually.val("0");
            // Hide address selection if present
            if (elemAddressSelection.length) {
                elemAddressSelection.hide();
            }
        }
    }

    // Determine what to show on toogle in case page been refreshed or server side validation has occured
    function enterAddressManuallyToogle() {
        if (elemHomeAddressManually.val() == 1) {
            enterAddressManually("hide");
        }
        else {
            enterAddressManually("show");
        }
    }

    // Enter home address manually toggle
    jQuery("#enter_home_address").toggle(
	  function() {
	      enterAddressManuallyToogle();
	  },
	  function() {
	      enterAddressManuallyToogle();
	  }
	);

    // Check to see if manually entering address in case page been refreshed or server side validation has occured
    if (jQuery("#home_addr1").val() != "" || elemHomeAddressManually.val() == 1) {
        enterAddressManually("show");
    }
    else {
        enterAddressManually("hide");
    }

    if (elemAddressSelection.length && elemPostcodeFind.val() != "" && elemHomeAddressManually.val() == 0) {
        // Show address selection
        elemAddressSelection.show();
        // make sure find picker is hidden
        elemPostcodeLookup.hide();
    }

    // Style find my address button and attach click event
    var elemFindAddress = jQuery("#find_address");
    if (elemFindAddress.length) {
        elemFindAddress.mouseover(function() {
            jQuery(this).attr("src", "/images/buttons/findmyaddress_on.gif");
        }).mouseout(function() {
            jQuery(this).attr("src", "/images/buttons/findmyaddress_off.gif");
        });
        elemFindAddress.click(function() {
            if (elemPostcodeFind.valid()) {
                // Allow postcode look up and set up anchor
                elemFrmRegister.attr("action", strAddressAnchor);
                return true;
            }
            else {
                // Do not allow postcode look up
                return false;
            }
        });
    }

    // Set up anchor for use address button
    var elemSelectAddress = jQuery("#use_address");
    if (elemSelectAddress.length) {
        elemSelectAddress.click(function() {
            elemFrmRegister.attr("action", strAddressAnchor);
        });
    }

    // Scroll to page location based on anchor in URL
    var thisURL = document.location.toString();
    if (thisURL.match('#')) { // the URL contains an anchor
        // Get the anchor
        var thisAnchor = '#' + thisURL.split('#')[1];
        // Check anchor exists
        if (jQuery(thisAnchor).length) {
            // Find the anchor location
            var destination = jQuery(thisAnchor).offset().top;
            // Animate to anchor
            jQuery("html").animate({ scrollTop: destination }, 0);
        }
    }


    // Set Milks & Bottle feeding Title
    elemFirstChild.click(function() {
        // Detrmine if to show or hide milk brands
        milkBrands();
    });

    // Hide/Show Account PostCode if opted checked (this is onload in-case of page refresh)
    if (elemCheckboxOptinPost.is(":checked")) {
        elemAccountPostCode.hide();
    }
    else {
        elemAccountPostCode.show();
    }

    // Hide/Show Optin Post details
    elemCheckboxOptinPost.click(function() {
        // Detrmine if to show or hide post details
        postDetails();
    });

    // Hide/Show Optin SMS details
    elemCheckboxOptinSMS.click(function() {
        // Detrmine if to show or hide sms details
        smsDetails();
    });

    // Hide/Show Optin Milk details
    elemCheckboxOptinMilks.click(function() {
        // Detrmine if to show or hide milk details
        milkDetails();
    });

    // *******************
    // Page Refresh checks
    // *******************

    // If EDD/DOB Date is in the past or today
    childDetails();

    // Detrmine if to show or hide post details
    postDetails();

    // Detrmine if to show or hide sms details
    smsDetails();

    // Detrmine if to show or hide milk details
    milkDetails();

});