﻿// Enables binding objects to callbacks.
if (!Function.prototype.bind) {
    Function.prototype.bind = function () {
        if (arguments.length < 2 && arguments[0] === undefined)
            return this;

        var toArray = function (iterable) {
            if (!iterable) return [];
            if (iterable.toArray) return iterable.toArray();
            var length = iterable.length
            var results = new Array(length);
            while (length--)
                results[length] = iterable[length];
            return results;
        }

        var __method = this;
        var args = toArray(arguments);
        var object = args.shift();

        return function () {
            return __method.apply(object, args.concat(toArray(arguments)));
        }
    }
}

String.format = function () {
    var s = arguments[0];

    for (var i = 1; i < arguments.length; i++)
        s = s.replace(new RegExp('\\{' + (i - 1) + '\\}', 'gm'), arguments[i]);

    return s;
};

// Extension function for array that executes each function in it.
Array.prototype.execute = function (data) {
    for (var i = 0; i < this.length; i++) {
        if (typeof this[i] != 'function') continue;
        this[i](data);
    }
}

// Event listeners object.
var EventListeners = function () { }

EventListeners.prototype.addEvent = function (event) {
    if (typeof this[event] != 'undefined') return;
    this[event] = new Array();
}

EventListeners.prototype.addListenerToEvent = function (event, listener) {
    this.addEvent(event);
    this[event].push(listener);
}

EventListeners.prototype.executeEvent = function (event, data) {
    if (typeof this[event] == 'undefined') return;
    this[event].execute(data);
}

// Create a listeners object.
var GlobalListeners = new EventListeners();

// One time scripts that are run after the DOM has loaded.
$j(document).ready(function () {
    // Initialize product details.
    ProductDetails.init();

    // Set autocomplete off.
    //  $j("#FormMain").attr("autocomplete", "off");

    //SearchBar.transformSelects();

    // Enable print buttons.
    $j(".print").show();

    $j(".print").click(function () {

        if (window.print) {

            if ($j(this).hasClass("mapprint")) {
                GoogleMap.print();
            }
            else
                window.print();
        }
    });


    // Breadcrumb cleaning
    var breadcrumbText = $j(".breadcrumb .placeholder_full .first_item").html();

    if (breadcrumbText != null) {
        var breadcrumbItems = $j(".breadcrumb .placeholder_full").children(".item").children("a");

        for (var i = 0; i < breadcrumbItems.length; i++)
            breadcrumbText += $j(breadcrumbItems[i]).html();

        var breadcrumbTextLength = breadcrumbText.length;

        if (breadcrumbTextLength > 70) {
            for (var i = 0; i < breadcrumbItems.length; i++) {
                var len = $j(breadcrumbItems[i]).html().length;
                $j(breadcrumbItems[i]).html("...");
                breadcrumbTextLength = breadcrumbTextLength - len;
                if (breadcrumbTextLength <= 70) break;
            }
        }
    }

    // script enabled content
    $j('.noneScriptContent').hide();
    $j('.scriptContent').show();

    // general carousel
    var jcObj = $j('.jcarousel-skin-tango.scroller');
    if (jcObj.jcarousel != null) {
        jcObj.jcarousel();
    }

    // new top 20110803 start
    $j('.topbutton').each(function () {
        var url = $j(this).find('a').first().attr('href');
        $j(this).click(function () {
            window.location = url;
        });
    });

    $j('.topmenu .dropdown').hover(
        function()
        {
            clearTimeout(topMenuDropDownTimeoutId);
            topMenuDropDownTimeoutId = null;
        },
        function (e)
        {
            var jThis = $j(this);
            clearTimeout(topMenuDropDownTimeoutId);
            topMenuDropDownTimeoutId = setTimeout(function ()
            {
                jThis.hide();
                //var id = jThis.attr('id').replace('dropdown_', '');
                $j('.topmenuitem').each(function ()
                {
                    //if (jThis.find('span.hidden').html() == id)
                    {
                        $j(this).removeClass("active");
                        if ($j(this).hasClass('_yellow'))
                            $j(this).removeClass('_yellow').addClass('yellow');
//                        return false;
                    }
                });
            }, 500);
        }
    );

    $j('.topmenu .dropdown .category').click(function () {
        var url = $j(this).find('a:first').attr('href');
        window.location = url;
        return false;
    });

    $j('.topmenuitem').hover(
        function () {
            clearTimeout(topMenuDropDownTimeoutId);
            topMenuDropDownTimeoutId = null;
            $j('.topmenu .dropdown').hide();
            $j('.topmenuitem').removeClass('active');

            $j(this).addClass('active');
            if ($j(this).hasClass('yellow'))
                $j(this).removeClass('yellow').addClass('_yellow');

            var id = $j(this).find('span.hidden').html();
            var dropdown = $j('#dropdown_' + id);
            dropdown.show();
        },
        function (e) {
            var jThis = $j(this);
            var id = jThis.find('span.hidden').html();
            var dropdown = $j('#dropdown_' + id);
            if (dropdown.length > 0) {
                if ($j(e.relatedTarget).attr('id') == dropdown.attr('id')) return;
            }

            clearTimeout(topMenuDropDownTimeoutId);
            topMenuDropDownTimeoutId = setTimeout(function ()
            {
                jThis.removeClass("active");
                if (jThis.hasClass('_yellow'))
                    jThis.removeClass('_yellow').addClass('yellow');
                dropdown.hide();
            }, 500);
	    }
    );
    // new top 20110803 end 

    SearchQuery.fromPersistState();
});

var topMenuDropDownTimeoutId = null;

var CommonHelper = {
    // Tests if an object is an Array. Not tested 
    // in all browsers so may need some modification.
    isArray: function (obj) {
        if (obj == null) return false;
        return typeof (obj) == "object" && obj.length && typeof (obj.length) == "number";
        // Alternatives.
        //return obj instanceof Array.
    },
    isString: function (obj) {
        if (obj == null) {
            return false;
        }
        return typeof (obj) == "string";
    },
    // Converts the date text returned from the
    // server to a JavaScript Date object.
    toJavaScriptDate: function (obj) {
        if (CommonHelper.isArray(obj)) {
            var arr = new Array();
            for (var i = 0; i < obj.length; i++)
                arr.push(CommonHelper.toJavaScriptDate(obj[i]));
            return arr;
        }
        if (obj == null) return null;
        obj = obj.replace('/Date(', '');
        obj = obj.replace(')/', '');
        var index = obj.indexOf("+");
        if (index == -1)
            index = obj.indexOf("-");
        obj = obj.substring(0, index);
        var date = new Date();
        date.setTime(obj);
        return date;
    },
    // Converts a JavaScript Date object to a
    // string that can be parsed by the server.
    fromJavaScriptDate: function (obj) {
        if (CommonHelper.isArray(obj)) {
            var arr = new Array();
            for (var i = 0; i < obj.length; i++)
                arr.push(CommonHelper.fromJavaScriptDate(obj[i]));
            return arr;
        }
        return "/Date(" + obj.getTime() + "+0)/";
    },

    getParameterByName: function (name) {
        name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
        var regexS = "[\\?&]" + name + "=([^&#]*)";
        var regex = new RegExp(regexS);
        var results = regex.exec(window.location.href);
        if (results == null)
            return "";
        else
            return decodeURIComponent(unescape(results[1]).replace(/\+/g, " "));
    },

    HTMLencode: function escapeHTML(str) {
        var div = document.createElement('div');
        var text = document.createTextNode(str);
        div.appendChild(text);
        return div.innerHTML;
    }
}

var SearchQuery = {
    documentType: null,
    query: null,
    pageNumber: 0,
    pageSize: 20,
    sort: null,
    ageRange: null,
    priceFrom: null,
    priceTo: null,
    gender: null,
    category1: null,
    category2: null,
    configurationId: null,
    productId: '',
    viewmode: null,
    service: null,
    serviceInitialized: false,
	enableProductPersistance: true,
	scrollTop: 0,

	// Page size is brought in by the paging function only.
    search: function (pageSize) {      		
		var query = this.toObject();
        this.toPersistState(query);
		
		if(this.enableProductPersistance == true) {
			if(pageSize) {
				query.PageSize = pageSize;
			} else {
				query.PageNumber = 0;
			}
		}
		
		if (this.serviceInitialized == false) {
            this.service = new SearchServiceFE();
            this.serviceInitialized = true;
        }
        this.service.ajax.success = function (data) { 
			GlobalListeners.executeEvent('SearchResultReceived', data); 
		}
        GlobalListeners.executeEvent('SearchInitiated');
        this.service.NewSearch(query);
    },
	
	persistOnUnload: function() {
		if(SearchQuery.enableProductPersistance == false) return;
		var query = SearchQuery.toObject();
		query.ScrollTop = $j(window).scrollTop();
        SearchQuery.toPersistState(query);
	},
	
    toPersistState: function (object) {
        var serializedObject = JSON.stringify(object);
        var encodedQuery = encode64(serializedObject);
        window.location = '#' + encodedQuery;
    },

    fromPersistState: function () {
        var index = location.href.indexOf("#");
        if (index > 0) {
            var encodedQuery = location.href.substring(index);
            var decodedQuery = decode64(encodedQuery);
            try {
                var serializedObject = JSON.parse(decodedQuery);
                this.fromObject(serializedObject);
            } catch (e) { return; }

            this.search();
        }
    },

    toObject: function () {
        var query = new Object();
        query.ContextId = ContextItemId;
        query.DocumentType = this.documentType;
        query.Query = encodeURIComponent(this.query);
        query.PageNumber = this.pageNumber;
        query.PageSize = this.pageSize;
        query.Sort = encodeURIComponent(this.sort);
        query.AgeRange = this.ageRange;
        query.PriceFrom = this.priceFrom;
        query.PriceTo = this.priceTo;
        query.Gender = this.gender;
        query.Category1 = this.category1;
        query.Category2 = this.category2;
        query.ConfigurationId = this.configurationId;
        query.ProductId = this.productId;
        query.BreadcrumbTaxonomy = encodeURIComponent(unescape(BreadcrumbTaxonomy));
        query.ViewMode = this.viewmode;
		query.ScrollTop = 0;
        return query;
    },

    fromObject: function (query) {
        ContextItemId = query.ContextId;
        this.documentType = query.DocumentType;
        this.query = decodeURIComponent(query.Query);
        
		if(this.enableProductPersistance == true) {
			this.pageNumber = query.PageNumber;
			this.pageSize = query.PageSize;
		}
        this.sort = decodeURIComponent(query.Sort);
        this.ageRange = query.AgeRange;
        this.priceFrom = query.PriceFrom;
        this.priceTo = query.PriceTo;
        this.gender = query.Gender;
        this.category1 = query.Category1;
        this.category2 = query.Category2;
        this.configurationId = query.ConfigurationId;
        this.productId = query.ProductId;
        BreadcrumbTaxonomy = escape(decodeURIComponent(query.BreadcrumbTaxonomy));
        this.viewmode = query.ViewMode;
		this.scrollTop = query.ScrollTop;
    }
}

SearchQuery.query = CommonHelper.getParameterByName('q');

var Events = {

    fire: function (listeners, data) {
        for (var i = 0; i < listeners.length; i++) {
            if (listeners[i])
                listeners[i](data);
        }
    },

    listeners: {
        updateBasket: new Array()
    }
}

// Represents the top search box.
var SearchBox = {
    id: null,
    defaultText: null,
    productsTitle: null,
    pageTitle: null,
    storeTitle: null,
    telephoneText: null,
    seeAllText: null,
    searchService: null,
    timeoutId: null,
    hasResult: false,
    defaultPicture: null,
    defaultShopPicture: null,
    searchResultUrl: null,
    dividerId: null,

    init: function () {
        // Set default text.
        var box = $j("#" + SearchBox.id);
        if (box.val() == "")
            box.val(this.defaultText);

        // Initialize search service.
        this.searchService = new SearchServiceFE();
        this.searchService.ajax.success = this.searchResultReceived;

        // Hide typeahead dropdown if anything but
        // the typeahead dropdown or the search textbox is clicked.
        $j(document).click(function (e) {
            var target;
            if (!e) var e = window.event;
            if (e.target) target = e.target;
            else if (e.srcElement) target = e.srcElement;
            if (target.nodeType == 3) // defeat Safari bug
                target = target.parentNode;

            if (target.id != "suggestion-content" && target.id != SearchBox.id) {
                // Set default text.
                if ($j("#" + SearchBox.id).val().replace(/\s/g, "") == "")
                    $j("#" + SearchBox.id).val(SearchBox.defaultText);

                // Close result box.
                $j(SearchBox.dividerId).removeClass("search_active").addClass("search");
            }
        });

        // Open typeahead dropdown if there are results when 
        // the search textbox is brought to focus.
        $j("#" + SearchBox.id).focus(function () {
            // Clear default text.
            if ($j(this).val() == SearchBox.defaultText)
                $j(this).val("");

            // Open result box.
            if (SearchBox.hasResult == true)
                $j(SearchBox.dividerId).removeClass("search").addClass("search_active");
        });

        // Start timer after keyup.
        $j("#" + SearchBox.id).keyup(function () {
            if (SearchBox.timeoutId != null) {
                clearTimeout(SearchBox.timeoutId);
                SearchBox.timeoutId = null;
            }

            SearchBox.timeoutId = setTimeout("SearchBox.doSearch()", 300);
        });

        var searchEvent = function () {
            var query = $j("#" + SearchBox.id).val();
            if (query.replace(/\s/g, "") == "") return false;
            window.location = SearchBox.searchResultUrl + query;
            return false;
        }

        // Enter check.
        $j("#" + SearchBox.id).keypress(function (e) {
            switch (e.keyCode) {
                case 13:
                    return searchEvent();
                default:
                    return true;
            }
        });

        $j(SearchBox.dividerId + " .button").click(function () {
            searchEvent();
        });
    },

    // Performs the typeahead search.
    doSearch: function () {
        var searchQuery = $j("#" + SearchBox.id).val();
        if (searchQuery.replace(/\s/g, "") == "") {

            if (SearchBox.hasResult == true) {
                var contentContainer = $j("#suggestion-content");
                contentContainer.html("");
                SearchBox.hasResult = false;
                $j(SearchBox.dividerId).removeClass("search_active").addClass("search");
            }
            return;
        }
        SearchBox.searchService.GetSuggestions(encodeURIComponent(searchQuery));
    },

    // Renders the typeahead result retrieved from the server.
    searchResultReceived: function (result) {
        SearchBox.hasResult = false;
        var contentContainer = $j("#suggestion-content");
        contentContainer.html("");

        if (result.Products.length > 0 || result.Page || result.Store) {
            SearchBox.hasResult = true;

            // Products.
            if (result.Products.length > 0) {
                contentContainer.append(SearchBox.getHeadlineHtml(SearchBox.productsTitle));

                for (var i = 0; i < result.Products.length; i++) {
                    var product = result.Products[i];

                    contentContainer.append(SearchBox.getItemHtml
                    (
                        product.Title,
                        product.Teaser,
						(product.ThumbnailImage == null || product.ThumbnailImage == '') ? SearchBox.defaultPicture : product.ThumbnailImage,
                        product.Price,
                        product.Url,
                        product.SearchableId,
                        $j("#" + SearchBox.id).val()
                    ));
                }

                if (!result.Page && !result.Store)
                    contentContainer.append("<div class=\"divider\"></div>");
            }

            // Sitecore page.
            if (result.Page) {
                contentContainer.append(SearchBox.getHeadlineHtml(SearchBox.pageTitle));

                contentContainer.append(SearchBox.getItemHtml
                    (
                        result.Page.Title,
                        result.Page.Teaser,
                        (result.Page.Image == null || result.Page.Image == '') ? SearchBox.defaultPicture : result.Page.Image,
                        null,
                        result.Page.Uri,
                        null,
                        null
                    ));

                if (!result.Store)
                    contentContainer.append("<div class=\"divider\"></div>");
            }

            // Shop.
            if (result.Store) {

                var titleAddress = "";

                for (var i = 0; i < result.Store.AddressLines.length; i++) {
                    if (i > 0) titleAddress += ", ";
                    titleAddress += result.Store.AddressLines[i];
                }

                var title = SearchBox.storeTitle + " - " + titleAddress;

                var bodyAddress = "";

                for (var i = 0; i < result.Store.AddressLines.length; i++) {
                    bodyAddress += result.Store.AddressLines[i] + "<br />";
                }

                var body = bodyAddress + SearchBox.telephoneText + ": " + result.Store.PhoneNumber;

                contentContainer.append(SearchBox.getHeadlineHtml(title.toUpperCase()));

                contentContainer.append(SearchBox.getItemHtml
                    (
                        null,
                        body,
                        (result.Store.FacadeImageId == null || result.Store.FacadeImageId == '') ? ((SearchBox.defaultShopPicture == null || SearchBox.defaultShopPicture == '') ? SearchBox.defaultPicture : SearchBox.defaultShopPicture) : result.Store.FacadeImageId,
                        null,
                        result.Store.Url,
                        null,
                        null
                    ));

                if (result.Products.length > 0)
                    contentContainer.append("<div class=\"divider\"></div>");
            }

            if (result.Products.length > 0) {
                // "See all" button.
                var buttonPlaceholder = $j("<div></div>");
                buttonPlaceholder.addClass("button_placeholder");
                var button = $j("<div class=\"button\"></div>");
                button.append("<div class=\"buttonleft\"></div>");
                button.append("<div class=\"buttonsymbol\"><a href=\"" + result.FullResultUrl + "*\">+</a></div>");
                button.append("<div class=\"buttondivider\"></div>");
                button.append("<div class=\"buttontext\"><a href=\"" + result.FullResultUrl + "*\">" + SearchBox.seeAllText + "</a></div>");
                button.append("<div class=\"buttonright\"></div>");
                button.append("<div class=\"leftclear\"></div>");
                buttonPlaceholder.append(button);
                contentContainer.append(buttonPlaceholder);
            }

            contentContainer.append("<div class=\"rightclear\"></div>");

            $j(SearchBox.dividerId).removeClass("search").addClass("search_active");
        }
        else {
            $j(SearchBox.dividerId).removeClass("search_active").addClass("search");
        }
    },

    getHeadlineHtml: function (headline) {
        var div = $j("<div></div>");
        div.addClass("headline");

        if (headline.length > 40)
            headline = headline.substring(0, 40) + "...";

        div.html(headline);

        return div;
    },

    getItemHtml: function (title, body, image, price, url, searchableId, searchPhrase) {
        var container = $j("<div></div>");
        container.addClass("item_container");

        if (url.toString().indexOf("?") > -1) {
            url += '&q=';
        }
        else {
            url += '?q=';
        }
        if (searchPhrase)
            url += searchPhrase;

        // Overlay
        var overlay = $j("<div></div>");
        overlay.addClass("overlay");
        var overlayHref = $j("<a></a>");
        overlayHref.attr("href", url);
        var overlayImg = $j("<img></img>");
        overlayImg.attr("src", RootResourceFolder + "/Images/Main/transpixel.gif");
        overlayImg.attr("alt", "");
        overlayHref.append(overlayImg);
        overlay.append(overlayHref);
        //<div class="overlay"><a href=""><img src="SOMETHING/transpixel.gif" alt="" /></a></div>

        // Image
        var imageDiv = $j("<div></div>");
        imageDiv.addClass("image");
        var imageAnchor = $j("<a></a>");
        imageAnchor.attr("href", url);
        var imageElm = $j("<img/>");
        imageElm.attr("src", image == null || image == "" ? SearchBox.defaultPicture : image);
        imageElm.attr("alt", "");
        imageAnchor.append(imageElm);
        imageDiv.append(imageAnchor);

        // Headline
        var headlineDiv = $j("<div></div>");
        headlineDiv.addClass("headline");

        if (title != null) {
            var headlineAnchor = $j("<a></a>");
            headlineAnchor.attr("href", url);
            headlineAnchor.html(title.length > 22 ? title.substring(0, 22) + "..." : title);
            headlineDiv.append(headlineAnchor);
        }

        // Price
        var priceDiv = $j("<div></div>");
        priceDiv.addClass("price");

        if (price != null) {
            var priceAnchor = $j("<a></a>");
            priceAnchor.attr("href", url);
            priceAnchor.html(price);
            priceDiv.append(priceAnchor);
        }

        // Text
        var textDiv = $j("<div></div>");
        textDiv.addClass("text");
        var textAnchor = $j("<a></a>");
        textAnchor.attr("href", url);
        textAnchor.html(body.length > 60 ? body.substring(0, 60) + "..." : body);
        textDiv.append(textAnchor);

        container.append(overlay);
        container.append(imageDiv);
        container.append(headlineDiv);
        container.append(priceDiv);
        container.append(textDiv);

        return container;
    }
}

var UpsaleProducts = {
    searchService: null,
    productService: null,
    productId: null,
    numberOfRows: null,
    primaryCategory: null,
    categories: null,
    agerange: null,
    minprice: null,
    maxprice: null,
    sortBy: null,
    saleOnly: null,
    customFilter: null,
    closelyRelated: false,
    availTemplateName: null,
    availDynamicParameters: null,
    availSearch: false,
    jAvailTabs: null,

    init: function () {

        // Initialize search service.
        UpsaleProducts.searchService = new SearchServiceFE();
        UpsaleProducts.searchService.ajax.success = UpsaleProducts.searchResultReceived;
        $j('#product_upsale').css("display", "block");

        // initialize product service
        UpsaleProducts.productService = new ProductServiceFE();
        UpsaleProducts.productService.ajax.success = UpsaleProducts.productsReceived;

        // initialize avail tabs
        UpsaleProducts.initAvail();

        UpsaleProducts.doSearch();
    },

    initAvail: function () {
        UpsaleProducts.jAvailTabs = $j('div.availTab');
        UpsaleProducts.jAvailTabs.each(UpsaleProducts.createAvailTab);
    },

    createAvailTab: function (index, element) {
        var jElement = $j(element);
        var title = jElement.find('> div > div.title').text();
        var templateName = jElement.find('> div > div.templateName').text();
        var dynamicParameters = jElement.find('> div > div.dynamicParameters').text();
        var active = jElement.find('> div > div.active').text().toLowerCase() == 'true';
        var icon = jElement.find('> div > div.icon').text();
        var html = UpsaleProducts.getAvailTabHtml(title, templateName, dynamicParameters, active, icon);
        jElement.after(html);
        jElement.remove();
    },

    getAvailTabHtml: function (title, templateName, dynamicParameters, active, icon) {
        var rootClass = active ? 'tab_active_container scat' : 'tab_container scat';
        return '<div class="' + rootClass + '" onclick="UpsaleProducts.availTemplateName=\'' + templateName + '\';UpsaleProducts.availDynamicParameters=\'' + dynamicParameters + '\';UpsaleProducts.availSearch=true;UpsaleProducts.activateTab(this);UpsaleProducts.doSearch();" style="cursor:pointer;">' +
            '<div class="left"></div>' +
            '<div class="content">' +
            '<div class="image">' +
            '<a onclick="return false;">' +
            '<img src="' + icon + '" alt=""/>' +
            '</a>' +
            '</div>' +
            '<div class="text">' +
            '<a onclick="return false;">' +
            title +
            '</a>' +
            '</div>' +
            '</div>' +
            '<div class="right"></div>'
            ;
    },

    activateTab: function (tab) {
        if (!$j(tab).hasClass('tab_container')) {
            return;
        }

        UpsaleProducts.closeTabs(tab.parentNode);
        $j(tab).removeClass('tab_container').addClass('tab_active_container');
        SiteCatalyst.tabClick(tab);
    },

    closeTabs: function (parent) {
        $j(parent).children(".tab_active_container").removeClass("tab_active_container").addClass("tab_container");
    },

    addCategory: function (category) {
        if (UpsaleProducts.categories == null) {
            UpsaleProducts.categories = new Array();
        }
        UpsaleProducts.categories.push(category);
    },

    setMinMaxPrice: function (minPrice, maxPrice, setMinMaxPrice) {
        if (setMinMaxPrice == '1') {
            UpsaleProducts.minprice = minPrice;
            UpsaleProducts.maxprice = maxPrice;
        }
        else {
            UpsaleProducts.minprice = null;
            UpsaleProducts.maxprice = null;
        }
    },

    setAgeRange: function (ageRange, setAgeRange) {
        if (setAgeRange == '1') {
            UpsaleProducts.agerange = ageRange;
        }
        else {
            UpsaleProducts.agerange = null;
        }
    },

    setSaleOnly: function (setSaleOnly) {
        if (setSaleOnly == '1') {
            UpsaleProducts.saleOnly = true;
        }
        else {
            UpsaleProducts.saleOnly = false;
        }
    },

    doSearch: function () {
        $j("#product_upsale_loader").css("display", "block");

        if (UpsaleProducts && UpsaleProducts.availSearch) {
            UpsaleProducts.availSearch = false;
            AvailProvider.getRecommendations(UpsaleProducts.productId, UpsaleProducts.availTemplateName, UpsaleProducts.availDynamicParameters, UpsaleProducts.availSearchResultReceived);
        }
        else {
            UpsaleProducts.searchService.GetUpsaleProducts(UpsaleProducts.productId, UpsaleProducts.numberOfRows, UpsaleProducts.agerange, UpsaleProducts.primaryCategory, UpsaleProducts.categories, UpsaleProducts.minprice, UpsaleProducts.maxprice, UpsaleProducts.saleOnly, UpsaleProducts.sortBy, ContextItemId, encodeURIComponent(UpsaleProducts.customFilter), UpsaleProducts.closelyRelated);
        }
    },

    availSearchResultReceived: function (result) {
        if (!result) {
            return;
        }

        result = eval('(' + result + ')');

        var productIds = new Array();
        for (var index = 0; index < result.result.values.length; index++) {
            productIds.push(result.result.values[index][0]);
        }
        UpsaleProducts.productService.GetProducts(productIds);
    },

    productsReceived: function (products) {
        UpsaleProducts.showProducts(products.Products);
    },

    searchResultReceived: function (result) {
        if (!result) {
            return;
        }

        UpsaleProducts.showProducts(result.Products);
    },

    showProducts: function (products) {
        if (products) {
            var contentContainerId = "#product_upsale_content";
            var contentContainer = $j("#product_upsale_content");

            $j("#product_upsale_loader").css("display", "none");

            $j(contentContainerId + " .product").remove();
            $j(contentContainerId + " .product_listitem").remove();
            $j(contentContainerId + " .leftclear").remove();


            if (products.length > 0) {
                for (var i = 0; i < products.length; i++) {
                    var product = products[i];

                    if (SiteCatalyst.isUpsalePage == true) {
                        var url = product.Url;
                        url += "&icid=" + escape(SiteCatalyst.pageName + "_" + product.Category + "_" + product.Title + "_" + (i + 1));
                        product.Url = url;
                    }

                    contentContainer.append(SearchBar.getItemHtml
                (
                    product.Title,
                    product.Teaser,
                    product.ThumbnailImage,
                    product.Price,
                    product.Url,
                    product.SearchableId,
                    null,
                    product.EditionId,
                    product.DiscountBasketText,
                    product.SplashIcon
                ));
                }
            }

            contentContainer.append('<div class="leftclear"></div>');
        }
    }
}

// Hides one element and shows another.
// This is used for java / no java functionality so
// a java reliant control can be shown if java is enabled.
var HideAndSeek = {
    idHide: null,
    idShow: null,
    idRemove: null,

    play: function () {

        if (this.idHide != null)
            $j("#" + HideAndSeek.idHide).css('display', 'none');

        if (this.idShow != null)
            $j("#" + HideAndSeek.idShow).css('display', 'block');

        if (this.idRemove != null)
            $j("#" + HideAndSeek.idRemove).remove();
    }
}

