﻿
    function horlicks()
    {
    }

    // Validator
    horlicks.validator = function ()
    {
    };
    horlicks.validator.VALID_EMAIL_REGEX = "^[_a-zA-Z0-9-]+(\\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*\\.(([0-9]{1,3})|([a-zA-Z]{2,3})|(aero|coop|info|museum|name|mobi|asia|jobs|travel))$";
    horlicks.validator.VALID_POSTCODE_REGEX = "^[a-zA-Z]{1,2}[0-9][0-9A-Za-z]{0,1}[ ]{0,1}[0-9][A-Za-z]{2}$";
    horlicks.validator.isPopulated = function (text)
    {
        return !String.isNullOrEmpty(text.trim());
    };
    horlicks.validator.isEmail = function (text)
    {
        if (!horlicks.validator.isPopulated(text))
            return false;
        return new RegExp(horlicks.validator.VALID_EMAIL_REGEX, "gi").test(text);
    };
    horlicks.validator.isPostcode = function (text)
    {
        if (!horlicks.validator.isPopulated(text))
            return false;
        return new RegExp(horlicks.validator.VALID_POSTCODE_REGEX, "gi").test(text);
    };
    horlicks.validator.isValidDate = function (year, month, day)
    {
        var 
            _year = parseInt(year, 10),
            _month = parseInt(month, 10),
            _day = parseInt(day, 10);

        if (isNaN(_year) || isNaN(_month) || isNaN(_day))
            return false;

        var 
            date = new Date(_year, _month - 1, _day);

        return date.getFullYear() == _year && (date.getMonth() + 1) == _month && date.getDate() == _day;
    };

    horlicks.formatter = function ()
    {
    };
    horlicks.formatter.formatPostcode = function (postcode)
    {
        if (postcode.length > 3)
        {
            postcode = postcode.replace(/ /gi, "");
            return (postcode.substr(0, postcode.length - 3) + " " + postcode.substr(postcode.length - 3)).toUpperCase();
        }
        return postcode.toUpperCase();
    };
    horlicks.formatter.stripHTML = function (s)
    {
        return s.replace(new RegExp("<(.|\n)*?>", "gi"), "");
    };

    horlicks.webService = function ()
    {
    };
    horlicks.webService.lookupPostcode = function (postcode, houseNumber, successCallback, errorCallback)
    {
        var data =
        {
            SessionID: SESSION_ID,
            Postcode: postcode,
            HouseNumber: houseNumber
        };

        $.ajaxDotNet(WEBSERVICE_URL + "/LookupPostcode", {
            verb: "GET",
            data: data,
            success: function (obj)
            {
                if (successCallback)
                    successCallback(obj.d);
            },
            error: function (xhr, st, e)
            {
                if (errorCallback)
                    errorCallback(st, e);
            }
        });
    };
    horlicks.webService.getAddress = function (addressID, successCallback, errorCallback)
    {
        var data =
        {
            SessionID: SESSION_ID,
            AddressID: addressID
        };

        $.ajaxDotNet(WEBSERVICE_URL + "/GetAddress", {
            verb: "GET",
            data: data,
            success: function (obj)
            {
                if (successCallback)
                    successCallback(obj.d);
            },
            error: function (xhr, st, e)
            {
                if (errorCallback)
                    errorCallback(st, e);
            }
        });
    };
    horlicks.webService.getStoryPage = function (page, successCallback, errorCallback)
    {
        var data =
        {
            Page: page
        };

        $.ajaxDotNet(WEBSERVICE_URL + "/GetStoryPage", {
            verb: "GET",
            data: data,
            success: function (obj)
            {
                if (successCallback)
                    successCallback(obj.d);
            },
            error: function (xhr, st, e)
            {
                if (errorCallback)
                    errorCallback(st, e);
            }
        });
    };

    horlicks.questionPanel = function (controlPrefix)
    {
        var _this = this;
        _this.controlPrefix = controlPrefix;
        _this.currentSlide = 0;

        _this.divSlideContainer = $("#" + _this.controlPrefix + "divSlideContainer");
        _this.divSlide1 = $("#" + _this.controlPrefix + "divSlide1");
        _this.divSlide2 = $("#" + _this.controlPrefix + "divSlide2");
        _this.divSlide3 = $("#" + _this.controlPrefix + "divSlide3");

        _this.inpProductOriginal = $("#" + _this.controlPrefix + "inpProductOriginal");
        _this.inpProductLight = $("#" + _this.controlPrefix + "inpProductLight");
        _this.inpProductMaltChocolate = $("#" + _this.controlPrefix + "inpProductMaltChocolate");
        _this.inpProductChoiceAlways = $("#" + _this.controlPrefix + "inpProductChoiceAlways");
        _this.inpProductChoiceSometimes = $("#" + _this.controlPrefix + "inpProductChoiceSometimes");
        _this.selHowOften = $("#" + _this.controlPrefix + "selHowOften");

        _this.divSlideButtonContainer = $(".slide-button-container");
        _this.divSlideButtons = $(".slide-button", _this.divSlideButtonContainer);

        _this.aPrevious = $(".button-previous");
        _this.aNext = $(".button-next");

        _this.divSlideContainer.css("width", "330%");
        _this.divSlide1.css("width", "33%");
        _this.divSlide1.css("height", "260px");
        _this.divSlide2.css("width", "33%");
        _this.divSlide2.css("height", "260px");
        _this.divSlide3.css("width", "33%");
        _this.divSlide3.css("height", "260px");

        function slideToSlide(index)
        {
            _this.divSlideContainer.stop().animate({ left: (index * -108.9) + "%" }, 500);

            if (index <= 0)
                _this.aPrevious.hide();
            else
                _this.aPrevious.show();

            if (index >= 2)
                _this.aNext.hide();
            else
                _this.aNext.show();

            _this.currentSlide = index;
        }

        _this.inpProductOriginal.click(function (evt)
        {
            $(_this.divSlideButtons[0]).addClass("slide-button-filled");
            slideToSlide(1);
        });
        _this.inpProductLight.click(function (evt)
        {
            $(_this.divSlideButtons[0]).addClass("slide-button-filled");
            slideToSlide(1);
        });
        _this.inpProductMaltChocolate.click(function (evt)
        {
            $(_this.divSlideButtons[0]).addClass("slide-button-filled");
            slideToSlide(1);
        });
        _this.inpProductChoiceAlways.click(function (evt)
        {
            $(_this.divSlideButtons[1]).addClass("slide-button-filled");
            slideToSlide(2);
        });
        _this.inpProductChoiceSometimes.click(function (evt)
        {
            $(_this.divSlideButtons[1]).addClass("slide-button-filled");
            slideToSlide(2);
        });
        _this.selHowOften.change(function (evt)
        {
            $(_this.divSlideButtons[2]).removeClass("slide-button-filled");
            if (parseInt(_this.selHowOften.val()) > 0)
                $(_this.divSlideButtons[2]).addClass("slide-button-filled");
        });

        _this.aNext.click(function (evt)
        {
            evt.preventDefault();
            slideToSlide(_this.currentSlide + 1);
        });

        _this.aPrevious.click(function (evt)
        {
            evt.preventDefault();
            slideToSlide(_this.currentSlide - 1);
        });

        _this.divSlideButtonContainer.show();
        _this.aNext.show();
    };

    // Send Us Your Story Page - This should match the .Net server side page for Non-JavaScript functionality
    horlicks.sendUsYourStoryPage = function (controlPrefix)
    {
        var _this = this;
        _this.controlPrefix = controlPrefix;
        _this.touchedDOBDay = false;
        _this.touchedDOBMonth = false;
        _this.touchedDOBYear = false;
        _this.submitting = false;

        $(function () { _this.initialise(); });
    };
    horlicks.sendUsYourStoryPage.prototype.initialise = function ()
    {
        var _this = this;
        _this.bindControls();
        _this.questionPanel = new horlicks.questionPanel(_this.controlPrefix);

        function DOBBlur()
        {
            if (_this.touchedDOBDay && _this.touchedDOBMonth && _this.touchedDOBYear)
                _this.validateSubmissionDOB();
        }

        _this.selDOBDay.focus(function (evt)
        {
            _this.touchedDOBDay = true;
        });
        _this.selDOBMonth.focus(function (evt)
        {
            _this.touchedDOBMonth = true;
        });
        _this.selDOBYear.focus(function (evt)
        {
            _this.touchedDOBYear = true;
        });

        _this.inpStoryTitle.blur(function (evt)
        {
            _this.validateStoryTitle();
        });
        _this.tarStory.blur(function (evt)
        {
            _this.validateStory();
        });
        _this.selTitle.blur(function (evt)
        {
            _this.validateSubmissionTitle();
        });
        _this.inpFirstName.blur(function (evt)
        {
            _this.validateSubmissionFirstName();
        });
        _this.inpLastName.blur(function (evt)
        {
            _this.validateSubmissionLastName();
        });
        _this.selDOBDay.blur(function (evt)
        {
            DOBBlur();
        });
        _this.selDOBMonth.blur(function (evt)
        {
            DOBBlur();
        });
        _this.selDOBYear.blur(function (evt)
        {
            DOBBlur();
        });
        _this.inpEmail.blur(function (evt)
        {
            _this.validateSubmissionEmail();
        });
        _this.inpPostcodeForLookup.blur(function (evt)
        {
            _this.inpPostcodeForLookup.val(horlicks.formatter.formatPostcode(_this.inpPostcodeForLookup.val()));
            _this.validatePostcodeLookup();
        });
        _this.inpAddress1.blur(function (evt)
        {
            _this.validateSubmissionAddressAddress1();
        });
        _this.inpTownCity.blur(function (evt)
        {
            _this.validateSubmissionAddressTown();
        });
        _this.inpPostcode.blur(function (evt)
        {
            _this.inpPostcode.val(horlicks.formatter.formatPostcode(_this.inpPostcode.val()));
            _this.validateSubmissionAddressPostcode();
        });
        _this.inpSignUpTerms.blur(function (evt)
        {
            _this.validateTerms();
        });

        _this.butFindAddress.click(function (evt)
        {
            evt.preventDefault();

            var bValid = true;

            if (!_this.validatePostcodeLookup())
                bValid = false;

            if (bValid)
            {
                _this.selAddressConfirm.empty();
                horlicks.webService.lookupPostcode
                (
                    _this.inpPostcodeForLookup.val(),
                    "",
                    function (data)
                    {
                        $.each(data, function (index, value)
                        {
                            $("<option value=\"" + this.SearchAddressId + "\">" + this.SearchAddressText + "</option>").appendTo(_this.selAddressConfirm);
                        });

                        _this.divPostcodeLookup.hide();
                        _this.divSelectAddress.show();
                    },
                    function (st, e)
                    {
                        alert("There was a problem looking up your address.");
                    }
                );
            }
            else
            {
                var el = $(".error-field").first();
                if (el.length > 0)
                    el[0].scrollIntoView();
            }
        });
        _this.selAddressConfirm.click(function (evt)
        {
            evt.preventDefault();
            horlicks.webService.getAddress
            (
                _this.selAddressConfirm.val(),
                function (data)
                {
                    _this.inpAddress1.val(data.AddressLine1);
                    _this.inpAddress2.val(data.AddressLine2);
                    _this.inpAddress3.val(data.AddressLine3);
                    _this.inpTownCity.val(data.Town);
                    _this.inpCounty.val(data.County);
                    _this.inpPostcode.val(data.Postcode);

                    _this.activateManualAddress();
                },
                function (st, e)
                {
                    alert("There was a problem looking up your address.");
                }
            );
        });
        _this.butManualAddress.click(function (evt)
        {
            evt.preventDefault();

            if (_this.inpManualAddress.val() != "1")
                _this.activateManualAddress();
            else
                _this.activateAddressLookup();
        });

        var 
            optionalCaptureVisible = false;

        _this.divOptionalCapture.hide();

        function showOptionalCapture()
        {
            if (!optionalCaptureVisible)
            {
                optionalCaptureVisible = true;
                _this.divOptionalCapture.show();

                var 
                    optionalCaptureHeight = _this.divOptionalCapture.height();

                _this.divOptionalCapture.css("height", "0px");
                _this.divOptionalCapture.stop().animate({ height: optionalCaptureHeight }, 500);
            }
        }

        _this.inpSignupHorlicksEmail.click(function (evt)
        {
            showOptionalCapture();
        });
        _this.inpSignupHorlicksPost.click(function (evt)
        {
            showOptionalCapture();
        });

        _this.butSubmit.click(function (evt)
        {
            if (_this.inpManualAddress.val() != "1")
            {
                // Can't submit as the address isn't populated yet
                _this.validateStoryInformation();
                _this.validateSubmissionInformation();
                _this.validatePostcodeLookup(true);
                _this.validatePostcodeSelection(true);
                _this.validateTerms();
                evt.preventDefault();
            }
            else
            {
                if (_this.submitting)
                {
                    evt.preventDefault();
                    return;
                }

                var bValid = true;

                if (!_this.validateStoryInformation())
                    bValid = false;

                if (!_this.validateSubmissionInformation())
                    bValid = false;

                _this.divAddress1.removeClass("error-field");
                _this.divTown.removeClass("error-field");
                _this.divPostcode.removeClass("error-field");
                if (_this.inpSignupHorlicksEmail[0].checked || _this.inpSignupHorlicksPost[0].checked || _this.inpSignupGSKEmail[0].checked || _this.inpSignupGSKPost[0].checked)
                {
                    if (!_this.validateSubmissionAddress())
                        bValid = false;
                }

                if (!_this.validateTerms())
                    bValid = false;

                if (!bValid)
                {
                    evt.preventDefault();
                    var el = $(".error-field").first();
                    if (el.length > 0)
                        el[0].scrollIntoView();
                }
                else
                {
                    _this.submitting = true;
                    _this.butSubmit.addClass("submit-button-submitting");
                    _this.butSubmit.val("submitting...");
                }
            }
        });
    };
    horlicks.sendUsYourStoryPage.prototype.bindControls = function ()
    {
        this.divStoryTitle = $("#" + this.controlPrefix + "divStoryTitle");
        this.inpStoryTitle = $("#" + this.controlPrefix + "inpStoryTitle");
        this.divStory = $("#" + this.controlPrefix + "divStory");
        this.tarStory = $("#" + this.controlPrefix + "tarStory");
        this.divTitle = $("#" + this.controlPrefix + "divTitle");
        this.selTitle = $("#" + this.controlPrefix + "selTitle");
        this.divFirstName = $("#" + this.controlPrefix + "divFirstName");
        this.inpFirstName = $("#" + this.controlPrefix + "inpFirstName");
        this.divLastName = $("#" + this.controlPrefix + "divLastName");
        this.inpLastName = $("#" + this.controlPrefix + "inpLastName");
        this.divDOB = $("#" + this.controlPrefix + "divDOB");
        this.selDOBDay = $("#" + this.controlPrefix + "selDOBDay");
        this.selDOBMonth = $("#" + this.controlPrefix + "selDOBMonth");
        this.selDOBYear = $("#" + this.controlPrefix + "selDOBYear");
        this.divEmail = $("#" + this.controlPrefix + "divEmail");
        this.inpEmail = $("#" + this.controlPrefix + "inpEmail");
        this.divPostcodeLookup = $("#" + this.controlPrefix + "divPostcodeLookup");
        this.inpPostcodeForLookup = $("#" + this.controlPrefix + "inpPostcodeForLookup");
        this.butFindAddress = $("#" + this.controlPrefix + "butFindAddress");
        this.divSelectAddress = $("#" + this.controlPrefix + "divSelectAddress");
        this.selAddressConfirm = $("#" + this.controlPrefix + "selAddressConfirm");
        this.divManualAddress = $("#" + this.controlPrefix + "divManualAddress");
        this.inpManualAddress = $("#" + this.controlPrefix + "inpManualAddress");
        this.butManualAddress = $("#" + this.controlPrefix + "butManualAddress");
        this.divAddress1 = $("#" + this.controlPrefix + "divAddress1");
        this.inpAddress1 = $("#" + this.controlPrefix + "inpAddress1");
        this.inpAddress2 = $("#" + this.controlPrefix + "inpAddress2");
        this.inpAddress3 = $("#" + this.controlPrefix + "inpAddress3");
        this.divTown = $("#" + this.controlPrefix + "divTown");
        this.inpTownCity = $("#" + this.controlPrefix + "inpTownCity");
        this.inpCounty = $("#" + this.controlPrefix + "inpCounty");
        this.divPostcode = $("#" + this.controlPrefix + "divPostcode");
        this.inpPostcode = $("#" + this.controlPrefix + "inpPostcode");
        this.inpSignupHorlicksEmail = $("#" + this.controlPrefix + "inpSignupHorlicksEmail");
        this.inpSignupHorlicksPost = $("#" + this.controlPrefix + "inpSignupHorlicksPost");
        this.divOptInsGSK = $("#" + this.controlPrefix + "divOptInsGSK");
        this.inpSignupGSKEmail = $("#" + this.controlPrefix + "inpSignupGSKEmail");
        this.inpSignupGSKPost = $("#" + this.controlPrefix + "inpSignupGSKPost");
        this.divSignUpTerms = $("#" + this.controlPrefix + "divSignUpTerms");
        this.inpSignUpTerms = $("#" + this.controlPrefix + "inpSignUpTerms");
        this.butSubmit = $("#" + this.controlPrefix + "butSubmit");
        this.divOptionalCapture = $(".optional-capture");
    };
    horlicks.sendUsYourStoryPage.prototype.activateManualAddress = function ()
    {
        this.divPostcodeLookup.hide();
        this.divSelectAddress.hide();
        this.divManualAddress.show();
        this.butManualAddress.val("Lookup your address");
        this.inpManualAddress.val("1");
    };
    horlicks.sendUsYourStoryPage.prototype.activateAddressLookup = function ()
    {
        this.divPostcodeLookup.show();
        this.divSelectAddress.hide();
        this.divManualAddress.hide();
        this.butManualAddress.val("Enter address manually");
        this.inpManualAddress.val("0");
    };
    horlicks.sendUsYourStoryPage.prototype.validateStoryTitle = function ()
    {
        this.divStoryTitle.removeClass("error-field");
        if (!horlicks.validator.isPopulated(this.inpStoryTitle.val()))
        {
            this.divStoryTitle.addClass("error-field");
            return false;
        }
        return true;
    };
    horlicks.sendUsYourStoryPage.prototype.validateStory = function ()
    {
        this.tarStory.val(horlicks.formatter.stripHTML(this.tarStory.val()));
        this.divStory.removeClass("error-field");
        if (!horlicks.validator.isPopulated(this.tarStory.val()) || this.tarStory.val().length > 4000)
        {
            this.divStory.addClass("error-field");
            return false;
        }
        return true;
    };
    horlicks.sendUsYourStoryPage.prototype.validateStoryInformation = function ()
    {
        var bReturn = true;

        if (!this.validateStoryTitle())
            bReturn = false;

        if (!this.validateStory())
            bReturn = false;

        return bReturn;
    };
    horlicks.sendUsYourStoryPage.prototype.validateSubmissionTitle = function ()
    {
        this.divTitle.removeClass("error-field");
        if (this.selTitle.val() == String.empty)
        {
            this.divTitle.addClass("error-field");
            return false;
        }
        return true;
    };
    horlicks.sendUsYourStoryPage.prototype.validateSubmissionFirstName = function ()
    {
        this.divFirstName.removeClass("error-field");
        if (!horlicks.validator.isPopulated(this.inpFirstName.val()))
        {
            this.divFirstName.addClass("error-field");
            return false;
        }
        return true;
    };
    horlicks.sendUsYourStoryPage.prototype.validateSubmissionLastName = function ()
    {
        this.divLastName.removeClass("error-field");
        if (!horlicks.validator.isPopulated(this.inpLastName.val()))
        {
            this.divLastName.addClass("error-field");
            return false;
        }
        return true;
    };
    horlicks.sendUsYourStoryPage.prototype.validateSubmissionDOB = function ()
    {
        this.divDOB.removeClass("error-field");
        if (!horlicks.validator.isPopulated(this.selDOBDay.val()) || !horlicks.validator.isPopulated(this.selDOBMonth.val()) || !horlicks.validator.isPopulated(this.selDOBYear.val()))
        {
            this.divDOB.addClass("error-field");
            return false;
        }
        else
        {
            if (!horlicks.validator.isValidDate(this.selDOBYear.val().padLeft(4, '0'), this.selDOBMonth.val().padLeft(2, '0'), this.selDOBDay.val().padLeft(2, '0')))
            {
                this.divDOB.addClass("error-field");
                return false;
            }
        }
        return true;
    };
    horlicks.sendUsYourStoryPage.prototype.validateSubmissionEmail = function ()
    {
        this.divEmail.removeClass("error-field");
        if (!horlicks.validator.isEmail(this.inpEmail.val()))
        {
            this.divEmail.addClass("error-field");
            return false;
        }
        return true;
    };
    horlicks.sendUsYourStoryPage.prototype.validateSubmissionInformation = function ()
    {
        var bReturn = true;

        if (!this.validateSubmissionTitle())
            bReturn = false;

        if (!this.validateSubmissionFirstName())
            bReturn = false;

        if (!this.validateSubmissionLastName())
            bReturn = false;

        if (!this.validateSubmissionDOB())
            bReturn = false;

        if (!this.validateSubmissionEmail())
            bReturn = false;

        return bReturn;
    };
    horlicks.sendUsYourStoryPage.prototype.validatePostcodeLookup = function (forceFail)
    {
        this.divPostcodeLookup.removeClass("error-field");
        if (forceFail || !horlicks.validator.isPostcode(this.inpPostcodeForLookup.val()))
        {
            this.divPostcodeLookup.addClass("error-field");
            return false;
        }
        return true;
    };
    horlicks.sendUsYourStoryPage.prototype.validatePostcodeSelection = function (forceFail)
    {
        this.divSelectAddress.removeClass("error-field");
        if (forceFail || String.isNullOrEmpty(this.selAddressConfirm.val()) || !horlicks.validator.isPopulated(this.selAddressConfirm.val()))
        {
            this.divSelectAddress.addClass("error-field");
            return false;
        }
        return true;
    };
    horlicks.sendUsYourStoryPage.prototype.validateSubmissionAddressAddress1 = function ()
    {
        this.divAddress1.removeClass("error-field");
        if (!horlicks.validator.isPopulated(this.inpAddress1.val()))
        {
            this.divAddress1.addClass("error-field");
            return false;
        }
        return true;
    };
    horlicks.sendUsYourStoryPage.prototype.validateSubmissionAddressTown = function ()
    {
        this.divTown.removeClass("error-field");
        if (!horlicks.validator.isPopulated(this.inpTownCity.val()))
        {
            this.divTown.addClass("error-field");
            return false;
        }
        return true;
    };
    horlicks.sendUsYourStoryPage.prototype.validateSubmissionAddressPostcode = function ()
    {
        this.divPostcode.removeClass("error-field");
        if (!horlicks.validator.isPostcode(this.inpPostcode.val()))
        {
            this.divPostcode.addClass("error-field");
            return false;
        }
        return true;
    };
    horlicks.sendUsYourStoryPage.prototype.validateSubmissionAddress = function ()
    {
        var bReturn = true;

        if (!this.validateSubmissionAddressAddress1())
            bReturn = false;

        if (!this.validateSubmissionAddressTown())
            bReturn = false;

        if (!this.validateSubmissionAddressPostcode())
            bReturn = false;

        return bReturn;
    };
    horlicks.sendUsYourStoryPage.prototype.validateTerms = function ()
    {
        this.divSignUpTerms.removeClass("error-field");
        if (!this.inpSignUpTerms[0].checked)
        {
            this.divSignUpTerms.addClass("error-field");
            return false;
        }
        return true;
    };

    // Contact Us Page - This should match the .Net server side page for Non-JavaScript functionality
    horlicks.contactUsPage = function (controlPrefix)
    {
        var _this = this;
        _this.controlPrefix = controlPrefix;

        $(function () { _this.initialise(); });
    };
    horlicks.contactUsPage.prototype.initialise = function ()
    {
        var _this = this;
        _this.bindControls();
        _this.questionPanel = new horlicks.questionPanel(_this.controlPrefix);

        _this.tarMessage.blur(function (evt)
        {
            _this.validateMessage();
        });
        _this.selTitle.blur(function (evt)
        {
            _this.validateSubmissionTitle();
        });
        _this.inpFirstName.blur(function (evt)
        {
            _this.validateSubmissionFirstName();
        });
        _this.inpLastName.blur(function (evt)
        {
            _this.validateSubmissionLastName();
        });
        _this.inpEmail.blur(function (evt)
        {
            _this.validateSubmissionEmail();
        });
        _this.inpPostcodeForLookup.blur(function (evt)
        {
            _this.inpPostcodeForLookup.val(horlicks.formatter.formatPostcode(_this.inpPostcodeForLookup.val()));
            _this.validatePostcodeLookup();
        });
        _this.inpAddress1.blur(function (evt)
        {
            _this.validateSubmissionAddressAddress1();
        });
        _this.inpTownCity.blur(function (evt)
        {
            _this.validateSubmissionAddressTown();
        });
        _this.inpPostcode.blur(function (evt)
        {
            _this.inpPostcode.val(horlicks.formatter.formatPostcode(_this.inpPostcode.val()));
            _this.validateSubmissionAddressPostcode();
        });
        _this.inpSignUpTerms.blur(function (evt)
        {
            _this.validateTerms();
        });

        _this.butFindAddress.click(function (evt)
        {
            evt.preventDefault();

            var bValid = true;

            if (!_this.validatePostcodeLookup())
                bValid = false;

            if (bValid)
            {
                _this.selAddressConfirm.empty();
                horlicks.webService.lookupPostcode
                (
                    _this.inpPostcodeForLookup.val(),
                    "",
                    function (data)
                    {
                        $.each(data, function (index, value)
                        {
                            $("<option value=\"" + this.SearchAddressId + "\">" + this.SearchAddressText + "</option>").appendTo(_this.selAddressConfirm);
                        });

                        _this.divPostcodeLookup.hide();
                        _this.divSelectAddress.show();
                    },
                    function (st, e)
                    {
                        alert("There was a problem looking up your address.");
                    }
                );
            }
            else
            {
                var el = $(".error-field").first();
                if (el.length > 0)
                    el[0].scrollIntoView();
            }
        });
        _this.selAddressConfirm.click(function (evt)
        {
            evt.preventDefault();
            horlicks.webService.getAddress
            (
                _this.selAddressConfirm.val(),
                function (data)
                {
                    _this.inpAddress1.val(data.AddressLine1);
                    _this.inpAddress2.val(data.AddressLine2);
                    _this.inpAddress3.val(data.AddressLine3);
                    _this.inpTownCity.val(data.Town);
                    _this.inpCounty.val(data.County);
                    _this.inpPostcode.val(data.Postcode);

                    _this.activateManualAddress();
                },
                function (st, e)
                {
                    alert("There was a problem looking up your address.");
                }
            );
        });
        _this.butManualAddress.click(function (evt)
        {
            evt.preventDefault();

            if (_this.inpManualAddress.val() != "1")
                _this.activateManualAddress();
            else
                _this.activateAddressLookup();
        });

        var 
            optinsGSKVisible = false;

        _this.divOptInsGSK.hide();

        function showOptInsGSK()
        {
            if (!optinsGSKVisible)
            {
                optinsGSKVisible = true;
                _this.divOptInsGSK.show();

                var 
                    optinsGSKHeight = _this.divOptInsGSK.height();

                _this.divOptInsGSK.css("height", "0px");
                _this.divOptInsGSK.stop().animate({ height: optinsGSKHeight }, 500);
            }
        }

        _this.inpSignupHorlicksEmail.click(function (evt)
        {
            showOptInsGSK();
        });
        _this.inpSignupHorlicksPost.click(function (evt)
        {
            showOptInsGSK();
        });

        _this.butSubmit.click(function (evt)
        {
            if (_this.inpManualAddress.val() != "1")
            {
                // Can't submit as the address isn't populated yet
                _this.validateMessage();
                _this.validateSubmissionInformation();
                _this.validatePostcodeLookup(true);
                _this.validatePostcodeSelection(true);
                _this.validateTerms();
                evt.preventDefault();
            }
            else
            {
                var bValid = true;

                if (!_this.validateMessage())
                    bValid = false;

                if (!_this.validateSubmissionInformation())
                    bValid = false;

                if (!_this.validateSubmissionAddress())
                    bValid = false;

                if (!_this.validateTerms())
                    bValid = false;

                if (!bValid)
                {
                    evt.preventDefault();
                    var el = $(".error-field").first();
                    if (el.length > 0)
                        el[0].scrollIntoView();
                }
            }
        });
    };
    horlicks.contactUsPage.prototype.bindControls = function ()
    {
        this.divMessage = $("#" + this.controlPrefix + "divMessage");
        this.tarMessage = $("#" + this.controlPrefix + "tarMessage");
        this.divTitle = $("#" + this.controlPrefix + "divTitle");
        this.selTitle = $("#" + this.controlPrefix + "selTitle");
        this.divFirstName = $("#" + this.controlPrefix + "divFirstName");
        this.inpFirstName = $("#" + this.controlPrefix + "inpFirstName");
        this.divLastName = $("#" + this.controlPrefix + "divLastName");
        this.inpLastName = $("#" + this.controlPrefix + "inpLastName");
        this.divEmail = $("#" + this.controlPrefix + "divEmail");
        this.inpEmail = $("#" + this.controlPrefix + "inpEmail");
        this.divPostcodeLookup = $("#" + this.controlPrefix + "divPostcodeLookup");
        this.inpPostcodeForLookup = $("#" + this.controlPrefix + "inpPostcodeForLookup");
        this.butFindAddress = $("#" + this.controlPrefix + "butFindAddress");
        this.divSelectAddress = $("#" + this.controlPrefix + "divSelectAddress");
        this.selAddressConfirm = $("#" + this.controlPrefix + "selAddressConfirm");
        this.divManualAddress = $("#" + this.controlPrefix + "divManualAddress");
        this.inpManualAddress = $("#" + this.controlPrefix + "inpManualAddress");
        this.butManualAddress = $("#" + this.controlPrefix + "butManualAddress");
        this.divAddress1 = $("#" + this.controlPrefix + "divAddress1");
        this.inpAddress1 = $("#" + this.controlPrefix + "inpAddress1");
        this.inpAddress2 = $("#" + this.controlPrefix + "inpAddress2");
        this.inpAddress3 = $("#" + this.controlPrefix + "inpAddress3");
        this.divTown = $("#" + this.controlPrefix + "divTown");
        this.inpTownCity = $("#" + this.controlPrefix + "inpTownCity");
        this.inpCounty = $("#" + this.controlPrefix + "inpCounty");
        this.divPostcode = $("#" + this.controlPrefix + "divPostcode");
        this.inpPostcode = $("#" + this.controlPrefix + "inpPostcode");
        this.inpSignupHorlicksEmail = $("#" + this.controlPrefix + "inpSignupHorlicksEmail");
        this.inpSignupHorlicksPost = $("#" + this.controlPrefix + "inpSignupHorlicksPost");
        this.divOptInsGSK = $("#" + this.controlPrefix + "divOptInsGSK");
        this.divSignUpTerms = $("#" + this.controlPrefix + "divSignUpTerms");
        this.inpSignUpTerms = $("#" + this.controlPrefix + "inpSignUpTerms");
        this.butSubmit = $("#" + this.controlPrefix + "butSubmit");
    };
    horlicks.contactUsPage.prototype.activateManualAddress = function ()
    {
        this.divPostcodeLookup.hide();
        this.divSelectAddress.hide();
        this.divManualAddress.show();
        this.butManualAddress.val("Lookup your address");
        this.inpManualAddress.val("1");
    };
    horlicks.contactUsPage.prototype.activateAddressLookup = function ()
    {
        this.divPostcodeLookup.show();
        this.divSelectAddress.hide();
        this.divManualAddress.hide();
        this.butManualAddress.val("Enter address manually");
        this.inpManualAddress.val("0");
    };
    horlicks.contactUsPage.prototype.validateMessage = function ()
    {
        this.divMessage.removeClass("error-field");
        if (!horlicks.validator.isPopulated(this.tarMessage.val()) || this.tarMessage.val().length > 2000)
        {
            this.divMessage.addClass("error-field");
            return false;
        }
        return true;
    };
    horlicks.contactUsPage.prototype.validateSubmissionTitle = function ()
    {
        this.divTitle.removeClass("error-field");
        if (this.selTitle.val() == String.empty)
        {
            this.divTitle.addClass("error-field");
            return false;
        }
        return true;
    };
    horlicks.contactUsPage.prototype.validateSubmissionFirstName = function ()
    {
        this.divFirstName.removeClass("error-field");
        if (!horlicks.validator.isPopulated(this.inpFirstName.val()))
        {
            this.divFirstName.addClass("error-field");
            return false;
        }
        return true;
    };
    horlicks.contactUsPage.prototype.validateSubmissionLastName = function ()
    {
        this.divLastName.removeClass("error-field");
        if (!horlicks.validator.isPopulated(this.inpLastName.val()))
        {
            this.divLastName.addClass("error-field");
            return false;
        }
        return true;
    };
    horlicks.contactUsPage.prototype.validateSubmissionEmail = function ()
    {
        this.divEmail.removeClass("error-field");
        if (!horlicks.validator.isEmail(this.inpEmail.val()))
        {
            this.divEmail.addClass("error-field");
            return false;
        }
        return true;
    };
    horlicks.contactUsPage.prototype.validateSubmissionInformation = function ()
    {
        var bReturn = true;

        if (!this.validateSubmissionTitle())
            bReturn = false;

        if (!this.validateSubmissionFirstName())
            bReturn = false;

        if (!this.validateSubmissionLastName())
            bReturn = false;

        if (!this.validateSubmissionEmail())
            bReturn = false;

        return bReturn;
    };
    horlicks.contactUsPage.prototype.validatePostcodeLookup = function (forceFail)
    {
        this.divPostcodeLookup.removeClass("error-field");
        if (forceFail || !horlicks.validator.isPostcode(this.inpPostcodeForLookup.val()))
        {
            this.divPostcodeLookup.addClass("error-field");
            return false;
        }
        return true;
    };
    horlicks.contactUsPage.prototype.validatePostcodeSelection = function (forceFail)
    {
        this.divSelectAddress.removeClass("error-field");
        if (forceFail || String.isNullOrEmpty(this.selAddressConfirm.val()) || !horlicks.validator.isPopulated(this.selAddressConfirm.val()))
        {
            this.divSelectAddress.addClass("error-field");
            return false;
        }
        return true;
    };
    horlicks.contactUsPage.prototype.validateSubmissionAddressAddress1 = function ()
    {
        this.divAddress1.removeClass("error-field");
        if (!horlicks.validator.isPopulated(this.inpAddress1.val()))
        {
            this.divAddress1.addClass("error-field");
            return false;
        }
        return true;
    };
    horlicks.contactUsPage.prototype.validateSubmissionAddressTown = function ()
    {
        this.divTown.removeClass("error-field");
        if (!horlicks.validator.isPopulated(this.inpTownCity.val()))
        {
            this.divTown.addClass("error-field");
            return false;
        }
        return true;
    };
    horlicks.contactUsPage.prototype.validateSubmissionAddressPostcode = function ()
    {
        this.divPostcode.removeClass("error-field");
        if (!horlicks.validator.isPostcode(this.inpPostcode.val()))
        {
            this.divPostcode.addClass("error-field");
            return false;
        }
        return true;
    };
    horlicks.contactUsPage.prototype.validateSubmissionAddress = function ()
    {
        var bReturn = true;

        if (!this.validateSubmissionAddressAddress1())
            bReturn = false;

        if (!this.validateSubmissionAddressTown())
            bReturn = false;

        if (!this.validateSubmissionAddressPostcode())
            bReturn = false;

        return bReturn;
    };
    horlicks.contactUsPage.prototype.validateTerms = function ()
    {
        this.divSignUpTerms.removeClass("error-field");
        if (!this.inpSignUpTerms[0].checked)
        {
            this.divSignUpTerms.addClass("error-field");
            return false;
        }
        return true;
    };

    // Sign Up Page - This should match the .Net server side page for Non-JavaScript functionality
    horlicks.signUpPage = function (controlPrefix)
    {
        var _this = this;
        _this.controlPrefix = controlPrefix;
        _this.touchedDOBDay = false;
        _this.touchedDOBMonth = false;
        _this.touchedDOBYear = false;

        $(function () { _this.initialise(); });
    };
    horlicks.signUpPage.prototype.initialise = function ()
    {
        var _this = this;
        _this.bindControls();
        _this.questionPanel = new horlicks.questionPanel(_this.controlPrefix);

        function DOBBlur()
        {
            if (_this.touchedDOBDay && _this.touchedDOBMonth && _this.touchedDOBYear)
                _this.validateSubmissionDOB();
        }

        _this.selDOBDay.focus(function (evt)
        {
            _this.touchedDOBDay = true;
        });
        _this.selDOBMonth.focus(function (evt)
        {
            _this.touchedDOBMonth = true;
        });
        _this.selDOBYear.focus(function (evt)
        {
            _this.touchedDOBYear = true;
        });

        _this.selTitle.blur(function (evt)
        {
            _this.validateSubmissionTitle();
        });
        _this.inpFirstName.blur(function (evt)
        {
            _this.validateSubmissionFirstName();
        });
        _this.inpLastName.blur(function (evt)
        {
            _this.validateSubmissionLastName();
        });
        _this.selDOBDay.blur(function (evt)
        {
            DOBBlur();
        });
        _this.selDOBMonth.blur(function (evt)
        {
            DOBBlur();
        });
        _this.selDOBYear.blur(function (evt)
        {
            DOBBlur();
        });
        _this.inpEmail.blur(function (evt)
        {
            _this.validateSubmissionEmail();
        });
        _this.inpPostcodeForLookup.blur(function (evt)
        {
            _this.inpPostcodeForLookup.val(horlicks.formatter.formatPostcode(_this.inpPostcodeForLookup.val()));
            _this.validatePostcodeLookup();
        });
        _this.inpAddress1.blur(function (evt)
        {
            _this.validateSubmissionAddressAddress1();
        });
        _this.inpTownCity.blur(function (evt)
        {
            _this.validateSubmissionAddressTown();
        });
        _this.inpPostcode.blur(function (evt)
        {
            _this.inpPostcode.val(horlicks.formatter.formatPostcode(_this.inpPostcode.val()));
            _this.validateSubmissionAddressPostcode();
        });
        _this.inpSignUpTerms.blur(function (evt)
        {
            _this.validateTerms();
        });

        _this.butFindAddress.click(function (evt)
        {
            evt.preventDefault();

            var bValid = true;

            if (!_this.validatePostcodeLookup())
                bValid = false;

            if (bValid)
            {
                _this.selAddressConfirm.empty();
                horlicks.webService.lookupPostcode
                (
                    _this.inpPostcodeForLookup.val(),
                    "",
                    function (data)
                    {
                        $.each(data, function (index, value)
                        {
                            $("<option value=\"" + this.SearchAddressId + "\">" + this.SearchAddressText + "</option>").appendTo(_this.selAddressConfirm);
                        });

                        _this.divPostcodeLookup.hide();
                        _this.divSelectAddress.show();
                    },
                    function (st, e)
                    {
                        alert("There was a problem looking up your address.");
                    }
                );
            }
            else
            {
                var el = $(".error-field").first();
                if (el.length > 0)
                    el[0].scrollIntoView();
            }
        });
        _this.selAddressConfirm.click(function (evt)
        {
            evt.preventDefault();
            horlicks.webService.getAddress
            (
                _this.selAddressConfirm.val(),
                function (data)
                {
                    _this.inpAddress1.val(data.AddressLine1);
                    _this.inpAddress2.val(data.AddressLine2);
                    _this.inpAddress3.val(data.AddressLine3);
                    _this.inpTownCity.val(data.Town);
                    _this.inpCounty.val(data.County);
                    _this.inpPostcode.val(data.Postcode);

                    _this.activateManualAddress();
                },
                function (st, e)
                {
                    alert("There was a problem looking up your address.");
                }
            );
        });
        _this.butManualAddress.click(function (evt)
        {
            evt.preventDefault();

            if (_this.inpManualAddress.val() != "1")
                _this.activateManualAddress();
            else
                _this.activateAddressLookup();
        });

        var 
            optinsGSKVisible = false;

        _this.divOptInsGSK.hide();

        function showOptInsGSK()
        {
            if (!optinsGSKVisible)
            {
                optinsGSKVisible = true;
                _this.divOptInsGSK.show();

                var 
                    optinsGSKHeight = _this.divOptInsGSK.height();

                _this.divOptInsGSK.css("height", "0px");
                _this.divOptInsGSK.stop().animate({ height: optinsGSKHeight }, 500);
            }
        }

        _this.inpSignupHorlicksEmail.click(function (evt)
        {
            showOptInsGSK();
        });
        _this.inpSignupHorlicksPost.click(function (evt)
        {
            showOptInsGSK();
        });

        _this.butSubmit.click(function (evt)
        {
            if (_this.inpManualAddress.val() != "1")
            {
                // Can't submit as the address isn't populated yet
                //_this.validateStoryInformation();
                _this.validateSubmissionInformation();
                _this.validatePostcodeLookup(true);
                _this.validatePostcodeSelection(true);
                _this.validateTerms();
                evt.preventDefault();
            }
            else
            {
                var bValid = true;

                //                if (!_this.validateStoryInformation())
                //                    bValid = false;

                if (!_this.validateSubmissionInformation())
                    bValid = false;

                if (!_this.validateSubmissionAddress())
                    bValid = false;

                if (!_this.validateTerms())
                    bValid = false;

                if (!bValid)
                {
                    evt.preventDefault();
                    var el = $(".error-field").first();
                    if (el.length > 0)
                        el[0].scrollIntoView();
                }
            }
        });
    };
    horlicks.signUpPage.prototype.bindControls = function ()
    {
        this.divTitle = $("#" + this.controlPrefix + "divTitle");
        this.selTitle = $("#" + this.controlPrefix + "selTitle");
        this.divFirstName = $("#" + this.controlPrefix + "divFirstName");
        this.inpFirstName = $("#" + this.controlPrefix + "inpFirstName");
        this.divLastName = $("#" + this.controlPrefix + "divLastName");
        this.inpLastName = $("#" + this.controlPrefix + "inpLastName");
        this.divDOB = $("#" + this.controlPrefix + "divDOB");
        this.selDOBDay = $("#" + this.controlPrefix + "selDOBDay");
        this.selDOBMonth = $("#" + this.controlPrefix + "selDOBMonth");
        this.selDOBYear = $("#" + this.controlPrefix + "selDOBYear");
        this.divEmail = $("#" + this.controlPrefix + "divEmail");
        this.inpEmail = $("#" + this.controlPrefix + "inpEmail");
        this.divPostcodeLookup = $("#" + this.controlPrefix + "divPostcodeLookup");
        this.inpPostcodeForLookup = $("#" + this.controlPrefix + "inpPostcodeForLookup");
        this.butFindAddress = $("#" + this.controlPrefix + "butFindAddress");
        this.divSelectAddress = $("#" + this.controlPrefix + "divSelectAddress");
        this.selAddressConfirm = $("#" + this.controlPrefix + "selAddressConfirm");
        this.divManualAddress = $("#" + this.controlPrefix + "divManualAddress");
        this.inpManualAddress = $("#" + this.controlPrefix + "inpManualAddress");
        this.butManualAddress = $("#" + this.controlPrefix + "butManualAddress");
        this.divAddress1 = $("#" + this.controlPrefix + "divAddress1");
        this.inpAddress1 = $("#" + this.controlPrefix + "inpAddress1");
        this.inpAddress2 = $("#" + this.controlPrefix + "inpAddress2");
        this.inpAddress3 = $("#" + this.controlPrefix + "inpAddress3");
        this.divTown = $("#" + this.controlPrefix + "divTown");
        this.inpTownCity = $("#" + this.controlPrefix + "inpTownCity");
        this.inpCounty = $("#" + this.controlPrefix + "inpCounty");
        this.divPostcode = $("#" + this.controlPrefix + "divPostcode");
        this.inpPostcode = $("#" + this.controlPrefix + "inpPostcode");
        this.inpSignupHorlicksEmail = $("#" + this.controlPrefix + "inpSignupHorlicksEmail");
        this.inpSignupHorlicksPost = $("#" + this.controlPrefix + "inpSignupHorlicksPost");
        this.divOptInsGSK = $("#" + this.controlPrefix + "divOptInsGSK");
        this.divSignUpTerms = $("#" + this.controlPrefix + "divSignUpTerms");
        this.inpSignUpTerms = $("#" + this.controlPrefix + "inpSignUpTerms");
        this.butSubmit = $("#" + this.controlPrefix + "butSubmit");
    };
    horlicks.signUpPage.prototype.activateManualAddress = function ()
    {
        this.divPostcodeLookup.hide();
        this.divSelectAddress.hide();
        this.divManualAddress.show();
        this.butManualAddress.val("Lookup your address");
        this.inpManualAddress.val("1");
    };
    horlicks.signUpPage.prototype.activateAddressLookup = function ()
    {
        this.divPostcodeLookup.show();
        this.divSelectAddress.hide();
        this.divManualAddress.hide();
        this.butManualAddress.val("Enter address manually");
        this.inpManualAddress.val("0");
    };
    horlicks.signUpPage.prototype.validateSubmissionTitle = function ()
    {
        this.divTitle.removeClass("error-field");
        if (this.selTitle.val() == String.empty)
        {
            this.divTitle.addClass("error-field");
            return false;
        }
        return true;
    };
    horlicks.signUpPage.prototype.validateSubmissionFirstName = function ()
    {
        this.divFirstName.removeClass("error-field");
        if (!horlicks.validator.isPopulated(this.inpFirstName.val()))
        {
            this.divFirstName.addClass("error-field");
            return false;
        }
        return true;
    };
    horlicks.signUpPage.prototype.validateSubmissionLastName = function ()
    {
        this.divLastName.removeClass("error-field");
        if (!horlicks.validator.isPopulated(this.inpLastName.val()))
        {
            this.divLastName.addClass("error-field");
            return false;
        }
        return true;
    };
    horlicks.signUpPage.prototype.validateSubmissionDOB = function ()
    {
        this.divDOB.removeClass("error-field");
        if (!horlicks.validator.isPopulated(this.selDOBDay.val()) || !horlicks.validator.isPopulated(this.selDOBMonth.val()) || !horlicks.validator.isPopulated(this.selDOBYear.val()))
        {
            this.divDOB.addClass("error-field");
            return false;
        }
        else
        {
            if (!horlicks.validator.isValidDate(this.selDOBYear.val().padLeft(4, '0'), this.selDOBMonth.val().padLeft(2, '0'), this.selDOBDay.val().padLeft(2, '0')))
            {
                this.divDOB.addClass("error-field");
                return false;
            }
        }
        return true;
    };
    horlicks.signUpPage.prototype.validateSubmissionEmail = function ()
    {
        this.divEmail.removeClass("error-field");
        if (!horlicks.validator.isEmail(this.inpEmail.val()))
        {
            this.divEmail.addClass("error-field");
            return false;
        }
        return true;
    };
    horlicks.signUpPage.prototype.validateSubmissionInformation = function ()
    {
        var bReturn = true;

        if (!this.validateSubmissionTitle())
            bReturn = false;

        if (!this.validateSubmissionFirstName())
            bReturn = false;

        if (!this.validateSubmissionLastName())
            bReturn = false;

        if (!this.validateSubmissionDOB())
            bReturn = false;

        if (!this.validateSubmissionEmail())
            bReturn = false;

        return bReturn;
    };
    horlicks.signUpPage.prototype.validatePostcodeLookup = function (forceFail)
    {
        this.divPostcodeLookup.removeClass("error-field");
        if (forceFail || !horlicks.validator.isPostcode(this.inpPostcodeForLookup.val()))
        {
            this.divPostcodeLookup.addClass("error-field");
            return false;
        }
        return true;
    };
    horlicks.signUpPage.prototype.validatePostcodeSelection = function (forceFail)
    {
        this.divSelectAddress.removeClass("error-field");
        if (forceFail || String.isNullOrEmpty(this.selAddressConfirm.val()) || !horlicks.validator.isPopulated(this.selAddressConfirm.val()))
        {
            this.divSelectAddress.addClass("error-field");
            return false;
        }
        return true;
    };
    horlicks.signUpPage.prototype.validateSubmissionAddressAddress1 = function ()
    {
        this.divAddress1.removeClass("error-field");
        if (!horlicks.validator.isPopulated(this.inpAddress1.val()))
        {
            this.divAddress1.addClass("error-field");
            return false;
        }
        return true;
    };
    horlicks.signUpPage.prototype.validateSubmissionAddressTown = function ()
    {
        this.divTown.removeClass("error-field");
        if (!horlicks.validator.isPopulated(this.inpTownCity.val()))
        {
            this.divTown.addClass("error-field");
            return false;
        }
        return true;
    };
    horlicks.signUpPage.prototype.validateSubmissionAddressPostcode = function ()
    {
        this.divPostcode.removeClass("error-field");
        if (!horlicks.validator.isPostcode(this.inpPostcode.val()))
        {
            this.divPostcode.addClass("error-field");
            return false;
        }
        return true;
    };
    horlicks.signUpPage.prototype.validateSubmissionAddress = function ()
    {
        var bReturn = true;

        if (!this.validateSubmissionAddressAddress1())
            bReturn = false;

        if (!this.validateSubmissionAddressTown())
            bReturn = false;

        if (!this.validateSubmissionAddressPostcode())
            bReturn = false;

        return bReturn;
    };
    horlicks.signUpPage.prototype.validateTerms = function ()
    {
        this.divSignUpTerms.removeClass("error-field");
        if (!this.inpSignUpTerms[0].checked)
        {
            this.divSignUpTerms.addClass("error-field");
            return false;
        }
        return true;
    };

    horlicks.storyIndexPage = function (controlPrefix)
    {
        var _this = this;
        _this.controlPrefix = controlPrefix;
        _this.currentPage = 0;
        _this.atEndOfStream = false;
        _this.loading = false;
        $(function () { _this.initialise(); });
    }
    horlicks.storyIndexPage.prototype.initialise = function ()
    {
        var _this = this;
        _this.bindMoreLinks();

        $(".story").each(function (index, element)
        {
            var 
                pTags = $("p", this),
                height = 0;

            $(this).show();

            if (pTags.length > 0)
                height = pTags.first().height();

            $(this).css("height", height + "px");
        });

        $(window).scroll(function (evt)
        {
            if (!_this.loading && !_this.atEndOfStream && $(document).scrollTop() >= ($(document).height() - $(window).height()) * 0.75)
            {
                _this.loading = true;
                _this.currentPage++;
                horlicks.webService.getStoryPage
                    (
                        _this.currentPage,
                        function (data)
                        {
                            if (data != "")
                                $(data).appendTo(".maincontent");
                            else
                                _this.atEndOfStream = true;

                            _this.bindMoreLinks();

                            _this.loading = false;
                        }
                    );
            }
        });
    }
    horlicks.storyIndexPage.prototype.bindMoreLinks = function ()
    {
        $(".more-link").unbind("click");
        $(".more-link").click(function (evt)
        {
            evt.preventDefault();

            var 
                storyDiv = $(evt.currentTarget).parent().prev(),
                commentsDiv = $(evt.currentTarget).parent().parent().next();

            function expandElement(element, callBack)
            {
                element.attr("_originalHeight", element.height());

                element.css("height", "auto");
                element.show();

                var height = element.height();
                element.css("height", element.attr("_originalHeight") + "px");
                element.show();

                element.animate({ height: height }, 500, null, function ()
                {
                    if (callBack)
                        callBack();
                });
            }

            function collapseElement(element, callBack)
            {
                element.animate({ height: element.attr("_originalHeight") }, 500, null, function ()
                {
                    if (callBack)
                        callBack();
                });
            }

            if ($(this).html().toLowerCase() == "more")
            {
                //Tracking
                var 
                    hrefParts = $(this).attr("href").split("/"),
                    storyPath = "";

                for (var i = hrefParts.length - 1; i >= 0; i--)
                {
                    if (hrefParts[i] != "")
                    {
                        storyPath = hrefParts[i];
                        break;
                    }
                }

                if (storyPath != "" && _gaq)
                {
                    _gaq.push(["_trackEvent", "Story View", "/" + storyPath + "-expanded"]);
                    _gaq.push(["_trackEvent", "Story View", "/" + storyPath]);
                }

                $(this).html("Less");
                expandElement(storyDiv);
                expandElement(commentsDiv);
            }
            else
            {
                $(this).html("More");
                collapseElement(commentsDiv);
                collapseElement(storyDiv);
            }

        });
    };
