/* Minification failed. Returning unminified contents.
(260,17-20): run-time error JS1009: Expected '}': ...
(260,17-20): run-time error JS1009: Expected '}': ...
(262,9-10): run-time error JS1010: Expected identifier: }
(262,10-11): run-time error JS1006: Expected ')': ;
(263,5-6): run-time error JS1002: Syntax error: }
(325,13-16): run-time error JS1009: Expected '}': ...
(325,13-16): run-time error JS1006: Expected ')': ...
(315,25): run-time error JS1004: Expected ';'
(326,9-10): run-time error JS1195: Expected expression: }
(326,10): run-time error JS1004: Expected ';'
(326,10-11): run-time error JS1195: Expected expression: )
(329,5-6): run-time error JS1002: Syntax error: }
(508,13-16): run-time error JS1009: Expected '}': ...
(509,9-10): run-time error JS1195: Expected expression: }
(511,5-6): run-time error JS1002: Syntax error: }
(527,13-16): run-time error JS1009: Expected '}': ...
(528,9-10): run-time error JS1195: Expected expression: }
(531,5-6): run-time error JS1002: Syntax error: }
(550,13-16): run-time error JS1009: Expected '}': ...
(551,9-10): run-time error JS1195: Expected expression: }
(556,5-6): run-time error JS1002: Syntax error: }
(626,13-16): run-time error JS1009: Expected '}': ...
(627,9-10): run-time error JS1195: Expected expression: }
(629,5-6): run-time error JS1002: Syntax error: }
(668,13-16): run-time error JS1009: Expected '}': ...
(669,9-10): run-time error JS1195: Expected expression: }
(673,5-6): run-time error JS1002: Syntax error: }
(702,13-16): run-time error JS1009: Expected '}': ...
(702,13-16): run-time error JS1006: Expected ')': ...
(689,25): run-time error JS1004: Expected ';'
(703,9-10): run-time error JS1195: Expected expression: }
(703,10): run-time error JS1004: Expected ';'
(703,10-11): run-time error JS1195: Expected expression: )
(704,5-6): run-time error JS1002: Syntax error: }
(738,13-16): run-time error JS1009: Expected '}': ...
(739,9-10): run-time error JS1195: Expected expression: }
(744,5-6): run-time error JS1002: Syntax error: }
(770,13-16): run-time error JS1009: Expected '}': ...
(771,9-10): run-time error JS1195: Expected expression: }
(776,5-6): run-time error JS1002: Syntax error: }
(833,1-2): run-time error JS1002: Syntax error: }
(833,2-3): run-time error JS1195: Expected expression: )
(832,5-16): run-time error JS1018: 'return' statement outside of function: return self
(672,9-29): run-time error JS1018: 'return' statement outside of function: return dfd.promise()
(555,9-29): run-time error JS1018: 'return' statement outside of function: return dfd.promise()
(328,9-29): run-time error JS1018: 'return' statement outside of function: return dfd.promise()
 */
(function () {
    $.widget("ui._autocomplete", $.extend({}, $.ui.autocomplete.prototype, {
        _renderItem: function (ul, item) {
            return $("<li>")
                .append($("<a>").html(item.label))
                .appendTo(ul);
        },
        _resizeMenu: function() {
            var ul = this.menu.element;

            if (ul.closest('.content').length > 0) {
                $.ui.autocomplete.prototype._resizeMenu.call(this);
            }
        }
    }));
}());;
var Sana = Sana || {};
Sana.CheckoutManager = (function () {
    var sections = [];
    var $root = $('#onePageCheckout');
    /**
     * Adds checkout section
     * @public
     * @param {string} sectionName 
     * @param {object} viewModel 
     * @param {array} relativeSections
     */
    var addSection = function (sectionName, viewModel, relativeSections) {
        sections.push({
            sectionName: sectionName,
            viewModel: viewModel,
            relativeSections: relativeSections
        });
    };

    /**
     * Finds section in sections list
     * @param {string} sectionName 
     * @returns {object}
     */
    var _findSection = function (sectionName) {
        for (var i = 0, end = sections.length; i < end; i += 1) {
            if (sectionName === sections[i].sectionName) {
                return sections[i];
            }
        }
    };

    /**
     * Passes throw the all relative sections and make each hide/visible
     * @param {array} sectionsList 
     */
    var _toggleSectionsVisibility = function (sectionsList) {
        $.each(sectionsList, function (index, sectionName) {
            var $section = $root.find('#' + sectionName);

            $section.toggleClass('hidden');
            $section.find('.checkout-step-content').toggleClass('is-hidden is-visible');
        });
    };

    /**
     * Updates content in all sections from the sections list with server response.
     * @param {array} sectionsList 
     * @param {string} response 
     */
    var _updateSections = function (sectionsList, response) {
        $.each(sectionsList, function (index, sectionName) {
            var $section = $('#' + sectionName);

            $section.trigger('newData', response);
        })
    }

    /**
     * Gets data from changed section and runs update process
     * @param {string} sectionName 
     * @returns {JQueryPromise} Deferred.
     */
    var _handleSectionChange = function (sectionName) {
        var section = _findSection(sectionName),
            viewModel = section.viewModel,
            relativeSections = section.relativeSections,
            formData = viewModel.getFormData();

        _toggleSectionsVisibility(relativeSections);

        if (Sana.Layout.layout === 'MOBILE') Sana.UI.LoadingIndicator.show();
        return $.post(formData.url, formData.data)
            .done(function (response) {
                _updateSections(relativeSections, response);
                _toggleSectionsVisibility(relativeSections);
                if (Sana.Layout.layout === 'MOBILE') Sana.UI.LoadingIndicator.hide();
            });
    };

    /**
     * Calls update handler on section change
     * @public 
     * @param {string} sectionName 
     * @returns {JQueryPromise} Deferred.
     */
    var notify = function (sectionName) {
        return _handleSectionChange(sectionName);
    };

    return {
        addSection: addSection,
        notify: notify
    };
})();;
(function () {
    $(document).on('click', '.tbx-date', function () {
        $('input', this).focus();
    });

    function getLocaleBasedOnCultureInfo($input) {
        var culture = $input.attr('data-culture-info'),
            cultureArray = culture.split('-'),
            languagecode = cultureArray[0],
            country = cultureArray[1];

        return {
            full: languagecode === country.toLowerCase() ? languagecode : culture,
            lang: languagecode
        };
    }

    var setRegional = _.once(function (culture) {
        var locale = 'en-US';
        if ($.datepicker.regional.hasOwnProperty(culture.full)) {
            locale = culture.full;
        } else if ($.datepicker.regional.hasOwnProperty(culture.lang)) {
            locale = culture.lang;
        }
        $.datepicker.setDefaults($.datepicker.regional[locale]);
    });

    $('.datepicker').each(function () {
        var $self = $(this);
        var locale = getLocaleBasedOnCultureInfo($self);
        setRegional(locale);

        var options = $.extend({
            showOn: 'both',
            onSelect: function () {
                $self.trigger('change').valid();
            }
        }, $self.data('datepicker-options'), $self.data('datepicker-extend'));

        $self.datepicker(options);
        $self.next().attr('tabindex', '-1');
    });
}());;
var Sana = Sana || {};
Sana.domObserver = (function () {
    var MutationObserver = window.MutationObserver || window.WebKitMutationObserver;

    var self = {
        handleElementChildNodes: function (obj, callback) {
            var $obj = $(obj);
            if (MutationObserver && $obj.data("observer-instance") === undefined) {
                // define a new observer
                var obs = new MutationObserver(function (mutations, observer) {
                    if (mutations[0].addedNodes.length || mutations[0].removedNodes.length) {
                        callback();
                    }
                });
                // have the observer observe for changes in children
                obs.observe($obj[0], { childList: true, subtree: true });
                $obj.data("observer-instance", obs);
            }
        },
        handleElementAttributes: function (obj, callback) {
            var $obj = $(obj);
            if (MutationObserver && $obj.data("observer-instance") === undefined) {
                var obs = new MutationObserver(callback);

                obs.observe($obj[0], {
                    attributes: true
                });
                $obj.data("observer-instance", obs);
            }
        },
        reset: function (obj) {
            var $obj = $(obj);
            if (MutationObserver && $obj.data("observer-instance") !== undefined) {
                obs = $obj.data("observer-instance");
                obs.disconnect();
                $obj.removeData("observer-instance");
            }
        }
    }
    return self;
})();;
var Sana = Sana || {};
Sana.FontObject = (function () {
    var fontObject = {
        custom: {
            families: ['Pathway Gothic One', 'Open Sans:400,700,400italic']
        },
        active: function () {
            $(document).trigger('webfontactive');
        },
        inactive: function () {
            $(document).trigger('webfontinactive');
        },
        timeout: 2000
    };

    if (Sana.Settings && Sana.Settings.customFontsHref) {
        var fonts = Sana.Settings.customFontsHref.replace(/.*fonts\.googleapis\.com\/css\?family=/i, '');
        if (fonts == Sana.Settings.customFontsHref && fonts.indexOf('/') != -1) {
            fontObject.custom.urls = [fonts];
        } else {
            fontObject.google = {
                families: fonts.split('|')
            };
        }
    };

    return fontObject;
})();

WebFont.load(Sana.FontObject);;
var Sana = Sana || {};
Sana.GoogleTagManager = (function () {
    var self = {};

    const getById = id => document.getElementById(id);

    const getCJson = (midTag) => {

        const theJson = {};

        if (!(!!getById(`wel-${midTag}`))) {
            return theJson;
        }

        const elIds = [
            'name',
            'postcode',
            'country',
            'address1',
            'address2',
            'city',
            'phone',
            'email',
        ];

        elIds.forEach((eid) => {
            const el = getById(`wel-${midTag}-${eid}`);
            if (!!el) {
                theJson[eid] = el.innerHTML;
            }
        });

        return {
            customer: {
                ...theJson
            },
        };
    };

    const getCustomerJson = () => {
        return getCJson('customerinfo');
    };

    const getPurchaseJson = () => {
        return getCJson('orderinfo');
    };

    function removeUOMFromProductIds(products) {
        for (var p in products) {
            var theProdId = products[p].id;
            products[p].id = theProdId.substring(0, theProdId.indexOf('_'));
        }

        return products;
    }

    function getImageURL(products) {
        for (var p in products) {
            var theImageURL = products[p].imageUrl;
            if (theImageURL) {
                var url = window.location.origin;
                theImageURL = url + '/' + theImageURL;
                products[p].imageUrl = theImageURL;
            }
        }

        return products;
    }
    
    self.isAvaliable = function () {
        return window.google_tag_manager && window.isGoogleTagManagerContainerIdValid && !!window.dataLayer && !navigator.doNotTrack;
    };

    self.isCheckoutTrackingAvaliable = function () {
        if (!self.isAvaliable())
            return false;

        return !!(Sana.GTMData && (Sana.GTMData.checkout || Sana.GTMData.onePageCheckout));
    };

    self.trackCheckoutOption = function (option) {
        var dfd = $.Deferred();

        if (!self.isCheckoutTrackingAvaliable()) {
            return dfd.resolve().promise();
        }

        const customerJson = getCustomerJson();

        dataLayer.push({
            'event': 'checkoutOption',
            'ecommerce': {
                'checkout_option': {
                    'actionField': { 'step': Sana.GTMData.checkout.actionField.step, 'option': option }
                }
            },
            'eventCallback': function () {
                dfd.resolve();
            },
            ...customerJson,
        });

        return dfd.promise();
    }

    self.trackCheckoutOptions = function (steps) {
        var dfd = $.Deferred();

        if (!self.isCheckoutTrackingAvaliable()) {
            return dfd.resolve().promise();
        }

        function pushCheckoutOption() {
            if (!steps.length) {
                dfd.resolve();
                return;
            }

            var step = steps.shift();
            dataLayer.push({
                'event': 'checkoutOption',
                'ecommerce': {
                    'checkout_option': {
                        'actionField': { 'step': step.step, 'option': step.option }
                    }
                },
                'eventCallback': function () {
                    pushCheckoutOption();
                }
            });
        }

        steps = steps.filter(function (step) { return !!step.option });
        pushCheckoutOption();

        return dfd.promise();
    }

    self.trackViewedPromotions = function (promotions) {
        if (!$.isArray(promotions))
            promotions = [promotions];

        if (promotions.length === 0)
            return;

        dataLayer.push({
            'event': 'promoViewed',
            'ecommerce': {
                'promoView': {
                    'promotions': promotions
                }
            }
        });
    }

    self.trackPromotionClick = function (promoObj) {
        var dfd = $.Deferred();
        if (!self.isAvaliable())
            return dfd.resolve().promise();

        dataLayer.push({
            'event': 'promotionClick',
            'ecommerce': {
                'promoClick': {
                    'promotions': [promoObj]
                }
            },
            'eventCallback': function () {
                dfd.resolve();
            },
            'eventTimeout': 500
        });

        return dfd.promise();
    }

    var filterCarouselTiles = function ($productTiles) {
        var $carousel = $productTiles.parents('.slick-slider');
        var isCarouselVisible = $carousel.length;
        if (!isCarouselVisible)
            return $productTiles;

        var itemsOnPage = $carousel.slick('slickGetOption', 'slidesToScroll');
        var currentPageIndex = $carousel.slick('slickCurrentSlide');
        var startIndex = currentPageIndex * itemsOnPage;
        var endIndex = startIndex + itemsOnPage;

        // take only visible items from the carousel
        return $productTiles.slice(startIndex, endIndex);
    };

    var trackVisibleProducts = function ($container, currency) {
        var $productTiles = $('.product-tile:visible', $container);

        $productTiles = filterCarouselTiles($productTiles);

        var productsData = $.map($productTiles, function (tile) {
            return $(tile).data('tracking-data');
        });

        var uniqueData = [];
        $.each(productsData, function (index, data) {
            if (data === null)
                return;

            var isNew = $.grep(uniqueData, function (unique) {
                return unique.id === data.id;
            }).length === 0;

            if (isNew) {
                uniqueData.push(data);
            }
        });

        trackProductImpression(uniqueData, currency);
    };

    var productImpressionTrackingInitialized = false;

    self.initProductImpressionTracking = function (currency) {
        if (!self.isAvaliable())
            return;

        if (productImpressionTrackingInitialized)
            return;

        trackVisibleProducts($(document), currency);
        initLoadedProductImpressionTracking(currency);

        productImpressionTrackingInitialized = true;
    }

    var initLoadedProductImpressionTracking = function (currencyId) {
        var $document = $(document);
        $document.on('pagingChange', function (e, data) {
            var $html = $(data.newHtml);
            trackVisibleProducts($html, currencyId);
        });

        var productCarouselSelector = '#lastViewedProductsTab .slick-slider';
        $document.on('afterChange', productCarouselSelector, function (event, slick, currentSlide) {
            var $item = $(slick.$slides[currentSlide]);
            var trackingData = $item.find('.product-tile').data('tracking-data');
            trackProductImpression([trackingData], currencyId);
        });
    };

    var trackProductImpression = function (productsData, currencyId) {

        var impressionMessages = $.grep(dataLayer, function (dataLayerMessage) {
            return dataLayerMessage.event === 'impression';
        });

        if (impressionMessages.length > 0) {
            var impressions = $.map(impressionMessages, function (msg) {
                return msg.ecommerce.impressions;
            });

            productsData = $.grep(productsData, function (data) {
                var isNew = $.grep(impressions, function (existsData) {
                    return existsData.id === data.id;
                }).length === 0;
                return isNew;
            });
        }

        if (productsData.length === 0)
            return;

        //OP29640 Remove the UOM from the product id for detail and impression events.
        for (let index = 0; index < productsData.length; ++index) {
            const product = productsData[index];
            product.id = product.id.substring(0, product.id.indexOf('_'));
        }

        const customerJson = getCustomerJson();
        const impressionJson = {
            'event': 'impression',
            'ecommerce': {
                'currencyCode': currencyId || '',
                'impressions': productsData
            },
            ...customerJson,
        };
        dataLayer.push(impressionJson);
    };

    self.trackProductDetailsView = function (product) {
        if (!self.isAvaliable())
            return;

        productsData = removeUOMFromProductIds([product])[0];

        const customerJson = getCustomerJson();
        const detailJson = {
            'event': 'detail',
            'ecommerce': {
                'detail': {
                    'products': [product]
                }
            },
            ...customerJson,
        };

        dataLayer.push(detailJson);
    };

    self.trackProductClick = function (productData) {
        var dfd = $.Deferred();
        if (!self.isAvaliable() || !productData)
            return dfd.resolve().promise();

        const customerJson = getCustomerJson();
        const clickJson = {
            'event': 'productClick',
            'ecommerce': {
                'click': {
                    'products': [productData]
                }
            },
            'eventCallback': function () {
                dfd.resolve();
            },
            'eventTimeout': 500,
            ...customerJson,
        };

        dataLayer.push(clickJson);

        return dfd.promise();
    };

    self.initProductClicks = function () {
        var productDetailsLinkSelector = '[data-product-url]',
            dfd;
        $(document)
            .on('mouseup', productDetailsLinkSelector, function (e) {
                var $this = $(this),
                    mouseBtnCode = e.which,
                    leftMouseBtn = 1,
                    middleMouseBtn = 2;

                if (mouseBtnCode !== leftMouseBtn && mouseBtnCode !== middleMouseBtn)
                    return;

                if (mouseBtnCode === middleMouseBtn && !$this.attr("href"))
                    return;

                var productData = $this.data('tracking-data');
                if (!productData) {
                    var $trackingDataElement = $this.parents('[data-tracking-data]');
                    productData = $trackingDataElement.data('tracking-data');
                }
                dfd = self.trackProductClick(productData);
            })
            .on('click', productDetailsLinkSelector, function (e) {
                var dfdState = dfd.state(),
                    instance = this,
                    isTargetBlank = $(instance).attr('target') === '_blank',
                    href = instance.href,
                    newTab = null;

                if (dfdState === 'pending') {
                    e.preventDefault();
                    if (isTargetBlank) {
                        newTab = window.open();
                        newTab.document.title = 'Loading...';
                        newTab.document.body.textContent = 'Loading...';
                    }
                    dfd.done(function () {
                        if (isTargetBlank && newTab) {
                            newTab.window.location = href
                        } else {
                            window.location = href;
                        }
                    });
                }
            });
    };

    self.trackCheckoutProcess = function (productsData, actionField, customerType) {
        if (!self.isCheckoutTrackingAvaliable())
            return;

        productsData = removeUOMFromProductIds(productsData);
        productsData = getImageURL(productsData);

        const customerJson = getCustomerJson();
        const checkoutJson = {
            'event': 'checkout',
            'ecommerce': {
                'checkout': {
                    'actionField': actionField,
                    'products': productsData,
                    'cartQuantity': Sana.GTMData.checkout.cartQuantity,
                    'cartItems': Sana.GTMData.checkout.cartItems,
                    'cartTotalPrice': Sana.GTMData.checkout.cartTotalPrice
                }
            },
            'customerType': customerType,
            ...customerJson,
        };
        dataLayer.push(checkoutJson);
    };

    self.trackOnePageCheckout = function (data) {
        if (!self.isCheckoutTrackingAvaliable())
            return;

        for (var i = 0; i < data.steps.length; i++) {
            dataLayer.push({
                'event': 'checkout',
                'ecommerce': {
                    'checkout': {
                        'actionField': $.extend({}, data.actionField, { step: data.steps[i] }),
                        'products': data.productsData
                    }
                },
                'customerType': data.customerType
            });
        }
    };

    self.trackAdditionalCheckoutStep = function (data, skip) {
        var dfd = $.Deferred();
        if (!self.isCheckoutTrackingAvaliable() || skip) {
            return dfd.resolve().promise();
        }

        const customerJson = getCustomerJson();
        const checkoutJson = {
            'event': 'checkout',
            'ecommerce': {
                'checkout': {
                    'actionField': $.extend({}, Sana.GTMData.onePageCheckout.actionField, { step: data.step }),
                    'products': Sana.GTMData.onePageCheckout.productsData
                }
            },
            'customerType': Sana.GTMData.onePageCheckout.customerType,
            'eventCallback': function () {
                dfd.resolve();
            },
            ...customerJson,
        };
        dataLayer.push(checkoutJson);

        return dfd.promise();
    };

    self.trackPurchase = function (productsData, actionField, customerType, currencyId) {
        if (!self.isAvaliable())
            return;

        productsData = removeUOMFromProductIds(productsData);

        var cartQuantity = 0;
        var cartTotalPrice = 0.00;

        for (var p in productsData) {
            cartQuantity += productsData[p].quantity; 
            cartTotalPrice += productsData[p].price * productsData[p].quantity;
        }

        dataLayer.push({
            'event': 'purchase',
            'ecommerce': {
                'cartQuantity': cartQuantity,
                'cartItems': productsData.length,
                'cartTotalPrice': parseFloat(cartTotalPrice).toFixed(2),
                'currencyCode': currencyId || '',
                'purchase': {
                    'actionField': actionField,
                    'products': productsData
                }
            },
            'customerType': customerType,
            ...getPurchaseJson(),
        });
    };

    self.trackProductAddition = function (products, currencyCode, customerType, callback) {
        if (!self.isAvaliable()) {
            if (callback)
                callback();
            return;
        }

        if (!$.isArray(products))
            products = [products];
        if (products.length === 0) {
            if (callback) callback();
            return;
        }

        products = removeUOMFromProductIds(products);
        products = getImageURL(products);

        /*for (var p in products) {
            var theProdId = products[p].id;
            products[p].id = theProdId.substring(0, theProdId.indexOf('_'));
        }*/

        const customerJson = getCustomerJson();
        var message = {
            'event': 'addToCart',
            'ecommerce': {
                'currencyCode': currencyCode || '',
                'add': {
                    'products': products
                }
            },
            'customerType': customerType,
            ...customerJson,
        };

        if (callback)
            message.eventCallback = callback;
        dataLayer.push(message);
    };

    self.trackProductRemovals = function (products, customerType, callback) {
        if (!self.isAvaliable()) {
            if (callback)
                callback();
            return;
        }

        if (!$.isArray(products))
            products = [products];
        if (products.length === 0) {
            if (callback)
                callback();
            return;
        }

        const customerJson = getCustomerJson();
        var message = {
            'event': 'removeFromCart',
            'ecommerce': {
                'remove': {
                    'products': products
                }
            },
            'customerType': customerType,
            ...customerJson,
        };

        if (callback)
            message.eventCallback = callback;
        dataLayer.push(message);
    };

    self.updateAdditionAndRemovals = function (data, callback) {
        if (!self.isAvaliable() || !data || !data.Items || !data.Items.length) {
            if (callback)
                callback();
            return;
        }

        var additions = [];
        var removals = [];
        for (var i = 0, length = data.Items.length; i < length; i++) {
            var product = data.Items[i];
            if (product.quantity > 0) {
                additions.push(product);
            }
            else if (product.quantity < 0) {
                product.quantity = -product.quantity;
                removals.push(product);
            }
        }

        self.trackProductAddition(additions, data.ActionField, data.CustomerType);
        self.trackProductRemovals(removals, data.CustomerType, callback);
    };

    self.init = function () {
        Sana.GTMData = Sana.GTMData || {};

        self.initProductImpressionTracking(Sana.GTMData.currency);
        self.initProductClicks();

        if (Sana.GTMData.product) {
            self.trackProductDetailsView(Sana.GTMData.product);
        }

        if (Sana.GTMData.checkout) {
            self.trackCheckoutProcess(Sana.GTMData.checkout.productsData, Sana.GTMData.checkout.actionField, Sana.GTMData.checkout.customerType);
        }

        if (Sana.GTMData.onePageCheckout) {
            self.trackOnePageCheckout(Sana.GTMData.onePageCheckout);
        }

        if (Sana.GTMData.purchase) {
            self.trackPurchase(Sana.GTMData.purchase.productsData,
                Sana.GTMData.purchase.actionField,
                Sana.GTMData.purchase.customerType,
                Sana.GTMData.purchase.currencyId);
        }
    };

    if (window.isGoogleTagManagerContainerIdValid) {
        $(self.init);
    }

    return self;
})();;
var Sana = Sana || {};
Sana.History = (function () {
    var self = {
        setUrlParam: function (name, val) {
            var historyData = {},
                data;

            historyData[name] = val;
            data = $.extend(history.state, historyData);

            var query = Sana.Utils.getQueryParam(name, val);
            history.replaceState(data, document.title, query);
        },

        pushUrlParamFromString: function (name, str, newData) {
            var val = Sana.Utils.getQueryVariable("page", str) || '';
            var query = Sana.Utils.getQueryParam(name, val) || document.location.pathname;
            history.pushState(newData, document.title, query);
        },

        backButton: function (selector, identificator) {
            $(document).on('click', selector, function () {
                if (location.search.indexOf(identificator) != -1) {
                    history.back();
                    return false;
                };
            });
        },

        saveCurrentState: function (newData) {
            history.replaceState(newData, document.title);
        },

        onPopstate: function (callback) {
            window.addEventListener('popstate', callback);
        }
    };
    return self;
})();;
(function () {
    ko.bindingHandlers.attributeToObservable = {
        init: function (element, valueAccessor, allBindingsAccessor, viewModel) {
            var value = valueAccessor();

            for (var attributeName in value) {
                var destinationPropertyName = value[attributeName];

                var attributeValue = $(element).attr(attributeName);
                viewModel[destinationPropertyName](attributeValue);
            }
        }
    };

    ko.bindingHandlers.initModel = {
        init: function (element, valueAccessor, allBindingsAccessor, viewModel) {
            var value = valueAccessor();
            for (var key in value) {
                var val = value[key];
                viewModel[key] = val;
            }
        }
    };

    ko.bindingHandlers.form = {
        init: function (element, valueAccessor, allBindingsAccessor, viewModel) {
            var $form = $(element);

            $form.refreshValidation = function () {
                Sana.UI.refreshValidationFor($form);
            };

            var propertyName = valueAccessor();
            viewModel[propertyName]($form);
        }
    };

    ko.bindingHandlers.numericInputUpdate = {
        update: function (element, valueAccessor, allBindingsAccessor, viewModel) {
            // without it update callback isn't called after valueAccessor is changed
            ko.unwrap(valueAccessor());

            $(element).trigger('numericUpdated');
        }
    };

    ko.bindingHandlers.customSelectmenu = {
        update: function (element, valueAccessor, allBindingsAccessor, viewModel) {
            // without it update callback isn't called after valueAccessor is changed
            ko.unwrap(valueAccessor());

            var $elem = $(element),
                jqSelect = $elem._selectmenu("instance");

            if (!jqSelect) {
                if ($elem.attr('data-with-placeholder') !== undefined) {
                    // Disable the first option if it has no value because it's the placeholder
                    var $placeholderOption = $elem.find('option:first-child');
                    if (!$placeholderOption.val()) {
                        $placeholderOption.prop({ 'disabled': true });
                    }
                }

                $elem._selectmenu();
            } else {
                jqSelect.refresh();
            }
        }
    };

    ko.bindingHandlers.afterBindingsApply = {
        init: function (element, valueAccessor, allBindingsAccessor, viewModel) {
            var func = viewModel[valueAccessor()];
            if (typeof func == 'function') {
                func();
            }
        }
    };

    ko.bindingHandlers.stopBindings = {
        init: function (elem, valueAccessor) {
            var stopBindings = ko.unwrap(valueAccessor());
            return { controlsDescendantBindings: stopBindings };
        }
    };

}());;
var Sana = Sana || {};
Sana.Print = (function () {
    var print = {};

    print.init = function () {
        $(document).on('click', '.hyp-print-preview', showPrintPage);

        if (!print.isOn()) {
            return;
        }

        $('.btn-print').on('click', function () {
            window.print();
            window.location.reload();
        }).prependTo(".site").show();


        var productPage = document.getElementById('productPage');
        if (productPage) {
            // wait for dropdowns.init()
            setTimeout(function () {
                changeDropdownsIntoSimpleText();
            });
            replaceTabHeaders();
            imagesChange();
        }
    };

    var getPrintUrl = function () {
        var url = window.location.href.split('?')[0];

        url += Sana.Utils.getQueryParam('print', 1);
        var components = $(".ddlb-component select").map(function () {
            return $(this).val();
        }).get().join();
        url += Sana.Utils.addQueryParam('v', components);
        url += Sana.Utils.addQueryParam('unitOfMeasureId', $('.ddlb-uom select').val());
        url += Sana.Utils.addQueryParam('pack', $(".ddlb-prepack-selector select").val());
        url += window.location.hash;

        return url;
    };

    var showPrintPage = function () {
        window.open(getPrintUrl(), "_blank");
    };

    var replaceTabHeaders = function () {
        $('#variants, #prepacks').each(function () {
            var id = $(this).attr('id'),
                header = $('[href="#' + id + '"]').text();

            $('<h2/>', {
                text: header
            }).prependTo($(this));
        });
    };

    var changeDropdownsIntoSimpleText = function () {
        $('.ddlb-component, .ddlb-prepack-selector, .ddlb-uom').each(function () {
            var dd = $(this);
            $('<label/>', { text: dd.find('option:selected').text() }).appendTo(dd.parent());
        });
    };

    var imagesChange = function () {
        $('.carousel-image-s')
        .find('.carousel-image-s-item')
        .on('click', function () {
            $('.carousel-image-m').slick('slickGoTo', $(this).index());
        })
        .find('img')
        .lazy({ bind: 'event' });
    };

    print.isOn = function () {
        return window.location.href.indexOf("print=1") !== -1;
    };

    return print;
}());;
/*! matchMedia() polyfill - Test a CSS media type/query in JS. Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas, David Knight. Dual MIT/BSD license */

window.matchMedia || (window.matchMedia = function () {
    "use strict";

    // For browsers that support matchMedium api such as IE 9 and webkit
    var styleMedia = (window.styleMedia || window.media);

    // For those that don't support matchMedium
    if (!styleMedia) {
        var style = document.createElement('style'),
            script = document.getElementsByTagName('script')[0],
            info = null;

        style.type = 'text/css';
        style.id = 'matchmediajs-test';

        script.parentNode.insertBefore(style, script);

        // 'style.currentStyle' is used by IE <= 8 and 'window.getComputedStyle' for all other browsers
        info = ('getComputedStyle' in window) && window.getComputedStyle(style, null) || style.currentStyle;

        styleMedia = {
            matchMedium: function (media) {
                var text = '@media ' + media + '{ #matchmediajs-test { width: 1px; } }';

                // 'style.styleSheet' is used by IE <= 8 and 'style.textContent' for all other browsers
                if (style.styleSheet) {
                    style.styleSheet.cssText = text;
                } else {
                    style.textContent = text;
                }

                // Test if media query is true or false
                return info.width === '1px';
            }
        };
    }

    return function (media) {
        return {
            matches: styleMedia.matchMedium(media || 'all'),
            media: media || 'all'
        };
    };
}());



/* 
 * Created by v.slivinskiy on 9/11/14 from i.kubrakov drafts.
 */

var Sana = Sana || {};
Sana.Layout = (function () {
    var responsiveUI = {
        /*Detect touch devices*/
        touch: false,
        /*Detect Retina devices*/
        retinaDisplay: false,
        /*DETECT /"DESKTOP"/"TABLET"/"MOBILE" layout*/
        layout: false,
        /*Default media query rules for every Layout*/
        rules: {
            ALL: '',
            DESKTOP: 'only screen and (min-width: 1024px)',
            TABLET: 'only screen and (min-width: 640px) and (max-width: 1023px)',
            MOBILE: 'only screen and (max-width: 639px)'
        },
        /*Associated array for different layouts*/
        /*'ALL' array of functions for any resolution*/
        functions: {
            ALL: [],
            DESKTOP: [],
            TABLET: [],
            MOBILE: []
        },
        isIE: false,
        init: function (initRules) {
            var self = this;
            var nav = navigator.userAgent.toLowerCase();

            self.touch = this.isTouchDevice();

            if ('devicePixelRatio' in window && window.devicePixelRatio >= 1.9) {
                self.retinaDisplay = true;
            }
            /*Detect old ie versions IE 7-9*/
            if (nav.indexOf('msie') != -1) {
                self.isIE = true;
            }

            /* Document ready should Run funcions too*/
            jQuery(document).ready(function () {
                self.callFuctions();
            });

            jQuery(window).resize(function () {
                if (!responsiveUI.isRule(self.layout)) {
                    self.callFuctions();
                }
            });
        },
        addFunction: function (functionName, rule) {
            this.functions[rule].push(functionName);
        },
        isRule: function (rule) {
            if (window.matchMedia(this.rules[rule]).matches) {
                return true;
            }

            return false;
        },
        callFuctions: function () {
            /*Run functions list for ALL devices*/
            for (var i = 0, len = this.functions.ALL.length; i < len; i++) {
                this.functions.ALL[i]();
            };

            /*Run functions list for current media type*/
            this.widthMedia();
        },
        widthMedia: function () {
            var cssClass = '';
            for (var mediaType in this.rules) {
                cssClass += " ui-" + mediaType.toLowerCase();
            };
            jQuery("body").removeClass(cssClass);
            for (var mediaType in this.rules) {
                if (mediaType != "ALL") {
                    if (window.matchMedia(this.rules[mediaType]).matches) {
                        jQuery("body").addClass("ui-" + mediaType.toLowerCase());
                        this.layout = mediaType;
                        for (var j = 0, len = this.functions[mediaType].length; j < len; j++) {
                            this.functions[mediaType][j]();
                        };
                    };
                };
            };
        },

        isTouchDevice: function () {
            if (this.isIE) return false;
            if (!!('ontouchstart' in window)) {
                jQuery("body").addClass("ui-touch-device");
                return true;
            }
            else {
                return false;
            }
        }
    };

    /* Examples how to call functions */
    /*
    responsiveUI.addFunction(function(){console.log("Mobile function 1");},"MOBILE");
    responsiveUI.addFunction(function(){console.log("Mobile function 2");},"MOBILE");
    
    responsiveUI.addFunction(function(){console.log("Tablet function 1");},"TABLET");
    
     */

    responsiveUI.addResizeFunction = (function () {
        var funcList = [];

        var run = function () {
            for (var i = 0, len = funcList.length; i < len; i++) {
                funcList[i]();
            };
        };

        $(window).on("load", _.debounce(run, 250));
        $(window).on("resize", _.debounce(run, 250));
        $(window).on("orientationchange", _.debounce(run, 250));

        return function (name) {
            funcList.push(name);
        };
    }());

    responsiveUI.init();

    return responsiveUI;
})();;
(function () {
    // Customize jQuery UI Selectmenu 1.12.1 to give it the possibility to get tabindex attribute
    // from original select and set it to selectmenu button
    $.widget("ui._selectmenu", $.extend({}, $.ui.selectmenu.prototype, {
        options: $.extend({}, $.ui.selectmenu.prototype.options, {
            width: '100%',
            appendTo: '.ddlb',
            change: function (event, ui) {
                $(event.target)
                            .data('ignoreCustomHandler', true)
                            .change();
            },
            select: function (event, ui) {
                // help jquery.validate to refresh valid/invalid state
                $(event.target).click();
            }
        }),
        _appendTo: function () {
            var element = this.options.appendTo;

            if (element) {
                element = element.jquery || element.nodeType ?
                    $(element) :
                this.element.closest(element); // select closest element by selector as a target
            }

            if (!element || !element[0]) {
                element = this.element.closest(".ui-front, dialog");
            }

            if (!element.length) {
                element = this.document[0].body;
            }

            return element;
        },
        _drawButton: function () {
            var icon,
                that = this,
                item = this._parseOption(
                    this.element.find("option:selected"),
                    this.element[0].selectedIndex
                );

            // Associate existing label with the new button
            this.labels = this.element.labels().attr("for", this.ids.button);
            this._on(this.labels, {
                click: function (event) {
                    this.button.focus();
                    event.preventDefault();
                }
            });

            // Hide original select element
            this.element.hide();

            // Create button
            this.button = $("<span>", {
                tabindex: this.options.disabled ? -1 : this.element.attr('tabindex') || 0,
                id: this.ids.button,
                role: "combobox",
                "aria-expanded": "false",
                "aria-autocomplete": "list",
                "aria-owns": this.ids.menu,
                "aria-haspopup": "true",
                title: this.element.attr("title")
            })
                .insertAfter(this.element);

            this._addClass(this.button, "ui-selectmenu-button ui-selectmenu-button-closed",
                "ui-button ui-widget");

            icon = $("<span>").appendTo(this.button);
            this._addClass(icon, "ui-selectmenu-icon", "ui-icon " + this.options.icons.button);
            this.buttonItem = this._renderButtonItem(item)
                .appendTo(this.button);

            if (this.options.width !== false) {
                this._resizeButton();
            }

            this._on(this.button, this._buttonEvents);
            this.button.one("focusin", function () {

                // Delay rendering the menu items until the button receives focus.
                // The menu may have already been rendered via a programmatic open.
                if (!that._rendered) {
                    that._refreshMenu();
                }
            });
        },
        _setOptionDisabled: function (value) {
            this._super(value);

            this.menuInstance.option("disabled", value);
            this.button.attr("aria-disabled", value);
            this._toggleClass(this.button, null, "ui-state-disabled", value);

            this.element.prop("disabled", value);
            if (value) {
                this.button.attr("tabindex", -1);
                this.close();
            } else {
                this.button.attr("tabindex", this.element.attr('tabindex') || 0);
            }
        },
        _resizeButton: function () {
            // Resolves incorrect inline-style width for select dropdown
            this.button.css("width", "100%");
        },
        _renderItem: function (ul, item) {
            var li = $("<li>"),
                wrapper = $("<div>", {
                    title: item.element.attr("title")
                });

            var firstChild = null;
            if (item.element[0]) {
                firstChild = item.element[0].childNodes[0];
            }

            if (item.disabled) {
                this._addClass(li, null, "ui-state-disabled");
            }

            if (firstChild && firstChild.nodeType === Node.COMMENT_NODE) {
                wrapper.html(firstChild.textContent);
            } else {
                this._setText(wrapper, item.label);
            }

            return li.append(wrapper).appendTo(ul);
        },
        _renderButtonItem: function (item) {
            var buttonItem = $("<span>");

            var firstChild = null;
            if (item.element[0]) {
                firstChild = item.element[0].childNodes[0];
            }
            if (firstChild && firstChild.nodeType === Node.COMMENT_NODE) {
                buttonItem.html(firstChild.textContent);
            } else {
                this._setText(buttonItem, item.label);
            }

            this._addClass(buttonItem, "ui-selectmenu-text");

            // add 'selectmenu-placeholder' css class to use first select option as placeholder
            if (item.disabled) {
                this._addClass(buttonItem, "selectmenu-placeholder");
            }

            return buttonItem;
        }
    }));

    var refresh = function ($select) {
        var jqSelect = $select._selectmenu("instance");
        if (!!jqSelect && $select.find('option').length) {
            jqSelect.refresh();
        }
    };

    $(document).on('change', 'select', function () {
        var $select = $(this);

        if (!$select.data('ignoreCustomHandler'))
            refresh($select);
        $select.data('ignoreCustomHandler', false);
    });

    $('.ddlb:not(.initially-unstyled) select')._selectmenu();
}());;
var Sana = Sana || {};
Sana.SmartForms = (function () {
    var smartForms = {};

    var smartFormDeferreds = [];

    var resolveSmartFormDeferred = function (formDeferred) {
        var ind = smartFormDeferreds.indexOf(formDeferred);
        smartFormDeferreds.splice(ind, 1);
        formDeferred.resolve();
    };

    function SmartForm($form, selector, callback) {
        var self = this,
            interval;

        var _setInterval = function () {

            var formDeferred = $.Deferred();
            smartFormDeferreds.push(formDeferred);

            interval = setInterval(function () {
                if (!$(selector + ',.ui-selectmenu-button', $form).filter(':focus').length) {
                    var result = callback();
                    $.when(result).always(function () {
                        resolveSmartFormDeferred(formDeferred);
                    });

                    clearInterval(interval);
                    interval = null;
                }
            }, 100);
        };

        this.activate = function () {
            $form.on('change.smartForm', selector, function () {
                if (!interval) {
                    _setInterval();
                }
            });
        };

        this.deactivate = function () {
            $form.off('change.smartForm', selector);
        }
    }

    smartForms.init = function ($form, selector, callback) {
        var smartForm = new SmartForm($form, selector, callback);
        smartForm.activate();
        return smartForm;
    };

    smartForms.wait = function () {
        return $.when.apply($, smartFormDeferreds);
    };

    return smartForms;

}());;
(function () {
    $.extend($.ui.tooltip.prototype.options, {
        position: {
            my: 'right+20% top',
            at: 'center bottom'
        },
        content: function () {
            var messages = [],
                title = $(this).attr("title") || "";

            messages = title.split("::");
            var headText = messages[0] ? "<h4>" + messages[0] + "</h4>" : "",
                contentText = messages[1] || "";

            return $("<a>").html(headText + contentText).html();
        }
    });
}());;
var Sana = Sana || {};
Sana.UI = (function () {
    var ui = {};

    $("html").removeClass("no-js"); /*To detect javascript*/

    // Disable buttons with 'js-disable-on-click' css class on click or form submit
    $('.js-disable-on-click').scButton();

    function isIE11() {
        return !!navigator.userAgent.match(/Trident.*rv:11\./);
    }

    ui.isIE = false;

    function IEDetect() {
        if (/MSIE (\d+\.\d+);/.test(navigator.userAgent)) { //test for MSIE x.x;
            var ieversion = new Number(RegExp.$1); // capture x.x portion and store as a number
            if (ieversion == 10) {
                ui.isIE = true;
                jQuery('html').addClass('ie ie10');
            }
        } else if (isIE11()) {
            ui.isIE = true;
            jQuery('html').addClass('ie ie11');
        } else if (window.navigator.userAgent.indexOf("Edge") > -1) {
            ui.isIE = true;
            jQuery('html').addClass('ie ieEdge');
        }
    }

    // global touch flag
    ui.touchActive = false;
    ui.touchInit = function () {
        $(document)
            .off('touchstart.touchActive touchend.touchActive')
            .on('touchstart.touchActive', function () {
                ui.touchActive = true;
            })
            .on('touchend.touchActive', function () {
                ui.touchActive = false;
            });
    };

    ui.LoadingIndicator = {
        _selector: '#loadingIndicator',
        _timeout: null,

        show: function () {
            $(this._selector).show();
        },
        hide: function () {
            clearTimeout(this._timeout);
            this._timeout = null;
            $(this._selector).hide();
        },
        showAfter: function (delay) {
            var self = this;
            self._timeout = setTimeout(function () {
                if (self._timeout == null) return;
                self._timeout = null;
                self.show();
            }, delay);
        },
        init: function () {
            $(window).on('unload pagehide', function () {
                ui.LoadingIndicator.hide();
            });
        }
    };

    ui.scrollToNode = function (selector, dy, callback) {
        var $obj = selector instanceof jQuery ? selector : $(selector);
        if (!$obj.length)
            return;

        var trgt = $obj.offset().top,
            hCorrection = dy || 0,
            hRibbon = Sana.Layout.layout === 'MOBILE' ? 0 : $('header.sticky-mode').height() || 0;   // ribbon header height

        $('body, html').animate({ scrollTop: trgt - hRibbon - hCorrection }, 500, callback);
    };

    ui.scrollToNodeIfHidden = function (selector) {
        var $target = selector instanceof jQuery ? selector : $(selector);
        if (!$target.length)
            return;

        if (!ui.isElementVisible($target)) {
            ui.scrollToNode($target, 20);
        }
    }

    ui.isElementVisible = function ($target) {
        var targetTop = $target.offset().top,
            scrollTop = $(document).scrollTop(),
            winHeight = $(window).height();

        return targetTop > scrollTop && targetTop < (scrollTop + winHeight);
    }

    ui.priceStyle = function (container) {
        var hasDesimal = function (price) {
            var symbol = $(price).text().substr(-3, 1);
            return symbol.indexOf(',') != -1 || symbol.indexOf('.') != -1;
        };

        var $obj = $(container).find('.lbl-price');
        if ($obj.length && hasDesimal($obj[0])) {
            $obj.each(function (i, item) {
                var price = $(item).text(),
                    newPrice = price.substring(0, price.length - 2) + price.substr(-2).sup();

                $(item).html(newPrice);
            });
        }
    };

    ui.refreshValidationFor = function (form) {
        if (!form) {
            return;
        }
        $(form).off(".validate")
            .removeData("validator")
            .removeData("unobtrusiveValidation");
        $.validator.unobtrusive.parse(form);
    };

    ui.bindLastViewedProductsClear = function () {
        $(document).on('click', '#clearLastViewedProducts', function (event) {
            event.preventDefault();
            var $link = $(this);
            var url = $link.attr('href');
            $.post(url, function (data) {
                var redirect = $link.attr('data-src');
                if (redirect != null) {
                    location = redirect;
                } else {
                    $link.parents('.last-viewed:first').remove();
                }
            });
        });
    };

    ui.initRatingPlugin = function () {
        $('.star').rating();
    };

    ui.bindChangeSalesAgreementLineLink = function () {
        $(document).on('click', '.change-sales-agreement-line-link', function () {
            var $valueBlock = $(this).parents('.sales-agreement-line-value:first'),
                $root = $valueBlock.closest('.sales-agreement-line');

            $root.addClass('show-agreement-line-selector');

            $valueBlock.addClass('hide');
            $valueBlock.find(':input').attr('disabled', 'disabled');

            var $lineSelectorBlock = $valueBlock.nextAll('.ddlb-wrapper:first').find('.ddlb-sales-agreement-lines');
            $lineSelectorBlock.removeClass('hide');
            $lineSelectorBlock.find(':input').removeAttr('disabled');
            var $select = $lineSelectorBlock.find('select');
            if ($select.data('ui-_selectmenu')) {
                $select._selectmenu('refresh');
            } else {
                $select._selectmenu();
            }
        });
    };

    $('.form-login').on('submit', function () {
        if (!$(this).valid())
            return;

        setTimeout(function () {
            $('.form-login :input[type!="hidden"]').prop('disabled', true);
        }, 0);
        ui.LoadingIndicator.show();
    });

    ui.refreshDropDowns = function () {
        $('.ddlb:not(.initially-unstyled) select').each(function (index, select) {
            var $dropDown = $(select);
            if ($dropDown.data('ui-_selectmenu')) {
                $dropDown._selectmenu('refresh');
            } else {
                $dropDown._selectmenu();
            }
        });
    };

    ui.onAddedToBasket = function (data) {
        if (data && data.Count) {
            var basket = document.getElementById('basketPage');
            if (basket) {
                Sana.BasketDetails.onBasketLinesUpdated(data);
                return;
            }

            var $checkout = $('.checkout-step');
            if ($checkout.length) {
                window.location.reload();
                return;
            }

            ProductListPage.onAddedToBasket(data);
        }
    };

    function initAutocompleteFocusReset() {
        function resetAutocomplete() {
            $('.ui-autocomplete-input:focus').blur();
        }

        Sana.Layout.addFunction(resetAutocomplete, 'MOBILE');
        Sana.Layout.addFunction(resetAutocomplete, 'TABLET');
        Sana.Layout.addFunction(resetAutocomplete, 'DESKTOP');
    };

    ui.footerPosition = function () {
        var isChrome = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);
        var isSafari = /Safari/.test(navigator.userAgent) && /Apple Computer/.test(navigator.vendor);

        var h = $(window).height() - $('.content').offset().top - $('footer').outerHeight();
        $('.content').css({ 'min-height': $('.content-flexipage-page').length ? h + (isChrome || isSafari ? 10 : 11) : h });
    };

    ui.ProductBlockItemsHeight = {
        init: function () {
            var div = ui.EqualizeHeight.IsMobile() ? 18 : 0;
            var $blocks = $('.flexi-row.ProductSetContentBlock');
            $blocks.each(function () {
                var selector = '.product-tile > .product-info > .product-description > .product-id';
                var $items = $(selector, $(this).filter('.flexi-row-left'));
                var $items2 = $(selector, $(this).filter('.flexi-row-center'));

                SetItemsHeightLeft($items);
                SetItemsHeightCenter($items2);

                $(window).resize(function () {
                    SetItemsHeightLeft($items);
                    SetItemsHeightCenter($items2);
                });
            });

            function SetItemsHeightLeft(items) {
                var winWidth = $(window).width();
                items.css('height', 'auto');
                if (winWidth >= 622 + div) {
                    ui.EqualizeHeight.SetItemHeight2(items);
                }
            }

            function SetItemsHeightCenter(items) {
                var winWidth = $(window).width();
                items.css('height', 'auto');
                if (winWidth >= 746 + div) {
                    ui.EqualizeHeight.SetItemHeight3(items);
                }
                else if (winWidth >= 622 + div) {
                    ui.EqualizeHeight.SetItemHeight2(items);
                }
            }
        }
    };

    ui.EqualizeHeight = {
        SetItemHeight4: function (items) {
            for (var i = 0; i < items.length; i++) {
                if (i % 4 == 0) {
                    var max = Math.max($(items[i]).outerHeight(), $(items[i + 1]).outerHeight(), $(items[i + 2]).outerHeight(), $(items[i + 3]).outerHeight()) + 'px';
                    $(items[i]).css('height', max);
                    $(items[i + 1]).css('height', max);
                    $(items[i + 2]).css('height', max);
                    $(items[i + 3]).css('height', max);
                }
            }
        },
        SetItemHeight3: function (items) {
            for (var i = 0; i < items.length; i++) {
                if (i % 3 == 0) {
                    var max = Math.max($(items[i]).outerHeight(), $(items[i + 1]).outerHeight(), $(items[i + 2]).outerHeight()) + 'px';
                    $(items[i]).css('height', max);
                    $(items[i + 1]).css('height', max);
                    $(items[i + 2]).css('height', max);
                }
            }
        },
        SetItemHeight2: function (items) {
            for (var i = 0; i < items.length; i++) {
                if (i % 2 == 0) {
                    var max = Math.max($(items[i]).outerHeight(), $(items[i + 1]).outerHeight()) + 'px';
                    $(items[i]).css('height', max);
                    $(items[i + 1]).css('height', max);
                }
            }
        },
        IsMobile: function () {
            return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
        }
    };

    ui.FormToggler = {
        init: function () {
            $('.form-row[data-settings-viewname="string_sectionheader"][data-settings-expandable="true"][data-settings-isexpanded="true"]').each(function () {
                $(this).nextUntil('.form-row[data-settings-viewname="string_sectionheader"]').not('.form-button').not('input').css({ 'display': 'block' });
            });
            $('.form-row[data-settings-viewname="string_sectionheader"][data-settings-expandable="true"]').click(function () {
                var $this = $(this);
                var $items = $this.nextUntil('.form-row[data-settings-viewname="string_sectionheader"]').not('.form-button').not('[data-settings-hidelable="true"]');
                if ($this.attr('data-settings-isexpanded') == 'false') {
                    $items.slideDown(400, function () { $this.attr('data-settings-isexpanded', 'true') });
                }
                else {
                    $items.slideUp(400, function () { $this.attr('data-settings-isexpanded', 'false') });
                }
            });

            $('.column-form-validator .form-button .btn').click(function () {
                var $form = $(this).closest('form');
                setTimeout(function () {
                    var $inputs = $form.find('.input-validation-error');
                    if ($inputs.length) {
                        $headers = $('.form-row[data-settings-viewname="string_sectionheader"][data-settings-expandable="true"]');
                        $headers.each(function () {
                            var $this = $(this);
                            $this.nextUntil('.form-row[data-settings-viewname="string_sectionheader"]').not('.form-button').slideDown(400, function () { $this.attr('data-settings-isexpanded', 'true') });
                        });
                    }
                }, 50);
            });
        }
    };
    IEDetect();

    ui.touchInit();
    ui.LoadingIndicator.init();
    initAutocompleteFocusReset();
    return ui;
}());;
var Sana = Sana || {};
Sana.Urls = (function () {
    var baseUrls = null;
    var getBaseUrls = function () {
        if (baseUrls == null) {
            var htmlElement = document.getElementsByTagName('body')[0];
            baseUrls = {
                Root: htmlElement.getAttribute('data-url-root'),
                Home: htmlElement.getAttribute('data-url-home')
            };
        }
        return baseUrls;
    };
    var self = {
        Root: function () { return getBaseUrls().Root; },
        Home: function () { return getBaseUrls().Home; },
        RedirectBack: function () {
            var url = Sana.Utils.getQueryVariable('returnurl');
            if (!url || url.length == 0)
                url = self.Home();
            window.location.href = url;
        },
        AddHttpIfNeeded: function (link) {
            return link && (link.indexOf('http') === 0 ? link : 'http://' + link);
        }
    };
    return self;
})();;
var Sana = Sana || {};
Sana.Utils = (function () {
    var utils = {};

    utils.replaceElements = function (elements) {
        if (typeof (elements) == "string") {
            var cnt = document.createElement('div');
            cnt.innerHTML = elements;
            elements = $(cnt.childNodes);
        }
        elements.each(function () {
            if (this.tagName == undefined)
                return;

            var selector = '#' + this.id;
            if (selector == '#') {
                if (this.className == '')
                    return;

                selector = this.tagName + '.' + this.className.split(' ').join('.');
            }
            var newEl = $(selector).html(this.innerHTML).trigger('htmlUpdated');
            $.validator.unobtrusive.parse(newEl);
        });
    };

    /**
    * Parses provide value. Previously replaces alternate decimal separator (',').
    * @param {String} value The string value.
    * @returns {Number} Parsed number.
    */
    var parser = utils.parseNumber = function (value) {
        if (value === undefined) return NaN;
        if (typeof value === 'number') return value;
        return Number(value.replace(',', '.'));
    };

    /**
    * Formats provide number.
    * @param {Number} number The number to format.
    * @param {Object} format (optional) Object with 'decimalSeparator' property. If not specified default page separator will be used.
    * @returns {String} Parsed number.
    */
    var formatter = utils.formatNumber = function (number, format) {
        if (typeof number === 'string') return number;
        var s = number.toString(),
            separ = format && format.decimalSeparator || formatter.decimalSeparator;
        if (separ === '.') return s;
        return s.replace('.', separ);
    };
    formatter.decimalSeparator = document.documentElement.getAttribute('data-decimal-separ') || '.';

    // Used by jquery-ui spinner
    window.Globalize = $.extend({
        format: formatter,
        parseFloat: parser
    }, window.Globalize || {}
    );

    utils.isMultiple = function (x, y) {
        if (x === 0) {
            return false;
        }
        var d = Math.pow(10, 10);
        var result = Math.round((x / y) * d) / d;
        return result % 1 === 0;
    };

    utils.roundQuantity = function (count) {
        return Math.round(count * 10000) / 10000;
    };

    utils.getQueryVariable = function (variable, url) {
        url = url || window.location.search;
        var str = url.split('?')[1];
        if (!str) {
            return;
        }

        var vars = str.split('&');
        for (var i = 0; i < vars.length; i++) {
            var pair = vars[i].split('=');
            if (pair[0] == variable) {
                return decodeURIComponent(pair[1]);
            }
        }
    };

    utils.removeQueryParam = function (name, query) {
        if (!query) {
            return '';
        }

        var existingArgReg = new RegExp('[?&]' + name + '=[^&#]+');
        query = query.replace(existingArgReg, '');
        if (query.length) {
            query = '?' + query.substring(1);
        }

        return query;
    };

    utils.getQueryParam = function (name, val) {
        var existingArgReg = new RegExp(name + '=[^&#]+'),
            query = location.search,
            newQueryParam = name + '=' + val;

        if (!val) {
            return utils.removeQueryParam(name, query);
        }

        if (query) {
            if (query.search(existingArgReg) == -1) {
                query += '&' + newQueryParam;
            } else {
                query = query.replace(existingArgReg, newQueryParam);
            }
        } else {
            query = '?' + newQueryParam;
        }

        return query;
    };

    utils.updateQueryStringParameter = function (uri, key, value) {
        var re = new RegExp("([?&])" + key + "=.*?(&|#|$)", "i");
        if (uri.match(re)) {
            return uri.replace(re, '$1' + key + "=" + value + '$2');
        } else {
            var hash = '';
            if (uri.indexOf('#') !== -1) {
                hash = uri.replace(/.*#/, '#');
                uri = uri.replace(/#.*/, '');
            }
            var separator = uri.indexOf('?') !== -1 ? "&" : "?";
            return uri + separator + key + "=" + value + hash;
        }
    };

    utils.addQueryParam = function (name, val) {
        return !!val ? '&' + name + '=' + encodeURIComponent(val) : '';
    };

    RegExp.escape = function (str) {
        var specials = /[.*+?|()\[\]{}\\$^]/g;
        return str.replace(specials, "\\$&");
    };

    String.prototype.endsWith = function (suffix) {
        return this.indexOf(suffix, this.length - suffix.length) !== -1;
    };

    utils.highlightWords = function (line, word) {
        var regex = new RegExp("(" + RegExp.escape(word) + ")", "gi");
        return line.replace(regex, function (matching) {
            var result = $('<span class="highlight"></span>');
            result.text(matching);
            return result[0].outerHTML;
        });
    };

    utils.getScrollbarSize = function () {
        var scrollbarSize = 0;
        var scrollDiv = document.createElement("div");
        scrollDiv.style.cssText = 'width: 99px; height: 99px; overflow: scroll; position: absolute; top: -9999px;';
        document.body.appendChild(scrollDiv);
        scrollbarSize = scrollDiv.offsetWidth - scrollDiv.clientWidth;
        document.body.removeChild(scrollDiv);
        return scrollbarSize;
    };

    utils.guid = function () {
        function s4() {
            return Math.floor((1 + Math.random()) * 0x10000)
                .toString(16)
                .substring(1);
        }
        return s4() + s4() + '-' + s4() + '-' + s4() + '-' +
            s4() + '-' + s4() + s4() + s4();
    };

    utils.getAntiForgeryToken = function () {
        return $('input[name="__RequestVerificationToken"]:first').val();
    };

    utils.formatMoney = function (number, currency) {
        if (!currency) {
            currency = $('body').attr('data-currency');
        }
        var language = document.documentElement.attributes.lang.value;
        return number.toLocaleString(language, { style: 'currency', currency: currency });
    };

    utils.getRoundInt = function (value, digits) {
        digits = digits || 10;
        return Math.round(value / digits);
    };

    var storageProvider = localStorage;
    utils.getStoredValue = function (name) {
        return storageProvider && storageProvider.getItem(name);
    }

    utils.setStoredValue = function (name, value) {
        return storageProvider && storageProvider.setItem(name, value);
    }

    utils.removeStoredValue = function (name) {
        return storageProvider && storageProvider.removeItem(name);
    }

    return utils;
}());;
(function () {
    /*
         Extra functionality for validator:
         Add "row-error" or row-passed classes for form rows elements
     */
    $.validator.defaults.highlight = (function (element, errorClass, validClass) {
        var originalAction = $.validator.defaults.highlight;
        return function (element, errorClass, validClass) {
            originalAction.call(this, element, errorClass, validClass);
            $(element).parents(".form-row").removeClass("row-passed").addClass("row-error");
        };
    })();

    $.validator.defaults.unhighlight = (function (element, errorClass, validClass) {
        var originalAction = $.validator.defaults.unhighlight;
        return function (element, errorClass, validClass) {
            originalAction.call(this, element, errorClass, validClass);
            $(element).parents(".form-row").removeClass("row-error").addClass("row-passed");
        };
    })();

    $.validator.setDefaults({
        ignore: ':disabled'
    });

    var _proxiedStartRequest = $.validator.prototype.startRequest,
        _proxiedStopRequest = $.validator.prototype.stopRequest;
    $.extend($.validator.prototype, {
        pendingRequestDeferred: false,
        startRequest: function (element) {
            _proxiedStartRequest.apply(this, arguments);
            if (this.pendingRequest > 0)
                this.pendingRequestDeferred = this.pendingRequestDeferred || $.Deferred();
        },
        stopRequest: function () {
            _proxiedStopRequest.apply(this, arguments);
            if (this.pendingRequest === 0) {
                this.pendingRequestDeferred && this.pendingRequestDeferred.resolve();
                this.pendingRequestDeferred = null;
            }
        }
    });

    $.validator.addMethod("templatefield", function (value, element, param, method) {
        if (this.optional(element)) {
            return "dependency-mismatch";
        }

        method = typeof method === "string" && method || "templatefield";

        var previous = this.previousValue(element, method),
            validator, data, optionDataString;

        if (!this.settings.messages[element.name])
            this.settings.messages[element.name] = {};

        previous.originalMessage = previous.originalMessage || this.settings.messages[element.name][method];
        this.settings.messages[element.name][method] = previous.message;

        param = typeof param === "string" && { url: param } || param;
        optionDataString = $.param($.extend({ data: value }, param.data));
        if (previous.old === optionDataString) {
            return previous.valid;
        }

        previous.old = optionDataString;
        validator = this;
        this.startRequest(element);
        data = {};
        data[element.name] = value;
        // populating request with anti-forgery token and field name
        data["__RequestVerificationToken"] = Sana.Utils.getAntiForgeryToken();
        $.ajax($.extend(true, {
            mode: "abort",
            port: "validate" + element.name,
            dataType: "json",
            data: data,
            context: validator.currentForm,
            success: function (response) {
                var valid = response === true || response === "true",
                    errors, message, submitted;

                validator.settings.messages[element.name][method] = previous.originalMessage;
                if (valid) {
                    submitted = validator.formSubmitted;
                    validator.resetInternals();
                    validator.toHide = validator.errorsFor(element);
                    validator.formSubmitted = submitted;
                    validator.successList.push(element);
                    validator.invalid[element.name] = false;
                    validator.showErrors();
                } else {
                    errors = {};
                    message = response || validator.defaultMessage(element, { method: method, parameters: value });
                    errors[element.name] = previous.message = message;
                    validator.invalid[element.name] = true;
                    validator.showErrors(errors);
                }
                previous.valid = valid;
                validator.stopRequest(element, valid);
            }
        }, param));
        return "pending";
    });

    $.validator.addMethod('data-min', function (value, element, param) {
        if (this.optional(element)) return true;
        var number = Sana.Utils.parseNumber(value);
        if (isNaN(number)) return true;
        return number >= param;
    });

    $.validator.addMethod('data-max', function (value, element, param) {
        if (this.optional(element)) return true;
        var number = Sana.Utils.parseNumber(value);
        if (isNaN(number)) return true;
        return number <= param;
    });

    $.validator.addMethod('data-step', function (value, element, param) {
        return this.optional(element) || Sana.Utils.isMultiple(Sana.Utils.parseNumber(value), param);
    });

    $.validator.addMethod('data-greaterthan', function (value, element, params) {
        return value > params;
    });

    $.validator.addMethod('mustnotmatch', function (value, element, params) {
        var otherValue = $('#' + params.otherpropertyid).val();
        if (value == otherValue) {
            return false;
        }
        return true;
    });

    $.validator.addMethod('mustbetrue', function (value, element, params) {
        return value === 'true';
    });

    $.validator.addMethod('greaterthantoday', function (value, element, params) {
        if (!value) {
            return true;
        }

        var dateFormat = $(element).datepicker('option', 'dateFormat');
        try {
            var date = $.datepicker.parseDate(dateFormat, value);
            var todayDate = (new Date()).setHours(0, 0, 0, 0);
            return date >= todayDate;
        }
        catch (e) {
            return false;
        }
    });

    $.validator.addMethod('validdateformat', function (value, element, params) {
        if (!value) {
            return true;
        }

        var dateFormat = $(element).datepicker('option', 'dateFormat');
        try {
            $.datepicker.parseDate(dateFormat, value);
            $.validator.messages.validdateformat = "";
            return true;
        }
        catch (e) {
            var validationMessage = $(element).attr("data-validationmessage")
            if (validationMessage != undefined) {
                $.validator.messages.validdateformat = validationMessage;
            }

            return false;
        }
    });

    $.validator.addMethod('validdatedropdowns', function (value, element, params) {
        var $el = $(element);
        var $siblings = $el.siblings();
        var year = parseInt($siblings.find('.datepicker-Year').val());
        var month = parseInt($siblings.find('.datepicker-Month').val());
        var day = parseInt($siblings.find('.datepicker-Day').val());

        if (!year || !month || !day) {
            $.validator.messages.validdatedropdowns = $el.attr('data-val-validdatedropdowns-select-fields-message');
            return false;
        }

        var dateFormat = $el.attr('data-date-format');
        var date = $.datepicker.parseDate(dateFormat, $el.val());
        if (!Date.parse(date) || date.getDate() != day || date.getMonth() != (month - 1) || date.getFullYear() != year) {
            $.validator.messages.validdatedropdowns = $el.attr('data-val-validdatedropdowns-incorrect-date-message');
            return false;
        }

        if (params.minAge) {
            var now = new Date();
            now.setHours(0, 0, 0, 0);
            var maxDate = now.setFullYear(now.getFullYear() - params.minAge);
            if (date > maxDate) {
                $.validator.messages.validdatedropdowns = $el.attr('data-val-validdatedropdowns-minage-message');
                return false;
            }
        }

        return true;
    });

    $.validator.addMethod('accept', function (value, element, param) {
        var files = element.files.length ? element.files : $(element).data('files') || {};
        if (!files.length) {
            return true;
        }

        var allowedTypes = param.split(','),
            allowedTypesRegExp = [];

        for (var i = 0; i < allowedTypes.length; i++) {
            var type;
            if (!allowedTypes[i].length) {
                continue;
            }

            if (allowedTypes[i].indexOf('/*') !== -1) {
                type = allowedTypes[i].split('/*')[0].trim();
                allowedTypesRegExp.push(new RegExp('^' + type + '\/'));
            } else if (allowedTypes[i].lastIndexOf('.') === 0) {
                type = allowedTypes[i].split('.')[1].trim();
                allowedTypesRegExp.push(new RegExp('\/' + type + '$'));
            } else {
                type = allowedTypes[i].trim();
                allowedTypesRegExp.push(new RegExp(type + '$'));
            }
        }

        var isInvlalid = _.some(files, function (file) {
            return !_.some(allowedTypesRegExp, function (regexp) {
                return file.type.search(regexp) !== -1;
            });
        });
        $.validator.messages['accept'] = element.getAttribute('data-val-accept');

        return !isInvlalid;
    });

    $.validator.addMethod('data-maxfilesize', function (value, element, param) {
        var files = element.files.length ? element.files : $(element).data('files') || {};
        if (!files.length) {
            return true;
        }

        var filesSize = 0;
        _.each(files, function (file) {
            filesSize += file.size;
        });
        $.validator.messages['data-maxfilesize'] = element.getAttribute('data-val-maxfilesize');

        return filesSize <= param;
    });

    $.validator.addMethod('data-maxfilename', function (value, element, param) {
        var files = element.files.length ? element.files : $(element).data('files') || {};
        if (!files.length) {
            return true;
        }

        var isInvlalid = _.some(files, function (file) {
            return file.name.length > param;
        });
        $.validator.messages['data-maxfilename'] = element.getAttribute('data-val-maxfilename');

        return !isInvlalid;
    });

    var defaultEmailValidator = $.validator.messages.email;
    if (defaultEmailValidator) {
        $.validator.addMethod('email', function (value, element, params) {
            if (element.hasAttribute('data-val-regex')) // Skip validation 'cause it is replaced with custom reg-ex
                return true;
            return defaultEmailValidator(value, element, params);
        });
    }

    $.validator.addMethod('passwordstrength', function (value, element, params) {
        return zxcvbn(value).score >= params.minScore;
    });

    $.validator.addMethod('captcha', function (value, element, params) {
        var grecaptcha = window.grecaptcha;
        if (!grecaptcha)
            return true;

        var hasToken = !!grecaptcha.getResponse();
        if (hasToken || params.type === 'Default') {
            Sana.UI.LoadingIndicator.hide();
            return hasToken;
        }

        this.startRequest(element);
        var validator = this;

        var captchaDeferred = $.Deferred();
        $(element).data('captchaDeferred', captchaDeferred);

        captchaDeferred.then(function () {
            var valid = !!grecaptcha.getResponse(),
                errors, message;

            if (valid) {
                validator.resetInternals();
                validator.toHide = validator.errorsFor(element);
                validator.successList.push(element);
                validator.invalid[element.name] = false;
                validator.showErrors();
            } else {
                errors = {};
                message = validator.defaultMessage(element, 'captcha');
                errors[element.name] = message;
                validator.invalid[element.name] = true;
                validator.showErrors(errors);
            }

            $(element).removeData('captchaDeferred');
            validator.stopRequest(element, valid);
        });

        $('iframe[src^="https://www.google.com/recaptcha/api2"]')
            .not('[role="presentation"]')
            .parents('div')
            .last()
            .addClass('recaptcha-box');

        Sana.UI.LoadingIndicator.show();
        Sana.domObserver.handleElementAttributes('.recaptcha-box', function () {
            Sana.UI.LoadingIndicator.hide();
        });
        grecaptcha.execute();

        return "pending";
    });

    $(document).on('sana_spinstop', function (event, target) {
        $(target).valid();
    });

    window.reCaptchaSuccessCallback = function () {
        $('#g-captcha-hidden').valid();
        var deferred = $('#g-captcha-hidden').data('captchaDeferred');
        if (deferred)
            deferred.resolve();
    };
}());;
(function () {
    function getModelPrefix(fieldName) {
        return fieldName.substr(0, fieldName.lastIndexOf(".") + 1);
    }

    function appendModelPrefix(value, prefix) {
        if (value.indexOf("*.") === 0) {
            value = value.replace("*.", prefix);
        }
        return value;
    }

    function splitAndTrim(value) {
        return value.replace(/^\s+|\s+$/g, "").split(/\s*,\s*/g);
    }

    function escapeAttributeValue(value) {
        // As mentioned on http://api.jquery.com/category/selectors/
        return value.replace(/([!"#$%&'()*+,./:;<=>?@\[\\\]^`{|}~])/g, "\\$1");
    }

    function scrollToViewWhenErrorIsHidden(event, validator) {
        _.delay(function () {
            if (!validator.errorList.length) {
                return;
            }

            var errorItemsOffsetTop = validator.errorList.map(function (item) {
                var $element = $(item.element),
                    $elementRow = $element.closest('.form-row');

                return $elementRow.length ? $elementRow.offset().top : $element.offset().top;
            });

            var DEFAULT_STICKY_HEADER_HEIGHT = 60;
            var elementOffset = Math.min.apply(null, errorItemsOffsetTop),
                pageYOffset = window.pageYOffset,
                clientHeight = document.documentElement.clientHeight,
                stickyHeaderHeight = $('header.sticky-mode').height() || DEFAULT_STICKY_HEADER_HEIGHT;

            var isElementOutOfViewPort = elementOffset < pageYOffset + stickyHeaderHeight ||
                elementOffset > pageYOffset + clientHeight;

            if (isElementOutOfViewPort) {
                $('html, body').animate({ scrollTop: elementOffset - clientHeight / 2 }, 100);
            }
        });
    }

    // Set validation message to the title for compact error view (numeric inputs, dates) 
    $.validator.unobtrusive.options = {
        errorPlacement: function (place, element) {
            place.parent('.compact-sign-error').attr('title', place.text());
        },
        invalidHandler: scrollToViewWhenErrorIsHidden
    };

    $.validator.unobtrusive.adapters.addSingleVal('min', null, 'data-min');

    $.validator.unobtrusive.adapters.addSingleVal('max', null, 'data-max');

    $.validator.unobtrusive.adapters.addSingleVal('step', null, 'data-step');

    $.validator.unobtrusive.adapters.addSingleVal('greaterthan', null, 'data-greaterthan');

    $.validator.unobtrusive.adapters.add('mustnotmatch', ['otherproperty'], function (options) {
        var prefix = getModelPrefix(options.element.name);
        var otherPropertyName = appendModelPrefix(options.params.otherproperty, prefix);
        var otherPropertyElement = $(options.form).find(':input[name=' + otherPropertyName + ']')[0];

        var params = {
            otherpropertyid: otherPropertyElement.id
        };
        options.rules['mustnotmatch'] = params;
        if (options.message) {
            options.messages['mustnotmatch'] = options.message;
        }
    });

    $.validator.unobtrusive.adapters.add('mustbetrue', [], function (options) {
        options.rules['mustbetrue'] = {};
        if (options.message) {
            options.messages['mustbetrue'] = options.message;
        }
    });

    $.validator.unobtrusive.adapters.add('greaterthantoday', [], function (options) {
        options.rules['greaterthantoday'] = {};
        if (options.message) {
            options.messages['greaterthantoday'] = options.message;
        }
    });

    $.validator.unobtrusive.adapters.add('validdateformat', [], function (options) {
        options.rules['validdateformat'] = {};
        if (options.message) {
            options.messages['validdateformat'] = options.message;
        }
    });

    $.validator.unobtrusive.adapters.add('zipcode', ['messages', 'patterns'], function (options) {
        var messages = JSON.parse(options.params.messages);
        var patterns = JSON.parse(options.params.patterns);
        var getModelPrefix = function (fieldName) {
            var index = fieldName.lastIndexOf("_");
            if (index === -1) {
                index = fieldName.lastIndexOf(".");
            }
            return fieldName.substr(0, index + 1);
        };
        var countryIdFieldName = appendModelPrefix("*.CountryId", getModelPrefix(options.element.name));
        var countryInput = $(options.form).find(':input[name="' + countryIdFieldName + '"]');

        var mode;
        var switchValidationMode = function () {
            var option = countryInput.find('option:selected');
            var countryId = option.length ? option.attr('value') : countryInput.val();
            if (!countryId || !countryId.length)
                mode = null;
            else if (option.length ? option.attr('data-zipplus4') : countryInput.attr('data-zipplus4') === 'true')
                mode = 'plus4';
            else
                mode = countryId.toLowerCase();
        };
        countryInput.on('change', function () {
            switchValidationMode();
            var el = $(options.element);
            if (el.hasClass('valid') || el.hasClass('input-validation-error'))
                el.valid();
        });
        switchValidationMode();

        options.rules['regex'] = function () {
            // Allows all symbols to input 
            // if no validation rule is present
            return patterns[mode] || '.*';
        };
        options.messages['regex'] = function () {
            return mode ? messages[mode] : undefined;
        };
    });

    $.validator.unobtrusive.adapters.add('validdatedropdowns', ['minage'], function (options) {
        options.rules['validdatedropdowns'] = {
            minAge: new Number(options.params.minage)
        };
        if (options.message) {
            options.messages['validdatedropdowns'] = options.message;
        }
    });

    $.validator.unobtrusive.adapters.add('passwordstrength', ['minscore'], function (options) {
        options.rules['passwordstrength'] = {
            minScore: parseInt(options.params.minscore)
        };
        if (options.message) {
            options.messages['passwordstrength'] = options.message;
        }
    });

    $.validator.unobtrusive.adapters.add('captcha', ['type'], function (options) {
        options.rules['captcha'] = {
            type: options.params.type
        };
        if (options.message) {
            options.messages['captcha'] = options.message;
        }
    });

    $.validator.unobtrusive.adapters.add("templatefield", ["url", "template", "entity", "additionalfields"], function (options) {
        var value = {
                url: options.params.url,
                type: "POST",
                data: {
                    templateName: options.params.template || 'templateName',
                    entityName: options.params.entity || 'entityName',
                    fieldName: options.element.name
                }
            },
            prefix = getModelPrefix(options.element.name);

        $.each(splitAndTrim(options.params.additionalfields || options.element.name), function (i, fieldName) {
            var paramName = appendModelPrefix(fieldName, prefix);
            value.data[paramName] = function () {
                var field = $(options.form).find(":input").filter("[name='" + escapeAttributeValue(paramName) + "']");
                // For checkboxes and radio buttons, only pick up values from checked fields.
                if (field.is(":checkbox")) {
                    return field.filter(":checked").val() || field.filter(":hidden").val() || '';
                }
                else if (field.is(":radio")) {
                    return field.filter(":checked").val() || '';
                }
                return field.val();
            };
        });

        options.rules['templatefield'] = value;
        if (options.message)
            options.messages['templatefield'] = options.message;
    });

    $(function () {
        Sana.UI.refreshValidationFor('form');
    });
}());;
var Sana = Sana || {};
Sana.ValueTracking = (function () {
    var _trackingData = {};
    var _eventNamespace = '.dataTracking';

    function TrackableData(initialValue, valueProvider) {
        this.initialValue = initialValue;
        this.getActualValue = valueProvider;
    }

    TrackableData.prototype.isChanged = function () {
        return this.initialValue !== undefined // explicit comparison with undefined is used to distinguish manually set "modified" state (null)
            && this.initialValue !== this.getActualValue();
    };

    TrackableData.prototype.updateInitialValue = function (newInitialValue) {
        this.initialValue = newInitialValue;
    };

    TrackableData.prototype.makeDirty = function () {
        this.updateInitialValue(null);
    };

    function TrackableElement(parameters) {
        this.selector = parameters.selector;
        this.beforeChangeEvent = parameters.beforeChangeEvent;
        this.changeEvent = parameters.changeEvent;
        this.onChange = parameters.onChange;
        this.buildKey = parameters.elementKeyBuilder;
        this.resolveElementByKey = parameters.elementByKeyResolver;
        this.initialTrackingValue = parameters.initialTrackingValue;
    }

    TrackableElement.prototype.isValid = function () {
        return this.selector && this.beforeChangeEvent && this.changeEvent
            && typeof this.onChange === 'function' && typeof this.buildKey === 'function' && typeof this.resolveElementByKey === 'function';
    };

    TrackableElement.prototype.getInitialValue = function (defaultValue) {
        return this.initialTrackingValue === undefined
            ? defaultValue
            : this.initialTrackingValue;
    };

    function trackElement(dataNamespace, trackableElement) {
        if (!dataNamespace)
            throw new Error('Data namespace is not valid.');

        if (!trackableElement || !trackableElement.isValid())
            throw new Error('Trackable element is not valid.');

        untrack(dataNamespace);

        var trackingEventNamespace = makeTrackingEventNamespace(dataNamespace);
        $(document).off(trackingEventNamespace)
            .on(trackableElement.beforeChangeEvent + trackingEventNamespace, trackableElement.selector, function () {
                var $element = $(this);
                var key = trackableElement.buildKey($element);
                var data = new TrackableData(trackableElement.getInitialValue($element.val()), function () {
                    return trackableElement.resolveElementByKey(key).val();
                });
                trackData(dataNamespace, key, data);
            })
            .on(trackableElement.changeEvent + trackingEventNamespace, trackableElement.selector, function () {
                if ($(this).valid())
                    trackableElement.onChange(function () { return areChangedElementsPresent(dataNamespace); });
            });
    }

    function makeTrackingEventNamespace(dataNamespace) {
        return _eventNamespace + '_' + dataNamespace.replace(/[^a-zA-Z]/gi, '_');
    }

    function trackData(dataNamespace, key, trackingData) {
        var dataContainer = _trackingData[dataNamespace] || {};
        if (!dataContainer[key]) {
            dataContainer[key] = trackingData;
            _trackingData[dataNamespace] = dataContainer;
        }
    }

    function areChangedElementsPresent(dataNamespace) {
        if (!dataNamespace)
            return false;

        var dataContainer = _trackingData[dataNamespace];
        if (!dataContainer)
            return false;

        var changedPresent = false;
        $.each(dataContainer, function (key, value) {
            if (value.isChanged()) {
                changedPresent = true;
                return false;
            }
        });

        return changedPresent;
    }

    function untrack(dataNamespace) {
        if (dataNamespace)
            delete _trackingData[dataNamespace];
    }

    function makeNamespaceDirty(dataNamespace) {
        if (!dataNamespace)
            throw new Error('Data namespace is not valid.');

        var dataContainer = _trackingData[dataNamespace];
        if (dataContainer) {
            $.each(dataContainer, function (key, value) {
                value.makeDirty();
            });
        }
    }

    return {
        trackElement: trackElement,
        makeNamespaceDirty: makeNamespaceDirty,
        TrackableElement: TrackableElement
    };
})();;

var Sana = Sana || {};
Sana.ExtensionApi = Sana.ExtensionApi || {};

Sana.ExtensionApi.Basket = (function () {
    var productAddingUrl = document.body.getAttribute('data-add-product-url');

    /**
     * Adds product to basket.
     * @public
     * @param {string} productId The product identifier.
     * @returns {JQueryPromise} Deferred.
     */
    var addProduct = function (productId) {
        if ($('.basket').length)
            Sana.BasketSummary.onBeforeChange();

        return $.post(productAddingUrl, {
            lines: [{ ProductId: productId, AddWithDefaultQuantity: true }],
            __RequestVerificationToken: Sana.Utils.getAntiForgeryToken()
        }, Sana.UI.onAddedToBasket).promise();
    };

    return {
        addProduct: addProduct
    };
})();;
$(document).on('click', '.products-flow .btn-add-to-basket', function () {
    var productId = $(this).attr('data-product-id');
    if (!productId)
        throw 'The "data-product-id" attribute is not found or has empty value.';
    Sana.ExtensionApi.Basket.addProduct(productId);
    return false;
});;
var Sana = Sana || {};
Sana.Extension = Sana.Extension || {};
Sana.Extension.StoreLocator = Sana.Extension.StoreLocator || {};

Sana.Extension.StoreLocator = (function () {	
    var storeLocator = function StoreLocator() {
        this.DisplayLanguage = null,
            this.StoreList = [],
            this.searchTextTimeOut = null,
            this.IsSomethingProgress = false,
            this.IsInProgress = null,
            this.Configuration = null,
            this.ScrolledItems = 1,
            this.ScrollList = [],
            this.ScrollIndex = 0,
            this.Filters = [],
            this.Markers = [],
            this.ValidationMarkers = [],
            this.BoundedElements = [],
            this.MarkerCluster = null,
            this.Map = null,
            this.Block = null,
            this.DisplayAddressBlocks = null,
            this.StoreListForSearch = [],
            this.MapLoader = null,
            this.NoStoreMessageBlock = null,
            this.LastSearchLocation = null,
            this.LastSearchZoom = null,
            this.LocationCount = 0,
            this.LocationInRange = [],
            this.LocationInFilter = [],
            this.MapContainer = null,
            this.CurrentBound = null,
            this.HasFilterChanged = false,
            this.FilterCluster = [],
            this.PinPointImage = {},
            this.PinPointGroupOption = {
                styles: [{
                    height: 0,
                    url: '',
                    width: 0
                }]
            },
            this.Texts = [],
            this.InfoWindow = null,
            this.CurrentMarkerId = 0,
            this.SearchBox = null,
            this.IsSearchTextAvailable = false;

        this.init = function (block, storeLocator) {
            var configuration = storeLocator.Configuration;
            readTexts(block, this);
            setPinPoints(this);
            setStoreFilterHeight(block);

            this.MapCanvas = $('#map', block);
            this.Block = block;
            this.DisplayAddressBlocks = $('.address-menu .store-row', this.Block);

            var location = configuration.SectionForLocationSettings.LandingLocation.split(',');
            var data = configuration.DisplayStores;
            var mapOptions = {
                center: new google.maps.LatLng(location[0], location[1]),
                zoom: configuration.SectionForMapSettings.DefaultZoomLevel,
                mapTypeControl: true,
                gestureHandling: 'cooperative',
                mapTypeControlOptions: {
                    style: google.maps.MapTypeControlStyle.DROPDOWN_MENU,
                    mapTypeIds: ['roadmap', 'satellite', 'hybrid', 'terrain'],
                    position: google.maps.ControlPosition.RIGHT_TOP
                }
            };
            this.Map = new google.maps.Map(this.MapCanvas[0], mapOptions);
            var mapLoader = this.MapLoader;
            var sideBar = $('.sidebar', block);
            var map = this.Map;
            google.maps.event.addListenerOnce(this.Map, 'idle', drawMap(this.MapCanvas));
            google.maps.event.addListener(this.Map, 'bounds_changed', onBoundChanged(this));
            this.InfoWindow = new google.maps.InfoWindow({ maxWidth: 250 });
            var pointCount = 0;
            var storeLength = configuration.DisplayStores.length;

            function MarkStoresOnMap(storesToMark) {
                var hasNewStoreFound = false;
                var counter = storesToMark.length;
                storeLocator.FilterCluster = [];
                var isFilterOn = false;
                if (storeLocator.Filters[0] !== undefined)
                    isFilterOn = true;
                for (var pointCount = 0; pointCount < counter; pointCount++) {
                    var displayStore = storesToMark[pointCount].Store;
                    var latLng = new google.maps.LatLng(displayStore.Latitude, displayStore.Longitude);

                    if (storeLocator.CurrentBound.contains(latLng)) {
                        var existenceIndex = storeLocator.ValidationMarkers[displayStore.Id];
                        if (existenceIndex === undefined) {
                            var marker = new google.maps.Marker({
                                position: latLng,
                                map: storeLocator.Map,
                                icon: storeLocator.PinPointImage,
                                title: displayStore.StoreName,
                                id: displayStore.Id
                            });

                            storeLocator.CreateInfoWindow(marker, displayStore);
                            storeLocator.ValidationMarkers[displayStore.Id] = storeLocator.Markers.length;
                            storeLocator.Markers.push(marker);
                            if (isFilterOn)
                                storeLocator.FilterCluster.push(marker);
                            hasNewStoreFound = true;
                        }
                        else {
                            var existMarker = storeLocator.Markers[existenceIndex];
                            if (existMarker && (existMarker.map === null || existMarker.visible === false)) {
                                existMarker.setVisible(true);
                                hasNewStoreFound = true;
                                if (isFilterOn)
                                    storeLocator.FilterCluster.push(existMarker);
                            }
                        }
                    }
                }
                if (hasNewStoreFound) {
                    if (storeLocator.MarkerCluster)
                        storeLocator.MarkerCluster.clearMarkers();
                    storeLocator.MarkerCluster = new MarkerClusterer(storeLocator.Map, isFilterOn ? storeLocator.FilterCluster : storeLocator.Markers, storeLocator.PinPointGroupOption);
                }
            }

            this.SearchStores = function (searchText, callBack) {
                storeLocator.ShowProgress();
                storeLocator.LocationInRange = [];
                var mapCenter = storeLocator.Map.getCenter();
                var centerLatLng = new google.maps.LatLng(mapCenter.lat(), mapCenter.lng());

                if (searchText === '')
                    doSearch(false);
                else {
                    storeLocator.IsSearchTextAvailable = true;
                    var request = {
                        location: mapCenter,
                        query: searchText
                    };
                    var service = new google.maps.places.PlacesService(map);
                    service.textSearch(request, function (results, status) {
                        if (status == google.maps.places.PlacesServiceStatus.OK) {
                            centerLatLng = results[0].geometry.location;
                            doSearch(true);
                        }
                        else
                            doSearch(false);
                    });
                }

                function doSearch(considerLocation) {
                    var $addressList = $('#address-menu', storeLocator.Block);
                    var storeCountText = storeLocator.Texts[9];
                    $addressList.empty();

                    if (considerLocation) {
                        var metersPerKiloMeter = 1000;
                        var radius = storeLocator.Configuration.SectionForMapSettings.SearchRadius * metersPerKiloMeter;
                        storeLocator.LocationInRange = getNearbyStores(storeLocator.StoreListForSearch, radius, centerLatLng);

                        if (storeLocator.LocationInRange.length > 0) {
                            var closestStore = storeLocator.LocationInRange[0].Store;
                            centerLatLng = new google.maps.LatLng(closestStore.Latitude, closestStore.Longitude);
                        }
                    }
                    else
                        storeLocator.LocationInRange = storeLocator.StoreListForSearch;

                    configuration.DisplayStores = storeLocator.LocationInRange;
                    storeLocator.SetScrollList(storeLocator.LocationInRange, storeLocator.Block);
                    storeLocator.BoundedElements = [];
                    bindEvents(storeLocator, 0);
                    $addressList.scrollTop(0);
                    storeLocator.DisplayAddressBlocks = $('.address-menu .store-row', storeLocator.Block);

                    storeLocator.HasFilterChanged = false;
                    if (callBack !== null)
                        callBack(storeLocator);

                    if (storeLocator.MarkerCluster && storeLocator.MarkerCluster.getMarkers().length === 0)
                        MarkStoresOnMap(storeLocator.LocationInRange);

                    storeLocator.IsSomethingProgress = false;
                    storeLocator.HideProgress(storeCountText.replace('{0}', storeLocator.LocationInRange.length));
                    if (considerLocation) {
                        storeLocator.Map.setCenter(centerLatLng);
                        storeLocator.Map.setZoom(configuration.SectionForMapSettings.DefaultSearchZoomLevel);
                    }
                    else
                        storeLocator.Map.setZoom(configuration.SectionForMapSettings.DefaultZoomLevel);
                    if (storeLocator.Filters.length > 0)
                        storeLocator.ApplyFilter();
                }

                function getNearbyStores(storeList, radius, centerLocation) {
                    var selectedList = [];
                    for (var i = 0; i < storeList.length; i++) {
                        var distance = getStoreDistance(centerLocation, storeList[i].Store);
                        if (radius == 0 || distance < radius) {
                            storeList[i].Distance = distance;
                            storeList[i].IsInsideSearchRadius = true;
                            selectedList.push(storeList[i]);
                        }
                    }
                    return selectedList.sort(function (a, b) {
                        return parseFloat(a.Distance) - parseFloat(b.Distance);
                    });
                }

                //"Haversine" formula to calculate the great-circle distance between two points
                function getStoreDistance(centerLocation, store) {
                    var φ1 = centerLocation.lat().toRadians();
                    var φ2 = (store.Latitude - 0).toRadians();
                    var Δφ = (store.Latitude - centerLocation.lat()).toRadians();
                    var Δλ = (store.Longitude - centerLocation.lng()).toRadians();

                    var a = Math.sin(Δφ / 2) * Math.sin(Δφ / 2) + Math.cos(φ1) * Math.cos(φ2) * Math.sin(Δλ / 2) * Math.sin(Δλ / 2);
                    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
                    return 6371e3 * c;
                }

                Number.prototype.toRadians = function () {
                    return this * Math.PI / 180;
                }
            }

            this.ApplyFilter = function () {
                storeLocator.CurrentBound = storeLocator.Map.getBounds();
                var hasNewStoreFound = false;
                var storesToMark = null;
                var searchText = $('#pac-input', storeLocator.Block).val();
                var filterOption = $('input:hidden[name*= ".FilterOperation"]', storeLocator.Block)[0].value;
                var filteredStores = GetFilteredStores(storeLocator.StoreListForSearch, storeLocator.Filters, filterOption);
                var displayStores = GetDisplayStores(filteredStores, storeLocator.LocationInRange, storeLocator.StoreListForSearch);

                if (displayStores) {
                    var $addressList = $('#address-menu', storeLocator.Block);
                    var storeCountText = storeLocator.Texts[9];
                    $addressList.empty();
                    storeLocator.SetScrollList(displayStores, storeLocator.Block);
                    storeLocator.BoundedElements = [];
                    configuration.DisplayStores = displayStores;
                    bindEvents(storeLocator, 0);
                    $addressList.scrollTop(0);
                    storeLocator.DisplayAddressBlocks = $('.address-menu .store-row', storeLocator.Block);
                    storeLocator.HasFilterChanged = true;
                    storeLocator.IsSomethingProgress = false;

                    storeLocator.HideProgress(storeCountText.replace('{0}', displayStores.length));
                    MarkStoresOnMap(displayStores);
                    storeLocator.Map.setZoom(configuration.SectionForMapSettings.DefaultSearchZoomLevel);
                }

                function GetDisplayStores(filteredStores, searchedStores, storeList) {
                    if (filteredStores.length === 0 && storeLocator.Filters.length === 0 && searchedStores.length === 0)
                        return storeList;
                    else if (filteredStores.length === 0 && storeLocator.Filters.length === 0)
                        return searchedStores;
                    else if (searchedStores.length == 0 && !storeLocator.IsSearchTextAvailable)
                        return filteredStores;
                    else {
                        var finalStoreList = [];
                        for (var a = 0; a < searchedStores.length; a++)
                            for (var b = 0; b < filteredStores.length; b++)
                                if (filteredStores[b].Store.Id == searchedStores[a].Store.Id) {
                                    finalStoreList.push(filteredStores[b]);
                                    break;
                                }
                        return finalStoreList;
                    }
                }

                function GetFilteredStores(allStores, filters, filterOption) {
                    var filteredStores = [];
                    if (filterOption == 'OR') {
                        storeloop:
                        for (var i = 0; i < allStores.length; i++)
                            filterloop:
                            for (j = 0; j < filters.length; j++)
                                propertyloop:
                                for (k = 0; k < allStores[i].Store.Properties.length; k++)
                                    if (filters[j] == allStores[i].Store.Properties[k].Name && allStores[i].Store.Properties[k].Value == '1') {
                                        filteredStores.push(allStores[i]);
                                        break filterloop;
                                    }
                    }
                    else {
                        for (var i = 0; i < allStores.length; i++) {
                            var count = 0;
                            for (j = 0; j < filters.length; j++)
                                for (k = 0; k < allStores[i].Store.Properties.length; k++)
                                    if (filters[j] == allStores[i].Store.Properties[k].Name && allStores[i].Store.Properties[k].Value == '1')
                                        count++;
                            if (filters.length == count)
                                filteredStores.push(allStores[i]);
                        }
                    }
                    return filteredStores;
                }
            }

            var boundChangeTimeout = null;

            function onBoundChanged(storeLocator) {
                return function () {
                    clearTimeout(boundChangeTimeout);
                    boundChangeTimeout = setTimeout(function () {
                        var searchText = $('#pac-input', storeLocator.Block).val();
                        storeLocator.CurrentBound = storeLocator.Map.getBounds();
                        var hasNewStoreFound = false;
                        var storesToMark = configuration.DisplayStores;
                        counter = storesToMark.length;
                        var isFilterOn = false;
                        if (storeLocator.Filters[0] !== undefined)
                            isFilterOn = true;
                        var tempMarkers = [];
                        if (storesToMark.length !== 0) {
                            for (var pointCount = 0; pointCount < counter; pointCount++) {
                                var displayStore = storesToMark[pointCount].Store;
                                var latLng = new google.maps.LatLng(displayStore.Latitude, displayStore.Longitude);

                                if (storeLocator.CurrentBound.contains(latLng)) {
                                    var existenceIndex = storeLocator.ValidationMarkers[displayStore.Id];
                                    if (existenceIndex === undefined) {
                                        var marker = new google.maps.Marker({
                                            position: latLng,
                                            map: storeLocator.Map,
                                            icon: storeLocator.PinPointImage,
                                            title: displayStore.StoreName,
                                            id: displayStore.Id
                                        });

                                        storeLocator.CreateInfoWindow(marker, displayStore);
                                        storeLocator.ValidationMarkers[displayStore.Id] = storeLocator.Markers.length;
                                        storeLocator.Markers.push(marker);
                                        tempMarkers.push(marker);
                                        if (isFilterOn)
                                            storeLocator.FilterCluster.push(marker);
                                        hasNewStoreFound = true;
                                    }
                                    else {
                                        var existMarker = storeLocator.Markers[existenceIndex];
                                        tempMarkers.push(existMarker);
                                        if (existMarker && (existMarker.map === null || existMarker.visible === false)) {
                                            existMarker.setVisible(true);
                                            hasNewStoreFound = true;
                                            if (isFilterOn)
                                                storeLocator.FilterCluster.push(existMarker);
                                        }
                                    }
                                }
                            }
                            if (hasNewStoreFound) {
                                if (storeLocator.MarkerCluster)
                                    storeLocator.MarkerCluster.clearMarkers();
                                storeLocator.MarkerCluster = new MarkerClusterer(storeLocator.Map, isFilterOn ? storeLocator.FilterCluster : tempMarkers, storeLocator.PinPointGroupOption);
                            }
                        }
                        storeLocator.SearchBox.setBounds(storeLocator.Map.getBounds());
                        bindEvents(storeLocator, 0);
                    }, 100);
                }
            }

            this.LocationCount = configuration.DisplayStores.length;
            var bindTimeout = null;

            $('#address-menu', this.Block).scroll(function (event) {
                clearTimeout(bindTimeout);
                bindTimeout = setTimeout(function (event) {
                    var storeCount = configuration.DisplayStores.length;
                    var scrollTop = event.currentTarget.scrollTop;
                    var scrollHeight = event.currentTarget.scrollHeight;
                    var position = scrollTop / scrollHeight;
                    var currentIndex = Math.floor(storeCount * position);
                    bindEvents(storeLocator, currentIndex);
                }, 500, event);
            });

            var bindEvents = function (storeLocator, startIndex) {
                var indexRange = 50;
                var storeMaxIndex = configuration.DisplayStores.length - 1;
                var minIndex = (startIndex - indexRange) < 0 ? 0 : startIndex - indexRange;
                var maxIndex = (startIndex + indexRange) > storeMaxIndex ? storeMaxIndex : startIndex + indexRange;
                for (var index = startIndex; index < maxIndex + 1; index++) {
                    if (storeLocator.BoundedElements[index] === undefined) {
                        var store = configuration.DisplayStores[index].Store;
                        var $list = $('ul#address-menu > li#' + store.Id + '.store-row > ul.store-row-content', storeLocator.Block);
                        $list.on('click', storeLocator.MoveToLocation(store.Id, storeLocator));
                        storeLocator.BoundedElements[index] = '-';
                    }
                }
            }

            this.SetStoreCountDepricated(this.LocationCount);
            var input = $('#pac-input', block)[0];
            $(input).keyup(searchTextChangedEvent(this));
            $(input).mouseup(searchTextChangedEvent(this));
            this.SearchBox = new google.maps.places.SearchBox(input);
            this.SearchBox.setBounds(this.Map.getBounds());
            this.SearchBox.addListener('places_changed', this.PlaceChangedEvent(this.SearchBox, this));
            var $noStoreMessage = $('.nostore-message', this.Block);
            this.NoStoreMessageBlock = $noStoreMessage;
            this.Map.controls[google.maps.ControlPosition.TOP_CENTER].push($noStoreMessage[0]);
            $noStoreMessage.hide();
            this.ShowFilter();

            $('.clear-results', this.Block).on('click', function () {
                storeLocator.ClearAll(true);
                clearInputFileds();
                storeLocator.ScrolledItems = 1;
                storeLocator.ScrollIndex = 0;
                storeLocator.SearchStores('', function (storeLocator) {
                    return function (storeLocator) {
                        var location = storeLocator.Configuration.SectionForLocationSettings.LandingLocation.split(',');
                        storeLocator.Map.setZoom(storeLocator.Configuration.SectionForMapSettings.DefaultZoomLevel);
                        storeLocator.Map.setCenter(new google.maps.LatLng(location[0], location[1]));
                    }(storeLocator)
                });
            });

            google.maps.event.addDomListener(window, 'resize', setMinimumZoom(this));

            function drawMap(mapCanvas) {
                return function () {
                    mapCanvas.show();
                    sideBar.show();
                    mapLoader.hide();
                    google.maps.event.trigger(map, 'resize');
                    map.setZoom(configuration.SectionForMapSettings.DefaultZoomLevel);
                    map.setCenter(new google.maps.LatLng(location[0], location[1]));
                    var factor = getMinZoom(mapCanvas[0].clientWidth);

                    function getMinZoom(value) {
                        var minZoom = 0;
                        var width = (mapCanvas[0].clientWidth);
                        for (var i = 256; i <= value; i *= 2)
                            minZoom++;
                        return minZoom;
                    }
                    map.setOptions({ minZoom: factor });
                }
            }

            function clearInputFileds() {
                storeLocator.Filters = [];
                $('#pac-input', block).val('');
                $('.chosen-select option', block).prop('selected', false).trigger('chosen:updated');
            }

            function showNoStoreMessage(state) {
                if (state === 'true')
                    storeLocator.NoStoreMessageBlock.show();
                else
                    storeLocator.NoStoreMessageBlock.hide();
            }

            function setMinimumZoom(storeLocator) {
                return function () {
                    var factor = getMinZoom(storeLocator.MapCanvas[0].clientWidth);
                    function getMinZoom(value) {
                        var minZoom = 0;
                        var width = (storeLocator.MapCanvas[0].clientWidth);
                        for (var i = 256; i <= value; i *= 2)
                            minZoom++;
                        return minZoom;
                    }
                    storeLocator.Map.setOptions({ minZoom: factor });
                }
            }

            var searchTextTimeOut = null;

            function searchTextChangedEvent(storeLocator) {
                return function (event) {
                    clearTimeout(this.searchTextTimeOut);
                    this.searchTextTimeOut = setTimeout(function () {
                        var searchText = $('#pac-input', storeLocator.Block).val();
                        if (event.keyCode !== 13) {
                            var func = null;
                            if (searchText === '')
                                func = function (storeLocator) { MarkStoresOnMap(configuration.DisplayStores); };
                            storeLocator.SearchStores(searchText, func);
                        }
                    }, 1000);
                };
            }

            function setPinPoints(storeLocator) {
                var image = new Image();
                image.onload = function () {
                    storeLocator.PinPointGroupOption.styles[0]['height'] = this.height;
                    storeLocator.PinPointGroupOption.styles[0]['width'] = this.width;
                };
                image.src = configuration.SectionForLocationSettings.PinPointGroupIcon;
                storeLocator.PinPointGroupOption.styles[0]['url'] = configuration.SectionForLocationSettings.PinPointGroupIcon;
                storeLocator.PinPointImage['url'] = configuration.SectionForLocationSettings.PinPointLocationIcon;
            }

            function readTexts(cnt, storeLocator) {
                storeLocator.Texts[0] = $(cnt).attr('txt-sunday');
                storeLocator.Texts[1] = $(cnt).attr('txt-monday');
                storeLocator.Texts[2] = $(cnt).attr('txt-tuesday');
                storeLocator.Texts[3] = $(cnt).attr('txt-wednesday');
                storeLocator.Texts[4] = $(cnt).attr('txt-thursday');
                storeLocator.Texts[5] = $(cnt).attr('txt-friday');
                storeLocator.Texts[6] = $(cnt).attr('txt-saturday');
                storeLocator.Texts[7] = $(cnt).attr('txt-no-opening-hours');
                storeLocator.Texts[8] = $(cnt).attr('txt-open-hours');
                storeLocator.Texts[9] = $(cnt).attr('txt-store-count');
                storeLocator.Texts[10] = $(cnt).attr('txt-google-map-link-title');
            }
            
            function setStoreFilterHeight($element) {
                var $sidebar = $('.sidebar'), $addressMenu = $('.address-menu'), mapContainer = '.map-container';

                setTimeout(function() {
                    $sidebar.css('height', calHeight(mapContainer) - 20);
                    $addressMenu.css('height', 
                        calHeight('.map-container') - (calHeight('.store-filter-sec') + parseInt($addressMenu.css('padding-bottom'), 10)));

                }, 300)
            }

            function calHeight(element) {
                return  $(element).height()
            }
        }

        this.seperateColumns = function (columns, storeLine, index, separator) {
            var firstQuateIndex = storeLine.indexOf('"');
            var firstCommaIndex = storeLine.indexOf(separator);
            if (firstQuateIndex === -1 && firstCommaIndex === -1) {
                columns[index] = storeLine;
                return;
            }
            if (firstCommaIndex < firstQuateIndex || firstQuateIndex === -1) {
                columns[index] = storeLine.substring(0, firstCommaIndex);
                arguments.callee(columns, storeLine.slice(firstCommaIndex + 1), ++index, separator);
            }
            else if (firstQuateIndex < firstCommaIndex) {
                var columnName = storeLine.slice(firstQuateIndex + 1);
                var lenght = columnName.indexOf('"');
                if (lenght !== -1) {
                    columns[index] = '"' + columnName.substring(0, lenght + 1);
                    arguments.callee(columns, columnName.slice(lenght + 2), ++index, separator);
                }
            }
        }

        this.getCsvSettings = function (culture) {
            if (culture === 'nl-NL')
                return { DecimalPointer: ',', ListSeparator: ';' };
            else
                return { DecimalPointer: '.', ListSeparator: ',' };
        }

        this.GetLatLngFiledsInDefault = function (context, settings) {
            var elements = context.split(settings.ListSeparator);
            elements[2] = elements[2].Replace(settings.DecimalPointer, Dot);
            elements[3] = elements[3].Replace(settings.DecimalPointer, Dot);
            context = elements.JoinWith(settings.ListSeparator.ToString());
        }

        this.StoreInitialize = function (storeContext, propertyNames, noOfCsvColumns, settings, isRenderRequest, storeLocator) {
            if (isRenderRequest)
                storeLocator.GetLatLngFiledsInDefault(storeContext, settings);

            var columns = [];
            storeLocator.seperateColumns(columns, storeContext, 0, settings.ListSeparator);
            var stores = {};
            var line = {};
            for (var j = 0; j < noOfCsvColumns; j++)
                if (columns[j] != null)
                    line[propertyNames[j]] = columns[j];

            var properties = [];
            for (var i = noOfCsvColumns; i < propertyNames.length; i++) {
                var property = {};
                property['Name'] = propertyNames[i];
                property['Value'] = columns[i];
                properties.push(property);
            }
            line['Properties'] = properties;
            stores['Height'] = storeLocator.SetHeight(columns, propertyNames, 20, 21);
            stores['IsInsideSearchRadius'] = false;
            stores['Store'] = line;
            storeLocator.StoreListForSearch.push(stores);
            return JSON.stringify(stores);
        }

        this.LoadFilters = function (properties, block, noOfCsvColumns) {
            var $filterOption = $('#filters', block);
            for (var i = noOfCsvColumns; i < properties.length; i++) {
                var filter = '<option value="' + properties[i] + '">' + properties[i] + '</option>';
                $filterOption.append(filter);
            }
        }

        this.SetHeight = function (columns, propertyNames, lineHeight, totalPadding) {
            var noOfVisibleProperties = 0;

            for (var j = 0; j < propertyNames.length; j++) {
                if (propertyNames[j].toLowerCase() === 'storename')
                    if (columns[j] !== "")
                        noOfVisibleProperties++;
                if (propertyNames[j].toLowerCase() === 'city')
                    if (columns[j] !== "")
                        noOfVisibleProperties++;
                if (propertyNames[j].toLowerCase() === 'phone')
                    if (columns[j] !== "")
                        noOfVisibleProperties++;
                if (propertyNames[j].toLowerCase() === 'siteurl')
                    if (columns[j] !== "")
                        noOfVisibleProperties++;
            }

            var height = (noOfVisibleProperties * lineHeight) + totalPadding;
            return height.toString();
        }

        this.SetScrollList = function (storeList, context) {
            var scrollList = '';
            for (i = 0; i < storeList.length; i++) {
                var templateList = '<li class=\"store-row\" id=\"{0}\">\r\n <ul class=\"store-row-content\">\r\n <li class=\"address-list-store-title\">'
                    + '{1}</li>\r\n <li class=\"address-list-store-website\">{2}</li>\r\n <li class=\"address-list-store-phone\">'
                    + '{3}</li>\r\n <li class=\"address-list-store-city\">{4}</li>\r\n </ul>\r\n </li>\r\n';
                templateList = templateList.replace('{0}', storeList[i].Store.Id);
                templateList = templateList.replace('{1}', storeList[i].Store.StoreName);
                templateList = templateList.replace('{2}', storeList[i].Store.SiteUrl);
                templateList = templateList.replace('{3}', storeList[i].Store.Phone);
                templateList = templateList.replace('{4}', storeList[i].Store.Address.replace(/"/g, ''));

                scrollList = scrollList + templateList;
            }
            $('.address-menu', context).append(scrollList);
        }

        this.SetStoreCount = function (storeLocator) {
            var count = 0;
            var storeCountText = storeLocator.Texts[9];
            $('.address-menu .store-row', storeLocator.Block).each(function () {
                if ($(this).css('display') != 'none')
                    count++;
            });
            $('.store-count', storeLocator.Block).html(storeCountText.replace('{0}', count));
        },

            this.SetStoreCountDepricated = function (count) {
                $('.store-count', this.Block).html(this.Texts[9].replace('{0}', count));
            },

            this.MoveToLocation = function (id, storeLocator) {
                return function () {
                    function getStore(id) {
                        for (var i = 0; i < storeLocator.Configuration.DisplayStores.length; i++) {
                            if (storeLocator.Configuration.DisplayStores[i].Store.Id === id)
                                return storeLocator.Configuration.DisplayStores[i].Store;
                        }
                    }
                    storeLocator.NoStoreMessageBlock.hide();
                    storeLocator.InfoWindow.close();
                    var locationObject = getStore(id);
                    storeLocator.Map.setZoom(storeLocator.Configuration.SectionForMapSettings.DefaultSearchZoomLevel);
                    var storeLocation = new google.maps.LatLng(locationObject.Latitude, locationObject.Longitude);
                    storeLocator.Map.setCenter(storeLocation);
                    if ($('.address-menu', storeLocator.Block).hasClass('mobile-scroll')) {
                        var pos = $('.map-container', storeLocator.Block).offset().top;
                        $('body, html').animate({ scrollTop: pos });
                    }
                }
            },

            this.ShowFilter = function (configuration) {
                $('.chosen-select', this.Block).chosen().on('change', filterOnChangedEvent(this));
                function filterOnChangedEvent(storeLocator) {
                    return function (event) {
                        if (event.target === this) {
                            var value = $(this).val();
                            storeLocator.Filters = [];
                            $.each(value, function (index, value) {
                                storeLocator.Filters.push(value);
                            });
                            storeLocator.ClearAll(false);
                            storeLocator.ApplyFilter();
                        }
                    };
                }
            },

            this.ShowProgress = function () {
                this.IsSomethingProgress = true;
                clearTimeout(this.IsInProgress);
                this.IsInProgress = setTimeout(function (storeLocator) {
                    if (storeLocator.IsSomethingProgress) {
                        $('#inline-loading-indicator', storeLocator.Block).show();
                        $('.store-count', storeLocator.Block).text('');
                        $('#address-menu', storeLocator.Block).hide();
                    }
                }, 100, this);
                this.NoStoreMessageBlock.hide();
            },

            this.ClearAll = function (clearNearBy) {
                this.ShowProgress();
                for (var i = 0; i < this.Markers.length; i++)
                    this.Markers[i].setVisible(false);
                if (this.MarkerCluster != null)
                    this.MarkerCluster.clearMarkers();

                this.BoundedElements = [];
                if (clearNearBy)
                    this.LocationInRange = [];
            }

        this.HideProgress = function (storeCountText) {
            $('#address-menu', this.Block).show();
            $('.store-count', this.Block).text(storeCountText);
            $('#inline-loading-indicator', this.Block).hide();
        }

        this.CreateInfoWindow = function (marker, data) {
            var openingTimeBlock = '';
            if (this.Configuration.SectionForStoreSettings.ShowOpeningTimes && hasOpenCloseHours(data)) {
                openingTimeBlock = '<li class="list-group-item i-open"><a class="expander">' + this.Texts[8] + '</a><div class="open-hours"><ul>' +
                    createOpenCloseDetails(data, this) +
                    '</ul></div></a></li>';
            }

            var infowindowTemplate = '<ul class="list-group">';
            infowindowTemplate = data.StoreName != null || data.GoogleAddress != null ? infowindowTemplate + '<li class="list-group-item i-address">' : infowindowTemplate;
            infowindowTemplate = data.StoreName != null ? infowindowTemplate + '<b>' + data.StoreName + '</b>' : infowindowTemplate;
            infowindowTemplate = data.GoogleAddress != null ? infowindowTemplate + '<br>' + data.GoogleAddress + '</li>' : '</li>';
            infowindowTemplate = data.SiteUrl != '' ? infowindowTemplate + '<li class="list-group-item i-url"><a target="_blank" href="' + data.SiteUrl + '">' + data.SiteUrl + '</a></li>' : infowindowTemplate;
            infowindowTemplate = data.Phone != '' ? infowindowTemplate + '<li class="list-group-item i-phone"><a href="tel:' + data.Phone + '">' + data.Phone + '</a></li>' : infowindowTemplate;
            infowindowTemplate = infowindowTemplate + openingTimeBlock;
            infowindowTemplate = infowindowTemplate + '<li class="list-group-item i-googleview"><a target="_blank"  href="http://maps.google.com/maps?q=' + data.Latitude + ',' + data.Longitude + '">' + this.Texts[10] + '</a></li></ul>';
            google.maps.event.addListener(marker, 'mouseover', (mouseOverEvent(this))(marker));
            google.maps.event.addListener(marker, 'click', (mouseClickEvent(this))(marker));

            function createOpenCloseDetail(text, openHours) {
                var openCloseDetail = '<li><span class="open-hr-label">{0}</span>{1}</li>';
                return openCloseDetail.replace('{0}', text).replace('{1}', openHours);
            }

            function createOpenCloseDetails(data, storeLocator) {
                return createOpenCloseDetail(storeLocator.Texts[0], formatOpenHours(data.Sunday_Open, data.Sunday_Close, storeLocator)) +
                    createOpenCloseDetail(storeLocator.Texts[1], formatOpenHours(data.Monday_Open, data.Monday_Close, storeLocator)) +
                    createOpenCloseDetail(storeLocator.Texts[2], formatOpenHours(data.Tuesday_Open, data.Tuesday_Close, storeLocator)) +
                    createOpenCloseDetail(storeLocator.Texts[3], formatOpenHours(data.Wednesday_Open, data.Wednesday_Close, storeLocator)) +
                    createOpenCloseDetail(storeLocator.Texts[4], formatOpenHours(data.Thursday_Open, data.Thursday_Close, storeLocator)) +
                    createOpenCloseDetail(storeLocator.Texts[5], formatOpenHours(data.Friday_Open, data.Friday_Close, storeLocator)) +
                    createOpenCloseDetail(storeLocator.Texts[6], formatOpenHours(data.Saturday_Open, data.Saturday_Close, storeLocator))
            }

            function mouseOverEvent(storeLocator) {
                return function (marker) {
                    return function () {
                        if (!storeLocator.InfoWindow.getMap() || storeLocator.CurrentMarkerId !== marker.id) {
                            storeLocator.InfoWindow.setContent(infowindowTemplate);
                            storeLocator.InfoWindow.open(map, marker);
                        }
                        storeLocator.CurrentMarkerId = marker.id;
                    };
                }
            }

            function mouseClickEvent(storeLocator) {
                return function (marker) {
                    return function () {
                        storeLocator.NoStoreMessageBlock.hide();
                        storeLocator.InfoWindow.setContent(infowindowTemplate);
                        storeLocator.InfoWindow.open(storeLocator.Map, marker);
                        storeLocator.Map.setCenter(marker.getPosition());
                    }
                };
            }

            function formatOpenHours(openHour, closeHour, storeLocator) {
                if (openHour == '' || openHour == undefined || closeHour == '' || closeHour == undefined)
                    return '<span class=\'sl-open-na\'>' + storeLocator.Texts[7] + '</span>';
                return '<span class=\'sl-open-na\'>' + openHour + '-' + closeHour + '</span>';
            }

            function hasOpenCloseHours(data) {
                if ((data.Sunday_Open == '' || data.Sunday_Open == undefined || data.Sunday_Close == '' || data.Sunday_Close == undefined)
                    && (data.Monday_Open == '' || data.Monday_Open == undefined || data.Monday_Close == '' || data.Monday_Close == undefined)
                    && (data.Tuesday_Open == '' || data.Tuesday_Open == undefined || data.Tuesday_Close == '' || data.Tuesday_Close == undefined)
                    && (data.Wednesday_Open == '' || data.Wednesday_Open == undefined || data.Wednesday_Close == '' || data.Wednesday_Close == undefined)
                    && (data.Thursday_Open == '' || data.Thursday_Open == undefined || data.Thursday_Close == '' || data.Thursday_Close == undefined)
                    && (data.Friday_Open == '' || data.Friday_Open == undefined || data.Friday_Close == '' || data.Friday_Close == undefined)
                    && (data.Saturday_Open == '' || data.Saturday_Open == undefined || data.Saturday_Close == '' || data.Saturday_Close == undefined)
                )
                    return false;
                return true;
            }
        }

        this.PlaceChangedEvent = function (searchBox, storeLocator) {
            return function () {
                storeLocator.ClearAll(true);
                clearTimeout(storeLocator.IsInProgress);
                clearTimeout(storeLocator.searchTextTimeOut);
                var places = searchBox.getPlaces();
                var searchText = $('#pac-input', storeLocator.Block).val();
                var geocoder = new google.maps.Geocoder();
                geocoder.geocode({ 'address': searchText }, function (results, status) {
                    if (status === 'OK')
                        places = results;
                    else
                        $('#nostore-message', storeLocator.Block).show();

                    storeLocator.SearchStores(searchText, null);
                });
                this.IsSomethingProgress = false;
            };
        }

        this.InitMap = function (block, storeLocator) {
            initStartsWithForIE();
            var settings = storeLocator.getCsvSettings(block.attr('language-name'));
            var dataSetId = block.attr('id');
            var stores = [];
            var jsonStoreList = {};
            var dataRecordId = $('input:hidden[name*= ".DataRecordId"]', block)[0].value;
            var CsvColumnCount = 28;
            Sana.Api.get('/api/v1/data-storage/StoreLocator/' + dataSetId + '/' + dataRecordId)
                .done(function (data) {
                    var storeList = data.Data.split(/\r\n|\n|\r/);
                    var headerList = storeList[0].split(settings.ListSeparator);
                    if (headerList.length < CsvColumnCount) {
                        jsonStoreList = '""';
                        storeLocator.LoadFilters({}, block, CsvColumnCount);
                    }
                    else {
                        var storeListLength = storeList.length;
                        for (var index = 1; index < storeListLength; index++) {
                            if (storeList[index] == '')
                                continue;
                            stores.push(storeLocator.StoreInitialize(storeList[index], headerList, CsvColumnCount, settings, false, storeLocator));
                        }
                        jsonStoreList = stores.join(',');
                        jsonStoreList = '[' + jsonStoreList + ']';
                        storeLocator.LoadFilters(headerList, block, CsvColumnCount);
                    }
                    setMapScript(block, storeLocator, jsonStoreList);
                }).fail(function (data) {
                    var defaultStores = $('input:hidden[name*= "hfSampleRecord"]', block)[0].value;
                    var sampleHeaderList = $('input:hidden[name*= "hfSampleHeader"]', block)[0].value.split(',');
                    jsonStoreList = '[' + defaultStores + ']';
                    storeLocator.LoadFilters(sampleHeaderList, block, CsvColumnCount);
                    setMapScript(block, storeLocator, jsonStoreList);
                });

            window.gmap_draw = function () {
                storeLocator.DisplayLanguage = block.attr('language-name');
                storeLocator.MapLoader = $(".inline-loading-indicator", block);
                storeLocator.MapLoader.show();
                storeLocator.Configuration.DisplayStores = JSON.parse(jsonStoreList);
                storeLocator.StoreListForSearch = storeLocator.Configuration.DisplayStores;
                storeLocator.SetScrollList(storeLocator.Configuration.DisplayStores, block);
                if (window.matchMedia('only screen and (max-width: 639px)').matches)
                    $('.address-menu', block).addClass('mobile-scroll');
                storeLocator.init(block, storeLocator);
                console.log('Google Maps API version : ' + google.maps.version);

                setTimeout(function () {
                    $('iframe:last', block).css('width', 'auto');
                }, 500);
            };

            function getMapVersion(block) {
                var channel = $('input:hidden[name*= ".Channel"]', block)[0].value;
                if (channel == "version")
                    return $('input:hidden[name*= ".VersionNumber"]', block)[0].value;
                return channel;
            }

            function setMapScript(block, storeLocator, jsonStoreList) {
                storeLocator.Configuration = JSON.parse(block.attr('properties'));
                var script = document.createElement('script');
                script.type = 'text/javascript';
                var mapVersion = getMapVersion(block);
                script.src = 'https://maps.googleapis.com/maps/api/js?v=' + mapVersion + '&libraries=places,geometry&key=' + storeLocator.Configuration.SectionForMapSettings.GoogleMapKey
                    + '&language=' + block.attr('txt-language') + '&region=' + block.attr('txt-region') + '&callback=gmap_draw';
                $('head').append(script);
            }

            function initStartsWithForIE() {
                if (!String.prototype.startsWith)
                    String.prototype.startsWith = function (searchString, position) {
                        position = position || 0;
                        return this.indexOf(searchString, position) === position;
                    };
            };

            window.addEventListener("resize", function () {
                $('iframe:last', block).css('width', '100%');
            }, false);
        }
    }
    return storeLocator;
})();

$(document).ready(function () {
    $('.ecb-store-locator', $('body')).each(function (index, element) {
        var storeLocator = new Sana.Extension.StoreLocator();
        storeLocator.InitMap($(element), storeLocator);
    });

    Sana.Layout.addFunction(function () {
        $('.ecb-store-locator').each(function () {
            $('.address-menu', $(this)).addClass('mobile-scroll');
        });
    }, 'MOBILE');
    Sana.Layout.addFunction(function () {
        $('.ecb-store-locator').each(function () {
            $('.address-menu', $(this)).removeClass('mobile-scroll');
        });

    }, 'TABLET');
    Sana.Layout.addFunction(function () {
        $('.ecb-store-locator').each(function () {
            $('.address-menu', $(this)).removeClass('mobile-scroll');
        });
    }, 'DESKTOP');
});
;
var Sana = Sana || {};
Sana.ActionButtons = (function () {
    var moveActionsBottom = function () {
        var $links = $('.col-info .action-links');
        $links.each(function (i, item) {
            var $target = $(item).parents('tr').find('.col-total');
            $(item).prependTo($target);
        });
    };

    var moveActionsTop = function () {
        var $links = $('.col-total .action-links');
        $links.each(function (i, item) {
            var $row = $(item).parents('tr');
            var locator = $row.hasClass('upper-row') ? '.col-info' : '.vertical-line';
            var $target = $row.find(locator);

            $(item).appendTo($target);
        });
    };

    var init = function () {
        if (Sana.Layout.layout == 'MOBILE') {
            moveActionsBottom();
        } else {
            moveActionsTop();
        }

        Sana.Layout.addFunction(moveActionsBottom, 'MOBILE');
        Sana.Layout.addFunction(moveActionsTop, 'TABLET');
        Sana.Layout.addFunction(moveActionsTop, 'DESKTOP');
    };

    return {
        init: init,
        refresh: function () {
            if (Sana.Layout.layout == 'MOBILE') {
                moveActionsBottom();
            }
        }
    };
}());;
(function () {
    var sectionName = 'AdditionalInfo',
        el = document.getElementById(sectionName);

    if (!el) return;

    var $onePageCheckout = $('#onePageCheckout'),
        OnePageCheckout = $onePageCheckout.length > 0;

    if (!OnePageCheckout) return;

    function AdditionalInfoViewModel() {
        var self = this,
            $form = $(el).find('form');

        self.getFormData = function () {
            return {
                url: $form.attr('action'),
                data: $form.serialize()
            };
        };

        Sana.CheckoutManager.addSection(sectionName, self, []);

        Sana.SmartForms.init($form, ':input', function () {
            if (!$form.valid()) {
                return false;
            }

            return Sana.CheckoutManager.notify(sectionName);
        });
    }

    var viewModel = new AdditionalInfoViewModel();
    ko.applyBindings(viewModel, el);
})();;
var Sana = Sana || {};
Sana.Address = (function () {
    var init = function () {
        var $stateRows = $('[class$=-state].form-row');
        var $stateSelects = $stateRows.find('select');
        $stateSelects.each(function () {
            var $state = $(this);
            var prefix = $state.attr('name');
            prefix = prefix.slice(0, prefix.lastIndexOf('.') - 1);

            var $country = $('[class$=-countryid] select[name^="' + prefix + '"]');
            if ($country.length == 0)
                return;

            var $stateInput = $state.parents('[class$=-state]:first').find('input[type=text]');
            $state.dependent_on($country);

            var setStateRowVisibility = function () {
                var hasOptions = $state.find('option').length > 0;
                $state.toggleClass('hide', !hasOptions).prop('disabled', !hasOptions);
                $state.parents('.ddlb:first').toggleClass('hide', !hasOptions);
                if ($stateInput.length > 0) {
                    $stateInput.toggleClass('hide', hasOptions).prop('disabled', hasOptions);
                    $stateInput.parents('.tbx:first').toggleClass('hide', hasOptions);
                    if (hasOptions)
                        $stateInput.val('');
                }
                else {
                    $state.parents('.form-row:first').toggleClass('hide', !hasOptions);
                }
            };
            setStateRowVisibility();
            $state.change(setStateRowVisibility);
        });
        $stateRows.each(function () {
            var $row = $(this);
            if ($row.hasClass('hide')) return;
            if ($row.find(':input.stub').length === 1)
                $row.addClass('hide');
        });
    };

    init();

    return {
        init: init
    };
}());;
var Sana = Sana || {};
Sana.BasketSummary = (function () {
    var selector = '#basketModalPopup';

    var get$Obj = function (){
        return $('.basket');
    };

    var onBeforeChange = function () {
        $('.basket-loading').show();
        /* Disable the possibility to click the button to avoid double click problem but keep default styling */
        $('.btn-add-to-basket').addClass('btn-disabled-ghost');
    };

    var onAfterChange = function () {
        $('.basket-loading').hide();
        /* Enable the possibility to click the button */
        $('.btn-add-to-basket').removeClass('btn-disabled-ghost');
    };

    var updateBasketAfterAdding = function () {
        $(selector).stop().removeClass('just-added').removeAttr('style').find('.added-product').show();
    };

    var showFullSummary = function () {
        setTimeout(function () {
            if (get$Obj().is(":hover")) {
                updateBasketAfterAdding();
            } else {
                $(selector).fadeOut(1000, updateBasketAfterAdding);
            }

            // Hide basket update for mobile layout
            $('.over-summary-just-changed').fadeOut(1000, function () {
                $(this).remove();
            });
        }, 2000);
    };

    var onChanged = function (data) {
        var count = parseFloat(data);
        if (isNaN(count) || count <= 0) {
            onAfterChange();
            return;
        };

        $.post(get$Obj().attr('data-src'), function (data) {
            get$Obj().html(data);
            onAfterChange();

            if (!get$Obj().is(":hover")) {
                $(selector).stop().addClass('just-added').show().fadeIn(500).find('.added-product').slice(count).hide();
                showFullSummary();
            }

            // Show basket update for mobile layout
            $('.ui-mobile .basket .over-summary').clone().addClass('over-summary-just-changed').appendTo(get$Obj()).fadeIn(500);

            $(selector).trigger('htmlUpdated');
        });
    }

    var checkForUnsavedBasketInStorage = function () {
        if (!sessionStorage.basketUrl || !sessionStorage.basketData) {
            return;
        }

        $.post(sessionStorage.basketUrl, sessionStorage.basketData).done(function (modifiedLines) {
            if (!modifiedLines.Count) {
                return;
            }

            if (get$Obj().length) {
                $.post(get$Obj().attr('data-src')).done(function (summaryRows) {
                    get$Obj().html(summaryRows);
                    $(selector).trigger('htmlUpdated');
                });
            }

            Sana.BasketDetails && Sana.BasketDetails.refreshBasket();
        });

        sessionStorage.removeItem('basketUrl');
        sessionStorage.removeItem('basketData');
    };

    checkForUnsavedBasketInStorage();

    $(document).on('mouseenter', '.basket', function () {
        $(selector).stop(true, true);
        updateBasketAfterAdding();
    });

    return {
        onBeforeChange: onBeforeChange,
        onAfterChange: onAfterChange,
        onChanged: onChanged
    };
}());;
(function () {
    var cookiesPolicyStatusKey = "cookies-policy-status",
        cookiesPolicyStatusValue = "accepted",
        monthsUntilExpirationDate = 3,
        $site = $('.site'),
        $cookiebar = $('.sana-cookiebar');

    if (!$cookiebar.length)
        return;
    
    function isCookiesPolicyAccepted() {
        return document.cookie.indexOf(cookiesPolicyStatusKey) >= 0;
    }

    function acceptCookiesPolicy() {
        setCookie(cookiesPolicyStatusKey, cookiesPolicyStatusValue, monthsUntilExpirationDate);
    }

    function setCookie(key, value, monthsUntilExpirationDate) {
        var expiredDate = new Date();
        expiredDate.setMonth(expiredDate.getMonth() + monthsUntilExpirationDate)

        var cookieTemplate = "{key}={value};expires={expires};path=/";
        var newCookieItem = cookieTemplate.replace("{key}", key)
            .replace("{value}", value)
            .replace("{expires}", expiredDate.toUTCString());

        document.cookie = newCookieItem;
    }

    function setSiteShiftForCookieBar($cookiebar) {
        var setHeight = $cookiebar.innerHeight();
        $site.css('padding-bottom', setHeight);
    };

    
    if (!isCookiesPolicyAccepted()) {
        $cookiebar.addClass('is-active');
        $(document).trigger('refreshStickyHeader.addCookieBar');
    }

    if ($cookiebar.hasClass('is-bottom')) {
        Sana.Layout.addResizeFunction(function () { setSiteShiftForCookieBar($cookiebar); });           
    }

    $cookiebar.on('click', '.btn-accept-cookies-policy', function () {
        acceptCookiesPolicy();
        $(document).trigger('refreshStickyHeader.removeCookieBar');
        $cookiebar.hide();
    });

})();;
var Sana = Sana || {};
Sana.DatePickerDropdowns = (function () {
    var init = function () {
        if (!$('.datepicker-dropdowns-value').length) {
            return;
        }
     
        var changeValue = function () {
            var $holder = $(this).parents('.datepicker-dropdowns');
            var year = parseInt($holder.find('.datepicker-Year').val());
            var month = parseInt($holder.find('.datepicker-Month').val());
            var day = parseInt($holder.find('.datepicker-Day').val());

            var $datePickerVal = $holder.find('.datepicker-dropdowns-value');
            if (!year && !month && !day) {
                $datePickerVal.val('');
                return;
            }

            var dateFormat = $datePickerVal.attr('data-date-format');
            var date = new Date(year, month - 1, day);
            var formatedDate = $.datepicker.formatDate(dateFormat, date);
            $datePickerVal.val(formatedDate);
        };

        $(document).off('change.dpd').on('change.dpd', '.datepicker-dropdowns select', changeValue);
    };

    init();

    return {
        init: init
    };
}());;
var Sana = Sana || {};
Sana.ExtraStep = (function () {
    var sectionName = 'ExtraPaymentStep',
        innerSectionSelector = '#ExtraPaymentStepContent',
        el = document.getElementById(sectionName);

    var isPaymentPage = document.getElementById('paymentPage') !== null;
    if (el === null && !isPaymentPage)
        return;

    var $extraStepContainer = null,
        onePageCheckoutMode = false,
        stepModels = [];

    if (!el) {
        $extraStepContainer = $('.additional-payment-data-block');
    } else {
        $extraStepContainer = $(el);
        onePageCheckoutMode = $extraStepContainer.closest('#onePageCheckout').length > 0;
    }

    /**
     * Registrates inner model for extra step controls.
     * @public
     * @param {string} selector The container selector.
     * @param {object} model The step model.
     */
    var add = function (selector, model) {
        if (onePageCheckoutMode) {
            if (model) {
                model.monitorChanges(function () {
                    Sana.CheckoutManager.notify(sectionName);
                });
            } else {
                $extraStepContainer.on('change', 'form ' + selector, function () {
                    if ($extraStepContainer.find('form').valid()) {
                        Sana.CheckoutManager.notify(sectionName);
                    }
                });
            }
        }

        stepModels.push({
            selector: selector,
            model: model
        });
    };

    /** 
     * Represents view model for extra step
     * @class
    */
    function ExtraStepViewModel() {
        var self = this;

        /** 
         * Gets request url and serialized data from relative form
         * @public
         * @returns {object} Object with 'url' and 'data' properties
        */
        self.getFormData = function () {
            var $form = $extraStepContainer.find('form'),
                _data = null;

            var _stepModel = _findStepModel();

            if (_stepModel.model) {
                _data = _stepModel.model.getData();
                var verificationToken = $form.find('input[name="__RequestVerificationToken"]').val();
                if (verificationToken)
                    _data["__RequestVerificationToken"] = verificationToken;
            } else {
                _data = $form.serialize();
            }

            return {
                url: $form.attr('action'),
                data: _data
            };
        };

        /**
         * Checks if current section should be visible after content update
         */
        function _checkStepVisibility() {
            var isContentPresent = $extraStepContainer.children().length > 0;

            $extraStepContainer.toggleClass('hide', !isContentPresent);
        }

        /**
         * Finds current step model for extra step
         * @return {object} A model for the current extra step.
         */
        function _findStepModel() {
            return _.find(stepModels, function (stepModel) {
                return $extraStepContainer.find(stepModel.selector).length > 0;
            });
        }

        /**
         * Notifies extension step model that html content of the extra step was reloaded
         */
        self.notifyReloaded = function () {
            var _stepModel = _findStepModel();
            if (_stepModel && _stepModel.model && _stepModel.model.onreloaded) {
                _stepModel.model.onreloaded();
            }
        };

        /** 
         * Applies additional events handlers if one page checkout is in use
         * @public
        */
        self.applyOnePageCheckoutBindings = function () {
            $extraStepContainer.on('newData', function (_event, data) {
                var _data = $(data),
                    $elementToUpdate = _data.filter('#' + sectionName);

                if ($elementToUpdate.length < 1) {
                    $elementToUpdate = _data.find(innerSectionSelector).children();
                }

                Sana.Utils.replaceElements($elementToUpdate);
                _checkStepVisibility();
                if ($elementToUpdate.length > 0)
                    self.notifyReloaded();
            });

            Sana.CheckoutManager.addSection(sectionName, self, [sectionName, 'OrderOverview']);
        };
    }

    var viewModel = new ExtraStepViewModel();

    if (!isPaymentPage) {
        if (onePageCheckoutMode) {
            viewModel.applyOnePageCheckoutBindings();
        } else {
            $extraStepContainer.find('form').on('submit', function (e) {
                e.preventDefault();
                $form = $(this);
                if (!$form.valid()) {
                    return;
                }
                Sana.UI.LoadingIndicator.show();

                $.post($form.attr('action'), viewModel.getFormData().data, function (data, e, xhr) {
                    var contentType = xhr.getResponseHeader("content-type");
                    if (contentType.indexOf('html') > -1) {
                        var $elementToUpdate = $(data).find(innerSectionSelector);
                        Sana.Utils.replaceElements($elementToUpdate);
                        if ($elementToUpdate.length > 0) {
                            viewModel.notifyReloaded();
                        }
                        Sana.UI.LoadingIndicator.hide();
                    }
                });
            });
        }
        ko.applyBindings(viewModel, el);
    }

    return {
        add: add,
        /**
         * Gets data from the current extra step form.
         * @public
         * @returns {object} Object with properties which should be saved or string with serialized form.
         */
        getExtraStepData: function () {
            return viewModel.getFormData().data;
        },
        /**
         * Notifies extension step model that HTML content of the extra step was reloaded.
         */
        notifyStepRendered: function () {
            viewModel.notifyReloaded();
        }
    };
})();;
var Sana = Sana || {};
Sana.Facets = (function () {
    var $facets = null,
        url = null,
        onBeforeChange = null;

    var resolve = function () {
        window.location.href = url;
    };

    var init = function () {
        $('.list-facets', $facets).each(function () {
            var $self = $(this),
                $btn = $self.next('.hyp-toggle');

            if ($self.find('li').length <= 5) {
                $btn.hide();
                return true;
            };

            $btn.on('click', function () {
                $self.toggleClass('limited unlimited');
            });
        });

        var onFacetSelect = function (newUrl) {
            url = newUrl;

            if ($.isFunction(onBeforeChange)) {
                $.when(onBeforeChange()).then(function () {
                    resolve();
                });
            } else {
                resolve();
            }

            return false;
        };

        $facets.find("ul li a").on("click", function () {
            var $chb = $(this).closest('li').find('[type=checkbox]'),
                url = $(this).closest('li').find('a').attr('href');

            if ($chb.length && $chb.prop('checked')) {
                url = $chb.attr('data-uncheck');
            };

            onFacetSelect(url);

            return false;
        });

        $facets.find("ul li input[type=checkbox]").on("change", function () {
            var $chb = $(this).closest('li').find('[type=checkbox]'),
                url;

            if ($chb.prop('checked')) {
                url = $(this).closest('li').find('a').attr('href');
            } else {
                url = $chb.attr('data-uncheck');
            };

            onFacetSelect(url);

            return false;
        });

    };

    return {
        init: function (callback) {
            $facets = $('.facets');
            if (!$facets.length) {
                return;
            };

            init();

            if (callback) {
                callback();
            }
        },
        onBeforeChange: function (callback) {
            onBeforeChange = callback;
        }
    };
}());;
var Sana = Sana || {};
Sana.FileUploder = (function () {
    var $uploaders = $('.uploader');
    if (!$uploaders.length) {
        return;
    }

    var selectedFiles = {};
    var initUploader = function (uploader) {
        var $uploader = $(uploader),
            $input = $uploader.find('input[type="file"]'),
            name = $input.attr('name'),
            $label = $uploader.find('label'),
            $cancel = $uploader.find('.uploader-cancel'),
            showFiles = function (files) {
                $label.find('.uploader-selected-files').text(files.length > 1 ? ($input.attr('data-val-multiple-caption') || '').replace('{0}', files.length): files[0].name);
                $uploader.addClass('is-files-selected');
            };

        selectedFiles[name] = false;
        $input.on('change', function (e) {
            var files = e.target.files;
            if (files.length) {
                selectedFiles[name] = files;
                showFiles(files);
            }
        });

        $cancel.on('click', function (e) {
            selectedFiles[name] = false;
            $label.find('.uploader-selected-files').text('');
            $uploader.removeClass('is-files-selected');
            $input.val('');
            $input.removeData('files');
        });

        $uploader
        .on('drag dragstart dragend dragover dragenter dragleave drop', function (e) {
            e.preventDefault();
            e.stopPropagation();
        })
        .on('dragover dragenter', function () {
            $uploader.addClass('is-dragover');
        })
        .on('dragleave dragend drop', function () {
            $uploader.removeClass('is-dragover');
        })
        .on('drop', function (e) {
            var files = e.originalEvent.dataTransfer.files;
            if (files.length) {
                selectedFiles[name] = files;
                showFiles(selectedFiles[name]);
                $input.val('');
                $input.data('files', files);
            }
        });
    };

    $uploaders.each(function (index, uploader) {
        initUploader(uploader);
    });

    return {
        getFiles: function (name) {
            return selectedFiles[name];
        }
    };
}());;
var Sana = Sana || {};
Sana.Footer = (function () {
    var newsletterSubscription = function () {
        var selector = '.newsletter';
        $(selector).find('form').submit(function (event) {
            var email = $(selector).find('#newsletterEmail').val();
            if (email == '') {
                event.preventDefault();
                window.location.href = $(this).attr('action');
            }
        });
    };

    newsletterSubscription();

    return {
        init: function () {
            newsletterSubscription();
        }
    };
}());;
(function () {
    var sectionName = 'GuestAddress',
        el = document.getElementById(sectionName);

    if (!el) return;

    var $el = $(el),
        $onePageCheckout = $el.closest('#onePageCheckout'),
        OnePageCheckoutMode = $onePageCheckout.length > 0;

    function GuestAddressViewModel() {
        var self = this,
            $form = $el.find('form');

        function sendRequest() {
            var formData = self.getFormData();
            return $.post(formData.url, formData.data);
        }

        function replaceCustomFields($elToUpdate) {
            Sana.Utils.replaceElements($elToUpdate);
            Sana.Address.init();
            $el.find('select')._selectmenu();
        }

        function submitForm() {
            if (!$form.valid())
                return false;

            var pendingRequestDeferred = $form.validate().pendingRequestDeferred;
            if (pendingRequestDeferred)
                return pendingRequestDeferred;

            return Sana.CheckoutManager.notify(sectionName);
        }

        var setFormElementsState = function (state) {
            var $additionalAddressContainer = $form.find('.shipping-custom .shipping-choice-content'),
                $hiddenStateField = $additionalAddressContainer.find('[class*=-state].hide :input'),
                $addressControls = $additionalAddressContainer.find(':input').not($hiddenStateField);

            $addressControls.prop('disabled', state);
        };

        self.guestSingleAddress = ko.observable();
        self.guestSingleAddress.subscribe(function (newVal) {
            setFormElementsState(newVal);
        });

        self.guestSingleAddress($form.find('#guestSingleAddress').prop('checked'));

        self.updateShippingAddressFieldsState = function () {
            setFormElementsState($form.find('#guestSingleAddress').prop('checked'));
        };

        self.getFormData = function () {
            return {
                url: $form.attr('action'),
                data: $form.serialize()
            };
        };

        self.submitStepForm = function () {
            if (!$form.valid()) {
                return false;
            }

            Sana.UI.LoadingIndicator.show();

            if (Sana.GoogleTagManager.isAvaliable()) {
                console.debug('its available, bizarrely');
                Sana.GoogleTagManager.trackCheckoutOption('custom').then(sendRequest).then(function (data, e, xhr) {
                    var contentType = xhr.getResponseHeader("content-type");
                    if (contentType.indexOf('html') > -1) {
                        var $elToUpdate = $(data).find('.shipping-custom, .shipping-default');
                        replaceCustomFields($elToUpdate);
                        self.updateShippingAddressFieldsState();
                        Sana.UI.LoadingIndicator.hide();
                    }
                });
            } else {
                sendRequest();
                self.updateShippingAddressFieldsState();
                Sana.UI.LoadingIndicator.hide();
            }
            
            return false;
        };

        self.applyOnePageCheckoutBindings = function () {
            var smartForm = Sana.SmartForms.init($form, '.shipping-choice-content :input', submitForm);

            $el.on('newData', function (event, data) {
                smartForm.deactivate();
                replaceCustomFields($(data).find('.profile-content-custom'));
                replaceCustomFields($(data).find('.shipping-choice-content-custom'));
                self.updateShippingAddressFieldsState();
                smartForm.activate();
            });

            self.guestSingleAddress.subscribe(function (newVal) {
                var anyInputFilled = _.some($form.find('.shipping-custom :input'), function (item) {
                    return !!$(item).val();
                });

                if (newVal || anyInputFilled) {
                    Sana.CheckoutManager.notify(sectionName);
                }
            });

            Sana.CheckoutManager.addSection(
                sectionName,
                self,
                [sectionName, 'ShippingMethods', 'PaymentMethods', 'ExtraPaymentStep', 'AdditionalPaymentCustomerDataCheckoutStep', 'OrderOverview']
            );
        };
    }

    var viewModel = new GuestAddressViewModel();

    if (OnePageCheckoutMode) viewModel.applyOnePageCheckoutBindings();

    ko.applyBindings(viewModel, el);
})();;
var Sana = Sana || {};
Sana.Header = (function () {
    var loginLinks = function () {
        $(document).on('click', '#unimpersonateLink, #logoutLink, #orderResultLogoutLink, .impersonate-close', function (event) {
            event.preventDefault();
            Sana.UI.LoadingIndicator.show();
            var url = $(this).attr('href');
            $.post(url, null, function (response) {
                location.reload();
            });
        });
    };

    var hdr = '.header-blocks-wrapper .language .opener, .header-blocks-wrapper .login .opener';
    var adaptLanguageAndLoginToMobile = function () {
        var $mobAccBtn = $('.mob-account-btn'),
            $btmHeader = $('.bottom-header'),
            $topAction = $('.top-action');

        $topAction.find('.language').prependTo($btmHeader);
        $topAction.find('.login').insertAfter($mobAccBtn);
        
        $(document)
            .off('._toggler', hdr)
            .on('click._toggler', hdr, function () {
                var $hdr = $(this);
                $hdr.next().stop(true, true).slideToggle(200, function () {
                    $(this).removeAttr('style');
                    $hdr.toggleClass('collapsed expanded');
                });
            }).on('click.mobAccountBtn', '.mob-account-btn', function () {
                $('header').removeClass('nav-is-opened').addClass('nav-is-closed');
                $(this).toggleClass('state-opened');
                $('.bottom-header').hide();

                $('.login .opener').trigger('click');
            });
    };

    var adaptLanguageAndLoginToDesktopAndTablet = function () {
        var $topAction = $('.top-action'),
            $btmHeader = $('.bottom-header');

        $('.middle-header > .login').appendTo($topAction);
        $btmHeader.find('.language').prependTo($topAction);
        $btmHeader
            .removeAttr('style');

        $(document).off('._toggler .mobAccountBtn');
    };

    var fixHeightOverflow = function () {
        var setHeightForElement = function (el) {
            var HEADER_HEIGHT = 62,
                cookieBarHeight = $('.sana-cookiebar.is-top:visible').outerHeight() || 0,
                hAvail = $(window).height() - HEADER_HEIGHT - el.correction - cookieBarHeight;
            if (Sana.Layout.layout == 'MOBILE') {
                hAvail = '';
            };
            $(el.selector).css('max-height', hAvail);
        };

        var elemsList = [{
            selector: '.basket-summary',
            correction: 8
        }, {
            selector: '.ui-autocomplete',
            correction: -7
        }, {
            selector: '.language.top-dropdown .summary',
            correction: 1
        }, {
            selector: '.nav-type-multi .nav-list-root',
            correction: 24
        }, {
            selector: '.nav-wrapper',
            correction: 24
        }];
        for (var i = 0; i < elemsList.length; i++) {
            setHeightForElement(elemsList[i]);
        }
    };

    var keepLanguageInsideTheScreen = function () {
        var $ddlb = $('.top-dropdown.language');
        if (!$ddlb.length) {
            return;
        }
        var isOutOfTheScreen = $(window).width() < $ddlb.offset().left + $ddlb.find('.summary').width();

        $ddlb.toggleClass('state-to-left', isOutOfTheScreen);
    };

    var keepNavigationInsideTheScreen = function () {
        var $navItems = $('.nav-item-root'),
            cssShowElementToTheLeft = 'state-to-left';
        if (Sana.Layout.layout != 'DESKTOP') {
            $navItems.removeClass(cssShowElementToTheLeft);
            return;
        };

        var turnNavItemToTheLeft = function ($elem, widthHolder) {
            var winWidth = $(window).width(),
                elemWidth = $elem.width(),
                leftPos = $elem.offset().left,
                elementIsCloserToRightSide = winWidth < elemWidth + 2 * leftPos;

            if (!elementIsCloserToRightSide) {
                return false;
            }

            var childrenWidth = 0;
            var addChildWidth = function ($parent) {
                var $children = $parent.find(widthHolder);
                if ($children.length) {
                    childrenWidth += $children.width();
                    addChildWidth($children);
                }
            };
            addChildWidth($elem);

            var elemIsOutOfScreen = winWidth < Math.max(elemWidth, childrenWidth) + leftPos;
            return elemIsOutOfScreen;
        };

        for (var i = 0; i < $navItems.length; i++) {
            var $item = $($navItems[i]);
            $item.toggleClass(cssShowElementToTheLeft, turnNavItemToTheLeft($item, '> .nav-list-sub, > .nav-item-sub > .nav-list-sub'));
        }
    };

    var initMainSearchAutocomplete = function () {
        $input = $('.tbx-main-search input');
        $input._autocomplete({
            source: function (request, response) {
                var _textHtml;
                var _imgHtml;
                var $html;
                $.ajax({
                    url: $input.attr("data-src") + "?term=" + $input.val(),
                    type: "GET",
                    success: function (data) {
                        response($.map(data, function (item) {
                            if (item.Id != null && item.Id == 'show_more_elements') {
                                var _textHtml = $('<span>', { 'class': 'suggest-text suggest-show-more' })
                            .append($('<span>', { 'class': 'suggest-title-id' }).html(Sana.Utils.highlightWords(item.Title, $input.val())))
                            .append($('<span>', { 'class': 'font-lighter font-smaller' }).text(item.Category || ''));
                            }

                            if (item.Id != null && item.Id != "Header" && item.Id != 'show_more_elements') {
                            var _imgHtml = $('<span>', { 'class': 'suggest-img' })
                                .append($('<img>', { src: item.ImageUrl, alt: item.Title }));
                            }
                            if (item.Id != null && item.Id != "Header" && item.Id != 'show_more_elements') {
                            var _textHtml = $('<span>', { 'class': 'suggest-text' })
                                .append($('<span>', { 'class': 'suggest-title-id' }).html(Sana.Utils.highlightWords(item.Title + ' - ' + item.Id, $input.val())))
                                .append($('<span>', { 'class': 'font-lighter font-smaller' }).text(item.Category || ''));
                            }
                            else {
                                if (item.Id != null && item.Id == 'show_more_elements') {
                                    var _textHtml = $('<span>', { 'class': 'suggest-text suggest-show-more' })
                                .append($('<span>', { 'class': 'suggest-title-id' }).html(Sana.Utils.highlightWords(item.Title, $input.val())))
                                .append($('<span>', { 'class': 'font-lighter font-smaller' }).text(item.Category || ''));
                                }
                                else if (item.Id != null && item.Id == 'Header') {
                                    var _textHtml = $('<span>', { 'class': 'suggest-text suggest-header' })
                               .append($('<span>', { 'class': 'suggest-title-id' }).html(Sana.Utils.highlightWords(item.Title, $input.val())))
                               .append($('<span>', { 'class': 'font-lighter font-smaller' }).text(item.Category || ''));
                                }
                                else{
                                    var _textHtml = $('<span>', { 'class': 'suggest-text suggest-default' })
                               .append($('<span>', { 'class': 'suggest-title-id' }).html(Sana.Utils.highlightWords(item.Title, $input.val())))
                               .append($('<span>', { 'class': 'font-lighter font-smaller' }).text(item.Category || ''));
                                    }
                            }

                            var $html = $('<span>', {
                                'class': 'suggest-item',
                                'data-url': item.Url,
                                'data-tracking-data': item.ProductTrackingDataModel ? JSON.stringify(item.ProductTrackingDataModel) : ''
                            });


                            if (_imgHtml) {
                            $html.append(_imgHtml);
                            }
                           
                            if (_textHtml) {
                            $html.append(_textHtml);
                            }
                            
                            setTimeout(function () {
                                $('.search-wrapper .ui-autocomplete li').each(function () {
                                    if ($(this).find('.suggest-show-more').length > 0) {
                                        $(this).addClass('li-no-hover-more');
                                    }
                                    else if ($(this).find('.suggest-header').length) {
                                        $(this).addClass('li-no-hover-header');
                                    }
                                    else {
                                        $(this).removeClass('li-no-hover');
                                    }
                                });
                            }, 100);

                            return { label: $html, value: item.Title };
                        }));
                    }
                });
            },
            select: function (event, ui) {
                event.preventDefault();
                Sana.UI.LoadingIndicator.show();

                var strTrackingData = ui.item.label.attr('data-tracking-data');
                if (strTrackingData) {
                    var objTrackingData = JSON.parse(strTrackingData);
                    Sana.GoogleTagManager.trackProductClick(objTrackingData).done(function () {
                        document.location.href = ui.item.label.attr('data-url');
                    });
                    return;
                }

                document.location.href = ui.item.label.attr('data-url');
            },
            minLength: 2,
            delay: 100
        });
    };

    var adaptMainSearchForTablet = function () {
        var $mainSearchInput = $('.search input');

        $mainSearchInput.on('focus blur', function () {
            if (Sana.Layout.layout === 'TABLET') {
                var $searchHeaderWrapper = $(this).closest('.middle-header');
                
                $searchHeaderWrapper.toggleClass('focused');
            }
        });
    };

    var supportTouchIE = function () {
        // added espacially for IE touch supporting
        // remarks: - IE does not support touchstart and etc.
        //          - after holding tap for some time only mousedown is triggered
        $(".top-dropdown").on('pointerdown', function (e) {
            $(".top-dropdown").removeClass('hover');
            if (e.pointerType == 'touch' || e.pointerType == 'pen') {
                e.stopPropagation();

                $(this).addClass('hover');
            }
        });

        $("body").on('pointerdown', function (e) {
            $(".top-dropdown.hover").removeClass('hover');
        });
    };

    var init = function () {
        loginLinks();
        initMainSearchAutocomplete();
        if(Sana.UI.isIE) supportTouchIE();

        Sana.Layout.addResizeFunction(fixHeightOverflow);
        Sana.Layout.addResizeFunction(keepLanguageInsideTheScreen);
        Sana.Layout.addResizeFunction(keepNavigationInsideTheScreen);

        if (Sana.Layout.layout == 'MOBILE') {
            adaptLanguageAndLoginToMobile();
        } else {
            adaptLanguageAndLoginToDesktopAndTablet();
        }
        Sana.Layout.addFunction(function () {
            adaptLanguageAndLoginToMobile();
        }, 'MOBILE');

        Sana.Layout.addFunction(function () {
            adaptLanguageAndLoginToDesktopAndTablet();
        }, 'TABLET');

        Sana.Layout.addFunction(function () {
            adaptLanguageAndLoginToDesktopAndTablet();
        }, 'DESKTOP');
        
        adaptMainSearchForTablet();
    };

    init();

    return {
        init: init
    };
}());;
var Sana = Sana || {};
Sana.Inputs = (function () {
    var init = function () {
        initInputFocusState();
        initNumberTextBox();
        // In in-site editor mode this initialization should wait until editor.js parse password strength messages
        setTimeout(function () {
            passwordStrengthIndication();
        }, 500);
        initHtmlSafeInputs();
    };

    var initInputFocusState = function () {
        $(document).on('focus blur', '.tbx input, .tar textarea', function (e) {
            $(this).parent().toggleClass('focused', e.type === 'focusin');
        });
    };

    var initNumberTextBox = function () {
        var $document = $(document);
        $document.on('input', 'input.integer', InputFilter.integer);
        $document.on('input', 'input.positive-integer', InputFilter.positiveInteger);
        var sepratator = Sana.Utils.formatNumber.decimalSeparator;
        InputFilter.alternateDecimalSeparator = sepratator === '.' ? ',' : sepratator;
        $document.on('input', 'input.decimal', InputFilter.decimal);
        $document.on('input', 'input.positive-decimal', InputFilter.positiveDecimal);
    };

    var passwordStrengthIndication = function () {
        var $input = $('input.password-strength');
        if (!$input.length) {
            return;
        }

        var $indicator = $input.parents('.form-row').find('.password-strength-indicator');
        var minStrength = $indicator.attr('data-min-strength');
        var $hint = $indicator.find('.password-strength-hint');
        var passwordsStrengthMessages = JSON.parse($('#data-password-strength-messages').text() || '{}');
        var defaultHint = passwordsStrengthMessages['use_a_few_words'];

        var getTooltipContent = function (suggestions, warning) {
            var $tip = $('<span/>');

            if (warning) {
                $tip.append($('<strong>', { text: warning }).add($('<br>')));
            }

            var _suggestions = '<span>' + _.reduce(suggestions, function (memo, item) {
                return memo + '<br/>' + item;
            }) + '</span>';

            $tip.append($(_suggestions));

            return $tip;
        };

        var manageFeedback = _.debounce(function (password, suggestions, warning, isScoreEnough) {
            if ($hint.tooltip("instance") === undefined)
                return;

            if (isScoreEnough) {
                $hint.tooltip('disable');
                return;
            }

            if ($hint.tooltip('option', 'disabled')) {
                $hint.tooltip('enable');
            }

            $hint.tooltip('close').tooltip({
                content: getTooltipContent(suggestions, warning)
            }).tooltip('open');

            if (!password) {
                $hint.tooltip('close');
            }
        }, 500);

        $input.on('keyup change', function () {
            var strength = zxcvbn($(this).val(), { feedback_messages: passwordsStrengthMessages }),
                isScoreEnough = strength.score >= minStrength,
                suggestions = strength.feedback.suggestions.length ? strength.feedback.suggestions : [defaultHint];

            $indicator.attr('data-strength', strength.score).toggleClass('password-strength-ok', isScoreEnough);
            manageFeedback(strength.password, suggestions, strength.feedback.warning, isScoreEnough);
        });

        $hint.tooltip({
            items: '.password-strength-hint',
            position: { my: 'right bottom-40px', at: 'right top' },
            content: getTooltipContent([defaultHint])
        });

        $(window).on("resize", _.debounce(function () {
            $hint.tooltip('close');
        }, 100));
    };

    var initHtmlSafeInputs = function () {
        var $document = $(document);
        $document.on('keypress', 'input.html-safe', InputFilter.htmlSafeCharacters);
        $document.on('paste', 'input.html-safe', function () {
            var input = $(this);
            setTimeout(function () {
                var safeString = input.val().replace(/[\<\>]|&#/g, '');
                input.val(safeString);
            });
        });
    };

    $(init);

    return {
        init: init
    };
}());;
var Sana = Sana || {};
Sana.Matrix = (function () {
    var makeHeadersSticky = function () {
        var MAX_HEIGHT = 450,
            $grid = $('.gvi-variants');

        if ($grid.height() > MAX_HEIGHT) {
            $grid.closest('.grid-inside').height(MAX_HEIGHT);
        }

        $grid.data('plugin_stickyTable')
            ? $grid.filter('.sticky-enabled').trigger('refresh')
            : $grid.stickyTable({ overflowy: true });
    };

    /* Is used on PDP page: product doesn't change, variants can be directly added to the basket */
    var staticMode = {
        inputsSelector: '.gvi-variants .tbx-quantity input[type="text"]',
        init: function () {
            staticMode.bindUomChange();
            staticMode.updateTotal();

            $(document).on('spinstop', staticMode.inputsSelector, function () {
                if ($(this).valid()) {
                    staticMode.updateTotal();
                }
            });
        },
        updateTotal: function () {
            staticMode.setValidationVisible(false);
            var quantity = staticMode.countTotal(),
                text = Sana.Utils.formatNumber(quantity);
            $('.variants-count .value').text(text);
        },
        countTotal: function () {
            var count = 0;
            $(staticMode.inputsSelector).each(function () {
                var val = Sana.Utils.parseNumber(this.value);
                if (!isNaN(val)) {
                    count += val;
                }
            });

            return Sana.Utils.roundQuantity(count);
        },
        setValidationVisible: function (visible) {
            $('#variantsValidationMsg').toggleClass('hide', !visible);
        },
        onBeforeAddToBasket: function () {
            var count = staticMode.countTotal();
            if (isNaN(count) || count <= 0) {
                staticMode.setValidationVisible(true);
                return false;
            }
            Sana.BasketSummary.onBeforeChange();
            Sana.Popup.close('#matricesPopup');
        },
        onVariantsAdded: function (data) {
            var $input = $(staticMode.inputsSelector);
            $input.val('');
            $input.removeData('PrevValue');
            staticMode.updateTotal();
            if (data && data.Count) {
                var callback = data.Url ? function () { location.href = data.Url; } : undefined;
                Sana.GoogleTagManager.trackProductAddition(data.Items, data.ActionField, data.CustomerType, callback);
            }
            Sana.BasketSummary.onChanged(data.Count);
        },
        bindUomChange: function () {
            var cssUomDropdown = '.variants select[name=unitOfMeasureId]';

            $(document).on('change', cssUomDropdown, function (e, extraData) {
                var self = $(this),
                    newUom = self.val();
                if (!newUom) {
                    newUom = extraData.newUom;
                }
                var $selectedAgreementOption = $('.ddlb-sales-agreement-lines > select:first > option:selected');
                var selectedAgreementLineNo = $selectedAgreementOption.val();
                var agreementUom = $selectedAgreementOption.attr('data-uom');
                var dataToSend = {
                    unitOfMeasureId: newUom,
                    __RequestVerificationToken: Sana.Utils.getAntiForgeryToken()
                };

                Sana.UI.LoadingIndicator.show();
                $.ajax(window.location.href, {
                    type: 'POST',
                    data: dataToSend,
                    dataFilter: function (data) {
                        return $($.parseHTML(data.trim()));
                    }
                }).done(function ($data) {
                    var dataToReplace = $data.find('.variants');
                    Sana.Utils.replaceElements(dataToReplace);
                    $(cssUomDropdown)._selectmenu();
                    makeHeadersSticky();
                    Sana.ResponsiveImages.loadAll('#matricesPopup');
                    var $agreementLineDropDown = $('.ddlb-sales-agreement-lines > select:first');
                    if (!agreementUom || newUom.toLowerCase() == agreementUom.toLowerCase()) {
                        $agreementLineDropDown.val(selectedAgreementLineNo);
                        $agreementLineDropDown.trigger('change');
                    }
                    Sana.UI.LoadingIndicator.hide();
                    Sana.UI.refreshDropDowns();
                });
            });
        }
    };

    /* Is used on PLP page: product can be changed, variants firstly is selected and then can be added to the basket */
    var dynamicMode = {
        currentProductId: null,
        uomSelector: '.variants select[name=unitOfMeasureId]',
        init: function (productId) {
            dynamicMode.currentProductId = productId;
            dynamicMode.loadVariants();
            $.validator.unobtrusive.parse('#variantMatrixPopup');
            dynamicMode.bindUomChange();
            $(dynamicMode.uomSelector)._selectmenu();
            Sana.ResponsiveImages.loadAll('#variantMatrixPopup');
        },
        onBeforeAdd: function () {
            var hidden = dynamicMode.getProductLine().find('input[name=variants]');
            var inputs = $('#variantMatrixPopup input[name$=".Key"]');
            var currentUnitOfMeasureId = $(dynamicMode.uomSelector).val();
            var variants = $.map(inputs, function (input) {
                var $input = $(input);
                var variantId = $input.val();
                var step = $input.next().attr('data-step');
                var quantity = Sana.Utils.parseNumber($input.next().val());
                var salesAgreementLineNo = Sana.Utils.getQueryVariable('salesagreementlineno');
                if (quantity > 0)
                    return {
                        productId: dynamicMode.currentProductId,
                        variantId: variantId,
                        quantity: quantity,
                        unitOfMeasureId: currentUnitOfMeasureId,
                        step: step,
                        salesAgreementLineNo: salesAgreementLineNo
                    };
            });

            var otherVariants = dynamicMode.getVariants(hidden);
            for (var i in otherVariants) {
                if (otherVariants[i].unitOfMeasureId != currentUnitOfMeasureId) {
                    variants.push(otherVariants[i]);
                }
            }

            hidden
                .val(variants.length ? JSON.stringify(variants) : '')
                .trigger('change');
            dynamicMode.updateVariantsTotal(variants);
            Sana.Popup.close("#variantMatrixPopup");
        },
        getProductLine: function () {
            return $('[data-id="' + dynamicMode.currentProductId + '"]');
        },
        getVariants: function (element) {
            var value = element.val();
            return value != '' && typeof (value) != 'undefined' ? JSON.parse(value) : null;
        },
        updateVariantsTotal: function (variants) {
            var _calculateTotalQuantity = function () {
                var quantity = 0;
                for (var i in variants) {
                    var variant = variants[i];
                    if (variant.step % 1 > 0) {
                        quantity += 1;
                    } else {
                        quantity += variant.quantity;
                    }
                }
                return quantity;
            };

            var total = _calculateTotalQuantity(),
                $productLine = dynamicMode.getProductLine();

            var $obj = $productLine.find('.selected-quantity'),
                $qty = $obj.find('.value');

            $qty.text(total);
            $productLine.toggleClass('variants-selected', total > 0);
        },
        loadVariants: function () {
            var hidden = dynamicMode.getProductLine().find('input[name=variants]');
            var variants = dynamicMode.getVariants(hidden);
            var currentUnitOfMeasureId = $(dynamicMode.uomSelector).val();

            var formatNumber = Sana.Utils.formatNumber;
            for (var key in variants) {
                var variant = variants[key];
                if (variant.quantity > 0 && variant.unitOfMeasureId === currentUnitOfMeasureId) {
                    var input = $('#variantMatrixPopup input[name$=".Key"][value="' + variant.variantId + '"]').next();
                    input.val(formatNumber(variant.quantity));
                }
            }
        },
        bindUomChange: function () {
            var cssMatrixForm = '.variants form';

            $(document).off('change.matrixUom');
            $(document).on('change.matrixUom', dynamicMode.uomSelector, function () {
                var dataToSend = $(cssMatrixForm).serialize();

                Sana.UI.LoadingIndicator.show();
                $.ajax($(cssMatrixForm).attr('action'), {
                    type: 'POST',
                    data: dataToSend,
                    dataFilter: function (data) {
                        return $($.parseHTML(data.trim()));
                    }
                }).done(function ($data) {
                    Sana.Utils.replaceElements($data);
                    $(dynamicMode.uomSelector)._selectmenu();
                    makeHeadersSticky();
                    dynamicMode.loadVariants();
                    Sana.UI.LoadingIndicator.hide();
                    Sana.ResponsiveImages.loadAll('#variantMatrixPopup');
                });
            });
        }
    };

    return {
        staticMode: {
            init: staticMode.init,
            onBeforeAddToBasket: staticMode.onBeforeAddToBasket,
            onVariantsAdded: staticMode.onVariantsAdded,
            updateTotal: staticMode.updateTotal
        },
        dynamicMode: {
            init: dynamicMode.init,
            onBeforeAdd: dynamicMode.onBeforeAdd
        },
        makeHeadersSticky: makeHeadersSticky
    };
}());;
var Sana = Sana || {};
Sana.Menu = (function () {
    function Navigation(options) {
        var self = this,
            _default = {
                activeClass: 'selected'
            };

        this.options = $.extend(_default, options);

        this.markCurrentNode = function () {
            var _index = this.getIndex();
            if (typeof _index !== 'number') return;

            $(self.options.root).eq(_index).addClass(self.options.activeClass);
        };

        this.isCurrentNode = function ($node) {
            var $link = $node.find('> a');
            if (!$link.length) {
                $link = $node.find('> div > a');
            }

            // IE Bug: sometimes window.location.origin is wrong in IE
            var origin = window.location.protocol + "//" + window.location.hostname + (window.location.port ? ':' + window.location.port : '');
            return location.pathname === encodeURI(($link.attr('href') || '').replace(origin, ''));
        };

        this.getIndex = function () {

            var checkNode = function ($node) {
                if (self.isCurrentNode($node)) {
                    return true;
                }

                var $_nodes = $node.find(self.options.child);
                if (!$_nodes.length) {
                    return false;
                }

                var res = false;
                for (var j = 0; j < $_nodes.length; j++) {
                    var _res = checkNode($_nodes.eq(j));
                    if (_res) {
                        res = true;
                        break;
                    }
                }
                return res;
            };

            var index,
                $root = $(self.options.root);

            for (var i = 0; i < $root.length; i++) {
                var _res = checkNode($root.eq(i));
                if (_res) {
                    index = i;
                    break;
                }
            }

            return index;
        };
    }

    var cssNavRoot = '.nav-list-root',
        cssNavIsHovered = 'nav-is-hovered',
        cssNavItemIsHovered = 'hover';

    var showItem = function ($obj) {
        $obj.addClass(cssNavItemIsHovered).parent().addClass(cssNavIsHovered);
        loadImageLazily();
    };

    var hideItem = function ($obj) {
        $obj.removeClass(cssNavItemIsHovered);
    };

    var unhoverMenu = function ($obj) {
        $obj.removeClass(cssNavIsHovered);
    };

    var markCurrentItem = function () {
        var menu = {
            selector: '.nav-main .nav-list-root',
            root: '.nav-main .nav-item-root',
            child: '.nav-list > .nav-item'
        };

        var $menu = $(menu.selector);
        if (!$menu.length) return;

        var nav = new Navigation(menu);
        nav.markCurrentNode();
    };

    var pointerOver = false;
    var initLaziness = function () {
        var getMenuOptions = function (settings) {
            return $.extend({
                activate: function (row) {
                    var $row = $(row);
                    hideItem($row.find('.nav-item.has-children'));
                    showItem($row);
                },
                deactivate: function (row) {
                    if (pointerOver) return;
                    hideItem($(row));
                },
                exitMenu: function (self) {
                    if (pointerOver) return;
                    unhoverMenu($(self));
                    return true;
                }
            }, settings);
        };

        // Multi and simple dropdown navigation: top items
        $('.nav-list-root').menuAim(getMenuOptions({
            submenuDirection: function () {
                if ($('header').hasClass('sticky-mode')) {
                    return "right";
                }
                return "below";
            }
        }));

        // Simple dropdown navigation: subitems
        $('.nav-type-simple .nav-list-sub').menuAim(getMenuOptions());
    };

    var handleTouchstart = function (e) {
        var $link = $(this),
            isChildOpened = $link.parent().hasClass(cssNavItemIsHovered),
            isChildExist = $link.next('.nav-list, .nav-wrapper').length,
            hideSiblingNav = function () {
                hideItem($link.parent('.nav-item').siblings());
            };

        if (!isChildExist) {
            return;
        }

        if (isChildOpened) {
            $link.data('shouldPrevent', false);
            return;
        }

        hideSiblingNav();
        showItem($link.parent());
        $link.data('shouldPrevent', true);

        $(document).off('.leaveNav').on(Sana.UI.isIE ? 'pointerover.leaveNav' : 'touchstart.leaveNav', function (e) {
            var isTouchInsideNav = $(e.target).closest('.nav-item').length;
            if (isTouchInsideNav) {
                return;
            }

            $(document).off('.leaveNav');
            hideItem($('.nav-item'));
            unhoverMenu($(cssNavRoot));
        });
    };

    var handleTouchend = function (e) {
        if ($(this).data('shouldPrevent')) {
            e.preventDefault();
        }
    };

    var bindClickOnToggleButton = function () {
        // open/close the main menu by click on toggle button
        $(document).on('click', '.nav-opener', function () {
            if (Sana.Layout.layout !== 'MOBILE') {
                $('header').toggleClass('nav-is-closed nav-is-opened');
            } else {
                var $wrapper = $('.header-blocks-wrapper .bottom-header');
                $('.mob-account-btn').removeClass('state-opened');
                $('.login .opener').removeClass('expanded').addClass('collapsed');

                if ($('header').hasClass('nav-is-closed')) {
                    $('header').toggleClass('nav-is-closed nav-is-opened');
                    $wrapper.hide().stop(true, true).slideDown(200);
                } else {
                    $wrapper.stop(true, true).slideUp(200, function () {
                        $('header').toggleClass('nav-is-closed nav-is-opened');
                    });
                }
            }
        });
    };

    var handleClickInMobileLayout = function (e) {
        var $link = $(this),
            $subMenu = $link.next('.nav-wrapper, .nav-list-sub'),
            hasChildren = $subMenu.length,
            shouldOpenLink = $(e.target).is('span') && !!$link.attr('href') && $link.attr('href') !== '#',
            toggleSubmenu = function () {
                $subMenu.stop(true, true).slideToggle(200, function () {
                    $(e.target).closest('.nav-item').toggleClass('submenu-expanded');
                });
            };

        if (shouldOpenLink || !hasChildren) {
            return;
        }

        e.preventDefault();
        toggleSubmenu();
    };

    var clearStates = function () {
        $('.nav-wrapper, .nav-list-sub').css('display', '');
        $('.nav-item').removeClass('submenu-expanded');
    };

    var loadImageLazily = function () {
        $(cssNavRoot)
        .find('img')
        .lazy({
            bind: 'event',
            effect: "fadeIn",
            visibleOnly: true,
            effectTime: 300,
            afterLoad: function (element) {
                $(element).removeClass('not-handled');
            }
        });
    };

    var init = function () {
        bindClickOnToggleButton();
        if (!$(cssNavRoot).length) {
            return;
        }

        markCurrentItem();
        clearStates();
        Sana.Layout.addFunction(function () {
            clearStates();
        }, 'ALL');

        initLaziness();

        $(document).on('click', '.ui-mobile .nav-item > a', handleClickInMobileLayout);
        $(document).on(Sana.UI.isIE ? 'pointerover' : 'touchstart', 'body:not(.ui-mobile) .nav-item > a', handleTouchstart);
        $(document).on(Sana.UI.isIE ? 'click' : 'touchend', 'body:not(.ui-mobile) .nav-item > a', handleTouchend);

        if (Sana.UI.isIE) {
            $(document).on('pointerover', 'body:not(.ui-mobile) .nav-item > a', function (e) {
                e.stopPropagation();
                if (e.pointerType == 'touch' || e.pointerType == 'pen') {
                    pointerOver = true;
                } else {
                    pointerOver = false;
                }
            });
        }
    };

    init();

    return {
        init: init,
        cssNavRoot: cssNavRoot,
        cssNavIsHovered: cssNavIsHovered
    };
}());;
(function () {
    var sectionName = 'ShippingAddress',
        el = document.getElementById(sectionName);

    if (!el) return;

    var $onePageCheckout = $('#onePageCheckout'),
        OnePageCheckoutMode = $onePageCheckout.length > 0;

    function AddressModel(data) {
        for (var key in data) {
            this[key] = data[key];
        }
        this.fullAddress = _.filter([data.Address + '<br>', data.Address2 + '<br>', data.ZipCode, data.City, data.State, data.CountryName]).join(' ');
    }

    function OrderAddressViewModel() {
        var self = this,
            $form = $(el).find('form');

        var getInitialShippingChoice = function () {
            if ($('.shipping-selected').attr('data-initial') !== undefined) {
                return 'selected';
            } else if ($('.shipping-custom').attr('data-initial') !== undefined) {
                return 'custom';
            }
            return 'default';
        };

        var setFormElementsState = function (shippingChoice) {
            var $additionalAddressContainer = $form.find('.shipping-custom .shipping-choice-content'),
                $hiddenStateField = $additionalAddressContainer.find('[class*=-state].hide :input'),
                $addressControls = $additionalAddressContainer.find(':input').not($hiddenStateField);

            switch (shippingChoice) {
                case 'default':
                case 'selected':
                    $addressControls.prop('disabled', true);
                    break;
                case 'custom':
                    $addressControls.prop('disabled', false);
                    break;
            }
        };

        self.shippingChoice = ko.observable();
        self.shippingChoice.subscribe(function (newVal) {
            setFormElementsState(newVal);
        });

        var initialShippingChoice = getInitialShippingChoice();
        self.shippingChoice(initialShippingChoice);

        self.getFormData = function () {
            var dataToSend = $form.find('[name=__RequestVerificationToken], .shipping-' + self.shippingChoice() + ' :input').not('[name=shippingChoice]').serialize();

            return {
                url: $form.attr('action'),
                data: dataToSend
            };
        };

        function sendRequest() {
            var formData = self.getFormData();

            return $.post(formData.url, formData.data);
        }

        function replaceCustomShippingAddress(data) {
            var $elToUpdate = $(data).find('.shipping-choice-content-custom');
            Sana.Utils.replaceElements($elToUpdate);
            Sana.Address.init();
            $(el).find('select')._selectmenu();
        }

        self.submitStepForm = function () {
            if (!$form.valid()) {
                return false;
            }

            Sana.UI.LoadingIndicator.show();
            Sana.GoogleTagManager.trackCheckoutOption(self.shippingChoice()).then(sendRequest().done(function (data, e, xhr) {
                var contentType = xhr.getResponseHeader("content-type");
                if (contentType.indexOf('html') > -1) {
                    replaceCustomShippingAddress(data);
                    Sana.UI.LoadingIndicator.hide();
                }
            }));
            return false;
        };

        // select shipping address from address list
        var DEFAULT_ADDRESS_COUNT = 10,
            addressesCount = $(el).find('.gvi-addresses tbody').attr('data-addresses-count') || DEFAULT_ADDRESS_COUNT,
            allAddresses = _.map(JSON.parse($('[data-shipping-addresses]').text() || '{}'), function (address) {
                return new AddressModel(address);
            });

        var getSelectedShippingAddressId = function () {
            var first = allAddresses[0] && allAddresses[0].Id;
            if (initialShippingChoice === 'selected') {
                return $('.shipping-selected [name=ShippingAddressId]').val() || first;
            }
            return first;
        };

        self.selectedShippingAddressId = ko.observable(getSelectedShippingAddressId());
        self.isMoreThanOne = allAddresses.length > 1;

        var makeSelectedItemVisible = function () {
            if (allAddresses.length <= addressesCount) {
                return;
            }

            var index = -1;
            var selectedAddress = _.find(allAddresses, function (address) {
                index++;
                return address.Id === self.selectedShippingAddressId();
            });

            if (index < addressesCount) {
                return;
            }

            allAddresses.splice(index, 1);
            allAddresses.unshift(selectedAddress);
        };

        makeSelectedItemVisible();

        self.addresses = ko.observable([]);
        var page = 0;

        var filter = function (addresses) {
            var keyword = self.keywords().toLowerCase();
            return _.filter(addresses, function (address) {
                return address.Name.toLowerCase().indexOf(keyword) !== -1 || address.fullAddress.toLowerCase().indexOf(keyword) !== -1;
            });
        };

        var sort = function (addresses, sortObj) {
            if (!sortObj) {
                return addresses;
            }

            var sorted = _.sortBy(addresses, sortObj.prop);
            if (sortObj.order === 'desc') {
                return sorted.reverse();
            }

            return sorted;
        };

        var paginate = function (addresses, count) {
            var countToShow = count * (page + 1);
            return addresses.slice(0, countToShow);
        };

        var renderList = function () {
            var filteredAddresses = filter(allAddresses);
            var sortedAddresses = sort(filteredAddresses, self.sortObj());
            var paginatedAddresses = paginate(sortedAddresses, addressesCount);
            self.addresses(paginatedAddresses);
            $('.gvi-addresses').trigger('afterHtmlChanged');
            self.hasMore(paginatedAddresses.length < filteredAddresses.length);
            page++;
        };

        self.addresses = ko.observableArray([]);
        self.empty = ko.computed(function () {
            return !self.addresses().length;
        });
        self.keywords = ko.observable('');
        self.hasMore = ko.observable(false);
        self.search = function () {
            page = 0;
            renderList();
        };
        self.onKeydown = function (data, event) {
            if (event.which === 27) {
                self.keywords('');
                return false;
            }
            return true;
        };
        self.loadMore = function () {
            renderList();
        };
        self.selectAddress = function (selectedAddress) {
            self.selectedShippingAddressId(selectedAddress.Id);
        };
        self.sortObj = ko.observable();
        self.sortByProperty = function (prop) {
            var newSort = {
                prop: prop
            };

            if (self.sortObj() && self.sortObj().order === 'asc') {
                newSort.order = 'desc';
            } else {
                newSort.order = 'asc';
            }

            self.sortObj(newSort);
            self.search();
        };
        /* css classes for sorted column: 'is-col-sort-asc' - ascending, 'is-col-sort-desc' - descending */
        self.colNameCss = ko.computed(function () {
            if (!self.sortObj() || self.sortObj().prop !== 'Name') {
                return;
            }
            return 'is-col-sort-' + self.sortObj().order;
        });
        self.colAddressCss = ko.computed(function () {
            if (!self.sortObj() || self.sortObj().prop !== 'Address') {
                return;
            }
            return 'is-col-sort-' + self.sortObj().order;
        });
        self.keywords.subscribe(_.debounce(function () {
            self.search();
        }, 300));
        self.afterApply = function () {
            self.search();
            $('.gvi-addresses').resTables();
        };

        self.applyOnePageCheckoutBindings = function () {
            var customAddressControls = '.shipping-custom .shipping-choice-content :input';
            var smartForm = Sana.SmartForms.init($form, customAddressControls, submitForm);

            function submitForm() {
                if (!$form.valid()) {
                    return false;
                }
                return Sana.CheckoutManager.notify(sectionName);
            }

            $(el).on('newData', function (event, data) {
                smartForm.deactivate();
                replaceCustomShippingAddress(data);
                smartForm.activate();
            });

            self.shippingChoice.subscribe(function (newVal) {
                if (newVal === 'default' || newVal === 'selected') {
                    submitForm();
                } else {
                    var hasValues = _.some($form.find(customAddressControls), function (item) {
                        return !!$(item).val();
                    });

                    if (hasValues) {
                        submitForm();
                    }
                }
            });

            self.selectedShippingAddressId.subscribe(function (newVal) {
                setTimeout(function () {
                    submitForm();
                });
            });

            Sana.CheckoutManager.addSection(
                sectionName,
                self,
                [sectionName, 'PaymentMethods', 'ShippingMethods', 'ExtraPaymentStep', 'AdditionalPaymentCustomerDataCheckoutStep', 'OrderOverview']
            );
        };
    }

    var viewModel = new OrderAddressViewModel();

    if (OnePageCheckoutMode) viewModel.applyOnePageCheckoutBindings();

    ko.applyBindings(viewModel, el);
})();;
var Sana = Sana || {};
Sana.OrderAuthorizationRules = (function () {
    function init() {
        var el = document.getElementById('orderAuthorizationRulesContainer');
        if (!el)
            return;

        // Fix js error 'You cannot apply bindings multiple times to the same element' that occurs after server redirect
        if (ko.dataFor(el)) {
            return;
        }

        var data = JSON.parse($('#orderAuthorizationRules').text() || '{}');
        var viewModel = new OrderAuthorizationRulesModel(data);
        ko.applyBindings(viewModel, el);
        Sana.UI.refreshValidationFor('.sub-account-holder form');
    }

    function OrderAuthorizationRulesModel(orderAuthorizationRules) {
        var self = this;
        this.orderAuthorizationRules = $.map(orderAuthorizationRules, function (line) {
            return new AuthorizerModel(line);
        });

        this.lines = ko.observableArray([]);
        for (var i = 0; i < self.orderAuthorizationRules.length; i++) {
            var line = self.orderAuthorizationRules[i];
            if (line.selected)
                self.lines.push(new OrderAuthorizationRule(line));
        }

        this.availableApproveAccounts = function (authorizerId) {
            var result = self.orderAuthorizationRules.slice(0);
            result = $.grep(result, function (el) {

                for (var i = 0; i < self.lines().length; i++) {
                    var line = self.lines()[i];
                    var lineAuthorizeId = line.authorizerId();

                    if (el.authorizerId == lineAuthorizeId && lineAuthorizeId != authorizerId) {
                        return false;
                    }
                    el.amount = 0;
                }

                return true;
            });

            return result;
        };

        this.canAdd = function () {
            var availableUsers = self.availableApproveAccounts();
            return availableUsers.length > 0;
        };

        this.add = function () {
            var availableUsers = self.availableApproveAccounts();
            self.lines.push(new OrderAuthorizationRule(availableUsers[0]));
            Sana.UI.refreshValidationFor('.sub-account-holder form');
            $('.row-orderauthorizationrules').trigger('afterHtmlChanged');
        };

        this.removeLine = function (line) {
            var url = self.authorizationCountUrl;
            $.ajax(url, {
                type: 'POST',
                data: {
                    authorizerId: line.authorizerId(),
                    subAccountId: line.subAccountId()
                }
            })
            .done(function (pendintAuthorizationCount) {
                if (pendintAuthorizationCount > 0) {
                    Sana.Popup.open('#cantRemoveAuthorizerPopup');
                } else {
                    self.lines.remove(line);
                }
            });
        };
    }

    function AuthorizerModel(obj) {
        this.id = Sana.Utils.guid();

        this.authorizerId = obj.AuthorizerId;
        this.subAccountId = obj.SubAccountId;
        this.amount = obj.Amount;
        this.name = obj.Name;
        this.currencyId = obj.CurrencyId;
        this.selected = obj.Selected;

        this.amountNameAttr = 'OrderAuthorizationRules[' + this.id + '].Amount';
        this.amountIdAttr = 'OrderAuthorizationRules_' + this.id + '__Amount';
        this.authorizerId_NameAttr = 'OrderAuthorizationRules[' + this.id + '].AuthorizerId';
        this.authorizerId_IdAttr = 'OrderAuthorizationRules_' + this.id + '__AuthorizerId';
    }

    function OrderAuthorizationRule(line) {
        this.id = Sana.Utils.guid();

        this.authorizerId = ko.observable(line.authorizerId);

        this.subAccountId = ko.observable(line.subAccountId);

        this.amount = line.amount;

        this.currencyId = line.currencyId;

        this.name = ko.observable(line.Name);

        this.amountNameAttr = 'OrderAuthorizationRules[' + this.id + '].Amount';
        this.amountIdAttr = 'OrderAuthorizationRules_' + this.id + '__Amount';
        this.authorizerId_NameAttr = 'OrderAuthorizationRules[' + this.id + '].AuthorizerId';
        this.authorizerId_IdAttr = 'OrderAuthorizationRules_' + this.id + '__AuthorizerId';
    }

    return {
        init: init
    };
})();;
(function () {
    var el = document.getElementById('SubmitOrder');
    if (!el)
        return;

    var $onePageCheckout = $('#onePageCheckout'),
        OnePageCheckoutMode = $onePageCheckout.length > 0,
        sectionName = 'OrderOverview';

    function OrderOverviewViewModel() {
        var self = this;

        // !OneStepCheckoutMode (Standart multicheckout mode)
        self.submitStepForm = function (form) {
            var $form = $(form);
            if (!$form.valid()) {
                return false;
            }

            $('.btn-order, .btn-quote', el).scButton('disable');
            Sana.UI.LoadingIndicator.show();
            return true;
        };

        // OneStepCheckoutMode
        self.handlePayClick = function (data, e) {
            function anyInvalidForm() {
                return _.any($onePageCheckout.find('form'), function (form) {
                    return !$(form).valid();
                });
            }

            function getCheckoutOptionData() {
                return [{
                    step: 1,
                    option: $onePageCheckout.find('[name=shippingChoice]').val() || 'custom'
                }, {
                    step: 2,
                    option: $onePageCheckout.find('[name=ShippingMethodId]:checked').data('name')
                }, {
                    step: 3,
                    option: $onePageCheckout.find('[name=PaymentMethodId]:checked').data('name')
                }];
            }

            function setLoadingState(loading) {
                $('.btn-order, .btn-quote', el).scButton(loading ? 'disable' : 'enable');
                loading ? Sana.UI.LoadingIndicator.show() : Sana.UI.LoadingIndicator.hide();
            }

            setLoadingState(true);

            Sana.SmartForms.wait().done(function () {
                if (anyInvalidForm()) {
                    setLoadingState(false);
                    return false;
                }

                $.when(
                    Sana.GoogleTagManager.trackCheckoutOptions(getCheckoutOptionData()),
                    Sana.GoogleTagManager.trackAdditionalCheckoutStep({ step: 4 }, !$onePageCheckout.find('#AdditionalPaymentCustomerDataCheckoutStep .checkout-step-content').length &&
                        !$onePageCheckout.find('#ExtraPaymentStep .checkout-step-content').length)
                ).then(function () {
                    $(e.target).closest('form').submit();
                });
            });
        };

        self.openTerms = function (data, event) {
            if (event.type === "keypress" && event.keyCode !== 13) {
                return true;
            }
            Sana.Popup.open('#termsPopup');
        };

        self.refreshUI = function () {
            $(".gvi-basket-overview").resTables();
        };

        self.afterApply = function () {
            $(document).on('click', '.toggle-hyp-inside .hyp', function () {
                var $basket = $('.gvi-big-basket'),
                    $body = $basket.find("tbody:first");

                if ($body.children("tr").length === 0) {
                    Sana.UI.LoadingIndicator.show();
                    var basketLinesSource = $basket.attr("data-src");
                    $.post(basketLinesSource, function (data) {
                        $body.html(data);
                        Sana.UI.LoadingIndicator.hide();
                        $basket.toggleClass('expanded collapsed');
                        if (OnePageCheckoutMode) Sana.OnePageCheckout.refreshStickyColumns();
                        $body.trigger('htmlUpdated');
                    });
                    return;
                }

                $basket.toggleClass('expanded collapsed');
                if (OnePageCheckoutMode) Sana.OnePageCheckout.refreshStickyColumns();
            });

            $(".gvi-basket-overview").resTables();
        };

        self.applyOnePageCheckoutBindings = function () {
            var $orderOverview = $('#' + sectionName);

            $orderOverview.on('newData', function (event, data) {
                var $elToUpdate = $(data).filter('#' + sectionName + ', .pay-row, .terms-text');
                Sana.Utils.replaceElements($elToUpdate);
                self.refreshUI();
            });

            Sana.CheckoutManager.addSection(sectionName, self, []);
        };
    }

    var viewModel = new OrderOverviewViewModel();

    if (OnePageCheckoutMode) viewModel.applyOnePageCheckoutBindings();

    ko.applyBindings(viewModel, el);
})();;
var Sana = Sana || {};
Sana.OrderTemplatePopup = (function () {
    var id = "#saveOrderTemplatePopup";

    var open = function (url) {
        Sana.UI.LoadingIndicator.hide();
        var container = $("#saveOrderTemplateBody");
        $.get(url, function (data) {
            container.html(data);
            Sana.Popup.open(id);
            container.find('input[type=text]:first-child').focus();
            Sana.UI.refreshValidationFor('#saveOrderTemplatePopup');
        });
    };

    var close = function () {
        $(id).dialog("close");
    };

    return {
        open: open,
        feedBack: {
            open: function (data) {
                Sana.UI.LoadingIndicator.hide();
                if (parseInt(data) == 1) {
                    close();
                    Sana.Popup.open('#saveOrderTemplateFeedbackPopup');
                }
            },
            beginSave: function () {
                Sana.UI.LoadingIndicator.show();
            }
        }
    };
}());;
var Sana = Sana || {};
Sana.Paging = (function () {
    var paging = {};

    var _selector = '.paging-control',
        _cssBtnLoadMore = '.btn-load-more',
        _cssLazyLoadMore = '.lazy-load-more',
        _cssLinks = '.paging-links',
        _cssInput = '.paging-input',
        _target,
        _pageIndex,
        _lastPage,
        historyEnabled,
        $window = $(window);

    paging.init = function () {
        var $paging = $(_selector);
        _target = '#' + $paging.attr('data-target-id');
        historyEnabled = !($paging.attr('data-history') === 'false');

        if ($paging.find(_cssLinks).length) {
            paging._linksMode();
        } else if ($paging.find(_cssBtnLoadMore).length) {
            paging._loadMoreMode();
        } else if ($paging.find(_cssLazyLoadMore).length) {
            paging._lazyMode();
        } else {
            $(".panel-footer .btn-add-inside").removeClass('hide');
        }
    };

    var setStaticData = function ($obj) {
        _lastPage = parseInt($obj.data('last-page'));
    };

    var getNextPage = function ($btn) {
        _pageIndex = parseInt($btn.attr("data-page")) + 1;
        if (!_pageIndex) {
            _pageIndex = 1;
        }
        return {
            page: _pageIndex + 1
        };
    };

    var modifyPageWithData = function (obj, replace) {
        var $newHtml = $(obj.data.trim());
        var $target = $(_target);
        var $newContainer = null;

        if (replace) {
            $newContainer = $newHtml.filter(_target);
            if ($newContainer.length) {
                $newHtml = $newContainer.children();
            }
            $target.html($newHtml);
        } else {
            $newContainer = $newHtml.find(_target);
            if ($newContainer.length) {
                $newHtml = $newContainer.children();
            }
            $target.append($newHtml);
            
			/*WELEDA-69507*/
            if($('.content-line-all').length > 0){
                if(Sana.Layout.layout == 'DESKTOP' || Sana.Layout.layout == 'TABLET'){
                    paging._columnHeightFixContentBoxes(4);
                }
                else{
                    $('.content-line-all > li').removeAttr('style');
                }
            }            
        }

        if (obj.sender && $newContainer.attr('data-last-page') !== undefined) {
            $(obj.sender).hide();
            _lastPage = _pageIndex;
        }

        $(document).trigger('pagingChange', { newHtml: $newHtml, url: obj.url, setCount: obj.setCount });
    };

    /*Fix Height on Components*/
    /*WELEDA-69507*/
    paging._columnHeightFixContentBoxes = function (colCount) {
        $('.content-line-all > li').removeAttr('style');
        var itemCount = $('.content-line-all > li').length;
        var $btn = $(_cssBtnLoadMore);
        if (itemCount % 10 != 0)
        {
            $btn.hide();
        }
        var x = 0;

        for (i = 0; i < itemCount;) {

            var maxHeightCol = -1;
            for (j = 0; j < 4; j++) {
                maxHeightCol = maxHeightCol > $('.content-line-all > li').eq(i + j).height() ? maxHeightCol : $('.content-line-all > li').eq(i + j).height();
            }
            for (h = 0; h < 4; h++) {
                $('.content-line-all > li').eq(i + h).height(maxHeightCol);
            }
            i = i + colCount;
        }
    };
    

    paging._loadMoreMode = function () {
        var $btn = $(_cssBtnLoadMore),
            _url = $btn.attr('href').replace(/(&|\?)?\bpage=\d+/i, '');

        setStaticData($btn);

        $btn.click(function () {
            Sana.UI.LoadingIndicator.show();
            $btn.addClass('loading');

            var nextPage = getNextPage($btn);
            $.get(_url, nextPage, function (data) {
                modifyPageWithData({ data: data, setCount: true, sender: $btn });

                $btn.removeClass('loading');

                if (_pageIndex !== _lastPage) {
                    $btn.attr("data-page", _pageIndex);
                } else {
                    $btn.hide();
                }
                $window.trigger('scroll.stickyAddToBasket');
                Sana.UI.LoadingIndicator.hide();
            });

            return false;
        });
    };

    paging._lazyMode = function () {
        var $obj = $(_cssLazyLoadMore),
            _url = $obj.attr('data-href').replace(/(&|\?)?\bpage=\d+/i, '');

        setStaticData($obj);

        var instance = $obj.lazy({
            threshold: 1,
            chainable: false,
            autoDestroy: false,
            productsLoader: function (element) {
                var nextPage = getNextPage($obj);
                $.get(_url, nextPage, function (data) {
                    modifyPageWithData({ data: data, setCount: true, sender: $obj });
                    if (_pageIndex !== _lastPage) {
                        $obj.data('handled', false).attr('data-loader', 'productsLoader');
                        instance.addItems($obj);
                        $obj.attr("data-page", _pageIndex);
                    } else {
                        $obj.hide();
                        $(".panel-footer .btn-add-inside").removeClass('hide');
                    }
                    $window.trigger('scroll.stickyAddToBasket');
                });
            }
        });
    };

    paging._linksMode = function () {
        var $cssInput = $(_cssInput);
        var goToPage = function (action, fromHistory) {
            Sana.UI.LoadingIndicator.show();
            $.ajax({ url: action, cache: false }).done(function (data) {
                modifyPageWithData({ data: data, url: action }, true);
                Sana.UI.LoadingIndicator.hide();
                Sana.UI.scrollToNode('#list-of-products');

                if (historyEnabled && !fromHistory) {
                    Sana.History.pushUrlParamFromString('page', action, { "action": action });
                }
            });
        };

        $(document).on('click', _cssLinks + ' a', function (event) {
            event.preventDefault();
            var action = $(this).attr('href');
            if (!action) {
                return;
            }

            if ($.isFunction(paging.onBeforeChange)) {
                $.when(paging.onBeforeChange()).then(function () {
                    goToPage(action);
                });
            } else {
                goToPage(action);
            }
        });

        if ($cssInput.length) {
            paging._inputMode().init(goToPage);
        }

        if (historyEnabled) {
            Sana.History.saveCurrentState({ "action": document.location.href });
            Sana.History.onPopstate(function (e) {
                var state = e.state;

                if (state) {
                    goToPage(state.action, true);
                }
            });
        }
    };

    paging._inputMode = function () {
        var _goToPage = null;

        var goButtonSelector = _cssInput + ' .btn-go-to-page',
            textInputSelector = _cssInput + ' .tbx-go-to-page input';

        var _callInputPager = function () {
            var pageNo = $(textInputSelector).val(),
                action = $(_cssInput).attr('data-url'),
                resultUrl = '';

            if (pageNo !== '' && pageNo.charAt(0) !== '0') {
                resultUrl = Sana.Utils.updateQueryStringParameter(action, "page", pageNo);
                _goToPage(resultUrl);
            }
        };

        return {
            init: function (callback) {
                _goToPage = callback;

                $(document)
                    .on('click', goButtonSelector, function () {
                        var $textInput = $(textInputSelector);

                        if ($textInput.val() === '') {
                            $textInput.focus();
                            return;
                        }

                        _callInputPager();
                    })
                    .on('keydown', textInputSelector, function (event) {
                        if (event.keyCode === jQuery.ui.keyCode.ENTER) {
                            _callInputPager();
                        }
                    });
            }
        };
    };

    paging.init();

    return paging;
})();;
(function () {
    var sectionName = 'AdditionalPaymentCustomerDataCheckoutStep',
        el = document.getElementById(sectionName);

    if (!el) return;

    var $onePageCheckout = $('#onePageCheckout'),
        OnePageCheckoutMode = $onePageCheckout.length > 0;

    if (!OnePageCheckoutMode) {
        return;
    }

    function PaymentCustomerDataViewModel() {
        var self = this;

        self.getFormData = function () {
            var $form = $(el).find('form');

            return {
                url: $form.attr('action'),
                data: $form.serialize()
            };
        };

        function sendRequest() {
            var formData = self.getFormData();

            return $.post(formData.url, formData.data);
        }

        function initSmartForm() {
            var $form = $(el).find('form');

            Sana.SmartForms.init($form, ':input', function () {
                if (!$form.valid()) {
                    return false;
                }

                return Sana.CheckoutManager.notify(sectionName);
            });
        }

        function checkStepVisibility() {
            var isContentPresent = $(el).find('.checkout-step-content').length;
            $(el).toggleClass('hide', !isContentPresent);
        }

        self.afterApply = function () {
            checkStepVisibility();
        };

        var $el = $(el),
            $form = $el.find('form');

        Sana.CheckoutManager.addSection(
            sectionName,
            self,
            ['OrderOverview']
        );

        $el.on('newData', function (event, data) {
            var $elToUpdate = $(data).filter('#' + sectionName);
            Sana.Utils.replaceElements($elToUpdate);
            checkStepVisibility();
            initSmartForm();
            Sana.DatePickerDropdowns.init();
            $el.find('select')._selectmenu();
        });

        initSmartForm();
    }

    var viewModel = new PaymentCustomerDataViewModel();
    ko.applyBindings(viewModel, el);
})();;
(function () {
    var sectionName = 'PaymentMethods',
        el = document.getElementById(sectionName);

    if (!el) return;

    var $onePageCheckout = $('#onePageCheckout'),
        OnePageCheckoutMode = $onePageCheckout.length > 0;

    function PaymentMethodsViewModel() {
        var self = this,
            $el = $(el);

        function sendRequest() {
            var formData = self.getFormData();
            return $.post(formData.url, formData.data);
        }

        self.getFormData = function () {
            var $form = $el.find('form');

            return {
                url: $form.attr('action'),
                data: $form.serialize()
            };
        };

        self.submitStepForm = function (form) {
            Sana.UI.LoadingIndicator.show();
            var option = $(form).find('input[name="PaymentMethodId"]:checked').data('name');
            Sana.GoogleTagManager.trackCheckoutOption(option).done(sendRequest);
            return false;
        };

        function checkStepVisibility() {
            var isContentPresent = $el.find('.gvi-methods tbody').children().length;
            if (isContentPresent)
                $el.removeClass('hide');

            var isWarningMessagePresent = $el.find('.payment-methods-not-available').length;
            if (isWarningMessagePresent)
                $el.removeClass('hide');
        }

        self.afterApply = function () {
            $el.find('.gvi-methods').resTables();
            $el.find('.checkout-text > span').tooltip();
            checkStepVisibility();
        };

        self.applyOnePageCheckoutBindings = function () {
            $el.on('change', 'input[name="PaymentMethodId"]', _.debounce(function () {
                Sana.CheckoutManager.notify(sectionName);
            }, 500));

            $el.on('newData', function (event, data) {
                var $elToUpdate = $(data).filter('#PaymentMethods');

                Sana.Utils.replaceElements($elToUpdate);
                $el.find('.gvi-methods').resTables();
                checkStepVisibility();
            });

            Sana.CheckoutManager.addSection(
                sectionName,
                self,
                [sectionName, 'AdditionalPaymentCustomerDataCheckoutStep', 'ExtraPaymentStep', 'OrderOverview']
            );
        };
    }

    var viewModel = new PaymentMethodsViewModel();

    if (OnePageCheckoutMode) viewModel.applyOnePageCheckoutBindings();

    ko.applyBindings(viewModel, el);
})();;
var Sana = Sana || {};
Sana.Popup = (function () {
    var $body = $('body');
    var open = function (selector, options) {
        var defaults = {
            draggable: false,
            resizable: false,
            width: "100%",
            minHeight: "inherit",
            modal: true,
            appendTo: '.site',
            open: function (event, ui) {
                $('.ui-dialog').find('.ui-dialog-titlebar-close').removeClass('ui-button-icon-only');
            }
        };
        var d = $(selector);
        var settings = $.extend({}, defaults, options);

        d.dialog(settings);
        d.dialog({
            close: function (event, ui) {
                if ($(".ui-dialog").hasClass("ui-dialog-scroll")) {
                    $("ui-dialog-scroll").removeClass("ui-dialog-scroll");
                    $('html')
                        .css('margin-right', 'initial')
                        .add($body)
                        .removeClass('fix-dialog-scroll-helper');
                    $body.off('touchend.popup');
                };

                d.dialog("destroy");

                if (settings.afterClose) {
                    settings.afterClose();
                };
            }
        });

        fixScroll(selector);

        d.off('click.dialog');
        d.on('click.dialog', '.btn-close-dialog', function () {
            d.dialog('instance').close();
        });
        d.data('uiDialog').overlay.on('click', function () {
            d.dialog('close');
        });
    };

    var close = function (selector) {
        var $ins = $(selector).dialog('instance');
        if ($ins) {
            $ins.close();
        }
    };

    var fixScroll = function (selector) {
        var $doc = $(document),
            $win = $(window),
            $dialogContent = $(selector),
            $dialog = $dialogContent.closest('.ui-dialog'),
            dialogHeight = $dialog.outerHeight(),
            windowHeight = $win.height(),
            // include .ui-tabs control height into calculation
            // consider this value on bottom side
            tabsHeight = ($dialog.find('.ui-tabs-tab').height() * 2) || 0;

        if (
            windowHeight < dialogHeight + tabsHeight ||
            Sana.Utils.getRoundInt(windowHeight) === Sana.Utils.getRoundInt(dialogHeight)
        ) {
            $dialog.addClass("ui-dialog-scroll").focus();
            $('html')
                .css('margin-right', Sana.Utils.getScrollbarSize())
                .add($body)
                .addClass('fix-dialog-scroll-helper');

            $body.on('touchend.popup', function () {
                var scrollTop = $win.scrollTop();
                var winHeight = $win.height();
                var docHeight = $doc.height();

                if (scrollTop + winHeight > docHeight) {
                    $win.scrollTop(docHeight - winHeight);
                } else if (scrollTop < 0) {
                    $win.scrollTop(0);
                }
            });
        }
    };

    return {
        open: open,
        close: close,
        center: function (selector) {
            var $ins = $(selector).dialog('instance');
            if ($ins) {
                $ins.option("position", { my: "center", at: "center", of: window });
                fixScroll(selector);
            }
        }
    };
}());;
var Sana = Sana || {};
Sana.ProductCompare = Sana.ProductCompare || {};

Sana.ProductCompare.Selectors = (function () {
    var querySelector = '.product-compare-selector input[type="checkbox"]';
    var tooltips = {
        getAll: function () {
            return $('.product-compare-selector label');
        },
        init: function () {
            var $tooltips = this.getAll();

            $tooltips.tooltip({
                classes: {
                    "ui-tooltip": "compare-tooltip"
                },
                position: {
                    my: "center bottom",
                    at: "center top",
                    collision: "flipfit flipfit"
                },
                close: function () { $(".ui-helper-hidden-accessible > *:not(:last)").remove(); }
            });
            this.refresh($tooltips);
        },
        refresh: function ($tooltips) {
            $tooltips = $tooltips || this.getAll();

            $tooltips.has('input[type="checkbox"]:not(.inactive)').tooltip('disable');
            $tooltips.has('input[type="checkbox"].inactive').tooltip('enable');
        }
    };

    function unselectAll() {
        $(querySelector).prop('checked', false);
    }

    function markUnselectedAsInactive() {
        $(querySelector + ':not(:checked)').addClass('inactive');
    }
    function markAllAsActive() {
        $(querySelector).removeClass('inactive');
    }

    function ghostDisableAll() {
        $(querySelector)
            .prop('disabled', true)
            .closest('label').addClass('disabled-ghost');
    }
    function ghostEnableAll() {
        $(querySelector)
            .prop('disabled', false)
            .closest('label').removeClass('disabled-ghost');
    }

    function refresh(summary) {
        var comparedSkus = summary.LineModels.map(function (lineModel) {
            return lineModel.ComparedSku;
        });

        $(querySelector).each(function () {
            var $selector = $(this);
            var checked = comparedSkus.some(function (comparedSku) {
                return $selector.attr('data-product-id') === comparedSku.ProductId;
            });

            $selector.prop('checked', checked);
        });
    }

    function onBeforeChange() {
        ghostDisableAll();
    }
    function onAfterChange(summary) {
        refresh(summary);
        ghostEnableAll();

        if (summary.LimitReached)
            markUnselectedAsInactive();
        else
            markAllAsActive();

        tooltips.refresh();
    }
    function onBeforeClear() {
        ghostDisableAll();
    }
    function onAfterClear() {
        ghostEnableAll();
        unselectAll();
        markAllAsActive();
        tooltips.refresh();
    }

    function init() {
        tooltips.init();

        $(document).on('pagingChange', function () {
            tooltips.init();
        });

        $(document).on('click', querySelector, function (e) {
            var $target = $(this);
            if ($target.is(".inactive")) {
                e.preventDefault();
                return false;
            }

            var url = this.checked ? $target.attr('data-add-url') : $target.attr('data-remove-url');
            var data = {
                comparedSku: {
                    productId: $target.attr('data-product-id')
                },
                __RequestVerificationToken: Sana.Utils.getAntiForgeryToken()
            };

            onBeforeChange();
            Sana.ProductCompare.Summary && Sana.ProductCompare.Summary.onBeforeChange();

            $.ajax({
                type: 'POST',
                url: url,
                data: data,
                beforeSend: function () {
                    Sana.UI.LoadingIndicator.showAfter(500);
                },
                complete: function () {
                    Sana.UI.LoadingIndicator.hide();
                },
                success: function (summary) {
                    onAfterChange(summary);
                    Sana.ProductCompare.Summary && Sana.ProductCompare.Summary.onAfterChange(summary);
                }
            });
        });
    }

    init();

    return {
        onBeforeChange: onBeforeChange,
        onAfterChange: onAfterChange,
        onBeforeClear: onBeforeClear,
        onAfterClear: onAfterClear,
        getSelectorsCount: function () {
            return $(querySelector).length;
        },
        initTooltips: function () {
            tooltips.init();
        }
    };
})();

Sana.ProductCompare.Summary = (function () {
    var $cnt = $('#product-compare-summary');
    if (!$cnt.length)
        return null;

    $cnt.insertAfter('.content');

    function LineModel(data) {
        var self = this;

        self.title = data.Title;
        self.url = data.Url;
        self.imageUrl = data.ImageUrl;
        self.comparedSku = data.ComparedSku;
    }

    function getTemplate(title, currentNum, newNum) {
        if (typeof EditorContext !== 'undefined')
            return title;

        var stringParts = title.split(newNum);
        if (!newNum || !currentNum || stringParts.length <= 1) {
            return title;
        } else {
            return stringParts[0] +
                '<span class="num-switch"' +
                (currentNum < newNum ? '' : ' data-invert') +
                (!currentNum || currentNum == 0 && newNum == 1 || currentNum == 1 && newNum == 0 || newNum == currentNum ? ' data-stop' : '') +
                '>' +
                '<span class="num-switch-prev">' +
                currentNum +
                '</span>' +
                '<span class="num-switch-next">' +
                newNum +
                '</span>' +
                '</span>' +
                stringParts[1];
        }
    }

    function SummaryViewModel(options) {
        var self = this;
        var currentNum = null;

        isToggled = Sana.Utils.getStoredValue('SanaComparePopupToggled');
        isToggled = isToggled === null ? null : isToggled == 'true';

        self.touched = ko.observable(isToggled !== null);
        self.toggled = ko.observable(self.touched() ? isToggled : false);

        self.toggled.extend({ notify: 'always' });
        self.toggled.subscribe(function (newValue) {
            Sana.Utils.setStoredValue('SanaComparePopupToggled', newValue);
        });

        self.lines = ko.observableArray([]);
        self.productCompareUrl = ko.observable();
        self.title = ko.observable();
        self.hide = ko.computed(function () {
            return !self.lines().length;
        });
        self.isReadonly = ko.observable(false);

        self.remove = function (line) {
            self.lines.remove(line);
            self.isReadonly(true);
            options.onBeforeRemove();

            if (self.lines().length <= 0) {
                Sana.Utils.removeStoredValue('SanaComparePopupToggled');
                $('.compare-wrp').removeClass('is-touched compare-popup-toggled');
            }

            $.post(options.removeUrl, {
                __RequestVerificationToken: Sana.Utils.getAntiForgeryToken(),
                comparedSku: line.comparedSku
            }, function (summary) {
                self.bindData(summary);
                options.onAfterRemove(summary);
                self.isReadonly(false);
            });
        };
        self.clear = function () {
            self.lines([]);
            options.onBeforeClear();
            Sana.Utils.removeStoredValue('SanaComparePopupToggled');
            $('.compare-wrp').removeClass('is-touched compare-popup-toggled');

            $.post(options.clearUrl, {
                __RequestVerificationToken: Sana.Utils.getAntiForgeryToken()
            }, function () {
                options.onAfterClear();
            });
        };

        self.bindData = function (summary) {
            self.lines(summary.LineModels.map(function (lineModel) {
                return new LineModel(lineModel);
            }));
            self.productCompareUrl(summary.ProductCompareUrl);

            var newNum = summary.Title.match(/\d+/);
            newNum = newNum && newNum[0];

            self.title(getTemplate(summary.Title, currentNum, newNum));
            currentNum = newNum;
        };

        self.headClickHandler = function (e) {
            self.toggled(self.touched() ? !self.toggled() : Sana.Layout.isRule('DESKTOP'));
            self.touched(true);
        };
    }

    var options = {
        removeUrl: $cnt.attr('data-remove-url'),
        clearUrl: $cnt.attr('data-clear-url'),
        onBeforeRemove: function () {
            Sana.UI.LoadingIndicator.showAfter(500);
            Sana.ProductCompare.Selectors.onBeforeChange();
        },
        onAfterRemove: function (summary) {
            Sana.ProductCompare.Selectors.onAfterChange(summary);
            Sana.UI.LoadingIndicator.hide();
        },
        onBeforeClear: function () {
            Sana.UI.LoadingIndicator.showAfter(500);
            Sana.ProductCompare.Selectors.onBeforeClear();
        },
        onAfterClear: function () {
            Sana.ProductCompare.Selectors.onAfterClear();
            Sana.UI.LoadingIndicator.hide();
        }
    };

    var initialData = JSON.parse($('.initial-data', $cnt).text());
    var viewModel = new SummaryViewModel(options);
    var $compareWrp = $cnt.find('.compare-wrp');
    var oldHeight = 0;

    viewModel.bindData(initialData);
    ko.applyBindings(viewModel, $cnt[0]);

    $(document)
        .on('visibilitychange', function () {
            $('.product-compare-selector label').tooltip('close');
            $('.product-compare-selector input, .product-compare-selector label').blur();
        })
        .on('touchend', '.product-compare-selector label', function (e) {
            e.stopPropagation();
            var $ths = $(this);
            var title = $ths.attr('title');
            if (title && title.length) {
                $ths.tooltip('open');
            }
        })
        .on('touchend', function (e) {
            $('.product-compare-selector label').tooltip('close');
        });

    $(window)
        .on('resize.comparesummary', function () {
            if (Sana.Layout.layout === 'MOBILE' && oldHeight !== window.innerHeight) {
                $compareWrp.css('max-height', window.innerHeight - 20);
                oldHeight = window.innerHeight;
            } else {
                $compareWrp.removeAttr('style');
            }
        });

    $(function () {
        $(window).trigger('resize.comparesummary');
    });

    return {
        onBeforeChange: function () {
            viewModel.isReadonly(true);
        },
        onAfterChange: function (summary) {
            viewModel.isReadonly(false);
            viewModel.bindData(summary);
        }
    };
})();


(function () {
    if ($('#product-compare-summary').length || Sana.ProductCompare.Selectors.getSelectorsCount() !== 0) {
        window.addEventListener('pageshow', function (e) {
            if (e.persisted) {
                window.location.reload();
                return;
            }

            Sana.ProductCompare.Selectors && Sana.ProductCompare.Selectors.onBeforeChange();
            Sana.ProductCompare.Summary && Sana.ProductCompare.Summary.onBeforeChange();

            $.ajax({
                type: 'POST',
                url: '/productcompare/summary',
                success: function (summary) {
                    Sana.ProductCompare.Selectors && Sana.ProductCompare.Selectors.onAfterChange(summary);
                    Sana.ProductCompare.Summary && Sana.ProductCompare.Summary.onAfterChange(summary);
                }
            });
        });
    }
})();;
/// <reference path="libraries/jquery.js" />
var Sana = Sana || {};
Sana.ProductConfigurator = (function () {
    var $configurator;
    var getHostName = function (url) {
        if (!url)
            return '';

        var i = url.indexOf(':');
        i = url.indexOf('/', i + 3);
        return url.substring(0, i);
    };

    var start = function (startContext) {
        startContext.onStart();
        $.post(startContext.url, startContext.data)
            .done(function (result) {
                var $frame = $('<iframe></iframe>');
                $frame.attr('src', result.configuratorUrl);
                $frame.data('saveConfigurationUrl', result.saveConfigurationUrl);
                $frame.data('saveCallback', startContext.saveCallback);

                $configurator.append($frame);
                Sana.Popup.open($configurator, { afterClose: startContext.onPopupClose });
            })
            .fail(function () {
                startContext.onFail();
            })
            .always(function () {
                startContext.onFinish();
            });
    };

    var init = function () {
        $configurator = $('<div id="product_configurator_cnt" style="display: none;" class="product-configurator-cnt"></div>');
        $configurator.appendTo('.site');

        $('.btn-configure-product.btn-disabled, .hyp-configure-product.btn-disabled').tooltip({
            position: {
                my: 'center top',
                at: 'center bottom',
                collision: 'flipfit flipfit'
            }
        });

        window.addEventListener('message', function (e) {
            var $frame = $configurator.find('iframe');
            if (!$frame.size())
                return;

            var configuratorHost = getHostName($frame.attr('src'));
            if (e.origin.toLowerCase() !== configuratorHost.toLowerCase()) {
                var errMsg = "Message from configurator iframe has been received but will not be processed "
                    + "because the origin of the message and iframe's host URL do not match: "
                    + "origin " + e.origin
                    + ", iframe host " + configuratorHost;

                console.log(errMsg);
                return;
            }

            var saveUrl = $frame.data('saveConfigurationUrl');
            var saveCallback = $frame.data('saveCallback');
            var dataStr = (typeof e.data === 'string' || e.data instanceof String) ? e.data : JSON.stringify(e.data);
            var form = {
                data: dataStr
            };
            Sana.UI.LoadingIndicator.show();
            $.post(saveUrl, form)
                .done(function (result) {
                    $.post(result.nextUrl).done(function (data) {
                        Sana.Popup.close($configurator);
                        saveCallback(data);
                    });
                })
                .always(function () {
                    Sana.UI.LoadingIndicator.hide();
                });
        });

        $(document).on('click', 'button.btn-configure-product', function () {
            var $btn = $(this);
            var $form = $btn.closest('form');
            if ($form && !$form.valid() || $btn.hasClass('btn-disabled'))
                return;

            var errorMessage = $btn.attr('data-error-message');
            var startContext = {
                url: $btn.attr('data-start-url'),
                data: {
                    productId: $btn.attr('data-product-id'),
                    configuratorExtensionId: $btn.attr('data-configurator-id'),
                    configuratorModelId: $btn.attr('data-configurator-model-id'),
                    quantity: $('input[name="quantity"]').val(),
                    unitOfMeasureId: $('select[name="unitOfMeasureId"] option:selected').val()
                },
                saveCallback: function (data) {
                    if (data && data.Count) {
                        if (data.Items)
                            Sana.GoogleTagManager.trackProductAddition(data.Items);

                        Sana.BasketSummary.onChanged(data.Count);
                    }
                    else
                        Sana.BasketSummary.onAfterChange();

                    if (data.Url)
                        window.location.replace(data.Url);
                },
                onStart: function () { $btn.addClass('loading'); },
                onFail: function () {
                    $btn.addClass('btn-disabled')
                        .attr('title', errorMessage)
                        .tooltip({
                            position: {
                                my: 'center top',
                                at: 'center bottom',
                                collision: 'flipfit flipfit'
                            }
                        });

                    if ($btn.is(':hover'))
                        $btn.tooltip("open");
                },
                onFinish: function () { $btn.removeClass('loading'); },
                onPopupClose: function () {
                    $configurator.find('iframe').remove();
                }
            };

            start(startContext);
        });

        $(document).on('click', '.hyp-configure-product', function (e) {
            var $btn = $(this);
            if ($btn.hasClass('btn-disabled'))
                return false;

            var errorMessage = $btn.attr('data-error-message');
            var startContext = {
                url: $btn.attr('data-edit-url'),
                data: {},
                saveCallback: function (data) {
                    if (data && data.Count) {
                        if (data.Items)
                            Sana.GoogleTagManager.trackProductAddition(data.Items);

                        Sana.BasketDetails.refreshBasket();
                    }
                },
                onStart: function () { Sana.UI.LoadingIndicator.show(); },
                onFail: function () {
                    $btn.addClass('btn-disabled')
                        .attr('title', errorMessage)
                        .tooltip({
                            position: {
                                my: 'center top',
                                at: 'center bottom',
                                collision: 'flipfit flipfit'
                            }
                        });

                    if ($btn.is(':hover'))
                        $btn.tooltip("open");
                },
                onFinish: function () { Sana.UI.LoadingIndicator.hide(); },
                onPopupClose: function () {
                    $configurator.find('iframe').remove();
                }
            };

            start(startContext);
        });
    };

    return {
        init: init
    };
}());;
/// <reference path="sana.responsive.js" />
var Sana = Sana || {};
Sana.ProductsGroup = (function () {
    var $flow,
        freezed = false;

    var createCarousel = function (customOptions) {
        if ($flow.is('.slick-initialized')) {
            return;
        }

        var options = {
            dots: true,
            arrows: false,
            infinite: false,
            mobileFirst: true,
            responsive: [
                {
                    breakpoint: 1024,
                    settings: {
                        slidesToShow: 4,
                        slidesToScroll: 4
                    },
                    refresh: true
                },
                {
                    breakpoint: 700,
                    settings: {
                        slidesToShow: 3,
                        slidesToScroll: 3
                    },
                    refresh: true
                },
                {
                    breakpoint: 640,
                    settings: {
                        slidesToShow: 2,
                        slidesToScroll: 2
                    },
                    refresh: true
                }
            ]
        };

        options = _.extend(options, customOptions);
        
        $flow.slick(options);
    };


    return {
        init: function (scope, customOptions) {
            $flow = $('.products-group', scope);
            if (!$flow.length) {
                return;
            }

            createCarousel(customOptions);

            freezed = false;
        },
        destroy: function () {
            $flow.slick('unslick');
            freezed = true;
        }
    };
}());;
var Sana = Sana || {};
Sana.QuickOrder = (function () {
    var el = document.getElementById('quickOrder');
    if (!el)
        return;

    function QuickOrderViewModel() {
        var self = this;

        var refreshSelectBoxes = function () {
            $('#quickOrder .ddlb select')._selectmenu('refresh');
        };

        var ProductModel = function (data) {
            this.id = data.Id;
            this.title = data.Title;
            this.url = data.DetailsUrl;
            this.isProductConfigurable = data.IsProductConfigurable;
            this.unitsOfMeasure = $.map(data.UnitsOfMeasure, function (val) {
                return {
                    id: val.Id,
                    title: val.Title,
                    quantity: {
                        minimum: val.Quantity.Minimum,
                        maximum: val.Quantity.Maximum,
                        step: val.Quantity.Step,
                        current: val.Quantity.Current
                    }
                };
            });
            this.trackingData = data.ProductTrackingDataModel;
        };

        var _variants;
        self.componentGroups = [];

        self.quickOrderForm = ko.observable();

        self.request = ko.observable();
        self.isInputActivated = ko.observable(false);
        self.productNotFound = ko.observable(false);

        self.product = ko.observable();
        self.components = ko.observable();
        self.quantity = ko.observable();
        self.selectedUom = ko.observable();
        self.defaultUomTitle = ko.observable();
        self.quantityStep = ko.observable(1);
        self.minimumQuantity = ko.observable();
        self.maximumQuantity = ko.observable();

        self.unitOfMeasureAvailable = ko.computed(function () {
            var product = self.product();
            return product && product.unitsOfMeasure && product.unitsOfMeasure.length;
        });

        self.request.subscribe(function () {
            self.productNotFound(false);
        });

        self.onSearchSubmit = function () {
            self.searchProduct();
            return false;
        };

        self.validationMessagePattern = ko.observable();
        self.minimumValidationMessagePattern = ko.observable();
        self.maximumValidationMessagePattern = ko.observable();

        self.validationMessage = ko.computed(function () {
            var pattern = self.validationMessagePattern();
            if (!pattern) return '';
            pattern = pattern.replace(/\{0\}/g, self.quantityStep());
            return pattern;
        });

        self.minimumValidationMessage = ko.computed(function () {
            var pattern = self.minimumValidationMessagePattern() || '';
            return pattern.replace(/\{0\}/g, self.minimumQuantity());
        });

        self.maximumValidationMessage = ko.computed(function () {
            var pattern = self.maximumValidationMessagePattern() || '';
            return pattern.replace(/\{0\}/g, self.maximumQuantity());
        });

        var _getUomById = function (id) {
            if (!self.unitOfMeasureAvailable() || id == null) {
                return {
                    id: id,
                    title: '',
                    quantity: {
                        minimum: 1,
                        maximum: 99999,
                        step: 1,
                        current: 1
                    }
                };
            }

            id = id.toUpperCase();
            return $.grep(self.product().unitsOfMeasure, function (n) { return n.id.toUpperCase() === id; })[0];
        };

        self.selectedUom.subscribe(function (newValue) {
            var qty = _getUomById(newValue).quantity;
            self.quantityStep(qty.step);
            self.minimumQuantity(qty.minimum);
            self.maximumQuantity(qty.maximum);
            self.quantity(Sana.Utils.formatNumber(qty.current));
            var $bindedForm = self.quickOrderForm();
            var validator = $bindedForm.data('validator');
            $bindedForm.refreshValidation();
            if (validator && validator.errorList.length) {
                $bindedForm.valid();
            }
        });

        var _buildComponentGroups = function (data) {
            var componentsCollection = data.VariantComponents,
                variantsCollection = data.Variants;

            if (componentsCollection.length) {
                // Product with variants
                self.componentGroups = $.map(componentsCollection, function (val, i) {
                    return {
                        options: $.map(componentsCollection[i].Components, function (val) {
                            return { id: val.Id, title: val.Title };
                        }),
                        selected: val.Components[0].Id
                    };
                });
            } else {
                if (variantsCollection.length) {
                    // Product has variants but without components, so componentGroups is created from variants
                    self.componentGroups = [{
                        options: $.map(variantsCollection, function (val) {
                            return { id: val.Id, title: val.Title };
                        }),
                        selected: variantsCollection[0].Id
                    }];
                } else {
                    // Simple product without variants
                    self.componentGroups = [];
                }
            }

            var obj = $.map(self.componentGroups, function (val) {
                return {
                    options: ko.observableArray(val.options),
                    selected: ko.observable(val.selected)
                };
            });

            self.components(obj);
        };

        var _buildVariants = function (data) {
            _variants = $.map(data.Variants, function (val) {
                return {
                    id: val.Id,
                    components: val.Components
                };
            });
        };

        var _bindChanges = function () {
            var groups = self.components();
            for (var i = 0; i < groups.length - 1; i++) {
                groups[i].selected.subscribe(function () {
                    _rebuildRelations();
                    refreshSelectBoxes();
                }, this);
            }
        };

        var _rebuildRelations = function () {
            var getOptionsAvailableFor = function (selectedComponents, componentGroup) {
                var newOptions = [];

                for (var i = 0; i < componentGroup.options.length; i++) {
                    var availableVariants = _variants;
                    for (var j = 0; j < selectedComponents.length; j++) {
                        availableVariants = $.grep(availableVariants, function (v) {
                            return v.components[j].Value === selectedComponents[j];
                        });
                    }

                    var currentOption = componentGroup.options[i];
                    var availableVariant = $.grep(availableVariants, function (v) {
                        return v.components[selectedComponents.length].Value === currentOption.id;
                    })[0];

                    if (availableVariant) {
                        newOptions.push(currentOption);
                    }
                }

                return newOptions;
            };

            if (self.componentGroups.length <= 1)
                return true;

            var selectedComponents = [];
            for (var k = 1; k < self.componentGroups.length; k++) {
                var components = self.components();
                var selectedComponent = components[k - 1].selected();
                selectedComponents.push(selectedComponent);
                var availableOptions = getOptionsAvailableFor(selectedComponents, self.componentGroups[k]);
                var currentComponent = components[k];
                currentComponent.options(availableOptions);
            }
        };

        var _buildProductView = function (data) {
            var product = new ProductModel(data);
            self.product(product);

            _buildComponentGroups(data);
            _buildVariants(data);

            var defaultUom = _getUomById(data.DefaultUnitOfMeasureId);
            self.selectedUom(null);
            self.selectedUom(defaultUom.id);
            self.defaultUomTitle(defaultUom.title);

            _rebuildRelations();
            _bindChanges();
        };

        self.searchProduct = function () {
            self.product(null);

            if (!self.request()) {
                return;
            }

            Sana.UI.LoadingIndicator.show();
            $.post($('.qo-input-area form').attr('action'), { term: self.request() }, function (data) {
                Sana.UI.LoadingIndicator.hide();
                if (!data) {
                    self.productNotFound(true);
                    return;
                }

                _buildProductView(data);

                $('#quickOrder .ddlb select')._selectmenu();
                $("#quickOrder .ui-autocomplete-input")._autocomplete("close");
                self.quickOrderForm().refreshValidation();
            });
        };

        var _createProductLine = function () {
            var line = {};

            line.productId = self.product().id;
            line.quantity = Sana.Utils.parseNumber(self.quantity());
            line.unitOfMeasureId = self.selectedUom();
            line.isPrepack = false;

            var components = self.components();
            var availableVariants = _variants;
            for (var i = 0; i < availableVariants.length; i++) {
                var res = availableVariants[i];
                if (res.components.length) {
                    for (var j = 0; j < components.length; j++) {
                        if (res.components[j].Value !== components[j].selected()) {
                            res = null;
                            break;
                        }
                    }
                } else {
                    if (res.id !== components[0].selected()) {
                        res = null;
                    }
                }

                if (res) {
                    line.variantId = res.id;
                    break;
                }
            }

            return line;
        };

        self.quickOrderSubmitForm = function (formElement) {
            if (!$(formElement).valid()) {
                return;
            }

            var line = _createProductLine();
            $(self).trigger('addQuickOrderLine', [line]);
        };

        self.afterLineAdded = function () {
            self.isInputActivated(true);
            var qt = _getUomById(self.selectedUom()).quantity.current;
            self.quantity(Sana.Utils.formatNumber(qt));
        };
    }

    var viewModel = new QuickOrderViewModel();
    ko.applyBindings(viewModel, el);

    return {
        viewModel: viewModel,
        init: function () {
            var $obj = $('input[name="productInput"]');
            $obj._autocomplete({
                source: function (request, response) {
                    $.ajax({
                        url: $obj.attr("data-src") + "?term=" + $obj.val(),
                        type: "GET",
                        success: function (data) {
                            response($.map(data, function (item) {
                                var label = item.Id + " - " + item.Title;
                                var _html = Sana.Utils.highlightWords(label, $obj.val());

                                return { label: _html, originalLabel: label, value: item.Id };
                            }));
                        }
                    });
                },
                select: function (event, ui) {
                    viewModel.request(ui.item.originalLabel);
                    viewModel.searchProduct();
                    event.preventDefault();
                }
            });
        },
        setFocus: function () {
            $('#quickOrder .tbx-search input').select();
            viewModel.afterLineAdded();
        }
    };
}());;
var Sana = Sana || {};
Sana.ResponsiveImages = (function () {
    var _instance = null,
        ignore = '.custom-lazy, .custom-lazy img';

    var init = function () {
        var $images = $('img[data-src], [data-bg-src]').not(ignore);

        // responsive
        $images.resImages({ attribute: 'data-original' });

        // lazy loading
        _instance = $images.lazy({
            attribute: 'data-original',
            threshold: 1,
            effect: "fadeIn",
            effectTime: 300,
            chainable: false,
            autoDestroy: false,
            onError: function ($element) {
                $element.off('.lazy');
                $element.attr('src', $element.attr('data-original'));
            }
        });
    };

    var add = function (scope) {
        var $images = $('img[data-src], [data-bg-src]', scope);

        $images.resImages({ attribute: 'data-original' });

        if (_instance) {
            _instance.addItems($images);
            _instance.update();
        }
    };

    var refresh = function () {
        var $images = $('img[data-src], [data-bg-src]').not(ignore);

        var $handledImages = $images.filter(function () {
            return $(this).data('handled');
        });
        if ($handledImages.length) {
            $handledImages.data('resImage').settings.attribute = 'src';
            $handledImages.resImages('refresh');
        }

        var $unhandledImages = $(_instance && _instance.getItems());
        if ($unhandledImages.length) {
            var dataResIm = $unhandledImages.data('resImage');
            if (dataResIm) {
                dataResIm.settings.attribute = 'data-original';
                $unhandledImages.resImages('refresh');
            }
        }
    };

    Sana.Layout.addFunction(_.debounce(function () {
        refresh();
    }, 300), 'ALL');

    $(document).on('htmlUpdated', function (e, data) {
        // process images in new html
        add(e.target);
    });

    $(document).on('afterChange', function () {
        // force lazy loading plugin to process image
        if (_instance) {
            _instance.update();
        }
    });

    init();

    return {
        init: init,
        loadAll: function (container) {
            var $images = $(container).find('img[data-src], [data-bg-src]');
            if (!$images.length) {
                return;
            }

            $images.resImages({ attribute: 'data-original' });
            $images.lazy({
                attribute: 'data-original',
                bind: "event",
                effect: "fadeIn",
                effectTime: 300,
                chainable: false
            }).loadAll();
        }
    };
}());;
var Sana = Sana || {};
Sana.ScrollTopButton = (function () {
    var el = document.querySelector('.btn-scroll-top');

    if (!el) return;

    $(function () {
        var $window = $(window),
            initialHeight = $window.height() / 2,
            $scrollButton = $(el);

        var toggleScrollTopButton = function () {
            $scrollButton.toggleClass('show', initialHeight <= $window.scrollTop());
        };

        $scrollButton
            .on('mouseover', function () {
                $scrollButton.addClass('hover');
            })
            .on('mouseout', function () {
                $scrollButton.removeClass('hover');
            })
            .on('click', function () {
                $scrollButton
                    .removeClass('hover')
                    .attr('aria-pressed', true);

                Sana.UI.scrollToNode('body', 0, function () {
                    $scrollButton.attr('aria-pressed', false);
                });
            });

        $window.on('scroll.vertical', _.throttle(toggleScrollTopButton, 300));
        // Mozilla fix, call button appering toggle if page reloaded
        toggleScrollTopButton();
    });
}());;
(function () {
    var sectionName = 'ShippingMethods',
        el = document.getElementById(sectionName);

    if (!el) return;

    var $onePageCheckout = $('#onePageCheckout'),
        OnePageCheckoutMode = $onePageCheckout.length > 0,
        $el = $(el);

    function ShippingMethodsViewModel() {
        var self = this;

        function sendRequest() {
            var formData = self.getFormData();
            return $.post(formData.url, formData.data);
        }

        self.getFormData = function () {
            var $form = $el.find('form');

            return {
                url: $form.attr('action'),
                data: $form.serialize()
            }
        }

        self.submitStepForm = function (form) {
            Sana.UI.LoadingIndicator.show();
            var option = $(form).find('input[name="ShippingMethodId"]:checked').data('name');
            Sana.GoogleTagManager.trackCheckoutOption(option).done(sendRequest);
            return false;
        };

        self.afterApply = function () {
            $el.find('.gvi-methods').resTables();
        };

        var updateShippingMethodPrice = function ($methodRow, priceMarkup) {
            $methodRow.find('.col-method-cost').html(priceMarkup);
        };

        var restoreRows = function () {
            $('.pickup-locations-wrapper').hide();
            $('.has-pickup-locations').removeClass('is-selected');
        };

        var showPickupLocations = function ($shippingMethodRow, fetchUrl, shippingMethodId) {
            var $locationsWrapper = $shippingMethodRow.next('.pickup-locations-wrapper'),
                isFetched = $locationsWrapper.hasClass('is-fetched'),
                deferred = $.Deferred();

            $locationsWrapper.show();

            if (isFetched) {
                deferred.resolve($locationsWrapper);
            } else {
                $.post(fetchUrl, {
                    "__RequestVerificationToken": Sana.Utils.getAntiForgeryToken(),
                    shippingMethodId: shippingMethodId
                }).done(function (response) {
                    var $pickupLocations = $(response);
                    var isPickupLocationsData = $pickupLocations.hasClass('gvi-pickup-locations');
                    if (!isPickupLocationsData) {
                        deferred.reject();
                        return;
                    }
                    
                    $locationsWrapper.addClass('is-fetched').find('td').html(response);
                    deferred.resolve($locationsWrapper);
                }).fail(function () { 
                    $locationsWrapper.find('td').html('');
                    deferred.resolve($locationsWrapper);
                });
            }

            return deferred.promise();
        };

        var setPickupLocationChoise = function ($methodsWrapper, id) {
            var $pickupLocationIdHolder = $('input[name="PickupLocationId"]', $methodsWrapper);
            if ($pickupLocationIdHolder.val() == id)
                return;

            $pickupLocationIdHolder.val(id);
            triggerShippingOptionChanged();
        }

        var triggerShippingOptionChanged = function () {
            if (OnePageCheckoutMode) {
                $el.trigger('shippingOptionChanged');
            }
        }

        var onShippingMethodSelect = function ($methodRow, methodId, initialLoading) {
            if ($methodRow.length === 0)
                return;

            var fetchUrl = $methodRow.closest('#shippingMethodsTable').attr('data-shipping-options-url'),
                hasPickupLocations = $methodRow.hasClass('has-pickup-locations'),
                $methodsWrapper = $methodRow.closest('.gvi-methods-wrapper');

            restoreRows();

            if (hasPickupLocations) {
                $methodRow.addClass('is-selected'); // hide bottom border and decrease bottom padding fot all <td>-s

                showPickupLocations($methodRow, fetchUrl, methodId)
                    .done(function ($locationsWrapper) {
                        var $selectedLocationHolder = $('input[name^="SelectedPickupLocationId_"]:checked', $locationsWrapper);
                        onLocationSelect($selectedLocationHolder.closest('tr'));

                        if (!initialLoading) {
                            var $scrollTo = $selectedLocationHolder.length ? $selectedLocationHolder : $methodRow;
                            Sana.UI.scrollToNodeIfHidden($scrollTo);
                        }
                    })
                    .fail(function () {
                        window.location.reload();
                    });
            } else {
                setPickupLocationChoise($methodsWrapper, '');
                if (!initialLoading)
                    Sana.UI.scrollToNodeIfHidden($methodRow);

                triggerShippingOptionChanged();
            }
        }

        var onLocationSelect = function ($locationRow) {
            var $methodRow = $locationRow.closest('.pickup-locations-wrapper').prev('.has-pickup-locations'),
                priceHtml = $locationRow.find('.col-pickup-location-cost').html(),
                $methodsWrapper = $locationRow.closest('.gvi-methods-wrapper');

            updateShippingMethodPrice($methodRow, priceHtml);

            var $selectedLocationHolder = $('input[name^="SelectedPickupLocationId_"]:checked', $locationRow);

            setPickupLocationChoise(
                $methodsWrapper,
                $selectedLocationHolder.val(),
                $selectedLocationHolder.data('address')
            );
        }

        var initDefaultShippingOption = function () {
            var $checkedRadio = $el.find('input[name=ShippingMethodId]:checked'),
                $selectedMethodRow = $checkedRadio.closest('tr'),
                selectedMethodId = $checkedRadio.val();

            onShippingMethodSelect($selectedMethodRow, selectedMethodId, true);
        }

        self.bindShippingMethodSelection = function () {
            initDefaultShippingOption();

            $el.on('change', 'input[name=ShippingMethodId]', function (event) {
                var $target = $(event.target),
                    methodId = $target.val(),
                    $methodRow = $target.closest('tr');

                onShippingMethodSelect($methodRow, methodId);
            });

            $el.on('change', 'input[name^="SelectedPickupLocationId_"]', function (event) {
                var $target = $(event.target),
                    $locationRow = $target.closest('tr');

                onLocationSelect($locationRow);
            });
        };

        self.applyOnePageCheckoutBindings = function () {
            $el.on('shippingOptionChanged', _.debounce(function () {
                Sana.CheckoutManager.notify(sectionName);
            }, 500));

            $el.on('newData', function (event, data) {
                var $elToUpdate = $(data).filter('#ShippingMethods').find('.gvi-methods-wrapper'),
                    $oldMethod = $el.find('input[name="ShippingMethodId"]:checked'),
                    $newMethod = $elToUpdate.find('input[name="ShippingMethodId"]:checked'),
                    oldValue = $oldMethod.length && $oldMethod.val(),
                    newValue = $newMethod.length && $newMethod.val();

                Sana.Utils.replaceElements($elToUpdate);
                initDefaultShippingOption();

                if (newValue && !oldValue)
                    sendRequest();
            });

            Sana.CheckoutManager.addSection(
                sectionName,
                self,
                ['ExtraPaymentStep', 'OrderOverview', 'PaymentMethods']
            );
        };
    }

    var viewModel = new ShippingMethodsViewModel();

    viewModel.bindShippingMethodSelection();
    if (OnePageCheckoutMode) viewModel.applyOnePageCheckoutBindings();

    ko.applyBindings(viewModel, el);
})();;
var Sana = Sana || {};
Sana.Sorting = (function () {
    var selector = '.ddlb-sorting select',
        originalValue = null,
        newValue = null,
        onBeforeChange = null;

    var resolve = function () {
        document.location.href = newValue;
    };

    var undo = function () {
        $(selector).val(originalValue);
        $(selector)._selectmenu('refresh');
    };

    var init = function () {
        originalValue = $(selector).val();
        $(selector).change(function () {
            newValue = $(this).val();
            if ($.isFunction(onBeforeChange)) {
                undo();
                $.when(onBeforeChange()).then(function () {
                    resolve();
                });
            } else {
                resolve();
            }
        });
    };

    return {
        init: init,
        onBeforeChange: function (callback) {
            onBeforeChange = callback;
        }
    };
}());;
var Sana = Sana || {};
Sana.Spinner = (function () {
    $.widget('ui._spinner', $.extend({}, $.ui.spinner.prototype, {
        _uiSpinnerHtml: function () {
            return '';
        },
        _events: _.extend($.ui.spinner.prototype._events, {
            // Method below copied from jquery-ui.js file, added 1 condition into it
            "mousedown .ui-spinner-button": function (event) {
                var previous;
                previous = this.element[0] === $.ui.safeActiveElement(this.document[0]) ?
                    this.previous : this.element.val();
                function checkFocus() {
                    var isActive = this.element[0] === $.ui.safeActiveElement(this.document[0]);
                    if (!isActive) {
                        //additional condition: exclude autofocus on touch devices
                        if (!Sana.Layout.isTouchDevice()) this.element.trigger("focus");
                        this.previous = previous;

                        this._delay(function () {
                            this.previous = previous;
                        });
                    }
                }

                event.preventDefault();
                checkFocus.call(this);
                this.cancelBlur = true;
                this._delay(function () {
                    delete this.cancelBlur;
                    checkFocus.call(this);
                });

                if (this._start(event) === false) return;
                this._repeat(null, $(event.currentTarget)
                    .hasClass("ui-spinner-up") ? 1 : -1, event);
            }
        })
    }));

    function _delayedInit($el) {
        $el.off('focus.lazySpinner').on('focus.lazySpinner', function () {
            _initElement($el);
            $el.off('focus.lazySpinner');
        });
    }

    var alternateSeparator = Sana.Utils.formatNumber.decimalSeparator;
    if (!alternateSeparator || alternateSeparator === '.')
        alternateSeparator = ',';
    var alternateSeparatorCode = alternateSeparator.charCodeAt(0),
        dotCode = '.'.charCodeAt(0);

    function _initElement($element, opt) {
        if (opt && opt.delayed) {
            _delayedInit($element);
            return;
        }

        // By default [data-min], [data-step] and [data-max] attributes are validated by jquery.validate.
        // To prevent validation but respect step [data-min-no-validation], [data-step-no-validation] and [data-max-no-validation] attributes are used.
        $element._spinner({
            classes: {
                'ui-spinner': '',
                'ui-spinner-down': 'btn no-caption ui-spinner-button ui-spinner-down',
                'ui-spinner-up': 'btn no-caption ui-spinner-button ui-spinner-up'
            },
            numberFormat: { }, // Pass not `undefined` to force `window.Globalize.format` usage.
            culture: document.documentElement.lang,
            min: $element.attr('data-min') || $element.attr('data-min-no-validation') || 0,
            max: $element.attr('data-max') || $element.attr('data-max-no-validation') || 99999,
            step: $element.attr('data-step') || $element.attr('data-step-no-validation') || 1,
            icons: { down: 'icon-down', up: 'icon-up' },
            disabled: $element.prop("disabled") === true
        })
            .off('._spinner')
            .on('keypress._spinner', function (e) {
                // Skip handling of all key codes except the key codes of numbers and commands.
                if (e.which !== $.ui.keyCode.DELETE &&
                    e.which !== $.ui.keyCode.BACKSPACE &&
                    e.which !== 0 &&     // 0 is the key for special scenarios.
                    e.which !== $.ui.keyCode.ENTER &&
                    e.which !== alternateSeparatorCode &&
                    (e.which < '0'.charCodeAt() || e.which > '9'.charCodeAt()) &&
                    !e.ctrlKey) {
                    return false;
                }
                // Revert if second decimal separator added. Use timeout to get values before and after key press happened
                if (e.which === dotCode || e.which === alternateSeparatorCode) {
                    var prevValue = e.target.value;
                    setTimeout(function () {
                        var newValue = e.target.value,
                            visited = false;
                        for (var i = 0; i < newValue.length; i++) {
                            var c = newValue[i];
                            if (c === '.' || c === alternateSeparator) {
                                if (visited) {
                                    e.target.value = prevValue;
                                    return;
                                }
                                visited = true;
                            }
                        }
                    }, 0);
                }
            })
            .on('spin._spinner', function (e, ui) {
                var $input = $(e.target);
                if (ui.value == $input._spinner('option', 'min') && ui.value == Sana.Utils.parseNumber($input.val())) {
                    $input._spinner('value', '');
                    return false;
                }
            })
            .on('spinstop._spinner', function (e, ui) {
                $(document).trigger('sana_spinstop', e.target);
                if ($element.attr('data-bind')) {
                    $(e.target).trigger("change");
                }
            });
    }

    var _bindEvents = function () {
        $(document).on('htmlUpdated numericUpdated', function (e) {
            init(e.target);
        });
    };

    var init = function (scope) {
        $('input[type=text]', scope)
            .add(scope)
            .filter('.numeric')
            .each(function () {
                var $el = $(this);
                _initElement($el, {
                    delayed: $el.attr('data-spinner-init') === 'event'
                });
            });
    };

    _bindEvents();

    return {
        init: init
    };
}());;
var Sana = Sana || {};
Sana.StickyHeader = (function () {
    var $header = $('header'),
        isActivated = false,
        _edgeHeight = $header.height();

    var shouldStick = function () {
        // Header shouldn't stick when:
        // 1. search input is focused because of jumping in iOS;
        // 2. navigation menu is hovered since it breaks scroll for menu;
        return !$('.tbx-main-search').is('.focused') &&
            !$('.nav-list-root').hasClass('nav-is-hovered');
    };

    var reservePlaceForHeader = function (setHeight) {
        if (setHeight != 0) {
            setHeight = _edgeHeight;
        };
        $('.site').css('padding-top', setHeight);
    };

    var setNavHeightForVerticalScroll = function (h) {
        var HEADER_HEIGHT = 62,
            cookieBarHeight = $('.sana-cookiebar.is-top:visible').outerHeight() || 0,
            hAvail = h || $(window).height() - HEADER_HEIGHT - cookieBarHeight;
        $('.nav-type-simple .nav-list-wrapper').css('height', hAvail);
    };

    var setEdgeHeight = function () {
        _edgeHeight = $header.height();
    };

    var correctEdgeHeight = function (corrVal) {
        _edgeHeight = _edgeHeight - corrVal || 0
    };

    var stickHeader = function (setPlaceholder) {
        if (isActivated) {
            return;
        };

        if (setPlaceholder) {
            reservePlaceForHeader();
        };
        $('.middle-header .basket').appendTo('.top-header .top-action');
        $header.addClass('sticky-mode');
        setNavHeightForVerticalScroll();
        isActivated = true;
    };

    var unstickHeader = function () {
        if (!isActivated) {
            return;
        }

        reservePlaceForHeader(0);
        $('.top-header .basket').appendTo('.middle-header');
        $header.removeClass('sticky-mode');
        setNavHeightForVerticalScroll('auto');
        isActivated = false;
    };

    var checkScrollPosition = function () {
        var headerIsHidden = $(window).scrollTop() > _edgeHeight;
        if (headerIsHidden) {
            if (shouldStick()) {
                stickHeader(true);
            }
        } else {
            unstickHeader();
        }
    };

    var onDesktop = function () {
        $(window).on('scroll.ribbon', _.throttle(checkScrollPosition, 300));
        unstickHeader();
        setEdgeHeight();

        $('.middle-header .nav-opener-wrapper').prependTo('.bottom-header > .center');
    };

    var onTablet = function () {
        $(window).off('scroll.ribbon');
        stickHeader();
        setEdgeHeight();
        reservePlaceForHeader();

        $('.middle-header .nav-opener-wrapper').prependTo('.bottom-header > .center');
    };

    var onMobile = function () {
        $(window).off('scroll.ribbon');
        unstickHeader();

        $('.bottom-header > .center .nav-opener-wrapper').prependTo('.middle-header');
    };

    var init = function () {
        if (Sana.Print.isOn()) {
            return;
        }

        if (Sana.Layout.layout == 'DESKTOP') {
            onDesktop();
        } else if (Sana.Layout.layout == 'TABLET') {
            onTablet();
        } else {
            onMobile();
        }
        Sana.Layout.addFunction(onDesktop, 'DESKTOP');
        Sana.Layout.addFunction(onTablet, 'TABLET');
        Sana.Layout.addFunction(onMobile, 'MOBILE');

        // Header height can be changed after fonts are loaded
        $(document).on('webfontactive webfontinactive refreshStickyHeader.addCookieBar', function () {
            if (Sana.Layout.layout == 'DESKTOP' && isActivated) {
                unstickHeader();
                setEdgeHeight();
                checkScrollPosition();
            } else {
                setEdgeHeight();
            }
        });

        $(document).on('refreshStickyHeader.removeCookieBar', function () {
            var cookieBarHeight = $('.sana-cookiebar.is-top:visible').outerHeight();
            correctEdgeHeight(cookieBarHeight);
            if (Sana.Layout.layout == 'TABLET') reservePlaceForHeader();
        });
    };

    init();

    return {
        init: init
    };
}());;
var Sana = Sana || {};
Sana.Tabs = (function () {
    var container = ".tab-control";

    var init = function (hdr) {
        $(container).tabs();
        refresh();

        $(".hyp-read-description, .hyp-read-reviews").click(function () {
            var scrollTo = $(this).attr('data-scroll-to');
            var selector = "a[href='#" + scrollTo + "']";
            if (Sana.Layout.layout == "MOBILE") {
                selector = "[data-tab-header=" + scrollTo + "]";
            };

            Sana.UI.scrollToNode(selector, 30);     // 30 - to show tab content lower
            select(selector);
        });
    };

    var refresh = function () {
        $(container).each(function () {
            var cnt = $(this).find("ul li").length;
            if (cnt == 0) {
                $(this).css("visibility", "hidden");
            }
        });
    };

    var select = function (link) {
        $(link).click();
    };

    init();

    return {
        init: init,
        select: select
    };
}());;
var Sana = Sana || {};
Sana.TabsSliderHorizontal = (function () {
    var self = {};

    var selector = '.tabs-horizontal',
        btnPrev = '.tabs-horizontal .opacity-left',
        btnNext = '.tabs-horizontal .opacity-right';

    var bindEvents = function () {
        if ($(selector).find('li').length < 2) {
            return;
        }

        $('.btn-prev').on('click', function () {
            selectTab('prev');
        });

        $('.btn-next').on('click', function () {
            selectTab('next');
        });

        $(selector).find('li a').on('click', function () {
            var $obj = $(this).parent();
            scrollTo($obj);
        });

        Sana.Layout.addResizeFunction(function () {
            scrollTo();
        });
    };

    var getCurrent = function () {
        var $obj = $(selector).find('.ui-tabs-active');
        return { width: $obj.width(), index: $obj.index(), left: $obj.offset().left };
    };

    var scrollTo = function ($item) {
        var _target = $item ? {
            index: $item.index(),
            width: $item.width(),
            left: $item.offset().left
        } : getCurrent();

        var $obj = $(selector).find('.ui-tabs-nav');
        $obj.stop(true);

        if (isDynamicMode()) {
            var correction = ($(selector).width() - _target.width) / 2;
            var shift = 0;
            if (_target.index != 0) {
                shift = _target.left - $(selector).find('.ui-tabs-nav').offset().left - correction;
            }
            $obj.animate({ left: -shift + 'px' }, 300);
        } else if (_target.left != 0) {
            $obj.css('left', 0);
        }

        checkButtonsVisibility();
    };

    var selectTab = function (_target) {
        var current = getCurrent(),
            $items = $(selector).find('li');

        switch (_target) {
            case 'prev':
                if (current.index > 0) {
                    var $lnk = $items.eq(current.index - 1).find('a');
                    $(self).trigger('selectTab', $lnk);
                }
                break;
            case 'next':
                var to = 0;
                if ($items.length - current.index > 1) {
                    to = current.index + 1;
                };
                var $lnk = $items.eq(to).find('a');
                $(self).trigger('selectTab', $lnk);
                break;
        }
    };

    var checkButtonsVisibility = function () {
        var current = getCurrent();

        if (!isDynamicMode()) {
            $(btnPrev).add(btnNext).hide();
            return;
        }

        if (current.index == 0) {
            $(btnPrev).hide();
            $(btnNext).show();
        } else if (current.index == $(selector).find('li').length - 1) {
            $(btnPrev).show();
            $(btnNext).hide();
        } else {
            $(btnPrev).show();
            $(btnNext).show();
        }
    };

    var isDynamicMode = function () {
        var $items = $(selector).find('li');
        if ($items.length < 2) {
            return false;
        }

        var tabsWidth = 0;
        $items.each(function (index, el) {
            tabsWidth += $(el).outerWidth(true);
        });

        if (tabsWidth < $(selector).width()) {
            return false;
        }

        return true;
    };

    self.init = function () {
        if (!$('.tabs-horizontal').length) {
            return;
        }

        bindEvents();
        checkButtonsVisibility();
    }

    return self;
}());;
var Sana = Sana || {};
Sana.Toggler = (function () {
    var init = function (hdr) {
        var $document = $(document);

        $document.off('.toggler', hdr);
        $document.on('click.toggler', hdr, function () {
            var $hdr = $(this);

            if ($hdr.hasClass('expanded')) {
                $hdr.next().stop(true, true).slideToggle(200, function () { $hdr.toggleClass('collapsed expanded'); });
            } else {
                $hdr.toggleClass('collapsed expanded');
                $hdr.next().stop(true, true).slideToggle(200);
            }
        });
        $document.on('mouseenter.toggler mouseleave.toggler', hdr, function () {
            $(this).find('.btn').toggleClass('hover');
        });
    };

    init('.accordion-header');

    return {
        init: init
    };
}());;
var Sana = Sana || {};
Sana.Zoom = (function () {
    // Zoom is not available for touch devices and in print mode
    if (Sana.Print.isOn()) {
        return;
    }

    var attrImages = 'data-zoom-image',
        cssImages = '[data-zoom-image]',
        zoomLensSize = 0.25;

    var getPlaceholderSize = function (iMedium, iLarge) {
        var _w = iLarge.naturalWidth;
        var _h = iLarge.naturalHeight;

        var maxWidth = $(iMedium).parents('.main').width() - $(iMedium).parents('.details-img').width();
        var maxHeight = $(iMedium).parents('.main').height();

        var kw = 1;
        if (_w > maxWidth) {
            kw = maxWidth / _w;
        }

        var kh = 1;
        if (_h > maxHeight) {
            kh = maxHeight / _h;
        }

        var k = 1;
        k = kw < kh ? kw : kh;

        var placeholderWidth = k * _w,
            placeholderHeight = k * _h,
            coefficient = (zoomLensSize / k).toFixed(1);

        return { width: placeholderWidth, height: placeholderHeight, coefficient: coefficient };
    };

    var showZoomedImage = function (mediumImage) {
        var $mediumImage = $(mediumImage),
            isParentHidden = $mediumImage.parent().css('opacity') === 0;

        if (!$mediumImage.attr(attrImages) || isParentHidden) {
            return;
        }

        $('<img>').attr('src', $mediumImage.attr(attrImages)).on('load', function () {
            var placeholderSize = getPlaceholderSize(mediumImage, this);
            $mediumImage.elevateZoom({
                zoomLevel: placeholderSize.coefficient,
                easing: true,
                scrollZoom: true,
                zoomWindowFadeIn: 500,
                zoomWindowFadeOut: 500,
                borderSize: 2,
                borderColour: "#e6e6e6",
                zoomWindowPosition: "zoomPlaceHolder",
                zoomWindowWidth: placeholderSize.width,
                zoomWindowHeight: placeholderSize.height
            });
        });
    };

    var bindEvents = function () {
        $(document)
            .off('.zoom')
            .on('mouseenter.zoom', cssImages, function () {
                if (!Sana.UI.touchActive) {
                    showZoomedImage(this);
                }
            })
            .on('mouseleave.zoom', '.zoomContainer', function () {
                if (!Sana.UI.touchActive) {
                    destroyAll();
                }
            });
    };

    var destroyAll = function () {
        var $list = $(cssImages);
        for (var i = 0; i <= $list.length; i++) {
            $list.eq(i).removeData('elevateZoom');
        }
        $('.zoomContainer').remove();
        $('.zoomWindowContainer').remove();
    };

    var init = function () {
        if (!$(cssImages).length) {
            return;
        }

        $('<div id="zoomPlaceHolder" style="position: absolute; top: 0;"></div>').prependTo('.details-info');

        if (Sana.Layout.layout !== 'MOBILE') {
            bindEvents();
        }
    };

    Sana.Layout.addFunction(function () {
        bindEvents();
    }, 'DESKTOP');

    Sana.Layout.addFunction(function () {
        bindEvents();
    }, 'TABLET');

    Sana.Layout.addFunction(function () {
        $(document).off('.zoom');
        destroyAll();
    }, 'MOBILE');

    init();

    return {
        init: init,
        destroy: function () {
            $(document).off('.zoom');
            $('#zoomPlaceHolder').remove();
            destroyAll();
        }
    };
}());;
/// <reference path="sana.ui.js" />
/// <reference path="sana.googletagmanager.js" />
var Sana = Sana || {};
Sana.BasketDetails = (function () {
    var el = document.getElementById('basketPage');
    if (!el)
        return;

    function BasketViewModel() {
        var self = this;

        this.linesCount = ko.observable();

        this.linesCount.subscribe(function (newValue) {
            self.isEmpty(self.linesCount() === 0);
        });

        this.isEmpty = ko.observable();

        this.isEmpty.subscribe(function (newValue) {
            $('.btn-quote, .btn-checkout, .hyp-update, .hyp-wishlist, .hyp-save, .hyp-clear').scButton('toggle', !newValue);
            var $checkoutBtn = $('.btn-checkout');
            $checkoutBtn.toggleClass('btn-disabled', self.isEmpty() || $checkoutBtn.attr('disabled') !== undefined);
            $('#basketPage').toggleClass('basket-empty', newValue);
        });

        this.checkLines = function () {
            self.linesCount($('.gvi-basket tr.upper-row').length);
        };

        this.quickOrderLine = ko.observable(null);

        this.getDataToSent = function ($form) {
            var newData = dataToSend = $.param(self.quickOrderLine() || []),
                oldData = $form.serialize();

            if (oldData) {
                dataToSend = newData + '&' + oldData;
            }

            return dataToSend;
        };

        this.basketForm = ko.observable();
    }

    var toggleExpander = function ($trigger, callback) {
        var $row = $trigger.parents('.upper-row'),
            $upperRow = $row.nextUntil('.upper-row');

        if ($row.hasClass('row-expanded')) {
            var $invalidInput = $upperRow.find('.input-validation-error:first');

            if ($invalidInput.length > 0) {
                $invalidInput.focus();
                return;
            }

            $upperRow
                .stop(true, true)
                .animate({ opacity: 0 }, 200, function () {
                    $(this).addClass('row-state');

                    callback && callback();
                });
        } else {
            $upperRow
                .removeClass('hide')
                .stop(true, true)
                .css('opacity', 0)
                .animate({ opacity: 1 }, 200, function () {
                    $(this).removeClass('row-state');

                    callback && callback();
                });
        }

        if (!$trigger.length) {
            callback();
        }

        $row.toggleClass('row-expanded row-collapsed');
        $trigger.toggleClass('expanded collapsed');
    };

    var BasketDetails = {
        lastUpdateUrl: null,
        viewModel: new BasketViewModel(),
        init: function () {
            Sana.ProductConfigurator.init();

            var self = this;
            // Update basket before change basket lines page
            Sana.Paging.onBeforeChange = function (options) {
                return self.updateBasket(options);
            };

            var $document = $(document);

            $document.on('pagingChange', function (e, obj) {
                BasketDetails.lastUpdateUrl = obj.url;
                BasketDetails.onBasketContentUpdate();
            });

            $document.on("click", "#btnClearBasket", function (event) {
                event.preventDefault();
                BasketDetails.clearBasket();
            });

            $document.on("click", "#btnCancelBasket", function (event) {
                event.preventDefault();
                BasketDetails.cancelBasket();
            });

            $document.on("click", ".hyp-update, .hyp-recalculate", function (event) {
                event.preventDefault();
                BasketDetails.recalculateBasket();
            });

            $document.on("click", "#btnAddToWishlist", function (event) {
                event.preventDefault();
                BasketDetails.addToWishlist($(this));
            });

            $document.on('submit', '#promotionForm', function (event) {
                event.preventDefault();
                BasketDetails.submitPromotion($(this));
            });

            $document.on('submit', '#donationForm', function (event) {
                event.preventDefault();
                BasketDetails.submitDonation($(this));
            });

            $document.on('click', '.hyp-discount', function () {
                $(this).hide().next('#promotionForm').show().find('input').focus();
            });

            $document.on("keypress", "#basketContent .tbx-quantity", function (event) {
                if (event.which === 13) {
                    event.preventDefault();
                    BasketDetails.recalculateBasket();
                }
            });

            $document.on("click", "#basket .hyp-remove", function (event) {
                event.preventDefault();

                var dataToDelete = {},
                    $row = $(this).closest('tr');

                dataToDelete.src = $(this).attr('data-src');
                dataToDelete.product = $row.attr('data-productid');
                dataToDelete.variant = $row.attr('data-variantid');
                dataToDelete.salesAgreementLineNo = $row.attr('data-salesagreementlineno');
                dataToDelete.prepack;
                if ($row.attr('data-prepackvariantid')) {
                    dataToDelete.variant = $row.attr('data-prepackvariantid');
                    dataToDelete.prepack = $row.attr('data-variantid');
                }
                dataToDelete.uom = $row.attr('data-unitofmeasureid');

                ($row.hasClass('row-header') ? $row.nextUntil('.upper-row') : $row)
                    .find('input[type=text]')
                    .prop('disabled', 'true');

                BasketDetails.updateBasket({
                    callback: BasketDetails.onBasketLinesUpdated
                });
            });

            $document.on("click", ".enter-discount .hyp-remove", function (event) {
                event.preventDefault();
                var $this = $(this);

                BasketDetails.removeDiscount({
                    src: $this.attr('data-src'),
                    id: $this.attr('data-product')
                });
            });

            $document.on("click", ".btn-checkout, .btn-quote", function (event) {
                event.preventDefault();
                BasketDetails.goToCheckout($(this));
            });

            this.initCheckoutOffers();
            this.initQuickOrder();

            BasketDetails.rowStyling();
            $('.shipping-cost').tooltip();
            $('.sales-agreement-tooltip').tooltip();

            $document.on("spinstop", "#basketContent .tbx-quantity", function () {
                BasketDetails.saveUnsavedBasketToStorage();
            });
            $document.on("change", "#basketContent .ddlb-sales-agreement-lines > select", function () {
                BasketDetails.saveUnsavedBasketToStorage();
                self.notifyRecalculationRequired(true);
            });

            $document.on("click", ".btn-show-hide", function () {
                toggleExpander($(this));
            });

            Sana.ActionButtons.init();

            $document.on("click", "#btnSaveOrderTemplate", function (e) {
                e.preventDefault();
                if (BasketDetails.viewModel.isEmpty())
                    return;
                var dataSrc = $(this).attr("data-src");
                BasketDetails.updateBasket({
                    callback: function (data) {
                        if (data) {
                            BasketDetails.refreshBasket();
                        }

                        Sana.OrderTemplatePopup.open(dataSrc);
                    }
                });
            });

            $document.on('click', '.remove-sales-agreement', function (e) {
                e.preventDefault();
                if ($('#term-selections-will-be-lost-pop-up').length) {
                    Sana.Popup.open('#term-selections-will-be-lost-pop-up');
                    return false;
                }
                $('.sales-agreement-form').submit();
                return false;
            });

            $document.on('click', '.apply-agreement-terms-automatically-link', function () {
                Sana.UI.LoadingIndicator.show();

                BasketDetails.updateBasket({
                    callback: function () {
                        Sana.UI.LoadingIndicator.show();
                        $('.apply-agreement-terms-automatically-form').submit();
                    }
                });
                return false;
            });

            $document.on('click', '#term-selections-will-be-lost-pop-up .btn-continue', function () {
                $('.sales-agreement-form').submit();
                Sana.Popup.close('#term-selections-will-be-lost-pop-up');
            });

            $(function () {
                self.QuantityTracking.trackLines();
            });

            // setTimeout is used to fix Sana.Layout.layout value
            setTimeout(function () {
                BasketDetails.manageGTMTracking();
            });
        },
        QuantityTracking: (function () {
            var inputSelector = '.tbx-quantity .numeric:not(#quickOrder .numeric)';
            var trackingNamespace = 'BasketDetails';

            function trackLines() {
                var trackableElement = new Sana.ValueTracking.TrackableElement({
                    selector: inputSelector,
                    beforeChangeEvent: 'spinstart',
                    changeEvent: 'spinstop',
                    onChange: Sana.BasketDetails.notifyRecalculationRequired,
                    elementKeyBuilder: createBasketLineIdentifier,
                    elementByKeyResolver: getBasketLineSpinner
                });
                Sana.ValueTracking.trackElement(trackingNamespace, trackableElement);
            }

            function makeLinesDirty() {
                Sana.ValueTracking.makeNamespaceDirty(trackingNamespace);
            }

            function createBasketLineIdentifier($element) {
                return $element.closest('.tbx-quantity').find(':input[name$=".BasketLineId"]').val();
            }

            function getBasketLineSpinner(lineId) {
                return $(':input[name$=".BasketLineId"]').filter(function () {
                    return $(this).val() === lineId;
                }).closest('.tbx-quantity').find('.numeric:not(#quickOrder .numeric)');
            }

            return {
                trackLines: trackLines,
                makeLinesDirty: makeLinesDirty
            };
        })(),
        manageGTMTracking: function () {
            if (!Sana.GoogleTagManager.isAvaliable()) {
                return;
            }

            var parseProductTile = function (product) {
                var $product = $(product);
                $product.data('tracked', true);
                return {
                    id: $product.find('.product-id .value').text(),
                    name: $product.find('.product-title').text(),
                    creative: 'basket_offers'
                };
            };

            var $offers = $('#checkoutofferings .product-tile');
            _.each($offers, function (offer, i) {
                var $offer = $(offer);

                // store offer index into data
                $offer.data('offer-index', i);

                // track promotion click
                $offer.on('click', 'a', function (e) {
                    var promoObj = $.extend({ position: i }, parseProductTile(e.delegateTarget));

                    e.preventDefault();
                    Sana.GoogleTagManager.trackPromotionClick(promoObj).done(function () {
                        document.location = e.currentTarget.href;
                    });
                });
            });

            if (Sana.Layout.layout === 'MOBILE') {
                // track viewed promotions for the mobile layout
                var $sliders = $('#checkoutofferings .slick-slider');

                // track viewed promotion for the first carousel product
                _.each($sliders, function (slider) {
                    var $offer = $(slider.slick.$slides[0]).find('.product-tile');
                    var promoObj = $.extend({ position: $offer.data('offer-index') }, parseProductTile($offer));
                    Sana.GoogleTagManager.trackViewedPromotions(promoObj);
                });

                // track viewed promotion after carousel rotate
                $sliders.on('afterChange', function (event, slick, currentSlide) {
                    var $offer = $(slick.$slides[currentSlide]).find('.product-tile');
                    if ($offer.data('tracked')) {
                        return;
                    }

                    var promoObj = $.extend({ position: $offer.data('offer-index') }, parseProductTile($offer));
                    Sana.GoogleTagManager.trackViewedPromotions(promoObj);
                });
            } else {
                // track viewed promotions for the tablet and desktop layouts
                var promotions = [];
                _.each($offers, function (offer, i) {
                    var promoObj = $.extend({ position: $(offer).data('offer-index') }, parseProductTile(offer));
                    promotions.push(promoObj);
                });
                Sana.GoogleTagManager.trackViewedPromotions(promotions);
            }
        },
        recalculateBasket: function () {
            if (BasketDetails.viewModel.isEmpty())
                return;
            BasketDetails.updateBasket({
                callback: function (data) {
                    BasketDetails.onBasketLinesUpdated(data);
                }
            });
        },
        onBasketLinesUpdated: function (data) {
            if (data) {
                BasketDetails.refreshBasket();
                Sana.GoogleTagManager.updateAdditionAndRemovals(data);
            }
        },
        addToWishlist: function ($sender) {
            if (BasketDetails.viewModel.isEmpty())
                return;
            var dataSrc = $sender.attr("data-src");
            BasketDetails.updateBasket({
                callback: function (data) {
                    if (data && data.Items && data.Count) {
                        BasketDetails.refreshBasket();
                        Sana.GoogleTagManager.trackProductAddition(data.Items, data.ActionField, data.CustomerType);
                    }

                    $.post(dataSrc,
                        {
                            __RequestVerificationToken: Sana.Utils.getAntiForgeryToken()
                        }, function () {
                            Sana.UI.LoadingIndicator.hide();
                            Sana.Popup.open("#addToWishlistFeedbackPopup");
                        });
                }
            });
        },
        submitPromotion: function ($sender) {
            if (BasketDetails.viewModel.isEmpty())
                return;
            var postUrl = $sender.attr("data-src");
            BasketDetails.updateBasket({
                callback: function () {
                    var promotionCode = $("#txtPromotionCode").val();
                    Sana.UI.LoadingIndicator.show();
                    $.post(postUrl,
                        {
                            code: promotionCode,
                            __RequestVerificationToken: Sana.Utils.getAntiForgeryToken()
                        }, function (data) {
                            BasketDetails.refreshBasket();
                        });
                }
            });
        },
        submitDonation: function ($sender) {
            if (BasketDetails.viewModel.isEmpty())
                return;
            var postUrl = $sender.attr("data-src");
            BasketDetails.updateBasket({
                callback: function () {
                    var promotionCode = $("#txtDonationCode").val();
                    Sana.UI.LoadingIndicator.show();
                    $.post(postUrl,
                        {
                            code: promotionCode,
                            __RequestVerificationToken: Sana.Utils.getAntiForgeryToken()
                        }, function (data) {
                            BasketDetails.refreshBasket();
                        });
                }
            });
        },
        removeDiscount: function (data) {
            $.post(
                data.src,
                {
                    productId: data.id,
                    __RequestVerificationToken: Sana.Utils.getAntiForgeryToken()
                },
                function () {
                    BasketDetails.refreshBasket();
                }
            );
        },
        clearBasket: function () {
            if (BasketDetails.viewModel.isEmpty())
                return;
            BasketDetails.lastUpdateUrl = null;
            var postUrl = $("#btnClearBasket").attr('href');
            Sana.UI.LoadingIndicator.show();
            $.post(postUrl,
                {
                    __RequestVerificationToken: Sana.Utils.getAntiForgeryToken()
                }, function (data) {
                    BasketDetails.refreshBasket();
                    if (data.Items)
                        Sana.GoogleTagManager.trackProductRemovals(data.Items, data.CustomerType);
                });
        },
        cancelBasket: function () {
            BasketDetails.lastUpdateUrl = null;
            var postUrl = $("#btnCancelBasket").attr('href');
            Sana.UI.LoadingIndicator.show();
            $.post(postUrl,
                {
                    __RequestVerificationToken: Sana.Utils.getAntiForgeryToken()
                }, function (data) {
                    BasketDetails.refreshBasket();
                });
        },
        goToCheckout: function ($sender) {
            BasketDetails.updateBasket({
                callback: function (rows) {
                    Sana.GoogleTagManager.updateAdditionAndRemovals(rows.data, function () {
                        window.location.href = $sender.attr('href');
                    });
                }
            });
        },
        updateBasket: function (options) {
            var self = this;
            var $form = $("#basket");
            if (!$form.valid()) {
                var notValidInput = $(".input-validation-error");
                var expanderTrigger = notValidInput.parents('.inner-row')
                    .prevAll('.row-collapsed')
                    .find('.btn-show-hide');

                toggleExpander(expanderTrigger, function () {
                    notValidInput[0].focus();
                });

                return;
            }

            var data = $form.serialize();
            if (!data) {
                if (options && options.callback) {
                    options.callback();
                }
                return;
            }

            Sana.UI.LoadingIndicator.showAfter(400);
            return $.ajax({
                url: $form.attr('data-updateAndGetTrackingModelUrl'),
                data: data,
                type: 'POST',
                success: function (rows) {
                    Sana.UI.LoadingIndicator.hide();
                    if (options && options.callback)
                        options.callback(rows);

                    self.notifyRecalculationRequired(false);
                    $('#basketContent .msg-block-error').remove();
                    BasketDetails.clearUnsavedBasketFromStorage();
                }
            });

        },
        refreshBasket: function () {
            var self = this;
            var basket = $("#basketContent");
            url = BasketDetails.lastUpdateUrl || basket.attr('data-src');
            Sana.UI.LoadingIndicator.show();
            $.post(url, function (data) {
                var newBasket = $(data.trim()).filter('#basketContent');
                basket.replaceWith(newBasket);
                BasketDetails.onBasketContentUpdate();
                self.QuantityTracking.trackLines();

                var $successMsgBlock = newBasket.find('.upper-row').length
                    ? $('.msg-basket-updated')
                    : $('.msg-basket-cleared');
                $successMsgBlock.slideToggle().delay(2500).slideToggle();

                Sana.UI.LoadingIndicator.hide();
            });
        },
        initCheckoutOffers: function () {
            $("#checkoutofferings").find('form').each(function () {
                $(this).attr("data-ajax-begin", "Sana.UI.LoadingIndicator.show();");
                $(this).attr("data-ajax-success", "Sana.BasketDetails.onBasketLinesUpdated");
            });
            Sana.ProductsGroup.init('.checkout-offers');
            Sana.UI.priceStyle('.checkout-offers');
        },
        initQuickOrder: function () {
            if (!Sana.QuickOrder) {
                return;
            }

            var self = this;
            Sana.QuickOrder.init();
            $(Sana.QuickOrder.viewModel).on('addQuickOrderLine', function (event, data) {
                var $form = $("#basket");

                var indexList = $form.find('[name^="lines["]').map(function (i, e) {
                    return /lines\[(\d+)\]/g.exec(e.name)[1];
                });
                var index = 0;
                if (indexList.length > 0)
                    index = Math.max.apply(Math, indexList) + 1;

                var lineData = [];
                for (var prop in data) {
                    lineData.push({ name: 'lines[' + index + '].' + prop, value: data[prop] });
                }

                $('.paging-control').hide();
                var basketTable = $('#basket tbody:first');

                BasketDetails.viewModel.quickOrderLine(lineData);
                Sana.UI.LoadingIndicator.show();
                var quickOrderButton = $('.btn-quick-order-add').prop('disabled', true);
                $.ajax({
                    url: $form.attr('action'),
                    data: BasketDetails.viewModel.getDataToSent($form),
                    type: 'POST',
                    success: function (rows) {
                        basketTable.html(rows);
                        basketTable.find('.cell-total-value, .cell-price-value').text('-');
                        BasketDetails.onBasketTableUpdate();
                        self.QuantityTracking.makeLinesDirty();
                        self.notifyRecalculationRequired(true);
                        $('.list-totals .total-value').text('-');

                        $('#basketContent .msg-block-error').remove();
                        var messages = basketTable.find('tr.basket-line-messages').remove();
                        if (messages.length) {
                            $('#basket-line-messages').html(messages.find('.msg-block-info'));
                        }

                        $('.hide-for-quick-order-mode').addClass('hide');
                        $('.for-quick-order-mode').removeClass('hide');
                    },
                    error: function () {
                        var addFailedMsg = $('.msg-failed-add-product');
                        addFailedMsg.filter(':not(:first)').remove();
                        addFailedMsg.filter(':first').clone().insertAfter(addFailedMsg).slideToggle().delay(1500).slideToggle();
                    },
                    complete: function () {
                        Sana.UI.LoadingIndicator.hide();
                        quickOrderButton.prop('disabled', false);
                        Sana.QuickOrder.setFocus();
                        BasketDetails.clearUnsavedBasketFromStorage();
                    }
                });
            });
        },
        rowStyling: function () {
            $('.row-header').each(function (i, item) {
                $(item).nextUntil('.upper-row').last().addClass('last-in-group');
            });

            $('.inner-row.row-service').each(function (i, item) {
                if ($(item).prevAll(':not(.row-service):first').hasClass('upper-row')) {
                    $(item).removeClass('row-state').find('.vertical-line').removeClass();
                }
            });

            BasketDetails.viewModel.checkLines();
        },
        notifyRecalculationRequired: (function () {
            function showNotification(show) {
                if (show)
                    $('.msg-basket-recalculate').slideDown();
                else
                    $('.msg-basket-recalculate').slideUp();
            }

            return _.debounce(function (shouldShow) {
                showNotification(typeof shouldShow === 'function'
                    ? shouldShow()
                    : shouldShow);
            }, 200);
        })(),
        onBasketContentUpdate: function () {
            BasketDetails.rowStyling();
            Sana.ActionButtons.refresh();
            $.validator.unobtrusive.parse('#basket');
            $('.shipping-cost').tooltip();
            $('.sales-agreement-tooltip').tooltip();
            $('#basketContent').trigger('htmlUpdated');
        },
        onBasketTableUpdate: function () {
            BasketDetails.rowStyling();
            Sana.ActionButtons.refresh();
            Sana.UI.refreshValidationFor('#basket');
            $('#basket').trigger('htmlUpdated');
        },
        saveUnsavedBasketToStorage: function () {
            var $form = $("#basket");
            sessionStorage.basketUrl = $form.attr('data-updateAndGetTrackingModelUrl');
            sessionStorage.basketData = $form.serialize();
            if (!$form.valid()) {
                BasketDetails.clearUnsavedBasketFromStorage();
            }
        },
        clearUnsavedBasketFromStorage: function () {
            sessionStorage.removeItem('basketUrl');
            sessionStorage.removeItem('basketData');
        }
    };

    BasketDetails.init();

    var el2 = document.getElementById('basketContent');
    if (el2) {
        ko.applyBindings(BasketDetails.viewModel, el2);
    }

    Sana.UI.bindChangeSalesAgreementLineLink();
    Sana.Spinner.init();
    return BasketDetails;
}());;
(function () {
    var el = document.getElementById('ContentOverviewPage');
    if (!el)
        return;

    var page = 0,
    inCallback = false,
    isReachedScrollEnd = false;

    if (Sana.Layout.layout == 'DESKTOP') {
        fixHeightMainContentBox();
    }
    $(window).scroll(function () {
        if (isReachedScrollEnd == false && $(window).scrollTop() == $(document).height() - $(window).height()) {
            GetExtendedFlexiPages();
        }
    });

    $(window).resize(function () {
        if (Sana.Layout.layout == 'MOBILE' || Sana.Layout.layout == 'TABLET') {
            $('.content-outer-items').removeAttr('style');
        }
        else {
            fixHeightMainContentBox();
        }
    });

    function fixHeightContentBoxes() {
        $('.content-outer-items').removeAttr('style');
        if (Sana.Layout.layout == 'DESKTOP') {
            setTimeout(function () {
                fixHeightMainContentBox();
            }, 100);

        }
        
    }

    function fixHeightMainContentBox() {
        var maxHeightContentElem = -1;
        $('.content-outer-items').removeAttr('style');
        $('.content-outer-items > div').each(function () {
            maxHeightContentElem = maxHeightContentElem > $(this).height() ? maxHeightContentElem : $(this).height();
        });
        $('.content-outer-items').height(maxHeightContentElem);
    }

    function GetExtendedFlexiPages()
    {
        if (page > -1 && !inCallback) {
            inCallback = true;
            page++;
            $("div#loading").show();

            $.ajax({
                type: 'GET',
                url: $('.getNextFlexiPages').attr('data-url'),
                data: "pageNumber=" + page,
                success: function (data, textstatus) {
                    if (data != '') {
                        $('body').append('<div class="temp" style="display: none"></div>')
                        $('.temp').html(data)
                        if ($('.temp').find('.large-item').length) {
                            $('.temp').find('.large-item').each(function () {
                                $(this).appendTo('#large-items')
                            })
                        }

                        if ($('.temp > .flexi-row').length) {
                            $('.temp > .flexi-row').each(function () {
                                $(this).appendTo('#small-items .small-content-items')
                            })
                        }
                        $('.temp').remove();
                     
                        $(".content-outer-items img.lazy").lazy({
                            load: fixHeightContentBoxes()
                        });

                    }
                    else {
                        page = -1;
                    }

                    inCallback = false;
                    $("div#loading").hide();
                },
                error: function (XMLHttpRequest, textStatus, errorThrown) {
                    alert(errorThrown);
                }
            });
        }
    }

})();

(function () {
    var el = document.getElementById('CategoryListViewPage');
    if (!el)
        return;

    var page = 0,
    inCallback = false,
    isReachedScrollEnd = false;

    columnHeightFixTagsCat();

    //$(window).scroll(function () {
    //    if (isReachedScrollEnd == false && $(window).scrollTop() <= $(document).height() - $(window).height()) {
    //        GetCategoryListPages();
    //    }
    //});

    function GetCategoryListPages() {
        if (page > -1 && !inCallback) {
            inCallback = true;
            page++;
            $("div#loading").show();

            $.ajax({
                type: 'GET',
                url: $('.getCategoryListPages').attr('data-url'),
                data: "categoryName=" + $("h1").text().trim() + "&pageNumber=" + page,
                success: function (data, textstatus) {
                    if (data != '') {
                        $('#TagsviewPage').append(data);
                        columnHeightFixTagsCat();
                    }
                    else {
                        page = -1;
                    }

                    inCallback = false;
                    $("div#loading").hide();
                },
                error: function (XMLHttpRequest, textStatus, errorThrown) {
                    alert(errorThrown);
                }
            });
        }
    }

})();


(function () {
    if ($('.content-line-all').length > 0) {
        if (Sana.Layout.layout == 'DESKTOP' || Sana.Layout.layout == 'TABLET') {
            columnHeightFixContentBoxes(4);
        }
        else {
            $('.content-line-all > li').removeAttr('style');
        }

        Sana.Layout.addFunction(function () {
            columnHeightFixContentBoxes(4);
        }, 'DESKTOP');

        Sana.Layout.addFunction(function () {
            columnHeightFixContentBoxes(4);
        }, 'TABLET');

        Sana.Layout.addFunction(function () {
            $('.content-line-all > li').removeAttr('style');
        }, 'MOBILE');
    }

    function columnHeightFixContentBoxes(colCount) {
        $('.content-line-all > li').removeAttr('style');
        var itemCount = $('.content-line-all > li').length;
        var x = 0;

        for (i = 0; i < itemCount;) {

            var maxHeightCol = -1;
            for (j = 0; j < 4; j++) {
                maxHeightCol = maxHeightCol > $('.content-line-all > li').eq(i + j).height() ? maxHeightCol : $('.content-line-all > li').eq(i + j).height();
            }
            for (h = 0; h < 4; h++) {
                $('.content-line-all > li').eq(i + h).height(maxHeightCol);
            }
            i = i + colCount;
        }
    }
})();

(function () {
    var el = document.getElementById('TagsviewPage'); 
    if (!el)
        return;

    var page = 0,
    inCallback = false,
    isReachedScrollEnd = false;

    columnHeightFix();

    $(window).scroll(function () {
        if (isReachedScrollEnd == false && $(window).scrollTop() <= $(document).height() - $(window).height()) {
            TagsListPage();
        }
    });

    function TagsListPage() {
        if (page > -1 && !inCallback) {
            inCallback = true;
            page++;
            $("div#loading").show();

            $.ajax({
                type: 'GET',
                url: $('.tagListPages').attr('data-url'),
                data: "tagName=" + $("h1").text().trim() + "&pageNumber=" + page,
                success: function (data, textstatus) {
                    if (data != '') {
                        $('#TagsviewPage').append(data);
                        columnHeightFix();
                    }
                    else {
                        page = -1;
                    }

                    inCallback = false;
                    $("div#loading").hide();
                },
                error: function (XMLHttpRequest, textStatus, errorThrown) {
                    alert(errorThrown);
                }
            });
        }
    }


})();

function columnHeightFixTagsCat() {
    if (Sana.Layout.layout == 'DESKTOP') {
        colomnHeightFixCategory(4);
    }
    else if (Sana.Layout.layout == 'TABLET') {
        colomnHeightFixCategory(4);
    }
    else {
        colomnHeightFixCategory(2);
    }

    Sana.Layout.addFunction(function () {
        colomnHeightFixCategory(4);
    }, 'DESKTOP');

    Sana.Layout.addFunction(function () {
        colomnHeightFixCategory(4);
    }, 'TABLET');

    Sana.Layout.addFunction(function () {
        colomnHeightFixCategory(2);
    }, 'MOBILE');
}


function columnHeightFix() {
    if (Sana.Layout.layout == 'DESKTOP') {
        colomnHeightFixCategory(4);
    }
    else if (Sana.Layout.layout == 'TABLET') {
        colomnHeightFixCategory(4);
    }
    else {
        colomnHeightFixCategory(2);
    }

    Sana.Layout.addFunction(function () {
        colomnHeightFixCategory(4);
    }, 'DESKTOP');

    Sana.Layout.addFunction(function () {
        colomnHeightFixCategory(4);
    }, 'TABLET');

    Sana.Layout.addFunction(function () {
        colomnHeightFixCategory(2);
    }, 'MOBILE');
}

function colomnHeightFixCategory(colCount) {
    $('#FlexiPageCollection > .small.item').removeAttr('style');
    var itemCount = $('#FlexiPageCollection > .small.item').length;
    var x = 0;

    for (i = 0; i < itemCount;) {

        var maxHeightCol = -1;
        for (j = 0; j < 4; j++) {
            maxHeightCol = maxHeightCol > $('#FlexiPageCollection > .small.item').eq(i + j).height() ? maxHeightCol : $('#FlexiPageCollection > .small.item').eq(i + j).height();
        }
        for (h = 0; h < 4; h++) {
            $('#FlexiPageCollection > .small.item').eq(i + h).height(maxHeightCol);
        }
        i = i + colCount;
    }
};
(function () {
    var $el = $('#GuestAddress');
    if ($el.length == 0)
        return;

    var $customAddressContainer = $('.shipping-choice.shipping-custom');
    var $customAddressFormControls = $customAddressContainer.find('.shipping-choice-content:first')
        .find('select, textarea, input');

    var toggleCustomAddressControls = function (enable) {
        $customAddressContainer.toggleClass('active', enable);
        $customAddressFormControls.toggleClass('ignore-validation', !enable);
    };

    var isCustomAddress = $('#GuestAddress').find('input[name=customShippingAddress]:checked').val() === 'true';
    toggleCustomAddressControls(isCustomAddress);
})();

;
var Sana = Sana || {};
Sana.OnePageCheckout = (function () {
    var el = document.getElementById('onePageCheckout');
    if (!el)
        return;


    var $body = $('body'),
        $win = $(window),
        $el = $(el),
        $steps = $el.find(".checkout-step"),
        $stickyWrappers = $el.find('.sticky-wrapper'),
        gviTotalsWrp = '.gvi-totals-wrapper',
        sticky = {};


    sticky.turnOn = function (layout) {
        if (layout === "DESK_TABL") {
            $stickyWrappers.stick_in_parent({
                offset_top: 72,
                neighbors: $stickyWrappers
            });

            $steps.each(function () {
                var throttler = _.throttle(sticky.refresh, 150)
                Sana.domObserver.handleElementChildNodes(this, throttler);
            });
        } else if (layout === "MOBILE") {
            var $totals = $el.find(gviTotalsWrp);

            $totals
                .trigger("sticky_kit:detach")
                .stick_in_parent({
                    parent: '.one-page-checkout .columns-general'
                });

            $el.off("htmlUpdated.stickyMob")
                .on("htmlUpdated.stickyMob", function () {
                    var savedScrollTop = $win.scrollTop();
                    sticky.turnOn("MOBILE");
                    sticky.refresh();
                    $win.scrollTop(savedScrollTop);
                });
        }
    };

    sticky.turnOff = function (layout) {
        if (layout === "DESK_TABL") {
            $steps.each(function () {
                Sana.domObserver.reset(this);
            });

            $stickyWrappers.trigger("sticky_kit:detach");
        } else if (layout === "MOBILE") {
            $el.off("htmlUpdated.stickyMob")
                .find(gviTotalsWrp).trigger("sticky_kit:detach");
        }
    };

    sticky.refresh = function () {
        $body.trigger('sticky_kit:recalc');
    };


    // sticky init
    if (Sana.Layout.layout === "MOBILE") {
        sticky.turnOn("MOBILE");
    } else {
        sticky.turnOn("DESK_TABL");
    }

    Sana.Layout.addFunction(function () {
        sticky.turnOff("MOBILE");
        sticky.turnOn("DESK_TABL");
    }, 'DESKTOP');
    Sana.Layout.addFunction(function () {
        sticky.turnOff("MOBILE");
        sticky.turnOn("DESK_TABL");
    }, 'TABLET');
    Sana.Layout.addFunction(function () {
        sticky.turnOff("DESK_TABL");
        sticky.turnOn("MOBILE");
    }, 'MOBILE');
    // end sticky init


    $('.msg-block-error').delay(4500).slideToggle();

    $(document).on('focus blur', '.checkout-step .tbx input, .checkout-step .tar textarea', function (e) {
        $(this).closest('.checkout-step').toggleClass('focused', e.type == 'focusin');
    });

    return {
        refreshStickyColumns: sticky.refresh
    }
})();;
(function () {
    var el = document.getElementById('authorizationHistoryPage');
	if (!el)
		return;

	function Order(data) {
	    this.OrderId = data.OrderId;
	    this.PlacedBy = data.PlacedBy;
		this.OrderDate = data.OrderDate;
		this.OrderAmount = data.OrderAmount;		
		this.AuthorizationStatus = data.AuthorizationStatus;
	    // order statuses: .status-approved, .status-declined, .status-pending, .status-notneeded
		this.cssAuthorizationStatus = data.AuthorizationStatus ? 'status-' + data.AuthorizationStatus.toLowerCase() : '';
		this.AuthorizationStatusTitle = data.AuthorizationStatusTitle;
		this.Url = data.Url;
	}

	function OrderAuthorizationListViewModel() {
		var self = this;
		self.loaded = ko.observable(false);
		self.loading = ko.observable(false);

		var load = function (callback) {
		    self.loading(true);
		    Sana.UI.LoadingIndicator.show();
		    var params = self.filter.toJSON();
		    params['__RequestVerificationToken'] = Sana.Utils.getAntiForgeryToken();
		    $.post(
				document.location.href,
				params,
				function (data) {
					var orders = ko.utils.arrayMap(data.Items, function (item) {
						return new Order(item);
					});
					callback(orders);
					self.loaded(true);
					self.hasMore(self.orders().length < data.TotalCount);
					self.loading(false);
					Sana.UI.LoadingIndicator.hide();
				}
			);
			self.filter.page++;
		};

		self.orders = ko.observableArray([]);
		self.empty = ko.computed(function () { return self.orders().length == 0; });
		self.filter = {
            page: 0,
            OrderId: ko.observable(),
            AuthorizationStatus: ko.observable(),
			StartDate: ko.observable(),
			EndDate: ko.observable(),

			toJSON: function () {
			    return {
			        page: this.page,
			        OrderId: this.OrderId(),
			        AuthorizationStatus: this.AuthorizationStatus(),
			        StartDate: this.StartDate(),
			        EndDate: this.EndDate(),
			    };
			}
		};
		self.hasMore = ko.observable(false);
		self.search = function () {
		    self.filter.page = 0;
		    load(function (data) { self.orders(data); });
		};
		self.loadMore = function () {
		    load(function (items) {
		        ko.utils.arrayPushAll(self.orders, items);
		    });
		};
	};

	var viewModel = new OrderAuthorizationListViewModel();
	$(function () {
	    var $rootElement = $('#' + el.id);
	    viewModel.filter.OrderId($rootElement.find('input[name="filter.OrderId"]').val());
	    viewModel.filter.StartDate($rootElement.find('input[name="Filter.StartDate"]').val());
	    viewModel.filter.EndDate($rootElement.find('input[name="Filter.EndDate"]').val());
	    viewModel.filter.AuthorizationStatus($rootElement.find('select[name="filter.AuthorizationStatus"]').val());

	    ko.applyBindings(viewModel, el);
	    viewModel.search();

	    $('.gvi-orders').resTables();
	});
})();;
var Sana = Sana || {};
Sana.OrderDetails = (function () {
    var el = document.getElementById('orderHistoryDetailPage');
    if (!el) {
        return;
    }

    var page = {},
        $document = $(document);

    var adaptTolargeOrders = function () {
        var $grid = $('.gvi-order-lines');
        var $footer = $('.show-hide-mode');
        if (!$footer.length) {
            $grid.resTables();
            return;
        }

        $footer.show();
        $grid.toggleClass('expanded collapsed');
        $document.on('click', '.toggle-hyp-inside .hyp', function () {
            $grid.toggleClass('expanded collapsed');
        });
        $document.on('click', '#btnLoadOrderLines', function (event) {
            event.preventDefault();
            var action = $(this).attr('href');
            if (!action) {
                return;
            }

            Sana.UI.LoadingIndicator.show();
            $.ajax({
                url: action,
                cache: false,
                success: function (data) {
                    $grid.html(data).resTables().toggleClass('expanded collapsed').find('tfoot').show();
                    $('#btnLoadOrderLines').hide();
                    $('.toggle-hyp-inside').show();
                    Sana.UI.LoadingIndicator.hide();
                }
            });
        });
    };

    var showExceededCreditLimitPopup = function (exceededLimitMessage, isBlocked, actionUrl) {
        var $popupContent = $('#exceededCreditLimit');
        $popupContent.attr('data-action-url', actionUrl);
        $popupContent.find('.cnt-column div').html(exceededLimitMessage);
        $popupContent.find('.ftr-column.with-continue-btn').toggleClass('hide', isBlocked);
        $popupContent.find('.ftr-column.only-close-btn').toggleClass('hide', !isBlocked);
        Sana.Popup.open('#exceededCreditLimit');
    };

    var postQuotePromotion = function ($form, ignoreWarning, actionUrl) {
        Sana.UI.LoadingIndicator.show();
        $.post(actionUrl || $form.attr('data-url'), {
            __RequestVerificationToken: Sana.Utils.getAntiForgeryToken(),
            quoteId: $form.attr('data-quote-id'),
            ignoreWarning: !!ignoreWarning
        })
        .done(function (data) {
            Sana.UI.LoadingIndicator.hide();
            if (data.containsNonOrderableProducts) {
                Sana.Popup.open('#quoteCannotBePromoted');
            } else if (data.forceOnlinePayment) {
                var newActionUrl = $form.attr('data-load-to-checkout-url');
                showExceededCreditLimitPopup(data.exceededLimitMessage, data.isBlocked, newActionUrl);
            } else if (data.exceededLimitMessage) {
                showExceededCreditLimitPopup(data.exceededLimitMessage, data.isBlocked);
            }
        })
        .fail(function (data) {
            Sana.UI.LoadingIndicator.hide();
            Sana.Popup.open('#quoteCannotBePromoted');
        });
    };

    var beforePromote = function (form) {
        var onlyConfirmation = form.attr('data-only-confirmation');
        if (onlyConfirmation) {
            Sana.Popup.open('#quotePromotionConfirmationPopup');
            return false;
        }

        var inStock = form.attr('data-instock');
        if (inStock) {
            postQuotePromotion(form);
            return true;
        }

        var checkStock = form.attr('data-checkstock');
        if (checkStock) {
            Sana.Popup.open('#quoteCannotBePromoted');
            return false;
        }

        Sana.Popup.open('#productsInsufficientQuantity');
        return false;
    };

    var convertUtcDatesToLocal = function () {
        $('.date-utc').each(function (i, date) {
            var container = $(date);
            var localDate = new Date(container.text());
            container.text(localDate.toLocaleDateString());
        });
        $('.time-utc').each(function (i, date) {
            var container = $(date);
            var localDate = new Date(container.text());
            var t = localDate.toLocaleTimeString();
            // removing seconds part in a safe browser-independent way 
            // (taking in mind that time format depends on client's locale)
            t = t.replace(/\u200E/g, '');
            t = t.replace(/^([^\d]*\d{1,2}:\d{1,2}):\d{1,2}([^\d]*)$/, '$1$2');
            container.text(t);
        });
    };

    var showError = function (error) {
        var $errorMsg = $('#general-error');
        $errorMsg.text(error);
        $errorMsg.removeClass('hide');
    }

    var disableEditOrder = function () {
        $('.btn-edit').addClass('hide');
        $('.btn-edit:disabled').removeClass('hide');
    };

    var editOrder = function () {
        Sana.UI.LoadingIndicator.show();

        var $button = $('.btn-edit:enabled'),
            actionUrl = $button.attr("data-action-url"),
            orderId = $button.attr("data-order-id");
        $.post(actionUrl, { orderId: orderId, __RequestVerificationToken: Sana.Utils.getAntiForgeryToken() }).always(function (data) {
            Sana.UI.LoadingIndicator.hide();
            if (data.errorMessage) {
                disableEditOrder();
                showError(data.errorMessage);
            }
        });
    };

    var init = function () {
        convertUtcDatesToLocal();

        $document.on('click', '.authorization-cancel-link', function () {
            Sana.Popup.open('#authorizationCancelPopup');
        });

        $document.on('click', '.orders-details-page .btn-promote-to-order', function () {
            var form = $('#quotePromotionForm');
            beforePromote(form);
        });

        $document.on('click', 'a.btn-report', function () {
            Sana.UI.LoadingIndicator.show();
            var reportIsPreparingMsg = $('#reportIsPreparingMsg').removeClass('hide');
            var fileDownloadFailMsg = $('#fileDownloadFailMsg').addClass('hide');
            $.fileDownload($(this).attr('href'), {
                successCallback: function () {
                    reportIsPreparingMsg.addClass('hide');
                    Sana.UI.LoadingIndicator.hide();
                },
                failCallback: function () {
                    reportIsPreparingMsg.addClass('hide');
                    fileDownloadFailMsg.removeClass('hide');
                    Sana.UI.LoadingIndicator.hide();
                }
            });
            return false;
        });

        $document.on('click', '.orders-details-page .btn-continue-promote', function (e) {
            Sana.Popup.close('#productsInsufficientQuantity, #exceededCreditLimit');
            var cnt = $('#quotePromotionForm');
            var exceededCreditLimitPopup = $(this).closest('#exceededCreditLimit');
            postQuotePromotion(cnt, exceededCreditLimitPopup.length > 0, exceededCreditLimitPopup.attr('data-action-url'));
        });

        $document.on('click', '#orderHistoryDetailPage .btn-decline-order', function () {
            Sana.Popup.open('#orderBeforeDeclinedPopup');
        });

        $document.on('click', '.btn-edit', function () {
            $.post(el.attributes['data-is-basket-empty-url'].value, function (isEmpty) {
                if (isEmpty) {
                    editOrder();
                    return;
                }
                Sana.Popup.open('#edit-order-confirmation-popup');
            });
        });

        $document.on('click', '#edit-order-confirmation-popup .btn-continue', function () {
            Sana.Popup.close('#edit-order-confirmation-popup');
            editOrder();
        });

        adaptTolargeOrders();

        Sana.Print.init();
    };

    page.onAuthorizationApproved = function (data) {
        $('#orderAuthorizationFormWrapper').html(data);
        convertUtcDatesToLocal();

        var approveFailed = $('#orderAlreadyApproved').length;
        if (approveFailed) {
            Sana.Popup.open('#orderAlreadyApproved');
            $document.on('click', '.authorization-cancel-link', function () {
                Sana.Popup.close('#orderAlreadyApproved');
            });
        } else {
            Sana.Popup.open('#orderAfterApprovedPopup');
        }
    };

    page.onAuthorizationDeclined = function (data) {
        Sana.Popup.close('#orderBeforeDeclinedPopup');
        $('#orderAuthorizationFormWrapper').html(data);
        convertUtcDatesToLocal();

        var declineFailed = $('#orderAlreadyDeclined').length;
        if (declineFailed) {
            Sana.Popup.open('#orderAlreadyDeclined');
            $document.on('click', '.authorization-cancel-link', function () {
                Sana.Popup.close('#orderAlreadyDeclined');
            });
        } else {
            Sana.Popup.open('#orderAfterDeclinedPopup');
        }
    };

    page.onAuthorizationCancelled = function (data) {
        Sana.Popup.close('#authorizationCancelPopup');
        $('#orderAuthorizationFormWrapper').html(data);
        convertUtcDatesToLocal();
    };

    page.onDeclineOperationFailed = function () {
        Sana.Popup.close('#orderBeforeDeclinedPopup');
        Sana.Popup.open('#generalFailurePopup');
    };

    page.onCancelOperationFailed = function () {
        Sana.Popup.close('#authorizationCancelPopup');
        Sana.Popup.open('#generalFailurePopup');
    };

    page.onOperationFailed = function () {
        Sana.Popup.open('#generalFailurePopup');
    };

    var onReorder = function (response) {
        if (response.CanBeReordered === false) {
            var orderHasNoProductsThatCanBeReorderedMsg = $('#orderHasNoProductsThatCanBeReorderedMsg').removeClass('hide');
            setTimeout(function () {
                orderHasNoProductsThatCanBeReorderedMsg.addClass('hide');
            }, 10000);
            Sana.UI.LoadingIndicator.hide();
            return;
        }

        var callback = response.Url ? function () {
            location.href = response.Url;
        } : undefined;
        Sana.GoogleTagManager.trackProductAddition(response.Items, response.ActionField, response.CustomerType, callback);
    };

    var onReorderFail = function (response) {
        var failedToReorderMsg = $('#failedToReorderMsg').removeClass('hide');
        setTimeout(function () {
            failedToReorderMsg.addClass('hide');
        }, 10000);
        Sana.UI.LoadingIndicator.hide();
    };

    var reorder = function () {
        Sana.UI.LoadingIndicator.show()

        var $form = $('#reorder-form'),
            actionUrl = $form.attr('action'),
            formData = $form.serialize();
        $.post(actionUrl, formData).done(onReorder).fail(onReorderFail);
    };

    $document.on('submit', '#reorder-form', function () {
        $.post(el.attributes['data-is-basket-empty-url'].value, function (isEmpty) {
            if (isEmpty) {
                reorder();
                return;
            }
            Sana.Popup.open('#reorder-confirmation-popup');
        });
        return false;
    });

    $document.on('click', '#reorder-confirmation-popup .btn-continue', function () {
        Sana.Popup.close('#reorder-confirmation-popup');
        reorder();
    });

    page.onLoadingToInvoiceCheckoutSuccess = function (result) {
        if (result.redirectUrl)
            document.location.href = result.redirectUrl;
    };

    init();

    return page;
}());;
(function () {
    var el = document.getElementById('orderHistoryPage') ||
        document.getElementById('quoteHistoryPage') ||
        document.getElementById('invoicesHistoryPage') ||
        document.getElementById('rmaHistoryPage') ||
        document.getElementById('returnReceiptsHistoryPage') ||
        document.getElementById('creditNotesHistoryPage') ||
        document.getElementById('shipmentsHistoryPage');
    if (!el)
        return;

    var sanaText = JSON.parse($('#data-texts').text() || '{}');

    function Order(data) {
        var self = this;

        for (var val in data) {
            this[val] = data[val];
        }

        this.trackingLink = Sana.Urls.AddHttpIfNeeded(data.ShippingTrackingUrl);
        this.trackingText = data.ShippingTrackingText;

        this.isSelected = ko.observable();
        this.actionState = function (currency) {
            if (this.OutstandingAmountValue <= 0) {
                return {
                    icon: 'status-paid',
                    title: sanaText.actionTitlePaid,
                    template: 'action-static-template'
                };
            } else if (this.IsOverdue) {
                return {
                    icon: 'status-overdue',
                    title: sanaText.actionTitleOverdue,
                    template: 'action-static-template'
                };
            } else if (this.PaymentStatus === 'inprogress') {
                return {
                    icon: 'status-progress',
                    title: sanaText.actionTitleProgress,
                    template: 'action-static-template'
                };
            } else if (currency && currency !== this.CurrencyId) {
                return {
                    isEnabled: false,
                    title: sanaText.actionTitleCurrencyMismatch,
                    template: 'action-dynamic-template'
                };
            }

            return {
                isEnabled: true,
                template: 'action-dynamic-template'
            };
        };
    }

    function OrderListViewModel() {
        var self = this;
        self.loaded = ko.observable(false);
        self.loading = ko.observable(false);

        var load = function (callback) {
            self.loading(true);
            Sana.UI.LoadingIndicator.show();
            var params = self.filter.toJSON();
            $.post(
                document.location.href,
                params,
                function (data) {
                    var orders = ko.utils.arrayMap(data.Items, function (item) {
                        return new Order(item);
                    });
                    callback(orders);
                    self.loaded(true);
                    self.hasMore(self.orders().length < data.TotalCount);
                    self.loading(false);
                    Sana.UI.LoadingIndicator.hide();
                }
            );
            self.filter.page++;
        };

        self.orders = ko.observableArray([]);
        self.empty = ko.computed(function () { return self.orders().length === 0; });
        self.filter = {
            page: 0,
            OrderType: $(el).find('input[name="filter.OrderType"]').val(),
            OrderId: ko.observable($(el).find('input[name="filter.OrderId"]').val()),
            DocumentId: ko.observable($(el).find('input[name="filter.DocumentId"]').val()),
            StartDate: ko.observable($(el).find('input[name="Filter.StartDate"]').val()),
            EndDate: ko.observable($(el).find('input[name="Filter.EndDate"]').val()),

            toJSON: function () {
                return {
                    page: this.page,
                    OrderId: this.OrderId,
                    DocumentId: this.DocumentId,
                    OrderType: this.OrderType,
                    StartDate: this.StartDate,
                    EndDate: this.EndDate
                };
            }
        };

        self.hasMore = ko.observable(false);
        self.search = function () {
            if ($(el).find('form').valid()) {
                self.filter.page = 0;
                load(function (data) {
                    self.orders(data);
                });
            }
        };
        self.loadMore = function () {
            load(function (items) {
                $.each(items, function () {
                    self.orders.push(this);
                });
            });
        };
        self.selectedDocuments = ko.computed(function () {
            return _.filter(self.orders(), function (order) {
                return order.isSelected();
            });
        });
        self.isPaymentAvailable = ko.computed(function () {
            return self.selectedDocuments().length > 0;
        });
        self.outstandingAmountTotal = ko.computed(function () {
            return self.selectedDocuments().map(function (d) {
                return d.OutstandingAmountValue;
            }).reduce(function (a, b) {
                var utils = Sana.Utils;
                return utils.parseNumber(a) + utils.parseNumber(b);
            }, 0);
        });
        self.currencyOfSelectedOrders = ko.computed(function () {
            var orders = self.selectedDocuments();
            return !orders.length ? null : orders[0].CurrencyId;
        });
        self.pay = function (actionUrl) {
            var documentInfo = self.selectedDocuments().map(function (d) {
                return {
                    OrderId: d.Id,
                    OriginalOrderId: d.OriginalOrderId
                };
            });

            Sana.UI.LoadingIndicator.show();
            $.post(
                actionUrl,
                {
                    documents: documentInfo,
                    __RequestVerificationToken: Sana.Utils.getAntiForgeryToken()
                }).done(function (result) {
                    if (result.redirectUrl)
                        document.location.href = result.redirectUrl;
                }).fail(function () {
                    Sana.UI.LoadingIndicator.hide();
                    var $errorMsgElement = $('.msg-pay-invoices-error');
                    $errorMsgElement.removeClass('hide');
                    setTimeout(function () {
                        $errorMsgElement.addClass('hide');
                    }, 10000);
                });
        };
        self.afterApply = function () {
            self.search();

            $('.gvi-orders').resTables();

            // Validate date fields on change
            $(document).on('change', '.tbx-date input', function () {
                $(this).valid();
            });
        };
    }

    var viewModel = new OrderListViewModel();
    ko.applyBindings(viewModel, el);
    $(viewModel.afterApply);
})();;
(function () {
    var el = document.getElementById('orderTemplatesPage');
    if (!el)
        return;

    function OrderTemplatesViewModel() {
        var self = this;

        var openTemplateAction = $('.gvi-order-templates').data('open-action');

        self.checkedValues = ko.observableArray([]);

        self.showValidation = ko.observable(false);

        self.anyIsChecked = ko.computed(function () {
            return self.checkedValues().length > 0;
        });

        self.checkedValues.subscribe(function () {
            self.showValidation(false);
        });

        var sendData = function (url, callback) {
            if (!self.anyIsChecked()) {
                self.showValidation(true);
                return;
            }

            var form = $('#orderTemplatesPage form');
            var data = form.serializeArray();
            data.push({ name: '__RequestVerificationToken', value: $('input[name="__RequestVerificationToken"]:first').val() });
            if (!url) {
                url = form.attr("action");
            }

            Sana.UI.LoadingIndicator.show();
            $.ajax({
                url: url,
                type: 'post',
                data: data,
                success: function (data) {
                    Sana.UI.LoadingIndicator.hide();
                    var btn = $('#messagesPopup').html(data).find('.btn-close-dialog');
                    if (callback) {
                        callback();
                    }
                    Sana.Popup.open('#messagesPopup', {
                        afterClose: function () {
                            window.location.href = btn.attr('href');
                        }
                    });
                }
            });
        };

        self.submit = function () {
            sendData(undefined, function () {
                var container = $('#messagesPopup [data-tracking-data]');
                var data = container.data('tracking-data');
                if(data && data.Count)
                    Sana.GoogleTagManager.trackProductAddition(data.Items, data.ActionField, data.AccountType);
            });
        };

        self.remove = function (data, event) {
            sendData($(event.target).attr('data-action'));
        };

        self.openTemplate = function (data, event) {
            Sana.UI.LoadingIndicator.show();
            var link = $(event.target);
            var detailsPopup = $('#detailsPopup');
            detailsPopup.load(openTemplateAction, {
                templateId: link.attr('data-id')
            }, function () {
                Sana.UI.LoadingIndicator.hide();
                Sana.Popup.open(detailsPopup);
            });
        };
    };

    var viewModel = new OrderTemplatesViewModel();
    ko.applyBindings(viewModel, el);
})();;
(function () {
    var pageSelector = "#paymentPage",
        $container = $(pageSelector);

    if ($container.length === 0) return;

    var $priceElement = $('#totalPrice', $container),
        $additionalPaymentStepBlock = $('.additional-payment-data-block', $container),
        stepsTemplates = {};

    $.each(
        $('script[data-related-payment-method-id]', $additionalPaymentStepBlock),
        function (index, template) {
            var $template = $(template);
            stepsTemplates[$template.attr('data-related-payment-method-id')] = $template.html();
        }    
    );

    var getCurrentAdditionalStepHtml = function (paymentMethodId) {
        return stepsTemplates[paymentMethodId] || '';
    };

    var updateTotalAmount = function () {
        var $paymentMethodRadioButton = $(this),
            paymentMethodId = $paymentMethodRadioButton.val(),
            totalAmount = $paymentMethodRadioButton.data('total-amount');

        $priceElement.text(totalAmount);
        showPaymentFields(paymentMethodId);
    };

    var showPaymentFields = function (paymentMethodId) {
        var currentStepHtml = getCurrentAdditionalStepHtml(paymentMethodId);

        $additionalPaymentStepBlock.html(currentStepHtml);

        if (currentStepHtml) {
            Sana.UI.refreshValidationFor(pageSelector);
            $additionalPaymentStepBlock.find('select')._selectmenu();
            Sana.DatePickerDropdowns.init();
            Sana.ExtraStep.notifyStepRendered();
        }
    };

    $('input[name="PaymentMethodId"]', $container).change(updateTotalAmount);
    showPaymentFields($('input[name="PaymentMethodId"]:checked').val());

    $container.find('form').on('submit', function (e) {
        $form = $(this);
        if ($form.find('.additional-payment-data.extra-step').length > 0) {
            var extraStepData  = Sana.ExtraStep.getExtraStepData();
            if (!extraStepData  || typeof extraStepData  !== 'object') {
                return;
            }

            e.preventDefault();

            var $newForm = $(document.createElement('form')),
                $fragment = $(document.createDocumentFragment());

            $newForm.attr('action', $form.attr('action'));
            $newForm.attr('method', 'POST');

            var addInputsFrom = function (currentFieldName, value) {
                if (value !== Object(value)) {
                    // in case of primitive
                    $fragment.append('<input type="hidden" name="' + currentFieldName + '" value="' + value + '"/>');
                    return;
                }

                if (value.forEach) {
                    value.forEach(function (element, index) {
                        addInputsFrom(currentFieldName + '[' + index + ']', element);
                    });
                    return;
                }

                var prefix = currentFieldName ? currentFieldName + '.' : '';
                for (var f in value) {
                    if (!value.hasOwnProperty(f))
                        continue;

                    addInputsFrom(prefix + f, value[f]);
                }
            };
            addInputsFrom('', extraStepData);

            $form.find(':input:enabled').each(function () {
                var $input = $(this),
                    type = $input.attr('type');
                if ((type === 'radio' || type === 'checkbox') && !$input.prop('checked'))
                    return;
                if ($(this).closest('.additional-payment-data').length === 0) {
                    $fragment.append('<input type="hidden" name="' + this.name + '" value="' + this.value + '"/>');
                }
            });

            $newForm.append($fragment);
            $(document.body).append($newForm);

            $newForm.submit();
        }
    });
})();;
$(function () {
    var el = document.getElementById('paymentMethodsTable');
    if (!el) {
        return;
    }

    $('.gvi-methods').resTables();
    $('.checkout-text > span').tooltip();

    if ($('.checkout-step .col-method-selection').find('input[type="radio"][data-payment-id="SagePay"]:checked').length) {
        showSagePayList();
        //$('.dv-view-sage-ist').show();
    }

    $('.checkout-step .col-method-selection').find('input[type="radio"]').on('change', function () {
        if ($(this).attr('data-payment-id') == 'SagePay') {
            if ($(this).is(':checked')) {
                showSagePayList();
                //$('.dv-view-sage-ist').show();
            }
            else {
                $('.dv-view-sage-ist').hide();
            }
        }
        else {
            $('.dv-view-sage-ist').hide();
        }
        
    });

    function showSagePayList() {
        var isGuest = $('#IsGuest').val() == 'True';

        if (!isGuest) $('.dv-view-sage-ist').show();
    }

});;
$(function () {
    var $cnt = $('#productComparePage');
    if (!$cnt.length)
        return;

    Sana.UI.initRatingPlugin();

    $('#clear', $cnt).on('click', function (e) {
        e.preventDefault();
        Sana.Utils.removeStoredValue('SanaComparePopupToggled');

        Sana.UI.LoadingIndicator.show();

        var $target = $(this);
        $.post($target.attr('data-clear-url'), {
            __RequestVerificationToken: Sana.Utils.getAntiForgeryToken()
        }, function () {
            location.href = $target.attr('href');
        });
    });

    $('#onlyShowDifferences', $cnt).on('change', function () {
        var $specificationGroups = $('.product-specification-group', $cnt);

        if (!this.checked) {
            $specificationGroups.removeClass('hide');
            return;
        }

        $specificationGroups.each(function () {
            var $specificationGroup = $(this);
            var values = $('.specification-value', $specificationGroup).map(function () {
                return $(this).attr('data-value').toString();
            }).get();

            var allEqual = values.every(function (value) { return value === values[0]; });
            if (allEqual)
                $specificationGroup.addClass('hide');
        });
    });

    $('.compared-product-tile .btn-remove', $cnt).on('click', function (e) {
        e.preventDefault();

        Sana.UI.LoadingIndicator.show();
        if ($cnt.find('.btn-remove').length <= 1)
            Sana.Utils.removeStoredValue('SanaComparePopupToggled');

        var $target = $(this);
        $.post($target.attr('data-remove-url'), {
            __RequestVerificationToken: Sana.Utils.getAntiForgeryToken(),
            comparedSku: $target.data('compared-sku')
        }, function () {
            location.href = $target.attr('href');
        });
    });


    // ------------ SWIPE ------------
    (function () {
        var $swipeContainer = $cnt,
            $prodSpecificationRows = $cnt.find('.specification-row, .reviews-row, .product-tiles-row');
        if (!$prodSpecificationRows.length) return;

        var $firstBaseCell = $prodSpecificationRows.children(':first'),
            $rowWithButtons = $('.compare-tiles-wrp'),
            $buttons,
            _btnsClass = 'compare-btn',
            _shift = 0,
            _maxSwipePosition = 1,
            _baseColWidth = 25,
            _maxDeltaX = _baseColWidth,
            _swiping = false,
            _scrolling = false,
            _containerWidth, _columnsLength, _availiableCols, _maxRightSwipe,
            _touches, _touchObject = { currentSlide: 0, currentShift: 0 };

        function applyTransition() {
            $prodSpecificationRows.css(
                'transition',
                'transform' + ' ' + 500 + 'ms ' + 'ease');
        };

        function clearTransition() {
            $prodSpecificationRows.css('transition', '');
        }

        function setCss(val) {
            $prodSpecificationRows.css('transform', 'translate3d(' + val + '%, 0, 0)');
        }

        function setRowsPosition() {
            setCss(_shift);
        }

        function isSwipingPossible() {
            return _columnsLength * _baseColWidth > 100;
        }

        function correctSwipePostion() {
            _shift = _touchObject.currentShift;
            var prevSlide = _touchObject.currentSlide,
                nextSlide = _shift / -_baseColWidth,
                accuracyNum = Math.abs(nextSlide % 1),
                direction = nextSlide > prevSlide;

            _touchObject.currentSlide = accuracyNum > 0.2 && direction || accuracyNum > 0.8 && !direction ? Math.ceil(nextSlide) : Math.floor(nextSlide);
        }

        function refreshSwipeData() {
            _columnsLength = $('.product-tiles-row').first().children('.compare-column').length;
            _availiableCols = Math.floor(100 / _baseColWidth);
            _maxSwipePosition = _columnsLength - _availiableCols;
        }

        function swipeStart(e) {
            clearTransition();
            if (_swiping) return;
            _swiping = true;
            _scrolling = false;

            _baseColWidth = parseFloat($firstBaseCell.css('flex-basis').slice(0, -1));
            _maxRightSwipe = -_baseColWidth * _maxSwipePosition - _maxDeltaX;

            if (e.originalEvent !== undefined && e.originalEvent.touches !== undefined) {
                _touches = e.originalEvent.touches[0];
            }

            _touchObject.startX = _touchObject.curX = _touches !== undefined ? _touches.pageX : e.clientX;
            _touchObject.startY = _touchObject.curY = _touches !== undefined ? _touches.pageY : e.clientY;
        }


        function swipeMove(e) {
            _touches = e.originalEvent !== undefined ? e.originalEvent.touches : null;
            if (!_swiping || _touches && _touches.length !== 1) return;

            var deltaX = 0,
                tpmShift = 0,
                verticalSwipeLength = 0,
                horizontalSwipeLength = 0;

            _touches = e.originalEvent !== undefined ? e.originalEvent.touches : null;
            _touchObject.curX = _touches !== undefined ? _touches[0].pageX : e.clientX;
            _touchObject.curY = _touches !== undefined ? _touches[0].pageY : e.clientY;

            horizontalSwipeLength = _touchObject.curX - _touchObject.startX;
            verticalSwipeLength = _touchObject.curY - _touchObject.startY;

            _containerWidth = $swipeContainer.width();
            deltaX = Math.round(horizontalSwipeLength * 100) / _containerWidth;

            var r = Math.atan2(verticalSwipeLength, horizontalSwipeLength);
            swipeAngle = Math.round(r * 180 / Math.PI);

            if (swipeAngle < 0) {
                swipeAngle = 360 - Math.abs(swipeAngle);
            }

            if (swipeAngle >= 225 && swipeAngle <= 315 || swipeAngle <= 135 && swipeAngle >= 35) {
                _scrolling = true;
                return;
            } else {
                e.preventDefault();
            }

            if (Math.abs(_shift) !== deltaX && !_scrolling) {
                _touchObject.currentDeltaX = deltaX;
                tpmShift = _shift + deltaX;

                if (tpmShift > _maxDeltaX) {
                    tpmShift = _maxDeltaX;
                } else if (tpmShift < _maxRightSwipe) {
                    tpmShift = _maxRightSwipe;
                }

                setCss(tpmShift);
                _touchObject.currentShift = tpmShift;
            }
        }

        function swipeEnd() {
            if (!_swiping) return;
            _swiping = false;
            _scrolling = false;

            _containerWidth = $swipeContainer.width();
            correctSwipePostion();

            if (_touchObject.currentSlide < 0) {
                _touchObject.currentSlide = 0;
            } else if (_touchObject.currentSlide > _maxSwipePosition) {
                _touchObject.currentSlide = _maxSwipePosition;
            }
            _touchObject.currentShift = _shift = _touchObject.currentSlide * -_baseColWidth;
            applyTransition();
            setRowsPosition();
            refreshButtons();
            _touchObject.currentDeltaX = 0;
        }

        function swipeHandler(e) {
            if ('ontouchend' in document && e.type.indexOf('mouse') !== -1) return;

            refreshSwipeData();
            if (!isSwipingPossible()) return;

            switch (e.data.action) {
                case 'start':
                    swipeStart(e);
                    break;
                case 'move':
                    swipeMove(e);
                    break;
                case 'end':
                    swipeEnd(e);
                    break;
            }
        };

        function swipeResizeRefresh() {
            _shift = _touchObject.currentShift = 0;
            _touchObject.currentSlide = 0;
            _baseColWidth = parseFloat($firstBaseCell.css('flex-basis').slice(0, -1));
            setRowsPosition();
            refreshButtons();
            $rowWithButtons.toggleClass('with-buttons', isSwipingPossible());
        };

        function initButtonsMarkup() {
            $rowWithButtons
                .toggleClass('with-buttons', isSwipingPossible())
                .prepend(
                    '<button type="button" class="' + _btnsClass + ' slick-prev slick-disabled" />' +
                    '<button type="button" href="#" class="' + _btnsClass + ' slick-next" />'
                );
            $buttons = $cnt.find('.' + _btnsClass);
        }

        function refreshButtons() {
            refreshSwipeData();
            $buttons.removeClass('slick-disabled');
            if (_touchObject.currentSlide === 0)
                $buttons.filter('.slick-prev').addClass('slick-disabled');
            if (_touchObject.currentSlide === _maxSwipePosition)
                $buttons.filter('.slick-next').addClass('slick-disabled');
        }

        function btnsClickHandler(e) {
            var $this = $(e.target);
            _maxSwipePosition = _columnsLength - _availiableCols;

            if ($this.hasClass('slick-prev')) {
                _touchObject.currentSlide -= 1;
                _touchObject.currentShift += _touchObject.currentSlide < 0 ? 0 : _baseColWidth;
            }
            if ($this.hasClass('slick-next')) {
                _touchObject.currentSlide += 1;
                _touchObject.currentShift -= _touchObject.currentSlide > _maxSwipePosition ? 0 : _baseColWidth;
            }
            _swiping = true;
            refreshButtons();
            swipeEnd();
        }

        $swipeContainer
            .off('.SWIPE')
            .on('touchstart.SWIPE mousedown.SWIPE', {
                action: 'start'
            }, swipeHandler)
            .on('touchmove.SWIPE mousemove.SWIPE', {
                action: 'move'
            }, swipeHandler)
            .on('touchend.SWIPE mouseup.SWIPE touchcancel.SWIPE mouseleave.SWIPE', {
                action: 'end'
            }, swipeHandler)
            .on('dragstart.SWIPE', '[draggable!=true]', function (e) {
                e.preventDefault();
            })
            .on('click.SWIPE', function (e) {
                if (Math.abs(_touchObject.currentDeltaX) >= 1.5) {
                    e.stopImmediatePropagation();
                    e.stopPropagation();
                    e.preventDefault();
                }
                if ($(e.target).hasClass(_btnsClass))
                    btnsClickHandler(e);
            });

        $(window)
            .off('.SWIPE')
            .on('orientationchange.SWIPE', swipeResizeRefresh);

        Sana.Layout.addFunction(swipeResizeRefresh, 'DESKTOP');
        Sana.Layout.addFunction(swipeResizeRefresh, 'TABLET');
        Sana.Layout.addFunction(swipeResizeRefresh, 'MOBILE');
        _columnsLength = $('.specification-row').first().children('.compare-column').length;
        initButtonsMarkup();
        swipeResizeRefresh();
        Sana.ResponsiveImages.loadAll($rowWithButtons);
    })();


    // ------------ STICKY ------------
    var StickyTiles = function (container, opts) {
        this.$container = $(container);
        if (!container || !this.$container.length) return;

        this.defaults = {
            offset_top: 0, // px
            offset_bottom: 0, // px
            offset_top_delay: 0 // percents 0.0-1.0
        };
        this.opts = opts;
        this.$railsContainer = this.$container.parent();
        this.$placeHolder = $('<div>');
        this.defaults = _.extend(this.defaults, opts);
        this.defaults.offset_top = Sana.Layout.layout === 'MOBILE' ? 0 : this.opts.offset_top;
        this.isSticky = false;
        this.isFixed = false;
        this.init();
    };

    StickyTiles.prototype.scrollHandler = function (e) {
        var OPTS = this.defaults;
        var $linker = this.isSticky ? this.$placeHolder : this.$container;
        var cliBounds = $linker[0].getBoundingClientRect();
        var topLine = cliBounds.top - OPTS.offset_top + OPTS.offset_top_delay * cliBounds.height;
        var stickyContainerHeight, railBottom, bottomLine;

        if (topLine <= 0) {
            if (!this.isSticky) {
                this.isSticky = true;
                this.$placeHolder.css('height', cliBounds.height + 'px');
                this.$container
                    .addClass('is-sticky has-sticky');
            }

            stickyContainerHeight = this.$container[0].getBoundingClientRect().height;
            railBottom = this.$railsContainer[0].getBoundingClientRect().bottom;
            bottomLine = railBottom - stickyContainerHeight - OPTS.offset_bottom - OPTS.offset_top;
            if (bottomLine <= 0) {
                if (!this.isFixed) {
                    this.isFixed = true;
                    this.$container
                        .addClass('is-fixed')
                        .removeClass('is-sticky')
                        .css('margin-bottom', OPTS.offset_bottom);
                };
            } else {
                if (this.isFixed) {
                    this.isFixed = false;
                    this.$container
                        .addClass('is-sticky')
                        .removeClass('is-fixed');
                }
            }

        } else {
            if (this.isSticky) {
                this.isSticky = false;
                this.resetSizes();
            }
        }
    };

    StickyTiles.prototype.resizeHandler = function () {
        this.defaults.offset_top = Sana.Layout.layout === 'MOBILE' ? 0 : this.opts.offset_top;
        this.resetSizes();
        this.scrollHandler();
    };

    StickyTiles.prototype.resetSizes = function () {
        this.isSticky = false;
        this.isFixed = false;
        this.$placeHolder.css('height', 0);
        this.$container.removeClass('is-sticky is-fixed has-sticky');
    };

    StickyTiles.prototype.attachEvents = function () {
        $(window)
            .on('scroll.compare-sticky', this.scrollHandler.bind(this))
            .on('resize.compare-sticky', this.resizeHandler.bind(this))
            .trigger('scroll');
    };

    StickyTiles.prototype.detach = function () {
        $(window).off('.compare-sticky');
        this.$railsContainer.removeAttr('style');
        this.$placeHolder.remove();
    };

    StickyTiles.prototype.init = function () {
        this.$container.before(this.$placeHolder);
        this.$railsContainer.css('position', 'relative');
        this.$container.removeAttr('style');
        this.attachEvents();
    };

    window.test = new StickyTiles('.product-tiles-section', {
        offset_top: 62,
        offset_top_delay: 0.695
    });
});;
/// <reference path="libraries/jquery.js" />
/// <reference path="sana.ui.js" />
var ProductDetails = (function () {
    var page = {};

    page.init = function () {
        Sana.Print.init();
        Sana.UI.priceStyle('.order-box');
        Sana.UI.initRatingPlugin();
        Sana.Spinner.init();
        Sana.ProductConfigurator.init();

        this.imageControls.init();
        this.dropdowns.init();

        this.matrix.init();
        this.prepacks.init();
        this.relatedProducts.init();
        this.addToWishlist.init();

        initVariantId();
        this.initUom();
        this.elementsRelocation();
        this.salesAgreementLines.init();

        $(document).on('click', '.hyp-volume-prices', function (e) {
            e.preventDefault();
            Sana.UI.LoadingIndicator.show();

            var link = $(this),
                form = link.closest('form'),
                dataSrc = link.attr('href'),
                productId = link.attr('data-productid'),
                variantId = form.find("[name='variantId']").val(),
                unitOfMeasureId = form.find("[name='unitOfMeasureId']").val();

            $.post(dataSrc, {
                productId: productId,
                variantId: variantId,
                unitOfMeasureId: unitOfMeasureId
            }, function (data) {
                $('#volumePricesPopup').html(data);
                Sana.Popup.open('#volumePricesPopup');
                $('.gvi-volume-prices').resTables();
                Sana.UI.LoadingIndicator.hide();
            });
        });

        $(document).on('click', '.hyp-bom', function () {
            var link = $(this);
            $.post(link.attr('data-url'), {
                productId: link.attr('data-productid'),
                variantId: link.attr('data-variantid')
            }, function (data) {
                $('#bomPopup').html(data);
                Sana.Popup.open('#bomPopup');
                $('.gvi-bom').resTables();
                Sana.UI.LoadingIndicator.hide();
            });
        });

        $(document).on('pagingChange', function (e, obj) {
            $(obj.newHtml).find('input.star').rating();
        });

        Sana.History.backButton('.hyp-back', 'returnurl');

        this.initLastViewedProducts();
    };

    var trackProductDetailsAction = function () {
        var $productForm = $('#product-form');
        var url = $productForm.attr('data-gtm-model-update-url');
        var data = {
            variantId: $productForm.find('[name=variantId]').val(),
            unitOfMeasureId: $productForm.find('[name=unitOfMeasureId]').val(),
        };

        $.get(url, data).done(function (response) {
            if (!response)
                return;

            Sana.GoogleTagManager.trackProductDetailsView(response);
        });
    };

    var skipGTMNotifyOnVaraintIdChange = false;
    var initVariantId = function () {
        $(document).on('change', 'select[name=variantId]', function (e, extraData) {
            if (skipGTMNotifyOnVaraintIdChange)
                return;

            trackProductDetailsAction();
        });
    };

    page.initUom = function () {
        var uomChangeUrl = window.location.href,
            cssOrderBox = '.order-box';

        if (!$(cssOrderBox).length) {
            return;
        }

        var updateControlsAfterHtmlChange = function () {
            skipGTMNotifyOnVaraintIdChange = true;
            ProductDetails.dropdowns.init();
            Sana.UI.refreshDropDowns();
            Sana.UI.priceStyle(cssOrderBox);
            skipGTMNotifyOnVaraintIdChange = false;
            if (Sana.ProductCompare.Selectors.getSelectorsCount())
                Sana.ProductCompare.Selectors.initTooltips();
        };

        $(document).on('change', 'select[name=unitOfMeasureId]', function (e, extraData) {
            var self = $(this),
                newUom = self.val();
            if (!newUom) {
                newUom = extraData.newUom;
            }
            ProductDetails.dropdowns.rememberSelection();
            Sana.UI.LoadingIndicator.show();

            var $selectedAgreementOption = $('.ddlb-sales-agreement-lines > select:first > option:selected'),
                selectedAgreementLineNo = $selectedAgreementOption.val(),
                agreementUom = $selectedAgreementOption.attr('data-uom');

            $.ajax(uomChangeUrl, {
                type: 'POST',
                data: { unitOfMeasureId: newUom },
            }).done(function (data) {
                Sana.Utils.replaceElements(data);
                var $agreementLineDropDown = $('.ddlb-sales-agreement-lines > select:first');
                if (!agreementUom || newUom.toLowerCase() == agreementUom.toLowerCase()) {
                    $agreementLineDropDown.val(selectedAgreementLineNo);
                } else {
                    $agreementLineDropDown.trigger('change');
                }
                updateControlsAfterHtmlChange();
                trackProductDetailsAction();
                $('aside #addToWishlist').attr('data-uom', self.val());
                Sana.UI.LoadingIndicator.hide();
            });
        });
    };

    page.imageControls = {
        init: function () {
            var $sliderS = $('.carousel-image-s'),
                $sliderM = $('.carousel-image-m'),
                $sliderL = $('.carousel-image-l');

            var loadImageLazily = function (event, slick, currentSlide, nextSlide) {
                if (!$(slick.$slider).is(':visible')) {
                    return;
                }

                _.delay(function () {
                    var current = slick.slickCurrentSlide(),
                        count = slick.slideCount,
                        visible = slick.slickGetOption('slidesToShow');

                    var filter = (count > visible && count - visible < current) ?
                        ':gt(' + (count - visible - 1) + ')' :
                        '.slick-active';

                    slick
                        .$slides
                        .filter(filter)
                        .find('img')
                        .lazy({
                            bind: 'event',
                            effect: "fadeIn",
                            effectTime: 300,
                            delay: 1
                        });
                });
            };

            var initMediumCarousel = function () {
                var settings = {
                    infinite: false,
                    arrows: false,
                    fade: true,
                    responsive: [{
                        breakpoint: 640,
                        settings: {
                            dots: true
                        }
                    }]
                };

                if (!Sana.Print.isOn()) {
                    settings.asNavFor = '.carousel-image-s';
                }

                var $slidesM = $sliderM.find('.carousel-image-m-item');
                var checkLegendVisibility = function (nextSlide) {
                    var hasLargeImage = $slidesM.eq(nextSlide || 0).is('.has-large-image');
                    $('.carousel-legend').toggleClass('invisible', !hasLargeImage);
                };

                $sliderM
                    .on('init', loadImageLazily)
                    .slick(settings)
                    .on('beforeChange', function (event, slick, currentSlide, nextSlide) {
                        loadImageLazily(event, slick, currentSlide, nextSlide);
                        checkLegendVisibility(nextSlide);
                    });

                _.each($slidesM, function (element, index, list) {
                    if ($('img', element).attr('data-zoom-image')) {
                        $(element).addClass('has-large-image');
                    }
                });

                checkLegendVisibility();
            };

            var initSmallCarousel = function () {
                if (Sana.Print.isOn() || !$sliderS.length) {
                    return;
                }

                var getNumberOfSlidesToShow = function () {
                    var slideWidth = 104;
                    return Math.floor($sliderS.width() / slideWidth) || 1;
                };

                var settings = {
                    slidesToShow: getNumberOfSlidesToShow(),
                    slidesToScroll: 1,
                    infinite: false,
                    focusOnSelect: true,
                    asNavFor: '.carousel-image-m'
                };

                $sliderS
                    .on('init', loadImageLazily)
                    .slick(settings)
                    .on('beforeChange', loadImageLazily);

                Sana.Layout.addResizeFunction(_.after(2, function () {
                    loadImageLazily('', $sliderS[0].slick);
                    $sliderS.slick('slickSetOption', 'slidesToShow', getNumberOfSlidesToShow(), true);
                }));
            };

            var initLargeCarousel = function () {
                if (Sana.Print.isOn()) {
                    return;
                }

                $sliderL
                    .slick({
                        dots: true,
                        infinite: false
                    })
                    .on('beforeChange', loadImageLazily);

                var $hypOpenL = $('.hyp-lightbox');
                $hypOpenL.magnificPopup({
                    preloader: false,
                    alignTop: true,
                    overflowY: 'hidden',
                    callbacks: {
                        open: function () {
                            var index = $sliderM.find('.slick-current').prevAll('.has-large-image').length;
                            $sliderL.slick('slickGoTo', index, true);

                            // Load image for slide with only one image
                            if ($sliderL[0].slick.$slides.length == 1) {
                                loadImageLazily('', $sliderL[0].slick);
                                $sliderL.slick('refresh');
                            }

                            // Enables arrow key navigation right after popup is open
                            _.delay(function () {
                                $sliderL.find('.slick-current').focus();
                            }, 100);
                        }
                    }
                });

                $(document).on('click.lightbox', '.carousel-image-m-item', function () {
                    if ($(this).is('.has-large-image')) {
                        $hypOpenL.magnificPopup('open');
                    }
                });
            };

            initSmallCarousel();
            initMediumCarousel();
            initLargeCarousel();
        },
        selectImageByTags: function (tags) {
            if (Sana.Print.isOn()) {
                return;
            }

            var $sliderM = $('.carousel-image-m'),
                images = $sliderM.find('.carousel-image-m-item').get().reverse(),
                goToIndex;

            for (var i = 0; i < images.length; i++) {
                var $img = $(images[i]);
                $.each(tags, function () {
                    if (this.toLowerCase() === $img.attr('data-image-tag').toLowerCase()) {
                        goToIndex = $img.index();
                        return false;
                    }
                });
            }

            if (typeof goToIndex !== 'undefined') {
                $sliderM.slick('slickGoTo', goToIndex, true);
            }
        }
    };

    page.dropdowns = {
        _selectedComponents: null,
        _rootSelector: '.product',
        _getComponentDropdowns: function () {
            return $('.order-box .ddlb-component select', this._rootSelector);
        },
        _getQtyInput: function () {
            return $('.tbx-quantity input[name="quantity"]', this._rootSelector);
        },
        init: function () {
            var ddls = this._getComponentDropdowns();
            if (!ddls.length) {
                ProductDetails.filterRetailOffers(null);
                return;
            }

            var values = this._selectedComponents;
            if (values == null) {
                var v = Sana.Utils.getQueryVariable('v');
                if (v) {
                    values = v.split(',');
                }
            }
            var last = null;
            ddls.each(function (i) {
                var cur = $(this);
                if (last != null) {
                    cur.dependent_on(last);
                }
                if (values) {
                    cur.val(values[i]);
                }
                last = cur;
            });

            ProductDetails.dropdowns.update(last);
            last.change(function () {
                ProductDetails.dropdowns.update($(this));
                ProductDetails.salesAgreementLines.resetValue();
            });
        },
        rememberSelection: function () {
            this._selectedComponents = this._getComponentDropdowns().map(function () {
                return $(this).val();
            });
        },
        setVariantForAgreement: function (agreementLineNo) {
            var ddls = this._getComponentDropdowns();
            if (ddls.length) {
                var $ddl = $(ddls[ddls.length - 1]);
                var optionGroups = $ddl.data('option-groups');
                for (var optionKey in optionGroups) {
                    var options = optionGroups[optionKey];
                    for (var optionIndex = 0; optionIndex < options.length; optionIndex++) {
                        var option = $(options[optionIndex]);
                        var agreementLiens = ProductDetails.salesAgreementLines.getAvailableAgreementLines(option.attr('data-available-sales-agreement-lines'));
                        if (agreementLiens.indexOf(agreementLineNo) != -1) {
                            var val = option.val();
                            $ddl.trigger('set-option', { option: val });
                            $ddl.val(val);
                            $ddl.trigger('change');
                            return;
                        }
                    }
                }
            }
        },
        update: function (v) {
            var o = v.find('option:selected');
            ProductDetails.dropdowns.updatePrice(o.attr('data-price'), o.attr('data-listprice'), o.attr('data-discount-percentage'), o.attr('data-discount-amount'));
            ProductDetails.dropdowns.updateInventory(o.attr('data-inventory'));
            ProductDetails.imageControls.selectImageByTags((o.attr('data-image-tags') || '').split(' '));
            ProductDetails.filterRetailOffers(o.attr('value'));
            ProductDetails.dropdowns.updateOrderability(o.is('[data-not-orderable]'));
            ProductDetails.salesAgreementLines.showFor(o.attr('data-available-sales-agreement-lines'));
            $('a.hyp-bom').attr('data-variantid', o.attr('value'));
        },
        updateInventory: function (value) {
            var inv = parseFloat(value);
            $('.stock-row', this._rootSelector).each(function () {
                var i = $(this);
                var min = parseFloat(i.attr('data-min'));
                var max = parseFloat(i.attr('data-max'));
                var hide = inv <= min || inv > max;
                i.toggleClass('hide', hide);
                if (!hide) {
                    var maxStock = parseFloat(i.attr('data-max-stock'));
                    var stockMessage = maxStock >= 0 && inv > maxStock ? i.attr('data-custom-stock-message') : inv;
                    i.find('.stock-amount').text(stockMessage);
                }
            });
        },
        updateDiscount: function (selector, value) {
            $(selector, this._rootSelector)
                .toggleClass('hide', !value)
                .html(value || '&nbsp;');
        },
        updatePrice: function (price, listPrice, discountPercent, discountAmount) {
            this.updateDiscount('.main .list-price-discount.discount-percentage', discountPercent);
            this.updateDiscount('.main .list-price-discount.discount-price', discountAmount);

            $('.main .lbl-price', this._rootSelector).text(price);
            var showListPrice = listPrice && price != listPrice;
            $('.main .list-price', this._rootSelector)
                .toggleClass('hide', !showListPrice)
                .html(showListPrice ? listPrice : '&nbsp;');

            Sana.UI.priceStyle('.order-box');
        },
        updateOrderability: function (isNotAvailable) {
            var qtyInput = this._getQtyInput();
            if (!qtyInput) return;

            var qtyInputSpinner = qtyInput._spinner("instance");
            if (qtyInputSpinner) {
                isNotAvailable ? qtyInputSpinner.disable() : qtyInputSpinner.enable();
            }

            $('.order-box').toggleClass('state-variant-not-available', isNotAvailable);
        },
        onBeforeAddToBasket: function () {
            var qtyInput = ProductDetails.dropdowns._getQtyInput();
            var qty = Sana.Utils.parseNumber(qtyInput.val());
            if (!qty || isNaN(qty)) {
                return false;
            }
            Sana.BasketSummary.onBeforeChange();
        }
    };

    page.filterRetailOffers = function (variantId) {
        var cnt = $('#retailOffers');
        $('div[data-variant]', cnt).each(function () {
            var self = $(this);
            var dv = self.attr('data-variant');
            if (dv == '' || dv == variantId) {
                self.show();
            }
            else {
                self.hide();
            }
        });
        cnt.show();
        if (cnt.find('div:visible').length == 0) {
            cnt.hide();
        }
    };

    page.matrix = {
        init: function () {
            $(document).on('click', '.btn-matrix', function () {
                $('#matricesPopup').off('dialogopen.stickyhead');
                $('#matricesPopup').on('dialogopen.stickyhead', function (event, ui) {
                    Sana.Matrix.makeHeadersSticky();
                });

                Sana.Popup.open('#matricesPopup', {
                    dialogClass: 'matrices'
                });
            });

            Sana.Matrix.staticMode.init();
        }
    };

    page.prepacks = {
        formSelector: "#prepacksForm",
        init: function () {
            var pack = Sana.Utils.getQueryVariable('pack');
            if (pack) {
                $('.ddlb-prepack-selector select').val(pack);
            }

            $("#verticalCode").change(function () {
                ProductDetails.prepacks.onVariantChange();
            });

            $(this.formSelector + " input.numeric").on('spinstop', function () {
                ProductDetails.prepacks.onQuantityChange();
            });

            $(this.formSelector + " button[type='submit']").click(function (event) {
                ProductDetails.prepacks.onSubmit(event);
            });

            this.updatePrices();
        },
        validators: {
            selector: '#prepacksValidationMsg',
            check: function (quantity) {
                return quantity > 0;
            },
            showMessage: function (visible) {
                $(this.selector).toggleClass('hide', !visible);
            }
        },
        onVariantChange: function () {
            this.updatePrices();
        },
        onQuantityChange: function () {
            this.updateTotalQuantity();
            this.validators.showMessage(!$('#prepacksForm').valid());
        },
        onSubmit: function (event) {
            var quantity = this.calcTotalQuantity();
            if (!this.validators.check(quantity)) {
                this.validators.showMessage(true);
                event.preventDefault();
            } else {
                Sana.Popup.close('#matricesPopup');
            }
        },
        onBasketChanged: function (data) {
            Sana.BasketSummary.onChanged($("#prepackTotalCnt").html());
            $(ProductDetails.prepacks.formSelector + " input.numeric").val('');
            ProductDetails.prepacks.updateTotalQuantity();

            if (data && data.Count) {
                var callback = data.Url ? function () { location.href = data.Url; } : undefined;
                Sana.GoogleTagManager.trackProductAddition(data.Items, data.ActionField, data.CustomerType, callback);
            }
        },
        updatePrices: function () {
            var verticalCode = $("#verticalCode").val();
            var tbody = $(this.formSelector).find("table.gvi-prepacks tbody");

            var allRows = tbody.find("tr");
            allRows.hide();
            allRows.find(":input").prop("disabled", true);

            var currentRows = tbody.find("tr[data-src='" + verticalCode + "']");
            currentRows.show();
            currentRows.find(":input").prop("disabled", false);

            $(this.formSelector).find(".numeric").val('').change();
        },
        updateTotalQuantity: function () {
            var prepackTotalCnt = $("#prepackTotalCnt");
            var totalCountText = prepackTotalCnt.parents('.prepacks-count');
            var quantity = this.calcTotalQuantity();

            if (isNaN(quantity)) {
                totalCountText.hide();
                return;
            }

            var text = Sana.Utils.formatNumber(quantity);
            prepackTotalCnt.text(text);
            totalCountText.show();
        },
        calcTotalQuantity: function () {
            if (!$('#prepacksForm').valid()) {
                return NaN;
            }

            var sum = 0;
            $(this.formSelector + " input.numeric").each(function () {
                sum += Sana.Utils.parseNumber(this.value);
            });
            return Sana.Utils.roundQuantity(sum);
        }
    };

    page.elementsRelocation = function () {
        var $header = $('.details-info').find('h1, .product-id'),
            $addThis = $('.details-img').find('.add-this');

        var mobileRelocation = function () {
            $header.prependTo('.details-img');
            $addThis.insertAfter('.product .main');
        };

        var desktopAndTabletRelocation = function () {
            $header.prependTo('.details-info');
            $addThis.appendTo('.details-img');
        };

        if (Sana.Layout.layout == 'MOBILE') {
            mobileRelocation();
        }
        Sana.Layout.addFunction(mobileRelocation, 'MOBILE');
        Sana.Layout.addFunction(desktopAndTabletRelocation, 'TABLET');
        Sana.Layout.addFunction(desktopAndTabletRelocation, 'DESKTOP');
    };

    page.onBasketChanged = function (data) {
        Sana.BasketSummary.onChanged(data.Count);
        var callback = data.Url ? function () { location.href = data.Url; } : undefined;
        Sana.GoogleTagManager.trackProductAddition(data.Items, data.ActionField, data.CustomerType, callback);
    };

    page.addToWishlist = {
        selector: '#addToWishlist',
        init: function () {
            $(document).on('click', this.selector, function () {
                var $this = $(this);
                var url = $this.attr('data-url');
                var data = {
                    productId: $this.attr('data-product'),
                    unitOfMeasureId: $this.attr('data-uom'),
                    variantId: $('#product-form [name=variantId]').val(),
                    __RequestVerificationToken: $('input[name="__RequestVerificationToken"]:first').val()
                };
                Sana.UI.LoadingIndicator.show();
                $.post(url, data, function (result) {
                    Sana.UI.LoadingIndicator.hide();
                    var popup = $('#addToWishlistPopup').html(result);
                    var btn = popup.find('button');
                    var prevFocus = null;
                    btn.click(function () {
                        Sana.Popup.close(popup);
                    });
                    Sana.Popup.open(popup, {
                        afterClose: function () {
                            popup.html('');
                            if (prevFocus != null)
                                prevFocus.focus();
                        }
                    });
                    setTimeout(function () {
                        prevFocus = document.activeElement;
                        btn.focus();
                    }, 10);
                });
            });
        }
    };

    page.relatedProducts = {
        init: function () {
            Sana.TabsSliderHorizontal.init();
            $(Sana.TabsSliderHorizontal).on('selectTab', function (e, data) {
                Sana.Tabs.select(data);
            });
        }
    };

    page.initLastViewedProducts = function () {
        Sana.ProductsGroup.init('.last-viewed');
        Sana.UI.priceStyle('.last-viewed');
        Sana.UI.bindLastViewedProductsClear();
    };

    page.salesAgreementLines = {
        salesAgreementOptions: '.ddlb-sales-agreement-lines > select:first > option',
        init: function () {
            $(document).on('change', '.ddlb-sales-agreement-lines > select:first', function () {
                var $agreementDropDown = $(this),
                    $variantsPopUp = $agreementDropDown.parents('#variants:first');

                if ($variantsPopUp.length) {
                    var currentLine = $agreementDropDown.val(),
                        $cells = $variantsPopUp.find('.cell');

                    for (var i = 0; i < $cells.length; i++) {
                        var $cell = $($cells[i]);
                        var $inputBox = $cell.find('.tbx-quantity'),
                            $input = $inputBox.find('input[name$=Value]');
                        var availableAgreementLines = ProductDetails.salesAgreementLines.getAvailableAgreementLines($cell.attr('data-available-sales-agreement-lines'));
                        if (!currentLine || availableAgreementLines.indexOf(currentLine) != -1) {
                            if ($inputBox.is(':hidden')) {
                                $input.val($input.data('PrevValue'));
                            }
                            $inputBox.show();
                        } else {
                            if ($inputBox.is(':visible')) {
                                $input.data('PrevValue', $input.val());
                                // Remove a value for avoiding sending to the server. The input cannot be disabled because MVC, in this case, does not bind it.
                                $input.val('');
                            }
                            $inputBox.hide();
                        }
                        Sana.Matrix.staticMode.updateTotal();
                    }
                }

                var agreementUom = $agreementDropDown.find('option:selected').attr('data-uom');
                if (agreementUom) {
                    var $uomDropDown = $('.ddlb-uom > select:first');
                    if ($uomDropDown.length && $uomDropDown.val().toLowerCase() != agreementUom.toLowerCase()) {
                        $uomDropDown.val(agreementUom);
                        $uomDropDown.trigger('change', { newUom: agreementUom });
                    }
                }
            });

            var salesAgreementLineNo = Sana.Utils.getQueryVariable('salesagreementlineno');
            if (!salesAgreementLineNo) {
                return;
            }

            ProductDetails.dropdowns.setVariantForAgreement(salesAgreementLineNo);
            var $agreementLineDropDown = $('.ddlb-sales-agreement-lines > select:first');
            if (!$agreementLineDropDown.find('option[value="' + salesAgreementLineNo + '"]:first').length)
                return;

            $agreementLineDropDown.val(salesAgreementLineNo);
            Sana.UI.refreshDropDowns();
            $agreementLineDropDown.trigger('change');
        },
        getAvailableAgreementLines: function (availableAgreementLinesStr) {
            if (!availableAgreementLinesStr) {
                return [];
            }
            return JSON.parse(availableAgreementLinesStr);
        },
        showFor: function (availableSalesAgreementLinesStr) {
            var availableSalesAgreementLines = ProductDetails.salesAgreementLines.getAvailableAgreementLines(availableSalesAgreementLinesStr),
                hasValues = false,
                $agreementOptions = $(this.salesAgreementOptions);

            for (var i = 0; i < $agreementOptions.length; i++) {
                var $option = $($agreementOptions[i]),
                    value = $option.val();

                if (!value) {
                    continue;
                }
                if (availableSalesAgreementLines.indexOf(value) != -1) {
                    $option.prop('disabled', false);
                    hasValues = true;
                } else {
                    $option.prop('disabled', true);
                }
            }

            $('.row-sales-agreement-lines').toggleClass('hide', !hasValues);

            Sana.UI.refreshDropDowns();
        },
        resetValue: function () {
            var $agreementOptions = $(this.salesAgreementOptions);

            $agreementOptions.filter(':disabled').prop("selected", "");
            Sana.UI.refreshDropDowns();
        }
    };

    return page;
})();

$(function () {
    var el = document.getElementById('productPage');
    if (!el) {
        return;
    }
    ProductDetails.init();
});;
ProductListPage = (function () {
    var page = {};
    var $document = $(document);

    page.init = function () {
        Sana.UI.priceStyle('.product-list');
        Sana.Sorting.init();
        page.initialFacets = $('.filters-wrapper');
        Sana.Facets.init(function () {
            Sana.Toggler.init('.facet .hdr');
        });
        Sana.Spinner.init();

        $document.on('pagingChange', function (e, obj) {
            if (obj.setCount) {
                var productsCount = $('.product-list [data-id]').length;
                Sana.History.setUrlParam('count', productsCount);
            }

            if (page.initialFacets) {
                if (!page.facets)
                    page.facets = page.initialFacets;

                if (Sana.Layout.layout === 'MOBILE') {
                    page.facets.insertAfter('.filter-title');
                    page.facets
                        .hide()
                        .insertAfter('.filter-title');

                    if ($('.facet-selected').length) {
                        $('.filter-title').removeClass('collapsed').addClass('expanded');
                        page.facets.show();
                    }
                }
                    

                Sana.Facets.init();
            }

            page.refreshLines(obj.newHtml);
            if ($(obj.newHtml).find('.ddlb-sorting').length) {
                Sana.Sorting.init();
            }
        });

        page.initOrderMode();

        if (Sana.Layout.layout == 'MOBILE') {
            page.mobileLayout();
        } else {
            page.desktopAndTabletLayout();
        }
        Sana.Layout.addFunction(page.mobileLayout, 'MOBILE');
        Sana.Layout.addFunction(page.desktopAndTabletLayout, 'TABLET');
        Sana.Layout.addFunction(page.desktopAndTabletLayout, 'DESKTOP');

        page.initLastViewedProducts();
    };

    page.stickyAddToBasket = (function () {
        var $stickyRails = $('.sticky-rails');
        if (!$stickyRails.length) return;

        var $window = $(window),
            $amountText = $('#stickySelectedProductsAmount'),
            $listPanel = $('#product-list-panel'),
            $listOfProducts = $('#list-of-products'),
            $btnQuickOrderBottom = $('#btnQuickOrderBottom'),
            defaultHeaderStickyHeight = 62;

        var itemsBox = new Object({
            items: {},
            get itemsAmount() {
                var items = this.items,
                    sum = 0,
                    values = Object.keys(items).map(function (key) {
                        return items[key];
                    });

                values.forEach(function (itemValue) {
                    sum += itemValue;
                });
                return sum;
            }
        });

        var updateAmountText = function () {
            $amountText.text(itemsBox.itemsAmount);
        };

        var toggleStickyAddToBasket = function () {
            var winHeight = window.innerHeight,
                listBoundingRect = $listOfProducts[0].getBoundingClientRect(),
                headerStickyHeight = Sana.Layout.layout === 'MOBILE' ? 0 : defaultHeaderStickyHeight,
                siteBottomLine = document.querySelector('.site').getBoundingClientRect().bottom,

                isTopLine = listBoundingRect.top - headerStickyHeight <= 0,
                isBottomLine = listBoundingRect.bottom > winHeight,
                isEndOfSite = Math.floor(siteBottomLine) <= winHeight;

            $stickyRails.toggleClass('is-visible',
                !isEndOfSite && isTopLine && ($btnQuickOrderBottom.is(':visible') ? isBottomLine : true) && itemsBox.itemsAmount !== 0
            );
        };

        var updateItemsBox = function (prodId, value) {
            itemsBox.items[prodId] = value;
            updateAmountText();
            toggleStickyAddToBasket();
        };

        var handleStickyRefresh = function (e) {
            var $el = $(e.target),
                prodId = $el.closest('.l-products-item').attr('data-id'),
                value = $el.val() || '';

            if ($el.valid()) {
                updateItemsBox(prodId, value === '' ? 0 : 1);
            }
        };

        var resetAllItems = function () {
            itemsBox.items = {};
            updateAmountText();
            toggleStickyAddToBasket();
        };

        if (Sana.Layout.layout === 'DESKTOP') {
            $stickyRails.removeClass('is-compact');
        } else {
            $stickyRails.addClass('is-compact');
        }

        Sana.Layout.addFunction(function () {
            $stickyRails.removeClass('is-compact');
            toggleStickyAddToBasket();
        }, "DESKTOP");
        Sana.Layout.addFunction(function () {
            $stickyRails.addClass('is-compact');
            toggleStickyAddToBasket();
        }, "TABLET");
        Sana.Layout.addFunction(function () {
            $stickyRails.addClass('is-compact');
            toggleStickyAddToBasket();
        }, "MOBILE");

        $listPanel.on('spinstop.stickyAmount', '.numeric', handleStickyRefresh);
        $listPanel.on('change.stickyAmount', '.selected-quantity input[name="variants"]', handleStickyRefresh);
        $window.on('scroll.stickyAddToBasket', _.throttle(toggleStickyAddToBasket, 50));
        if ($('.paging-links').length) { 
            $document.on('pagingChange', function (e, data) {
                var $newHtml = $(data.newHtml);
                $amountText = $newHtml.find('#stickySelectedProductsAmount');
                $listOfProducts = $newHtml.filter('#list-of-products');
                $btnQuickOrderBottom = $newHtml.find('#btnQuickOrderBottom');
                $stickyRails = $newHtml.filter('.sticky-rails');
                resetAllItems();
                $stickyRails.toggleClass('is-compact', Sana.Layout.layout !== 'DESKTOP');
            });
        }

        toggleStickyAddToBasket();

        return {
            resetItem: function (productId) {
                updateItemsBox(productId, 0);
            },
            resetAllItems: resetAllItems
        };
    }());

    page.refreshLines = function (newLines) {
        $(newLines).find('.ddlb select')._selectmenu();
        Sana.UI.priceStyle(newLines);
        $.validator.unobtrusive.parse(newLines);
        $(newLines).trigger('htmlUpdated');
        if (Sana.ProductCompare.Selectors.getSelectorsCount())
            Sana.ProductCompare.Selectors.initTooltips();
    };

    page.initOrderMode = function () {
        // Initialize "Add to basket" buttons
        var addToBasketButtonSelector = '#btnQuickOrderTop, #btnQuickOrderBottom, #btnQuickOrderSticky';
        if ($(addToBasketButtonSelector).length == 0)
            return;

        $document.on('click', addToBasketButtonSelector, function () {
            page.stickyAddToBasket && page.stickyAddToBasket.resetAllItems();
            page._addToBasket();
        });

        // hide 'Add to basket' buttons when there are no available products
        page.changeAddButtonVisibility();

        // Initialize quantity text boxes
        $document.on('keydown', '.form-quantity', function (event) {
            if (event.which == 13) {
                page._addToBasket();
                return false;
            }
        });

        var checkSelectionLoss = function () {
            if (page._getLines().length > 0) {
                return page.selectionLost.open({
                    successCallback: page._addToBasket
                });
            }
        };

        // Initialize selection lost for sorting, facets and paging
        Sana.Sorting.onBeforeChange(checkSelectionLoss);
        Sana.Facets.onBeforeChange(checkSelectionLoss);
        Sana.Paging.onBeforeChange = checkSelectionLoss;

        // Initialize unit of measure selection for simple product
        $document.on('change', '.product-list select[name=unitOfMeasureId]', function () {
            page._onUnitOfMeasureChanged($(this));
        });

        $document.off('click', '.edit-selected').on('click', '.edit-selected', function () {
            $(this).closest('form').submit();
        });
    };

    page.changeAddButtonVisibility = function () {
        var changeVisibility = function () {
            var $rows = $('.product-list [data-id]'),
                $btns = $('.btn-add-inside'),
                $action = $rows.find('.tbx-quantity, .select-variants .btn');

            $btns.toggle(!!$action.length);
        };

        $document.on('htmlUpdated', '.product-list', changeVisibility);
        changeVisibility();
    };

    page.getVariants = function (element) {
        var value = element.val();
        return value != '' && typeof (value) != 'undefined' ? JSON.parse(value) : null;
    };

    var validateForms = function (elements) {
        var valid = true;
        elements.each(function (i, element) {
            if (!$(element).valid()) {
                valid = false;
                return false;
            }
        });

        return valid;
    };

    page._addToBasket = function () {
        if (!validateForms($('.form-quantity'))) {
            return;
        }

        var data = page._getLines();
        if (data.length > 0) {
            var postUrl = $('#btnQuickOrderTop').attr('data-src');
            return $.ajax({
                url: postUrl,
                type: 'post',
                data: {
                    lines: data,
                    __RequestVerificationToken: Sana.Utils.getAntiForgeryToken()
                },
                dataType: 'json',
                beforeSend: function (xhr) {
                    Sana.BasketSummary.onBeforeChange();
                },
                success: function (data) {
                    page._clearSelection();
                    Sana.BasketSummary.onChanged(data.Count);
                    if (data.Count) {
                        var callback = data.Url ? function () { location.href = data.Url; } : undefined;
                        Sana.GoogleTagManager.trackProductAddition(data.Items, data.ActionField, data.CustomerType, callback);
                    }
                }
            });
        }
    };

    page.onAddedToBasket = function (data) {
        if (data && data.Count) {
            Sana.BasketSummary.onChanged(data.Count);
            var callback = data.Url ? function () { location.href = data.Url; } : undefined;
            Sana.GoogleTagManager.trackProductAddition(data.Items, data.ActionField, data.CustomerType, callback);
        }
    };

    page._getLines = function () {
        var rows = $('.product-list [data-id]');
        return $.map(rows, function (row) {
            var productId = $(row).attr('data-id');
            var value = $(row).find('input[name^=product_quantity]').val();
            var unitOfMeasureId = $(row).find('select[name=unitOfMeasureId]').val();
            var salesAgreementLineNo = Sana.Utils.getQueryVariable('salesagreementlineno');
            var quantity = Sana.Utils.parseNumber(value);
            if (quantity > 0)
                return { productId: productId, variantId: '', quantity: quantity, unitOfMeasureId: unitOfMeasureId, salesAgreementLineNo: salesAgreementLineNo };
            else
                return page.getVariants($(row).find('input[name=variants]'));
        });
    };

    page._clearSelection = function () {
        var productList = $('.product-list');
        productList.find('input[name=variants]').val('');
        productList.find('input[name^=product_quantity]').val('');
        productList.children().removeClass('variants-selected');
    };

    page._onUnitOfMeasureChanged = function (unitOfMeasureSelector) {
        var product = unitOfMeasureSelector.parents('.product-list [data-id]');

        var unitOfMeasureId = unitOfMeasureSelector.val();
        var productId = product.attr('data-id');

        Sana.UI.LoadingIndicator.show();
        $.ajax({
            url: window.location.href,
            type: 'post',
            data: { unitOfMeasureId: unitOfMeasureId, productId: productId },
            success: function (data) {
                $newRow = $(data.trim());

                product.replaceWith($newRow);
                page.refreshLines($newRow);
                page.stickyAddToBasket && page.stickyAddToBasket.resetItem(productId);
                Sana.UI.LoadingIndicator.hide();
            }
        });
    };

    page.variantsPopup = {
        open: function (productId) {
            $('#variantMatrixPopup').off('dialogopen.stickyhead');
            $('#variantMatrixPopup').on('dialogopen.stickyhead', function (event, ui) {
                Sana.Matrix.makeHeadersSticky();
                var $dialog = $(this).dialog('instance');
                setTimeout(function () {
                    $dialog._focusTabbable();
                }, 10);
            });

            Sana.Popup.open("#variantMatrixPopup");
            Sana.UI.LoadingIndicator.hide();
            Sana.Matrix.dynamicMode.init(productId);
            $('#variantMatrixPopup').trigger('htmlUpdated');
        }
    };

    page.mobileLayout = function () {
        if (!page.facets);
            page.facets = $('.filters-wrapper')

        page.facets.insertAfter('.filter-title');
        if ($('.facet-selected').length) {
            $('.filter-title').removeClass('collapsed').addClass('expanded');
            $('.filters-wrapper').show();
        }

        Sana.Toggler.init('.filter-title');
    };

    page.desktopAndTabletLayout = function () {
        if (!page.facets);
            page.facets = $('.filters-wrapper')

        page.facets
            .prependTo('.column-facets')
            .filter(':hidden')
            .removeAttr('style');
    };

    page.selectionLost = {
        selector: '#selectionLostPopup',
        open: function (settings) {
            var dfrd = $.Deferred();
            Sana.Popup.open('#selectionLostPopup');
            $(this.selector).find('.btn-yes').focus();

            $(this.selector).find('.btn-yes').off('click.selectionLost').on('click.selectionLost', function () {
                $.when(settings.successCallback()).then(function () {
                    dfrd.resolve();
                });
                Sana.Popup.close("#selectionLostPopup");
            });

            $(this.selector).find('.btn-no').off('click.selectionLost').on('click.selectionLost', function () {
                dfrd.resolve();
            });

            return dfrd;
        }
    };

    page.initLastViewedProducts = function () {
        var sliderOptions = {
            responsive: [
                {
                    breakpoint: 1024,
                    settings: {
                        slidesToShow: 3,
                        slidesToScroll: 3
                    }
                },
                {
                    breakpoint: 640,
                    settings: {
                        slidesToShow: 2,
                        slidesToScroll: 2
                    }
                }
            ]
        };

        Sana.ProductsGroup.init('.last-viewed', sliderOptions);
        Sana.UI.priceStyle('.last-viewed');
        Sana.UI.bindLastViewedProductsClear();
    };

    return page;
})();

$(function () {
    var el1 = document.getElementById('productListPage'),
        el2 = document.getElementById('searchPage');
    if (!el1 && !el2)
        return;

    ProductListPage.init();
});


$('#SearchFromContent').on('click', function () {
    $(".btn-search").click();
})


;
(function () {
    var el = document.getElementById('myAccountPage');
    if (!el)
        return;

    // there are no recent orders without .gvi-orders grid
    var $grid = $('.gvi-orders', el);
    if (!$grid.length) {
        return;
    }

    function OrderModel(data) {
        this.documentId = data.DocumentId;
        this.documentDate = data.DocumentDate;
        this.shipToName = data.ShipToName;
        this.billToName = data.BillToName;
        this.totalPrice = data.TotalAmount;
        this.orderStatus = data.OrderStatusTitle || '&nbsp;';
        this.trackingText = data.ShippingTrackingText;
        this.trackingLink = Sana.Urls.AddHttpIfNeeded(data.ShippingTrackingUrl);
        this.orderDetailsUrl = data.Url;
    }

    function RecentOrdersViewModel() {
        var self = this;

        self.orders = ko.observableArray([]);
        self.loading = ko.observable(false);
        self.anyOrders = ko.computed(function () {
            return self.orders().length;
        });

        self.loadOrders = function () {
            var url = $grid.attr('data-src'),
                params = {
                    count: $grid.attr('data-count') || 3,
                    returnUrl: $grid.attr('data-returnurl')
                };

            self.loading(true);
            $.post(url, params).done(function (data) {
                var resentOrders = $.map(data.Items, function (item) {
                    return new OrderModel(item);
                });

                self.orders(resentOrders);
            }).always(function () {
                self.loading(false);
            });
        };

        self.init = function () {
            viewModel.loadOrders();
            $grid.resTables();
        };
    }

    var viewModel = new RecentOrdersViewModel();
    ko.applyBindings(viewModel, el);
    viewModel.init();
})();

$(document).ready(function () {
    var page = document.getElementById('guestOrderAdressPage');
    if (page)
        return;
    checkValidationMessageZipCode();
    $('html').on('click', ".find-address-for-zipcode", function () {
        var _self = $(this);
        var url = $(this).attr('data-url');
        //var zipCode = $("#Address_ZipCode").val();
        var zipCode = $(this).closest('.zip-code-main').find('.tbx-zip-address input').val();

        if (zipCode == undefined || zipCode == "") {
            zipCode = $("#ShippingAddress_ZipCode").val();
        }

        if (zipCode == undefined || zipCode == "") {
            $(this).closest('.form-row').find('.zipcode-error-no-results').removeClass('show-error');
            $(this).closest('.form-row').find('.zipcode-error-req').addClass('show-error');
            //$(".zipcode-error-no-results").removeClass('show-error');
            //$(".zipcode-error-req").addClass('show-error');

            return;
        }
        else {
            $(this).closest('.form-row').find('.zipcode-error-req').removeClass('show-error');

            //$(".zipcode-error-req").removeClass('show-error');
        }

        url = url + "?postCode=" + zipCode;

        Sana.UI.LoadingIndicator.show();

        $.post(url, function (json) {
            Sana.UI.LoadingIndicator.hide();

            if (json.length == 0) {
                _self.closest('.form-row').find('.zipcode-error-req').removeClass('show-error');
                _self.closest('.form-row').find('.zipcode-error-no-results').addClass('show-error');
                _self.closest('.form-row').find('#address-list-for-zipcode').empty();
                //$(".zipcode-error-req").removeClass('show-error');
                //$(".zipcode-error-no-results").addClass('show-error');

                //$('#address-list-for-zipcode').empty();
                return;
            }
            else {
                $(this).closest('.form-row').find('.zipcode-error-req').removeClass('show-error');
            }

            var ul = $('<ul class="zip-code-list">');

            for (var i = 0; i < json.length; i++) {
                ul.append("<li class='address-zip-link'><a id='address-" + json[i].Id + "' href='#' " +
                    "data-id='" + json[i].Id + "' " +
                    "data-name='" + json[i].Name + "' " +
                    "data-address='" + json[i].Address + "' " +
                    "data-address2='" + json[i].Address2 + "' " +
                    "data-city='" + json[i].City + "' " +
                    "data-phoneno='" + json[i].PhoneNo + "' " +
                    "data-countryid='" + json[i].CountryId + "' " +
                    "data-state='" + json[i].State + "' " +
                    ">" + json[i].FullAddress + "</a></li>");
            }

            ul.append("</ul>");

            _self.closest('.form-row').find('#address-list-for-zipcode').html(ul);
            _self.closest('.form-row').find('#address-list-for-zipcode').show();
            //$('#address-list-for-zipcode').html(ul);
            //$('#address-list-for-zipcode').show();
        });

    })

    $(document).on('click', function (e) {
        if ($(e.target).closest('.tbx-zip-address').length == 0) {
            $('#address-list-for-zipcode').hide();
        }
    });

    function addRegexValidator(name, message, squashSpaces) {
        $.validator.addMethod(name,
            function (v, e, regexp) {
                if (squashSpaces) v = v.replace(/' '/g, '');
                var re = new RegExp(regexp);
                return re.test(v);
            }, message);
    }
    addRegexValidator('postcode', 'Postcode must be in correct UK format');
    addRegexValidator('telephone', 'Contact number must be in correct format', true);

    postCodeTextBoxes = $('form').find('.tbx-zip-address').map(function (x, e) {
        return $(e).find('input');
    });

    postCodeTextBoxes.each(function (x, e) {
        e.rules('add', { postcode: '^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]{2})$' });
    });

    phoneNumberTextBoxes = $('form').find('.field-address-phoneno').map(function (x, e) {
        return $(e).find('input');
    });

    phoneNumberTextBoxes.each(function (x, e) {
        e.rules('add', { telephone: '^0([1-9][0-9]{8,10}|7[0-9]{9})$' });
    });

    function checkValidationMessageZipCode() {
        if ($('.zip-code-main').closest('.control').next('.validation').length > 0) {
            $($('.zip-code-main').closest('.control').next('.validation').clone()).appendTo($('.zip-code-main')).addClass('mobile-zipcode-msg');
        }
    }

    $('.tbx-zip-address input').attr('autocomplete', 'off');

    $('html').on('click', ".address-zip-link", function () {

        var id = $(this).find('a').attr('data-id');
        var name = $(this).find('a').attr('data-name');
        var address = $(this).find('a').attr('data-address');
        var address2 = $(this).find('a').attr('data-address2');
        var city = $(this).find('a').attr('data-city');
        var phoneno = $(this).find('a').attr('data-phoneno');
        var countryid = $(this).find('a').attr('data-countryid');
        var state = $(this).find('a').attr('data-state');

        var sc = $('.shipping-choice');
        var sel = sc.length ? '.shipping-choice' : '.form-holder';

        $(this).closest(sel).find("#Address_CountryId-error").closest(".field-validation-error").addClass("field-validation-valid");
        $(this).closest(sel).find("#Address_Address-error").closest(".field-validation-error").addClass("field-validation-valid");
        $(this).closest(sel).find("#Address_City-error").closest(".field-validation-error").addClass("field-validation-valid");
        $(this).closest(sel).find("#Address_CountryId-error").closest(".field-validation-error").removeClass("field-validation-error");
        $(this).closest(sel).find("#Address_Address-error").closest(".field-validation-error").removeClass("field-validation-error");
        $(this).closest(sel).find("#Address_City-error").closest(".field-validation-error").removeClass("field-validation-error");

        $(this).closest(sel).find("#Address_Address").closest(".row-error").removeClass("row-error");
        $(this).closest(sel).find("#Address_Address2").closest(".row-error").removeClass("row-error");
        $(this).closest(sel).find("#Address_City").closest(".row-error").removeClass("row-error");
        $(this).closest(sel).find("#Address_CountryId").closest(".row-error").removeClass("row-error");

        $(this).closest(sel).find("#ShippingAddress_CountryId-error").closest(".field-validation-error").addClass("field-validation-valid");
        $(this).closest(sel).find("#ShippingAddress_Address-error").closest(".field-validation-error").addClass("field-validation-valid");
        $(this).closest(sel).find("#ShippingAddress_City-error").closest(".field-validation-error").addClass("field-validation-valid");
        $(this).closest(sel).find("#ShippingAddress_CountryId-error").closest(".field-validation-error").removeClass("field-validation-error");
        $(this).closest(sel).find("#ShippingAddress_Address-error").closest(".field-validation-error").removeClass("field-validation-error");
        $(this).closest(sel).find("#ShippingAddress_City-error").closest(".field-validation-error").removeClass("field-validation-error");

        $(this).closest(sel).find("#ShippingAddress_Address").closest(".row-error").removeClass("row-error");
        $(this).closest(sel).find("#ShippingAddress_Address2").closest(".row-error").removeClass("row-error");
        $(this).closest(sel).find("#ShippingAddress_City").closest(".row-error").removeClass("row-error");
        $(this).closest(sel).find("#ShippingAddress_CountryId").closest(".row-error").removeClass("row-error");

        $(this).closest(sel).find("#Address_Address").val("");        
        $(this).closest(sel).find("#Address_Address2").val("");
        $(this).closest(sel).find("#Address_City").val("");        

        $(this).closest(sel).find("#ShippingAddress_Address").val("");
        $(this).closest(sel).find("#ShippingAddress_Address2").val("");
        $(this).closest(sel).find("#ShippingAddress_City").val("");

        $(this).closest(sel).find("#Address_Address").val(address);

        if (address == "" && address2 != "") {
            $(this).closest(sel).find("#Address_Address").val(address2);
        }
        else {
            $(this).closest(sel).find("#Address_Address2").val(address2);
        }

        $(this).closest(sel).find("#Address_City").val(city);
        $(this).closest(sel).find('#Address_CountryId option[value=' + countryid + ']').attr('selected', 'selected');

        $(this).closest(sel).find('#Address_CountryId').trigger('change');
        $(this).closest(sel).find('#Address_CountryId')._selectmenu('destroy');
        $(this).closest(sel).find('#Address_CountryId')._selectmenu();

        $(this).closest(sel).find("#ShippingAddress_Address").val(address);

        if (address == "" && address2 != "") {
            $(this).closest(sel).find("#ShippingAddress_Address").val(address2);
        }
        else {
            $(this).closest(sel).find("#ShippingAddress_Address2").val(address2);
        }

        $(this).closest(sel).find("#ShippingAddress_City").val(city);
        $(this).closest(sel).find('#ShippingAddress_CountryId option[value=' + countryid + ']').attr('selected', 'selected');

        $(this).closest(sel).find('#ShippingAddress_CountryId').trigger('change');
        $(this).closest(sel).find('#ShippingAddress_CountryId')._selectmenu('destroy');
        $(this).closest(sel).find('#ShippingAddress_CountryId')._selectmenu();

//        $('#address-list-for-zipcode').hide();
        $(this).closest(sel).find('#address-list-for-zipcode').hide();
    })

});


;
(function () {
    var el = document.getElementById('docBasedReturnOrderPage');
    if (!el) {
        return;
    }

    var uid = 0;

    function ReturnProductModel(data, orderLineReasons, valPatterns) {
        this.uid = ++uid;
        this.isEditorsEnabled = ko.observable(true);

        this.selectedReason = ko.observable();
        this.reasons = ko.observable(orderLineReasons);
        this.comment = ko.observable();

        this.quantity = ko.observable(Sana.Utils.formatNumber(data.Quantity.Current));
        this.quantityStep = data.Quantity.Step;
        this.minimumQuantity = data.Quantity.Minimum;
        this.maximumQuantity = data.Quantity.Maximum;
        this.unitOfMeasureTitle = data.UnitOfMeasureTitle;

        this.validationMessage = valPatterns['data-val-regex-pattern'];
        this.maximumValidationMessage = valPatterns['data-max-msg-pattern'].replace(/\{0\}/g, data.Quantity.Maximum);
    }

    function ReturnLineModel(data, orderLineReasons, valPatterns, isSplitLinesSupported) {
        var self = this;

        for (var val in data) {
            this[val] = data[val];
        }

        this.isReturnable = data.Quantity.Maximum > 0;
        this.isSplitLinesSupported = isSplitLinesSupported;
        this.isSelected = ko.observable(false);
        this.isSelected.subscribe(function (val) {
            var items = self.items();
            if (val && !items.length) {
                self.add();
            }
            _.each(items, function (item) {
                item.isEditorsEnabled(val);
            });
        });

        this.items = ko.observableArray([]);

        this.sum = ko.computed(function () {
            var sum = 0;
            _.each(self.items(), function (item) {
                sum += Sana.Utils.parseNumber(item.quantity());
            });
            return sum;
        });

        this.canAdd = ko.computed(function () {
            if (!self.isSplitLinesSupported) {
                return false;
            }

            return self.sum() < data.Quantity.Maximum;
        });

        this.add = function () {
            self.items.push(new ReturnProductModel(data, orderLineReasons, valPatterns));
            viewModel.returnForm().refreshValidation();
            viewModel.returnForm().trigger('afterHtmlChanged');
        };

        this.delete = function () {
            self.items.remove(this);
            if (!self.items().length) {
                self.isSelected(false);
            }
        };

        this.maximumValidationMessage = valPatterns['data-max-msg-pattern'].replace(/\{0\}/g, data.Quantity.Maximum);
    }

    function ReturnViewModel(data, valPatterns) {
        var self = this;

        self.isEditorsEnabled = ko.observable(true);
        self.isReturnable = true;
        self.salesAgreementUrl = data.SalesAgreementUrl;

        self.returnForm = ko.observable();
        self.selectedReason = ko.observable();
        self.isAllSelected = ko.observable(false);
        self.id = data.Id;
        self.originalOrderId = data.OriginalOrderId;
        self.comment = ko.observable();

        self.feedbackTitle = ko.observable();
        self.feedbackBody = ko.observable();

        var getReasons = function (data) {
            var reasons = [];
            for (var reason in data) {
                reasons.push({
                    id: reason,
                    name: data[reason]
                });
            }
            return reasons;
        };

        self.reasons = ko.observable(getReasons(data.OrderReasons));

        var orderLineReasons = getReasons(data.OrderLineReasons);
        var lines = $.map(data.Lines, function (obj) {
            return new ReturnLineModel(obj, orderLineReasons, valPatterns, data.IsSplitLinesSupported);
        });
        self.lines = ko.observable(lines);

        self.isEmpty = ko.computed(function () {
            return !_.some(self.lines(), function (item) {
                return item.isSelected();
            });
        });

        self.isAllSelected.subscribe(function (newVal) {
            _.each(self.lines(), function (line) {
                if (line.isReturnable) {
                    line.isSelected(newVal);
                }
            });
        });

        var getDataToSend = function () {
            var linesToReturn = [];

            var selectedLines = _.filter(self.lines(), function (line) {
                return line.isSelected();
            });

            _.each(selectedLines, function (line) {
                _.each(line.items(), function (item) {
                    linesToReturn.push({
                        LineNo: line.LineNo,
                        Quantity: {
                            Current: item.quantity()
                        },
                        SelectedReasonId: item.selectedReason(),
                        Comment: item.comment()
                    });
                });
            });

            var data = new FormData();
            data.append('jsonModel', JSON.stringify({
                Id: self.id,
                OriginalOrderId: self.originalOrderId,
                SelectedReasonId: self.selectedReason(),
                Comment: self.comment(),
                Lines: linesToReturn
            }));
            var langugeId = $(el).find('#languageId').val();
            if (langugeId)
                data.append('languageId', langugeId)
            data.append('isInvoiceBaised', 'true');
            data.append('__RequestVerificationToken', Sana.Utils.getAntiForgeryToken());

            var filesInputName = $(el).find('#Attachments').attr('name'),
                selectedFiles = Sana.FileUploder.getFiles(filesInputName);
            if (selectedFiles.length) {
                $.each(selectedFiles, function (i, file) {
                    data.append(filesInputName, file);
                });
            }

            return data;
        };

        self.completeReturn = function (m, e) {
            if (!self.returnForm().valid() || !e) {
                return;
            }

            var url = $(el).find('form').attr('data-action'),
                dataToSend = getDataToSend();

            $(e.currentTarget).scButton('disable');
            Sana.UI.LoadingIndicator.show();
            $.ajax({
                url: url,
                data: dataToSend,
                type: 'POST',
                contentType: false,
                processData: false
            }).done(function (response) {
                Sana.UI.LoadingIndicator.hide();
                if (response.Created) {
                    self.feedbackTitle(feedbackTexts.feedbackOkTitle);
                    self.feedbackBody(feedbackTexts.feedbackOkBody);
                } else {
                    self.feedbackTitle(feedbackTexts.feedbackErrorTitle);
                    self.feedbackBody(feedbackTexts.feedbackErrorBody);
                }
                Sana.Popup.open('#complete', {
                    afterClose: function () {
                        window.location.href = response.Url;
                    }
                });
            }).fail(function () {
                Sana.UI.LoadingIndicator.hide();

                self.feedbackTitle(feedbackTexts.feedbackErrorTitle);
                self.feedbackBody(feedbackTexts.feedbackErrorBody);

                Sana.Popup.open('#complete', {
                    afterClose: function () {
                        window.location.reload();
                    }
                });
            });
        };

        self.afterApply = function () {
            $('.gvi-return').resTables();
            self.returnForm().refreshValidation();
        };
    }

    var data = JSON.parse($('#data-return').text()),
        validationPatterns = JSON.parse($('#data-validation-patterns').text()),
        feedbackTexts = JSON.parse($('#data-messages').text());

    var viewModel = new ReturnViewModel(data, validationPatterns);
    ko.applyBindings(viewModel, el);
    viewModel.afterApply();
})();;
(function () {
    var el = document.getElementById('docFreeReturnOrderPage');
    if (!el) {
        return;
    }

    var returnData = JSON.parse($('#data-return').text()),
        settings = JSON.parse($('#data-settings').text()),
        feedbackTexts = JSON.parse($('#data-messages').text());

    function ReturnLineModel(product) {
        this.productId = product.id;
        this.productTitle = product.title;

        var selectedVariant = product.getSelectedVariant();
        this.variant = {
            id: selectedVariant.id,
            title: selectedVariant.title
        };

        this.quantity = product.quantity.current();
        this.unitOfMeasure = {
            id: product.selectedUom().Id,
            title: product.selectedUom().Title
        };
        this.reasons = _.map(returnData.OrderLineReasons, function (val, key) {
            return { id: key, name: val };
        });
        this.selectedReason = ko.observable();
        this.comment = ko.observable();
    }

    function SelectedProductModel(product, quickSearchResultForm) {
        var self = this;

        this.id = product.Id;
        this.title = product.Title;
        this.url = product.DetailsUrl;

        // START variants area
        var variants;
        this.componentGroups = [];
        this.components = ko.observable();

        var buildComponentGroups = function () {
            var componentsCollection = product.VariantComponents,
                variantsCollection = product.Variants;

            if (componentsCollection.length) {
                // Product with variants
                self.componentGroups = $.map(componentsCollection, function (val, i) {
                    return {
                        options: $.map(componentsCollection[i].Components, function (val) {
                            return { id: val.Id, title: val.Title };
                        }),
                        selected: val.Components[0].Id
                    };
                });
            } else {
                if (variantsCollection.length) {
                    // Product has variants but without components, so componentGroups is created from variants
                    self.componentGroups = [{
                        options: $.map(variantsCollection, function (val) {
                            return { id: val.Id, title: val.Title };
                        }),
                        selected: variantsCollection[0].Id
                    }];
                } else {
                    // Simple product without variants
                    self.componentGroups = [];
                }
            }

            var obj = $.map(self.componentGroups, function (val) {
                return {
                    options: ko.observableArray(val.options),
                    selected: ko.observable(val.selected)
                };
            });

            self.components(obj);
        };

        var buildVariants = function () {
            variants = $.map(product.Variants, function (val) {
                return {
                    id: val.Id,
                    title: val.Title,
                    components: val.Components
                };
            });
        };

        var rebuildRelations = function () {
            var getOptionsAvailableFor = function (selectedComponents, componentGroup) {
                var newOptions = [];

                for (var i = 0; i < componentGroup.options.length; i++) {
                    var availableVariants = variants;
                    for (var j = 0; j < selectedComponents.length; j++) {
                        availableVariants = $.grep(availableVariants, function (v) {
                            return v.components[j].Value === selectedComponents[j];
                        });
                    }

                    var currentOption = componentGroup.options[i];
                    var availableVariant = $.grep(availableVariants, function (v) {
                        return v.components[selectedComponents.length].Value === currentOption.id;
                    })[0];

                    if (availableVariant) {
                        newOptions.push(currentOption);
                    }
                }

                return newOptions;
            };

            if (self.componentGroups.length <= 1)
                return true;

            var selectedComponents = [];
            for (var k = 1; k < self.componentGroups.length; k++) {
                var components = self.components();
                var selectedComponent = components[k - 1].selected();
                selectedComponents.push(selectedComponent);
                var availableOptions = getOptionsAvailableFor(selectedComponents, self.componentGroups[k]);
                var currentComponent = components[k];
                currentComponent.options(availableOptions);
            }
        };

        var bindChanges = function () {
            var groups = self.components();
            for (var i = 0; i < groups.length - 1; i++) {
                groups[i].selected.subscribe(function () {
                    rebuildRelations();
                    $('.quicksearch-result .ddlb select').trigger('change');
                }, this);
            }
        };

        this.getSelectedVariant = function () {
            var variant = {},
                selectedComponents = self.components(),
                availableVariants = variants;

            for (var i = 0; i < availableVariants.length; i++) {
                var res = availableVariants[i];
                if (res.components.length) {
                    for (var j = 0; j < selectedComponents.length; j++) {
                        if (res.components[j].Value !== selectedComponents[j].selected()) {
                            res = null;
                            break;
                        }
                    }
                } else {
                    if (res.id !== selectedComponents[0].selected()) {
                        res = null;
                    }
                }

                if (res) {
                    variant = res;
                    break;
                }
            }

            return variant;
        };

        buildComponentGroups();
        buildVariants(product);
        rebuildRelations();
        bindChanges();
        // END variants area

        // START unit of measure area
        this.unitsOfMeasure = product.UnitsOfMeasure;

        var getUomById = function (id) {
            return $.grep(self.unitsOfMeasure, function (n) {
                return n.Id.toUpperCase() === id.toUpperCase();
            })[0];
        };

        var defaultUnitOfMeasure = getUomById(product.DefaultUnitOfMeasureId);
        this.selectedUom = ko.observable(defaultUnitOfMeasure);
        this.uomTemplate = function () {
            return settings.allowUnitOfMeasureSelection && self.unitsOfMeasure.length > 1 ? 'uom-dynamic-template' : 'uom-static-template';
        };
        // END unit of measure area

        // START quantity area

        this.quantity = {
            minimum: ko.observable(defaultUnitOfMeasure.Quantity.Minimum),
            maximum: ko.observable(defaultUnitOfMeasure.Quantity.Maximum),
            step: ko.observable(Sana.Utils.formatNumber((defaultUnitOfMeasure.Quantity.Step))),
            current: ko.observable(Sana.Utils.formatNumber((defaultUnitOfMeasure.Quantity.Current)))
        };

        this.validationMessagePattern = ko.observable();
        this.minimumValidationMessagePattern = ko.observable();
        this.maximumValidationMessagePattern = ko.observable();

        this.validationMessage = ko.computed(function () {
            var pattern = self.validationMessagePattern() || '';
            return pattern.replace(/\{0\}/g, self.quantity.step());
        });

        this.minimumValidationMessage = ko.computed(function () {
            var pattern = self.minimumValidationMessagePattern() || '';
            return pattern.replace(/\{0\}/g, self.quantity.minimum());
        });

        this.maximumValidationMessage = ko.computed(function () {
            var pattern = self.maximumValidationMessagePattern() || '';
            return pattern.replace(/\{0\}/g, self.quantity.maximum());
        });

        this.quantityEditorChange = ko.observable();
        var setQuantityEditor = function (currentUnitOfMeasure) {
            self.quantity.minimum(currentUnitOfMeasure.Quantity.Minimum);
            self.quantity.maximum(currentUnitOfMeasure.Quantity.Maximum);
            self.quantity.step(Sana.Utils.formatNumber(currentUnitOfMeasure.Quantity.Step));
            self.quantity.current(Sana.Utils.formatNumber(currentUnitOfMeasure.Quantity.Current));

            self.quantityEditorChange(currentUnitOfMeasure);
            quickSearchResultForm.refreshValidation();
        };

        this.selectedUom.subscribe(function (newVal) {
            setQuantityEditor(newVal);
        });
    }

    function CreateReturnViewModel() {
        var self = this;

        // START quick search area
        var $quickSearch = $(el).find('.quicksearch-search'),
            $quickSearchInput = $quickSearch.find('input[name="productInput"]');

        this.request = ko.observable();
        this.selectedProduct = ko.observable();
        this.quickSearchResultForm = ko.observable();
        this.isProductNotFound = ko.observable(false);

        $quickSearchInput._autocomplete({
            classes: {
                "ui-autocomplete": "quicksearch-autocomplete"
            },
            source: function (request, response) {
                $.ajax({
                    url: $quickSearchInput.attr("data-src") + "?term=" + $quickSearchInput.val(),
                    type: "GET",
                    success: function (data) {
                        response($.map(data, function (item) {
                            var label = item.Id + " - " + item.Title;
                            var _html = Sana.Utils.highlightWords(label, $quickSearchInput.val());
                            return { label: _html, originalLabel: label, value: item.Id };
                        }));
                    }
                });
            },
            select: function (event, ui) {
                event.preventDefault();
                viewModel.request(ui.item.originalLabel);
                viewModel.searchProduct();
            }
        });

        this.searchProduct = function () {
            self.selectedProduct(null);
            Sana.UI.LoadingIndicator.show();
            $.post($quickSearch.attr('action'), {
                term: self.request()
            }).done(function (product) {
                Sana.UI.LoadingIndicator.hide();
                if (!product) {
                    self.isProductNotFound(true);
                    _.delay(function () {
                        self.isProductNotFound(false);
                    }, 2500);
                    return;
                }

                self.selectedProduct(new SelectedProductModel(product, self.quickSearchResultForm()));
                $quickSearchInput._autocomplete("close");
                self.quickSearchResultForm().refreshValidation();
            });
        };

        this.onSearchSubmit = function () {
            if (self.request()) {
                self.searchProduct();
            }
            return false;
        };

        this.addToReturn = function () {
            if (!self.quickSearchResultForm().valid()) {
                return;
            }

            var newLine = new ReturnLineModel(self.selectedProduct());
            self.lines.unshift(newLine);
            self.returnRequestForm().refreshValidation();
            self.returnRequestForm().trigger('afterHtmlChanged');
        };
        // END quick search area

        // START return order area
        this.lines = ko.observableArray([]);
        this.reasons = _.map(returnData.OrderReasons, function (val, key) {
            return { id: key, name: val };
        });
        this.selectedReason = ko.observable();
        this.comment = ko.observable();
        this.returnRequestForm = ko.observable();

        this.deleteLine = function () {
            self.lines.remove(this);
        };

        this.isEmpty = ko.computed(function () {
            return !self.lines().length;
        });

        var getDataToSend = function () {
            var linesToReturn = [];

            _.each(self.lines(), function (line) {
                linesToReturn.push({
                    ProductId: line.productId,
                    VariantId: line.variant.id,
                    UnitOfMeasureId: line.unitOfMeasure.id,
                    Quantity: {
                        Current: line.quantity
                    },
                    SelectedReasonId: line.selectedReason(),
                    Comment: line.comment()
                });
            });

            var data = new FormData();
            data.append('jsonModel', JSON.stringify({
                SelectedReasonId: self.selectedReason(),
                Comment: self.comment(),
                Lines: linesToReturn
            }));
            var langugeId = $(el).find('#languageId').val();
            if (langugeId)
                data.append('languageId', langugeId);
            data.append('isInvoiceBaised', 'false');
            data.append('__RequestVerificationToken', Sana.Utils.getAntiForgeryToken());

            var filesInputName = $(el).find('#Attachments').attr('name'),
                selectedFiles = Sana.FileUploder.getFiles(filesInputName);
            if (selectedFiles.length) {
                $.each(selectedFiles, function (i, file) {
                    data.append(filesInputName, file);
                });
            }

            return data;
        };

        this.completeReturn = function (m, e) {
            if (!self.returnRequestForm().valid()) {
                return;
            }

            var url = self.returnRequestForm().attr('data-action'),
                dataToSend = getDataToSend();

            $(e.currentTarget).scButton('disable');
            Sana.UI.LoadingIndicator.show();
            $.ajax({
                url: url,
                data: dataToSend,
                type: 'POST',
                contentType: false,
                processData: false
            }).done(function (response) {
                Sana.UI.LoadingIndicator.hide();
                if (response.Created) {
                    self.feedbackTitle(feedbackTexts.feedbackOkTitle);
                    self.feedbackBody(feedbackTexts.feedbackOkBody);
                } else {
                    self.feedbackTitle(feedbackTexts.feedbackErrorTitle);
                    self.feedbackBody(feedbackTexts.feedbackErrorBody);
                }
                Sana.Popup.open('#complete', {
                    afterClose: function () {
                        window.location.href = response.Url;
                    }
                });
            }).fail(function () {
                Sana.UI.LoadingIndicator.hide();

                self.feedbackTitle(feedbackTexts.feedbackErrorTitle);
                self.feedbackBody(feedbackTexts.feedbackErrorBody);

                Sana.Popup.open('#complete', {
                    afterClose: function () {
                        window.location.reload();
                    }
                });
            });
        };
        // END return order area

        this.feedbackTitle = ko.observable();
        this.feedbackBody = ko.observable();

        this.afterApply = function () {
            $('.gvi-return').resTables();
            self.returnRequestForm().refreshValidation();
        };
    }

    var viewModel = new CreateReturnViewModel();
    ko.applyBindings(viewModel, el);
    viewModel.afterApply();
})();;
$(function () {
    var $profileEditPage = $('.profile-edit-page');
    if (!$profileEditPage.length) {
        return;
    }

    $('.form-row', $profileEditPage).each(function () {
        var $userFieldRow = $(this);
        var $userFieldEditor = $userFieldRow.find('.fieldset-value');
        if (!$userFieldEditor.length) {
            return;
        }
        var fieldValue = $userFieldEditor.text();
        $userFieldRow.toggleClass('hide', !fieldValue);
    });
});;
(function () {
    var el = document.getElementById('representCustomerPage');
    if (!el)
        return;
	
    function Customer(data) {
        this.Id = data.Id;
        this.Name = data.Name;
        this.Address = data.Address;
    }

	function RepresentViewModel() {
		var self = this;
		
		var page = 0;
		self.loading = ko.observable(false);

		var load = function (callback) {
		    Sana.UI.LoadingIndicator.showAfter(1000);
		    self.loading(true);
		    $.post(
				Sana.Urls.Home() + "profile/representablecustomers",
				{
				    keywords: self.keywords(),
				    page: page,
				    __RequestVerificationToken: $('input[name="__RequestVerificationToken"]:first').val()
				},
				function (data) {
					var customers = ko.utils.arrayMap(data.Items, function (item) {
					    return new Customer(item);
					});
					callback(customers);
					self.hasMore(self.customers().length < data.TotalCount);
					self.loading(false);
					Sana.UI.LoadingIndicator.hide();
				}
			);
			page++;
		};

		self.customers = ko.observableArray([]);
		self.empty = ko.computed(function () { return self.customers().length == 0; });
		self.keywords = ko.observable();
		self.hasMore = ko.observable(false);
		self.search = function () {
			page = 0;
			load(function (data) { self.customers(data); });
		};
		self.onkeydown = function (data, event) {
		    if (event.which === 27) {
		        self.keywords(null);
		        return false;
		    }
            return true;
		};
		self.loadMore = function () {
			load(function (items) {
			    $.each(items, function () {
					self.customers.push(this);
			    });
			});
		};
		self.represent = function (customer) {
		    Sana.UI.LoadingIndicator.show();
		    $.post(Sana.Urls.Home() + "profile/impersonate",
                {
                    accountId: customer.Id,
                    __RequestVerificationToken: $('input[name="__RequestVerificationToken"]:first').val()
                }, function () {
		        Sana.Urls.RedirectBack();
		    });
		};
		self.keywords.subscribe(_.debounce(function () {
		    self.search();
		}, 300));
	};

	var viewModel = new RepresentViewModel();
	ko.applyBindings(viewModel, el);
	viewModel.search();

	$('.gvi-represent').resTables();
})();;
var Sana = Sana || {};
Sana.SubAccount = (function () {
    var init = function () {
        var el = document.getElementById('createNewSubAccountPage') || document.getElementById('editSubAccountPage');
        if (!el)
            return;

        Sana.OrderAuthorizationRules.init();

        var $container = $(el);

        var canOrderProductsRow = $('.row-canorderproducts', $container);
        var canSeePricesRow = $('.row-canseeprices', $container);
        var canSeeStockRow = $('.row-canseestock', $container);

        var $subAccountContainer = $('.sub-account-holder', $container);
        var enableCanOrderProducts = $subAccountContainer[0].hasAttribute('data-enable-canorderproducts');
        var enableCanSeePrices = $subAccountContainer[0].hasAttribute('data-enable-canseeprices');
        var enableCanSeeStock = $subAccountContainer[0].hasAttribute('data-enable-canseestock');
        $subAccountContainer.find(':input[name$="CanSeePrices"]').prop('disabled', !enableCanSeePrices);
        canSeePricesRow.toggleClass('hide', !enableCanSeePrices);
        $subAccountContainer.find(':input[name$="CanSeeStock"]').prop('disabled', !enableCanSeeStock);
        canSeeStockRow.toggleClass('hide', !enableCanSeeStock);
        $subAccountContainer.find(':input[name$="CanOrderProducts"]').prop('disabled', !enableCanOrderProducts);
        canOrderProductsRow.toggleClass('hide', !enableCanOrderProducts);

        var $limitLinesRow = $('.row-orderauthorizationrules', $container);
        var $hasLimitCheckBox = $(':input[name$="HasLimitedBudget"]', $container);

        var showLimitCheckBox = function () {
            var showLimitLinesRow = $hasLimitCheckBox.is(':checked');
            $limitLinesRow.find(":input").prop('disabled', !showLimitLinesRow);
            $limitLinesRow.toggleClass('hide', !showLimitLinesRow);
        };

        $hasLimitCheckBox.on('change', showLimitCheckBox);

        showLimitCheckBox();
    };

    init();

    return {
        init: init
    };
}());;
(function () {
    var el = document.getElementById('sub-accountsPage');
    if (!el)
        return;

    var $deleteSubAccountBtn = null;
    var confirmDialogSelector = '#deleteSubAccountConfirmationPopup';

    function deleteSubAccountRow($row) {
        $row.remove();
        $deleteSubAccountBtn = null;
        var $subAccountsTbl = $('.gvi-sub-accounts');
        var noSubAccounts = $subAccountsTbl.find('tr[data-datarow]').length === 0;
        if (noSubAccounts) {
            $subAccountsTbl.addClass('hide');
            $('.msg-block').removeClass('hide');
        }
    }

    $(el).on('click', '.btn-delete-sub-account', function (e) {
        e.preventDefault();
        $deleteSubAccountBtn = $(this);
        Sana.Popup.open(confirmDialogSelector);
    });
     
    $(document).on('click', confirmDialogSelector + ' .btn-confirm', function () {
        if (!$deleteSubAccountBtn) {
            Sana.Popup.close(confirmDialogSelector);
            return;
        }

        $.post($deleteSubAccountBtn.attr('href'), { __RequestVerificationToken: Sana.Utils.getAntiForgeryToken() }, function (html) {
            if (html) {
                $('#cantDeleteSubAccountPopup').html(html);
                Sana.Popup.open('#cantDeleteSubAccountPopup');
                return;
            }

            var $rowToDelete = $deleteSubAccountBtn.parents('tr:first');
            deleteSubAccountRow($rowToDelete);
        });

        Sana.Popup.close(confirmDialogSelector);
    });

    $('.gvi-sub-accounts').resTables();
})();;
var Sana = Sana || {};
Sana.SalesAgreementDetails = (function () {
    var el = document.getElementById('sales-agreement-details-page');
    if (!el) {
        return;
    }

    // If user navigates to page via back button the page must be reloaded for update latest data (active sales agreement must be shown correctly).
    if (!!window.performance && window.performance.navigation.type === 2) {
        Sana.UI.LoadingIndicator.show();
        window.location.reload();
    }

    var $el = $(el),
        hash = window.location.hash,
        pathname = window.location.pathname,
        popUpAction = null;


    var initVariantDropDowns = function ($variantsBlock) {
        var $variantIdInput = $variantsBlock.closest('.add-to-basket-form').find('input[name="VariantId"]'),
            $selectElements = $('select', $variantsBlock),
            $script = $('script', $variantsBlock);

        if (!$script.length)
            return;

        var availableVariants = JSON.parse($script.text()),
            initVariantId = function () {
                var joinedComponentValues = [];

                for (var i = 0, end = $selectElements.length; i < end; i++) {
                    joinedComponentValues.push($($selectElements[i]).val());
                }

                $variantIdInput.val(availableVariants[joinedComponentValues.join('; ')]);
            };

        $selectElements.on('change', initVariantId);
        initVariantId();
    };

    var toggleSalesAgreementRow = function ($row, highlight) {
        var $hiddenRow = $row.next();

        $row.toggleClass('expanded collapsed');
        $hiddenRow.toggle();

        if (highlight) {
            $row.addClass('highlighted');
            setTimeout(function () {
                $row.removeClass('highlighted')
            }, 500);
        }
    }

    var useSalesAgreement = function ($useForm) {
        Sana.UI.LoadingIndicator.show();

        return $.post($useForm.attr("action"), $useForm.serialize())
            .done(function () {
                $useForm.addClass('hide');
                $('.unselect-sales-agreement, .add-to-basket-btn').removeClass('hide');
                $('.use-and-add-to-basket-btn').addClass('hide');
            })
            .always(function () {
                Sana.UI.LoadingIndicator.hide();
            });
    };

    var unselectSalesAgreement = function ($unselectLink) {
        Sana.UI.LoadingIndicator.show();

        $.post($unselectLink.attr("href"), {
            __RequestVerificationToken: Sana.Utils.getAntiForgeryToken()
        })
            .done(function () {
                $('.add-to-basket-btn').add($unselectLink).addClass('hide');
                $('.use-sales-agreement-form, .use-and-add-to-basket-btn').removeClass('hide');

                $('.add-to-basket-form').removeAttr('data-is-agreement-selected');
            })
            .always(function () {
                Sana.UI.LoadingIndicator.hide();
            });
    };

    var addProductToBasket = function ($form) {
        Sana.BasketSummary.onBeforeChange();
        $('.add-to-basket-btn').attr('disabled', 'disabled');

        $.post($form.attr('action'), $form.serialize())
            .done(function (data) {
                if (data && data.Count) {
                    Sana.BasketSummary.onChanged(data.Count);
                    Sana.GoogleTagManager.trackProductAddition(data.Items, data.ActionField, data.CustomerType);
                } else {
                    Sana.BasketSummary.onAfterChange();
                }
            })
            .fail(function () {
                Sana.BasketSummary.onAfterChange();
                var $errorMsg = $form.find('.msg-fail-to-add-product').removeClass('hide');
                setTimeout(function () {
                    $errorMsg.addClass('hide');
                }, 5000);
            })
            .always(function () {
                $('.add-to-basket-btn').removeAttr('disabled');
            });
    };

    var initQuantityBox = function ($quantityBox, name, hidden) {
        var $quantityInput = $quantityBox.find('input');

        $quantityBox.toggleClass('hide', hidden);
        $quantityInput.attr('name', name)
            .next('.compact-sign-error').attr('data-valmsg-for', name);

        $quantityInput.prop('disabled', hidden);
    };

    var onHashRefresh = function () {
        if (hash) {
            var $row = $(hash);
            toggleSalesAgreementRow($row, true);
        }
    }

    var initProductVariants = function () {
        $('.product-variants').each(function (index, variantsBlock) {
            initVariantDropDowns($(variantsBlock));
        });
    }


    //$el events
    $el
        .on('click', '.gvi-sales-agreement-lines .show-more', function (event) {
            event.preventDefault();
            var $this = $(this),
                $parentRow = $this.closest('tr');

            toggleSalesAgreementRow($parentRow);
        })
        .on('submit', '.use-sales-agreement-form', function () {
            var $useForm = $(this);
            if ($('#term-selections-will-be-lost-pop-up').length) {
                popUpAction = useSalesAgreement.bind(this, $useForm);
                Sana.Popup.open('#term-selections-will-be-lost-pop-up');
                return false;
            }
            useSalesAgreement($useForm);
            return false;
        })
        .on('click', '.unselect-sales-agreement', function () {
            var $unselectLink = $(this);
            if ($('#term-selections-will-be-lost-pop-up').length) {
                popUpAction = unselectSalesAgreement.bind(this, $unselectLink);
                Sana.Popup.open('#term-selections-will-be-lost-pop-up');
                return false;
            }
            unselectSalesAgreement($unselectLink);
            return false;
        })
        .on('submit', '.add-to-basket-form', function () {
            var $form = $(this),
                isAgreementSelected = $form.attr('data-is-agreement-selected');
            var useAgreementAndAddToBasket = function () {
                if (isAgreementSelected) {
                    addProductToBasket($form);
                    return;
                }
                useSalesAgreement($('.use-sales-agreement-form')).done(function () {
                    addProductToBasket($form);
                });
            };
            if (!isAgreementSelected && $('#term-selections-will-be-lost-pop-up').length) {
                popUpAction = useAgreementAndAddToBasket.bind(this);
                Sana.Popup.open('#term-selections-will-be-lost-pop-up');
                return false;
            }
            useAgreementAndAddToBasket();
            return false;
        })
        .on('change', '.ddlb-uom > select', function () {
            var $uomSelector = $(this),
                newUom = $uomSelector.val();

            $uomSelector.parents('.form-row:first').find('.tbx-quantity')
                .each(function () {
                    var $quantityBox = $(this);
                    if ($quantityBox.attr('data-uom') == newUom) {
                        initQuantityBox($quantityBox, 'quantity', false);
                    } else {
                        initQuantityBox($quantityBox, 'quantity-hidden', true);
                    }
                });

            var $form = $uomSelector.parents('form:first');
            Sana.UI.refreshValidationFor($form);
            $form.valid();
        });
    //end $el events


    // document events
    $(document)
        .on('click', '#term-selections-will-be-lost-pop-up .btn-continue', function () {
            popUpAction();
            Sana.Popup.close('#term-selections-will-be-lost-pop-up');
            $('#term-selections-will-be-lost-pop-up').remove();
        })
        .on('pagingChange.salesagreements', function (e, obj) {
            $('.ddlb:not(.initially-unstyled) select')._selectmenu();
            Sana.Spinner.init();

            onHashRefresh();
            initProductVariants();
            $('.gvi-sales-agreement-lines').resTables();
        });
    // end document events


    // Search side
    function SearchSALinesModel() {
        var self = this,
            target = $("#sales-agreement-details-page .tbx-search input").attr('data-target-id');

        self.loading = ko.observable(false);
        self.keywords = ko.observable();

        var modifyPageWithData = function (data) {
            var $newHtml = $(data.trim()),
                $target = $("#" + target),
                $newContainer = null;

            $newContainer = $newHtml.filter("#" + target);
            if ($newContainer.length) {
                $newHtml = $newContainer.children();
            }
            $target.html($newHtml);
        };


        self.onkeydown = function (data, event) {
            if (event.which === 27) {
                self.keywords(null);
                return false;
            }
            return true;
        };

        self.search = function () {
            self.loading(true);
            Sana.UI.LoadingIndicator.show(1000);
            $.post(
                pathname,
                {
                    searchText: self.keywords(),
                    cache: false,
                    __RequestVerificationToken: Sana.Utils.getAntiForgeryToken()
                },
                function (data) {
                    modifyPageWithData(data);
                    $(document).trigger('pagingChange.salesagreements');
                    self.loading(false);
                    Sana.UI.LoadingIndicator.hide();
                }
            );
        };

        self.keywords.subscribe(_.debounce(function () {
            self.search();
        }, 300));
    };


    $('.gvi-sales-agreement-lines').resTables();
    initProductVariants();
    Sana.Spinner.init();

    var viewModel = new SearchSALinesModel();
    ko.applyBindings(viewModel, el);
    // end Search side

    if (hash) {
        var lineId = hash.substr(1);
        viewModel.keywords(lineId);
    }
}());;
(function () {
    var el = document.getElementById('sales-agreement-list-page');
    if (!el) {
        return;
    }

    // If user navigates to page via back button the page must be reloaded for update latest data (active sales agreement must be shown correctly).
    if (!!window.performance && window.performance.navigation.type === 2) {
        Sana.UI.LoadingIndicator.show();
        window.location.reload();
    }

    function SalesAgreementListViewModel() {
        var $el = $(el),
            $document = $(document),
            $table = $el.find('.gvi-sales-agreements'),
            $filterForm = $('#filter-form'),
            $salesAgreementsTableBody = $table.find('tbody'),
            pageSize = $el.attr('data-page-size'),
            showTermLostPopUp = $('#term-selections-will-be-lost-pop-up').length,
            basketPageUrl = $el.attr('data-basket-page-url'),
            page = 1,
            popUpAction = null;

        var self = this;

        self.hasMore = ko.observable($salesAgreementsTableBody.children('tr').length == pageSize);
        self.loading = ko.observable(false);
        self.noResult = ko.observable(false);

        var load = function (callback) {
            self.loading(true);
            Sana.UI.LoadingIndicator.show();
            var params = $filterForm.serializeArray();
            params.push({ name: 'filter.PageIndex', value: page });
            params.push({ name: 'IsFilterInitialized', value: true });

            $.post(
                document.location.href,
                params,
                function (rowsView) {
                    var $rowsView = $(rowsView).filter('tr');
                    $rowsView.each(function (i, e) {
                        ko.applyBindings(self, e);
                    });
                    callback($rowsView);
                    self.hasMore($rowsView.length == pageSize);
                }
            ).fail(function () {
                self.noResult(true);
            }).always(function () {
                self.loading(false);
                Sana.UI.LoadingIndicator.hide();
            });
        };

        self.loadMore = function () {
            load(function ($tableRows) {
                $salesAgreementsTableBody.append($tableRows);
                page++;
            });
        };

        self.search = function () {
            page = 0;
            load(function ($tableRows) {
                self.noResult( $tableRows.length === 0 );
                $salesAgreementsTableBody.html($tableRows);
                page = 1;
            });
        };

        self.afterApply = function () {
            $('.gvi-sales-agreements').resTables();
            self.noResult( $salesAgreementsTableBody.children().length === 0 );
        };

        var unselectSalesAgreementCore = function ($unselectLink) {
            Sana.UI.LoadingIndicator.show();
            var params = { __RequestVerificationToken: Sana.Utils.getAntiForgeryToken() };
            $.post($unselectLink.attr("href"), params).done(function () {
                $unselectLink.addClass('hide');
                $unselectLink.next('.use-sales-agreement-form').removeClass('hide');
            }).always(function () {
                Sana.UI.LoadingIndicator.hide();
            });
        };

        self.unselectSalesAgreement = function (unselectLink) {
            var $unselectLink = $(unselectLink);
            if (showTermLostPopUp) {
                popUpAction = unselectSalesAgreementCore.bind(this, $unselectLink);
                Sana.Popup.open('#term-selections-will-be-lost-pop-up');
                return false;
            }
            unselectSalesAgreementCore($unselectLink);
            return false;
        };

        var useSalesAgreementCore = function ($useForm) {
            Sana.UI.LoadingIndicator.show();
            $.post($useForm.attr("action"), $useForm.serialize()).done(function (result) {
                if (!result) {
                    location.href = basketPageUrl;
                }
            });
        };

        self.useSalesAgreement = function (useForm) {
            var $useForm = $(useForm);
            if (showTermLostPopUp) {
                popUpAction = useSalesAgreementCore.bind(this, $useForm);
                Sana.Popup.open('#term-selections-will-be-lost-pop-up');
                return false;
            }
            useSalesAgreementCore($useForm);
            return false;
        };

        $document.on('click', '#term-selections-will-be-lost-pop-up .btn-continue', function () {
            popUpAction();
            Sana.Popup.close('#term-selections-will-be-lost-pop-up');
        });

        $document.on('click', '.goto-details', function () {
            Sana.UI.LoadingIndicator.show();
            return true;
        });
    }

    var viewModel = new SalesAgreementListViewModel();
    ko.applyBindings(viewModel, el);
    viewModel.afterApply();
})();;
$(function () {
    var el = document.getElementById('tellafriendPreviewPage');
    if (!el)
        return;

    var html = $('#previewContent').val();
    var iframe = document.getElementById('previewFrame');
    var doc = iframe.document;
    if (iframe.contentDocument)
        doc = iframe.contentDocument;
    else if (iframe.contentWindow)
        doc = iframe.contentWindow.document;
    doc.open();
    doc.writeln(html);
    doc.close();
    $(doc.body).find('a').each(function (a) {
        $(this).attr('target', '_blank');
    });

    $('#tellAFriendForm').submit(function (event) {
        event.preventDefault();
        Sana.UI.LoadingIndicator.show();
        $.ajax({
            type: "POST",
            url: $(this).attr("action"),
            data: $(this).serialize(),
            success: function (data) {
                Sana.UI.LoadingIndicator.hide();
                var btn = $('#tellAFriendPopup').html(data).find('.btn-close-dialog');
                Sana.Popup.open('.successPopup', {
                    afterClose: function () {
                        window.location.href = btn.attr('href');
                    }
                });
            },
            error: function(){
                $('#tellAFriendPopup').html(data);
                Sana.UI.LoadingIndicator.hide();
            }
        });
    });
});;
(function () {
    var el = document.getElementById('wishListPage');
    if (!el)
        return;

    function WishListViewModel() {
        var self = this;

        var detailsSelector = '.wishlist-details';

        self.sendData = function (btn, dataToSend) {
            var action_url = btn.attr('data-src');

            if (!dataToSend) {
                dataToSend = {
                    id: btn.attr('data-product'),
                    uom: btn.attr('data-uom'),
                    variant: btn.attr('data-variant'),
                    prepack: btn.attr('data-prepack'),
                };
            };

            Sana.UI.LoadingIndicator.show();
            $.post(action_url, {
                productId: dataToSend.id,
                unitOfMeasureId: dataToSend.uom,
                variantId: dataToSend.variant,
                prepackId: dataToSend.prepack,
                __RequestVerificationToken: $('input[name="__RequestVerificationToken"]:first').val()
            }, function (result) {
                if (result != '') {
                    if (result.Count) {
                        var callback = result.Url ? function () { location.href = result.Url; } : undefined;
                        Sana.GoogleTagManager.trackProductAddition(result.Items, result.ActionField, result.CustomerType, callback);
                    }
                    Sana.UI.LoadingIndicator.hide();
                    return;
                }
                $(detailsSelector).load(window.location.href, function () {
                    var details = $(detailsSelector)[0];
                    ko.cleanNode(details);
                    ko.applyBindings(self, details)

                    Sana.ActionButtons.refresh();
                    Sana.UI.LoadingIndicator.hide();
                    $(detailsSelector).trigger('htmlUpdated');
                });
            });
        };

        self.addToBasket = function (data, event) {
            var btn = $(event.target).closest('button');
            self.sendData(btn);
        };

        self.remove = function (data, event) {
            var btn = $(event.target);
            self.sendData(btn);
        };
    };

    $(function () {
        $(document).on("click", ".gvi-wish-list .hyp-remove", function (event) {
            event.preventDefault();
            var $row = $(this).closest('tr');

            var obj = {
                id: $row.attr('data-product'),
                variant: $row.attr('data-variant'),
                prepack: $row.attr('data-prepack'),
                uom: $row.attr('data-uom')
            };

            viewModel.sendData($(this), obj);
        });
    });

    Sana.ActionButtons.init();

    var viewModel = new WishListViewModel();
    ko.applyBindings(viewModel, el);
})();;
$(function () {
    var el = document.getElementById('addreviewPage');
    if (!el)
        return;

    Sana.UI.initRatingPlugin();

    var $reviewAddedPopup = $('#reviewAddedPopup');
    if ($reviewAddedPopup.length)
    {
        Sana.Popup.open('.successPopup', {
            afterClose: function () {
                window.location.href = $reviewAddedPopup.find('.btn-close-dialog').attr('href')
            }
        });
    }
});;