// Product details object.
var ProductDetails = {

    productService: null,

    imageLargeId: "#productdisplay",

    variants: null,

    args: {

        searchable: null,

        buyable: null,

        quantity: null
    },

    texts: {

        outOfStock: null,

        fewInStock: null,

        inStock: null,

        outOfStockForInfoBox: null,

        delivery: null,

        loginToRateProduct: null,

        moreInfo: null,

        lessInfo: null,

        rating: null
    },

    urls: {

        findInShop: null,

        wishlist: null
    },

    elementIds: {

        hiddenFieldVariantId: null,
        carouselFieldid: null
    },

    pagerElms: {

        imagePages: [],

        pager: null,

        activeItemImg: null,

        inactiveItemImg: null,

        currentIndex: 0,

        initialized: false
    },

    init: function () {

        ProductDetails.productService = new ProductServiceFE();

        $j("#product_details_zoom").lightBox();

        // Quantity changed.
        $j(".productprice_new .quantity input").change(function () {

            var quantity = parseInt($j(this).val());

            if (isNaN(quantity)) {

                quantity = 1;
            }
            else if (quantity < 1) {

                quantity = 1;
            }
            else if (quantity > 1000) {

                quantity = 1000;
            }

            ProductDetails.args.quantity = quantity;

            ProductDetails.updatePrice();
        });

        // Variant changed via dropdown.
        $j(".productprice_new .variant select").change(function () {

            ProductDetails.args.buyable = $j(this).val();

            ProductDetails.setVariant();
        });

        ProductDetails.initializePager();

        // Initialize media reference click.
        $j(ProductDetails.imageLargeId + " .navigate .video").click(function () {

            var index = $j(ProductDetails.imageLargeId + " .navigate .video").index($j(this));

            SiteCatalyst.productMediaReferenceView($j(this), index + 1);

            // 23Video 
            if ($j(this).hasClass("23video")) {

                $j(this).find(".left").find("a").trigger("click");
            }
            else {

                var link = $j(this).find(".left").find("a").attr("href");

                setTimeout("window.open('" + link + "')", 1000);
            }

            return false;
        });

        // Initialize 23video media reference
        $j(ProductDetails.imageLargeId + " .navigate .23video").find("a").lightBox();

        $j(ProductDetails.imageLargeId + " .navigate .23video").find("a").click(function () {

            var mediaId = $j(this).parent().parent().find("input:hidden").val();

            ProductDetails.productService.ajax.success = ProductDetails.displayPopupVideo;

            ProductDetails.productService.GetVideoPlayerScript(mediaId);
        });
    },

    displayPopupVideo: function (videoScript) {

        if (videoScript == "") {

            $j("#jquery-overlay").trigger("click");
        }
        else {

            // For no border.
            //$j("#jquery-lightbox").html(videoScript);

            // For extra white border.
            var object = $j(videoScript);

            var height = parseInt(object.css("height"));

            var width = parseInt(object.css("width"));

            var box = $j("#lightbox-container-image-box");

            box.css("height", (height + 10) + "px");

            box.css("width", (width + 20) + "px");

            box.css("padding-top", "10px");

            box.html(object);
        }
    },

    initializePager: function () {

        if (ProductDetails.pagerElms.imagePages.length == 0) {

            return;
        }

        var pager = ProductDetails.pagerElms.pager;

        pager.show();

        if (ProductDetails.pagerElms.initialized == true) {

            return;
        }

        var pagerId = "#" + pager.attr("id");

        var setImages = function () {

            var mainImage = ProductDetails.pagerElms.imagePages[ProductDetails.pagerElms.currentIndex].main;

            var zoomImage = ProductDetails.pagerElms.imagePages[ProductDetails.pagerElms.currentIndex].zoom;

            $j(pagerId + " .page a img").attr("src", ProductDetails.pagerElms.inactiveItemImg);

            $j(pagerId + " .page:eq(" + ProductDetails.pagerElms.currentIndex + ") a img").attr("src", ProductDetails.pagerElms.activeItemImg);

            $j("#product_details_zoom").attr("href", zoomImage);

            $j(ProductDetails.imageLargeId + " .product img").attr("src", mainImage);

            SiteCatalyst.productImageView(ProductDetails.pagerElms.currentIndex + 1);
        }

        pager.find(".page").click(function () {

            ProductDetails.pagerElms.currentIndex = pager.find(".page").index($j(this));

            setImages();
        });

        $j(pagerId + " .left").click(function () {

            if (--ProductDetails.pagerElms.currentIndex == -1) {

                ProductDetails.pagerElms.currentIndex = ProductDetails.pagerElms.imagePages.length - 1;
            }

            setImages();
        })

        $j(pagerId + " .right").click(function () {

            if (++ProductDetails.pagerElms.currentIndex == ProductDetails.pagerElms.imagePages.length) {

                ProductDetails.pagerElms.currentIndex = 0;
            }

            setImages();
        })

        ProductDetails.pagerElms.initialized = true;
    },

    initializeVariantsBox: function (id, startIndex) {

        $j("#" + id + "_carousel").jcarousel({ start: startIndex });

        $j("#" + id + "_carousel li input[value='" + ProductDetails.args.buyable + "']").parent().addClass("selected");

        // Variant click.
        $j("#" + id + "_carousel li").click(function () {

            $j("#" + id + "_carousel li").removeClass("selected");

            $j(this).addClass("selected");

            ProductDetails.args.buyable = $j(this).children("input").val();

            ProductDetails.setVariant();
        });
    },

    setVariantToActive: function (buyableId, startIndex) {

        $j("#" + ProductDetails.elementIds.carouselFieldid + "_carousel li").removeClass("selected");

        $j("#" + ProductDetails.elementIds.carouselFieldid + "_carousel").jcarousel({ start: startIndex });

        $j("#" + ProductDetails.elementIds.carouselFieldid + "_carousel li input[value='" + buyableId + "']").parent().addClass("selected");

        ProductDetails.args.buyable = buyableId;

        ProductDetails.setVariant();
    },

    setVariant: function () {

        for (var i = 0; i < ProductDetails.variants.length; i++) {

            var variant = ProductDetails.variants[i];

            if (variant.id != ProductDetails.args.buyable) continue;

            // Set hidden variant id.
            $j("#" + ProductDetails.elementIds.hiddenFieldVariantId).val(ProductDetails.args.buyable);

            // Set stock
            ProductDetails.setStock(variant.stock);

            // Set find shop url.
            $j(".productprice_new .findshop a").attr("href", ProductDetails.urls.findInShop + "?id=" + ProductDetails.args.searchable + "&vid=" + ProductDetails.args.buyable);

            // Set wishlist url.
            $j(".productprice_new .wishlist a").attr("href", ProductDetails.urls.wishlist + "?sid=" + ProductDetails.args.searchable + "&bid=" + ProductDetails.args.buyable);

            // Set images.
            if (variant.mainImage) {

                $j("#productdisplay .product img").attr("src", variant.mainImage);
            }

            if (variant.zoomImage) {

                $j("#product_details_zoom").attr("href", variant.zoomImage);
            }

            // Set price.
            if (typeof variant.stock != "undefined") {

                if (variant.stock == 2 || ProductDetails.args.quantity == 1) {

                    $j("#productprice .price .amount").html(variant.price);
                }
                else if (ProductDetails.args.quantity > 1) {

                    ProductDetails.updatePrice();
                }
            }
            else {

                $j("#productprice .price .amount").html(variant.price);
            }

            if (typeof variant.discount != "undefined" && variant.discount != "") {

                $j("#productprice .discount").html(unescape(variant.discount));

                $j("#productprice").removeClass("pricebox").addClass("discountbox");
            }
            else {

                $j("#productprice").removeClass("discountbox").addClass("pricebox");
            }

            // Set title and sales text.
            $j("#product_title").html(unescape(variant.label));

            $j("#salestext_variant").html(unescape(variant.salesText));

            // Set age range.
            $j("#agerange").html(variant.ageRange);

            // Set delivery text.
            if (typeof variant.stock != undefined) {

                if (variant.stock == 2) {

                    $j("#delivery").html(ProductDetails.texts.outOfStockForInfoBox);
                }
                else if (variant.stock > -1) {

                    $j("#delivery").html(ProductDetails.texts.delivery);
                }
            }
            else {

                $j("#delivery").html("");
            }
            break;
        }
    },

    setStock: function (indicator) {

        if (typeof indicator != undefined) {

            switch (indicator) {

                case 0:

                    $j(".productprice_new .stock .icon img").attr("src", RootResourceFolder + "/images/main/instock.png");

                    $j(".productprice_new .stock .text").html(ProductDetails.texts.inStock);

                    $j(".productprice_new .batteries").children().removeClass("hide");

                    $j(".productprice_new .quantity").children().removeClass("hide");

                    $j(".productprice_new .basket").removeClass("inactive");

                    $j(".productprice_new .basket a").unbind("click");

                    break;

                case 1:

                    $j(".productprice_new .stock .icon img").attr("src", RootResourceFolder + "/images/main/yellow-indicator.png");

                    $j(".productprice_new .stock .text").html(ProductDetails.texts.inStock);

                    $j(".productprice_new .batteries").children().removeClass("hide");

                    $j(".productprice_new .quantity").children().removeClass("hide");

                    $j(".productprice_new .basket").removeClass("inactive");

                    $j(".productprice_new .basket a").unbind("click");

                    break;

                case 2:

                    $j(".productprice_new .stock .icon img").attr("src", RootResourceFolder + "/images/main/notinstock.png");

                    $j(".productprice_new .stock .text").html(ProductDetails.texts.outOfStock);

                    $j(".productprice_new .batteries").children().addClass("hide");

                    $j(".productprice_new .quantity").children().addClass("hide");

                    $j(".productprice_new .basket").addClass("inactive");

                    $j(".productprice_new .basket a").unbind("click");

                    $j(".productprice_new .basket a").click(function () { return false; });

                    break;
            }
        }
    },

    updatePrice: function () {

        ProductDetails.productService.ajax.success = function (price) {

            $j("#productprice .price .amount").html(price);
        }

        ProductDetails.productService.UpdateQuantity(ProductDetails.args.quantity, ProductDetails.args.searchable, ProductDetails.args.buyable);
    },

    initializeMoreInfoToggle: function (divId, buttonId) {

        var div = $j("#" + divId);

        var button = $j("#" + buttonId);

        $j(button).click(function () {

            if (div.css("display") == "none") {

                div.show();

                $j(this).find(".buttonsymbol").html("-");

                $j(this).find(".buttontext").html(ProductDetails.texts.lessInfo);
            }
            else if (div.css("display") == "block") {

                div.hide();

                $j(this).find(".buttonsymbol").html("+");

                $j(this).find(".buttontext").html(ProductDetails.texts.moreInfo);
            }
        });
    }
}

// Rating object.
var Rating = function (args) {
    var div = args.div;
	var text = args.text;
    var starsBack = args.starsBack;
    var starsFront = args.starsFront;
    var entityId = args.entityId;
    var currentRating = args.currentRating;
	var notLoggedInText = args.notLoggedInText;
	var numberOfRatingsText = args.numberOfRatingsText;

    // Submits rating.
    var submitRating = function (rating) {
        var service = new ProductServiceFE();
        service.ajax.success = updateRating;
        service.RateProduct(entityId, rating);
    }

    // Updates rating.
    var updateRating = function (rating) {

        if (rating) {

            currentRating = rating.Rating;

            var ratingText = numberOfRatingsText.replace("{0}", rating.NumberOfRatings);

            $j(text).html(ratingText);

            if (rating.RatingSuccess == false) {

                alert(notLoggedInText);
            }
        }

        var images = $j(div + " img");

        images.attr("src", starsBack);

        for (var i = 0; i < currentRating; i++) {

            $j(images[i]).attr("src", starsFront);
        }
    }

    // Highlights current and preceding stars.
    $j(div + " img").mouseover(function () {
        var img = this;
        var nextImg = $j(this).parent().next().find('img')[0];

        while (img != null) {
            $j(img).attr("src", starsFront);
            img = $j(img).parent().prev().find('img')[0];
        }

        while (nextImg != null) {
            $j(nextImg).attr("src", starsBack);
            nextImg = $j(nextImg).parent().next().find('img')[0];
        }
    });

    // Sets stars to current rating.
    $j(div).mouseout(function () {
        updateRating();
    });

    // Handles click event on a rating star.
    $j(div + " img").click(function () {
        var rating = $j(this).attr("id").substring(1);
        submitRating(rating);
    });
}

var AgeFilter =
    {
        ageValueId: null,
        ageSelect: null,
        ageString: null,
        setFromBar: false,

        setAge: function (ageString) {
            AgeFilter.reset();

            var t1 = 1 & ageString;
            var t2 = 2 & ageString;
            var t4 = 4 & ageString;
            var t8 = 8 & ageString;
            var t16 = 16 & ageString;
            var t32 = 32 & ageString;
            var t64 = 64 & ageString;
            var t128 = 128 & ageString;

            if (t1 == 1) {
                AgeFilter.toggleButtonEx($j("#agebutton1"), 1, true, false);
            }
            if (t2 == 2) {
                AgeFilter.toggleButtonEx($j("#agebutton2"), 2, true, false);
            }
            if (t4 == 4) {
                AgeFilter.toggleButtonEx($j("#agebutton3"), 4, true, false);
            }
            if (t8 == 8) {
                AgeFilter.toggleButtonEx($j("#agebutton4"), 8, true, false);
            }
            if (t16 == 16) {
                AgeFilter.toggleButtonEx($j("#agebutton5"), 16, true, false);
            }
            if (t32 == 32) {
                AgeFilter.toggleButtonEx($j("#agebutton6"), 32, true, false);
            }
            if (t64 == 64) {
                AgeFilter.toggleButtonEx($j("#agebutton7"), 64, true, false);
            }
            if (t128 == 128) {
                AgeFilter.toggleButtonEx($j("#agebutton8"), 128, true, false);
            }
        },

        toggleButton: function (button, ageSelectRange, fromBar) {
            AgeFilter.toggleButtonEx(button, ageSelectRange, fromBar, true);
        },
        toggleButtonEx: function (button, ageSelectRange, fromBar, doSearch) {
            if (fromBar)
                AgeFilter.setFromBar = true;

            var toggleDiv = $j(button);

            if (toggleDiv.hasClass("button_active") && ageSelectRange > 0 && this.ageSelect >= ageSelectRange) {
                toggleDiv.removeClass("button_active");
                toggleDiv.addClass("button");
                this.ageSelect -= ageSelectRange;
            }
            else if (toggleDiv.hasClass("button_active") && ageSelectRange > 0 && this.ageSelect < ageSelectRange) {
                this.ageSelect = 0;
                toggleDiv.removeClass("button_active");
                toggleDiv.addClass("button");
            }
            else {
                this.reset(); 	// if you want to enable select of more than one age button then outcomment this line.
                this.ageSelect = ageSelectRange; // if you want to enable select of more than one age button then change to: this.ageSelect += ageSelectRange;
                toggleDiv.removeClass("button");
                toggleDiv.addClass("button_active");
            }

            $j(this.ageValueId).val(this.ageSelect);
            if (doSearch) {
                SearchBar.pageNumber = 0;
                SearchBar.doSearch();
            }
        },

        reset: function () {
            AgeFilter.ageSelect = 0;
            $j(".button_active").removeClass("button_active").addClass("button");
        },

        getAge: function () {
            if (AgeFilter.ageSelect == null || AgeFilter.ageSelect == 0) {

                if (!AgeFilter.setFromBar) {
                    AgeFilter.ageString = CommonHelper.getParameterByName('ar');

                    if (AgeFilter.ageString.indexOf("Months0To3") != -1) {
                        AgeFilter.ageSelect += 1;
                    }
                    if (AgeFilter.ageString.indexOf("Months4To8") != -1) {
                        AgeFilter.ageSelect += 2;
                    }
                    if (AgeFilter.ageString.indexOf("Months9To11") != -1) {
                        AgeFilter.ageSelect += 4;
                    }
                    if (AgeFilter.ageString.indexOf("Years1To2") != -1) {
                        AgeFilter.ageSelect += 8;
                    }
                    if (AgeFilter.ageString.indexOf("Years3To4") != -1) {
                        AgeFilter.ageSelect += 16;
                    }
                    if (AgeFilter.ageString.indexOf("Years5To6") != -1) {
                        AgeFilter.ageSelect += 32;
                    }
                    if (AgeFilter.ageString.indexOf("Years7To8") != -1) {
                        AgeFilter.ageSelect += 64;
                    }
                    if (AgeFilter.ageString.indexOf("Years8AndAbove") != -1) {
                        AgeFilter.ageSelect += 128;
                    }
                }
            }
            return AgeFilter.ageSelect;
        }
    }

var SortFilter = {
    sortbyList: null,

    getSort: function () {
        return SortFilter.sortbyList;
    },

    setSort: function (sort) {
        var arr = new Array();
        this.sortbyList = arr;
        this.sortbyList.push(sort);
    }
}

// Bind this class to membership input fields uaing init function. This causes the focus to
// shift to new input field when done typing in the current.
function MembershipInputAutoTab(fieldId1, fieldId2, fieldId3, fieldId4) {
    var self = this;
    this.fieldId1 = "";
    this.fieldId2 = "";
    this.fieldId3 = "";
    this.fieldId4 = "";

    this.init = function (fieldId1, fieldId2, fieldId3, fieldId4) {
        self.fieldId1 = fieldId1;
        self.fieldId2 = fieldId2;
        self.fieldId3 = fieldId3;
        self.fieldId4 = fieldId4;

        $j("#" + self.fieldId1).bind('keyup', self.eventKeyupField1);

        $j("#" + self.fieldId2).bind('keyup', self.eventKeyupField2);
        $j("#" + self.fieldId3).bind('keyup', self.eventKeyupField3);
    }

    this.eventKeyupField1 = function (e) {
        if (e.keyCode < 48 || e.keyCode > 57)
            return;

        if ($j("#" + self.fieldId1).val().length >= 2) {
            $j("#" + self.fieldId2).focus();
        }
    }
    this.eventKeyupField2 = function (e) {
        if (e.keyCode < 48 || e.keyCode > 57)
            return;

        if ($j("#" + self.fieldId2).val().length >= 2) {
            $j("#" + self.fieldId3).focus();
        }
    }
    this.eventKeyupField3 = function (e) {
        if (e.keyCode < 48 || e.keyCode > 57)
            return;

        if ($j("#" + self.fieldId3).val().length >= 2) {
            $j("#" + self.fieldId4).focus();
        }
    }
}

function CityLookup() {
    var self = this;
    this.postalService = null;
    this.country = 'DK';
    this.postcodeTextboxId = '';
    this.cityDivId = '';

    this.init = function (country, postcodeTextboxId, cityDivId) {
        this.country = country;
        this.postcodeTextboxId = postcodeTextboxId;
        this.cityDivId = cityDivId;
        this.postalService = new PostalServiceFE();
        $j("#" + self.postcodeTextboxId).bind('keyup', self.keyupEvent); // bind event to postal textbox.		
    }

    // Activate ajax call to retrieve city by supplying postal code based on the country code.
    this.getCity = function (postalcode) {
        postalcode = postalcode.replace(' ', '');
        self.postalService.ajax.success = self.receiveCitySuccess;
        self.postalService.GetCity(postalcode, self.country);
    }

    // Receives city result. Place result on page.
    this.receiveCitySuccess = function (city) {
        $j("#" + self.cityDivId).html(city);
    }

    // Detect keyup in postal textbox. Each country have different sized postal numbers and some even have different length
    // within same country. For each country we set length, so that lookup will only occur when postal number is a valid length
    // to reduce calls.
    this.keyupEvent = function () {
        var activateLookup = -4;
        switch (self.country) {
            case 'DK':
                activateLookup = -4; // means all over or equal to 4 will cause lookup.
                break;
            case 'SE':
                activateLookup = -5;
                break;
            case 'NO':
                activateLookup = -4; // means all over or equal to 4 will cause lookup.
                break;
            case 'FI':
                activateLookup = -5;
                break;
            default:
                activateLookup = -4;
                break;
        }
        if ($j("#" + self.postcodeTextboxId).val().length == activateLookup) {
            self.getCity($j("#" + self.postcodeTextboxId).val());
        }
        else if (activateLookup < 0) {
            activateLookup = activateLookup - activateLookup - activateLookup; // primitive way of removing - sign
            if ($j("#" + self.postcodeTextboxId).val().length >= activateLookup) {
                self.getCity($j("#" + self.postcodeTextboxId).val());
            }
        }
    }
}


// --------------------------------------------------------------------------------
//  Javascript for signup page.
// --------------------------------------------------------------------------------
var Signup = {
    self: this,
    postalService: null,
    initialized: false,
    country: 'DK', // default value. Set this from outside.

    init: function () {
        if (this.initialized == false) {
            this.postalService = new PostalServiceFE();
            this.initialized = true;

            $j("#" + textboxZipId).bind('keyup', Signup.keyupEvent); // bind event to postal textbox.
        }
    },

    // Activate ajax call to retrieve city by supplying postal code based on the country code.
    getCity: function (postalcode) {
        Signup.postalService.ajax.success = Signup.receiveCitySuccess;
        Signup.postalService.GetCity(postalcode, Signup.country);
    },

    // Receives city result. Place result on page.
    receiveCitySuccess: function (city) {
        $j("#signupcity").html(city);
    },

    // Detect keyup in postal textbox. Each country have different sized postal numbers and some even have different length
    // within same country. For each country we set length, so that lookup will only occur when postal number is a valid length
    // to reduce calls.
    keyupEvent: function () {
        var activateLookup = 4;
        switch (Signup.country) {
            case 'DK':
                activateLookup = 4; // when postal code is 4 characters in length, do lookup.
                break;
            case 'SE':
                activateLookup = 5;
                break;
            case 'NO':
                activateLookup = -6; // means all over or equal to 6 will cause lookup.
                break;
            case 'FI':
                activateLookup = 5;
                break;
            default:
                activateLookup = -4;
                break;
        }
        if ($j("#" + textboxZipId).val().length == activateLookup) {
            Signup.getCity($j("#" + textboxZipId).val());
        }
        else if (activateLookup < 0) {
            activateLookup = activateLookup - activateLookup - activateLookup; // primitive way of removing - sign
            if ($j("#" + textboxZipId).val().length >= activateLookup) {
                Signup.getCity($j("#" + textboxZipId).val());
            }
        }
    }

}

var BigBasket = {
    self: this,
    initialized: false,
    shoppingService: null,
    productCountText: "",
    productsCountText: "",
    voucherText: "",
    stockText_InStock: "",
    stockText_PreOrdered: "",
    stockText_BackOrdered: "",
    stockText_OutOfStock: "",
    freightText: "",
    discountText: "",
    totalText: "",
    totalText2: "",
    textGoToCheckout: "",
    checkoutUrl: "",
    checkBasketFailed: false,
    basketCheckFailedText: "",
    clubBRLoggedIn: false,
    exceededStockText: "",
    accessoryProductsHeadline: "",
    accessoryAddButtonText: "",
    checkedUpsaleProducts: new Array(),

    init: function () {
        if (this.initialized == false) {
            this.shoppingService = new ShoppingServiceFE();
            this.initialized = true;
            $j(document).bind('UpdateBasket', BigBasket.updateBasket);
        }
    },

    updateBasket: function (event, source) {
        if (source != 'BigBasket') // don't act on events triggered by myself.
        {
            BigBasket.shoppingService.ajax.success = BigBasket.drawBasket;
            BigBasket.shoppingService.GetBigBasket();
        }
    },



    removeLineItem: function (lineItemId) {
        SiteCatalyst.productRemovedFromBasket(lineItemId);
        this.init();
        this.shoppingService.ajax.success = this.drawBasket;
        this.shoppingService.ajax.error = this.removeLineItemError;
        this.shoppingService.RemoveLineItemFromBasket(lineItemId, this.checkBasketFailed);
        return false;
    },

    removeLineItemError: function (lineItemId) {
        alert("Error! Was unable to remove item from basket. " + lineItemId);
    },
    quantityKeyup: function (lineItemId, quantity) {
        var date = new Date();
        BigBasket.quantityKeyupTicks = date.getTime();
        BigBasket.lineItemId = lineItemId;
        BigBasket.quantity = quantity;
        BigBasket.basketQuantityUpdated = false;

        BigBasket.quantityKeyupTimer();
    },

    quantityKeyupTimer: function () {
        window.setTimeout(function () {
            if (BigBasket.basketQuantityUpdated == true) {
                return;
            }
            var date = new Date();
            var ticksNow = date.getTime(); // 1000


            if ((ticksNow - BigBasket.quantityKeyupTicks) > 1000) {
                BigBasket.basketQuantityUpdated = true;
                BigBasket.updateQuantity(BigBasket.lineItemId, BigBasket.quantity);

            }
            else {
                BigBasket.quantityKeyupTimer();

            }
        }, 1250);
    },

    updateQuantity: function (lineItemId, quantity) {
        this.init();
        this.shoppingService.ajax.success = this.drawBasket;
        this.shoppingService.ajax.error = this.updateQuantityError;

        if (isNaN(quantity)) quantity = 1;
        else if (quantity < 1) quantity = 1;
        else if (quantity > 1000) quantity = 1000;

        this.shoppingService.UpdateLineItemQuantity(lineItemId, quantity, this.checkBasketFailed);
        return false;
    },

    updateQuantityError: function (basket) {
        alert("Error! Was unable to update quantity for line item = " + lineItemId);
    },

    addCheckedUpsaleProduct: function (lineItemId, accessorySkuId) {
        if (!this.checkedUpsaleProducts) {
            this.checkedUpsaleProducts = new Array();
        }
        for (var i = 0; i < BigBasket.checkedUpsaleProducts.length; i++) {
            var line = BigBasket.checkedUpsaleProducts[i];
            if (line) {
                if (line.id == lineItemId) {
                    for (var j = 0; j < line.skus.length; j++) {
                        var sku = line.skus[j];
                        if (sku == accessorySkuId) {
                            return;
                        }
                    }
                    // Add SKU
                    line.skus.push(accessorySkuId);
                }
            }
        }
        var cup = new Object();
        cup.id = lineItemId;
        cup.skus = new Array();
        cup.skus.push(accessorySkuId);
        this.checkedUpsaleProducts.push(cup);
        return;
    },

    addAccessoryProduct: function (lineItemId, searchableId, buyableId, quantity) {
        this.init();
        this.shoppingService.ajax.success = this.drawBasket;
        this.shoppingService.ajax.error = this.addAccessoryProductError;

        if (isNaN(quantity)) quantity = 1;
        else if (quantity < 1) quantity = 1;
        else if (quantity > 1000) quantity = 1000;

        this.addCheckedUpsaleProduct(lineItemId, buyableId);
        this.shoppingService.AddAccessoryProductToBasket(searchableId, buyableId, quantity, this.checkBasketFailed);
        return false;
    },

    addAccessoryProductError: function (basket) {
        alert("Error! Was unable to add accessory product quantity for line item = " + lineItemId);
    },


    onGiftcardCheckboxClicked: function () {
        alert("checkbox");
    },

    drawBasket: function (basket) {
        basket.LineItemHtml = basket.LineItemHtml.replace(/{InStock}/g, BigBasket.stockText_InStock);
        basket.LineItemHtml = basket.LineItemHtml.replace(/{PreOrdered}/g, BigBasket.stockText_PreOrdered);
        basket.LineItemHtml = basket.LineItemHtml.replace(/{BackOrdered}/g, BigBasket.stockText_BackOrdered);
        basket.LineItemHtml = basket.LineItemHtml.replace(/{OutOfStock}/g, BigBasket.stockText_OutOfStock);
        basket.LineItemHtml = basket.LineItemHtml.replace(/{AccessoryProductsHeadline}/g, BigBasket.accessoryProductsHeadline);
        basket.LineItemHtml = basket.LineItemHtml.replace(/{AccessoryAddButtonText}/g, BigBasket.accessoryAddButtonText);

        if (BigBasket.checkBasketFailed == "True") {
            basket.LineItemHtml = basket.LineItemHtml.replace(/{CheckoutFailedText}/g, BigBasket.basketCheckFailedText);
        }
        else {
            basket.LineItemHtml = basket.LineItemHtml.replace(/{CheckoutFailedText}/g, '');

            if (basket.ErrorCode == "EXCEEDED_STOCK") {
                basket.LineItemHtml = basket.LineItemHtml.replace(/{EXCEEDED_STOCK}/g, BigBasket.exceededStockText);
            }
        }

        $j('#BigBasketContent').find(".item").remove(); //html(basket.LineItemHtml);
        $j('#BigBasketContent').prepend(basket.LineItemHtml);

        $j('#BigBasketFreightAmount').html(basket.ShippingTotal);
        $j('#BigBasketTotalAmount').html(basket.Total);
        $j('#BigBasketDiscountAmount').html(basket.DiscountTotal);

        $j('#TopBarPrice').html(basket.Total);
        if (basket.TotalProductsInBasket == 1) {
            $j('#productcount').html(BigBasket.productCountText.replace("{NumProductsInBasket}", basket.TotalProductsInBasket));
        }
        else {
            $j('#productcount').html(BigBasket.productsCountText.replace("{NumProductsInBasket}", basket.TotalProductsInBasket));
        }
        if (BigBasket.clubBRLoggedIn == "True") {
            $j('#savingVoucherStickers').html(BigBasket.voucherText.replace("{NumSavingVoucherStickers}", basket.NumSavingVoucherStickers));
        }
        else {
            $j('#savingVoucherStickers').html('');
        }
        //        $j('#BigBasketContent').find(".item").each(function () {
        //            var lineitemid = $j(this).children().first().html();
        //            for (var line in checkedUpsaleProducts) {
        //                if (line.id != lineitemid) continue;
        //                for (var sku in line.skus) {
        //                    $j(this).find(".usingbutton").each(function () {
        //                        var skuid = $j(this).children().first().html();
        //                        if (sku != skuid) return true;
        //                        // todo
        //                        // insertImage insertBefore
        //                        return false;
        //                    });
        //                }
        //                break;
        //            }

        //        });

        $j(document).trigger('UpdateBasket', ['BigBasket']);
        for (var i = 0; i < BigBasket.checkedUpsaleProducts.length; i++) {
            var line = BigBasket.checkedUpsaleProducts[i];
            if (line) {
                for (var j = 0; j < line.skus.length; j++) {
                    var sku = line.skus[j];
                    var id = '#' + line.id + '_' + sku;
                    var span = $j(id);
                    span.removeClass('hidden');
                }
            }
        }
    }
}

