﻿/// <reference path="~/Scripts/jquery-1.5.js"/>


Array.prototype.unique = function () {
    var arrVal = this;
    var uniqueArr = [];
    for (var i = arrVal.length; i--; ) {
        var val = arrVal[i];
        if ($.inArray(val, uniqueArr) === -1) {
            uniqueArr.unshift(val);
        }
    }
    return uniqueArr;
};

Array.remove = function (array, from, to) {
    var rest = array.slice((to || from) + 1 || array.length);
    array.length = from < 0 ? array.length + from : from;
    return array.push.apply(array, rest);
};

var ProductModule = (function ($) {

    var StockTexts = {
        get: function (stock) {
            switch (stock) {
                case -2:
                    return this.NotApplicable;
                case -1:
                    return this.Ignore;
                case 0:
                    return this.Exhausted;
                default:
                    return this.Normal.replace("[stock]", stock.toString());
            }
        }
    };

    var DeliveryTexts = {
        get: function (stock) {
            if (stock > 0) {
                return this.Normal;
            }
            return StockTexts.get.call(this, stock);
        }
    };

    var Variants = {
        data: [],
        add: function (obj) {
            this.data.push(obj);
        },
        clear: function () {
            this.data = [];
        },
        getCombination: function (sku) {
            return $.map(this.data, function (n) {
                if (n.sku == sku)
                    return n;
            })[0];
        },
        getValuesForSku: function (sku) {
            return $.map(this.data, function (n) {
                if (n.sku === sku)
                    return n.v;
            }).unique();
        },
        skuHasValueId: function (sku, valueId) {
            return $.inArray(valueId, this.getValuesForSku(sku)) != -1;
        },
        getSkusForGroup: function (groupId) {
            return $.grep(this.data, function (e) {
                if (e.g === groupId) return e.sku;
            });
        },
        getSkus: function () {
            return ($.map(this.data, function (e) {
                return e.sku;
            })).unique();
        },
        getSelectableValues: function (selectedValueIds) {
            var skus = this.getSkusWithValues(selectedValueIds);
            return $.map(this.data, function (e) {

                if ($.inArray(e.sku, skus) !== -1 && $.inArray(e.v, selectedValueIds) === -1) {
                    return e.v;
                }
            }).unique();
        },
        getSkusWithValues: function (valueIds) {
            var skus = this.getSkus();

            var toRemove = [];
            for (var i = 0; i < skus.length; i++) {
                var sku = skus[i];

                for (var x = 0; x < valueIds.length; x++) {
                    var hasValue = this.skuHasValueId(sku, valueIds[x]);

                    if (!hasValue) {
                        toRemove.push(sku);
                    }
                }
            }

            skus = $.map(skus, function (n, i) {
                if ($.inArray(n, toRemove) == -1) {
                    return n;
                }
            });

            return skus;
        }
    }

    function VariantMatrix($el) {
        var self = this;
        self.el = $el;
        self.tds = $el.find('td.variant-data');

        self.tds.unbind('click').bind('click', function (e) {
            e.preventDefault();

            var $this = $(this),
                valueId = $this.data('value-id'),
                colId = $this.data('col');

            //if the clicked element is not enabled or it is already selected, exit
            if ($this.is('.enabled') && !$this.is('.selected')) {
                $this.toggleClass('selected');
            } else {
                return;
            }

            //first disable all elements with col >= colId and unselect all elements in the same col with value <> valueId
            $(self.tds).each(function () {
                var $this = $(this),
                    col = $this.data('col'),
                    value = $this.data('value-id');

                if (col > colId) {
                    $this.removeClass('enabled');
                }
                if (col == colId && value !== valueId) {
                    $this.removeClass('selected');
                }
            });

            $(self.tds).each(function () {
                var $this = $(this),
                    col = $this.data('col'),
                    value = $this.data('value-id');

                //the TD is enabled when the Col = 0 OR
                //the Col is 1 bigger the the clicked TD AND
                //the value is in the selectable values of the selected values with col = col - 1
                var isEnable = function () {
                    if (value === valueId)
                        return true;

                    if (col === 0)
                        return true;

                    if (col === (colId + 1)) {
                        var values = self.getSelectedValues(col);
                        return $.inArray(value, Variants.getSelectableValues(values)) !== -1;
                    }
                    return undefined;
                }
                var isSelected = function () {
                    return value == valueId || (value !== valueId && (colId > col));
                };

                var enabled = isEnable();
                if (enabled === true) $this.addClass('enabled');
                if (enabled === false) $this.removeClass('enabled');

                isSelected() ? $.noop : $this.removeClass('selected');
            });

            var selectedValues = self.getSelectedValues();
            var skus = Variants.getSkusWithValues(selectedValues);
            if (skus.length === 1) {
                var valuesForSkus = Variants.getValuesForSku(skus[0]);
                //select all elements with col > colId
                $.each(self.tds, function () {
                    var $this = $(this),
                        col = $this.data('col'),
                        value = $this.data('value-id');

                    if (col > colId && $.inArray(value, valuesForSkus) !== -1) {
                        $this.addClass('selected').addClass('enabled');
                    }
                });
                self.showSku(skus[0]);
            } else {
                self.showNoSku();
            }
        });

        self.showNoSku = function () {
            var $ctx = self.el;
            $('.details', $ctx).addClass('no-sku');
            $('td.image', $ctx).empty();
        };

        self.showSku = function (sku) {
            var $ctx = self.el;
            var combination = Variants.getCombination(sku);
            $('.details', $ctx).removeClass('no-sku');
            $('.price', $ctx).html('<span>' + combination.p + '</span>');

            var src = ProductModule.Variants.Images[combination.i],
                    stockText = ProductModule.StockTexts.get(combination.s),
                    $stockEl = $('.stockText', $ctx).html(stockText);

            if (combination.o) {
                $stockEl.removeClass('noStock')
                $('.order', $ctx).show().find('a').attr('data-id', combination.sku);
            } else {
                $stockEl.addClass('noStock');
                $('.order', $ctx).hide().find('a').attr('data-id', 0);
            }
            var imgPlaceholder = $('td.image', $ctx);

            if (src) {
                src += '?width=200&height=200&crop=auto';

                var img = $('<img src=\'' + src + '\' width=\'200\' height=\'200\'/>');

                var width = height = imgPlaceholder.height();
                img.css({ width: width + 'px', height: height + 'px' });
                imgPlaceholder.empty().append(img);
            } else {
                imgPlaceholder.empty();
            }
        };

        self.getSelectedValues = function (col) {
            return $('.selected', self.el).map(function () {
                var $this = $(this),
                    colId = $this.data('col'),
                    valueId = $this.data('value-id');

                if (col === undefined) {
                    return valueId;
                } else if (colId < col) {
                    return valueId;
                }
            });
        };

        self.start = function () {
            $('td[data-col!=0]', self.el).removeClass('enabled');
        };
    };

    function VariantCompact($el) {
        var self = this;
        self.el = $el;
        self.elements = $('span.variant-data, option', self.el);
        self.maxSort = 0;

        $.each(self.elements, function (e) {
            var sort = $(this).data('sort');
            if (sort > self.maxSort) {
                self.maxSort = sort;
            }
        });
    };

    VariantCompact.prototype.start = function ($el) {
        var self = this;

        $('span', self.el).unbind('click').bind('click', function (e) {
            e.preventDefault();

            self.valueClicked(this);
        });

        $('select', self.el).unbind('change').bind('change', function (e) {
            e.preventDefault();

            var selectedOption = $('option:selected', this);
            self.valueClicked(selectedOption);
        });

        var first = $('span.variant-data, select', self.el).first();
        if (first.is('select')) {
            first.trigger('change');
        } else {
            first.trigger('click');
        }
    }


    VariantCompact.prototype.getSelectedValues = function (sort) {
        var self = this;

        return $(self.elements).map(function (e) {
            var $this = $(this),
                sortId = $this.data('sort'),
                valueId = $this.data('value-id');

            if ($this.is('option') && !$this.is(':selected')) {
                return;
            }
            if ($this.is('.selected')) {
                if (sort === undefined) {
                    return valueId;
                } else if (sortId < sort) {
                    return valueId;
                }
            }
        });
    };

    VariantCompact.prototype.onEnabled = function (el, source) {
        var $el = $(el),
            sourceSort = $(source).data('sort'),
            sort = $el.data('sort');

        $el.removeAttr('disabled');
    }

    VariantCompact.prototype.valueClicked = function (el) {
        var self = this,
            $el = $(el),
            sortId = $el.data('sort'),
            valueId = $el.data('value-id');


        if ($el.is('.enabled') || valueId === -1) {
            for (var i = sortId + 1; i <= this.maxSort; i++) {
                this.resetSort(i);
            }

            $el.toggleClass('selected');
        } else {
            //reset
            if (valueId === -1) {
                this.showNoSku();
            }
            return;
        }

        $(this.elements).each(function () {
            var $this = $(this),
                sort = $this.data('sort'),
                value = $this.data('value-id');

            var selectedValues = self.getSelectedValues(sort);
            var selectableValues = Variants.getSelectableValues(selectedValues);

            //the TD is enabled when the Col = 0 OR
            //the Col is 1 bigger the the clicked TD AND
            //the value is in the selectable values of the selected values with col = col - 1
            var shouldEnable = function () {
                if (!$this.is('.variant-data'))
                    return false;

                if (value === valueId)
                    return true;

                if (sort === 0)
                    return true;

                if (sort === (sortId + 1)) {
                    return $.inArray(value, selectableValues) !== -1;
                }

                return undefined;
            }
            var isSelected = function () {
                return value == valueId || ($this.is('.selected') && sort !== sortId);
            };

            var enabled = shouldEnable();
            if (enabled === true) {
                $this.addClass('enabled').removeAttr('disabled');
            } else if (enabled === false) {
                $this.removeClass('enabled');
                if ($this.is('.variant-data')) {
                    $this.attr('disabled', 'disabled');
                }
            }

            isSelected() ? $this.addClass('selected') : $this.removeClass('selected');
        });

        var selectedValues = self.getSelectedValues();
        var skus = Variants.getSkusWithValues(selectedValues);
        if (skus.length === 1) {
            var valuesForSkus = Variants.getValuesForSku(skus[0]);

            $.each($('span.variant-data, select', self.el), function () {
                var $this = $(this),
                    sort = $this.data('sort');

                if (sort > sortId) {
                    if ($this.is('select')) {
                        //deselect all options
                        $('option:selected', $this).removeAttr('selected');
                        $('option', $this).each(function () {
                            var value = $(this).data('value-id');
                            if ($.inArray(value, valuesForSkus) !== -1) {
                                $(this).attr('selected', 'selected');
                            }
                        });
                    } else {
                        if ($.inArray($this.data('value-id'), valuesForSkus) !== -1) {
                            $this.addClass('selected');
                        }
                    }
                }
            });
            self.showSku(skus[0]);
        } else {
            self.showNoSku();
        }
    };

    VariantCompact.prototype.resetSort = function (reset) {
        $.each($('span.variant-data, select', this.el), function () {
            var $this = $(this),
                sort = $this.data('sort');

            if (sort === reset) {
                if ($this.is('select')) {
                    $.each($('option.variant-data', $this), function () {
                        $(this).removeClass('selected').attr('disabled', 'disabled');
                    });
                    //select the first option if available
                    $('option:first', $this).attr('selected', 'selected');
                } else {
                    $this.removeClass('selected').removeClass('enabled');
                }
            }
        });
    }

    VariantCompact.prototype.onDisabled = function (el, source) {
        $(el).attr('disabled', 'disabled').removeClass('selected');
    }

    VariantCompact.prototype.showNoSku = function () {
        var ctx = $(this.el).next();
        $('#order', ctx).hide().find('a').attr('data-id', 0);
        $('.stockText', ctx).hide();

        var priceEl = $('.price', ctx);
        priceEl.html(priceEl.data('nosku'));
    };

    VariantCompact.prototype.showSku = function (sku) {
        var comb = Variants.getCombination(sku);
        var ctx = $(this.el).next();

        $('.price', ctx).html(comb.p);
        $('.stockText', ctx).show().html(StockTexts.get(comb.s));
        $('#order', ctx).show();

        if (comb.o) {
            $('.stockText', ctx).removeClass('noStock');
            $('.order', ctx).show().find('a').attr('data-id', sku);

            var select = $('.amount select', ctx).empty();
            var amount = (comb.s > 100 || comb.s < 0) ? 100 : comb.s;
            var html = '';
            for (var i = 0; i < amount; i++) {
                html += '<option value=\'' + (i + 1) + '\'>' + (i + 1) + '</option>';
            }
            select.append(html);
            $('.amount', ctx).show();
        } else {
            $('.stockText', ctx).addClass('noStock')
            $('.order', ctx).hide().find('a').attr('data-id', 0);
            $('.amount', ctx).hide();
        }
    };

    var getDataFromHash = function (hash) {
        hash = hash.replace('#?', '');

        return hash;
    };

    var setUrls = function (urls) {
        ProductModule.urls = $.extend(ProductModule.urls, urls);
    };

    var Search = (function () {
        var timeout, $searchPanel;


        var init = function () {
            var $el = $('#sideBar #Keyword'),
                $placeholder = $el.parents('div:first'),
                t;

            $el.width($placeholder.innerWidth() - 7);

            $searchPanel = $('<ul id=\'suggestions-panel\' class=\'photoborder photobg\'></ul>');
            $searchPanel
                .appendTo($placeholder)
                .css({
                    'width': $el.outerWidth() - 2 + 'px'
                });

            $('#suggestions-panel .suggestion').live('click', function (e) {
                e.preventDefault();

                $searchPanel.hide();
                $el.val($(this).text()).focus();
            });
            $('#suggestions-panel li').live('mouseenter', function () {
                $(this).addClass('footer footerbg');
            }).live('mouseleave', function () {
                $(this).removeClass('footer footerbg');
            });

            $(window).bind('click', function (e) {
                if (!$(e.target).is('#Keyword')) {
                    $searchPanel.hide();
                }
            });

            $el.bind('focusin', function (e) {
                if ($('li', $searchPanel).length) {
                    $searchPanel.show();
                }
            });

            $el.bind('keyup', function (e) {
                e.preventDefault();
                var val = $el.val();

                if (timeout)
                    clearTimeout(timeout);

                timeout = setTimeout(function () {
                    getSuggestions(val);
                }, 500);
            });

            $('.product-search .navigation a').live('click', function (e) {
                e.preventDefault();
                var $target = $('.product-search .partial'),
                    url = $(this).attr('href');

                $target.html('<div><img src=\'/kzn/assets/images/ajax-loader.gif\'/></div>');
                $.ajax({
                    type: 'get',
                    url: url,
                    success: function (html) {
                        $target.html(html);
                    }
                });
            });
        };

        var getSuggestions = function (keyword) {
            clearTimeout(timeout);

            if (keyword.length < 3) {
                return;
            }

            var data = { keyword: keyword };

            $.getJSON(ProductModule.urls.productSuggestions, data, function (json) {
                var html = '';
                for (var i = 0; i < json.length; i++) {
                    html += '<li><a href=\'#\' class=\'suggestion\'>' + json[i] + '</a></li>';
                }
                $searchPanel.html(html);
                if (html.length) {
                    $searchPanel.show();
                } else {
                    $searchPanel.hide();
                }
            });
        };

        return {
            init: init
        }
    })();

    var List = (function () {

        var showLoadingImage = function () {
            $('#product-content').html('<div><img src=\'/kzn/assets/images/ajax-loader.gif\'/></div>');
        };

        var bindSpecificationFilters = function () {
            $('.filters input').live('change', function () {
                $(this).parents('form').trigger('submit');
            });
        };

        var unbindSpecificationFilters = function () {
            $('.filters input').die('change');
        };

        var loadSectionFromHash = function (hash) {
            var data = getDataFromHash(hash);

            unbindSpecificationFilters();

            showLoadingImage();

            $.ajax(ProductModule.urls.filters, {
                data: data,
                type: 'get',
                cache: false,
                success: function (html) {
                    $('#product-content').replaceWith(html);
                },
                complete: bindSpecificationFilters
            });
        };


        var disableFilters = function (ids) {
            var filters = $('input[name=fv]');
            if (ids.length) {
                for (var i = 0; i < filters.length; i++) {
                    var filter = $(filters[i]);
                    var value = parseInt(filter.val());

                    if ($.inArray(value, ids) >= 0) {
                        filter.removeAttr('disabled');
                    } else {
                        filter.attr('disabled', true);
                    }
                }
            } else {
                filters.removeAttr('disabled');
            }
        };

        var enableFilters = function () {
            //enable filters
            var data = getDataFromHash(location.hash);

            //deselect all input boxes, because some browsers might remember checked values
            $('form[name=filterForm] :checkbox').each(function () { $(this).attr('checked', false); });
            var splitted = data.split('&');
            for (var i = 0; i < splitted.length; i++) {
                var pair = decodeURIComponent(splitted[i]).split('=');
                var name = pair[0];
                var value = pair[1];

                $('input[name=' + name + '][value=' + value + ']').attr('checked', true);
            }

            if (location.hash !== '#?' && location.hash.length) {
                loadSectionFromHash(location.hash);
            }
        }

        var mostUsedFilters = function (ids) {
            var filters = $('#variant-filters .filter-group');

            if (ids.length) {
                for (var i = 0; i < filters.length; i++) {
                    var filter = $(filters[i]);
                    var value = parseInt(filter.attr('data-id'));

                    if ($.inArray(value, ids) == -1) {
                        filter.addClass('unpopular').hide('slow');
                        $('#show-all-filters').show('slow');
                    }
                }
            }
        }

        var toggleLeastUsedFilters = function () {
            $('#sideBar .unpopular').toggle();
        };

        var init = function () {
            var getFilterData = function () {
                var $form = $('form[name=filterForm]'),
                    $watermarks = $('input.watermarked', $form);

                //disable any watermarks to let them not serialize
                $watermarks.each(function () {
                    $(this).attr('disabled', 'disabled');
                });

                var data = $form.serialize();

                //enable the watermarks
                $watermarks.each(function () {
                    $(this).removeAttr('disabled');
                });
                return data;
            };

            $('form[name=filterForm]').live('submit', function (e) {
                e.preventDefault();

                var data = getFilterData();

                if (data.length) {
                    window.location.hash = '?' + data;
                } else {
                    window.location.hash = '';
                }
            });

            $('.part-photo a[rel=photostyle]').live('click', function (e) {
                e.preventDefault();

                if ($.fn.photoStyle) {
                    $(this).photoStyle().trigger('click');
                }
            });

            bindSpecificationFilters();

            $(window).hashchange(function (e) {
                Sidebar.initPriceSlider();
                loadSectionFromHash(location.hash);
            });

            $('.product-list .navigation a').live('click', function (e) {
                e.preventDefault();

                var url = $(this).attr('href');
                var data = getFilterData();
                showLoadingImage();
                $.ajax({
                    type: 'get',
                    url: url,
                    data: data,
                    cache: false,
                    success: function (html) {
                        $('#product-content').replaceWith(html);
                    }
                });
            });
        }
        return {
            init: init,
            enableFilters: enableFilters,
            disableFilters: disableFilters,
            mostUsedFilters: mostUsedFilters,
            toggleLeastUsedFilters: toggleLeastUsedFilters
        }
    })();

    var Details = (function () {
        var init = function () {

            $('#canvas .part-photo .enlargement-zoom').jqzoom({
                zoomType: 'reverse',
                title: false,
                preloadImages: false,
                position: 'right'
            });

            if ($.fn.photoStyle) {
                $('#canvas .part-photo .enlargement-overlay').photoStyle();
            }
            $('.react.button').live('click', function (e) {
                e.preventDefault();

                var url = $(this).attr('href');

                $('<div id=\'overlay\'><div class=\'overlayWrapper\'></div></div>').appendTo('#section').overlay({
                    load: true,
                    mask: { loadSpeed: 200 },
                    closeOnClick: false,
                    fixed: true,
                    onBeforeLoad: function () {
                        var overlay = this.getOverlay();
                        overlay.css({ width: 'auto' });
                        var wrapper = overlay.find('.overlayWrapper');
                        wrapper.empty().append('<iframe src=\'' + url + '\' width=\'470\' height=\'740\'></iframe>');
                    },
                    onClose: function () {
                        $('#overlay').remove();
                    }
                });
            });
        }

        var inittabs = function () {
            var tabContainer = $('#product-content .elements.has-tabs').tabs();
            var tabs = $('#product-content .ui-tabs-nav li:visible');

            var borderWidth = $('#product-content .ui-tabs-nav li:last').outerWidth() - $('#product-content .ui-tabs-nav li:last').innerWidth();
            var containerWidth = tabContainer.width();

            borderWidth = (tabs.length * borderWidth) + borderWidth;
            var tabWidth = (containerWidth - borderWidth) / tabs.length;
            if (tabs.length == 1) { tabWidth = tabWidth + 2; }
            tabs.css({ width: tabWidth + 'px', textAlign: 'center' });
        }

        var showImage = function (el) {
            var $el = $(el);
            var $target = $('#canvas .part-photo a');
            $target.attr({ href: $el.attr('data-large') })
            .html('<img src=\'' + $el.attr('data-small') + '\' />');
        }

        return {
            init: init,
            showImage: showImage,
            inittabs: inittabs
        };
    })();

    var Scrollable = function (el, options) {
        var self = this,
                index = 0;

        var defaults = {
            interval: 5000
        };

        var settings = $.extend({}, options, defaults);

        var $el = $(el);
        var $itemContainer = $el.find('.scrollable-items');

        $.extend(self, {
            getItems: function () {
                return $itemContainer.children();
            },
            move: function (offset) {
                return self.seekTo(index + offset);
            },
            seekTo: function (i) {
                var items = self.getItems();

                if (i >= items.length) i = 0;

                var item = items.eq(i);
                index = i;

                var props = { left: -item.position().left };
                $itemContainer.animate(props, 500, function () {
                    setTimeout(function () {
                        self.move(1);
                    }, settings.interval);
                });

                return self;
            }
        });

        setTimeout(function () {
            self.seekTo(1);
        }, settings.interval);
    };

    var Sidebar = (function () {
        var initPriceSlider = function () {
            var $slider = $('.price-slider');
            var data = getDataFromHash(location.hash);
            var match = /MinPrice=(\d*)\&MaxPrice=(\d*)/.exec(data);
            var minPrice = $('#MinPrice').val();
            var maxPrice = $('#MaxPrice').val();
            if (match) {
                minPrice = parseInt(match[1]);
                maxPrice = parseInt(match[2]);
            }

            $slider.slider('values', [minPrice, maxPrice]);
            $slider.parent().find('.min-price').text(minPrice);
            $slider.parent().find('.max-price').text(maxPrice);
        };

        var clearRecentViewedProducts = function (url) {
            $.post(url, function (html) {
                $('#recent-viewed-products').html(html);
            });
        };

        return {
            initPriceSlider: initPriceSlider,
            clearRecentViewedProducts: clearRecentViewedProducts
        }
    } ());

    var Shop = (function () {
        var shoppingCartChanged = function (newHtml) {
            $('#shopping-cart').html(newHtml);
        }

        var showSkuSelection = function (id) {
            var url = ProductModule.urls.variantsSelectionOverlay + '/' + id;

            $('<div id=\'overlay\'><div class=\'overlayWrapper\'></div></div>').appendTo('#section').overlay({
                load: true,
                mask: { loadSpeed: 200 },
                closeOnClick: false,
                fixed: true,
                onBeforeLoad: function () {
                    var wrapper = this.getOverlay().find('.overlayWrapper');
                    $.ajax({
                        url: url,
                        cache: false,
                        success: function (html) {
                            wrapper.html(html);
                        }
                    });
                },
                onClose: function () {
                    $('#overlay').remove();
                }
            });
        }

        var addShoppingCartItem = function (id, isSku, redirectToShoppingCart, amount) {
            if (isSku) {
                $.ajax({
                    url: ProductModule.urls.addProductSku,
                    type: 'post',
                    data: { id: id, amount: amount },
                    dataType: 'html',
                    success: function (html) {
                        shoppingCartChanged(html);

                        if (redirectToShoppingCart) {
                            document.location = ProductModule.urls.shoppingCartOverview;
                        }
                    }
                })
            } else {
                $.ajax({
                    url: ProductModule.urls.addProduct,
                    type: 'post',
                    data: { id: id, amount: amount },
                    dataType: 'json',
                    success: function (json) {
                        if (json.showSkuSelection) {
                            showSkuSelection(id);
                        }
                        else if (json.added) {
                            if (redirectToShoppingCart) {
                                document.location = ProductModule.urls.shoppingCartOverview;
                            } else {
                                $.ajax({
                                    type: 'get',
                                    cache: false,
                                    url: ProductModule.urls.shoppingCart,
                                    dataType: 'html',
                                    success: shoppingCartChanged
                                });
                            }
                        } else {

                        }
                    }
                });
            }
        }

        var removeShoppingCartItem = function (id) {
            $.ajax({
                url: ProductModule.urls.removeShoppingCartItem,
                type: 'post',
                data: { id: id },
                success: function (html) {
                    shoppingCartChanged(html);
                }
            });
        }

        var init = function () {
            $('.order-direct, .add-to-shoppingcart').live('click', function (e) {
                e.preventDefault();

                var redirectToShoppingCart = $(this).is('.order-direct');
                var isSku = $(this).attr('data-issku') == 'true' ? true : false;
                var id = $(this).attr('data-id');
                var amount = $(this).parent().attr("data-amount");
                if (amount == 0) { amount = 1 }
                addShoppingCartItem(id, isSku, redirectToShoppingCart, amount);

                // close popup if open:
                if ($("#variant-overlay").length > 0) {
                    $("#overlay > .close").click();
                }
            });

            $('.remove-cartitem > span').live("mouseenter", function (e) {
                $(this).addClass("hover");
            });
            $('.remove-cartitem > span').live("mouseleave", function (e) {
                $(this).removeClass("hover");
            });

            $('.remove-cartitem').live('click', function (e) {
                e.preventDefault();

                var id = $(this).attr('data-id');
                removeShoppingCartItem(id);
            });
        }

        return {
            init: init
        }
    } ());

    return {
        Variants: Variants,
        StockTexts: StockTexts,
        DeliveryTexts: DeliveryTexts,
        setUrls: setUrls,
        Search: Search,
        List: List,
        Details: Details,
        Scrollable: Scrollable,
        Sidebar: Sidebar,
        Shop: Shop,
        VariantMatrix: VariantMatrix,
        VariantCompact: VariantCompact
    }
} (jQuery));

