(function($) {
  
    /**
     * Navigation initailizations
     */
    $(document).ready(function() {

        var showTimer = new Gorilla.Timer();
        var hideTimer = new Gorilla.Timer();
        var whereToBuyResultsShowing = false;
        var wtbResults;
        var hideWhereToBuyOnMouseout = true;
        var showingTab = "";

        
        /**
         * Nav node behavior
         */
        $("#whereToBuy-dropDown").bind("click keydown focus", function() {
            hideWhereToBuyOnMouseout = false;
        });

        $("img.navNode").hover(
            function() {
                hideTimer.clear();
                var id = $(this).attr("id");
                var tabName = id.substring(id.indexOf("-") + 1, id.length);
                showTimer.set(function() {
                    show(tabName);
                }, 150);
            },
            function() {
                showTimer.clear();
                var id = $(this).attr("id");
                if ((id == 'whereToBuy-dropDown' || id == 'navNode-whereToBuy') && !hideWhereToBuyOnMouseout) {
                    return;
                }
                hideTimer.set(function() {
                    hide();
                }, 200);
            }
        );

        $("div.nav-dropDown").hover(
            function() {
                var id = $(this).attr("id");
                var tabName = id.substring(0, id.indexOf("-"));
                hideTimer.clear();
            },
            function() {
                var id = $(this).attr("id");
                if ((id == 'whereToBuy-dropDown' || id == 'navNode-whereToBuy') && !hideWhereToBuyOnMouseout) {
                    return;
                }
                hideTimer.set(function() {
                    hide();
                }, 200);
            }
        );

        $("img.whereToBuy-dropDown-close").click(function() { hide(); });

        /** function to send the Omniture file download message */
        $(".file-download-tracker").click(function() {
            //var s=s_gi('kohlersterlingplumbing');
            //s.linkTrackVars='None';
            //s.linkTrackEvents='None';
            var id = $(this).attr("id");
            s.tl(this,'d',id);
            var x = 6;
        });

        $(document).bind("click.hideDropdowns", function(event) {
            if ($(event.target).parents(".nav-dropDown").length == 0
                    && !$(event.target).is(".navNode")) {
                hide();
            }
        });

        function show(tabName) {
            if (showingTab == tabName) {
                return;
            }
            hide();
            var dropDownElem = $("#" + tabName + "-dropDown");
            dropDownElem.css("display", "block");

            var navNode = $("#navNode-" + tabName);
            navNode.attr("src", navNode.attr("src").replace("-off","-over"));

            if (tabName == "whereToBuy") {
                //$("select#region").css("visibility", "hidden");

                //preload scroll bar images for ie6
                var img1 = new Image();
                var img2 = new Image();
                var img3 = new Image();
                var img4 = new Image();
                var img5 = new Image();
                var img6 = new Image();
                img1.src = "/common/images/bg-scroll-bar.gif";
                img2.src = "/common/images/bg-scroll-sliderMid.gif";
                img3.src = "/common/images/bg-scroll-sliderTop.gif";
                img4.src = "/common/images/bg-scroll-sliderBottom.gif";
                img5.src = "/common/images/bg-scroll-up.gif";
                img6.src = "/common/images/bg-scroll-down.gif";


                renderSavedStorePane();
                if (Sterling.WhereToBuy.getSavedLocation() != null && !whereToBuyResultsShowing) {
                    if (wtbResults == null) {
                        renderResultsPane(null);
                    }
                    slideOutWhereToBuyResults();
                }
            }
            showingTab = tabName;
        }

        function hide() {
            //$("select#region").css("visibility", "");
            $("div.nav-dropDown").css("display", "none");
            $(".navNode").each(function() {
                if($(this).hasClass("active-navNode")) {
                } else {
                    $(this).attr("src", $(this).attr("src").replace("-over","-off"));
                }
            });
            showingTab = "";
            hideWhereToBuyOnMouseout = true;
        }

        Sterling.WhereToBuy.onSavedLocationChange(function() {
            var navNode = $("img#navNode-whereToBuy");
            var src = navNode.attr("src");
            if (Sterling.WhereToBuy.getSavedLocation() == null) {
                navNode.get(0).src = src.replace("savedLocale", "plain");
            } else {
                navNode.get(0).src = src.replace("plain", "savedLocale");
            }
            renderResultsPane(null);
        });

        /**
         *  Where To Buy dropdown functions
         */
        $("#whereToBuy-dropDown-form form").submit(function() {

            slideInWhereToBuyResults();

            var form = this;
            var formData = {};
            formData.postalCode = $(form).find("input[name=postalCode]").val();
            formData.searchProximity = $(form).find("select[name=searchProximity]").val();
            var storeTypesInputs = $(form).find("input[name=storeTypes]:checked").get();
            formData.storeTypes = $.map(storeTypesInputs, function(x) {
                return $(x).val();
            });
            formData.SECURITY_TOKEN = $(form).find("input[name=SECURITY_TOKEN]").val();

            var action = $(this).attr("action");

            $.ajax({
                type: "GET",
                url: action,
                data: formData,
                dataType: "jsonp",
                jsonp:"jsonCallback",
                success: function(data) {
                    wtbResults = data;
                    renderResultsPane(data);
                    $("#whereToBuy-dropDown-results").stop();
                    slideOutWhereToBuyResults();
                    $("#wtbDropDown-zipCode input[type='image']").css("display", "");
                    $("#wtbDropDown-zipCode .loadingContainer").css("display", "none");

                    // Omniture
                    var s=s_gi(s_account);
                    s.linkTrackVars='events,eVar7';
                    s.linkTrackEvents='event9';
                    s.eVar7=formData.postalCode;
                    s.events='event9';
                    void(s.t());
                },
                error: function() {

                }
            });

            $("#wtbDropDown-zipCode input[type='image']").css("display", "none");
            $("#wtbDropDown-zipCode .loadingContainer").css("display", "inline");

            return false;
        });

        function slideOutWhereToBuyResults() {
            if (whereToBuyResultsShowing) {
                return;
            }

            whereToBuyResultsShowing = true;
            var resultPanel = $("#whereToBuy-dropDown-results");
            resultPanel.css({
                left:"0px",
                display:"block",
                width:"14px"
            });
            resultPanel.animate({
                left:"-157px",
                width:"171px"
            }, 400);
        }

        function slideInWhereToBuyResults() {
            if (!whereToBuyResultsShowing) {
                return;
            }
            whereToBuyResultsShowing = false;
            var resultPanel = $("#whereToBuy-dropDown-results");
            resultPanel.animate({
                left:"0px",
                width:"14px"
            }, 400, function() {
                resultPanel.css({
                    left:"0px",
                    display:"none",
                    width:"171px"
                });
            });
        }

        var resultsHeader = $("div#wtbDropDown-results-listings img");  // IE hack
        function renderResultsPane(data) {

            $("#wtbDropDown-results-listings > *").not('img').remove();
            $("#wtbDropDown-results-listings").css("display", "none");
            var hasResultPaneContent = false;

            if (data != null) {

                var storeTypes = data.stores;
                var numStores = 0;
                if (storeTypes != null) {
                    for (var storeType in storeTypes) {
                        var storeList = storeTypes[storeType];

                        $("#wtbDropDown-results-listings").append('<h3>' + storeType + '</h3>');
                        
                        for (var i = 0; i < storeList.length; i++) {
                            var store = storeList[i];

                            var result = $('<div id="nav' + store.id + '" class="wtbDropDown-result"></div>');
                            result.append(storeHtml(store));

                            var save = $('<img class="saveLocation" src="/common/images/btn-savelocation.gif" border="0" alt="Save Location" />');
                            result.append(save);

                            $("#wtbDropDown-results-listings").append(result);

                            (function(store) {
                                save.click(function() {
                                    Sterling.WhereToBuy.setSavedLocation(store);
                                    renderSavedStorePane();
                                    return false;
                                });

                                result.find("a").click(function() {
                                    Sterling.WhereToBuy.viewMap(store);
                                    return false;
                                });
                            })(store);

                            numStores = numStores + 1;
                        }
                    }
                    hasResultPaneContent = true;
                    $("#wtbDropDown-results-listings").css("display", "block");
                    
                }

                if (data.errors) {
                    $("#wtbDropDown-results-listings").append('<p>' + data.errors + '</p>');
                    $("#wtbDropDown-results-listings").css("display", "block");
                    hasResultPaneContent = true;
                } else if (numStores == 0) {
                    $("#wtbDropDown-results-listings").append('<p>There are no locations fitting the search criteria</p>');
                    $("#wtbDropDown-results-listings").css("display", "block");
                    hasResultPaneContent = true;
                }

                refreshScrollPane();

                // Spotlight tracking img
                var axel = Math.random()+"";
                var a = axel * 10000000000000;
                $("div#wtbDropDown-results-listings img.spotlightTracker").remove();
                $("div#wtbDropDown-results-listings").append('<img class="spotlightTracker" src="http://ad.doubleclick.net/activity;src=1943641;type=ster01;cat=st02;ord='+ a + '?" width="1" height="1" border="0" alt="">');
            }

            renderSavedStorePane();

            if (!hasResultPaneContent) {
                $("div.dropDown-wtbResults-copy").css("height", "auto");
                $("div.jScrollPaneContainer").css("display", "none");
                $("div#wtbDropDown-results-listings").css("display", "none");
                $("div#wtbDropDown-results-listings img").remove(); // IE hack
                $("div#wtbDropDown-results-savedLocale").css({
                    "margin-bottom" : "0px",
                    "border-bottom" : "none"
                });
            } else {
                $("div.dropDown-wtbResults-copy").css("height", "");
                $("div.jScrollPaneContainer").css("display", "");
                $("div#wtbDropDown-results-listings").css("display", "");
                $("div#wtbDropDown-results-listings").prepend(resultsHeader); // IE hack
                $("div#wtbDropDown-results-savedLocale").css({
                    "margin-bottom" : "",
                    "border-bottom" : ""
                });
            }

            Sterling.WhereToBuy.onSavedLocationChange(function(store) {
                renderSavedLocationButtons();
            });
        }

        function renderSavedStorePane() {
            $("#wtbDropDown-results-savedLocale > *").not('img').remove();
            $("#wtbDropDown-results-savedLocale").css("display", "none");

            var savedStore = Sterling.WhereToBuy.getSavedLocation();
            if (savedStore != null) {
                $("#wtbDropDown-results-savedLocale").append(storeHtml(savedStore));
                $("#wtbDropDown-results-savedLocale").find("a").click(function() {
                    Sterling.WhereToBuy.viewMap(savedStore);
                    return false;
                });
                $("#wtbDropDown-results-savedLocale").css("display", "block");
                refreshScrollPane();
            }

            renderSavedLocationButtons();
            refreshScrollPane();
        }

            // Find if any store is a saved location
        function renderSavedLocationButtons() {
            var savedLocation = Sterling.WhereToBuy.getSavedLocation();

            var results = $(".wtbDropDown-result").get();
            for (var i = 0; i < results.length; i++) {
                var result = results[i];
                var storeId = $(result).attr("id");
                storeId = storeId.substring(3, storeId.length);
                if (savedLocation != null && savedLocation.id == storeId) {
                    $(result).find("img").css("display", "none");
                } else {
                    $(result).find("img").css("display", "");
                }
            }
        }

        function storeHtml(store) {
            if (store.postalCode.indexOf("-") != -1) {
                store.postalCode = store.postalCode.substring(0, store.postalCode.indexOf("-"));
            }
            var html = '<p>' +store.name + '<br/>' +
                       store.addr1 + '<br/>' +
                       (store.addr2 && store.addr2.length > 0 ? store.addr2 + '<br/>' : '') +
                       store.city + ', ' + store.state + ' ' + store.postalCode + '<br/>' +
                       store.phoneNumber + '</p>' +
                       '<p class="distanceMap">' +
                       (store.proximity && store.proximity.length > 0 ? store.proximity + ' miles<br />' : '') +
                       '<ul><li><a href="#">View Map</a></li></ul></p>';
            return html;
        }

        function refreshScrollPane() {
            var resultPanel = $("#whereToBuy-dropDown-results");

            var left = resultPanel.css("left");
            var display = resultPanel.css("display");
            var width = resultPanel.css("width");

            resultPanel.css({
                left:"-157px",
                display:"block",
                width:"171px"
            });

            refreshScrollPaneHelper();

            resultPanel.css({
                left:left,
                display:display,
                width:width
            });
        }

        function refreshScrollPaneHelper() {

            var resultListings = $('#wtbDropDown-results-listings');
            if (resultListings.css("display") == "none") {
                return;
            }
            var resultListingState = resultListings.css("display");
            resultListings.css("display", "none");

            var savedLocHeight = 0;
            if ($("#wtbDropDown-results-savedLocale").css("display") != "none") {
                savedLocHeight = $("#wtbDropDown-results-savedLocale").outerHeight();
            }
                //var totalHeight = resultListings.parents(".dropDown-wtbResults-copy").innerHeight();
            var totalHeight = 279;

            resultListings.parent(".jScrollPaneContainer")
                    .replaceWith(resultListings);

            resultListings.attr("style", "");
            resultListings.css({
                "display":resultListingState,
                "width":"141px",
                "height":(totalHeight - savedLocHeight) + "px"
            });

            resultListings.jScrollPane({
                showArrows:true,
                scrollbarWidth:16,
                dragMinHeight:22,
                dragMaxHeight:22
            });
        }

        
    });


    /**
     * Other Initializations, on document ready
     */
    $(document).ready(function() {
        clearInputboxDefaultText();
        initializeRollovers();
        initializeHomeMainSpiff();
        initializeEnewsletterSpiffs();
        initializeSelectorSpiffs();
		initializeWatersenseSpiffs();
        initializeProductIconOverlays();
        initializeHowToMeasureLinks();
        Sterling.EmailToAFriend.initialize();

        $("input#searchBox, #wtbDropDown-zipCode input:first").focus(function() { // when user clicks into text box, turn text black
            $(this).css("color", "#000");
        });

        // Search box, make sure a value is entered before the form submit.
        var defaultSearchText = $("div#searchArea input#searchBox").val();
        $("div#searchArea form").submit(function() {
            var searchVal = $(this).children("input#searchBox").val();
            if (searchVal == "" || defaultSearchText == searchVal) {
                //$(this).children("input#searchBox").val("");
                return false;
            }
        });
    });

    // Automatically clears the default text when the user focuses on the input text box
    function clearInputboxDefaultText() {
        $("input[type=text].clearDefaults").bind("focus.clearDefaults", function() {
            $(this).val("");
            $(this).unbind("focus.clearDefaults");
            return true;
        });
    }

    // For all images with class 'rollover', change from off to on state on mouseover and vice versa
    function initializeRollovers() {
        $(".rollover").each(function() {
            var oldSrc = $(this).attr("src");
            var preloadImage = new Image();
            preloadImage.src = oldSrc.replace("-off", "-on");
            $(this).mouseover(function() {
                $(this).attr("src", oldSrc.replace("-off", "-on"));
            }).mouseout(function() {
                $(this).attr("src", oldSrc);
            });
        });
    }

    function initializeHomeMainSpiff() {
        var spiff = $("img.homeMainRollver");
        var attachMouseEvents = function(mapOption) {
            var preloadImage = new Image();
            preloadImage.src = oldSrc.replace("-off", "-on" + mapOption);
            $("area.mapOption" + mapOption).mouseover(function() {
                $(spiff).attr("src", oldSrc.replace("-off", "-on" + mapOption));
            }).mouseout(function() {
                $(spiff).attr("src", oldSrc);
            });
        };
        if ($(spiff).size() > 0) {
            var oldSrc = $(spiff).attr("src");
            attachMouseEvents("");
        }
    }

    function initializeEnewsletterSpiffs() {
        var spiff = $("img.enewsRollover");
        var attachMouseEvents = function(mapOption) {
            var preloadImage = new Image();
            preloadImage.src = oldSrc.replace("-off", "-on" + mapOption);
            $("area.mapOption" + mapOption).mouseover(function() {
                $(spiff).attr("src", oldSrc.replace("-off", "-on" + mapOption));
            }).mouseout(function() {
                $(spiff).attr("src", oldSrc);
            });
        };
        if ($(spiff).size() > 0) {
            var oldSrc = $(spiff).attr("src");
            attachMouseEvents("Browse");
            attachMouseEvents("Signup");
        }
    }

    function initializeSelectorSpiffs() {
        var spiff = $("img.selectorRollover");
        var attachMouseEvents = function(mapOption) {
            var preloadImage = new Image();
            preloadImage.src = oldSrc.replace("-off", "-on" + mapOption);
            $("area.mapOption" + mapOption).mouseover(function() {
                $(spiff).attr("src", oldSrc.replace("-off", "-on" + mapOption));
            }).mouseout(function() {
                $(spiff).attr("src", oldSrc);
            });
        };
        if ($(spiff).size() > 0) {
            var oldSrc = $(spiff).attr("src");
            attachMouseEvents("Shower");
            attachMouseEvents("Bathtub");
        }
    }

	function initializeWatersenseSpiffs() {
        var spiff = $("img.watersenseRollover");
        var attachMouseEvents = function(mapOption) {
            var preloadImage = new Image();
            preloadImage.src = oldSrc.replace("-off", "-on" + mapOption);
            $("area.mapOption" + mapOption).mouseover(function() {
                $(spiff).attr("src", oldSrc.replace("-off", "-on" + mapOption));
            }).mouseout(function() {
                $(spiff).attr("src", oldSrc);
            });
        };
        if ($(spiff).size() > 0) {
            var oldSrc = $(spiff).attr("src");
            attachMouseEvents("Learnmore");
            attachMouseEvents("Browseproducts");
        }
    }
	
    function initializeProductIconOverlays() {
        var onMouseOutTimeout;
        var onMouseOut = function() {
            $("#overlay").hide();
            $("#overlay").removeClass("prodDtl-iconOverlay");
        }

        $("div#prodDtl-icons img, td.onlineCatalog-results-icons img").each(function() {
            $(this).hover(function() {
                clearTimeout(onMouseOutTimeout);
                $("#overlay").addClass("prodDtl-iconOverlay");
                var iconImageSrc = $(this).attr('src');
                var iconImage = new Image();
                $(iconImage).attr('src', iconImageSrc.replace('-small', ''));
                iconImage = $('<div style="float:left"></div>').html(iconImage);
                var iconText = $('<div class="prodDtl-iconOverlay-iconDescription"><div>' + $(this).attr('alt') + '</div>' + $(this).next().html() + '</div>');
                if ($(this).attr('alt') == 'CSA-Compliant Product' ||  iconImageSrc.indexOf("icon-csa.gif") > -1) {
                    iconText = $('<div class="prodDtl-iconOverlay-iconDescription"><div>' + $(this).next().html() + '</div></div>');
                }
                $("#overlay #overlay-content").html(iconImage);
                $("#overlay #overlay-content div").after(iconText);
                var position = $(this).position();
                if ($("#overlay").height() + position.top > $(window).height() + $(window).scrollTop() - 40) {
                    $("#overlay").css("top", (position.top - $("#overlay").height()) + "px");
                } else {
                    $("#overlay").css("top", (position.top + 30) + "px");
                }
                $("#overlay").css("left", (position.left - 260) + "px");

                $("#overlay").hover(function() {
                    clearTimeout(onMouseOutTimeout);
                }, function() {
                    onMouseOutTimeout = setTimeout(onMouseOut, 100);
                });

                $("#overlay").show();
            }, function() {
                onMouseOutTimeout = setTimeout(onMouseOut, 100);
            });
        });
    }

    function initializeHowToMeasureLinks() {
        var howToMeasureOverlay;
        $(".howToMeasureLink-ShowerDoors, .howToMeasureLink-CornerDoors, .howToMeasureLink-CustomDoors").click(function() {
            var section = $(this).attr("class");
            section = section.substring(section.lastIndexOf("-") + 1, section.length);
            if (howToMeasureOverlay == undefined) {
                $.get("/ajax/how-to-measure", function(html) {
                    howToMeasureOverlay = $(html);
                    $("#footer").after(howToMeasureOverlay);
                    $("#howToMeasure-tab-" + section).click();
                    positionHowToMeasureOverlay(howToMeasureOverlay);
                    //howToMeasureOverlay.append('<img src="/common/images/btn-resize-handle.gif" class="resize-handle" alt="" border="0"/>')
                    howToMeasureOverlay.jqDrag('#howToMeasure-header');//.jqResize('.resize-handle');
                });
            } else {
                $("#howToMeasure-tab-" + section).click();
                positionHowToMeasureOverlay(howToMeasureOverlay);
            }
            return false;
        });

        var howToMeasureBathtubDoorsOverlay;
        $(".howToMeasureLink-BathtubShowerDoors").click(function() {
            if (howToMeasureBathtubDoorsOverlay == undefined) {
                $.get("/ajax/how-to-measure-bathtub-doors", function(html) {
                    howToMeasureBathtubDoorsOverlay = $(html);
                    $("#footer").after(howToMeasureBathtubDoorsOverlay);
                    positionHowToMeasureOverlay(howToMeasureBathtubDoorsOverlay);
                    //howToMeasureBathtubDoorsOverlay.append('<img src="/common/images/btn-resize-handle.gif" class="resize-handle" alt="" border="0"/>')
                    howToMeasureBathtubDoorsOverlay.jqDrag('#howToMeasure-header');//.jqResize('.resize-handle');
                });
            } else positionHowToMeasureOverlay(howToMeasureBathtubDoorsOverlay);
            return false;
        });
    }
    

    function positionHowToMeasureOverlay(overlay) {
        var scrollTop = $(window).scrollTop();
        var center = $(window).width() / 2;
        $(overlay).bgiframe(); // trigger jquery plugin to fix ie6 bug w/ select elements showing through
        $(overlay).css("left", center - ($(overlay).width() / 2));
        $(overlay).css("top", scrollTop + 10).show();
    }


    // The sterling namespace. All common functions are put under this namespace
    var Sterling = window.Sterling = {};

    /**
     * Email to a friend
     */
    (function() {

        var currentPageUrl = "";
        var productNumber = "";

        function setCurrentPageUrl(url) {
            currentPageUrl = url;
        }

        function getCurrentPageUrl() {
            return currentPageUrl;
        }

        function setProductNumber(num) {
            productNumber = num;
        }

        function getProductNumber() {
            return productNumber;
        }

        function initialize() {
            $(".emailToAFriendLink").click(function(event) {

                var lb = Gorilla.Lightbox;

                var params = {
                    urlOfInterest : getCurrentPageUrl(),
                    description : $("head title").text(),
                    productNumber : getProductNumber()
                };

                $.get("/ajax/email-friend", params, function(html) {

                    $("#overlay-enlargeImg").css("display", "none");
                    //$("#overlay").css("display", "none");

                    var overlay = $("#overlay-enlargeImg").clone();
                    overlay.removeClass();
                    var overlayContent = overlay.find("#overlay-enlargeImg-content");
                    overlayContent.removeClass();
                    var headerElem = overlayContent.children("#overlay-enlargeImg-header");
                    headerElem.siblings().remove();
                    overlayContent.append($(html));

                    headerElem.children("img:last").remove();
                    headerElem.append('<img src="/common/images/hdr-emailToAFriend.png" alt="Email To A Friend"/>');

                    lb.show(overlay, {disableElementFade:true});
                    overlay.css({
                        "display" : "block",
                        "top" : "0",
                        "left" : "0"
                    });
                    initializePopup();

                    overlay.jqDrag('#overlay-enlargeImg-header');
                });

                return false;
            });
        }

        function initializePopup(overlayElem, contentElem) {
            var elem = $("#emailToAFriend");
            var form = $(elem).find("form");
            form.submit(function() {
                var formInput = form.find("input:text, input:checkbox, input:hidden, textarea").get();
                var formParams = {};
                for (var i in formInput) {
                    var name = $(formInput[i]).attr("name");
                    var val = $(formInput[i]).val();
                    formParams[name] = val;
                }

                $.ajax({
                    type: "POST",
                    url: form.attr("action"),
                    data: formParams,
                    dataType: "html",
                    success: function(postHtml) {

                        form.find(".loadingContainer").css("display", "none");
                        form.find(".sendError").css("display", "none");

                        var overlay = $(Gorilla.Lightbox.getElement());
                        overlay.removeClass();
                        var overlayContent = overlay.find("#overlay-enlargeImg-content");
                        overlayContent.removeClass().children("#overlay-enlargeImg-header").siblings().remove();
                        overlayContent.append($(postHtml));
                        overlay.css({
                            "display" : "block",
                            "top" : "0",
                            "left" : "0"
                        });

                        initializePopup();
                        Gorilla.Lightbox.reposition();
                    },
                    error: function() {
                        form.find(".loadingContainer").css("display", "none");
                        form.find(".sendError").css("display", "inline");
                    }
                });

                form.find(".loadingContainer").css("display", "block");
                form.find(".sendError").css("display", "none");

                return false;
            });

            $(elem).find("input[value='Clear']").click(function() {
                form.get(0).reset();
                $("#emailToAFriend input:text, #emailToAFriend textarea").each(function() {
                    Sterling.Contact.hideFieldErrorOrSuccess(this);
                });
            });

            $(Gorilla.Lightbox.getElement()).find("img.close-enlargeImg").click(function() {
                Gorilla.Lightbox.hide();
            });

            var charCount = $(elem).find("input.charCount").val();
            $(elem).find("textarea").bind("keyup", function() {
                var val = $(this).val();
                if (val.length > charCount) {
                    $(this).val(val.substring(0, charCount));
                }
            }).bind("keyup", function() {
                var charCountElem = $(elem).find("input.charCount");
                var count = charCount - $(this).val().length;
                charCountElem.val(count);
            });

            var validator = new Gorilla.AjaxValidator("1");

            validator.attachValidator($("#emailToAFriend input:text").not("input.charCount").get(), "/ajax/email-friend-validator", function(fieldErrors, allErrors) {

                var field = this;
                var val = $(this).val();
                if (val == "") {
                    Sterling.Contact.hideFieldErrorOrSuccess(this);
                    return;
                }
                if (fieldErrors.length == 0) {
                    Sterling.Contact.showEmailFriendFieldSuccess(field);
                } else {
                    Sterling.Contact.showEmailFriendFieldError(field, fieldErrors[0]);
                }
                Gorilla.Lightbox.reposition();
            });

            validator.attachValidator($("#emailToAFriend textarea").get(), "/ajax/email-friend-validator", function(fieldErrors, allErrors) {

                var field = this;
                var val = $(this).val();
                if (val == "") {
                    Sterling.Contact.hideFieldErrorOrSuccess(this);
                    return;
                }
                if (fieldErrors.length == 0) {
                    Sterling.Contact.hideFieldErrorOrSuccess(field);
                }
                Gorilla.Lightbox.reposition();
            });

            validator.validate();
        }

        Sterling.EmailToAFriend = {
            setCurrentPageUrl : setCurrentPageUrl,
            getCurrentPageUrl : getCurrentPageUrl,
            setProductNumber : setProductNumber,
            getProductNumber : getProductNumber,
            initialize : initialize
        };

    })();


    /**
     * Common contact form functions
     */
    (function() {

        Sterling.Contact = {

            showFieldError : function(field, errorMsg) {
                this.hideFieldErrorOrSuccess(field);
                var fieldDiv = $(field).parents("div:first");
                fieldDiv.addClass("error");
                fieldDiv.prepend('<div id="' + $(field).attr("id") + '.errors" class="contact-errorMessage">' + errorMsg + '</div>');
            },

            showFieldSuccess : function(field) {
                this.hideFieldErrorOrSuccess(field);
                var fieldDiv = $(field).parents("div:first");
                $(field).after('<span class="contact-check"><img src="/common/images/icon-check.gif"/></span>');
            },

            hideFieldErrorOrSuccess : function(field) {
                var fieldDiv = $(field).parents("div:first");
                fieldDiv.removeClass("error");
                fieldDiv.find(".contact-errorMessage").remove();
                fieldDiv.find("span.contact-check").remove();
            },

            showEmailFriendFieldSuccess : function(field) {
                this.hideFieldErrorOrSuccess(field);
                var fieldDiv = $(field).parents("div:first");
                var label = fieldDiv.find("label");
                label.after('<span class="contact-check"><img src="/common/images/icon-check.gif"/></span>');
            },

            showEmailFriendFieldError : function(field, errorMsg) {
                this.hideFieldErrorOrSuccess(field);
                var fieldDiv = $(field).parents("div:first");
                //fieldDiv.addClass("error");
                fieldDiv.find("input").before('<div id="' + $(field).attr("id") + '.errors" class="contact-errorMessage">' + errorMsg + '</div>');
                var label = fieldDiv.find("label");
                label.after('<span class="contact-check"><img class="error" src="/common/images/icon-errorMessage.gif"/></span>');
            }
        }

    })();




    /**
     * Common Where to buy functions
     */
    (function() {

        // where to buy saved location cookie key
        var WTB_LOCATION_COOKIE = "wtbSavedLocation";
        var savedLocationChangeCallbacks = [];

        Sterling.WhereToBuy = {

            setSavedLocation : function(store) {
                var expire = new Date();
                expire.setDate(expire.getDate() + 60);

                var storeStr = store.name + "||" + store.addr1 + "||" + store.addr2 + "||" +
                               store.city + "||" + store.state + "||" + store.postalCode + "||" +
                               store.phoneNumber + "||" + store.proximity + "||" + store.storeType +
                               "||" + store.id + "||" + store.url + "||" + store.urlToMappingSite;

                storeStr = encodeURIComponent(storeStr);

                var cookie = WTB_LOCATION_COOKIE + "=" + storeStr + ";expires=" + expire.toGMTString() +
                             ";path=/";
                document.cookie = cookie;

                for (var i = 0; i < savedLocationChangeCallbacks.length; i++) {
                    savedLocationChangeCallbacks[i](store);
                }
            },

            getSavedLocation : function() {
                var storeStr = "";
                if (document.cookie && document.cookie.length > 0) {
                    var i = document.cookie.indexOf(WTB_LOCATION_COOKIE + "=");
                    if (i != -1) {
                        i = document.cookie.indexOf("=", i) + 1;
                        var j = document.cookie.indexOf(";", i);
                        if (j == -1) {
                            j = document.cookie.length;
                        }
                        storeStr = document.cookie.substring(i, j);
                    }
                }

                storeStr = decodeURIComponent(storeStr);

                var store = null;
                var s = storeStr.split("||");
                if (s.length >= 9) {
                    store = {};
                    store.name = s[0];
                    store.addr1 = s[1];
                    store.addr2 = s[2];
                    store.city = s[3];
                    store.state = s[4];
                    store.postalCode = s[5];
                    store.phoneNumber = s[6];
                    //store.proximity = s[7];
                    store.storeType = s[8];
                    store.id = s[9];
                    store.url = s[10];
                    store.urlToMappingSite = s[11];
                }

                return store;
            },

            onSavedLocationChange : function(callback) {
                if ($.isFunction(callback)) {
                    savedLocationChangeCallbacks.push(callback);
                }
            },

            viewMap : function(store) {
                window.open(store.urlToMappingSite, 'MapWindow','toolbar=no,location=no,directories=no,status=no,menubar=yes,scrollbars=yes,resizable=yes,width=510,height=500');
                return false;
                //Gorilla.GMap.show(store.name, store.addr1, store.city, store.state, store.postalCode);
            }
        };

    })();

    (function() {

        Sterling.Overlay = {

            open : function(elem, x, y) {
                var overlay = $("#overlay").clone();
                overlay.find("#overlay-content").removeClass("glossary-overlay");

                overlay.find("#overlay-content").empty();
                overlay.addClass("activeOverlay");
                var that = this;
                elem = $(elem);

                overlay.find("#overlay-content").append(elem);
                elem.css("display", "block");

                $("body").append(overlay);

                overlay.css({
                    "display" : "block",
                    "top" : y + "px",
                    "left" : x + "px"
                });

                overlay.jqDrag('#overlay-enlargeImg-header');

                var width = overlay.outerWidth();
                var height = overlay.outerHeight();
                var windowWidth = $(window).width();
                var windowHeight = $(window).height();
                var scrollx = $(window).scrollLeft();
                var scrolly = $(window).scrollTop();
                if (x - scrollx > windowWidth/2) {
                    x = Math.max(x - width, 0);
                }

                if (y - scrolly > windowHeight/2) {
                    y = Math.max(y - height, 0);
                }

                overlay.css({
                    "display" : "block",
                    "top" : y + "px",
                    "left" : x + "px",
                    "z-index" : "99"
                });

                var timer = new Gorilla.Timer();
                timer.set(function() {
                    $("*").bind("click.hideAddFolder", function(e) {
                        if ($(e.target).parents("#overlay").length == 0) {
                            that.close(elem);
                            $(document).unbind(".hideAddFolder");
                        }
                    });
                }, 100);

            },

            close : function(elem) {
                $(elem).parents(".activeOverlay").remove();
            }
        };

        var enlargedViewOverlay;
        Sterling.EnlargedViewOverlay = {

            /**
             * Opens the enlarged view overlay
             * @param imgData an array of objects containing the following information:
             *
             * {
             *      title : "The title",
             *      caption : "optional caption",
             *      srcEnlarged : "the/path/to/enlarged/img.jpg",
             *      srcThumb : "the/path/to/thumbnail/img.jpg",
             *      alt : "the image's alt attribute"
             * }
             */
            open : function(imgData) {

                // Clean the data
                for (var i = 0; i < imgData.length; i++) {
                    for (var prop in imgData[i]) {
                        if (imgData[i][prop] == null) {
                            imgData[i][prop] = "";
                        }
                    }
                }

                // Clone the overlay markup
                var overlay = $("#overlay-enlargeImg").clone();
                enlargedViewOverlay = overlay;
                $("#main").append(overlay);

                // Position the overlay
                if((document.documentElement.scrollTop > -1) && (!$.browser.safari)) {
                    overlay.css("top", (document.documentElement.scrollTop + ($(window).height() / 2) - 180) + "px");
                } else {
                    overlay.css("top", (self.pageYOffset + ($(window).height() / 2) - 180) + "px");
                }

                overlay.css("display", "block");
                overlay.jqDrag('#overlay-enlargeImg-header');

                // Change view function
                function changeView(index) {
                    if (index >= imgData.length) { 
                        return;
                    }
                    overlay.find("#enlarge-title").text(imgData[index].title);
                    overlay.find("div#enlarge-caption").text(imgData[index].caption + " ");

                    overlay.find("#overlay-enlargeImg-moreViews").children("img").removeClass("selected");
                    overlay.find("#overlay-enlargeImg-moreViews").children("img").eq(index).addClass("selected");
                    overlay.find("#enlargedPhoto").get(0).src = imgData[index].srcEnlarged;
                }

                // Construct the more view panel and assign event handlers to each more view thumbnail
                if (imgData.length > 1) {
                    overlay.find("#overlay-enlargeImg-moreViews").css("display", "block").empty();
                    for (var i = 0; i < imgData.length; i++) {
                        var imgThumb = $('<img src="' + imgData[i].srcThumb + '" alt="' + imgData[i].alt + '"/>');
                        if (i == 0) {
                            imgThumb.addClass("selected");
                        }

                        imgThumb.hover(
                                function() {
                                    $(this).addClass("mouseover");
                                },
                                function() {
                                    $(this).removeClass("mouseover");
                                }
                        );

                        imgThumb.click(function() {
                            var index = overlay.find("#overlay-enlargeImg-moreViews").children("img").index(this);
                            changeView(index);
                        });


                        overlay.find("#overlay-enlargeImg-moreViews").append(imgThumb);
                    }
                }

                // Configure the events that should close the overlay
                var timer = new Gorilla.Timer();
                timer.set(function() {
                    $("*").bind("click.hideEnlargedOverlay", function(e) {
                        if ($(e.target).parents().index(overlay) == -1 || overlay.find("#overlay-enlargeImg-header img.close-enlargeImg").index(e.target) != -1) {
                            overlay.hide();
                            overlay.remove();
                            $("*").unbind(".hideEnlargedOverlay");
                        }
                    });
                }, 100);

                // Add a delay when showing the default view because of weird IE issue
                var timer = new Gorilla.Timer();
                timer.set(function() {
                    // Switch to the default view
                    changeView(0);
                }, 10);
            },

            /**
             * Closes the currently open overlay
             */
            close : function() {
                if (enlargedViewOverlay) {
                    enlargedViewOverlay.hide();
                    enlargedViewOverlay.remove();
                }
            }

        }

    })();

    Sterling.redirectToLoginPage = function() {
        var currentUrl = Sterling.EmailToAFriend.getCurrentPageUrl();
        currentUrl = encodeURIComponent(currentUrl);
        window.location.href = "/my-sterling/login?desiredResource=" + currentUrl;
    }

    Sterling.clearDefaultInputText = function(inputElem) {
        $(inputElem).val("");
    }

})(jQuery);