var BasketWidget =
{
    self: this,
    totalItemsTopId: null,
    totalPriceTopId: null,
    totalItemsTopId2: null,
    totalPriceTopId2: null,
    freightId: null,
    totalPriceId: null,
    discountId: null,
    basketItemsId: null,
    buyButtonDivId: "",
    emptyTextDivId: "",
    oneDivId: "",
    notOneDivId: "",
    voucherText: "",
    voucherTextDivId: "",
    clubBRLoggedIn: false,
    titleLink: "",

    initialized: false,
    shoppingService: null,
    lineItemHtml: null,

    init: function () {
        this.shoppingService = new ShoppingServiceFE();
        this.initialized = true;
        $j(document).bind('UpdateBasket', BasketWidget.updateBasket);

        $j("#basket_widget .image a").removeAttr("href");
        $j("#basket_widget > .text").find("a").removeAttr("href");

        var toggleBasket = function () {
            if ($j("#basket_widget").hasClass("basket_container"))
                $j("#basket_widget").removeClass("basket_container").addClass("basket_active_container");
            else
                $j("#basket_widget").removeClass("basket_active_container").addClass("basket_container");
        }

        $j("#basket_widget .image").click(function () { toggleBasket(); });
        $j("#basket_widget > .text").click(function () { toggleBasket(); });
    },

    removeItem: function (lineItemId) {
        SiteCatalyst.productRemovedFromBasket(lineItemId);
        this.shoppingService.ajax.success = this.removeItemSuccess;

        if (!this.initialized)
            this.init();

        this.shoppingService.RemoveLineItem(lineItemId);
        return false;
    },

    updateBasket: function (event, source) {
        if (source != 'BasketWidget') // don't act on events triggered by myself.
        {
            BasketWidget.shoppingService.ajax.success = BasketWidget.ReceiveBasketSuccess;
            BasketWidget.shoppingService.GetWidgetBasket();
        }
    },
    ReceiveBasketSuccess: function (basket) {
        if (basket != null) {


            if (basket.LineItemCount == 0) {
                $j(BasketWidget.buyButtonDivId).hide();
                $j(BasketWidget.emptyTextDivId).show();
                $j("#basketwidget_title_anchor").attr("href", "javascript:void(0)");
            }
            else {
                $j(BasketWidget.buyButtonDivId).show();
                $j(BasketWidget.emptyTextDivId).hide();
                $j("#basketwidget_title_anchor").attr("href", BasketWidget.titleLink);
            }

            if (basket.LineItemCount == 1) {
                $j(BasketWidget.oneDivId).show();
                $j(BasketWidget.notOneDivId).hide();
            }
            else {
                $j(BasketWidget.oneDivId).hide();
                $j(BasketWidget.notOneDivId).show();
            }

            if (BasketWidget.clubBRLoggedIn == "True") {
                $j(BasketWidget.voucherTextDivId).html(BasketWidget.voucherText.replace("{NumVouchers}", basket.NumSavingVoucherStickers));
            }
            else {
                $j(BasketWidget.voucherTextDivId).html('');
            }

            $j(BasketWidget.totalItemsTopId).html(basket.LineItemCount);
            $j(BasketWidget.totalPriceTopId).html(basket.TotalCurrency);
            $j(BasketWidget.totalItemsTopId2).html(basket.LineItemCount);
            $j(BasketWidget.totalPriceTopId2).html(basket.TotalCurrency);
            $j(BasketWidget.freightId).html(basket.ShippingTotal);
            $j(BasketWidget.totalPriceId).html(basket.Total);
            $j(BasketWidget.discountId).html(basket.DiscountTotal);
            $j(BasketWidget.basketItemsId).html(basket.LineItemHtml);
        }
    },

    removeItemSuccess: function (basket) {
        if (basket != null) {
            $j(document).trigger('UpdateBasket', ['BasketWidget']);
            $j(BasketWidget.totalItemsTopId).html(basket.LineItemCount);
            $j(BasketWidget.totalPriceTopId).html(basket.TotalCurrency);
            $j(BasketWidget.totalItemsTopId2).html(basket.LineItemCount);
            $j(BasketWidget.totalPriceTopId2).html(basket.TotalCurrency);
            $j(BasketWidget.freightId).html(basket.ShippingTotal);
            $j(BasketWidget.totalPriceId).html(basket.Total);
            $j(BasketWidget.discountId).html(basket.DiscountTotal);
            $j(BasketWidget.basketItemsId).html(basket.LineItemHtml);

            if (basket.LineItemCount == 0) {
                $j(BasketWidget.buyButtonDivId).hide();
                $j(BasketWidget.emptyTextDivId).show();
                $j("#basketwidget_title_anchor").attr("href", "javascript:void(0)");
            }
            else {
                $j(BasketWidget.buyButtonDivId).show();
                $j(BasketWidget.emptyTextDivId).hide();
                $j("#basketwidget_title_anchor").attr("href", BasketWidget.titleLink);
            }

            if (basket.LineItemCount == 1) {
                $j(BasketWidget.oneDivId).show();
                $j(BasketWidget.notOneDivId).hide();
            }
            else {
                $j(BasketWidget.oneDivId).hide();
                $j(BasketWidget.notOneDivId).show();
            }

            if (BasketWidget.clubBRLoggedIn == "True") {
                $j(BasketWidget.voucherTextDivId).html(BasketWidget.voucherText.replace("{NumVouchers}", basket.NumSavingVoucherStickers));
            }
            else {
                $j(BasketWidget.voucherTextDivId).html('');
            }
        }

        Events.fire(Events.listeners.updateBasket, null);
    }
}

var ajaxKeyHandler =
	{
	    addKey: function (obj, val, update) {
	        var toAdd = '&' + obj + '=' + val;
	        ajaxKey = ajaxKey + toAdd;
	        // update cookie
	        SetCookie(cookieName, ajaxKey, 0);
	        if (update) {
	            ajaxSearch();
	        }
	    },

	    removeKey: function (obj, val, update) {
	        var str = ajaxKey;
	        var fieldName = obj;
	        var temp = new Array();
	        var checkup = new Array();
	        var newAjaxKey = '';

	        // String to split
	        temp = str.split("&");

	        // Run through items
	        for (var i = 0; i < temp.length; i++) {
	            if (temp[i] != '') {
	                checkup = temp[i].split("=");
	                if (checkup[0] != fieldName) {
	                    newAjaxKey += '&' + temp[i];
	                }
	            }
	        }

	        // Update key
	        ajaxKey = newAjaxKey;
	        // update cookie
	        SetCookie(cookieName, ajaxKey, 0);
	        if (update) {
	            ajaxSearch();
	        }
	    },

	    getKey: function (obj) {
	        var str = ajaxKey;
	        var temp = new Array();

	        // String to split
	        temp = str.split("&");

	        for (var i = 0; i < temp.length; i++) {
	            if (temp[i] != '') {
	                checkup = temp[i].split("=");
	                if (checkup[0] == obj) {
	                    return checkup[1];
	                }
	            }
	        }
	    },

	    updateKey: function (obj, val, update) {
	        removeKey(obj, '', false);
	        addKey(obj, val, false);
	        if (update) {
	            ajaxSearch();
	        }
	    }
	}


var ClubBRSignup =
{
    initializeInfoPopupBoxes: function () {
        $j(".checkout").find(".info a").removeAttr("href");
        $j(".checkout").find(".info a").removeAttr("target");

        $j(".checkout").find(".info").mouseover(function () {
            $j(this).find(".popup").show();
        });

        $j(".checkout").find(".info").mouseout(function () {
            $j(this).find(".popup").hide();
        });
    }
}

var ClubBRForgotPassword =
{
    initializeInfoPopupBoxes: function () {
        $j(".checkout").find(".info a").removeAttr("href");
        $j(".checkout").find(".info a").removeAttr("target");

        $j(".checkout").find(".info").mouseover(function () {
            $j(this).find(".popup").show();
        });

        $j(".checkout").find(".info").mouseout(function () {
            $j(this).find(".popup").hide();
        });
    }
}

var ClubBRProfile =
{
    initializeInfoPopupBoxes: function () {
        $j(".checkout").find(".info a").removeAttr("href");
        $j(".checkout").find(".info a").removeAttr("target");

        $j(".checkout").find(".info").mouseover(function () {
            $j(this).find(".popup").show();
        });

        $j(".checkout").find(".info").mouseout(function () {
            $j(this).find(".popup").hide();
        });
    }
}

var CheckoutHandler =
{
    customerInfoInputs:
    {
        firstName: null,
        lastName: null,
        street: null,
        houseNumber: null,
        floor: null,
        postalCode: null,
        email: null,
        phoneNumber: null
    },

    clubBrMemberInputs:
    {
        email: null,
        id: null
    },

    loginfailed: null,

    init: function () {

        this.initializeInfoPopupBoxes();
        this.initializeSection("ada"); // alternative delivery address.
        this.initializeSection("member"); // club br member.
        this.initializeSection("giftwrap"); // giftwrapping.
        this.initializeMemberLogin();
    },

    initializeInfoPopupBoxes: function () {
        $j(".checkout").find(".info a").removeAttr("href");
        $j(".checkout").find(".info a").removeAttr("target");

        $j(".checkout").find(".info").mouseover(function () {
            $j(this).find(".popup").show();
        });

        $j(".checkout").find(".info").mouseout(function () {
            $j(this).find(".popup").hide();
        });
    },

    initializeSection: function (prefix) {
        var sectionId = "#" + prefix + "_style";
        var fieldsId = "#" + prefix + "_display";

        //$j(sectionId + " .inputbox input").removeAttr("disabled");

        if ($j(sectionId + " .inputbox input").attr("checked")) {
            $j(sectionId).attr("class", "checkbox_active");
        }
        else {
            $j(fieldsId).hide();
        }

        $j(sectionId + " .inputbox input").change(function () {
            if ($j(this).attr("checked")) {
                $j(sectionId).attr("class", "checkbox_active");
                $j(fieldsId).show();
            }
            else {
                $j(sectionId).attr("class", "checkbox");
                $j(fieldsId).hide();
            }
        });
    },

    initializeMemberLogin: function () {
        $j("#login_button").click(function () {
            var service = new UserServiceFE();
            service.ajax.success = function (address) {
                if (address == null)
                    return CheckoutHandler.loginfailed.show();


                if ($j(CheckoutHandler.customerInfoInputs.firstName).val().replace(/\s/g, "") == ""
                    && $j(CheckoutHandler.customerInfoInputs.lastName).val().replace(/\s/g, "") == ""
                    && $j(CheckoutHandler.customerInfoInputs.street).val().replace(/\s/g, "") == ""
                    && $j(CheckoutHandler.customerInfoInputs.houseNumber).val().replace(/\s/g, "") == ""
                    && $j(CheckoutHandler.customerInfoInputs.postalCode).val().replace(/\s/g, "") == ""
                    && $j(CheckoutHandler.customerInfoInputs.email).val().replace(/\s/g, "") == ""
                    && $j(CheckoutHandler.customerInfoInputs.phoneNumber).val().replace(/\s/g, "") == "") {

                    $j(CheckoutHandler.customerInfoInputs.firstName).val(address.FirstName);
                    $j(CheckoutHandler.customerInfoInputs.lastName).val(address.LastName);
                    $j(CheckoutHandler.customerInfoInputs.street).val(address.AddressLine01);
                    $j(CheckoutHandler.customerInfoInputs.houseNumber).val(address.AddressLine02);
                    $j(CheckoutHandler.customerInfoInputs.postalCode).val(address.PostalCode);
                    $j(CheckoutHandler.customerInfoInputs.email).val(address.Email);
                    $j(CheckoutHandler.customerInfoInputs.phoneNumber).val(address.PhoneNumber);
                }

                $j("#member_box").remove();

                Events.fire(Events.listeners.updateBasket, null);
                SiteCatalyst.loggedIn();
            };

            $j(CheckoutHandler.clubBrMemberInputs.email).parent().find(".required_field").hide();
            $j(CheckoutHandler.clubBrMemberInputs.id).find(".required_field").hide();
            CheckoutHandler.loginfailed.hide();

            var email = $j(CheckoutHandler.clubBrMemberInputs.email).val();

            var memberId = CheckoutHandler.getClubBrMemberNumber();

            if (email.replace(/\s/g, "") == "")
                return $j(CheckoutHandler.clubBrMemberInputs.email).parent().find(".required_field").show();

            if (memberId.replace(/\s/g, "") == "")
                return $j(CheckoutHandler.clubBrMemberInputs.id).find(".required_field").show();

            service.LoginClubBRMember(email, memberId);
        });
    },

    getClubBrMemberNumber: function () {
        var number = "";
        var memberNumberInputs = $j(CheckoutHandler.clubBrMemberInputs.id + " input");
        for (var i = 0; i < memberNumberInputs.length; i++) {
            var currentVal = $j(memberNumberInputs[i]).val();
            if (currentVal.replace(/\s/g, "") == "")
                return "";

            number += currentVal;
        }

        return number;
    }
}

// Gift wrapping entity
GiftwrappingEntry = function (args) {

    var id = args.id;
    var itemid = args.itemid;
    var itemindex = args.itemindex;
    var content = args.content;
    var stateinput = args.stateinput;
    var stateview = args.stateview;
    var checkbox = args.checkbox;
    var hiddenField = args.hiddenField;
    var unsavedtext = args.unsavedtext;

    var lengths = {
        from: args.lengths.from,
        to: args.lengths.to,
        message: args.lengths.message
    };

    var buttons = {
        savebutton: args.buttons.savebutton,
        deletebutton: args.buttons.deletebutton,
        editbutton: args.buttons.editbutton,
        regretbutton: args.buttons.regretbutton
    };

    var inputs = {
        from: args.inputs.from,
        to: args.inputs.to,
        message: args.inputs.message,
        radiobuttons: args.inputs.radiobuttons
    };

    var texts = {
        fromprefix: args.texts.fromprefix,
        toprefix: args.texts.toprefix
    };

    // Hide body if checkbox in not checked.
    if (!checkbox.attr("checked"))
        content.hide();

    // Toggle body show/hide.
    checkbox.change(function () {
        if ($j(this).attr("checked"))
            content.show();
        else
            content.hide();
    });

    // Save button click.
    buttons.savebutton.click(function () {
        inputs.from.parent().find(".required_field").hide();
        inputs.to.parent().find(".required_field").hide();
        inputs.message.parent().find(".required_field").hide();
        inputs.radiobuttons.parent().find(".required_field").hide();

        var giftwrap = new Object;
        giftwrap.From = encodeURIComponent(inputs.from.val().trim());
        giftwrap.To = encodeURIComponent(inputs.to.val().trim());
        giftwrap.PaperId = inputs.radiobuttons.find("input:checked").attr("id");
        giftwrap.ItemId = itemid;
        giftwrap.Index = itemindex;
        giftwrap.MessageLines = getMessageLines();

        if (giftwrap.From.replace(/\s/g, "") == "") return inputs.from.parent().find(".required_field").show();
        if (giftwrap.To.replace(/\s/g, "") == "") return inputs.to.parent().find(".required_field").show();
        if (messageIsEmpty()) return inputs.message.parent().find(".required_field").show();
        if (giftwrap.PaperId == undefined) return inputs.radiobuttons.parent().find(".required_field").show();

        var paperIdParts = giftwrap.PaperId.split('_');
        giftwrap.PaperId = paperIdParts[paperIdParts.length - 1];

        var service = new ShoppingServiceFE();
        service.ajax.success = function () {
            var display = texts.fromprefix + " " + CommonHelper.HTMLencode(inputs.from.val()) + "<br />";
            display += texts.toprefix + " " + CommonHelper.HTMLencode(inputs.to.val()) + "<br /><br />";

            for (var i = 0; i < giftwrap.MessageLines.length; i++)
                display += CommonHelper.HTMLencode(decodeURIComponent(giftwrap.MessageLines[i])) + "<br />";

            stateview.find(".checkout_card").html(display);
            stateinput.hide();
            stateview.show();
            buttons.deletebutton.show();
            buttons.editbutton.show();
            buttons.savebutton.hide();
            buttons.regretbutton.hide();

            Events.fire(Events.listeners.updateBasket, null);

            hiddenField.val("");

            unsavedtext.hide();
        }

        service.AddGiftwrap(giftwrap);
    });

    // Edit button click.
    buttons.editbutton.click(function () {
        stateinput.show();
        stateview.hide();

        buttons.deletebutton.hide();
        buttons.editbutton.hide();
        buttons.savebutton.show();
        buttons.regretbutton.show();

        hiddenField.val("1");
    });

    // Regret button click.
    buttons.regretbutton.click(function () {
        stateinput.hide();
        stateview.show();

        buttons.deletebutton.show();
        buttons.editbutton.show();
        buttons.savebutton.hide();
        buttons.regretbutton.hide();

        hiddenField.val("");

        unsavedtext.hide();
    });

    // Delete button click.
    buttons.deletebutton.click(function () {
        var giftwrap = new Object;
        giftwrap.ItemId = itemid;
        giftwrap.Index = itemindex;
        giftwrap.PaperId = inputs.radiobuttons.find("input:checked").attr("id");
        var paperIdParts = giftwrap.PaperId.split('_');
        giftwrap.PaperId = paperIdParts[paperIdParts.length - 1];

        var service = new ShoppingServiceFE();
        service.ajax.success = function () {
            inputs.from.val("");
            inputs.to.val("");

            var messageInputs = inputs.message.find("input");
            for (var i = 0; i < messageInputs.length; i++)
                $j(messageInputs[i]).val("");

            stateview.find(".checkout_card").html("");
            stateview.hide();
            stateinput.show();
            buttons.deletebutton.hide();
            buttons.editbutton.hide();
            buttons.savebutton.show();
            buttons.regretbutton.hide();

            Events.fire(Events.listeners.updateBasket, null);

            hiddenField.val("");
        }

        service.DeleteGiftwrap(giftwrap);
    });

    // Input logic.
    var checklength = function (box, max) {
        var val = box.val();
        var length = val.length;

        if (length > max) {

            if (box.hasClass("section") || box.hasClass("section_alt")) {

                var index = inputs.message.children("input").index(box);

                if (index < 4) {

                    var valueThatFits = val.substring(0, max);

                    var restOfValue = val.substring(max);

                    for (var i = length; i > 0; i--) {
                        var separator = val.substring(i - 1, i);

                        if (separator == ' ') {
                            restOfValue = valueThatFits.substring(i) + restOfValue;
                            valueThatFits = valueThatFits.substring(0, i);
                            break;
                        }
                    }

                    var nextBox = $j(inputs.message.children("input").get(index + 1));

                    var nextBoxValue = nextBox.val();

                    if (nextBoxValue.replace(/\s/g, "") == "") {

                        nextBox[0].focus();

                        nextBox[0].value = restOfValue;

                        checklength(nextBox, lengths.message);
                    }

                    box.val(valueThatFits);
                }
                else box.val(val.substring(0, max));
            }
            else {
                box.val(val.substring(0, max));
            }
        }
    };

    inputs.from.keyup(function () {
        checklength($j(this), lengths.from);
        hiddenField.val("1");
    });

    inputs.from.change(function () {
        checklength($j(this), lengths.from);
        hiddenField.val("1");
    });

    inputs.to.keyup(function () {
        checklength($j(this), lengths.to);
        hiddenField.val("1");
    });

    inputs.to.change(function () {
        checklength($j(this), lengths.to);
        hiddenField.val("1");
    });

    inputs.message.find("input").keyup(function () {
        checklength($j(this), lengths.message);
        hiddenField.val("1");
    });

    inputs.message.find("input").change(function () {
        checklength($j(this), lengths.message);
        hiddenField.val("1");
    });

    inputs.message.find("input").keydown(function (e) {
        switch (e.keyCode) {
            case 13:
                var index = inputs.message.children("input").index($j(this));
                if (index < 4) {
                    var box = inputs.message.children("input").get(index + 1);
                    box.focus();
                }
                return false;
                break;
            case 38:
                var index = inputs.message.children("input").index($j(this));
                if (index > 0) {
                    var box = inputs.message.children("input").get(index - 1);
                    box.focus();
                }
                return false;
                break;
            case 40:
                var index = inputs.message.children("input").index($j(this));
                if (index < 4) {
                    var box = inputs.message.children("input").get(index + 1);
                    box.focus();
                }
                return false;
                break;
            default:
                return true;
        }
    });

    inputs.message.find("input").removeAttr("maxlength");

    if (jQuery.browser.msie && jQuery.browser.version == "7.0") {
        inputs.message.find("input").attr("maxlength", lengths.message * 3);
    }

    var messageIsEmpty = function () {
        var messageInputs = inputs.message.find("input");
        var numberOfInputs = messageInputs.length;
        var emptyInputsCount = 0;
        for (var i = 0; i < numberOfInputs; i++)
            if ($j(messageInputs[i]).val().replace(/\s/g, "") == "") emptyInputsCount++;
        return emptyInputsCount == numberOfInputs;
    };

    var getMessageLines = function () {
        var messageLines = new Array();
        var messageInputs = inputs.message.find("input");
        for (var i = 0; i < messageInputs.length; i++)
            messageLines.push(encodeURIComponent($j(messageInputs[i]).val()));
        return messageLines;
    };
}

//price slider object
var PriceCheck = {
    fromPriceSelect: null,
    toPriceSelect: null,
    SetPriceFromSlider: false,

    getFromPrice: function () {
        if (CommonHelper.getParameterByName('pmin') != "" && !PriceCheck.SetPriceFromSlider) {
            PriceCheck.fromPriceSelect = CommonHelper.getParameterByName('pmin');
        }
        return PriceCheck.fromPriceSelect;
    },

    getToPrice: function () {
        if (CommonHelper.getParameterByName('pmax') != "" && !PriceCheck.SetPriceFromSlider) {
            PriceCheck.toPriceSelect = CommonHelper.getParameterByName('pmax');
        }
        return PriceCheck.toPriceSelect;
    }
}

var GenderCheck = {
    genderSelect: -1,
    initialized: false,

    // Sets appropriate checkboxes and don't trigger search.
    setGenderSelection: function (genderSelectRange) {
        this.genderSelect = genderSelectRange;
        this.initialized = true;
        if (this.genderSelect == 1) {
            $j("#cbBoy").attr("checked", true);
        }
        else {
            $j("#cbBoy").attr("checked", false);
        }
        if (this.genderSelect == 2) {
            $j("#cbGirl").attr("checked", true);
        }
        else {
            $j("#cbGirl").attr("checked", false);
        }
    },

    setGender: function (gender) {
        if (!this.initialized) {
            this.initialized = true;
        }

        this.genderSelect = gender;

        SearchBar.pageNumber = 0;
        SearchBar.doSearch();
    },

    getGender: function () {
        if (!this.initialized) {
            this.initialized = true;

            var genderQs = CommonHelper.getParameterByName('gen');
            if (genderQs == 'Male') {
                this.genderSelect = 1;
                return 1;
            }
            if (genderQs == 'Female') {
                this.genderSelect = 2;
                return 2;
            }
            else {
                this.genderSelect = 0;
                return 0;
            }
        }
        else {
            return this.genderSelect;
        }
    }
}


// Persist ajax search by adding #+data to url.
var PersistSearch = {

    // Persist ajax product search by adding #+data to url.
    PersistProductSearch: function (pageNumber, numberOfRows, freeText, age, categories, fromPrice, gender, toPrice, sort, contextItemId, breadcrumbTaxonomy, showMode) {
        var activeTabNum = PersistSearch.WhatNumberIsActiveTab();
        var strToPersist = "p;" + activeTabNum + ";" + pageNumber + ";" + numberOfRows + ";" + freeText + ";" + age + ";" + PersistSearch.ArrayToString(categories) + ";" + fromPrice + ";" + gender + ";" + toPrice + ";" + PersistSearch.ArrayToString(sort) + ";" + contextItemId + ";" + breadcrumbTaxonomy + ";" + showMode;
        window.location = "#" + encode64(strToPersist);
    },
    // Persist ajax shop search by adding #+data to url.
    PersistShopSearch: function (freeText, pageNumber, numberOfRows, viewMode) {

        var activeTabNum = PersistSearch.WhatNumberIsActiveTab();
        var strToPersist = "s;" + activeTabNum + ";" + freeText + ";" + pageNumber + ";" + numberOfRows + ";" + viewMode;
        window.location = "#" + encode64(strToPersist);
    },
    // Persist sitecore search by adding #+data to url.
    PersistSitecoreSearch: function (freeText, pageNumber, numberOfRows, viewMode) {
        var activeTabNum = PersistSearch.WhatNumberIsActiveTab();
        var strToPersist = "c;" + activeTabNum + ";" + freeText + ";" + pageNumber + ";" + numberOfRows + ";" + viewMode;
        window.location = "#" + encode64(strToPersist);
    },
    PersistViewMode: function (mode) {
        // get encoded string from url
        var temp = location.href.indexOf("#");
        if (temp == -1) // no persisting in url. Persit only viewMode
        {
            var strPersist = "v;" + mode;
            window.location = "#" + encode64(strPersist);
            return;
        }
        temp = location.href.substring(temp);
        decoded = decode64(temp);
        var sa = decoded.split(";");
        var typeSearch = sa[0]; // p (product) or s (shop) or c (siteCore) 

        switch (typeSearch) {
            case "v":
                var strPersist = "v;" + mode;
                window.location = "#" + encode64(strPersist);
                return;
            case "p":
                sa[13] = mode;
                break;
            case "s":
                sa[5] = mode;
                break;
            case "c":
                sa[5] = mode;
                break;
            default:
                return;
        }
        var encodedString = PersistSearch.ArrayToEncodedPersistString(sa);
        window.location = "#" + encodedString;

    },
    ArrayToEncodedPersistString: function (sa) {
        var persistString = "";

        for (var i = 0; i < sa.length; i++) {
            persistString = persistString + sa[i];
            if (i < sa.length - 1) {
                persistString = persistString + ";"
            }
        }
        //alert("string to persist: "+persistString);
        return encode64(persistString);
    },

    // What number is the active search tab?
    // Starting with 0. -1 if no tabs were active (don't think that can happen).
    WhatNumberIsActiveTab: function () {
        var tabs = PersistSearch.GetTabs();
        if (tabs == null || tabs.length == 0)
            return -1;

        for (var i = 0; i < tabs.length; i++) {
            if ($j(tabs[i]).hasClass("tab_active_container")) {
                return i;
            }
        }
        return -1;
    },

    GetTabs: function () {
        return $j(".box.products.width_4").children(".tab_active_container, .tab_container");
    },

    // This is only visually. No search is triggered.
    SelectTab: function (tabnum) {
        PersistSearch.DeSelectAllTabs();

        var tabs = PersistSearch.GetTabs();
        if (tabs == null) {
            return;
        }

        $j(tabs[tabnum]).removeClass('tab_container');
        $j(tabs[tabnum]).addClass('tab_active_container');

        // On the search result area there is some text like "11 Produkter". To update this to the text
        // matching the type of searchresults we "steal" the information from the tab's onClick event attached
        // to the tab div. (The tab normally sets this information in a variable in Searchbar when tab is clicked).  
        var onClickJs = $j(tabs[tabnum]).attr("onClick");
        var startIndex = onClickJs.indexOf("SearchBar.resultType='") + 1;
        startIndex = onClickJs.indexOf("'", startIndex) + 1;
        var endIndex = onClickJs.indexOf("'", startIndex);
        var resultTypeText = onClickJs.substring(startIndex, endIndex);
        SearchBar.resultType = resultTypeText;
    },

    // Visually deselect all tabs.
    DeSelectAllTabs: function () {
        var tabs = PersistSearch.GetTabs();
        if (tabs == null || tabs.length == 0) {
            return;
        }
        for (var i = 0; i < tabs.length; i++) {
            if ($j(tabs[i]).hasClass("tab_active_container")) {
                $j(tabs[i]).removeClass("tab_active_container");
                $j(tabs[i]).addClass("tab_container");
                return;
            }
        }
    },

    // Does url contain # (which means persisted search data).
    PersistedSearchExist: function () {
        if (location.href.indexOf("#") != -1) // is there a persisted search parameter?
        {
            return true;
        }
        else {
            return false;
        }
    },

    GetDecodedCategoryArrayFromUrl: function () {
        // get encoded string from url
        var temp = location.href.indexOf("#");
        temp = location.href.substring(temp);

        var decoded = decode64(temp);

        var sa = decoded.split(";");

        // parameter categories is an array, so convert that from string to array.
        var categoryArray = PersistSearch.StringToArray(sa[4]);
        return categoryArray;
    },

    // Trigger a search based on persisted search data after # in url.
    TriggerPersistedSearch: function () {
        var temp;
        var decoded = "";

        if (location.href.indexOf("#") == -1) // is there a persisted search parameter in url?
        {
            return;
        }
        // get encoded string from url
        var temp = location.href.indexOf("#");
        temp = location.href.substring(temp);
        decoded = decode64(temp);

        // array of parameters for search
        var sa = decoded.split(";");

        var typeSearch = sa[0]; // p (product) or s (shop) or c (siteCore) 
        var activeTab = parseInt(sa[1]);
        PersistSearch.SelectTab(activeTab);

        for (var i = 0; i < sa.length; i++) {
            if (sa[i] == 'null')
                sa[i] = null;
        }

        // parameter categories is an array, so convert that from string to array.
        var categoryArray = null;
        var sortArray = null;

        if (typeSearch == "p") { // Product search
            SearchBar.activate();

            categoryArray = PersistSearch.StringToArray(sa[6]);
            if (categoryArray != null) {
                for (var i = 0; i < categoryArray.length; i++) {
                }
            }

            sortArray = PersistSearch.StringToArray(sa[10]);
            if (sortArray != null) {
                for (var i = 0; i < sortArray.length; i++) {
                }
            }
            // set search bar values
            SearchBar.pageNumber = parseInt(sa[2]);
            SearchBar.numberOfRows = parseInt(sa[3]); ;
            SearchBar.fromPrice = sa[7];
            SearchBar.toPrice = sa[9];

            // set price slider
            $j("#slider-range").slider({
                values: [PriceSlider.convertValueToPixel(sa[7]), PriceSlider.convertValueToPixel(sa[9])]
            });
            PriceSlider.init(sa[7], sa[9]);

            if (categoryArray != null)
                SearchBar.updatePrice = true;
            else
                SearchBar.updatePrice = false;

            FreetextSearch.doPersistedProductSearch(sa[2]/*pagenumber*/, sa[3]/*numberOfRows*/, sa[4]/*"star wars"*//*freeText*/, sa[5]/*age*/, categoryArray, sa[7]/*FromPrice*/, sa[8]/*Gender*/, sa[9]/*ToPrice*/, sortArray, sa[11]/*ContextItemId*/, sa[12]/*breadcrumbTaxonomy*/, sa[13] /*viewmode (1=list,2=gallery)*/);
        }

        if (typeSearch == "v") {
            SearchBar.activate();
            var viewMode = sa[1];

            var tocss = "product_listitem";
            var fromcss = SearchBar.cssClass;
            switch (viewMode) {
                case "1":
                    tocss = "product_listitem";
                    break;
                case "2":
                    tocss = "product";
                    break;
            }
            SearchBar.changeViewDontPersist(fromcss, tocss);
        }

        if (typeSearch == "s") // shop search
        {
            SearchBar.deActivate();
            SearchBar.pageNumber = parseInt(sa[2]);
            SearchBar.numberOfRows = parseInt(sa[3]); ;
            FreetextSearch.doPersistedShopSearch(sa[3]/*pagenumber*/, sa[4]/*numberOfRows*/, sa[2]/*"free text"*/, sa[5] /* viewMode*/);
            SearchBar.resultType = " Butikker";
        }

        if (typeSearch == "c") // sitecore search
        {
            SearchBar.deActivate();
            SearchBar.pageNumber = parseInt(sa[2]);
            SearchBar.numberOfRows = parseInt(sa[3]);

            FreetextSearch.doPersistedSitecoreSearch(sa[4]/*"free text"*/, sa[2]/*pagenumber*/, sa[3]/*numberOfRows*/, sa[5] /* viewMode*/);
        }
    },

    ArrayToString: function (a) {
        if (a == null)
            return "null";

        var s = "";
        for (var i = 0; i < a.length; i++) {
            if (i > 0)
                s += "&"; // seperator

            s += a[i];
        }
        return s;
    },
    StringToArray: function (s) {
        if (s == null || s == "null" || s == "") {
            return null;
        }
        var sa = s.split("&");
        var a = new Array();
        for (var i = 0; i < sa.length; i++) {
            a.push(sa[i]);
        }
        return a;
    }
}



// Represents the red search bar
var SearchBar = {
    id: null,
    searchService: null,
    hasResult: false,
    cssClass: null,
    SearchBarDiv: null,
    SearchBarDiv_inactive: null,

    pageNumber: null,
    numberOfRows: null,
    freeText: null,
    categories: null,
    fromPrice: null,
    toPrice: null,
    sortBy: null,
    max: null,
    tabActive: 0,
    breadcrumbTaxonomy: null,

    resultTypeTextProducts: '',

    selectText: null,
    showText: null,
    resultType: null,
    listText: null,
    galleryText: null,
    editionIdText: null,
    totalSearchHits: null,
    defaultPicture: null,
    defaultShopPicture: null,

    init: function () {

        this.searchService = new SearchServiceFE();
        this.searchService.ajax.success = this.searchResultReceived;

    },

    closeTabs: function (parent) {
        $j(parent).children(".tab_active_container").removeClass("tab_active_container").addClass("tab_container");
    },

    setCategory: function (category) {
        if (this.categories == null) {
            this.categories = new Array();
        }
        //already encoded before being called
        this.categories.push(category);
    },

    removeCategory: function (category) {
        if (this.categories != null && category != null) {
            var categoryParts = category.split('|');
            var curPath = "";
            for (var i = 0; i < categoryParts.length; i++) {
                if (i > 0) {
                    curPath += '|';
                }
                curPath += categoryParts[i];
                for (j = 0; j < this.categories.length; j++) {
                    if (this.categories[j] == curPath) {
                        this.categories.splice(j, 1);
                        break;
                    }
                }
            }
        }
    },

    removeCategoryPrefix: function (category) {
        if (this.categories != null && category != null) {
            var categoryPrefix = category.split('%7c')[0] + "%7c";
            for (var i = 0; i < this.categories.length; i++) {
                if (this.categories[i].substring(0, categoryPrefix.length) == categoryPrefix)
                    this.categories.splice(i, 1);
            }
        }
    },

    doSearch: function () {

        if (SearchBar.searchService == null)
            SearchBar.init();

        if (SearchBar.pageNumber == null) {
            SearchBar.pageNumber = 0;
        }
        if (SearchBar.numberOfRows == null) {
            SearchBar.numberOfRows = 20;
        }

        if (SearchBar.freeText == null) {
            SearchBar.freeText = CommonHelper.getParameterByName("q");
        }

        $j("#loaderDiv").css("display", "block");

        if (SearchBar.cssClass == "product_listitem")
            var viewMode = "1";
        else
            var viewMode = "2";

        PersistSearch.PersistProductSearch(SearchBar.pageNumber, SearchBar.numberOfRows, encodeURIComponent(SearchBar.freeText), AgeFilter.getAge(), SearchBar.categories, PriceCheck.getFromPrice(), GenderCheck.getGender(), PriceCheck.getToPrice(), SortFilter.getSort(), ContextItemId, SearchBar.breadcrumbTaxonomy, viewMode);
        SearchBar.searchService.GetSearchResult(SearchBar.pageNumber, SearchBar.numberOfRows, encodeURIComponent(SearchBar.freeText), AgeFilter.getAge(), SearchBar.categories, PriceCheck.getFromPrice(), GenderCheck.getGender(), PriceCheck.getToPrice(), SortFilter.getSort(), ContextItemId, SearchBar.breadcrumbTaxonomy);
    },

    // Renders the typeahead result retrieved from the server.
    searchResultReceived: function (result) {
        //alert("searchbar.searchresultreceived()");
        SearchBar.hasResult = false;
        var contentContainerId = "#product_searchresult";
        var contentContainer = $j("#product_searchresult");

        $j(contentContainerId + " .product").remove();
        $j(contentContainerId + " .product_listitem").remove();
        $j(contentContainerId + " .leftclear").remove();
        $j(contentContainerId + " .paging").remove();

        $j("#top_info").remove();
        SearchBar.totalSearchHits = result.NumberOfElements;
        contentContainer.append(SearchBar.getTopInfoHtml());

        if (result.Products.length > 0 || result.Page || result.Store) {

            $j("#divNoResult").css("display", "none");

            SearchBar.hasResult = true;

            // Products.
            if (result.Products.length > 0) {
                for (var i = 0; i < result.Products.length; i++) {
                    var product = result.Products[i];

                    contentContainer.append(SearchBar.getItemHtml
                    (
                        product.Title,
                        product.Teaser,
                        product.ThumbnailImage,
                        product.Price,
                        product.Url,
                        product.SearchableId,
                        SearchBar.freeText,
                        product.EditionId,
                        product.DiscountBasketText,
                        product.SplashIcon
                    ));
                }
            }

            contentContainer.append('<div class="leftclear"></div>');
            //fix for calling new pager html, without having to redo entire function
            if (FreetextSearch.searchFunction == null) {
                contentContainer.append(SearchBar.getPagerHtml(result.NumberOfElements));
            }
            else {
                contentContainer.append(FreetextSearch.getPagerHtml());
            }
        }
        else {
            $j("#divNoResult").css("display", "block");
            $j("#top_info").remove();
        }

        SearchBar.updateFacets(result.FacetList);
    },

    getViewMode: function () {
        switch (this.cssClass) {
            case "product_listitem":
                return 1;
            case "product":
                return 2;

            default:
                return 1;
        }
    },

    changeView: function (fromcss, tocss) {
        this.cssClass = tocss;
        $j("#top_info").html(this.getTopInfoHtml().html());
        $j("#product_searchresult").children("." + fromcss).removeClass(fromcss).addClass(tocss);

        if (tocss == "product_listitem")
            var viewMode = 1;
        else
            var viewMode = 2;

        PersistSearch.PersistViewMode(viewMode);
    },

    changeViewDontPersist: function (fromcss, tocss) {
        this.cssClass = tocss;
        $j("#top_info").html(this.getTopInfoHtml().html());
        $j("#product_searchresult").children("." + fromcss).removeClass(fromcss).addClass(tocss);
    },

    activate: function () {
        $j(this.SearchBarDiv).removeClass("search_gray").addClass("search");
        $j(this.SearchBarDiv_inactive).css("display", "none");
    },

    deActivate: function () {
        $j(this.SearchBarDiv).removeClass("search").addClass("search_gray");
        $j(this.SearchBarDiv_inactive).css("display", "block");
    },

    updateFacets: function (facets) {
        var selectRoot = $j("#redBarSelects");
        selectRoot.html('');

        if (facets == null || facets.length == 0)
            return;

        var outerdiv = $j('<div></div>');
        //For each facet item, render a drop down
        for (var i = 0; i < facets.length; i++) {
            var facet = facets[i];
            if (facet.FacetItems == null || facet.FacetItems.length == 0)
                continue;

            //Create the dropdown content html for the content container.
            var selectHtml = $j("<div></div>");
            var titleText = facet.FacetName;
            var rootCategory = facets[i].FacetItems[0].Value;

            for (var j = 0; j < facet.FacetItems.length; j++) {
                var facetItem = facet.FacetItems[j];

                var div = $j("<div></div>");
                div.html(facetItem.Text);

                if (facetItem.Selected) {
                    titleText = facetItem.Text;
                    div.addClass("name_active");
                }
                else {
                    div.addClass("name");
                }

                (function (value, selected, root) {
                    div.click(function () {
                        SearchBar.removeCategoryPrefix(value);

                        //Add if it's not a base (non-selected) category
                        var newValue = selected ? root : value;
                        if (newValue.split("%7c").length >= 2)
                            SearchBar.setCategory(newValue);

                        SearchBar.pageNumber = 0;
                        SearchBar.doSearch();
                    });
                })(facetItem.Value, facetItem.Selected, rootCategory);

                selectHtml.append(div);
            };

            //Create General container, and make it fold in/out on click
            var container = $j("<div></div>");
            container.addClass("select");
            container.click(function () {
                var elm = $j(this);
                if (elm.hasClass("select")) {
                    elm.parent().parent().find(".select_active").removeClass("select_active").addClass("select");
                    elm.removeClass("select").addClass("select_active");
                }
                else {
                    elm.removeClass("select_active").addClass("select");
                }
                return false;
            });

            //Add top 'button'
            titleText = (titleText.length > 9) ? titleText.substring(0, 8) + '...' : titleText;
            container.append("<div class=\"left\"></div>" +
                        "<div class=\"text\">" + titleText + "</div>",
                        "<div class=\"right\"></div>" +
                        "<div class=\"leftclear\"></div>");

            //Create container for select elements, class depends on number of elements
            var columns = Math.ceil(facet.FacetItems.length / 12);
            var dropDown = $j("<div></div>");
            dropDown.addClass("dropdown");
            dropDown.addClass("colls_" + (columns > 4 ? 4 : columns));


            //Create content graphics
            var content_container = $j("<div></div>");
            content_container.addClass("content_container");
            content_container.append("<div class=\"iefix\"><img src=\"" + RootResourceFolder +
                                     "/Images/Main/transpixel.gif\" alt=\"\" width=\"1\" height=\"1\" /></div>");
            content_container.append(selectHtml);
            content_container.append("<div class=\"leftclear\"></div>");

            var leftborder = $j("<div></div>");
            leftborder.addClass("leftborder");

            var rightborder = $j("<div></div>");
            rightborder.addClass("rightborder");

            rightborder.append(content_container);
            leftborder.append(rightborder);

            //Add top graphics
            dropDown.append("<div class=\"top_container\">" +
                                         "<div class=\"top_left_corner\"><img src=\"" + RootResourceFolder +
                                         "/Images/Main/dropdown_top_left_corner_round.png\" alt=\"\" /></div>" +
                                         "<div class=\"top_right_corner\"><img src=\"" + RootResourceFolder +
                                         "/Images/Main/dropdown_top_right_corner.png\" alt=\"\" /></div>" +
                                         "</div>");
            //Add content graphics
            dropDown.append(leftborder);
            //Add bottom graphics
            dropDown.append("<div class=\"bothclear\"></div>" +
                                                 "<div class=\"bottom_container\">" +
                                                 "<div class=\"bottom_left_corner\"><img src=\"" + RootResourceFolder +
                                                 "/Images/Main/dropdown_bottom_left_corner.png\" alt=\"\" /></div>" +
                                                 "<div class=\"bottom_right_corner\"><img src=\"" + RootResourceFolder +
                                                 "/Images/Main/dropdown_bottom_right_corner.png\" alt=\"\" /></div>" +
                                                 "</div>");
            container.append(dropDown);

            outerdiv.append(container);

            //Unless the next one is a subfacet of current facet, we add the outerdiv to the selectRoot
            //This is found by checking firstly if we're on the last item,
            //or if the next nodes category prefix starts with this nodes category prefix 
            if (facets.length == i + 1 || facets[i + 1].FacetItems[0].Value.substring(0, facet.FacetItems[0].Value.length) != facet.FacetItems[0].Value) {
                selectRoot.append(outerdiv);
                selectRoot.append('<div class="leftclear"></div>');
                outerdiv = $j('<div></div>');
            }
        }
    },

    getTopInfoHtml: function () {
        var container = $j("<div id=\"top_info\"></div>");
        container.addClass("top_info");
        container.append('<div class="left"><div class="text">' + SearchBar.totalSearchHits + " " + SearchBar.resultType + '</div></div>');

        var listview = this.cssClass == 'product_listitem';

        var topRight = $j("<div></div>");
        topRight.addClass("right");

        var galImageDiv = $j("<div></div>");
        galImageDiv.addClass("image");
        galImageDiv.append('<img src="/resources/br/Images/Main/productsbox_icon_gallery.png" alt="' + this.galleryText + '">');
        var galTextDiv = $j("<div></div>");
        galTextDiv.addClass("text");

        var lstImageDiv = $j("<div></div>");
        lstImageDiv.addClass("image");
        lstImageDiv.append('<img src="/resources/br/Images/Main/productsbox_icon_list.png" alt="' + this.listText + '">');
        var lstTextDiv = $j("<div></div>");
        lstTextDiv.addClass("text");

        //only make links for the inactive part
        if (listview) {
            galImageDiv.attr("onClick", "SearchBar.changeView('product_listitem', 'product'); return false;");
            galTextDiv.attr("onClick", "SearchBar.changeView('product_listitem', 'product'); return false;");

            galTextDiv.html('<a>' + this.galleryText + '</a>');
            galImageDiv.attr("style", 'cursor:pointer;');
            galTextDiv.attr("style", 'cursor:pointer;');
            lstTextDiv.html(this.listText);
        }
        else {
            lstImageDiv.attr("onClick", "SearchBar.changeView('product', 'product_listitem'); return false;");
            lstTextDiv.attr("onClick", "SearchBar.changeView('product', 'product_listitem'); return false;");

            lstTextDiv.html('<a>' + this.listText + '</a>');
            lstImageDiv.attr("style", 'cursor:pointer;');
            lstTextDiv.attr("style", 'cursor:pointer;');
            galTextDiv.html(this.galleryText);
        }

        topRight.append(galImageDiv);
        topRight.append(galTextDiv);
        topRight.append(lstImageDiv);
        topRight.append(lstTextDiv);

        container.append(topRight);

        container.append('<div class="bothclear"></div>');

        $j("#loaderDiv").css("display", "none");

        return container;
    },

    getPagerHtml: function (numberOfElements) {
        var PageOneSet = false;

        if (SearchBar.pageNumber == null || SearchBar.pageNumber == '') {
            SearchBar.pageNumber = 0;
        }
        if (SearchBar.numberOfRows == null || SearchBar.numberOfRows == '') {
            SearchBar.numberOfRows = 20;
        }

        var numberOfPages = Math.ceil(numberOfElements / SearchBar.numberOfRows);

        var container = $j("<div></div>");
        container.addClass("paging");

        /*numberOfRows buttons START*/
        var pagerLeft = $j("<div></div>");
        pagerLeft.addClass("left");

        var pagerText = $j("<div><div>");
        pagerText.addClass("text");
        pagerText.html(SearchBar.showText);

        var pagerTwenty = $j("<div></div>");
        if (SearchBar.numberOfRows == 20) {
            pagerTwenty.addClass("button_active");
        }
        else {
            pagerTwenty.addClass("button");
        }
        pagerTwenty.click(function () {
            SearchBar.numberOfRows = 20;
            SearchBar.doSearch();
        });

        pagerTwenty.html('<div class="left"></div><div class="text">20</div><div class="right"></div>');

        var pagerSixty = $j("<div></div>");
        if (SearchBar.numberOfRows == 60) {
            pagerSixty.addClass("button_active");
        }
        else {
            pagerSixty.addClass("button");
        }
        pagerSixty.click(function () {
            SearchBar.numberOfRows = 60;
            SearchBar.doSearch();
        });
        pagerSixty.html('<div class="left"></div><div class="text">60</div><div class="right"></div>');

        var pagerHundred = $j("<div></div>");
        if (SearchBar.numberOfRows == 100) {
            pagerHundred.addClass("button_active");
        }
        else {
            pagerHundred.addClass("button");
        }
        pagerHundred.click(function () {
            SearchBar.numberOfRows = 100;
            SearchBar.doSearch();
        });

        pagerHundred.html('<div class="left"></div><div class="text">100</div><div class="right"></div>');

        pagerLeft.append(pagerText);
        pagerLeft.append(pagerTwenty);
        pagerLeft.append(pagerSixty);
        pagerLeft.append(pagerHundred);
        /*numberOfRows buttons END*/

        /*Number buttons START*/
        var pagerRight = $j("<div></div>");
        pagerRight.addClass("right");


        var backNumber = 0;
        if (SearchBar.pageNumber - 1 < 1) {
            backNumber = 0;
        }
        else {
            backNumber = SearchBar.pageNumber - 1;
        }

        var pagerBack = $j("<div style=\"cursor:pointer;\"></div>");
        pagerBack.addClass("navbutton");
        pagerBack.click(function () {
            SearchBar.pageNumber = backNumber;
            SearchBar.doSearch();
            window.scrollTo(0, 0);
        });

        pagerBack.append('<img alt=\"\" src=\"/Resources/BR/Images/Main/productsbox_paging_button_prev.png\">');


        var nextNumber = 0;
        if (SearchBar.pageNumber + 1 > numberOfPages) {
            nextNumber = numberOfPages;
        }
        else {
            nextNumber = SearchBar.pageNumber + 1;
        }

        var pagerNext = $j("<div style=\"cursor:pointer;\"></div>");
        pagerNext.addClass("navbutton");
        pagerNext.click(function () {
            SearchBar.pageNumber = nextNumber;
            SearchBar.doSearch();
            window.scrollTo(0, 0);
        });

        pagerNext.append('<img alt=\"\" src=\"/Resources/BR/Images/Main/productsbox_paging_button_next.png\">');

        pagerRight.append(pagerBack);

        var count = 0;

        for (var i = 0; i <= numberOfPages; i++) {

            count++;

            if (i < numberOfPages) {
                if (numberOfPages > 7 && i + 1 < 4 && numberOfPages > 1 ||
                numberOfPages > 7 && i + 1 < 8 && SearchBar.pageNumber < 4 && numberOfPages > 1 ||
                numberOfPages > 7 && i + 1 == SearchBar.pageNumber + 1 && numberOfPages > 1 ||
                numberOfPages > 7 && i + 1 == SearchBar.pageNumber + 2 && numberOfPages > 1 ||
                numberOfPages > 7 && i + 1 == SearchBar.pageNumber + 3 && numberOfPages > 1 ||
                numberOfPages > 7 && i + 1 == numberOfPages && SearchBar.pageNumber > numberOfPages - 3 && numberOfPages > 1 ||
                numberOfPages > 7 && i + 1 == numberOfPages && SearchBar.pageNumber > numberOfPages - 3 && numberOfPages > 1 ||
                numberOfPages <= 7 && numberOfPages > 1) {
                    if (SearchBar.pageNumber == i) {
                        var button = $j("<div></div>");
                        button.addClass("button_active");
                    }
                    else {
                        var button = $j("<div></div>");
                        button.addClass("button");
                    }

                    var buttonLeft = $j("<div></div>");
                    buttonLeft.addClass("left");

                    var buttonText = $j("<div></div>");
                    buttonText.addClass("text");

                    button.click(function () {
                        SearchBar.pageNumber = i;
                        SearchBar.doSearch();
                        window.scrollTo(0, 0);
                    });

                    buttonText.html(i + 1);

                    var buttonRight = $j("<div></div>");
                    buttonRight.addClass("right");

                    button.append(buttonLeft);
                    button.append(buttonText);
                    button.append(buttonRight);

                    pagerRight.append(button);
                }

                else if (numberOfPages == 1) {

                    var button = $j("<div></div>");
                    button.addClass("button_active");

                    var buttonLeft = $j("<div></div>");
                    buttonLeft.addClass("left");

                    var buttonText = $j("<div></div>");
                    buttonText.addClass("text");

                    button.click(function () {
                        SearchBar.pageNumber = 0;
                        SearchBar.doSearch();
                        window.scrollTo(0, 0);
                    });

                    buttonText.html(1);

                    var buttonRight = $j("<div></div>");
                    buttonRight.addClass("right");

                    button.append(buttonLeft);
                    button.append(buttonText);
                    button.append(buttonRight);

                    if (!PageOneSet) {
                        pagerRight.append(button);
                        PageOneSet = true;
                    }

                }

                if (i == 3 && SearchBar.pageNumber > 3 && numberOfPages > 7) {
                    pagerRight.append('<div class=\"button\" style=\"cursor: default;\"><div class=\"left\"></div><div class=\"text\">...</div><div class=\"right\"></div></div>');
                }
            }
        }

        pagerRight.append(pagerNext);
        /*Number buttons END*/

        container.append(pagerLeft);
        container.append(pagerRight);
        container.append('<div class="bothclear"></div>');

        return container;
    },

    getItemHtml: function (title, body, image, price, url, searchableId, searchPhrase, editionId, discountBasketText, splashIcon) {

        if (SearchBar.cssClass != 'product_listitem') {
            var container = $j("<div></div>");
            container.addClass("product");
        }
        else {
            var container = $j("<div></div>");
            container.addClass("product_listitem");
        }

        // Add onclick link
        container.click(function () {
            window.location = url;
            return false;
        });
        var onclickLink = "";
        onclickLink += "window.location = '" + url + "'; return false;"
        container.attr("onClick", onclickLink);

        // Splash icon
        if (splashIcon && splashIcon != "") {
            var splashIconDiv = $j("<div class=\"splash\"></div>");
            splashIconDiv.append("<img alt=\"\" src=\"" + splashIcon + "\" />");
            container.append(splashIconDiv);
        }

        // Image
        var imageDiv = $j("<div></div>");
        imageDiv.addClass("image");
        var imageAnchor = $j("<a></a>");
        imageAnchor.attr("href", url);

        var imageElm = $j("<img/>");
        imageElm.attr("src", image == null || image == "" ? SearchBar.defaultPicture : image);
        imageElm.attr("alt", "");
        imageAnchor.append(imageElm);
        imageDiv.append(imageAnchor);

        //description
        var descriptionDiv = $j("<div></div>");
        descriptionDiv.addClass("description");

        // Headline
        var headlineDiv = $j("<div></div>");
        headlineDiv.addClass("headline");

        if (title != null) {
            var headlineAnchor = $j("<a></a>");
            headlineAnchor.attr("href", url);
            headlineAnchor.html(title);
            headlineDiv.append(headlineAnchor);
        }

        // about
        var aboutDiv = $j("<div></div>");
        aboutDiv.addClass("about");
        var aboutAnchor = $j("<a></a>");
        aboutAnchor.attr("href", url);
        aboutAnchor.html(body);
        aboutDiv.append(aboutAnchor);

        // code
        if (editionId != null && editionId != '') {
            var codeDiv = $j("<div></div>");
            codeDiv.addClass("code");
            var codeAnchor = $j("<a></a>");
            codeAnchor.attr("href", url);
            codeAnchor.html(this.editionIdText + editionId);
            codeDiv.append(codeAnchor);
        }
        container.append(imageDiv);

        descriptionDiv.append(headlineDiv);
        descriptionDiv.append(aboutDiv);
        descriptionDiv.append(codeDiv);
        container.append(descriptionDiv);

        // Price
        var priceDiv = $j("<div></div>");
        priceDiv.addClass("price");
        if (price != null && price != '') {
            // Price right
            var pricerightDiv = $j("<div></div>");
            pricerightDiv.addClass("right");

            // Price amount
            var priceamountDiv = $j("<div></div>");
            priceamountDiv.addClass("amount");

            // Price left
            var priceleftDiv = $j("<div></div>");
            priceleftDiv.addClass("left");

            var priceAnchor = $j("<a></a>");
            priceAnchor.attr("href", url);
            priceAnchor.html(price);
            priceamountDiv.append(priceAnchor);

            priceDiv.append(pricerightDiv);
            priceDiv.append(priceamountDiv);
            priceDiv.append(priceleftDiv);
        }
        container.append(priceDiv);

        var linksDiv = $j("<div></div>");
        linksDiv.addClass("links");
        container.append(linksDiv);

        //discount text
        var discountDiv = $j("<div></div>");
        discountDiv.addClass("text");
        if (discountBasketText != null && discountBasketText != '') {
            discountDiv.html(discountBasketText);
        }
        container.append(discountDiv);

        return container;
    }
}

var FreetextSearch = {
    searchService: null,
    searchFunction: null,

    init: function () {
        this.searchService = new SearchServiceFE();
        this.searchService.ajax.success = this.searchResultReceived;
    },

    doPersistedProductSearch: function (pageNumber, numberOfRows, freeText, age, categories, fromPrice, gender, toPrice, sort, contextItemId, breadcrumbTaxonomy, viewMode) {
        var tocss = "product_listitem";
        var fromcss = SearchBar.cssClass;
        switch (viewMode) {
            case "1":
                tocss = "product_listitem";
                break;
            case "2":
                tocss = "product";
                break;
        }
        SearchBar.changeViewDontPersist(fromcss, tocss);

        AgeFilter.setAge(age);
        GenderCheck.setGenderSelection(gender);
        this.initSearch();
        this.searchFunction = function () { FreetextSearch.doProductSearch(); };
        this.searchService.GetSearchResult(pageNumber, numberOfRows, freeText, age, categories, fromPrice, gender, toPrice, sort, contextItemId, SearchBar.breadcrumbTaxonomy);
    },

    doPersistedShopSearch: function (pageNumber, numberOfRows, freeText, viewMode) {
        var tocss = "product_listitem";
        var fromcss = SearchBar.cssClass;
        switch (viewMode) {
            case "1":
                tocss = "product_listitem";
                break;
            case "2":
                tocss = "product";
                break;
        }
        SearchBar.changeViewDontPersist(fromcss, tocss);


        this.initSearch();
        this.searchFunction = function () { FreetextSearch.doShopSearch(); };
        this.searchService.PerformShopSearchAsProductEntities(freeText, pageNumber, numberOfRows);
    },

    doPersistedSitecoreSearch: function (freeText, pageNumber, numberOfRows, viewMode) {

        var tocss = "product_listitem";
        var fromcss = SearchBar.cssClass;
        switch (viewMode) {
            case "1":
                tocss = "product_listitem";
                break;
            case "2":
                tocss = "product";
                break;
        }
        SearchBar.changeViewDontPersist(fromcss, tocss);

        this.initSearch();
        this.searchFunction = function () { FreetextSearch.doSitecoreSearch(); };

        this.searchService.PerformSitecoreSearchAsProductEntities(freeText, pageNumber, numberOfRows);
    },

    doProductSearch: function () {
        this.initSearch();
        this.searchFunction = function () { FreetextSearch.doProductSearch(); };
        PersistSearch.PersistProductSearch(SearchBar.pageNumber, SearchBar.numberOfRows, encodeURIComponent(SearchBar.freeText), AgeFilter.getAge(), SearchBar.categories, PriceCheck.getFromPrice(), GenderCheck.getGender(), PriceCheck.getToPrice(), SortFilter.getSort(), ContextItemId, SearchBar.breadcrumbTaxonomy);
        this.searchService.GetSearchResult(SearchBar.pageNumber, SearchBar.numberOfRows, encodeURIComponent(SearchBar.freeText), AgeFilter.getAge(), SearchBar.categories, PriceCheck.getFromPrice(), GenderCheck.getGender(), PriceCheck.getToPrice(), SortFilter.getSort(), ContextItemId, SearchBar.breadcrumbTaxonomy);
    },

    doShopSearch: function () {
        this.initSearch();
        this.searchFunction = function () { FreetextSearch.doShopSearch(); };
        PersistSearch.PersistShopSearch(encodeURIComponent(SearchBar.freeText), SearchBar.pageNumber, SearchBar.numberOfRows, SearchBar.getViewMode());
        this.searchService.PerformShopSearchAsProductEntities(encodeURIComponent(SearchBar.freeText), SearchBar.pageNumber, SearchBar.numberOfRows);
    },

    doSitecoreSearch: function () {
        this.initSearch();
        this.searchFunction = function () { FreetextSearch.doSitecoreSearch(); };
        PersistSearch.PersistSitecoreSearch(SearchBar.pageNumber, SearchBar.numberOfRows, encodeURIComponent(SearchBar.freeText), SearchBar.getViewMode());
        this.searchService.PerformSitecoreSearchAsProductEntities(encodeURIComponent(SearchBar.freeText), SearchBar.pageNumber, SearchBar.numberOfRows);
    },

    initSearch: function () {
        if (this.searchService == null)
            this.init();

        if (SearchBar.pageNumber == null) {
            SearchBar.pageNumber = 0;
        }
        if (SearchBar.numberOfRows == null) {
            SearchBar.numberOfRows = 20;
        }
        if (SearchBar.freeText == null) {
            SearchBar.freeText = CommonHelper.getParameterByName("q");
        }

        $j("#loaderDiv").css("display", "block");
    },

    searchResultReceived: function (result) {
        var contentContainerId = "#product_searchresult";
        var contentContainer = $j("#product_searchresult");

        $j(contentContainerId + " .product").remove();
        $j(contentContainerId + " .product_listitem").remove();
        $j(contentContainerId + " .leftclear").remove();
        $j(contentContainerId + " .paging").remove();

        $j("#top_info").remove();

        SearchBar.totalSearchHits = result.NumberOfElements;
        contentContainer.append(SearchBar.getTopInfoHtml());

        if (result.Products.length > 0 || result.Page || result.Store) {

            $j("#divNoResult").css("display", "none");

            SearchBar.hasResult = true;

            // Products.
            if (result.Products.length > 0) {
                for (var i = 0; i < result.Products.length; i++) {
                    var product = result.Products[i];

                    contentContainer.append(SearchBar.getItemHtml
                    (
                        product.Title,
                        product.Teaser,
                        product.ThumbnailImage,
                        product.Price,
                        product.Url,
                        product.SearchableId,
                        SearchBar.freeText,
                        product.EditionId,
                        product.DiscountBasketText,
                        product.SplashIcon
                    ));
                }
            }

            contentContainer.append('<div class="leftclear"></div>');
            contentContainer.append(FreetextSearch.getPagerHtml());
        }
        else {
            $j("#divNoResult").css("display", "block");
            $j("#top_info").remove();
        }

        SearchBar.updateFacets(result.FacetList);
    },

    getPagerHtml: function () {

        if (SearchBar.totalSearchHits <= 20) {
            return;
        }

        var PageOneSet = false;

        if (SearchBar.pageNumber == null || SearchBar.pageNumber == '') {
            SearchBar.pageNumber = 0;
        }
        if (SearchBar.numberOfRows == null || SearchBar.numberOfRows == '') {
            SearchBar.numberOfRows = 20;
        }

        var numberOfPages = Math.ceil(SearchBar.totalSearchHits / SearchBar.numberOfRows);

        var container = $j("<div></div>");
        container.addClass("paging");

        /*numberOfRows buttons START*/
        var pagerLeft = $j("<div></div>");
        pagerLeft.addClass("left");

        var pagerText = $j("<div><div>");
        pagerText.addClass("text");
        pagerText.html(SearchBar.showText);
        pagerLeft.append(pagerText);

        var choices = new Array();
        if (SearchBar.totalSearchHits > 20) {
            choices.push(20);
        }
        if (SearchBar.totalSearchHits > 60) {
            choices.push(60);
        }
        if (SearchBar.totalSearchHits > 100) {
            choices.push(100);
        }

        for (var i = 0; i < choices.length; i++) {
            pagerLeft.append(this.createNumberButton(choices[i], SearchBar.numberOfRows == choices[i]));
        }
        /*numberOfRows buttons END*/

        /*Number buttons START*/
        var pagerRight = $j("<div></div>");
        pagerRight.addClass("right");

        if (numberOfPages > 1) {
            //Add backbutton if we're past page 0
            if (SearchBar.pageNumber > 0) {
                var pagerBack = $j("<div style=\"cursor:pointer;\"></div>");
                pagerBack.addClass("navbutton");
                pagerBack.click(function () {
                    SearchBar.pageNumber = SearchBar.pageNumber - 1;
                    window.scrollTo(0, 0);
                    FreetextSearch.searchFunction();
                });
                pagerBack.append('<img alt=\"\" src=\"/Resources/BR/Images/Main/productsbox_paging_button_prev.png\">');
                pagerRight.append(pagerBack);
            }

            //Add buttons 1-3 up till current page
            var renderButton = 0;
            while (renderButton < SearchBar.pageNumber && renderButton < 3) {
                pagerRight.append(FreetextSearch.createPagingButton(renderButton, false));
                renderButton++;
            }

            //Add '...' button if there's a gap between 3 and current
            if (SearchBar.pageNumber > 3)
                pagerRight.append('<div class=\"button\" style=\"cursor: default;\"><div class=\"left\"></div><div class=\"text\">...</div><div class=\"right\"></div></div>');

            //Add current button
            pagerRight.append(FreetextSearch.createPagingButton(SearchBar.pageNumber, true));

            //Add up to 3 buttons after current button
            renderButton = SearchBar.pageNumber + 1;
            while (renderButton < numberOfPages && renderButton <= SearchBar.pageNumber + 3) {
                pagerRight.append(FreetextSearch.createPagingButton(renderButton, false));
                renderButton++;
            }

            //Add '...' button if there's more buttons
            if (renderButton + 1 < numberOfPages)
                pagerRight.append('<div class=\"button\" style=\"cursor: default;\"><div class=\"left\"></div><div class=\"text\">...</div><div class=\"right\"></div></div>');

            //Add forwardbutton if there are more pages
            if (SearchBar.pageNumber + 1 < numberOfPages) {
                var pagerNext = $j("<div style=\"cursor:pointer;\"></div>");
                pagerNext.addClass("navbutton");
                pagerNext.click(function () {
                    SearchBar.pageNumber = SearchBar.pageNumber + 1;
                    window.scrollTo(0, 0);
                    FreetextSearch.searchFunction();
                });
                pagerNext.append('<img alt=\"\" src=\"/Resources/BR/Images/Main/productsbox_paging_button_next.png\">');
                pagerRight.append(pagerNext);
            }
        }
        /*Number buttons END*/

        container.append(pagerLeft);
        container.append(pagerRight);
        container.append('<div class="bothclear"></div>');

        return container;
    },

    createNumberButton: function (number, active) {
        var showButton = $j("<div></div>");
        if (active) {
            showButton.addClass("button_active");
        }
        else {
            showButton.addClass("button");
            showButton.click(function () {
                SearchBar.numberOfRows = number;
                SearchBar.pageNumber = 0;
                FreetextSearch.searchFunction();
            });
        }
        showButton.html('<div class="left"></div><div class="text">' + number + '</div><div class="right"></div>');
        return showButton;
    },

    createPagingButton: function (pagingnumber, active) {
        var button = $j("<div></div>");
        if (active) {
            button.addClass("button_active");
        }
        else {
            button.addClass("button");
            button.click(function () {
                SearchBar.pageNumber = pagingnumber;
                window.scrollTo(0, 0);
                FreetextSearch.searchFunction();
            });
        }

        var buttonLeft = $j("<div></div>");
        buttonLeft.addClass("left");

        var buttonText = $j("<div></div>");
        buttonText.addClass("text");
        buttonText.html(pagingnumber + 1);

        var buttonRight = $j("<div></div>");
        buttonRight.addClass("right");

        button.append(buttonLeft);
        button.append(buttonText);
        button.append(buttonRight);

        return button;
    }
}

// Represents the minibasket.
var MiniBasket = {
    currency: null,
    resumetext: null,
    quantitytext: null,
    resume: null,
    items: null,
    discount: null,
    freight: null,
    total: null,

    init: function () {
        Events.listeners.updateBasket.push(MiniBasket.updateBasket);
    },

    updateBasket: function () {

        var service = new ShoppingServiceFE();
        service.ajax.success = function (minibasket) {

            // Set summary text.
            var summarytext = "";
            summarytext = MiniBasket.resumetext.replace("{NumProducts}", minibasket.TotalProducts);
            summarytext = summarytext.replace("{Currency}", MiniBasket.currency);
            summarytext = summarytext.replace("{Price}", minibasket.Total);
            MiniBasket.resume.html(summarytext);

            // Redraw products.
            MiniBasket.items.html("");
            var html = "";
            for (var i = 0; i < minibasket.Products.length; i++) {
                var product = minibasket.Products[i];
                html += "<div class=\"item\">";
                html += "<div class=\"image\"><img alt=\"\" src=\"" + product.ImageUrl + "\" /></div>";
                html += "<div class=\"text\">" + product.Name + "</div>";
                html += "<div class=\"price\">" + product.Quantity + " " + MiniBasket.quantitytext + " " + product.Price + "</div>";
                html += "</div>";
            }

            MiniBasket.items.html(html);
            MiniBasket.discount.html(minibasket.DiscountTotal);
            MiniBasket.freight.html(minibasket.ShippingTotal);
            MiniBasket.total.html(minibasket.Total);
        }

        service.GetMiniBasket();
    }
}

var TopMenu = {
    closeAll: function (parent) {
        $j(parent).children(".select_active").removeClass("select_active").addClass("select");
    }
}

// Represents a google map.
var GoogleMap = {

    map: null,
    geocoder: null,
    container: null,
    initialZoomLevel: null,
    initialLatitude: null,
    initialLongitude: null,
    initialAddress: null,
    markers: null,
    infowindowCache: new Object(),
    addressNotFoundText: null,
    customPopup: null,
    searchForMarker: false,

    callbacks: {
        getInfowindowHtml: null,
        change: null
    },

    load: function () {
        $j(window).load(function () {
            var script = document.createElement("script");
            script.type = "text/javascript";
            script.src = "http://maps.google.com/maps/api/js?sensor=false&callback=GoogleMap.initialize";
            $j(document.body).append(script);
        });
    },

    initialize: function () {

        this.geocoder = new google.maps.Geocoder();

        // Initialize google maps function.
        var googleMapInit = function (point) {
            var myOptions = {
                zoom: GoogleMap.initialZoomLevel,
                center: point,
                mapTypeId: google.maps.MapTypeId.ROADMAP
            }

            GoogleMap.map = new google.maps.Map(GoogleMap.container, myOptions);

            // Prioritize the initial bounds for address lookups.
            google.maps.event.addListener(GoogleMap.map, 'tilesloaded', function () {
                GoogleMap.initialBounds = GoogleMap.map.getBounds();
                google.maps.event.clearListeners(GoogleMap.map, 'tilesloaded');
            });

            GoogleMap.drawMarkers();

            CustomPopup.toOverlaySubclass();

            google.maps.event.addListener(GoogleMap.map, 'dragend', GoogleMap.change);
            google.maps.event.addListener(GoogleMap.map, 'zoom_changed', GoogleMap.zoomChange);
        }

        // Create map using initial latitude and longitude.
        if (this.initialAddress.replace(/\s/g, "") == "") {
            googleMapInit(new google.maps.LatLng(this.initialLatitude, this.initialLongitude));
        }
        // Create map using initial address.
        else {
            var callback = function (point) {
                googleMapInit(point);
            }
            GoogleMap.search(GoogleMap.initialAddress, callback);
        }
    },

    change: function () {

        if (GoogleMap.callbacks.change)
            GoogleMap.callbacks.change();
    },

    zoomChange: function () {

        google.maps.event.addListener(GoogleMap.map, 'tilesloaded', GoogleMap.tilesLoaded);
    },

    tilesLoaded: function () {

        google.maps.event.clearListeners(GoogleMap.map, 'tilesloaded');

        if (GoogleMap.searchForMarker == true) {

            var zoom = GoogleMap.map.getZoom();
            var zoomFound = false;
            var bounds = GoogleMap.map.getBounds();

            for (var i = 0; i < GoogleMap.markers.length; i++) {
                var latLng = new google.maps.LatLng(GoogleMap.markers[i].lat, GoogleMap.markers[i].lng);

                if (bounds.contains(latLng)) {
                    zoomFound = true;
                    break;
                }
            }

            if (zoomFound != true) {
                zoom--;
                if (zoom == 0) {
                    GoogleMap.searchForMarker = false;
                }
                else {
                    GoogleMap.map.setZoom(zoom);
                }
            }
            else {
                GoogleMap.searchForMarker = false;
            }
        }

        if (GoogleMap.searchForMarker == false) {
            GoogleMap.change();
        }
    },

    search: function (address, callback) {

        if (address.replace(/\s/g, "") == "") return;

        this.geocoder.geocode({ 'address': address, 'bounds': GoogleMap.initialBounds }, function (results, status) {

            if (status == google.maps.GeocoderStatus.OK) {
                GoogleMap.searchForMarker = true;

                if (callback) {
                    callback(results[0].geometry.location);
                }
                else {
                    GoogleMap.map.setCenter(results[0].geometry.location);

                    if (results[0].geometry.bounds) {
                        GoogleMap.map.fitBounds(results[0].geometry.bounds);
                    }
                    else {
                        google.maps.event.addListener(GoogleMap.map, 'tilesloaded', GoogleMap.tilesLoaded);
                    }
                }
            } else {
                if (GoogleMap.addressNotFoundText)
                    alert(GoogleMap.addressNotFoundText);
            }
        });
    },

    drawMarkers: function () {
        for (var i = 0; i < GoogleMap.markers.length; i++) {
            var marker = new google.maps.Marker({
                map: GoogleMap.map,
                position: new google.maps.LatLng(GoogleMap.markers[i].lat, GoogleMap.markers[i].lng),
                icon: GoogleMap.markers[i].icon,
                title: GoogleMap.markers[i].title
            });

            google.maps.event.addListener(marker, 'click', (function (marker, id) {
                return function () {
                    if (GoogleMap.infowindowCache[id]) {
                        if (GoogleMap.customPopup)
                            GoogleMap.customPopup.setMap(null);

                        GoogleMap.customPopup = new CustomPopup(marker.getPosition(), GoogleMap.map, GoogleMap.infowindowCache[id]);
                    }
                    else {
                        var callback = function (html) {
                            GoogleMap.infowindowCache[id] = html;

                            if (GoogleMap.customPopup)
                                GoogleMap.customPopup.setMap(null);

                            GoogleMap.customPopup = new CustomPopup(marker.getPosition(), GoogleMap.map, html);
                        }

                        if (GoogleMap.callbacks.getInfowindowHtml)
                            GoogleMap.callbacks.getInfowindowHtml(id, callback);
                    }
                }
            })(marker, GoogleMap.markers[i].id));
        }
    },

    showMap: function () {
        var container = $j(GoogleMap.container);
        $j(container.children()[1]).hide();
        $j(container.children()[0]).show();
    },

    getVisibleMarkers: function () {
        var bounds = GoogleMap.map.getBounds();
        var markers = new Array();
        for (var i = 0; i < GoogleMap.markers.length; i++) {
            var latLng = new google.maps.LatLng(GoogleMap.markers[i].lat, GoogleMap.markers[i].lng);
            if (bounds.contains(latLng)) {
                markers.push(GoogleMap.markers[i]);
            }
        }
        return markers;
    },

    print: function () {
        var container = $j(GoogleMap.container);

        var staticImgDiv;

        if (container.children().length == 1) {
            staticImgDiv = $j("<div></div>");
            staticImgDiv.css("text-align", "center");
            container.append(staticImgDiv);
        }
        else {
            staticImgDiv = $j(container.children()[1]);
            staticImgDiv.show();
        }

        $j(container.children()[0]).hide();

        var center = GoogleMap.map.getCenter();
        var zoom = GoogleMap.map.getZoom();
        var maptype = GoogleMap.map.mapTypeId;
        var markers = GoogleMap.getVisibleMarkers();

        var markersString = "";
        var maxMarkers = 50;
        var length = markers.length > maxMarkers ? maxMarkers : markers.length;

        for (var i = 0; i < length; i++) {
            markersString += "|" + markers[i].lat + "," + markers[i].lng;
        }

        if (markersString != "") markersString = "&markers=icon:" + FindShopHandler.currentSiteUrl + FindShopHandler.currentMarkerIcon + markersString;

        var url = "http://maps.google.com/maps/api/staticmap?" +
                "center=" + center +
                "&zoom=" + zoom +
                "&size=640x600" +
                "&maptype=" + maptype +
                markersString +
                "&sensor=false";

        staticImgDiv.html("<img alt=\"\" src=\"" + url + "\" />");

        window.print();

        setTimeout("GoogleMap.showMap();", 1000);
    }
}

// Handles shop finding logic.
var FindShopHandler = {
    texts: {
        defaultAddressInput: null,
        defaultPostalCodeInput: null,
        openingHours: null,
        phoneNumber: null,
        moreInfo: null,
        monday: null,
        tuesday: null,
        wednesday: null,
        thursday: null,
        friday: null,
        saturday: null,
        sunday: null,
        pageSizeTitle: null,
        pageSizeShowAll: null,
        shopdetailWithProductSearch: null,
        shopdetailWithProductSearchFew: null,
        shopdetailWithProductSearchVariant: null,
        productName: null
    },

    inputs: {
        address: null,
        postalcode: null,
        searchbutton: null
    },

    pager: {
        pageSize: 20,
        pageNumber: 1,
        pageSizes: [20, 60, 100]
    },

    renderPopupLink: null,
    localCity: null,
    zoomThreshold: null,
    searchService: null,
    currentMarkerIcon: null,
    currentSiteUrl: null,
    productSearchableId: null,
    productSkuId: null,

    init: function () {
        this.inputs.address.focus(function () {
            if ($j(this).val() == FindShopHandler.texts.defaultAddressInput)
                $j(this).val("");
        });

        this.inputs.address.blur(function () {
            if ($j(this).val().replace(/\s/g, "") == "")
                $j(this).val(FindShopHandler.texts.defaultAddressInput);
        });

        this.inputs.postalcode.focus(function () {
            if ($j(this).val() == FindShopHandler.texts.defaultPostalCodeInput)
                $j(this).val("");
        });

        this.inputs.postalcode.blur(function () {
            if ($j(this).val().replace(/\s/g, "") == "")
                $j(this).val(FindShopHandler.texts.defaultPostalCodeInput);
        });

        // Enter check.
        this.inputs.address.keypress(function (e) {
            switch (e.keyCode) {
                case 13:
                    FindShopHandler.clickTrigger();
                    return false;
                    break;
                default:
                    return true;
            }
        });

        this.inputs.postalcode.keypress(function (e) {
            switch (e.keyCode) {
                case 13:
                    FindShopHandler.clickTrigger();
                    return false;
                    break;
                default:
                    return true;
            }
        });

        this.inputs.searchbutton.click(function () {
            var address = FindShopHandler.inputs.address.val();
            var postalcode = FindShopHandler.inputs.postalcode.val();

            if (address == FindShopHandler.texts.defaultAddressInput)
                address = "";

            if (postalcode == FindShopHandler.texts.defaultPostalCodeInput)
                postalcode = "";

            var searchstring = address + " " + postalcode;

            if (searchstring.replace(/\s/g, "") == "") return;

            GoogleMap.search(searchstring);
        });

        GoogleMap.callbacks.getInfowindowHtml = FindShopHandler.getShopInfo;
        GoogleMap.callbacks.change = FindShopHandler.doSearch;

        $j("#localshops_search").click(function () {
            GoogleMap.search(FindShopHandler.localCity);
        });

        this.searchService = new SearchServiceFE();
        this.searchService.ajax.success = this.renderSearchResult;
    },

    clickTrigger: function () {
        FindShopHandler.inputs.searchbutton.trigger("click");
    },

    getShopInfo: function (id, callback) {
        var service = new RetailShopServiceFE();

        service.ajax.success = function (shop) {
            if (shop) {
                // ----------------
                // DIV MARKER
                // ----------------
                var marker = $j("<div></div>");
                marker.addClass("marker");

                // ----------------
                // DIV OVERLAY_TOP
                // ----------------
                var overlay_top = $j("<div></div>");
                overlay_top.addClass("overlay_top");

                // Add close button
                var closeDiv = $j("<div></div>");
                closeDiv.addClass("close");
                var closeButton = $j("<a></a>");
                closeButton.click(function () {
                    $j(this).parent().parent().parent().css('visibility', 'hidden');
                });
                closeButton.append("<img alt=\"\" src=\"" + RootResourceFolder + "/Images/Main/google_overlay_close.png\"/>");
                closeDiv.append(closeButton);
                overlay_top.append(closeDiv);

                marker.append(overlay_top);

                // ----------------
                // DIV OVERLAY
                // ----------------
                var overlay = $j("<div></div>");
                overlay.addClass("overlay");

                // Headline
                overlay.append("<div class=\"headline\">" + shop.Name + "</div>");

                //stockinfo              
                if (shop.QueriedProductStockCount > 0) {
                    var stock = "";
                    if (shop.QueriedProductBuyableItemIsVariant) {
                        stock = FindShopHandler.texts.shopdetailWithProductSearchVariant;
                    }
                    else {
                        stock = FindShopHandler.texts.shopdetailWithProductSearch;
                    }
                    stock = stock.replace("[productcount]", shop.QueriedProductStockCount).replace("[producttitle]", FindShopHandler.texts.productName)
                    overlay.append("<div class=\"stock\">" + stock + "</div>");
                }
                // Address
                var address = "";

                for (var i = 0; i < shop.AddressLines.length; i++)
                    address += shop.AddressLines[i] + "<br />";

                address += FindShopHandler.texts.phoneNumber + " " + shop.PhoneNumber + "<br />";
                overlay.append("<div class=\"address\">" + address + "</div>");

                // Shop hours.
                overlay.append("<div class=\"open\">" + FindShopHandler.texts.openingHours + "</div>");

                for (var i = 0; i < shop.Hours.length; i++) {
                    var hours = shop.Hours[i];

                    overlay.append("<div class=\"day\">" + FindShopHandler.texts[hours.Day] + "</div>");
                    overlay.append("<div class=\"date\">" + hours.Date + "</div>");
                    overlay.append("<div class=\"time\">" + hours.OpeningTime + " - " + hours.ClosingTime + "</div>");
                    overlay.append("<div class=\"leftclear\"></div>");
                }
                marker.append(overlay);

                // -------------------
                // DIV OVERLAY BOTTOM
                // -------------------
                var overlay_bottom = $j("<div></div>");
                overlay_bottom.addClass("overlay_bottom");

                // Link button.
                if (FindShopHandler.renderPopupLink == true) {

                    var button = $j("<div></div>");
                    button.append("<div class=\"buttonleft\"></div>");
                    button.append("<div class=\"buttonsymbol\">+</div>");
                    button.append("<div class=\"buttondivider\"></div>");
                    button.append("<div class=\"buttontext\">" + FindShopHandler.texts.moreInfo + "</div>");
                    button.append("<div class=\"buttonright\"></div>");
                    button.append("<div class=\"leftclear\"></div>");

                    var buttonPlaceholder = $j("<div></div>");
                    buttonPlaceholder.addClass("button_placeholder");
                    var saveButton = $j("<div></div>");
                    saveButton.addClass("savebutton");
                    saveButton.click(function () {
                        document.location = shop.Url;
                    });
                    saveButton.append(button.html());
                    buttonPlaceholder.append(saveButton);
                    overlay_bottom.append(buttonPlaceholder);
                }
                marker.append(overlay_bottom);

                callback(marker[0]);
            }
        }

        service.GetRetailShop(id, FindShopHandler.productSkuId);
    },

    doSearch: function () {

        if (!FindShopHandler.zoomThreshold) return;

        var zoom = GoogleMap.map.getZoom();

        if (zoom >= FindShopHandler.zoomThreshold) {

            var ne = GoogleMap.map.getBounds().getNorthEast();
            var sw = GoogleMap.map.getBounds().getSouthWest();


            var bounds = new Array();
            bounds.push(ne.lat());
            bounds.push(ne.lng());
            bounds.push(sw.lat());
            bounds.push(sw.lng());

            FindShopHandler.searchService.GetRetailShops(bounds, FindShopHandler.pager.pageNumber, FindShopHandler.pager.pageSize, FindShopHandler.productSearchableId, FindShopHandler.productSkuId);
        }
        else {
            var container = $j("#shop_searchresult").html("");
        }
    },

    renderSearchResult: function (result) {

        var container = $j("#shop_searchresult").html("");

        if (result.RetailStores.length > 0) {

            var container = $j("#shop_searchresult");
            container.append("<div class=\"spacer_15px\"></div>");

            for (var i = 0; i < result.RetailStores.length; i++) {

                var shop = result.RetailStores[i];

                var content = $j("<div class=\"store_list_item\"></div>");

                // Shop image.
                content.append("<div class=\"image\"><img alt=\"\" src=\"" + shop.FacadeImageId + "\"></div>");

                // Headline, phonenumber.
                var headline = "";

                for (var j = 0; j < shop.AddressLines.length; j++) {
                    if (j > 0) headline += ", ";
                    headline += shop.AddressLines[j];
                }

                content.append("<div class=\"headline\">" + headline + "</div>");

                var innerContent = $j("<div class=\"content\"></div>");

                if (shop.QueriedProductStockCount > 0) {
                    var stock = "";
                    if (shop.QueriedProductBuyableItemIsVariant) {
                        stock = FindShopHandler.texts.shopdetailWithProductSearchVariant;
                    }
                    else {
                        stock = FindShopHandler.texts.shopdetailWithProductSearch;
                    }
                    stock = stock.replace("[productcount]", shop.QueriedProductStockCount).replace("[producttitle]", FindShopHandler.texts.productName)
                    innerContent.append("<div class=\"stock\">" + stock + "</div>");
                }
                innerContent.append("<div class=\"subhead\">" + FindShopHandler.texts.phoneNumber + " " + shop.PhoneNumber + "</div>");



                // Shop hours.
                innerContent.append("<div class=\"open\">" + FindShopHandler.texts.openingHours + "</div>");

                var thisweekContent = $j("<div class=\"thisweek\"></div>");

                for (var j = 0; j < shop.Hours.length; j++) {

                    var hours = shop.Hours[j];

                    thisweekContent.append("<div class=\"day\">" + FindShopHandler.texts[hours.Day] + "</div>");
                    thisweekContent.append("<div class=\"date\">" + hours.Date + "</div>");
                    thisweekContent.append("<div class=\"time\">" + hours.OpeningTime + " - " + hours.ClosingTime + "</div>");
                    thisweekContent.append("<div class=\"leftclear\"></div>");
                }

                innerContent.append(thisweekContent);

                var nextweekContent = $j("<div class=\"nextweek\"></div>");

                for (var j = 0; j < shop.HoursNextWeek.length; j++) {

                    var hours = shop.HoursNextWeek[j];

                    nextweekContent.append("<div class=\"day\">" + FindShopHandler.texts[hours.Day] + "</div>");
                    nextweekContent.append("<div class=\"date\">" + hours.Date + "</div>");
                    nextweekContent.append("<div class=\"time\">" + hours.OpeningTime + " - " + hours.ClosingTime + "</div>");
                    nextweekContent.append("<div class=\"leftclear\"></div>");
                }

                innerContent.append(nextweekContent);

                content.append(innerContent);

                var button = $j("<div class=\"savebutton\"></div>");

                (function (index) {
                    button.click(function () {
                        document.location = result.RetailStores[index].Url;
                    });
                })(i);

                button.append("<div class=\"buttonleft\"></div>");
                button.append("<div class=\"buttonsymbol\">+</div>");
                button.append("<div class=\"buttondivider\"></div>");
                button.append("<div class=\"buttontext\">" + FindShopHandler.texts.moreInfo + "</div>");
                button.append("<div class=\"buttonright\"></div>");
                button.append("<div class=\"leftclear\"></div>");

                var buttonPlaceholder = $j("<div class=\"button_placeholder\"></div>");
                buttonPlaceholder.append(button);

                content.append(buttonPlaceholder);

                container.append(content);
            }

            container.append("<div class=\"spacer_10px\"></div>");

            var pagingContainer = $j("<div class=\"paging\" id=\"shop_paging\"></div>");

            // Render left side of paging control.
            var pagingLeft = $j("<div class=\"left\"></div>");
            pagingLeft.append("<div class=\"text\">" + FindShopHandler.texts.pageSizeTitle + "</div>");

            for (var i = 0; i < FindShopHandler.pager.pageSizes.length; i++) {

                var size = FindShopHandler.pager.pageSizes[i];

                pagingLeft.append(FindShopHandler.renderPageSizeElement(size));
            }

            var pagingRight = $j("<div class=\"right\"></div>");

            if (result.NumberOfElements > result.RetailStores.length) {
                if (FindShopHandler.pager.pageNumber > 1) {
                    var prevButton = $j("<div class=\"navbutton\"><img alt=\"\" src=\"" + RootResourceFolder + "/Images/Main/productsbox_paging_button_prev.png\" /></div>");

                    prevButton.click(function () {
                        FindShopHandler.pager.pageNumber--;
                        FindShopHandler.doSearch();
                    });

                    pagingRight.append(prevButton);
                }

                var totalPages = parseInt(result.NumberOfElements / FindShopHandler.pager.pageSize);

                if (result.NumberOfElements % FindShopHandler.pager.pageSize > 0)
                    totalPages++;

                for (var i = 1; i <= totalPages; i++) {
                    pagingRight.append(FindShopHandler.renderPageNumberElement(i));
                }

                if (FindShopHandler.pager.pageNumber < totalPages) {
                    var nextButton = $j("<div class=\"navbutton\"><img alt=\"\" src=\"" + RootResourceFolder + "/Images/Main/productsbox_paging_button_next.png\" /></div>");

                    nextButton.click(function () {
                        FindShopHandler.pager.pageNumber++;
                        FindShopHandler.doSearch();
                    });

                    pagingRight.append(nextButton);
                }
            }

            pagingContainer.append(pagingLeft);
            pagingContainer.append(pagingRight);
            pagingContainer.append("<div class=\"bothclear\"></div>");

            container.append(pagingContainer);
        }
    },

    renderPageSizeElement: function (pageSize) {
        var pageSizeButton = $j("<div></div>");
        pageSizeButton.addClass(FindShopHandler.pager.pageSize == pageSize ? "button_active" : "button");
        pageSizeButton.append("<div class=\"left\"></div>");
        pageSizeButton.append("<div class=\"text\">" + pageSize + "</div>");
        pageSizeButton.append("<div class=\"right\"></div>");

        pageSizeButton.click(function () {
            $j("#shop_paging .left .button_active").removeClass("button_active").addClass("button");
            $j(this).addClass("button_active");
            FindShopHandler.pager.pageSize = pageSize;
            FindShopHandler.pager.pageNumber = 1;
            FindShopHandler.doSearch();
        });

        return pageSizeButton;
    },

    renderPageNumberElement: function (pageNumber) {
        var pageNumberButton = $j("<div></div>");
        pageNumberButton.addClass(FindShopHandler.pager.pageNumber == pageNumber ? "button_active" : "button");
        pageNumberButton.append("<div class=\"left\"></div>");
        pageNumberButton.append("<div class=\"text\">" + pageNumber + "</div>");
        pageNumberButton.append("<div class=\"right\"></div>");

        pageNumberButton.click(function () {
            $j("#shop_paging .right .button_active").removeClass("button_active").addClass("button");
            $j(this).addClass("button_active");
            FindShopHandler.pager.pageNumber = pageNumber;
            FindShopHandler.doSearch();
        });

        return pageNumberButton;
    }
}

// Custom google popup overlay.
function CustomPopup(position, map, content) {
    // Now initialize all properties.
    this.position_ = position;
    this.map_ = map;

    // Holds the popup content div.
    this.content_ = content;

    // Explicitly call setMap() on this overlay.
    this.setMap(map);

    this.finalized_ = false;
}

CustomPopup.toOverlaySubclass = function () {

    CustomPopup.prototype = new google.maps.OverlayView();

    CustomPopup.prototype.onAdd = function () {

        this.content_.style.position = "absolute";

        var panes = this.getPanes();

        panes.floatPane.appendChild(this.content_);
    }

    CustomPopup.prototype.draw = function () {

        var overlayProjection = this.getProjection();
        var pos = overlayProjection.fromLatLngToDivPixel(this.position_);

        this.content_.style.left = pos.x + 'px';
        this.content_.style.top = pos.y + 'px';

        // Only set visibility and pan to fit once.
        if (this.finalized_) return;
        this.autoPan();
        this.content_.style.visibility = "visible";
        this.finalized_ = true;
    }

    CustomPopup.prototype.onRemove = function () {
        this.content_.parentNode.removeChild(this.content_);
        this.content_ = null;
    }

    CustomPopup.prototype.autoPan = function () {

        var pos = this.getProjection().fromLatLngToContainerPixel(this.position_);

        var markerX = pos.x;
        var markerY = pos.y;

        var popupWidth = $j(this.content_).width();
        var popupHeight = $j(this.content_).height();

        var popupRight = popupWidth + markerX + 47;
        var popupBottom = popupHeight + markerY + 33;

        var mapWidth = $j(this.map_.getDiv()).width();
        var mapHeight = $j(this.map_.getDiv()).height();

        var panX = 0;
        var panY = 0;

        if (popupRight > mapWidth)
            panX = popupRight - mapWidth + 10;

        if (popupBottom > mapHeight)
            panY = popupBottom - mapHeight + 10;

        this.map_.panBy(panX, panY);
    }
}

var AvailProvider = {
    getRecommendations: function (productId, templateName, dynamicParameters, successCallback) {
        var service = new AvailServiceFE();
        service.ajax.success = successCallback;
        service.GetRecommendations(productId, templateName, dynamicParameters);
    }
}

var Avail = {
    defaultPicture: null,
    productService: null,
    productsReturned: null,
    numberOfProductsVisible: 4,
    currentIndex: 0,

    init: function () {

        this.productService = new ProductServiceFE();
        this.productService.ajax.success = this.productsReceived;

    },

    initializeRecommendations: function (templateName, dynamicParameters) {
        if (templateName == null) {
            return;
        }

        var jAvailDiv = $j('#availdiv');
        if (jAvailDiv == null) {
            return;
        }

        var productId = $j('#availproductids').val();
        if (productId == null || productId.length == 0) {
            return;
        }
        if (productId.replace(/\s/g, "") == "") {
            return;
        }

        var numberOfVisibleProducts = $j('#availnumberofproducts').val();
        if (numberOfVisibleProducts == null) {
            return;
        }

        var successCallback = function (data) {
            if (data == null) {
                return;
            }

            data = eval('(' + data + ')');

            jAvailDiv.show();

            Avail.init();
            Avail.numberOfProductsVisible = numberOfVisibleProducts;

            var products = new Array();
            for (var index = 0; index < data.result.values.length; index++) {
                products[products.length] = data.result.values[index][0];
            }
            Avail.getProducts(products);
        };

        AvailProvider.getRecommendations(productId, templateName, dynamicParameters, successCallback);
    },

    getProducts: function (productIds) {
        Avail.productService.GetResultProducts(productIds);
    },

    productsReceived: function (result) {
        if (!result) {
            return;
        }

        var contentContainer = $j("#product_ids_avail");
        // Products.
        Avail.productsReturned = result.Products;

        if (result.Products.length > 0) {
            var contentUl = $j('<ul class="jcarousel-skin-tango"></ul>');

            for (var i = 0; i < result.Products.length; i++) {
                var product = result.Products[i];

                if (SiteCatalyst.isUpsalePage == true) {
                    var url = product.Url;
                    url += "&icid=" + escape(SiteCatalyst.pageName + "_" + product.Category + "_" + product.Title + "_" + (i + 1));
                    product.Url = url;
                }
                contentUl.append(Avail.getItemHtml
                (
                    product,
                    i
                ));
            }
            contentContainer.append(contentUl);

            contentUl.addClass('scroller').jcarousel();
            $j("#product_ids_avail").find(".scroller").parent().css('width', '710px');
            $j("#product_ids_avail").find(".scroller").parent().css('margin-left', '50px');
            $j("#product_ids_avail").find(".scroller").parent().css('margin-bottom', '0px');

            $j("#product_ids_avail").css('padding', '0');
        }

    },

    getItemHtml: function (product, index) {

        var container = $j("<li style='width: 221px; height: 248px;'></li>");
        container.addClass("product_20110824");
        container.attr("id", "avail_product_" + index);

        product.Url += "&availlco=1";

        var hiddenSearchableDiv = $j("<div></div>");
        hiddenSearchableDiv.addClass("hidden searchable");
        hiddenSearchableDiv.html(product.SearchableId);

        var hiddenBuyableDiv = $j("<div></div>");
        hiddenBuyableDiv.addClass("hidden buyable");
        hiddenBuyableDiv.html(product.BuyableId);

        var splashiconDiv = $j("<div></div>");
        splashiconDiv.addClass("splashicon");
        splashiconDiv.html('<img src="' + product.SplashIconUrl + '" alt="" />');

        var splashMouseOver = $j("<div></div>");
        splashMouseOver.addClass("splash_mo");
        splashMouseOver.html(product.SplashMouseOverText);

        var productsplashDiv = $j("<div></div>");
        productsplashDiv.addClass("productsplash");

        var splashplacerDiv = $j("<div></div>");
        splashplacerDiv.addClass("splashplacer");

        var inbasketplacerHiddenDiv = $j("<div></div>");
        inbasketplacerHiddenDiv.addClass("hidden inbasketplacer");
        inbasketplacerHiddenDiv.text(ProductSearchNew.addedToBasketText);

        // Image
        var imageDiv = $j("<div></div>");
        imageDiv.addClass("image");

        var imageAnchorVisible = $j("<a></a>");
        imageAnchorVisible.attr("href", product.Url);
        imageAnchorVisible.addClass("visible")

        var imageElmVisible = $j("<img/>");
        imageElmVisible.attr("src", product.ListImageGalleryUrl);
        if (product.Name != null) {
            imageElmVisible.attr("alt", CommonHelper.HTMLencode(product.Name));
        }

        imageAnchorVisible.append(imageElmVisible);
        imageDiv.append(imageAnchorVisible);

        // Headline
        var headlineDiv = $j("<div></div>");
        headlineDiv.addClass("productname");

        if (product.Name != null) {
            var headlineAnchor = $j("<a></a>");
            headlineAnchor.attr("href", product.Url);
            headlineAnchor.html(product.Name);
            headlineDiv.append(headlineAnchor);
            headlineAnchor.attr("title", CommonHelper.HTMLencode(product.Name));
        }

        var descriptionDiv = $j("<div></div>");
        descriptionDiv.addClass("description");
        descriptionDiv.html(product.Description);

        // Price
        var priceandorderDiv = $j("<div></div>");
        priceandorderDiv.addClass('priceandorder');

        var discountDiv = $j("<div></div>");
        discountDiv.addClass('discount');
        if (product.ListShortDiscountText != null) {
            discountDiv.html(product.ListShortDiscountText);
        }

        var priceDiv = $j("<div></div>");
        priceDiv.addClass("price");

        if (product.Price != null) {
            priceDiv.html(product.Price);
        }

        var currencyDiv = $j("<div></div>");
        currencyDiv.addClass("currency");

        var stockandratingDiv = $j("<div></div>");
        stockandratingDiv.addClass('stockandrating');

        var stockiconDiv = $j("<div></div>");
        stockiconDiv.addClass('stockicon');

        var stocktextDiv = $j("<div></div>");
        stocktextDiv.addClass('stocktext');

        var leftclearDiv = $j("<div></div>");
        leftclearDiv.addClass('leftclear');

        var ratingDiv = $j("<div></div>");
        ratingDiv.addClass('rating');
        ratingDiv.append($j("<div class='star'></div>"));
        ratingDiv.append($j("<div class='star'></div>"));
        ratingDiv.append($j("<div class='star'></div>"));
        ratingDiv.append($j("<div class='star'></div>"));
        ratingDiv.append($j("<div class='star'></div>"));

        var inbasketbuttonDiv = $j("<div></div>");
        inbasketbuttonDiv.click(ProductSearchNew.purchaseClick);

        if (product.CanBuy == true) {
            switch (product.StockStatus) {
                case 0:
                    stockiconDiv.html('<img src="' + RootResourceFolder + '/Images/Main/20110824/productbox_instock.png" alt="" />');
                    stocktextDiv.html(ProductSearchNew.stockGreenText);
                    inbasketbuttonDiv.removeClass('findstorebutton').addClass('inbasketbutton');
                    inbasketbuttonDiv.html('<a href="' + product.Url + '" title="' + ProductSearchNew.purchaseText + '">' + ProductSearchNew.purchaseText + '</a>');
                    break;
                case 1:
                    stockiconDiv.html('<img src="' + RootResourceFolder + '/Images/Main/20110824/productbox_fewinstock.png" alt="" />');
                    stocktextDiv.html(ProductSearchNew.stockYellowText);
                    inbasketbuttonDiv.removeClass('findstorebutton').addClass('inbasketbutton');
                    inbasketbuttonDiv.html('<a href="' + product.Url + '" title="' + ProductSearchNew.purchaseText + '">' + ProductSearchNew.purchaseText + '</a>');
                    break;
                case 2:
                    if (product.IsWebOnly) {
                        stockiconDiv.html('<img src="' + RootResourceFolder + '/Images/Main/20110824/productbox_notinstock.png" alt="" />');
                        stocktextDiv.html(ProductSearchNew.stockRedText);
                        inbasketbuttonDiv.removeClass('findstorebutton').addClass('inbasketbutton').addClass('inactive');
                        inbasketbuttonDiv.html('<a name="" title="' + ProductSearchNew.purchaseText + '">' + ProductSearchNew.purchaseText + '</a>');
                        inbasketbuttonDiv.unbind('click');
                    }
                    else {
                        stockiconDiv.html('<img src="' + RootResourceFolder + '/Images/Main/20110824/productbox_notinstock.png" alt="" />');
                        stocktextDiv.html(ProductSearchNew.stockRedText);
                        inbasketbuttonDiv.removeClass('inbasketbutton').addClass('findstorebutton');
                        inbasketbuttonDiv.html('<a href="' + product.FindShopUrl + '">' + ProductSearchNew.findShopText + '</a>');
                        inbasketbuttonDiv.unbind('click');
                        inbasketbuttonDiv.click(ProductSearchNew.findShopClick);
                    }
                    break;
            }
        } else {
            inbasketbuttonDiv.removeClass('inbasketbutton').addClass('findstorebutton');
            if (ProductSearchNew.useTwoLineButtons == true)
                inbasketbuttonDiv.addClass('twolines');
            inbasketbuttonDiv.html('<a href="' + product.FindShopUrl + '" title="' + ProductSearchNew.findShopText + '">' + ProductSearchNew.findShopText + '</a>');
            inbasketbuttonDiv.unbind('click');
            inbasketbuttonDiv.click(ProductSearchNew.findShopClick);
            if (product.IsWebOnly) {
                inbasketbuttonDiv.addClass('hidden');
            }
        }

        // Rating.
        var rating = product.Rating;
        rating = rating > 5 ? 5 : rating;
        var stars = ratingDiv.find('.star');
        (function (rating, stars) {
            for (var i = 0; i < stars.length; i++) {
                if ((i + 1) <= rating) {
                    $j(stars[i]).html('<img alt="" src="' + ProductSearchNew.starOnIcon + '" />');
                } else {
                    $j(stars[i]).html('<img alt="" src="' + ProductSearchNew.starOffIcon + '" />');
                }
            }
        })(rating, stars);

        var usersDiv = $j("<div></div>");
        usersDiv.addClass("users");
        usersDiv.html('(' + product.NumberOfRatings + ')');
        ratingDiv.append(usersDiv);

        //var inbasketAnchor = $j("<a></a>");
        //inbasketAnchor.attr("href", product.Url);
        //inbasketAnchor.html('Kurv');
        //inbasketAnchor.attr("title", CommonHelper.HTMLencode('Kurv'));
        //inbasketbuttonDiv.append(inbasketAnchor);

        stockandratingDiv.append(stockiconDiv);
        stockandratingDiv.append(stocktextDiv);
        stockandratingDiv.append(leftclearDiv);
        stockandratingDiv.append(ratingDiv);

        priceandorderDiv.append(discountDiv);
        priceandorderDiv.append(priceDiv);
        priceandorderDiv.append(stockandratingDiv);
        priceandorderDiv.append(inbasketbuttonDiv);

        if (product.SplashIconUrl != '') {
            productsplashDiv.append(splashiconDiv);
            productsplashDiv.append(splashMouseOver);
            splashplacerDiv.append(productsplashDiv);
        }

        container.append(hiddenSearchableDiv);
        container.append(hiddenBuyableDiv);
        container.append(splashplacerDiv);
        container.append(inbasketplacerHiddenDiv);
        container.append(imageDiv);
        container.append(headlineDiv);
        container.append(descriptionDiv);
        container.append(priceandorderDiv);

        return container;
    },

    saveLandingPageData: function (searchPhrase, productId) {
        if (!searchPhrase || !productId) {
            return;
        }
        var emark = new Emark();
        emark.saveLandingPageData(searchPhrase, productId);
        emark.commit();
    },

    getSessionId: function () {
        return ai_getSessionID();
    }
}

var SiteCatalyst = {
    suite: null,
    pageName: null,
    basket: null,
    isUpsalePage: false,
    isFindProductInShop: false,
    purchaseConfirmButton: null,
    brWishCreate: null,
    brWishSend: null,
	brWishPrint: null,
	brProductPreviewAddBasket: null,
	brProductPreviewAddWishlist: null,
    entranceSection: "",
    enabled: null,
    visitorNamespace: 'toptoy',
    trackingServer: 'toptoy.122.2o7.net',

    tabClick: function (elm) {
        if (SiteCatalyst.enabled == false) return;
        var tabName = $j(elm).children(".content").children(".text").children("a").html();
        var tab = $j(elm);
        var container = tab.parent();
        var index = $j(container).children(".scat").index(tab);

        var s = s_gi(SiteCatalyst.suite);
        s.linkTrackVars = 'prop6,eVar6';
        s.prop6 = SiteCatalyst.pageName + "|" + tabName + "|" + ++index;
        s.eVar6 = "s.prop6";
        s.visitorNamespace = SiteCatalyst.visitorNamespace;
        s.trackingServer = SiteCatalyst.trackingServer;
        s.tl(elm, "o", "Tabs");
    },

    loggedIn: function () {
        if (SiteCatalyst.enabled == false) return;
        var s = s_gi(SiteCatalyst.suite);
        s.linkTrackVars = "prop16,eVar15";
        s.events = "event18";
        s.prop16 = "login";
        s.eVar15 = "login";
        s.visitorNamespace = SiteCatalyst.visitorNamespace;
        s.trackingServer = SiteCatalyst.trackingServer;
        s.tl(null, "o", "event18");
    },

    init: function () {
        SiteCatalyst.tagCampaigns();

        if (SiteCatalyst.purchaseConfirmButton != null) {
            SiteCatalyst.purchaseConfirmButton.click(function () {
                var section = SiteCatalyst.entranceSection;

                var s = s_gi(SiteCatalyst.suite);
                s.linkTrackVars = "products";
                s.events = "event10";
                s.products = "";

                for (var i = 0; i < SiteCatalyst.basket.length; i++) {
                    var item = SiteCatalyst.basket[i];
                    s.products += item.category + ";" + item.name + ";;;;eVar2=" + section + "|eVar4=";
                }

                s.visitorNamespace = SiteCatalyst.visitorNamespace;
                s.trackingServer = SiteCatalyst.trackingServer;

                s.tl(null, "o", "event10");

                var link = SiteCatalyst.purchaseConfirmButton.attr("href");

                setTimeout(link, 1000);

                return false;

            });
        }

        if (SiteCatalyst.brWishCreate != null) {

            $j.each(SiteCatalyst.brWishCreate, function (index, value) {
                value.click(function () {
                    SiteCatalyst.wishlistCreate();
                    var link = $j(this).attr("href");
                    setTimeout(link, 1000);

                    return false;
                });
            });
        }

        if (SiteCatalyst.brWishSend != null) {

            SiteCatalyst.brWishSend.click(function () {
                SiteCatalyst.wishlistSend();

                var link = SiteCatalyst.brWishSend.attr("href");
                setTimeout(link, 1000);
                return false;
            });
        }
		
		if (SiteCatalyst.brWishPrint != null) {

            SiteCatalyst.brWishPrint.click(function () {
                SiteCatalyst.wishlistPrint();

                var link = SiteCatalyst.brWishPrint.attr("href");
				
                setTimeout("window.open('"+link+"','_blank')", 1000);
                return false;
            });
        }
		
        if (SiteCatalyst.isFindProductInShop) {
            $j(document).ready(function () {
                setTimeout("SiteCatalyst.findProductInShop()", 1000);
            });
        }
    },

    tagCampaigns: function () {
        if (SiteCatalyst.enabled == false) return;
        // Add icid querystring param to categories in the small categories box.
        var categoriesBox = $j("#small_categories");

        if (categoriesBox) {
            categories = $j("#small_categories .small .category");

            for (var i = 0; i < categories.length; i++) {
                var name = $j(categories[i]).children(".name").children("a").html();
                var index = $j("#small_categories .small .category").index($j(categories[i]));
                var anchors = $j(categories[i]).find("a");
                var href = anchors[0].href;
                anchors.attr("href", href + "?icid=" + escape(SiteCatalyst.pageName + "_kategorier_" + name + "_" + ++index));
            }
        }
    },

    productRemovedFromBasket: function (lineitemId) {
        if (SiteCatalyst.enabled == false) return;
        if (SiteCatalyst.basket == null) return;

        for (var i = 0; i < SiteCatalyst.basket.length; i++) {
            var item = SiteCatalyst.basket[i];
            if (item.lineitemId == lineitemId) {
                var s = s_gi(SiteCatalyst.suite);
                s.linkTrackVars = "products";
                s.events = "scRemove";
                s.products = item.category + ";" + item.name;
                s.visitorNamespace = SiteCatalyst.visitorNamespace;
                s.trackingServer = SiteCatalyst.trackingServer;
                s.tl(null, "o", "scRemove");
                break;
            }
        }
    },

    productImageView: function (index) {
        if (SiteCatalyst.enabled == false) return;
        var s = s_gi(SiteCatalyst.suite);
        s.linkTrackVars = "eVar12";
        s.eVar12 = SiteCatalyst.pageName + " billede " + index;
        s.visitorNamespace = SiteCatalyst.visitorNamespace;
        s.trackingServer = SiteCatalyst.trackingServer;
        s.tl(null, "o", "Produkt Billede");
    },

    productMediaReferenceView: function (elm, index) {
        if (SiteCatalyst.enabled == false) return;
        var s = s_gi(SiteCatalyst.suite);
        s.linkTrackVars = "eVar13";
        s.eVar13 = SiteCatalyst.pageName + " video " + index;
        s.visitorNamespace = SiteCatalyst.visitorNamespace;
        s.trackingServer = SiteCatalyst.trackingServer;
        s.tl(elm, "o", "Produkt Video");
    },

    wishlistPrint: function () {
        if (SiteCatalyst.enabled == false) return;
        var s = s_gi(SiteCatalyst.suite);
        s.events = "event24";
        s.visitorNamespace = SiteCatalyst.visitorNamespace;
        s.trackingServer = SiteCatalyst.trackingServer;
        s.tl(null, "o", "print oenskeseddel");
    },

    wishlistSend: function () {
        if (SiteCatalyst.enabled == false) return;
        var s = s_gi(SiteCatalyst.suite);
        s.events = "event3";
        s.visitorNamespace = SiteCatalyst.visitorNamespace;
        s.trackingServer = SiteCatalyst.trackingServer;
        s.tl(null, "o", "send oenskeseddel");
    },

    wishlistCreate: function () {
        if (SiteCatalyst.enabled == false) return;

        var s = s_gi(SiteCatalyst.suite);
        s.events = "event4";
        s.visitorNamespace = SiteCatalyst.visitorNamespace;
        s.trackingServer = SiteCatalyst.trackingServer;
        s.tl(null, "o", "opret oenske");
    },

    findProductInShop: function () {
        if (SiteCatalyst.enabled == false) return;

        var s = s_gi(SiteCatalyst.suite);
        s.linkTrackVars = 'events';
        s.linkTrackEvents = 'event25';
        s.events = 'event25';
        s.visitorNamespace = SiteCatalyst.visitorNamespace;
        s.trackingServer = SiteCatalyst.trackingServer;
        s.tl(this, 'o', 'Find varen I butik');
    },
	
	productAddedFromList: function(category, title) {
		if (SiteCatalyst.enabled == false) return;
		var s = s_gi(SiteCatalyst.suite);
		s.linkTrackVars = "products";
		s.events = "scAdd,event27";
		s.products = category + ';' + title;
		s.visitorNamespace = SiteCatalyst.visitorNamespace;
		s.trackingServer = SiteCatalyst.trackingServer;
		s.tl(null, "o", "scAdd");
	},
	
	sortChange: function(selectedValue){
		if (SiteCatalyst.enabled == false) return;
		var s = s_gi(SiteCatalyst.suite);
		 s.linkTrackVars = "eVar11";
        s.eVar11 = selectedValue;
		s.visitorNamespace = SiteCatalyst.visitorNamespace;
		s.trackingServer = SiteCatalyst.trackingServer;
		s.tl(null, "o", "Sorteringen");
	},
	
	paging: function(currentPagingText){
		if (SiteCatalyst.enabled == false) return;
		var s = s_gi(SiteCatalyst.suite);
		 s.linkTrackVars = "eVar16";
        s.eVar16 = currentPagingText;
		s.visitorNamespace = SiteCatalyst.visitorNamespace;
		s.trackingServer = SiteCatalyst.trackingServer;
		s.tl(null, "o", "paging");
	},
	
	productAddWishPreview: function(category, title){
		if (SiteCatalyst.enabled == false) return;
		var s = s_gi(SiteCatalyst.suite);
		 s.linkTrackVars = "eVar22";
        s.eVar22 = category + ';' + title;
		s.visitorNamespace = SiteCatalyst.visitorNamespace;
		s.trackingServer = SiteCatalyst.trackingServer;
		s.tl(null, "o", "productreview opret oenske scAdd");
	}
}

var FAQ = {
    closeInactive: function () {
        $j('#faq_container').children(".faq_item_open").removeClass("faq_item_open").addClass("faq_item_closed");

        $j("a[name=" + location.hash.substring(1) + "]").parent().removeClass("faq_item_closed").addClass("faq_item_open");
    }
}

var SponsoredProduct = {
    amountBox: null,
    variantDropDown: null,
    productService: null,
    productId: null,

    init: function () {

        this.productService = new ProductServiceFE();

        this.productService.ajax.success = function (arr) {
            $j("#sponsor-price").html(arr[0]);
            $j("#sponsor-variant-image img").attr("src", arr[1]);
        }

        // Amount changed.
        this.amountBox.change(function () {
            SponsoredProduct.update();
        });

        // Variant changed.
        this.variantDropDown.change(function () {
            SponsoredProduct.update();
        });
    },

    update: function () {

        var productId = SponsoredProduct.productId;

        var variantId = SponsoredProduct.variantDropDown.val();
        if (variantId == undefined) variantId = "";

        var amount = parseInt(SponsoredProduct.amountBox.val());

        if (isNaN(amount)) amount = 1;
        else if (amount < 1) amount = 1;

        SponsoredProduct.amountBox.val(amount.toString());

        SponsoredProduct.productService.GetUpdatedPriceAndPictureForSponsorProduct(amount, productId, variantId);
    }
}

/*****************************
* layerDark, fadeout options *
*****************************/

var layerDark = {
    layer: null,
    boxId: null,
    scrollheight: null,

    init: function (id) {
        if (id)
            this.boxId = id;
        if (this.layer == null) {
            var div = $j('<div id="layerdark"></div>');
            div.click(function () { layerDark.hide(); });
            var docheight = $j(document).height();
            div.height(docheight);
            $j(document.body).append(div);
            this.layer = $j("#layerdark");
        }
        else if (this.layer.height != $j(document).height()) {
            var docheight = $j(document).height();
            this.layer.height(docheight);
        }
    },

    show: function (id) {
        var itemToShow = $j(id)
        if (itemToShow) {
            this.init(id);
            itemToShow.css("display", "block");
            this.layer.css("display", "block");
        }
    },

    hide: function () {
        this.init();
        this.layer.css("display", "none");

        if (this.boxId) {
            var itemToHide = $j(this.boxId)
            if (itemToHide)
                itemToHide.css("display", "none");
        }
    }
}

var WishListBox = {

    defaultWriteAWishText: null,

    writeAWishInputId: null,

    productIds: null,

    init: function () {

        // Show / hide default "Write a wish" text.
        $j("#" + WishListBox.writeAWishInputId).focus(function () {

            var val = $j(this).val();

            if (val == WishListBox.defaultWriteAWishText) {

                $j(this).val("");
            }
        });

        $j("#" + WishListBox.writeAWishInputId).blur(function () {

            var val = $j(this).val();

            if (val.replace(/\s/g, "") == "") {

                $j(this).val(WishListBox.defaultWriteAWishText);
            }
        });

        $j("#wishlist_send_close").click(function () {
            $j("#layerdark").trigger("click");
        });
    }
}

function TextboxDefaultTextHandler() {
    var self = this;
    this.defaultText = "",
	this.textboxId = "";

    this.init = function (defaultText, textboxId) {
        self.defaultText = defaultText;
        self.textboxId = textboxId;
    }

    this.onFocus = function () {
        var curText = $j("#" + self.textboxId).val();

        if (curText == self.defaultText) {
            $j("#" + self.textboxId).val("");
        }
    }

    this.onBlur = function () {
        var curText = $j("#" + self.textboxId).val();
        if (curText == "") {
            $j("#" + self.textboxId).val(self.defaultText);
        }
    }
}

var PriceSlider = {
    priceArray: null,
    pixelArray: [0, 35, 70, 105, 140, 175, 209],

    init: function (priceFrom, priceTo) {
        $j(document).ready(function () {
            var handles = $j("#slider-range").find(".ui-slider-handle");
            handles[0].innerHTML = priceFrom;
            handles[1].innerHTML = (priceTo > PriceSlider.priceArray[6]) ? PriceSlider.priceArray[6] + "+" : priceTo;
        });
    },

    set: function (fromPrice, toPrice) {
        var handles = $j("#slider-range").find(".ui-slider-handle");

        handles[0].innerHTML = fromPrice;
        handles[1].innerHTML = toPrice;

        var fromPixel = PriceSlider.convertValueToPixel(fromPrice);
        var toPixel = PriceSlider.convertValueToPixel(toPrice);
        $j("#slider-price").slider({ values: [fromPixel, toPixel] });
    },

    convertPixelToValue: function (pixel, handle) {
        for (var i = 1; i < this.pixelArray.length; i++) {
            if (pixel <= this.pixelArray[i])
                return Math.round(this.priceArray[i - 1] + (this.priceArray[i] - this.priceArray[i - 1]) * (pixel - this.pixelArray[i - 1]) / (this.pixelArray[i] - this.pixelArray[i - 1]));
        }

        if (handle && handle.id == "from") {
            var i = this.pixelArray.length - 1;
            return Math.round(this.priceArray[i - 1] + (this.priceArray[i] - this.priceArray[i - 1]) * (pixel - this.pixelArray[i - 1]) / (this.pixelArray[i] - this.pixelArray[i - 1]));
        }

        //no max
        return 1000000;
    },

    convertValueToPixel: function (value) {
        for (var i = 1; i < this.priceArray.length; i++) {
            if (value <= this.priceArray[i])
                return Math.round(this.pixelArray[i - 1] + (this.pixelArray[i] - this.pixelArray[i - 1]) * (value - this.priceArray[i - 1]) / (this.priceArray[i] - this.priceArray[i - 1]));
        }

        if (value == 1000000)
            return 210;

        return 206;
    }
}

var BasketWidget2 =
{
    self: this,
    totalItemsTopId: null,
    totalPriceTopId: null,
    totalItemsTopId2: null,
    totalPriceTopId2: null,
    freightId: null,
    totalPriceId: null,
    discountId: null,
    basketItemsId: null,
    buyButtonDivId: "",
    buyButton2DivId: "",
    emptyTextDivId: "",
    oneDivId: "",
    notOneDivId: "",
    titleLink: "",
	basketUrl: "",
	
    initialized: false,
    shoppingService: null,

    init: function () {
        this.shoppingService = new ShoppingServiceFE();
        this.initialized = true;
        $j(document).bind('UpdateBasket', BasketWidget2.updateBasket);

        $j("#basket_widget2 .basketicon a").removeAttr("href");
        $j("#basket_widget2 > .text").find("a").removeAttr("href");
        $j("#basket_widget2 .dropdown_button a").removeAttr("href").disableTextSelect();

        var toggleBasket = function () {

            if ($j("#basket_widget2").hasClass("rightdropdown")) {
                $j("#basket_widget2").removeClass("rightdropdown").addClass("rightdropdown_active");
                $j("#basket_widget2 .dropdown_button img").css('visibility', 'hidden');
            } else {
                $j("#basket_widget2").removeClass("rightdropdown_active").addClass("rightdropdown");
                $j("#basket_widget2 .dropdown_button img").css('visibility', 'visible');
            }

            $j("#basket_widget2 .dropdown_button").css('visibility', 'visible');
        }

        $j("#basket_widget2").click(function () { toggleBasket(); });

        BasketWidget2.bindGoToBasketClick();
        BasketWidget2.bindGoToProductClick();
        BasketWidget2.bindGoToProductRemoveClick();
    },

    bindGoToBasketClick: function () {
		if($j('#basket_widget2 .item').size() > 0)
		{
			$j('#basket_widget2 .button').click(function () {
				var url = $j(this).find('a').attr('href');
				window.location = BasketWidget2.basketUrl;
				return false;
			});
		}
    },

    bindGoToProductClick: function () {
        $j('#basket_widget2 .item').click(function () {
            var url = $j(this).find('.text a').attr('href');
            window.location = url;
            return false;
        });
    },

    bindGoToProductRemoveClick: function () {
        $j('#basket_widget2 .item .remove').click(function () {
            return false;
        });
    },

    removeItem: function (lineItemId) {
        SiteCatalyst.productRemovedFromBasket(lineItemId);
        this.shoppingService.ajax.success = this.removeItemSuccess;

        if (!this.initialized)
            this.init();

        this.shoppingService.RemoveLineItem2(lineItemId);
        return false;
    },

    updateBasket: function (event, source) {
        if (source != 'BasketWidget2') // don't act on events triggered by myself.
        {
            BasketWidget2.shoppingService.ajax.success = BasketWidget2.ReceiveBasketSuccess;
            BasketWidget2.shoppingService.GetWidgetBasket2();
        }
    },

    ReceiveBasketSuccess: function (basket) {
        if (basket != null) {


            if (basket.LineItemCount == 0) {
                $j(BasketWidget2.buyButtonDivId).hide();
                $j(BasketWidget2.buyButton2DivId).hide();
                $j(BasketWidget2.emptyTextDivId).show();
                //$j("#basketwidget_title_anchor").attr("href", "javascript:void(0)");
            }
            else {
                $j(BasketWidget2.buyButtonDivId).show();
                $j(BasketWidget2.buyButton2DivId).show();
                $j(BasketWidget2.emptyTextDivId).hide();
                //$j("#basketwidget_title_anchor").attr("href", BasketWidget2.titleLink);
            }

            if (basket.LineItemCount == 1) {
                $j(BasketWidget2.oneDivId).show();
                $j(BasketWidget2.notOneDivId).hide();
            }
            else {
                $j(BasketWidget2.oneDivId).hide();
                $j(BasketWidget2.notOneDivId).show();
            }

            $j(BasketWidget2.totalItemsTopId).html(basket.LineItemCount);
            $j(BasketWidget2.totalPriceTopId).html(basket.TotalCurrency);
            $j(BasketWidget2.totalItemsTopId2).html(basket.LineItemCount);
            $j(BasketWidget2.totalPriceTopId2).html(basket.TotalCurrency);
            $j(BasketWidget2.freightId).html(basket.ShippingTotal);
            $j(BasketWidget2.totalPriceId).html(basket.Total);
            $j(BasketWidget2.discountId).html(basket.DiscountTotal);
            $j(BasketWidget2.basketItemsId).html(basket.LineItemHtml.replace(/\[stk\]/gmi, $j('#pcsText').text()));

            BasketWidget2.bindGoToBasketClick();
            BasketWidget2.bindGoToProductClick();
            BasketWidget2.bindGoToProductRemoveClick();
        }
    },

    removeItemSuccess: function (basket) {
        if (basket != null) {
            $j(document).trigger('UpdateBasket', ['BasketWidget2']);
            $j(BasketWidget2.totalItemsTopId).html(basket.LineItemCount);
            $j(BasketWidget2.totalPriceTopId).html(basket.TotalCurrency);
            $j(BasketWidget2.totalItemsTopId2).html(basket.LineItemCount);
            $j(BasketWidget2.totalPriceTopId2).html(basket.TotalCurrency);
            $j(BasketWidget2.freightId).html(basket.ShippingTotal);
            $j(BasketWidget2.totalPriceId).html(basket.Total);
            $j(BasketWidget2.discountId).html(basket.DiscountTotal);
            $j(BasketWidget2.basketItemsId).html(basket.LineItemHtml.replace(/\[stk\]/gmi, $j('#pcsText').text()));

            if (basket.LineItemCount == 0) {
                $j(BasketWidget2.buyButtonDivId).hide();
                $j(BasketWidget2.buyButton2DivId).hide();
                $j(BasketWidget2.emptyTextDivId).show();
                //$j("#basketwidget_title_anchor").attr("href", "javascript:void(0)");
            }
            else {
                $j(BasketWidget2.buyButtonDivId).show();
                $j(BasketWidget2.buyButton2DivId).show();
                $j(BasketWidget2.emptyTextDivId).hide();
                //$j("#basketwidget_title_anchor").attr("href", BasketWidget2.titleLink);
            }

            if (basket.LineItemCount == 1) {
                $j(BasketWidget2.oneDivId).show();
                $j(BasketWidget2.notOneDivId).hide();
            }
            else {
                $j(BasketWidget2.oneDivId).hide();
                $j(BasketWidget2.notOneDivId).show();
            }

            BasketWidget2.bindGoToBasketClick();
            BasketWidget2.bindGoToProductClick();
            BasketWidget2.bindGoToProductRemoveClick();
        }

        Events.fire(Events.listeners.updateBasket, null);
    }
}

var BreadcrumbWishlistWidget = {
    quantityTextSingular: null,
    quantityTextPlural: null,
    wishlistService: null,
    initialRetrievalComplete: false,
    init: function () {

        this.wishlistService = new WishlistServiceFE();

        // Initialize dropdown functionality.
        $j("#wishlist-widget .topelem").find("a").removeAttr("href").disableTextSelect();

        var toggle = function () {
            if ($j("#wishlist-widget").hasClass("rightdropdown")) {
                $j("#wishlist-widget").removeClass("rightdropdown").addClass("rightdropdown_active");
                $j("#wishlist-widget .dropdown_button img").css('visibility', 'hidden');

                if (BreadcrumbWishlistWidget.initialRetrievalComplete == true) return;
                BreadcrumbWishlistWidget.update();
                BreadcrumbWishlistWidget.initialRetrievalComplete = true;

            } else {
                $j("#wishlist-widget").removeClass("rightdropdown_active").addClass("rightdropdown");
                $j("#wishlist-widget .dropdown_button img").css('visibility', 'visible');
            }

            $j("#wishlist-widget .dropdown_button").css('visibility', 'visible');
        }

        $j("#wishlist-widget").click(function () { toggle(); });

        // Wishlist button.
        $j("#wishlist-widget .dropdown_container").find('.button').click(function () {
            var url = $j(this).find('a').attr('href');
            window.location = url;
            return false;
        });
    },

    wishlistReceived: function (wishlist) {
        $j("#wishlist-widget #wishlist-items").children().remove();

        for (var i = 0; i < wishlist.length; i++) {

            var wishlistItem = wishlist[i];

            var item = $j($j("#wishlist-item-template").html());

            (function (item) {
                item.find('.remove').click(function () {
                    BreadcrumbWishlistWidget.wishlistService.ajax.success = function () {
                        item.remove();
                        BreadcrumbWishlistWidget.setQuantityText();
                    };
                    var index = $j('#wishlist-widget #wishlist-items .item').index(item);
                    BreadcrumbWishlistWidget.wishlistService.RemoveWish(index);
                    return false;
                });
            })(item);

            if (wishlistItem.ProductImage != '')
                item.find('.image').find('a').html('<img src="' + wishlistItem.ProductImage + '" alt="" />');
            item.find('.text').find('a').html(wishlistItem.ProductName);
            item.find('.image').find('a').attr('href', wishlistItem.ProductUrl);
            item.find('.text').find('a').attr('href', wishlistItem.ProductUrl);

            (function (url) {
                item.click(function () {
                    window.location = url;
                    return false;
                });
            })(wishlistItem.ProductUrl);

            $j("#wishlist-widget #wishlist-items").append(item);
        }

        BreadcrumbWishlistWidget.setQuantityText();
    },

    update: function () {
        BreadcrumbWishlistWidget.wishlistService.ajax.success = BreadcrumbWishlistWidget.wishlistReceived;
        BreadcrumbWishlistWidget.wishlistService.GetCurrentWishlist();
    },

    setQuantityText: function () {
        var count = $j('#wishlist-widget #wishlist-items .item').length;
        var quantityText = count == 1 ? BreadcrumbWishlistWidget.quantityTextSingular : BreadcrumbWishlistWidget.quantityTextPlural;
        $j('#wishlist-widget #wishlist-quantity').html(count + ' ' + quantityText);
    }
}

var SearchFacetBar =
{
    //General

    init: function () {
        this.initAge();
        this.initPrice();
        this.initGender();
        //this.initCategory();
        GlobalListeners.addListenerToEvent('SearchResultReceived', SearchFacetBar.searchResultReceived);
    },

    reset: function () {
        this.resetAge();
        this.resetPrice();
        this.resetGender();
        //this.resetCategory();
    },

    //Age
    ageFilter: null,
    ageFilterReset: null,

    initAge: function () {
        this.ageFilter = $j('#ageFilter');
        this.ageFilterReset = $j("#ageFilterReset");
        if (SearchQuery.ageRange > 0) {
            var button = $j('#agebutton' + SearchQuery.ageRange);
            button.removeClass("button").addClass("button_active");
            var textvalue = button.text();
            this.ageFilterReset.children(".removetext").text(textvalue);
            this.ageFilterReset.show();
        }
        else {
            this.ageFilterReset.hide();
        }
    },

    resetAge: function () {
        SearchQuery.ageRange = 0;
		
		if(SearchQuery.enableProductPersistance == false) {
			SearchQuery.pageNumber = 0;
			SearchQuery.pageSize = 20;
		}
		
        SearchQuery.search();
        this.ageFilter.find(".button_active").removeClass("button_active").addClass("button");
        this.ageFilterReset.hide();
    },

    setAge: function (button, value) {
        button = $j(button);
        var active = button.hasClass("button_active");

        if (active) {
            this.resetAge();
        }
        else {
            this.ageFilter.find(".button_active").removeClass("button_active").addClass("button");
            SearchQuery.ageRange = value;
			if(SearchQuery.enableProductPersistance == false) {
				SearchQuery.pageNumber = 0;
				SearchQuery.pageSize = 20;
			}
            SearchQuery.search();
            button.addClass("button_active");
            var textvalue = button.text();
            this.ageFilterReset.children(".removetext").text(textvalue);
            this.ageFilterReset.show();
        }
    },

    //Price
    priceFilterReset: null,
    priceSlider: null,
    priceArray: null,
    pixelArray: [0, 35, 70, 105, 140, 175, 209],

    initPrice: function () {
        this.priceSlider = $j("#slider-range");
        this.priceFilterReset = $j("#priceFilterReset");
        this.priceSlider.slider({ values: [this.convertValueToPixel(SearchQuery.priceFrom), this.convertValueToPixel(SearchQuery.priceTo)] });
        if (this.priceSlider.slider("values", 1) > 0) {
            var handles = this.priceSlider.find('.ui-slider-handle');
            handles[0].innerHTML = SearchQuery.priceFrom;
            handles[1].innerHTML = SearchQuery.priceTo;
            this.priceFilterReset.find(".removetext_range").text(SearchQuery.priceFrom + "-" + SearchQuery.priceTo);
            this.priceFilterReset.show();
        }
        else {
            this.priceFilterReset.hide();
        }
    },

    resetPrice: function () {
        SearchQuery.priceFrom = null;
        SearchQuery.priceTo = null;
		if(SearchQuery.enableProductPersistance == false) {
			SearchQuery.pageNumber = 0;
			SearchQuery.pageSize = 20;
		}
        SearchQuery.search();
        var slider = $j("#slider-range");
        this.priceSlider.slider({ values: [0, 0] });
        var handles = this.priceSlider.find(".ui-slider-handle");
        handles.text('0');
        $j(handles[0]).css('z-index', 2);
        $j(handles[1]).css('z-index', 3);
        this.priceFilterReset.hide();
    },

    setPrice: function (ui) {
        var fromPrice = this.convertPixelToValue(ui.values[0], ui.handles[0]);
        var toPrice = this.convertPixelToValue(ui.values[1], ui.handles[1]);
        SearchQuery.priceFrom = fromPrice;
        SearchQuery.priceTo = toPrice;
		if(SearchQuery.enableProductPersistance == false) {
			SearchQuery.pageNumber = 0;
			SearchQuery.pageSize = 20;
		}
        SearchQuery.search();
        if (toPrice > 0) {
            fromPrice = ui.values[0] == 210 ? this.priceArray[6] + "+" : fromPrice;
            toPrice = ui.values[1] == 210 ? this.priceArray[6] + "+" : toPrice;
            this.priceFilterReset.find(".removetext_range").text(fromPrice + "-" + toPrice);
            this.priceFilterReset.show();
        }
        else {
            this.priceFilterReset.hide();
        }
    },

    //Gender
    genderFilter: null,
    genderFilterReset: null,

    initGender: function () {
        this.genderFilter = $j('#genderFilter');
        this.genderFilterReset = $j("#genderFilterReset");
        if (SearchQuery.gender != null && SearchQuery.gender > 0) {
            var cb = $j('#cbGender' + SearchQuery.gender);
            cb.attr('checked', true);
            this.genderFilterReset.children(".removetext").text(cb[0].value);
            this.genderFilterReset.show();
        }
        else {
            this.genderFilterReset.hide();
        }
    },

    resetGender: function () {
        SearchQuery.gender = 0;
		if(SearchQuery.enableProductPersistance == false) {
			SearchQuery.pageNumber = 0;
			SearchQuery.pageSize = 20;
		}
        SearchQuery.search();
        this.genderFilter.find('input').prop('checked', false);
        this.genderFilterReset.hide();
    },

    setGender: function (radiobutton, gender) {
        SearchQuery.gender = gender;
		if(SearchQuery.enableProductPersistance == false) {
			SearchQuery.pageNumber = 0;
			SearchQuery.pageSize = 20;
		}
        SearchQuery.search();
        var textvalue = radiobutton.value;
        this.genderFilterReset.children(".removetext").text(textvalue);
        this.genderFilterReset.show();
    },

    //Categories (both category and brand)
    initCategory: function (outerContainer, list) {
        var scrollContentContainer = outerContainer.find('.scrollarea');
        var resetContainer;
        if (outerContainer.attr('id') == 'categoryContainer1')
            resetContainer = $j('#category1Reset');
        else
            resetContainer = $j('#category2Reset');
        this.renderCategoryItems(scrollContentContainer, list);
        var selected = scrollContentContainer.find(".item_active");
        if (selected.length > 0) {
            resetContainer.children(".removetext").text(selected[0].innerHTML);
            resetContainer.show();
        }
        else {
            resetContainer.hide();
        }
    },

    resetCategory: function (resetContainer) {
        var outerContainer;
        if (resetContainer.attr('id') == 'category1Reset') {
            SearchQuery.category1 = null;
            outerContainer = $j('#categoryContainer1');
        }
        else {
            SearchQuery.category2 = null;
            outerContainer = $j('#categoryContainer2');
        }
		if(SearchQuery.enableProductPersistance == false) {
			SearchQuery.pageNumber = 0;
			SearchQuery.pageSize = 20;
		}
        SearchQuery.search();
        var scrollContentContainer = outerContainer.find('.scrollarea');
        scrollContentContainer.find(".item_active").removeClass("item_active").addClass("item");
        resetContainer.hide();
    },

    setCategory: function (itemContainer, value, type) {
        var outerContainer = itemContainer.closest('.outercontainer');
        var resetContainer;
        if (outerContainer.attr('id') == 'categoryContainer1') {
            SearchQuery.category1 = value;
            resetContainer = $j('#category1Reset');
        }
        else {
            SearchQuery.category2 = value;
            resetContainer = $j('#category2Reset');
        }
		if(SearchQuery.enableProductPersistance == false) {
			SearchQuery.pageNumber = 0;
			SearchQuery.pageSize = 20;
		}
        SearchQuery.search();
        var scrollContentContainer = outerContainer.find('.scrollarea');
        scrollContentContainer.find(".item_active").removeClass("item_active").addClass("item");
        itemContainer.removeClass("item").addClass("item_active");
        resetContainer.children(".removetext").text(itemContainer.text());
        resetContainer.show();
    },

    categoryScrollClick: function (buttonContainer, value) {
        var outerContainer = buttonContainer.closest('.outercontainer');
        var scroller = outerContainer.find('.slidearea');
        var scrollContent = outerContainer.find('.scrollarea');
        var contentHeight = scrollContent.height() + 12;

        //scroll 100 pixels at a time
        var newValue = scroller.slider("value") + Math.round(100 / (contentHeight / 100) * value);

        if (newValue > 100)
            newValue = 100;
        else if (newValue < 0)
            newValue = 0;

        scroller.slider("value", newValue);
        this.categoryScroll(scroller, newValue);
    },

    categoryScroll: function (scrollContainer, value) {
        var outerContainer = scrollContainer.closest('.outercontainer');
        var scrollPane = outerContainer.find('.select');
        var scrollContent = outerContainer.find('.scrollarea');

        var contentHeight = scrollContent.height() + 12;
        if (contentHeight > scrollPane.height()) {
            scrollContent.css("margin-top", Math.round((1 - value / 100) * (scrollPane.height() - contentHeight)) + "px");
        } else {
            scrollContent.css("margin-top", 0);
        }
    },

    renderCategoryItems: function (scrollContentContainer, list, type) {
        //reset scroller in order to get to top
        var outerContainer = scrollContentContainer.closest('.outercontainer');
        var scroller = outerContainer.find('.slidearea');
        scroller.slider("value", 100);
        scrollContentContainer.css("margin-top", 0);

        //Fill in the categories
        scrollContentContainer.empty();
        for (var i = 0; i < list.length; i++) {
            var facetItem = list[i];

            var div = $j("<div></div>");
            div.html(facetItem.Text);


            if (facetItem.Selected) {
                div.addClass("item_active");
            }
            else {
                if (facetItem.Active) {
                    div.addClass("item");

                    (function (value) {
                        div.click(function () {
                            SearchFacetBar.setCategory($j(this), value);
                        });
                    })(facetItem.Value);
                }
                else {
                    div.addClass("item_gray");
                }
            }


            scrollContentContainer.append(div);
        }
    },

    //Helpers
    convertPixelToValue: function (pixel, handle) {
        for (var i = 1; i < this.pixelArray.length; i++) {
            if (pixel <= this.pixelArray[i])
                return Math.round(this.priceArray[i - 1] + (this.priceArray[i] - this.priceArray[i - 1]) * (pixel - this.pixelArray[i - 1]) / (this.pixelArray[i] - this.pixelArray[i - 1]));
        }

        if (handle && handle.id == "from") {
            var i = this.pixelArray.length - 1;
            return Math.round(this.priceArray[i - 1] + (this.priceArray[i] - this.priceArray[i - 1]) * (pixel - this.pixelArray[i - 1]) / (this.pixelArray[i] - this.pixelArray[i - 1]));
        }

        //no max
        return 1000000;
    },

    convertValueToPixel: function (value) {
        for (var i = 1; i < this.priceArray.length; i++) {
            if (value <= this.priceArray[i])
                return Math.round(this.pixelArray[i - 1] + (this.pixelArray[i] - this.pixelArray[i - 1]) * (value - this.priceArray[i - 1]) / (this.priceArray[i] - this.priceArray[i - 1]));
        }

        if (value == 1000000)
            return 210;

        return 206;
    },

    searchResultReceived: function (data) {
        SearchFacetBar.initCategory($j('#categoryContainer1'), data.Categories1);
        SearchFacetBar.initCategory($j('#categoryContainer2'), data.Categories2);
    }

}

var ProductSearchNew = {
    id: null,
    listIcon: '/Resources/BR/Images/Main/20110824/productsbox_icon_list',
    galleryIcon: '/Resources/BR/Images/Main/20110824/productsbox_icon_gallery',
    listCssClass: null,
    galleryCssClass: null,
    emptyImageUrl: null,
    listImageWidth: null,
    listImageHeight: null,
    galleryImageWidth: null,
    galleryImageHeight: null,
    sortsDropdown: null,
    noscriptSortUpdateButton: null,
    pageNumber: 0,
    pageSize: null,
    resultCountText: null,
    pagingText: null,
    viewMode: 'gallery',
    stockGreenText: null,
    stockYellowText: null,
    stockRedText: null,
    purchaseText: null,
    findShopText: null,
    replaceProducts: true,
    pagingText: null,
    resultCountText: null,
    starOnIcon: '/Resources/BR/Images/Main/20110824/productbox_star_on_small.png',
    starOffIcon: '/Resources/BR/Images/Main/20110824/productbox_star_off_small.png',
    configurationId: null,
    fromSelf: false,
    productId: '',
    useTwoLineButtons: false,
    addedToBasketText: null,
    jsDropdown: null,
    jsDropdownItemContainer: null,
    jsDropdownSelectedValue: null,
	pagingStartText: '',

    init: function () {
        this.initViewmodes();
        this.initSorting();
        this.initNoscriptHiding();
        this.initTopScrolling();
        this.initPaging();
        this.initFindShopClick();
        this.initPurchaseClick();
        SearchQuery.productId = this.productId;
        SearchQuery.configurationId = this.configurationId;
        SearchQuery.pageSize = this.pageSize;
        GlobalListeners.addListenerToEvent('SearchResultReceived', ProductSearchNew.searchResultReceived);
        GlobalListeners.addListenerToEvent('SearchInitiated', ProductSearchNew.onSearchInitiated);
        this.initFromPersistedState();

        if (this.productId == '')
            $j(window).bind('beforeunload', SearchQuery.persistOnUnload);
    },

    onSearchInitiated: function () {
        $j(ProductSearchNew.id + ' .products-container').css('opacity', '0.4');
        $j(ProductSearchNew.id + ' .products-container .splashplacer').css('opacity', '0.4');
    },

    initFromPersistedState: function () {
        $j(document).ready(function () {
            if (SearchQuery.sort != null) {
                ProductSearchNew.sortsDropdown.val(SearchQuery.sort);
                ProductSearchNew.jsDropdownItemContainer.children().each(function () {
                    var optionValue = $j(this).find('span.hidden').html();
                    if (optionValue != SearchQuery.sort) return true;
                    var optionText = $j(this).find('span.hidden').next().html();
                    ProductSearchNew.jsDropdownSelectedValue.html('<span class="hidden">' + optionValue + '</span>' + optionText);
                    return false;
                });
            }

            if (SearchQuery.viewmode != null)
                $j(ProductSearchNew.id + ' .viewmode.' + SearchQuery.viewmode + '-view a').first().trigger('click');

            if (SearchQuery.enableProductPersistance == true) {
                ProductSearchNew.pageNumber = SearchQuery.pageNumber;
            }
        });
    },

    initViewmodes: function () {
        var click = function () {
            var toGallerymode = $j(this).parent().hasClass('gallery-view');

            if (toGallerymode) {
                // Remove anchors from gallery option.
                $j(ProductSearchNew.id + ' .image.gallery-view').html('<img src="' + ProductSearchNew.galleryIcon + '.png" alt="" />');
                var text = $j(ProductSearchNew.id + ' .text.gallery-view a').html();
                $j(ProductSearchNew.id + ' .text.gallery-view').html(text);

                // Add anchors to list option.
                $j(ProductSearchNew.id + ' .image.list-view').html('<a href="#"><img src="' + ProductSearchNew.listIcon + '_active.png" alt="" /></a>');
                var text = $j(ProductSearchNew.id + ' .text.list-view').html();
                $j(ProductSearchNew.id + ' .text.list-view').html('<a href="#">' + text + '</a>');
                ProductSearchNew.viewMode = 'gallery';
            }
            else {
                // Remove anchors from list option.
                $j(ProductSearchNew.id + ' .image.list-view').html('<img src="' + ProductSearchNew.listIcon + '.png" alt="" />');
                var text = $j(ProductSearchNew.id + ' .text.list-view a').html();
                $j(ProductSearchNew.id + ' .text.list-view').html(text);

                // Add anchors to gallery option.
                $j(ProductSearchNew.id + ' .image.gallery-view').html('<a href="#"><img src="' + ProductSearchNew.galleryIcon + '_active.png" alt="" /></a>');
                var text = $j(ProductSearchNew.id + ' .text.gallery-view').html();
                $j(ProductSearchNew.id + ' .text.gallery-view').html('<a href="#">' + text + '</a>');
                ProductSearchNew.viewMode = 'list';
            }

            $j(ProductSearchNew.id + ' .viewmode a').bind('click', click);

            // Change product items css class.
            var fromClass = toGallerymode ? ProductSearchNew.listCssClass : ProductSearchNew.galleryCssClass;
            var toClass = toGallerymode ? ProductSearchNew.galleryCssClass : ProductSearchNew.listCssClass;
            $j(ProductSearchNew.id + ' .' + fromClass).removeClass(fromClass).addClass(toClass);

            // Toggle product image (they have different sizes for the each view mode).
            // THA 2011-11-02 change theese
//            var visibles = $j(ProductSearchNew.id + ' .' + toClass + ' .image a.visible');
//            var hiddens = $j(ProductSearchNew.id + ' .' + toClass + ' .image a.hidden');
//            visibles.removeClass('visible').addClass('hidden');
//            hiddens.removeClass('hidden').addClass('visible');

            // persist.
            SearchQuery.viewmode = ProductSearchNew.viewMode;
            SearchQuery.toPersistState(SearchQuery.toObject());

            return false;
        };
        $j(ProductSearchNew.id + ' .viewmode a').bind('click', click);
    },

    initSorting: function () {
        SearchQuery.sort = this.sortsDropdown.val();

        this.sortsDropdown.change(function () {
            if (SearchQuery.enableProductPersistance == false) {
                ProductSearchNew.fromSelf = true;
                SearchQuery.pageNumber = ProductSearchNew.pageNumber = 0;
            }
            SearchQuery.sort = $j(this).val();
            SearchQuery.search();
        });

        // Initialize javascript dropdown.
        this.jsDropdown = $j(this.id + ' .jsdropdown');
        this.jsDropdownItemContainer = this.jsDropdown.find('.select_items');
        this.jsDropdownSelectedValue = this.jsDropdown.find('.selected_item_left');

        this.sortsDropdown.find('option').each(function () {
            var optionText = $j(this).html();
            var optionValue = $j(this).val();
            ProductSearchNew.jsDropdownItemContainer.append('<div class="select_item"><a href="#"><span class="hidden">' + optionValue + '</span><div>' + optionText + '</div></a></div>');
            if (optionValue == ProductSearchNew.sortsDropdown.val()) {
                ProductSearchNew.jsDropdownSelectedValue.html('<span class="hidden">' + optionValue + '</span>' + optionText);
            }
        });

        this.jsDropdownItemContainer.find('.select_item').click(function () {
            var optionValue = $j(this).find('span.hidden').html();
            var optionText = $j(this).find('span.hidden').next().html();
            var currentValue = ProductSearchNew.jsDropdownSelectedValue.find('span.hidden').html();

            if (currentValue != optionValue) {
                ProductSearchNew.jsDropdownSelectedValue.html('<span class="hidden">' + optionValue + '</span>' + optionText);
                ProductSearchNew.sortsDropdown.val(optionValue)
                ProductSearchNew.sortsDropdown.trigger('change');
            }

            ProductSearchNew.jsDropdown.children().first().trigger('click');
            return false;
        });

        this.jsDropdown.show();
    },

    initNoscriptHiding: function () {
        this.noscriptSortUpdateButton.remove();
        this.sortsDropdown.hide();
    },

    initTopScrolling: function () {
        var topPosition = $j(this.id).offset().top;
        $j('.products-scroll-top').click(function () {
            $j('html, body').animate({ scrollTop: topPosition }, 'fast');
            return false;
        });
    },

    initPaging: function () {
        $j('.products-paging').click(function () {
            if (SearchQuery.enableProductPersistance == true) {
                SearchQuery.pageSize += ProductSearchNew.pageSize;
            }
			
			SiteCatalyst.paging(ProductSearchNew.pagingStartText);
			
            ProductSearchNew.fromSelf = true;
            ProductSearchNew.replaceProducts = false;
            SearchQuery.pageNumber = ++ProductSearchNew.pageNumber;
            SearchQuery.search(ProductSearchNew.pageSize);
            return false;
        });
    },

    initFindShopClick: function () {
        $j(this.id + ' .findstorebutton').click(ProductSearchNew.findShopClick);
    },

    initPurchaseClick: function () {
        var button = $j(this.id + ' .inbasketbutton');
        if (!button.hasClass('inactive')) {
            button.click(ProductSearchNew.purchaseClick);
        }
    },

    findShopClick: function () {
	
        window.location = $j(this).find('a').attr('href');
        return false;
    },

    purchaseClick: function () {
        var productDiv = $j(this).parent().parent();
        var searchableId = $j(this).parent().siblings('.hidden.searchable').html();
        var buyableId = $j(this).parent().siblings('.hidden.buyable').html();
        var notification = $j(this).parent().siblings('.inbasketplacer');

        var service = new ShoppingServiceFE();
        service.ajax.success = function (response) {
            if (response.Success == false) return;
            var closeLightbox = function () {
                $j('#jquery-lightbox').remove();
                $j('#jquery-overlay').fadeOut(function () { $j('#jquery-overlay').remove(); });
                // Show some elements to avoid conflict with overlay in IE. These elements appear above the overlay.
                $j('embed, object, select').css({ 'visibility': 'visible' });
            }

            var overlayTemplate = $j($j('#quickbuy-overlay-template').html());
            overlayTemplate.click(function (e) { e.stopPropagation(); });
            overlayTemplate.find('.overlaycloseicon').click(function () {
                closeLightbox();
                return false;
            });

            var overlayContent = '';

            var lightBoxTigger = $j('<a></a>').lightBox();
            lightBoxTigger.click(function () {
                $j('#jquery-lightbox').html(overlayTemplate);
                $j('#jquery-overlay,#jquery-lightbox').unbind('click');
                $j('#jquery-lightbox').css('text-align', 'left');
            });

            switch (response.OverlayType) {
                case 'US': // unspecified single variant.
                    SiteCatalyst.productAddedFromList(response.SCCategory, response.SCTitle);
                    notification.removeClass('hidden');
                    $j(document).trigger('UpdateBasket', ['ProductSearchNew']);
                    overlayTemplate.addClass('overlaywidth_360px');
                    overlayContent = $j($j('#quickbuy-overlay-template-unspecified').html());
                    overlayContent.find('.remove-button').click(function () {
                        service.ajax.success = function () {
                            notification.addClass('hidden');
                            $j(document).trigger('UpdateBasket', ['ProductSearchNew']);
                            closeLightbox();
                        }
                        service.RemoveLineItem2(response.LineItemId);
                    });
                    overlayContent.find('.ok-button').click(function () {
                        closeLightbox();
                        return false;
                    });
                    overlayTemplate.find('.overlayboxcontent').append(overlayContent);
                    lightBoxTigger.trigger('click');
                    break;
                case 'AC': // accessories.
                    SiteCatalyst.productAddedFromList(response.SCCategory, response.SCTitle);
                    notification.removeClass('hidden');
                    $j(document).trigger('UpdateBasket', ['ProductSearchNew']);
                    overlayTemplate.addClass('overlaywidth_732px');
                    overlayContent = $j($j('#quickbuy-overlay-template-accessories').html());
                    overlayContent.siblings('.notnowbutton').click(function () {
                        closeLightbox();
                        return false;
                    });

                    overlayProductsDiv = overlayContent.siblings('.overlayproducts');
                    ProductSearchNew.overlayAccessoriesProductsInit(response.AdditionalProducts, overlayProductsDiv);
                    overlayProductsDiv.append('<div class="leftclear"></div>');
                    overlayTemplate.find('.overlayboxcontent').append(overlayContent);
                    lightBoxTigger.trigger('click');
                    break;
                case 'UM': // unspecified multivariant.
                    overlayTemplate.addClass('overlaywidth_650px');

                    overlayContent = $j($j('#quickbuy-overlay-template-sizes').html());
                    overlayContent.find('.overlayextraimage').html('<img src="' + response.AdditionalProducts[0].ImageForLayerLarge + '" alt="" />');
                    overlayContent.find('.productname').html(response.AdditionalProducts[0].Name);

                    var variantsSelectBox = overlayContent.find('.choices .select select');
                    for (var i = 0; i < response.AdditionalProducts.length; i++) {
                        var currentProduct = response.AdditionalProducts[i];

                        var option = $j('<option></option>');
                        option.html(currentProduct.VariantOnlyName);
                        if (currentProduct.StockStatus == 2) {
                            option.attr('disabled', 'disabled');
                        } else {
                            option.attr('value', currentProduct.BuyableId);
                        }
                        variantsSelectBox.append(option);
                    }

                    overlayContent.find('.basketbutton').click(function () {
                        var selectedOption = variantsSelectBox.find('option:selected');
                        if (selectedOption.length == 0) return false;
                        if (selectedOption.attr('disabled') == 'disabled') return false;
                        var selectedValue = selectedOption.attr('value');

                        service.ajax.success = function () {
                            SiteCatalyst.productAddedFromList(response.SCCategory, response.SCTitle);
                            notification.removeClass('hidden');
                            $j(document).trigger('UpdateBasket', ['ProductSearchNew']);
                            closeLightbox();
                        }

                        service.AddProductToBasket(searchableId, selectedValue, 1);

                        return false;
                    });

                    overlayTemplate.find('.overlayboxcontent').append(overlayContent);
                    lightBoxTigger.trigger('click');
                    break;
                case 'QD': // quantity discount.
                    overlayTemplate.addClass('overlaywidth_820px');
                    overlayContent = $j($j('#quickbuy-overlay-template-quantity').html());
                    overlayContent.siblings('.discount-text').html(response.ClickedProduct.SplashMouseOverText);
                    overlayContent.find('.overlaydiscountrightbox .totalprice .amount').html(response.ClickedProduct.Price);

                    var chosenItemsContainer = overlayContent.find('.chosenitems');
                    // Chosen product.
                    var itemTemplate = $j($j('#quickbuy-overlay-chosenitem-template').html());
                    itemTemplate.find('span.searchable').html(response.ClickedProduct.SearchableId);
                    itemTemplate.find('span.buyable').html(response.ClickedProduct.BuyableId);
                    itemTemplate.find('.description .name').html(response.ClickedProduct.Name);
                    itemTemplate.find('.description .priceinfo').html(response.OverlayChosenItemDiscountText);
                    itemTemplate.find('.productimage').append('<img src="' + response.ClickedProduct.ImageForChosenQuantityItem + '" alt="" />');
                    itemTemplate.find('.removeproduct').click(function () {
                        var destination = $j(this).parent().parent();
                        var container = destination.parent();
                        var emptyItemTemplate = $j($j('#quickbuy-overlay-chosenitem-empty-template').html());
                        makeDroppable(emptyItemTemplate.find('.noproductimage'));
                        destination.replaceWith(emptyItemTemplate);
                        setTotal();
                        return false;
                    });
                    chosenItemsContainer.append(itemTemplate);
                    for (var i = 0; i < response.QuantityTrigger - 1; i++) {
                        chosenItemsContainer.append($j('#quickbuy-overlay-chosenitem-empty-template').html());
                    }

                    for (var i = 0; i < response.AdditionalProducts.length; i++) {
                        var currentProduct = response.AdditionalProducts[i];
                        var overlayDiscountProduct = $j($j('#quickbuy-overlay-discountproduct-template').html());
                        overlayDiscountProduct.find('span.searchable').html(currentProduct.SearchableId);
                        overlayDiscountProduct.find('span.buyable').html(currentProduct.BuyableId);
                        overlayDiscountProduct.find('.name').html(currentProduct.Name);
                        overlayDiscountProduct.find('.image')
							.append('<img src="' + currentProduct.ImageForQuantityList + '" alt="" />')
							.append('<div class="hidden imageforchoice"><img src="' + currentProduct.ImageForChosenQuantityItem + '" alt="" /></div>');

                        if (currentProduct.StockStatus == 2) {
                            overlayDiscountProduct.find('.avail')
								.removeClass('avail')
								.addClass('notavail')
								.html(ProductSearchNew.stockRedText);
                            overlayDiscountProduct.addClass('outofstock');
                        }

                        overlayContent.find('.overlaydiscountproducts-container').append(overlayDiscountProduct);
                    }

                    overlayContent.find('.notnowbutton').click(function () {
                        service.ajax.success = function () {
                            SiteCatalyst.productAddedFromList(response.SCCategory, response.SCTitle);
                            notification.removeClass('hidden');
                            $j(document).trigger('UpdateBasket', ['ProductSearchNew']);
                            closeLightbox();
                        }

                        service.AddProductToBasket(searchableId, buyableId, 1);
                        return false;
                    });

                    overlayContent.find('.basketbutton').click(function () {
                        var products = chosenItemsContainer.find('.product > .productimage').parent();
                        if (products.length == 0) return false;

                        var productIdsArr = new Array();
                        var selectClickedProductOnClose = false;

                        for (var i = 0; i < products.length; i++) {
                            var currentProduct = $j(products[i]);
                            var currentSearchableId = currentProduct.find('span.searchable').html();
                            var currentBuyableId = currentProduct.find('span.buyable').html();
                            productIdsArr.push(currentSearchableId + '|' + currentBuyableId);

                            if (currentSearchableId == searchableId && currentBuyableId == buyableId) {
                                selectClickedProductOnClose = true;
                                notification.removeClass('hidden');
                            }
                        }

                        service.ajax.success = function () {
                            /*if(selectClickedProductOnClose == true)
                            notification.removeClass('hidden');*/
                            SiteCatalyst.productAddedFromList(response.SCCategory, response.SCTitle);
                            $j(document).trigger('UpdateBasket', ['ProductSearchNew']);
                            //closeLightbox();
                        }

                        service.AddProductsToBasket(productIdsArr);
                        closeLightbox();
                        return false;
                    });

                    overlayContent.find('.buymorelink').click(function () {
                        for (var i = 0; i < response.QuantityTrigger; i++) {
                            var emptyItemTemplate = $j($j('#quickbuy-overlay-chosenitem-empty-template').html());
                            makeDroppable(emptyItemTemplate.find('.noproductimage'));
                            chosenItemsContainer.append(emptyItemTemplate);
                        }

                        return false;
                    });

                    overlayContent.find('.overlaydiscountproduct > .image > img')
						.mousedown(function (e) { if (e.preventDefault) e.preventDefault(); });
                    overlayContent.find('.overlaydiscountproduct:not(.outofstock)')
						.css('cursor', 'pointer')

						.draggable({
						    revert: true,
						    revertDuration: 100,
						    helper: 'clone',
						    zIndex: '3'
						});

                    var setTotal = function () {
                        var normalPrice = response.NormalPrice;
                        var discountUnitPrice = response.DiscountPrice;
                        var quantityTrigger = response.QuantityTrigger;
                        var totalWhenDiscountTriggered = response.TotalWhenDiscountTriggered;
                        var total = 0;
                        var count = chosenItemsContainer.find('.product > .productimage').length;
                        if (count == 0) count = 1;
                        if (count < quantityTrigger) {
                            total = normalPrice * count;
                        } else if (count == quantityTrigger) {
                            total = totalWhenDiscountTriggered;
                        } else {
                            total = discountUnitPrice * count;
                        }

                        service.ajax.success = function (price) {
                            overlayContent.find('.overlaydiscountrightbox .totalprice .amount').html(price);
                        }

                        service.GetDivisionSpecificPrice(total);
                    }

                    var makeDroppable = function (elms) {
                        elms.droppable({
                            accept: '.overlaydiscountproduct',
                            drop: function (event, ui) {
                                ui.helper.remove();
                                var source = ui.draggable;
                                var destination = $j(this).parent();
                                destination.find('.noproductimage').droppable('destroy');
                                var itemTemplate = $j($j('#quickbuy-overlay-chosenitem-template').html());
                                itemTemplate.find('span.searchable').html(source.find('span.searchable').html());
                                itemTemplate.find('span.buyable').html(source.find('span.buyable').html());
                                itemTemplate.find('.description .name').html(source.find('.name').html());
                                itemTemplate.find('.description .priceinfo').html(response.OverlayChosenItemDiscountText);
                                itemTemplate.find('.productimage').append(source.find('.image .imageforchoice').html());
                                itemTemplate.find('.removeproduct').click(function () {
                                    var destination = $j(this).parent().parent();
                                    var container = destination.parent();
                                    var emptyItemTemplate = $j($j('#quickbuy-overlay-chosenitem-empty-template').html());
                                    makeDroppable(emptyItemTemplate.find('.noproductimage'));
                                    destination.replaceWith(emptyItemTemplate);
                                    setTotal();
                                    return false;
                                });
                                destination.replaceWith(itemTemplate);
                                setTotal();
                            }
                        })
                    }

                    makeDroppable(overlayContent.find('.product .noproductimage'));
                    overlayTemplate.find('.overlayboxcontent').append(overlayContent);
                    lightBoxTigger.trigger('click');
                    break;
                case 'BD': // bundle discount.
                    // Do nothing for now.
                    break;
                case 'FG': // free gift.
                    SiteCatalyst.productAddedFromList(response.SCCategory, response.SCTitle);
                    notification.removeClass('hidden');
                    $j(document).trigger('UpdateBasket', ['ProductSearchNew']);
                    overlayTemplate.addClass('overlaywidth_650px');

                    overlayContent = $j($j('#quickbuy-overlay-template-freegift').html());
                    overlayContent.find('.overlayextraimage').html('<img src="' + response.AdditionalProducts[0].ImageForLayerLarge + '" alt="" />');
                    overlayContent.find('.productname').html(response.AdditionalProducts[0].Name);
                    overlayContent.siblings('.clickedproduct').html(productDiv.find('.productname a').html());

                    // Set subheadline.
                    var subheadline = overlayContent.siblings('.subheadline').html();
                    subheadline = String.format(subheadline, response.AdditionalProducts[0].Name);
                    overlayContent.siblings('.subheadline').html(subheadline);

                    // Set description.
                    if (response.AdditionalProducts[0].Description == '') {
                        overlayContent.siblings('.freegiftdescription').html('');
                    } else {
                        overlayContent.siblings('.freegiftdescription')
							.prepend(response.AdditionalProducts[0].Description);
                    }

                    // Set price.
                    var priceText = overlayContent.find('.price').html();
                    priceText = String.format(priceText, response.AdditionalProducts[0].Price);
                    overlayContent.find('.price').html(priceText);

                    overlayContent.find('.nobutton').click(function () { closeLightbox(); return false; });
                    overlayContent.find('.yesbutton').click(function () {
                        service.ajax.success = function () {
                            notification.removeClass('hidden');
                            $j(document).trigger('UpdateBasket', ['ProductSearchNew']);
                            closeLightbox();
                        }

                        service.AddProductToBasket(
							response.AdditionalProducts[0].SearchableId,
							response.AdditionalProducts[0].BuyableId, 1);
                        return false;
                    });

                    overlayTemplate.find('.overlayboxcontent').append(overlayContent);
                    lightBoxTigger.trigger('click');
                    break;
                default:
                    SiteCatalyst.productAddedFromList(response.SCCategory, response.SCTitle);
                    notification.removeClass('hidden');
                    $j(document).trigger('UpdateBasket', ['ProductSearchNew']);
                    break;
            }
        }
        service.GetQuickBuyResponse(searchableId, buyableId);
        return false;
    },

    overlayAccessoriesProductsInit: function (products, element) {

        for (var i = 0; i < products.length; i++) {
            var currentProduct = products[i];
            var template = $j($j('#product-item-template').html());
            template.attr('class', 'product_20110824');

            // Product ids.
            template.prepend('<span class="hidden quantity">' + currentProduct.Quantity + '</span>');
            template.prepend('<span class="hidden buyable">' + currentProduct.BuyableId + '</span>');
            template.prepend('<span class="hidden searchable">' + currentProduct.SearchableId + '</span>');

            // Splash.
            if (currentProduct.SplashIconUrl != '')
                template.find('.splashicon').html('<img alt="" src="' + currentProduct.SplashIconUrl + '" />');
            if (currentProduct.SplashMouseOverText == '')
                template.find('.splash_mo').remove();
            else
                template.find('.splash_mo').html(currentProduct.SplashMouseOverText);

            // Product images.
            var imageForGallery = $j('<a href="' + currentProduct.Url + '"><img src="' + currentProduct.ListImageGalleryUrl + '" alt="" /></a>');
            var imageForList = $j('<a href="' + currentProduct.Url + '"><img src="' + currentProduct.ListImageListUrl + '" alt="" /></a>');
            imageForGallery.addClass('visible');
            imageForList.addClass('hidden');
            template.find('.image').append(imageForGallery);
            template.find('.image').append(imageForList);

            // Product name.
            template.find('.productname').html('<a href="' + currentProduct.Url + '">' + currentProduct.Name + '</a>');

            // Product description.
            template.find('.description').html(currentProduct.Description);

            // Short discount text.
            template.find('.discount').html(currentProduct.ListShortDiscountText);

            // Product price.
            template.find('.price').append(currentProduct.Price);

            // Button.
            var button = template.find('.inbasketbutton');
            button.html('<a href="">' + ProductSearchNew.purchaseText + '</a>');
            button.click(ProductSearchNew.addToBasketClick);

            // Stock status.
            if (currentProduct.CanBuy == true) {
                switch (currentProduct.StockStatus) {
                    case 0:
                        template.find('.stockicon').html('<img src="' + RootResourceFolder + '/Images/Main/20110824/productbox_instock.png" alt="" />');
                        template.find('.stocktext').html(ProductSearchNew.stockGreenText);
                        break;
                    case 1:
                        template.find('.stockicon').html('<img src="' + RootResourceFolder + '/Images/Main/20110824/productbox_fewinstock.png" alt="" />');
                        template.find('.stocktext').html(ProductSearchNew.stockYellowText);
                        break;
                    case 2:
                        if (currentProduct.IsWebOnly) {
                            template.find('.stockicon').html('<img src="' + RootResourceFolder + '/Images/Main/20110824/productbox_notinstock.png" alt="" />');
                            template.find('.stocktext').html(ProductSearchNew.stockRedText);
                            button.addClass('inactive');
                            button.html('<a name="">' + ProductSearchNew.purchaseText + '</a>');
                            button.unbind('click');
                        } else {
                            template.find('.stockicon').html('<img src="' + RootResourceFolder + '/Images/Main/20110824/productbox_notinstock.png" alt="" />');
                            template.find('.stocktext').html(ProductSearchNew.stockRedText);
                            button.removeClass('inbasketbutton').addClass('findstorebutton');
                            button.html('<a href="' + currentProduct.FindShopUrl + '">' + ProductSearchNew.findShopText + '</a>');
                            button.unbind('click');
                            button.click(ProductSearchNew.findShopClick);
                        }
                        break;
                }
            } else {
                button.removeClass('inbasketbutton').addClass('findstorebutton');
                button.html('<a href="' + currentProduct.FindShopUrl + '">' + ProductSearchNew.findShopText + '</a>');
                button.unbind('click');
                button.click(ProductSearchNew.findShopClick);
                if (currentProduct.IsWebOnly) {
                    button.addClass('hidden');
                }
            }

            // Rating.
            var rating = currentProduct.Rating;
            rating = rating > 5 ? 5 : rating;
            var stars = template.find('.star');
            (function (rating, stars) {
                for (var i = 0; i < stars.length; i++) {
                    if ((i + 1) <= rating) {
                        $j(stars[i]).html('<img alt="" src="' + ProductSearchNew.starOnIcon + '" />');
                    } else {
                        $j(stars[i]).html('<img alt="" src="' + ProductSearchNew.starOffIcon + '" />');
                    }
                }
            })(rating, stars);

            template.find('.users').html('(' + currentProduct.NumberOfRatings + ')');

            element.append(template);
        }
    },

    addToBasketClick: function () {
        var jContent = $j(this).parent();
        var searchableId = jContent.siblings('.hidden.searchable').html();
        var buyableId = jContent.siblings('.hidden.buyable').html();
        var quantity = jContent.siblings('.hidden.quantity').html();
        var notification = jContent.siblings('.inbasketplacer');

        var service = new ShoppingServiceFE();
        service.ajax.success = function () {
            notification.removeClass('hidden');
            $j(document).trigger('UpdateBasket', ['ProductSearchNew']);
            jContent.parent().parent().parent().find('.notnowbutton.button1').remove();
            jContent.parent().parent().parent().find('.notnowbutton.button2').removeClass('hidden');
        }
        service.AddProductToBasket(searchableId, buyableId, quantity);
        return false;
    },

    searchResultReceived: function (searchResult) {

        if (!$j.browser.msie || parseInt($j.browser.version.slice(0, 1)) > 8) {
            $j(ProductSearchNew.id + ' .products-container').fadeTo('50', 1);
        } else {
            $j(ProductSearchNew.id + ' .products-container').fadeTo('50', 1, function () {
                this.style.removeAttribute('filter');
            });
        }

        $j(ProductSearchNew.id + ' .products-container .splashplacer').fadeTo('50', 1);

        var numberOfProductsToGet = searchResult.Products.length;

        if (SearchQuery.enableProductPersistance == false) {
            if (ProductSearchNew.fromSelf == false) {
                ProductSearchNew.pageNumber = 0;
            } else {
                ProductSearchNew.fromSelf = false;
            }
        }

        if (searchResult.Total == 0) {
            $j(ProductSearchNew.id + ' .resultcount').hide();
        }
        else {
            $j(ProductSearchNew.id + ' .resultcount').html(String.format(ProductSearchNew.resultCountText, '1', searchResult.To, searchResult.Total));
            $j(ProductSearchNew.id + ' .resultcount').show();
        }

        if (searchResult.Total == searchResult.To) {
            $j(ProductSearchNew.id + ' .pagedown').hide();
        } else {
            var from = searchResult.To + 1;
            var to = searchResult.To + ProductSearchNew.pageSize;
            to = to > searchResult.Total ? searchResult.Total : to;
            $j(ProductSearchNew.id + ' .linktext.pagedown a').html(String.format(ProductSearchNew.pagingText, from, to, searchResult.Total));
            $j(ProductSearchNew.id + ' .pagedown').show();
			
			//create text for omniture tracking
			var index = ProductSearchNew.pagingText.indexOf('1}') + 2;
			var startingText = ProductSearchNew.pagingText.substring(0, index);
			ProductSearchNew.pagingStartText = String.format( startingText, from, to);
        }

        if (ProductSearchNew.replaceProducts == true) {
            $j(ProductSearchNew.id + ' .products-container div:not(.products-loader)').remove();
        }
        else {
            ProductSearchNew.replaceProducts = true;
        }

        for (var i = 0; i < numberOfProductsToGet; i++) {

            var currentProduct = searchResult.Products[i];

            if (searchResult.SearchType == 'Minimal') {
                ProductSearchNew.drawMinimalSearchResultItem(currentProduct);
                continue;
            }

            var template = $j($j('#product-item-template').html());

            // Product ids.
            template.prepend('<span class="hidden buyable">' + currentProduct.BuyableId + '</span>');
            template.prepend('<span class="hidden searchable">' + currentProduct.SearchableId + '</span>');

            // Splash.
            if (currentProduct.SplashIconUrl != '')
                template.find('.splashicon').html('<img alt="" src="' + currentProduct.SplashIconUrl + '" />');
            if (currentProduct.SplashMouseOverText == '')
                template.find('.splash_mo').remove();
            else
                template.find('.splash_mo').html(currentProduct.SplashMouseOverText);

            // Product images - use only for gallery list is sized in CSS

            var imageForGallery = $j('<a href="' + currentProduct.Url + '" class="visible"><img src="' + currentProduct.ListImageGalleryUrl + '" alt="" /></a>');
            template.find('.image').append(imageForGallery);
       

            // Product name.
            template.find('.productname').html('<a href="' + currentProduct.Url + '">' + currentProduct.Name + '</a>');

            // Product description.
            template.find('.description').html(currentProduct.Description);

            // Short discount text.
            template.find('.discount').html(currentProduct.ListShortDiscountText);

            // Product price.
            template.find('.price').append(currentProduct.Price);

            // Button.
            var button = template.find('.inbasketbutton');
            button.html('<a href="">' + ProductSearchNew.purchaseText + '</a>');
            button.click(ProductSearchNew.purchaseClick);

            // Stock status.
            if (currentProduct.CanBuy == true) {
                switch (currentProduct.StockStatus) {
                    case 0:
                        template.find('.stockicon').html('<img src="' + RootResourceFolder + '/Images/Main/20110824/productbox_instock.png" alt="" />');
                        template.find('.stocktext').html(ProductSearchNew.stockGreenText);
                        break;
                    case 1:
                        template.find('.stockicon').html('<img src="' + RootResourceFolder + '/Images/Main/20110824/productbox_fewinstock.png" alt="" />');
                        template.find('.stocktext').html(ProductSearchNew.stockYellowText);
                        break;
                    case 2:
                        if (currentProduct.IsWebOnly) {
                            template.find('.stockicon').html('<img src="' + RootResourceFolder + '/Images/Main/20110824/productbox_notinstock.png" alt="" />');
                            template.find('.stocktext').html(ProductSearchNew.stockRedText);
                            button.addClass('inactive');
                            if (ProductSearchNew.useTwoLineButtons == true)
                                button.addClass('twolines');
                            button.html('<a name="">' + ProductSearchNew.purchaseText + '</a>');
                            button.unbind('click');
                        }
                        else {
                            template.find('.stockicon').html('<img src="' + RootResourceFolder + '/Images/Main/20110824/productbox_notinstock.png" alt="" />');
                            template.find('.stocktext').html(ProductSearchNew.stockRedText);
                            button.removeClass('inbasketbutton').addClass('findstorebutton');
                            if (ProductSearchNew.useTwoLineButtons == true)
                                button.addClass('twolines');
                            button.html('<a href="' + currentProduct.FindShopUrl + '">' + ProductSearchNew.findShopText + '</a>');
                            button.unbind('click');
                            button.click(ProductSearchNew.findShopClick);
                        }
                        break;
                }
            } else {
                button.removeClass('inbasketbutton').addClass('findstorebutton');
                if (ProductSearchNew.useTwoLineButtons == true)
                    button.addClass('twolines');
                button.html('<a href="' + currentProduct.FindShopUrl + '">' + ProductSearchNew.findShopText + '</a>');
                button.unbind('click');
                button.click(ProductSearchNew.findShopClick);
                if (currentProduct.IsWebOnly) {
                    button.addClass('hidden');
                }
            }

            // Rating.
            var rating = currentProduct.Rating;
            rating = rating > 5 ? 5 : rating;
            var stars = template.find('.star');
            (function (rating, stars) {
                for (var i = 0; i < stars.length; i++) {
                    if ((i + 1) <= rating) {
                        $j(stars[i]).html('<img alt="" src="' + ProductSearchNew.starOnIcon + '" />');
                    } else {
                        $j(stars[i]).html('<img alt="" src="' + ProductSearchNew.starOffIcon + '" />');
                    }
                }
            })(rating, stars);

            template.find('.users').html('(' + currentProduct.NumberOfRatings + ')');

            $j('.products-container').append(template);
        }

        if (SearchQuery.scrollTop > 0) {
            $j(window).scrollTop(SearchQuery.scrollTop);
            SearchQuery.scrollTop = 0;
        }
    },

    drawMinimalSearchResultItem: function (entity) {
        var template = $j($j('#product-item-template-minimal').html());

        // image.
        var imageForGallery = $j('<a href="' + entity.Url + '"><img src="' + entity.ListImageGalleryUrl + '" alt="" /></a>');
        var imageForList = $j('<a href="' + entity.Url + '"><img src="' + entity.ListImageListUrl + '" alt="" /></a>');
        imageForGallery.addClass(ProductSearchNew.viewMode == 'gallery' ? 'visible' : 'hidden');
        imageForList.addClass(ProductSearchNew.viewMode == 'gallery' ? 'hidden' : 'visible');
        template.find('.image').append(imageForGallery);
        template.find('.image').append(imageForList);

        // name.
        template.find('.productname').html('<a href="' + entity.Url + '">' + entity.Name + '</a>');

        // description.
        template.find('.description').html(entity.Description);

        $j('.products-container').append(template);
    }
}

var ProductInfoNew = {
	element: null,
	moreText: '',
	lessText: '',

	init: function () {
		this.element = $j('#product-info');
		this.initInfoToggle();
		this.initReviews();
		this.initShareThis();
		this.initLoginRequired();
		this.initLoginLogic();
	},

	initInfoToggle: function () {
		var moreInfoDiv = this.element.find('.more-info');
		var toggleButton = this.element.find('.toggle-info-button');
		var warningTeasers = this.element.find('.infobox.warning-teasers');
		var warningDetails = this.element.find('.infobox.warning-details');
		var reviews = this.element.find('.reviews-list');

		moreInfoDiv.hide();
		warningDetails.hide();
		reviews.hide();
		toggleButton.show();
		warningTeasers.show();

		$j(toggleButton).click(function () {
			if (moreInfoDiv.css('display') == 'none') {
				moreInfoDiv.show();
				$j(this).find('.buttonsymbol').html('-');
				$j(this).find('.buttontext').html(ProductInfoNew.lessText);
				warningDetails.show();
				reviews.show();
				warningTeasers.hide();
			}
			else if (moreInfoDiv.css('display') == 'block') {
				moreInfoDiv.hide();
				$j(this).find('.buttonsymbol').html('+');
				$j(this).find('.buttontext').html(ProductInfoNew.moreText);
				warningDetails.hide();
				reviews.hide();
				warningTeasers.show();
			}

			return false;
		});
	},

	initReviews: function () {
		ProductInfoNew.element.find('.reviewitem .reviewrating_icon.vote').click(function () {
			var self = $j(this);
			var direction = self.hasClass('increment') ? 1 : -1;
			var reviewId = self.parents('.reviewitem').find('.reviewid').html();
			var service = new UserCreatedContentServiceFE();
			service.ajax.success = function (saved) {
				if (saved != true) return;
				var countElement = self.siblings('.reviewrating.' + (direction == 1 ? 'positive' : 'negative'));
				var count = countElement.html();
				count = parseInt(count) + 1;
				countElement.html(count);
			}
			service.IncrementHelpfulness(reviewId, direction);
			return false;
		});
	},
	
	initShareThis: function() {
		this.element.find('.sharethisbox').show();
	},
	
	initLoginRequired: function() {
		this.element.find('.login-required').click(function() {
			var closeLightbox = function() {
				$j('#jquery-lightbox').remove();
				$j('#jquery-overlay').fadeOut(function() { $j('#jquery-overlay').remove(); });
				// Show some elements to avoid conflict with overlay in IE. These elements appear above the overlay.
				$j('embed, object, select').css({ 'visibility' : 'visible' }); 
			}
			
			var overlayTemplate = $j($j('#productinfo-login-required').html());
			overlayTemplate.click(function(e) { e.stopPropagation(); });
			overlayTemplate.find('.overlaycloseicon').click(function() { 
				closeLightbox();
				return false; 
			});
					
			overlayTemplate.find('.okbutton').click(function() {
				closeLightbox();
				return false;
			});
					
			var lightBoxTigger = $j('<a></a>').lightBox();
			lightBoxTigger.click(function() {
				$j('#jquery-lightbox').html(overlayTemplate);
				$j('#jquery-overlay,#jquery-lightbox').unbind('click');
				$j('#jquery-lightbox').css('text-align','left');
			});
			
			lightBoxTigger.trigger('click');
			return false;
		});
	},
	
	initLoginLogic: function() {
		this.element.find('.ratingloginlink').click(function() {
			ProductInfoNew.element.find('.ratinglogin').show();
			return false;
		});
		
		this.element.find('.closelogin').click(function() {
			ProductInfoNew.element.find('.ratinglogin').hide();
			return false;
		});
		
		var login = function() {
			var service = new UserServiceFE();
            service.ajax.success = function (address) {
                if (address == null)
                    return;
					
				ProductInfoNew.element.find('.ratingloginlink').remove();
				ProductInfoNew.element.find('.ratinglogin').hide();
				
				ProductInfoNew.element.find('.reviewrating_icon.login-required')
					.unbind('click')
					.removeClass('login-required')
					.addClass('vote');
					
				ProductInfoNew.initReviews();
            };

            var email = ProductInfoNew.element.find('.ratinglogin_mailfield').val();
            
			var memberId1 = ProductInfoNew.element.find('#memberIdTextBox1').val();
			var memberId2 = ProductInfoNew.element.find('#memberIdTextBox2').val();
			var memberId3 = ProductInfoNew.element.find('#memberIdTextBox3').val();
			var memberId4 = ProductInfoNew.element.find('#memberIdTextBox4').val();
			
			var memberId = memberId1 + memberId2 + memberId3 + memberId4;
            service.LoginClubBRMember(email, memberId);
			return false;
		}
		
		this.element.find('.ratinglogin .loginbutton').click(login);
		this.element.find('.ratinglogin input:text').keypress(function (e) {
            switch (e.keyCode) {
                case 13:
                    login();
					return false;
                    break;
                default:
                    return true;
            }
        });
	}
}

