/* Fehler bei der Verkleinerung. Der Inhalt wird unverkleinert zurückgegeben.
(786,54-55): run-time error JS1195: Expected expression: ^
(786,55-56): run-time error JS1195: Expected expression: ]
(786,55-56): run-time error JS1006: Expected ')': ]
(787,5-6): run-time error JS1195: Expected expression: )
(787,6-7): run-time error JS1195: Expected expression: )
(786,53-54): run-time error JS1013: Syntax error in regular expression: +
 */
/* AUS DJL */

var kornCommerce = kornCommerce || {};

kornCommerce.settings = kornCommerce.settings || {};

kornCommerce.init = function () {

};;
// check if an element exists in array using a comparer function
// comparer : function(currentElement)
Array.prototype.inArray = function (comparer) {
    for (var i = 0; i < this.length; i++) {
        if (comparer(this[i])) {
            return true;
        }
    }
    return false;
};

// adds an element to the array if it does not already exist using a comparer
// function
Array.prototype.pushIfNotExist = function (element, comparer) {
    if (!this.inArray(comparer)) {
        this.push(element);
    }
};

// find and remove a simple item from an array
Array.prototype.remove = function (element) {
    var i = this.indexOf(element);
    if (i !== -1) {
        this.splice(i, 1);
        return true;
    }
}

// find and remove a complex item from an array
// BUGGED ! wird aber noch von productList filter genutzt und funktioniert dort lustigerweise
Array.prototype.removeObject = function (element) {
    var exists = true,
        existsIndex = -1;

    for (var propertyName in element) {
        var index = -1;

        for (var i = 0, len = this.length; i < len; i++) {
            if (this[i][propertyName] === element[propertyName]) {
                index = i;
                break;
            }
        }

        existsIndex = index;
        exists &= index >= 0;
    }

    if (exists) {
        this.splice(existsIndex, 1);
    }
}

// https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/filter
if (!Array.prototype.filter) {
    Array.prototype.filter = function (fun/*, thisArg*/) {
        'use strict';

        if (this === void 0 || this === null) {
            throw new TypeError();
        }

        var t = Object(this);
        var len = t.length >>> 0;
        if (typeof fun !== 'function') {
            throw new TypeError();
        }

        var res = [];
        var thisArg = arguments.length >= 2 ? arguments[1] : void 0;
        for (var i = 0; i < len; i++) {
            if (i in t) {
                var val = t[i];

                // NOTE: Technically this should Object.defineProperty at
                //       the next index, as push can be affected by
                //       properties on Object.prototype and Array.prototype.
                //       But that method's new, and collisions should be
                //       rare, so use the more-compatible alternative.
                if (fun.call(thisArg, val, i, t)) {
                    res.push(val);
                }
            }
        }

        return res;
    };
}

// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach
//// Production steps of ECMA-262, Edition 5, 15.4.4.18
//// Reference: http://es5.github.io/#x15.4.4.18
//if (!Array.prototype.forEach) {

//    Array.prototype.forEach = function (callback, thisArg) {

//        var T, k;

//        if (this == null) {
//            throw new TypeError(' this is null or not defined');
//        }

//        // 1. Let O be the result of calling ToObject passing the |this| value as the argument.
//        var O = Object(this);

//        // 2. Let lenValue be the result of calling the Get internal method of O with the argument "length".
//        // 3. Let len be ToUint32(lenValue).
//        var len = O.length >>> 0;

//        // 4. If IsCallable(callback) is false, throw a TypeError exception.
//        // See: http://es5.github.com/#x9.11
//        if (typeof callback !== "function") {
//            throw new TypeError(callback + ' is not a function');
//        }

//        // 5. If thisArg was supplied, let T be thisArg; else let T be undefined.
//        if (arguments.length > 1) {
//            T = thisArg;
//        }

//        // 6. Let k be 0
//        k = 0;

//        // 7. Repeat, while k < len
//        while (k < len) {

//            var kValue;

//            // a. Let Pk be ToString(k).
//            //   This is implicit for LHS operands of the in operator
//            // b. Let kPresent be the result of calling the HasProperty internal method of O with argument Pk.
//            //   This step can be combined with c
//            // c. If kPresent is true, then
//            if (k in O) {

//                // i. Let kValue be the result of calling the Get internal method of O with argument Pk.
//                kValue = O[k];

//                // ii. Call the Call internal method of callback with T as the this value and
//                // argument list containing kValue, k, and O.
//                callback.call(T, kValue, k, O);
//            }
//            // d. Increase k by 1.
//            k++;
//        }
//        // 8. return undefined
//    };
//}

// The trim() method removes whitespace from both ends of the string.
if (!String.prototype.trim) {
    (function () {
        // Make sure we trim BOM and NBSP
        var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
        String.prototype.trim = function () {
            return this.replace(rtrim, '');
        };
    })();
}

if (!String.prototype.removeWhitespace) {
    (function () {
        var trim = / /g;
        String.prototype.removeWhitespace = function () {
            return this.replace(trim, '');
        };
    })();
}

if (!String.prototype.isNumeric) {
    (function () {
        String.prototype.isNumeric = function () {
            return /^[0-9]+$/i.test(this.removeWhitespace());
        };
    })();
}

if (!String.prototype.isNullOrWhiteSpace) {
    (function () {
        String.prototype.isNullOrWhiteSpace = function () {
            return (!this || this.length === 0 || /^\s*$/.test(this))
        };
    })();
};
/// duplicate with functions.js
//var isMobile = function () {
//    return $(window.innerWidth)[0] < 768;
//}


/* AUS DJL */

; kornCommerce.global = kornCommerce.global || {};

kornCommerce.global.buttons = function () {

    // data-target is toggled if this element is clicked
    $('.click-toggle-target').off('click.global.toggle').on('click.global.toggle', function (e) {
        var target = $(this).data('toggle');

        if (target.length <= 0) {
            return false;
        }

        $(target).toggle();
    });

    // data-focus is focused if this element is clicked
    $('.click-focus-target').off('click.global.focus').on('click.global.focus', function (e) {
        var target = $(this).data('focus');

        if (target.length <= 0) {
            return false;
        }

        $(target).select();
    });

    $('.click-toggle-pw').off('click.global.togglePw').on('click.global.togglePw', function (e) {
        var $this = $(this);
        var $target = $($this.data('target'));

        if ($target.length <= 0) {
            return false;
        }

        if ($target.attr('type') === 'password') {
            $target.attr('type', 'text');
        }
        else if ($target.attr('type') === 'text') {
            $target.attr('type', 'password');
        }
    });

};;
function initMenu() {

    //$('#menu > ul').menuAim({
    //    activate: function (row) {
    //        if (isMobileViewport()) {
    //            return;
    //        }
    //        openMenu();
    //        $(row).addClass('cbp-hropen');
    //    },
    //    deactivate: function (row) {
    //        if (isMobileViewport()) {
    //            return;
    //        }
    //        closeMenu();
    //    },
    //    exitMenu: function () {
    //        if (isMobileViewport()) {
    //            return false;
    //        }

    //        return true;
    //    },
    //    submenuDirection: 'below'
    //});

    $('#toggle-menu').click(function (e) {
        e.stopPropagation();
        openMenu();
        e.preventDefault();
    });

    $('#cat-1255 > a').on('click', function (e) {
        clickMenu($('#cat-1255'));
        openMenu();
        e.preventDefault();
    });

    $('#cat-961 > a').on('click', function (e) {
        clickMenu($('#cat-961'));
        openMenu();
        e.preventDefault();
    });

    $('#cat-1260 > a').on('click', function (e) {
        clickMenu($('#cat-1260'));
        openMenu();
        e.preventDefault();
    });

    $('#cat-958 > a').on('click', function (e) {
        clickMenu($('#cat-958'));
        openMenu();
        e.preventDefault();
    });
}

function openMenu() {
    $('#st-container').addClass('st-menu-open');

    $(document).on('click touchstart', function (e) {
        if (!hasParentClass(e.target, 'cbp-hrmenu')) {
            closeMenu();
            e.preventDefault();
            e.stopPropagation();
        }
    });
}

function closeMenu() {
    $('#st-container').removeClass('st-menu-open');
    $('#menu li.level-1').removeClass('cbp-hropen');
    $(document).off('click touchstart');
}

function clickMenu($cat) {
    $('#menu li.level-1 .triangle i').removeClass('fa-minus-circle').addClass('fa-plus-circle');

    if (!$cat.hasClass('cbp-hropen')) {
        $('#menu li.level-1').removeClass('cbp-hropen');

        $cat.addClass('cbp-hropen');
        $cat.find('span.triangle i').addClass('fa-minus-circle');

        if (isMobileViewport()) {
            document.getElementById($cat.attr('id')).scrollIntoView();
        }
    }
    else {
        $cat.removeClass('cbp-hropen');

        closeMenu();

        if (isMobileViewport()) {
            document.getElementById('menu').scrollIntoView();
        }
    }
};

function initFinancingExample(isInCart) {

    $('.financing-example').off('click').on('click', function (e) {

        var $this = $(this),
            baseUrl = $this.data('base-url'),
            partialUrl = $this.data('partial-url'),
            baseAmount = $this.data('base-amount'),
            baseContainerId = $this.data('base-container'),
            pgwTarget = '#financing-example-overlay',
            pgwTitle = $this.attr('title'),
            loadingContentHtml = '<p class="ta-center"><i class="fa fa-spinner fa-pulse fa-2x"></i></p>';

        $.pgwModal({
            target: pgwTarget,
            title: pgwTitle,
            url: baseUrl + '?amount=' + baseAmount,
            loadingContent: loadingContentHtml,
            maxWidth: 960,
            ajaxOptions: {
                success: function (data) {
                    $.pgwModal({ pushContent: data });
                    $.pgwModal({
                        pushContent: function () {

                            if (isInCart != null && isInCart == true) {
                                $('#financing-multiplier').hide();
                            }

                            var multiplyClicked = false;

                            $('#financing-amount .multiply').off('click').on('click', function () {
                                var $this = $(this);

                                if ($this.hasClass('selected')) {
                                    return;
                                }

                                $('#financing-amount input').val($this.data('value'));

                                $('#financing-amount .multiply').removeClass('selected');
                                $this.addClass('selected');

                                multiplyClicked = true;
                                $('#financing-amount .fa-refresh').trigger('click');
                                multiplyClicked = false;
                            });

                            function initFinancingModal(partialUrl, baseContainerId) {

                                // refresh event
                                $('#form-financing').off('submit').on('submit', function (e) {
                                    e.preventDefault();

                                    var amount = convertToMoney($('input[name="financing-amount"]').val());

                                    if (!multiplyClicked) {
                                        $('#financing-amount .multiply').removeClass('selected');
                                    }

                                    $(baseContainerId).html(loadingContentHtml);

                                    $.get(partialUrl + '&amount=' + amount, function (data) {
                                        $(baseContainerId).html(data);
                                        initFinancingModal(partialUrl, baseContainerId);
                                    });
                                });

                                // close event
                                $('#pgw-close').off('click').on('click', function (e) {
                                    $.pgwModal('close');
                                });
                            }

                            function convertToMoney(value) {
                                return Number(value.toString().trim().replace(',', '.').replace(/[^0-9\.]+/g, ''));
                            }

                            initFinancingModal(partialUrl, baseContainerId);
                        }
                    });
                }
            },
        });

        e.preventDefault();
        return false;
    });

}



//function initFinancing() {

//    $('#show-financing-table').on('click', function (e) {
//        $('#cetelem_ratenrechner_table').show();
//        $('#show-financing-table').parent().hide();
//        e.preventDefault();
//        return false;
//    });

//    if (!cofi_hideTable) {
//        $('#cetelem_ratenrechner_table').show();
//    }

//    cetelem_podschet();

//    //var financeText = $('#cetelem_ratenrechner_table tr:visible:last td:nth-child(2)').text();
//    var financeText = $('#cetelem_ratenrechner_table tr:last td:nth-child(2)').text();

//    $('.finance-amount').text(financeText);

//}

//function formatCurrency(num) {
//    num = num.toString().replace(/\$|\,/g, '');

//    if (isNaN(num)) {
//        num = '0';
//    }

//    sign = (num == (num = Math.abs(num)));
//    num = Math.floor(num * 100);
//    cents = num % 100;
//    num = Math.floor(num / 100).toString();

//    if (cents < 10) {
//        cents = '0' + cents;
//    }

//    for (var i = 0; i < Math.floor((num.length - (1 + i)) / 3) ; i++) {
//        num = num.substring(0, num.length - (4 * i + 3)) + '.' + num.substring(num.length - (4 * i + 3));
//    }

//    return (((sign) ? '' : '-') + num + ',' + cents);
//}

//function cetelem_podschet() {
//    var gesamtbetrag = 0,
//        laufzeit = 0,
//        trRemove = [];

//    cofi_max = Math.floor(cofi_max / 6);

//    for (i = 0; i < cofi_max; i++) {

//        var special = cofi_faktoren[i] == 1;
//        var resultat = 0;

//        laufzeit += 6;

//        if (special) {
//            resultat = formatCurrency(cofi_summa / laufzeit);
//        }
//        else {
//            resultat = formatCurrency(cofi_summa * cofi_faktoren[i]);
//        }

//        var tr = $('#cetelem_ratenrechner_table tr')[i + 1];


//        if (special) {
//            gesamtbetrag = cofi_summa;
//        }
//        else {
//            gesamtbetrag = ((Math.floor((cofi_summa * cofi_faktoren[i]) * 100)) / 100) * laufzeit;
//        }

//        if (parseFloat(resultat) < 9 || parseFloat(cofi_summa) < 100) {
//            trRemove.push($(tr));
//            //$(tr).hide();
//        }
//        else {
//            $(tr).children()[1].innerHTML = resultat + " EUR";
//            $(tr).children()[4].innerHTML = formatCurrency(gesamtbetrag) + " EUR";

//            if (special) {
//                $(tr).children()[2].innerHTML = '0,00 %';
//            }
//            else {
//                $(tr).children()[2].innerHTML = cofi_sollzins[i];
//            }
//        }
//    }

//    //console.log(trRemove);

//    for (var i = 0; i < trRemove.length; i++) {
//        trRemove[i].remove();
//    }
//}
;
/* AUS DJL */

; kornCommerce.button = kornCommerce.button || {};

kornCommerce.button.reset = function () {

    // prevent bug where firefox keeps disabled state through page refreshed, despite the usage of autocomplete="off"
    try {
        window.onload = window.onpageshow = function () {
            $('button[type="submit"][autocomplete="off"][disabled]').removeAttr('disabled').find('.spinner-wrapper').remove();
        };
    } catch (e) {
        // nothing
    }

};

kornCommerce.button.startLoading = function ($elem) {

    $elem.attr('disabled', 'disabled').append('<div class="spinner-wrapper"><span class="spinner d-block"></span></div>');

    if ($elem.hasClass('btn-chevron-left')) {
        $elem.removeClass('btn-chevron-left').addClass('btn-chevron-left-loading');
    }

    if ($elem.hasClass('btn-chevron-right')) {
        $elem.removeClass('btn-chevron-right').addClass('btn-chevron-right-loading');
    }
};

kornCommerce.button.endLoading = function ($elem) {

    $elem.removeAttr('disabled').children().remove('.spinner-wrapper');

    if ($elem.hasClass('btn-chevron-left-loading')) {
        $elem.removeClass('btn-chevron-left-loading').addClass('btn-chevron-left');
    }

    if ($elem.hasClass('btn-chevron-right-loading')) {
        $elem.removeClass('btn-chevron-right-loading').addClass('btn-chevron-right');
    }
};

kornCommerce.button.forceDisable = function ($elem) {
    try {
        window.onload = window.onpageshow = function () {
            $elem.attr('disabled', 'disabled');
        };
    } catch (e) {
        // nothing
    }
};;
; kornCommerce.functions = kornCommerce.functions || {};

function isMobileViewport() {
    //return $(document).width() + getScrollbarWidth() < 768;
    return window.innerWidth < 768;
};

function isTabletViewport() {
    //return $(document).width() + getScrollbarWidth() < 1024;
    return window.innerWidth <= 1024;
};

function isMobileBrowser() {
    return typeof window.orientation !== 'undefined';
};

//function getScrollbarWidth() {
//    var outer = document.createElement('div');
//    outer.style.visibility = 'hidden';
//    outer.style.width = '100px';
//    document.body.appendChild(outer);

//    var widthNoScroll = outer.offsetWidth;
//    // force scrollbars
//    outer.style.overflow = 'scroll';

//    // add innerdiv
//    var inner = document.createElement('div');
//    inner.style.width = '100%';
//    outer.appendChild(inner);

//    var widthWithScroll = inner.offsetWidth;

//    // remove divs
//    outer.parentNode.removeChild(outer);

//    return widthNoScroll - widthWithScroll;
//}

function hasParentClass(elem, classname) {
    if (elem === document) {
        return false;
    }
    if ($(elem).hasClass(classname)) {
        return true;
    }
    return $(elem).parent().length > 0 && hasParentClass($(elem).parent(), classname);
};

function getAfToken() {
    return $('input[name="__RequestVerificationToken"]').last().val();
};

function applyStandardOwlCarousel() {
    applyStandardOwlCarouselToElement($('.owl-carousel.standard'));
};

function applyStandardOwlCarouselToElement($elem, overrideOptions) {

    var options = {
        nav: true,
        navText: [
            '<i class="fa fa-chevron-left"></i>',
            '<i class="fa fa-chevron-right"></i>'
        ],
        lazyLoad: true,
        items: 5,
        smartSpeed: 200,
        responsive: {
            0: {
                items: 2,
            },
            680: {
                items: 3,
            },
            900: {
                items: 4,
            },
            1280: {
                items: 5,
            }
        },
        slideBy: 'page',
    };

    options = $.extend({}, options, overrideOptions);

    $elem.owlCarousel(options);
};

// checks vertical only, simple use cases only
function isOnScreen($elem) {
    var element = $elem.get(0),
        bounds = element.getBoundingClientRect();

    return bounds.top < window.innerHeight && bounds.bottom > 0;
};

function isInternetExplorer() {
    var ua = window.navigator.userAgent,
        msie = ua.indexOf("MSIE ");

    if (msie > 0) {
        return true;
    }

    return false;
};

function htmlEncode(value) {
    //create a in-memory div, set it's inner text(which jQuery automatically encodes)
    //then grab the encoded contents back out.  The div never exists on the page.
    return $('<div/>').text(value).html();
};

function htmlDecode(value) {
    return $('<div/>').html(value).text();
};

function addUrlParameter(url, parameterName, parameterValue, atStart/*Add param before others*/) {
    replaceDuplicates = true;
    if (url.indexOf('#') > 0) {
        var cl = url.indexOf('#');
        urlhash = url.substring(url.indexOf('#'), url.length);
    } else {
        urlhash = '';
        cl = url.length;
    }
    sourceUrl = url.substring(0, cl);

    var urlParts = sourceUrl.split("?");
    var newQueryString = "";

    if (urlParts.length > 1) {
        var parameters = urlParts[1].split("&");
        for (var i = 0; (i < parameters.length); i++) {
            var parameterParts = parameters[i].split("=");
            if (!(replaceDuplicates && parameterParts[0] === parameterName)) {
                if (newQueryString === "") {
                    newQueryString = "?";
                }
                else {
                    newQueryString += "&";
                }
                newQueryString += parameterParts[0] + "=" + (parameterParts[1] ? parameterParts[1] : '');
            }
        }
    }
    if (newQueryString === "") {
        newQueryString = "?";
    }

    if (atStart) {
        newQueryString = '?' + parameterName + "=" + parameterValue + (newQueryString.length > 1 ? '&' + newQueryString.substring(1) : '');
    } else {
        if (newQueryString !== "" && newQueryString !== '?') {
            newQueryString += "&";
        }
        newQueryString += parameterName + "=" + (parameterValue ? parameterValue : '');
    }

    return urlParts[0] + newQueryString + urlhash;
};

function scrollToTop() {
    verticalOffset = typeof (verticalOffset) !== 'undefined' ? verticalOffset : 0;
    element = $('body');
    offset = element.offset();
    offsetTop = offset.top;
    $('html,body').animate({ scrollTop: offsetTop }, 500, 'linear');
};

// cached version of the $.getScript() function
jQuery.getCachedScript = function (url, options) {
    // Allow user to set any option except for dataType, cache, and url
    options = $.extend(options || {}, {
        dataType: 'script',
        cache: true,
        url: url
    });

    // Use $.ajax() since it is more flexible than $.getScript
    // Return the jqXHR object so we can chain callbacks
    return jQuery.ajax(options);

    // Usage
    // $.cachedScript('ajax/test.js').done(function (script, textStatus) {
    //     console.log(textStatus);
    // });
};



// https://javascript.info/cookie
// returns the cookie with the given name, or undefined if not found
kornCommerce.functions.getCookie = function (name) {
    let matches = document.cookie.match(new RegExp(
        "(?:^|; )" + name.replace(/([.$?*|{}()[\]\\/+^])/g, '\\$1') + "=([^;]*)"
    ));
    return matches ? decodeURIComponent(matches[1]) : undefined;
};

kornCommerce.functions.setCookie = function (name, value, days) {

    var date = new Date();
    date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));

    var options = {
        path: '/',
        expires: date.toUTCString(),
        sameSite: 'None'
    };

    if (location.protocol !== 'https:') {
        options.secure = 'secure';
    }

    var updatedCookie = encodeURIComponent(name) + "=" + encodeURIComponent(value);

    for (let optionKey in options) {
        updatedCookie += "; " + optionKey;
        let optionValue = options[optionKey];
        if (optionValue !== true) {
            updatedCookie += "=" + optionValue;
        }
    }

    document.cookie = updatedCookie;
};

kornCommerce.functions.deleteCookie = function (name) {
    kornCommerce.functions.setCookie(name, "", {
        'max-age': -1
    })
};;

var lastSearch = '',
    isSearching = false,
    firstSearch = true,
    searchArray = [];

function initSearch() {

    $('a#button-search').on('click', function (e) {
        $('#searchbar').removeClass('hide-mobile');
        $('#search').focus();
        $('#searchbar').before().off('click');

        $('#searchbar').before().on('click', function (ev) {
            if (ev.target.id === 'searchbar') {
                $('#searchbar').addClass('hide-mobile');
                $('#searchbar').before().off('click');
            }
        });

        e.preventDefault();
    });

    $('#search-clear').on('click', function (e) {
        $('#search').val('');
        $('#search-result-container').hide().empty();
        lastSearch = '';
        isSearching = false;
        firstSearch = true;
        $('#search').focus();
        e.preventDefault();
        return false;
    });

    // focus searchbar when tab key was pressed and no element is in focus
    $(document).on('keydown', function (e) {
        var code = e.keyCode || e.which;

        if (code == 9 && $(':focus').length == 0) {
            $('#search').focus();
            return false;
        }
    });

    $(document).on('click', function (e) {
        if (!hasParentClass(e.target, 'searchbar') && e.target.id != 'search') {
            $('#search-result-container').hide();
        }
        else if (e.target.id == 'search' && lastSearch != '') {
            $('#search-result-container').toggle();
        }
    });

    $('#search').on('keydown', function (e) {
        var code = e.keyCode || e.which;

        // prevent standard behaviour of the enter key
        if (code == 13 || code == 10) {
            e.preventDefault();
        }
    });

    $('#search').on('keyup', function (e) {

        var search = $('#search').val().trim().toLowerCase(),
            code = e.keyCode || e.which,
            $searchResults = $('#search-result-container li'),
            $currentItem = $('#search-result-container li.selected'),
            $prevItem,
            $nextItem;

        // check whether keyboard navigation is required
        switch (code) {

            // enter
            case 13:
            case 10:

                if ($currentItem.length !== 0) {
                    var searchVal = $currentItem.text().trim();
                    lastSearch = searchVal;
                    isSearching = true;

                    // put the current item's value in the searchbox, if it's not the last 'show all' thing
                    if (!$currentItem.hasClass('show-all')) {
                        $('#search').val(searchVal);
                    }
                    $currentItem.children('a').first().trigger('click');
                }
                else {
                    if (lastSearch.trim() != '') {
                        document.forms['form-search'].submit();
                    }
                }

                return false;
                break;

            // arrow up
            case 38:

                if ($currentItem.length == 0) {
                    $currentItem = $prevItem = $searchResults.last();
                }
                else {
                    if ($currentItem.index() == $searchResults.first().index()) {
                        $prevItem = $searchResults.last();
                    }
                    else {
                        $prevItem = $currentItem.prev();
                    }
                }

                $searchResults.removeClass('selected');
                $prevItem.addClass('selected');

                return false;
                break;

            // arrow down
            case 40:

                if ($currentItem.length == 0) {
                    $currentItem = $nextItem = $searchResults.first();
                }
                else {
                    if ($currentItem.index() == $searchResults.last().index()) {
                        $nextItem = $searchResults.first();
                    }
                    else {
                        $nextItem = $currentItem.next();
                    }
                }

                $searchResults.removeClass('selected');
                $nextItem.addClass('selected');

                return false;
                break;

                //case 37: // arrow left
                //case 39: // arrow right

            default:
                break;
        }

        // perform search
        if (search.length >= 2) {
            if (lastSearch != search) {
                if (!isSearching) {
                    startSearch(search);
                }
                else {
                    searchArray.unshift(search);
                }
            }
        }
    });

    $('#search-result-container').on('mouseout', function (e) {
        $('#search-result-container li').removeClass('selected');
    });

}

function startSearch(search) {

    lastSearch = search;
    isSearching = true;

    var $searchResultContainer = $('#search-result-container'),
        height = $searchResultContainer.css('height'),
        quickSearchUrl = $('input[name="QuickSearchUrl"]').val();

    if (firstSearch) {
        height = 'auto';
    }

    $searchResultContainer.show().html('<ul><li><a href="#">Suche ...</a></li></ul>').css('height', height);

    $.ajax({
        type: 'POST',
        cache: false,
        url: quickSearchUrl,
        data: { search: search, __RequestVerificationToken: getAfToken() }
    })
    .done(function (result) {
        $searchResultContainer.html(result);

        $('#search-result-container li:not(.show-all) a').each(function (i) {
            var $searchResult = $(this),
                searchResultText = $searchResult.text(),

                // replace multiple spaces with a single one, split on them and trim every entry again
                searchArray = lastSearch.replace(/ +(?= )/, '').split(' ').map(function (item) {
                    return item.trim();
                });

            // sort array by length
            searchArray.sort(function (a, b) {
                // ASC  -> a.length - b.length
                // DESC -> b.length - a.length
                return b.length - a.length;
            });

            var replacedResultText = searchResultText;

            for (var j = 0; j < searchArray.length; j++) {
                var partialSearch = searchArray[j].trim();
                var posStart = searchResultText.toLowerCase().indexOf(partialSearch, 0),
                    posEnd = posStart + partialSearch.length;

                if (partialSearch.length <= 1 && /[<>/\\]/.test(partialSearch)) {
                    continue;
                }

                if (posStart !== -1) {

                    // find hit
                    var hit = searchResultText.substring(posStart, posEnd);

                    // remove the hit
                    searchResultText = searchResultText.replace(hit, '');

                    if (hit.isNullOrWhiteSpace()) {
                        continue;
                    }

                    // setup regex
                    var rex = new RegExp('(' + hit + ')(?!>)', 'gi'); // 'g' global, 'i' case insensitive

                    // replace hit with <b>'s
                    replacedResultText = replacedResultText.replace(rex, '<b>$1</b>');
                }
            }

            $searchResult.html(replacedResultText);
        });

        $('#search-result-container li a')
            .on('click', function (e) {
                var $this = $(this);
                $this.append('<img class="search-indicator" src="/content/images/ajax_loader.gif" alt="..." />').parent().addClass('selected');
                window.location = $this.attr('href');
                e.preventDefault();
                return false;
            })
            .on('mouseover', function (e) {
                $('#search-result-container li').removeClass('selected');
                $(this).parent().addClass('selected');
            });

    })
    .fail(function () {
        $searchResultContainer.html('<ul><li><a href="#">Es ist ein Fehler aufgetreten</a></li></ul>')
    })
    .always(function () {
        $searchResultContainer.css('height', 'auto').show();

        firstSearch = false;
        isSearching = false;

        if (searchArray.length > 0 && searchArray[0] != lastSearch) {
            // search again
            startSearch(searchArray[0]);
            // clear array
            searchArray = [];
        }
    });

};

(function () {

    initMenu();

    initSearch();

    $('form.ajax-form').show();

    // "read more" button in Category Description
    $('#category-description .read-more p').on('click', function () {
        $('#category-description').css('max-height', '99999px').css('overflow', 'visible');
        $('#category-description .read-more').hide();
    });

    // responsive image maps
    $('img[usemap]').rwdImageMaps();


    // owl carousel
    applyStandardOwlCarousel();

    // change language
    $('#header-top a.change-language').on('click touchstart', function (e) {
        initChangeLanguageEvent(e);
    });

    $('#menu .mobile-container a.change-language').parent().on('click touchstart', function (e) {
        initChangeLanguageEvent(e);
    });

    function initChangeLanguageEvent(e) {

        $('#change-language-container').toggleClass('show');
        e.preventDefault();
        e.stopPropagation();

        $('body').on('click touchstart', function (e) {
            if (!hasParentClass(e.target, 'mobile-container')) {
                $('#change-language-container').removeClass('show');
                $('body').off('click touchstart');
            }
        });

    }

    // popups
    $('a.popup').popupWindow({
        centerBrowser: 1
    });

    // suppress link title tooltips
    var links = document.getElementsByTagName('a');
    for (var i = 0; i < links.length; i++) {
        if (links[i].className.indexOf('suppress-tt') > -1) {
            links[i]._title = links[i].title;
            links[i].onmouseover = function () {
                this.title = '';
            }
            links[i].onmouseout = function () {
                this.title = this._title;
            }
        }
    }

    // cart summary
    // is started in Layout.cshtml to prevent loading during checkout

    // scroll to top helper
    $(document).on('scroll', function () {
        if ($(window).scrollTop() > 100) {
            if (isMobileViewport() && $('#search-clear').is(':visible')) {
                return;
            }
            $('#scroll-top-wrapper').addClass('show');
        } else {
            $('#scroll-top-wrapper').removeClass('show');
        }
    });

    $('#scroll-top-wrapper').on('click', scrollToTop);

    $('#search').on('focus', function () {
        $('#scroll-top-wrapper').removeClass('show');
    });


    /* Google Analytics Opt-out */

    // disable tracking if the opt-out cookie exists.
    var disableStr = 'ga-disable-' + gaProperty;

    if (document.cookie.indexOf(disableStr + '=true') > -1) {
        window[disableStr] = true;
    }

    // set opt-out cookie
    $('#gaOptout').on('click', function () {
        document.cookie = disableStr + '=true; expires=Thu, 31 Dec 2099 23:59:59 UTC; path=/';
        window[disableStr] = true;

        alert('Google Analytics wurde deaktiviert / Google Analytics has been deactivated / Google Analytics a été désactivé');

        return false;
    });


    /* client side bot detection */
    if (google_remarketing_key != null && google_remarketing_key.length > 0) {
        function processLayout() {
            window.removeEventListener('mousemove', processLayout, false);
            window.removeEventListener('touchmove', processLayout, false);
            var f_image = new Image();
            f_image.src = '/content/images/google.gif?' + google_remarketing_key;
        }
        window.addEventListener('mousemove', processLayout, false);
        window.addEventListener('touchmove', processLayout, false);
    }

})();;
var filterBaseUrl = '',
    filters = [];

function prepareFilter(baseUrl, filterUrl, categoryId, queryString) {

    filterBaseUrl = baseUrl;

    $('.show-filter').click(function (e) {
        $('#grid-filtering').toggle();
        $('#grid-sorting').toggleClass('filtering');

        if ($('#grid-filtering').is(':visible')) {
            $('.show-filter i').removeClass('fa-filter').addClass('fa-caret-up');
            $('#product-list .grid').css('opacity', '0.3');

            if ($('#grid-filtering').children('#grid-filtering-container').length == 0) {
                loadFilter(filterUrl, categoryId, queryString);
            }
        }
        else {
            $('.show-filter i').removeClass('fa-caret-up').addClass('fa-filter');
            $('#product-list .grid').css('opacity', '1');
        }

        e.preventDefault();
    });

}

function prepareFilterSearch(baseUrl, filterUrl, search, categoryId, queryString) {

    filterBaseUrl = baseUrl;

    $('.show-filter').click(function (e) {
        $('#grid-filtering').toggle();
        $('#grid-sorting').toggleClass('filtering');

        if ($('#grid-filtering').is(':visible')) {
            $('.show-filter i').removeClass('fa-filter').addClass('fa-caret-up');
            $('#product-list .grid').css('opacity', '0.3');

            if ($('#grid-filtering').children('#grid-filtering-container').length == 0) {
                loadFilterSearch(filterUrl, search, categoryId, queryString);
            }
        }
        else {
            $('.show-filter i').removeClass('fa-caret-up').addClass('fa-filter');
            $('#product-list .grid').css('opacity', '1');
        }

        e.preventDefault();
    });

}

function loadFilter(url, categoryId, queryString) {

    $.ajax({
        type: 'POST',
        cache: false,
        url: url,
        data: { categoryId: categoryId, queryString: queryString, __RequestVerificationToken: getAfToken() }
    })
    .done(function (result) {
        processFilterResult(result);
        filterPreFill();
    })
    .fail(function () {
        $('#product-list .grid').css('opacity', '1');
    })
    .always(function () {

    });

}

function loadFilterSearch(url, search, categoryId, queryString) {

    $.ajax({
        type: 'POST',
        cache: false,
        url: url,
        data: { q: search, cd: categoryId, queryString: queryString, __RequestVerificationToken: getAfToken() }
    })
    .done(function (result) {
        processFilterResult(result);
        filterPreFill();
    })
    .fail(function () {
        $('#product-list .grid').css('opacity', '1');
    })
    .always(function () {

    });

}

function applyCategoryFilter(filterBy) {

    if (filters.length <= 0) {
        $('#filter-by-category-active').hide();
    }
    else {
        var html = '';

        for (var i = 0; i < filters.length; i++) {
            var f = filters[i];

            if (f.filterBy == filterBy) {
                html += '<li data-filterby="' + f.filterBy + '" data-id="' + f.id + '" data-name="' + f.name + '" data-filter="' + f.filter + '"><i class="fa fa-times"></i> ' + f.name + '</li>';
            }
        }

        $('#filter-by-category-active').show();
        $('#filter-by-category-active ul').html(html);

        $('#filter-by-category-active li').on('click', function (e) {
            var $elem = $(this),
                elemItem = { filterBy: $elem.data('filterby'), id: $elem.data('id'), name: $elem.data('name'), filter: $elem.data('filter') };

            filters.removeObject(elemItem);
            $elem.remove();

            if ($('#filter-by-category-active li').length <= 0) {
                $('#filter-by-category-active').hide();
            }
        })
    }

    $('#filter-by-category')[0].value = -1;

}

function applyBrandFilter(filterBy) {

    if (filters.length <= 0) {
        $('#filter-by-brand-active').hide();
    }
    else {
        var html = '';

        for (var i = 0; i < filters.length; i++) {
            var f = filters[i];

            if (f.filterBy == filterBy) {
                html += '<li data-filterby="' + f.filterBy + '" data-id="' + f.id + '" data-name="' + f.name + '" data-filter="' + f.filter + '"><i class="fa fa-times"></i> ' + f.name + '</li>';
            }
        }

        $('#filter-by-brand-active').show();
        $('#filter-by-brand-active ul').html(html);

        $('#filter-by-brand-active li').on('click', function (e) {
            var $elem = $(this),
                elemItem = { filterBy: $elem.data('filterby'), id: $elem.data('id'), name: $elem.data('name'), filter: $elem.data('filter') };

            filters.removeObject(elemItem);
            $elem.remove();

            if ($('#filter-by-brand-active li').length <= 0) {
                $('#filter-by-brand-active').hide();
            }
        })
    }

    $('#filter-by-brand')[0].value = -1;

}

function applyAvailabilityFilter(checked) {
    $('#filter-by-availability')[0].checked = checked;
}

function processFilterResult(result) {

    $('#grid-filtering').html(result);

    if ($('#filter-by-category').length > 0) {

        $('#filter-by-category')[0].value = -1;

        $('#filter-by-category').change(function (e) {
            var $selectedItem = $(this).find(':selected');

            if ($selectedItem.val() == -1) {
                return;
            }

            var id = $selectedItem.data('id'),
                filterBy = $selectedItem.data('filterby'),
                filter = $selectedItem.data('filter'),
                name = $selectedItem.data('name');

            var item = { filterBy: filterBy, id: id, name: name, filter: filter };

            filters.pushIfNotExist(item, function (e) {
                return e.filter == item.filter;
            });

            applyCategoryFilter(filterBy);
        });

    }

    if ($('#filter-by-brand').length > 0) {

        $('#filter-by-brand')[0].value = -1;

        $('#filter-by-brand').change(function (e) {
            var $selectedItem = $(this).find(':selected');

            if ($selectedItem.val() == -1) {
                return;
            }

            var id = $selectedItem.data('id'),
                filterBy = $selectedItem.data('filterby'),
                filter = $selectedItem.data('filter'),
                name = $selectedItem.data('name');

            var item = { filterBy: filterBy, id: id, name: name, filter: filter };

            filters.pushIfNotExist(item, function (e) {
                return e.filter == item.filter;
            });

            applyBrandFilter(filterBy);
        });

    }

    $('#filter-by-availability').change(function (e) {
        var $selectedItem = $(this),
            filterBy = $selectedItem.data('filterby'),
            id = $selectedItem.data('id'),
            filter = $selectedItem.data('filter'),
            item = { filterBy: filterBy, id: id, filter: filter };

        if (this.checked) {
            filters.pushIfNotExist(item, function (e) {
                // availability = only one filter allowed
                return e.filter == item.filter;
            });
        }
        else {
            filters.removeObject(item);
        }
    });

    $('#filter-by-availability-store').change(function (e) {
        var $selectedItem = $(this).find(':selected'),
            filterBy = $selectedItem.data('filterby'),
            id = $selectedItem.data('id'),
            filter = $selectedItem.data('filter'),
            item = { filterBy: filterBy, id: id, filter: filter };

        if ($('#filter-by-availability').is(':checked')) {
            // trigger event to remove old item from filters
            $('#filter-by-availability').trigger('click');
        }

        $('#filter-by-availability').data('filterBy', filterBy).data('id', id).data('filter', filter);

        // trigger event to add new item with updated data-*-values
        $('#filter-by-availability').trigger('click');
    });

    $('#filter-submit').on('click', function (e) {
        e.preventDefault();

        submitFilterResult();

        return false;
    });

}

function submitFilterResult() {
    var filterUrl = filterBaseUrl;

    for (var i = 0; i < filters.length; i++) {
        var f = filters[i];
        filterUrl += "&f" + (i + 1) + "=" + f.filter;
    }

    window.location = filterUrl;
}

(function () {

    $('#ddlSortBy').change(function (e) {
        var selectedValue = $(this).find(':selected').val(),
            location = $('#grid-sorting a[data-sortBy="' + selectedValue + '"]').attr('href');

        // redirect
        window.location.href = location;
    });

})();

;
var productFilter = productFilter || {};

productFilter.settings = productFilter.settings || {};

productFilter.init = function () {

    // external
    var activeFilters = this.settings.activeFilters,
        baseUrl = this.settings.baseUrl,
        baseUrlAjax = this.settings.baseUrlAjax,
        baseUrlPriceCount = this.settings.baseUrlPriceCount,
        currentCategoryId = this.settings.currentCategoryId,
        isSearch = this.settings.isSearch,
        search = this.settings.search;

    // internal
    var enableRealtime = true,
        expandedFilters = [],
        initialFilterCount = activeFilters.length,
        clientSupportsLocalStorage = false,
        allLabel = '';

    if (typeof (Storage) !== 'undefined') {
        clientSupportsLocalStorage = true;

        try {
            var lsItem = sessionStorage.getItem('expandedFilters');

            if (lsItem != null && lsItem.length > 0) {
                expandedFilters = JSON.parse(lsItem);
            }

        } catch (e) {
            clientSupportsLocalStorage = false;
            sessionStorage.clear();
        }

        if (clientSupportsLocalStorage && activeFilters.length == 0) {
            sessionStorage.clear();
            expandedFilters = [];
        }
    }

    //$('#toggle-realtime-updates').on('change', function () {
    //    var $this = $(this);

    //    if ($this.prop('checked')) {
    //        $('#attribute-filter').addClass('realtime');
    //    }
    //    else {
    //        $('#attribute-filter').removeClass('realtime');
    //    }
    //});

    //$('#toggle-realtime-updates').trigger('change');

    mobilizeAttributeFilter();
    initAttributeEvents();

    function initAttributeEvents() {

        //console.log('initAttributeEvents');

        // preset before events are bound
        presetFilter();

        //console.log('attribute-sliders', $('.attribute-sliders'));
        //console.log('standard-sliders', $('.standard-sliders'));

        // set buttons
        $('.clear-filter').on('click', function () {
            if (activeFilters.length > 0) {
                //console.log('clear filter');
                activeFilters = [];
                //console.log('activeFilters', activeFilters);
                if (clientSupportsLocalStorage) {
                    sessionStorage.clear();
                }
                callAttributeUrl(false);
            }
        });

        // set sliders
        $('.attribute-sliders').each(function (i) {
            var $this = $(this),
                hide = $this.data('hide'),
                start = [$this.data('start-min'), $this.data('start-max')],
                rangeString = $this.data('range'),
                range = JSON.parse(rangeString.replace(/'/g, '"'));

            if (hide) {
                $this.parent().parent().hide();
                return true;
            }

            createAttributeSlider($this, start, range);
        });

        $('.standard-sliders').each(function (i) {
            var $this = $(this),
                startMin = parseInt($this.data('start-min')),
                startMax = parseInt($this.data('start-max')),
                min = parseInt($this.data('min')),
                max = parseInt($this.data('max'));

            createStandardSlider($this, startMin, startMax, min, max);
        });

        // set checkboxes
        $('input.filter-by[type="checkbox"]').on('change', function (e) {
            var $this = $(this);
            var filter = $this.data('filter').toString();
            //var filterCount = (baseUrl.match(/f\d=/g) || []).length;
            var isChecked = $this.is(':checked');

            //console.log('filter', filter);

            if ($.inArray(filter, activeFilters) >= 0) {
                //console.log('ist vorhanden');

                if (!isChecked) {
                    //console.log('remove from url');
                    activeFilters.remove(filter);
                }
            }
            else {
                //console.log('nicht vorhanden');

                if (isChecked) {
                    //console.log('add to url');
                    activeFilters.push(filter);
                }
            }

            if (clientSupportsLocalStorage) {
                if (isChecked) {
                    addFilterToSessionStorage($this);
                }
                //else {
                //    console.log('remove 3');
                //    removeFilterFromSessionStorage($this);
                //}
            }

            //console.log('activeFilters: ', activeFilters);

            callAttributeUrl();
        });

        // set availability checkbox
        $('#store-availability').on('change', function (e) {
            //console.log('change checkbox');

            var $this = $(this);
            var isChecked = $this.prop('checked');

            //console.log('isChecked', isChecked);

            var filter = '';
            var oldFilter = $this.data('old-filter');
            var checkedStore = $('#store-list :checked');

            if (oldFilter != '') {
                //console.log('remove old filter');
                activeFilters.remove(oldFilter);
            }

            if (isChecked) {
                if (checkedStore.length == 0) {
                    $('#store--1').prop('checked', true);

                    checkedStore = $('#store--1');
                }

                filter = checkedStore.data('filter').toString();

                $this.data('old-filter', filter);
            }
            else {
                filter = oldFilter;
                $('#store-list .filter-by.radio-list').removeAttr('checked');
            }

            if (clientSupportsLocalStorage) {
                if (isChecked) {
                    addFilterToSessionStorage($this);
                }
                else {
                    removeFilterFromSessionStorage($this);
                }
            }

            if ($.inArray(filter, activeFilters) >= 0) {
                //console.log('ist vorhanden');

                if (!isChecked) {
                    //console.log('remove from url');
                    activeFilters.remove(filter);
                }
            }
            else {
                //console.log('nicht vorhanden');

                if (isChecked) {
                    //console.log('add to url');
                    activeFilters.push(filter);
                }
            }

            //console.log('activeFilters: ', activeFilters);

            callAttributeUrl();
        });

        // set store radio buttons
        $('#store-list .filter-by.radio-list').on('change', function (e) {
            //console.log('change radio');

            if ($('#store-availability').prop('checked')) {
                $('#store-availability').trigger('change');
            }
            else {
                $('#store-availability').trigger('click');
            }
        });

        // set buttons
        $('.attribute-btn').on('click', function () {

            if (clientSupportsLocalStorage) {
                addFilterToSessionStorage($(this));
            }

            callAttributeUrl();
        });

        // set input filter
        $('#brand-search-filter input').searchFilter({ targetSelector: '.filter-by-brand label', hideParent: true, charCount: 1 });

        // set mobile ajax loader
        $('#load-attribute-ajax').on('click', function () {
            if (activeFilters.length > 0 || initialFilterCount > 0) {
                callAttributeUrl(true);
            }
            else {
                $('.mfp-close').trigger('click');
            }
        });
    };

    function addFilterToSessionStorage($elem) {
        if (clientSupportsLocalStorage) {
            var parentId = $elem.closest('.attribute-container').find('input.toggle').attr('id');

            if ($.inArray(parentId, expandedFilters) < 0) {
                expandedFilters.push(parentId);
            }

            sessionStorage.setItem('expandedFilters', JSON.stringify(expandedFilters));
        }
    };

    function removeFilterFromSessionStorage($elem) {
        if (clientSupportsLocalStorage) {
            var parentId = $elem.closest('.attribute-container').find('input.toggle').attr('id'),
                index = $.inArray(parentId, expandedFilters);

            if (index >= 0) {
                expandedFilters.splice(index, 1);
            }

            sessionStorage.setItem('expandedFilters', JSON.stringify(expandedFilters));
        }
    };

    function createStandardSlider($elem, startMin, startMax, min, max) {
        var slider = $elem[0];

        noUiSlider.create(slider, {
            start: [startMin, startMax],
            range: {
                'min': [min],
                'max': [max]
            },
            connect: true
        });

        sliderAppendBottomTooltip(slider, document.getElementById('price-slider-value-lower'), document.getElementById('price-slider-value-upper'));
        sliderAppendCustomConnector(slider);
        sliderSetChangeEvent(slider, function () {

            var url = baseUrlPriceCount;

            for (var i = 0; i < activeFilters.length; i++) {
                var subFilter = activeFilters[i];

                url = addUrlParameter(url, 'f' + (i + 1), subFilter, false)
            }

            //console.log(url);

            $('#price-slider-value-count').text('(...)');

            if (isSearch) {
                url = addUrlParameter(url, 'search', search, false);
                //console.log('is search 1', url);
            }

            $.ajax({
                type: 'GET',
                cache: true,
                url: url,
                data: { categoryId: currentCategoryId }
            })
            .done(function (result) {
                //console.log('AJAX done', result);

                $('#price-slider-value-count').text('(' + result + ')');
            })
            .fail(function () {
                alert("Es ist ein Fehler aufgetreten, bitte versuchen Sie es später erneut / An error occured, please try again later");
                //console.log('AJAX fail');
            })
            .always(function () {
                //console.log('AJAX always');
            });

        });
    };

    function createAttributeSlider($elem, start, range) {
        var slider = $elem[0];

        noUiSlider.create(slider, {
            range: range,
            start: start,
            snap: true,
            connect: true,
            pips: {
                mode: 'positions',
                values: [0, 25, 50, 75, 100],
                density: 4,
                stepped: true
            }
        });

        sliderAppendTopTooltip(slider);
        sliderAppendCustomConnector(slider);
        sliderSetChangeEvent(slider);
    };

    function sliderAppendTopTooltip(slider) {
        // append tooltips
        var tipHandles = slider.getElementsByClassName('noUi-handle'),
            tooltips = [];

        // Add divs to the slider handles.
        for (var i = 0; i < tipHandles.length; i++) {
            tooltips[i] = document.createElement('div');
            tipHandles[i].appendChild(tooltips[i]);
            // Add a class for styling
            tooltips[i].className += 'tooltip';
            // Add additional markup
            tooltips[i].innerHTML = '<span class="nowrap"></span>';
            // Replace the tooltip reference with the span we just added
            tooltips[i] = tooltips[i].getElementsByTagName('span')[0];
        }

        // When the slider changes, write the value to the tooltips.
        slider.noUiSlider.on('update', function (values, handle) {
            tooltips[handle].innerHTML = parseInt(values[handle]);
        });
    };

    function sliderAppendBottomTooltip(slider, leftSpan, rightSpan) {
        var snapValues = [
            leftSpan,
            rightSpan
        ];

        slider.noUiSlider.on('update', function (values, handle) {
            snapValues[handle].innerHTML = parseInt(values[handle]);
        });
    };

    function sliderAppendCustomConnector(slider) {
        // append connector
        var connectBar = document.createElement('div'),
            connectBase = slider.getElementsByClassName('noUi-base')[0],
            connectHandles = slider.getElementsByClassName('noUi-origin');

        // Give the bar a class for styling and add it to the slider.
        connectBar.className += 'connect';
        connectBase.appendChild(connectBar);

        slider.noUiSlider.on('update', function (values, handle) {

            // Pick left for the first handle, right for the second.
            var side = handle ? 'right' : 'left',
            // Get the handle position and trim the '%' sign.
                offset = (connectHandles[handle].style.left).slice(0, -1);

            // Right offset is 100% - left offset
            if (handle === 1) {
                offset = 100 - offset;
            }

            connectBar.style[side] = offset + '%';
        });
    };

    function sliderSetChangeEvent(slider, callback) {
        // event after value has been changed
        slider.noUiSlider.on('change', function () {
            var $slider = $(slider),
                filter = $slider.data('filter').toString(),
                dataMin = parseInt($slider.data('min')),
                dataMax = parseInt($slider.data('max')),
                startMin = parseInt($slider.data('start-min')),
                startMax = parseInt($slider.data('start-max')),
                values = slider.noUiSlider.get(),
                minValue = parseInt(values[0]),
                maxValue = parseInt(values[1]);

            // get old filter from data api and remove from array
            var filterOld = $slider.data('filter-old');

            //console.log('filter-old: ', filterOld);

            // prepare filter
            filter = filter.replace('{min}', minValue).replace('{max}', maxValue);
            //console.log('filter: ', filter);

            if (filterOld == null || filterOld == '') {
                filterOld = filter;
            }

            // add new filter to data api
            $slider.data('filter-old', filter);

            var index = $.inArray(filterOld, activeFilters);

            if (index >= 0) {
                // if attribute is present, remove
                activeFilters.splice(index, 1);
            }

            //console.log('dataMin', dataMin);
            //console.log('dataMax', dataMax);
            //console.log('startMin', startMin);
            //console.log('startMax', startMax);
            //console.log('minValue', minValue);
            //console.log('maxValue', maxValue);

            if (minValue > dataMin || maxValue < dataMax) {
                activeFilters.push(filter);
            }

            // handle apply-button
            if (minValue != startMin || maxValue != startMax) {
                $slider.nextUntil(null, '.attribute-btn').show();
                if (clientSupportsLocalStorage) {
                    //console.log('slider add', $slider);
                    addFilterToSessionStorage($slider);
                }
            }
            else {
                $slider.nextUntil(null, '.attribute-btn').hide();
                if (clientSupportsLocalStorage) {
                    //console.log('slider remove', $slider);
                    removeFilterFromSessionStorage($slider);
                }
            }

            //console.log('activeFilters: ', activeFilters);

            if (callback != undefined) {
                callback();
            }

            //if (filter != filterOld) {
            //    callAttributeUrl();
            //}
            //else {
            //    console.log('same filter');
            //}

            //callAttributeUrl();
        });
    };


    function mobilizeAttributeFilter() {

        $('#open-kc-attributes a').magnificPopup({
            type: 'inline',
            //overflowY: 'hidden',
            midClick: true,

            // instad of modal: true - because with active modal option, the close button disappears
            closeOnContentClick: false,
            closeOnBgClick: false,
            enableEscapeKey: false,

            fixedContentPos: true, // prevent viewport overscrolling
            removalDelay: 500, //delay removal by X to allow out-animation
            callbacks: {
                beforeOpen: function () {
                    this.st.mainClass = this.st.el.attr('data-effect');
                },
                open: function () {
                    //console.log('Popup is opened');

                    enableRealtime = false;
                    //console.log('disable realtime');

                    //var $this = $(this),
                    //    $this0 = $this[0],
                    //    enableFullscreen = false,
                    //    $popup = $this0.content;

                    //if ($popup.hasClass('is-fullscreen')) {
                    //    $this0.container.addClass('fullscreen-modal');
                    //    enableFullscreen = true;
                    //}

                    //if (!enableFullscreen) {
                    //    // calculate height and fire once
                    //    $(window).on('resize.modal', function () {
                    //        if (isMobileViewport()) {
                    //            $('.popup-scroll').css('height', '');
                    //        }
                    //        else {
                    //            var maxHeight = window.innerHeight - ($popup.outerHeight(true) - $popup.find('.popup-scroll').height());
                    //            $('.popup-scroll').css('height', maxHeight);
                    //        }
                    //    });

                    //    $(window).trigger('resize.modal');

                    //    // switch normal and responsive theme
                    //    $(window).on('resize.responsiveAttribute', function () {
                    //        //console.log('resize.responsiveAttribute', enableFullscreen);
                    //        if (isMobileViewport()) {
                    //            if (!enableFullscreen) {
                    //                console.log('enable');
                    //                $this0.container.addClass('fullscreen-modal');
                    //                enableFullscreen = true;
                    //            }
                    //        }
                    //        else if (enableFullscreen) {
                    //            console.log('disable');
                    //            $this0.container.removeClass('fullscreen-modal');
                    //            enableFullscreen = false;
                    //        }
                    //    });
                    //}

                    //$(window).trigger('resize.responsiveAttribute');

                    var headerHtml = $('#attribute-filter-header').html();
                    var container = $('#attribute-filter-body > div').detach();

                    $('#kc-attributes .kc-modal-header').html(headerHtml);
                    $('#kc-attributes .kc-modal-body').empty().append(container);

                    allLabel = $('#attribute-filter-product-count').text();

                    // product count
                    countProducts();
                },
                close: function () {
                    //console.log('Popup is closed');

                    enableRealtime = true;
                    //console.log('re-enable realtime');

                    var container = $('#kc-attributes .kc-modal-body > div').detach();

                    $('#attribute-filter-body').append(container);
                }
            },
        });

    };

    function presetFilter() {

        //console.log('presetFilter');

        //// expand brand if no filter is set
        //if (activeFilters.length == 0) {
        //    $('#brand-filter > input').prop('checked', true);
        //}

        // reset checkboxes
        //console.log('reset checkboxes');
        $('input.toggle').prop('checked', false);
        $('input.filter-by[type="checkbox"]').prop('checked', false);

        // clear availability buttons
        $('#store-availability').prop('checked', false);
        $('#store-list .filter-by.radio-list').removeAttr('checked');

        //console.log('prepare filter, activeFilters', activeFilters);

        for (var i = 0; i < activeFilters.length; i++) {
            var filter = activeFilters[i];

            // Attribut
            if (filter.indexOf('1$') >= 0) {
                presetFilterAttribute(filter);
            }

                // Brand
            else if (filter.indexOf('2$') >= 0) {
                // gleiche handhabung
                presetFilterAttribute(filter);
            }

                // PriceRange
                // aktuell nicht notwendig
                //else if (filter.indexOf('3$') >= 0) {
                //    presetFilterPrice(filter);
                //}

                // Availability
            else if (filter.indexOf('4$') >= 0) {
                // gleiche handhabung
                presetFilterAttribute(filter);

                $('#store-availability').prop('checked', true);
            }

            else {
                //console.log('skip presetFilter for:', filter);
                continue;
            }
        }

        if (clientSupportsLocalStorage && expandedFilters != null) {
            //console.log('preset via sessionStorage');

            //console.log('expandedFilters', expandedFilters);

            for (var i = 0; i < expandedFilters.length; i++) {
                var toggleId = '#' + expandedFilters[i];
                //console.log(toggleId);
                $(toggleId).prop('checked', true);
                $(toggleId).on('change', function () {
                    //console.log('remove #' + $(this).attr('id') + ' from storage');
                    removeFilterFromSessionStorage($(this));
                    $(this).off('change');
                });
            }
        }

        //$('.attribute-sliders[data-expand="1"]').parent().prev().prev().prop('checked', true);

    };

    function presetFilterAttribute(filter) {
        //var attributeId = filter.split('$')[1].split(':')[0].trim();

        // expand attribute container
        //$('#toggle-attribute-' + attributeId).prop('checked', true);

        if (filter.indexOf('::') >= 0) {
            return;
        }

        //console.log('filter: ', filter);

        // activate attribute value checkbox
        $('.filter-by[data-filter="' + filter + '"]').prop('checked', true);
    };

    function countProducts() {
        if (activeFilters.length == 0) {
            $('#attribute-filter-product-count').text(allLabel);
        }
        else {
            var productCount = 0;

            $('#brand-filter label[data-product-count]').each(function () {
                productCount += parseInt($(this).data('product-count'));
            });

            $('#attribute-filter-product-count').text(productCount);
        }
    };

    function callAttributeUrl(forceLoad) {
        var url = baseUrl;

        if (forceLoad == null) {
            forceLoad = false;
        }

        if (!(forceLoad || enableRealtime)) {
            url = baseUrlAjax;
        }

        for (var i = 0; i < activeFilters.length; i++) {
            var subFilter = activeFilters[i];

            url = addUrlParameter(url, 'f' + (i + 1), subFilter, false)
        }

        //console.log('new url: ', url);

        if (forceLoad || enableRealtime) {
            location.href = url;
        }
        else {
            getFilterAjax(url);
        }
    };

    function getFilterAjax(url) {
        toggleAjaxFilterLoadingOverlay(true);

        var scrollMarginTop = $('.kc-modal-body').scrollTop();

        $('.kc-modal-body').scrollTop(0);

        if (isSearch) {
            url = addUrlParameter(url, 'search', search, false);
            //console.log('is search 2', url);
        }

        $.ajax({
            type: 'GET',
            cache: true,
            url: url,
            data: { categoryId: currentCategoryId }
        })
        .done(function (result) {
            //console.log('AJAX done');

            // replace everything
            $('#kc-attributes .kc-modal-body > div').html(result);

            // rebind events
            initAttributeEvents();

            // scroll back to previous position
            $('.kc-modal-body').scrollTop(scrollMarginTop);

            // product count
            countProducts();
        })
        .fail(function () {
            alert("Es ist ein Fehler aufgetreten, bitte versuchen Sie es später erneut / An error occured, please try again later");
            //console.log('AJAX fail');
        })
        .always(function () {
            //console.log('AJAX always');

            toggleAjaxFilterLoadingOverlay(false);
        });
    };

    function toggleAjaxFilterLoadingOverlay(show) {
        if (show) {
            $('#attribute-filter-content').parent().addClass('attribute-loading');
            $('.kc-modal-body').removeClass('scroll-y');
        }
        else {
            $('#attribute-filter-content').parent().removeClass('attribute-loading');
            $('.kc-modal-body').addClass('scroll-y');
        }
    };

    //$('#open-kc-attributes a').trigger('click');

};;
function initCartSummary(summaryUrl) {

    $('#cart-summary-toggle .second, #cart-summary-toggle .third').removeClass('hddn');

    if (isInternetExplorer()) {
        // IE < 11 doesn't support shit :(
        loadCartSummary(summaryUrl);
        bindCartSummaryEvents();
    }
    else {
        // set event for browser back/forward buttons to reload the cart
        window.onpageshow = function (e) {
            loadCartSummary(summaryUrl);
            bindCartSummaryEvents();
        };
    }

    //if (isMobileViewport()) {
    //    window.addEventListener('orientationchange', loadCartSummaryImages());
    //}

    //window.removeEventListener('orientationchange', function() {});
}

function loadCartSummary(summaryUrl) {

    $.ajax({
        url: summaryUrl,
        type: 'POST',
        cache: false,
        //contentType: 'application/json',
        data: { __RequestVerificationToken: getAfToken() }
    })
    .done(function (result) {
        //console.log('AJAX DONE');
        $('#cart-summary-content').html(result);

        $('#cart-summary i').on('click', function (e) {
            $('#cart-summary').hide();
        });

        $('#cart-summary-items').text($('#cart-summary input[name="cart-summary-items"]').val());

        var cartItemCount = parseInt($('#cart-summary input[name="cart-summary-item-count"]').val());

        if (cartItemCount > 0) {
            $('.cart-badge > span').text(cartItemCount).addClass('animate-opacity-end');
        }

        $('#cart-summary-toggle i').addClass('fa-caret-down');

        //loadCartSummaryImages();
    })
    .fail(function () {
        //alert("Es ist ein Fehler aufgetreten, bitte versuchen Sie es später erneut / An error occured, please try again later");
        //console.log('AJAX fail');
        $('#cart-summary-items').text('Error :(');
    })
    .always(function () {
        //console.log('AJAX always');
        $('#cart-summary-toggle i').removeClass('fa-spinner fa-pulse');
    });
}

function bindCartSummaryEvents() {

    $('#cart-summary-toggle').off('click').on('click', function () {

        $('#cart-summary').toggle();

        if ($('#cart-summary').is(':visible')) {
            loadCartSummaryImages();

            $(document).on('click touchstart', function (e) {
                if (!hasParentClass(e.target, 'cart-summary') && !hasParentClass(e.target, 'cart-summary-toggle')) {

                    $('#cart-summary').hide();
                    $(document).off('click touchstart');

                    if (!hasParentClass(e.target, 'cart-symbol')) {
                        // stop propagation only if element is visible on screen
                        if (isOnScreen($('#cart-symbol-wrapper'))) {
                            e.preventDefault();
                            e.stopPropagation();
                        }
                    }
                }
            });

            if (isMobileBrowser()) {
                var viewportHeight = $(window.innerHeight)[0],
                    tblMaxHeight = 400;

                if (viewportHeight < 650) {
                    tblMaxHeight = viewportHeight - 250;

                    if (tblMaxHeight < 150) {
                        tblMaxHeight = 250;
                    }
                }

                $('#cart-summary-content table').css('max-height', tblMaxHeight + 'px');
            }
            else {
                $('#cart-summary-content table').slimScroll({ height: 'auto', railOpacity: 0.7 })
            }
        }
        else {
            $(document).off('click touchstart');
        }

    });

}

function loadCartSummaryImages() {
    //console.log('loadCartSummaryImages');

    if (isMobileViewport()) {
        //console.log('is mobile');
        return;
    }

    if ($('#cart-summary-content').text().length == 0) {
        //console.log('empty');
        return;
    }

    if ($('#cart-summary-content img[data-src]').length == 0) {
        //console.log('already done');
        return;
    }

    //console.log('do it');

    $('#cart-summary-content img').each(function (i) {
        var $this = $(this);
        $this.attr('src', $this.data('src'));
        // use removeAttr instead of removeData, because removeAttr manipulates the real dom, removeData only the internal object
        $this.removeAttr('data-src');
    });
};

function initFrontpage() {

    //$('.seal .text').dotdotdot({
    //    watch: true
    //});

    $('#carousel').owlCarousel({
        loop:true,
        nav: false,
        lazyLoad: true,
        autoplay: true,
        autoplayHoverPause: true,
        items: 1,
        smartSpeed: 500,
    });

    $('#brand .owl-carousel').owlCarousel({
        nav: true,
        navText: [
            '<i class="fa fa-chevron-left"></i>',
            '<i class="fa fa-chevron-right"></i>'
        ],
        lazyLoad: true,
        items: 8,
        smartSpeed: 200,
        responsive: {
            0: {
                items: 2,
            },
            680: {
                items: 3,
            },
            900: {
                items: 4,
            },
            1024: {
                items: 6,
            },
            1280: {
                items: 8,
            }
        },
        slideBy: 'page',

        //navigation: true,
        //navigationText: [
        //    '<i class="fa fa-chevron-left"></i>',
        //    '<i class="fa fa-chevron-right"></i>'
        //],
        //lazyLoad: true,
        //scrollPerPage: true,

        //itemsCustom: [
        //    [0, 2],
        //    [319, 3],
        //    [479, 4],
        //    [767, 6],
        //    [1023, 8]
        //]
    });

};
//function initProductDetail(hasPicture, pictureRoute, hasYoutubeVideos, showFinancing) {
//function initProductDetail(hasYoutubeVideos, showFinancing) {
function initProductDetail() {

    window.productDetail = window.productDetail || {};

    applyProductPictures();

    if (window.productDetail.hasYoutubeVideos == true) {

        applyStandardOwlCarouselToElement($('#product-videos.owl-carousel'), {
            items: 3,
            margin: 10,
            video: true,
            lazyLoad: true,
            responsive: {
                0: {
                    items: 1,
                },
                768: {
                    items: 2,
                },
                1280: {
                    items: 3,
                }
            },
        });

    }

    if (window.productDetail.hasSoundcloudAssets == true) {
        $('.soundcloud-item').on('click', function () {
            var $this = $(this),
                url = $this.data('url'),
                isPlaylist = $this.data('is-playlist').toLowerCase() == 'true',
                height = isPlaylist ? 465 : 166;

            $this.html('<iframe class="iframe" width="100%" height="' + height + '" scrolling="no" frameborder="no" src="' + url + '"></iframe>');
        });
    }

    if (window.productDetail.hasRenting == true) {

        $('#product-renting a').click(function (e) {

            $.pgwModal({
                target: '#product-renting-overlay',
                title: window.productDetail.rentingTitle,
                url: window.productDetail.rentingUrl,
                loadingContent: '<p class="ta-center"><i class="fa fa-spinner fa-pulse fa-2x"></i></p>'
            });

            e.preventDefault();
            return false;
        });

    }

    if (window.productDetail.hasPriceProposal == true) {

        $('#price-proposal').click(function (e) {

            $.pgwModal({
                target: '#price-proposal-overlay',
                title: window.productDetail.priceProposalTitle,
                url: window.productDetail.priceProposalUrl,
                loadingContent: '<p class="ta-center"><i class="fa fa-spinner fa-pulse fa-2x"></i></p>'
            });

            e.preventDefault();
            return false;
        });

    }

    if (window.productDetail.hasFinancingExample == true) {

        initFinancingExample(false);

    }

    if ($('#store-availability').length > 0) {
        $('#store-availability p').on('click', function () {
            $('#store-availability p').toggleClass('active');
            $('#store-availability ul').toggle();
        });
    }
}

function applyProductPictures() {

    applyStandardOwlCarouselToElement($('#product-detail-images'), {
        items: 4,
        //autoHeight: true,
        margin: 10,
        itemsScaleUp: true,
        responsive: {
            0: {
                items: 2,
            },
            480: {
                items: 3,
            },
            640: {
                items: 4,
            }
        },
    });

    try {
        $(TouchNSwipe.init);
        $('.sliderHolder').show();
    } catch (e) {
        console.log(e);
        $('.sliderHolder').hide();
    }

    $(document).on('keydown', function (e) {
        var code = e.keyCode || e.which;

        if ($('#product-image-gallery .slides').is(':visible')) {

            switch (code) {
                case 27: // esc-key
                    //$('#product-image-gallery .closeIcon').trigger('click');
                    TouchNSwipe.closeSlider('product-image-gallery-slider');
                    e.preventDefault();
                    break;

                case 37: // arrow left
                case 38: // arrow up
                    //$('#product-image-gallery .prevIcon').trigger('click');
                    TouchNSwipe.getSlider('product-image-gallery-slider').prev();
                    e.preventDefault();
                    break;

                case 39: // arrow right
                case 40: // arrow down
                    //$('#product-image-gallery .nextIcon').trigger('click');
                    TouchNSwipe.getSlider('product-image-gallery-slider').next();
                    e.preventDefault();
                    break;

                default:
                    break;
            }

        }
    });

};
var couponIsSent = false;

function initCartCoupon(validateCouponRoute) {

    $('#input-coupon').on('keydown', function (e) {
        var code = e.keyCode || e.which;
        if (code == '13') {
            $('#btn-send-coupon').trigger('click');
            return false;
        }
    });

    $('#btn-send-coupon').on('click', function (e) {
        $('#coupon-validation').hide().text('');

        if (!couponIsSent) {
            couponIsSent = true;
            $('#btn-send-coupon img').css('display', 'inline');

            $.ajax({
                type: 'POST',
                cache: false,
                url: validateCouponRoute,
                data: { couponCode: $('#input-coupon').val(), __RequestVerificationToken: getAfToken() },
                success: function (result) {
                    if (result === 'OK') {
                        location = location.pathname;
                    }
                    else {
                        $('#coupon-validation').show().text(result);
                        couponIsSent = false;
                        $('#btn-send-coupon img').hide();
                    }
                },
                error: function () {
                    $('#coupon-validation').show().text('Error');
                    couponIsSent = false;
                    $('#btn-send-coupon img').hide();
                }
            });
        }

        e.preventDefault();
        return false;
    });

}

function initCart() {

    $('#cart-additional-cta .toggle').on('click', function (e) {

        var $this = $(this),
            isActive = $this.hasClass('active');

        $('#cart-additional-cta .toggle').removeClass('active');
        $('#cart-additional-cta .cta-container').hide();

        if (!isActive) {
            $this.addClass('active');
            $('#' + $this.data('toggle')).show();
        }

        if ($this.data('toggle') == 'coupon-container' && !isActive) {
            $('#input-coupon').focus();
        }

        e.preventDefault();
        return false;

    });

}
;

function initShipment(urlShippingTable, loaderImg, errorText, chooseText) {

    // init stuff
    if ($('input[name="UseCustomBillingAddress"]').val() === 'true' || $('#billing-address span.field-validation-error').length > 0) {
        $('#billing-address').show();
        $('#cUseCustomBillingAddress').prop('checked', true);
        $('input[name="UseCustomBillingAddress"]').val('true');
    }
    else {
        $('#billing-address').hide();
        $('#cUseCustomBillingAddress').prop('checked', false);
        $('input[name="UseCustomBillingAddress"]').val('false');
    }

    // load shipping table
    getShippingTable(urlShippingTable, loaderImg, errorText, chooseText);

    // events
    $('#cUseCustomBillingAddress').change(function () {
        $('#billing-address').toggle();
        $('input[name="UseCustomBillingAddress"]').val($(this).prop('checked'));
    });

    $('#ShippingCountry').change(function () {
        getShippingTable(urlShippingTable, loaderImg, errorText, chooseText);
    });

    $('.address-picker').change(function (e) {
        var sender = $(e.target);
        var option = sender.find(':selected');
        var prefix = sender.parent().parent().attr('id').indexOf('shipping') >= 0 ? 'Shipping' : 'Billing';

        $('#' + prefix + 'Salutation').val(option.data('salutationid'));
        $('#' + prefix + 'FirstName').val(option.data('firstname'));
        $('#' + prefix + 'LastName').val(option.data('lastname'));
        $('#' + prefix + 'Company').val(option.data('company'));
        $('#' + prefix + 'Street').val(option.data('street'));
        $('#' + prefix + 'ZipPostalCode').val(option.data('zippostalcode'));
        $('#' + prefix + 'City').val(option.data('city'));
        $('#' + prefix + 'Country').val(option.data('countryid'));
        $('#' + prefix + 'PhoneNumber').val(option.data('phone'));

        getShippingTable(urlShippingTable, loaderImg, errorText, chooseText);
    });
}

function getShippingTable(urlShippingTable, loaderImg, errorText, chooseText) {

    var countryId = parseInt($('#ShippingCountry').find(':selected').val()),
        currentShippingTypeId = parseInt($('#CurrentShippingTypeId').val());

    if (typeof countryId === 'number' && (countryId % 1) === 0) {
        $('#shipping-table').html('<img src="' + loaderImg + '" />').removeClass('highlight');

        $.ajax({
            type: 'GET',
            cache: false,
            url: urlShippingTable,
            data: { countryId: countryId, currentShippingTypeId: currentShippingTypeId },
            success: function (result) {
                //$('#shipping-table').html(result).addClass('highlight');
                $('#shipping-table').html(result);
            },
            error: function () {
                $('#shipping-table').html(errorText);
            }
        });
    }
    else {
        $('#shipping-table').text(chooseText);
    }
}

var orderIsSent = false;
function initVerify(loaderImg) {
    $('#btn-place-order').click(function () {
        if (!orderIsSent) {
            document.forms['form-checkout'].submit();
            $('#btn-place-order').html($('#btn-place-order').html() + '<img src="' + loaderImg + '" alt="..." />');
            orderIsSent = true;
        }
        return false;
    });
}

// prevent double clicks
$("#checkout .checkout-navigation a.button.next").click(function (event) {
    if ($(this).hasClass("disabled")) {
        event.preventDefault();
    }
    $(this).addClass("disabled");
});;
function loadRepresentativeExample(urlRepresentativeExample) {
    $.pgwModal({
        target: '#pgw-overlay',
        title: 'Repräsentatives Beispiel',
        url: urlRepresentativeExample,
        maxWidth: 960,
        loadingContent: '<p class="ta-center"><i class="fa fa-spinner fa-pulse fa-2x"></i></p>',
        ajaxOptions: {
            success: function (data) {
                $.pgwModal({ pushContent: data });
                $.pgwModal({
                    pushContent: function () {
                        $('#pgw-close').on('click', function (e) {
                            $.pgwModal('close');
                        });
                    }
                });
            }
        }
    });
}

function loadElucidations(urlElucidations) {
    $.pgwModal({
        target: '#pgw-overlay',
        title: 'Einwilligung',
        url: urlElucidations,
        maxWidth: 960,
        loadingContent: '<p class="ta-center"><i class="fa fa-spinner fa-pulse fa-2x"></i></p>',
        ajaxOptions: {
            success: function (data) {
                $.pgwModal({ pushContent: data });
                $.pgwModal({
                    pushContent: function () {
                        $('#pgw-close').on('click', function (e) {
                            $.pgwModal('close');
                        });
                    }
                });
            }
        }
    });
}

function loadSepaDirectDebitMandate(urlSepaDirectDebitMandate) {
    $.pgwModal({
        target: '#pgw-overlay',
        title: 'SEPA-Lastschriftmandat',
        url: urlSepaDirectDebitMandate,
        maxWidth: 960,
        loadingContent: '<p class="ta-center"><i class="fa fa-spinner fa-pulse fa-2x"></i></p>',
        ajaxOptions: {
            success: function (data) {
                $.pgwModal({ pushContent: data });
                $.pgwModal({
                    pushContent: function () {
                        $('#pgw-close').on('click', function (e) {
                            $.pgwModal('close');
                        });

                        // check fields

                        var vorname = $('#ec-vorname').text().trim(),
                            nachname = $('#ec-nachname').text().trim(),
                            strasseHausNr = $('#ec-strasseHausNr').text().trim(),
                            plz = $('#ec-plz').text().trim(),
                            ort = $('#ec-ort').text().trim(),
                            iban = $('#ec-iban').val().trim();

                        var showMandat = true;

                        showMandat &= vorname.length > 0;
                        showMandat &= nachname.length > 0;
                        showMandat &= strasseHausNr.length > 0;
                        showMandat &= plz.length > 0;
                        showMandat &= ort.length > 0;
                        showMandat &= iban.length > 0;

                        if (!showMandat) {
                            $('#completeMandate').hide();
                            $('#incompleteMandate').show();
                        }
                        else {
                            $('#completeMandate').find('span[data-rk-placeholder="vorname"]').text(vorname);
                            $('#completeMandate').find('span[data-rk-placeholder="nachname"]').text(nachname);
                            $('#completeMandate').find('span[data-rk-placeholder="strasseHausNr"]').text(strasseHausNr);
                            $('#completeMandate').find('span[data-rk-placeholder="plz"]').text(plz);
                            $('#completeMandate').find('span[data-rk-placeholder="ort"]').text(ort);
                            $('#completeMandate').find('span[data-rk-placeholder="iban"]').text(iban);
                        }
                    }
                });
            }
        }
    });
}


function initHirePurchase(urlRepresentativeExample, urlElucidations, urlSepaDirectDebitMandate) {

    $('#representative-example').on('click', function () {
        loadRepresentativeExample(urlRepresentativeExample);
    });

    $('#elucidations').on('click', function (e) {
        loadElucidations(urlElucidations);
        if (e.stopPropagation) {
            e.stopPropagation();
        }
        e.preventDefault();
    });

    $('#sepa-direct-debit-mandate').on('click', function (e) {
        loadSepaDirectDebitMandate(urlSepaDirectDebitMandate);
        if (e.stopPropagation) {
            e.stopPropagation();
        }
        e.preventDefault();
    });

}

/* AUS DJL */

; kornCommerce.plugins = kornCommerce.plugins || {};

kornCommerce.plugins.easyCredit = kornCommerce.plugins.easyCredit || {};

//kornCommerce.plugins.easyCredit.initPayment = function () {
//    $('#ec-accept').on('change', function () {
//        $('#PaymentConditionsAccepted').val($(this).is(':checked'));
//    });
//};

kornCommerce.plugins.easyCredit.initHirePurchase = function () {

    function ecChange() {
        var $this = $(':selected', '#ec-rateSelect');

        $('#incidentalInterest').html($this.data('incidentalinterest'));
        $('#totalAmount').html($this.data('totalamount'));
        $('#rateAmount').html($this.data('rateamount'));
        $('#rateLastAmount').html($this.data('ratelastamount'));
        $('#nominalInterestRate').html($this.data('nominalinterestrate'));
        $('#effectiveInterest').html($this.data('effectiveinterest'));

        $('#ec-chosenRate').val($this.val());
    };

    $('#ec-rateSelect').val($('#ec-chosenRate').val());

    $('#ec-rateSelect').on('change', function (e) {
        ecChange();
    });

    if (parseInt($('#ec-chosenRate').val()) === 0) {
        $('#ec-rateSelect > option').last().prop('selected', true);
    }

    $('#ec-iban').on('blur', function (e) {
        $(this).val($(this).val().removeWhitespace());
    });

    ecChange();

    $('#ec-iban').trigger('blur');

    if ($('#ec-custom-error').length > 0) {
        $(document).scrollTop($('#ec-custom-error').offset().top - 20);
    }


    //function initEasyCreditSepaConfirmation() {

    //    // check fields

    //    var vorname = $('#ec-vorname').text().trim(),
    //        nachname = $('#ec-nachname').text().trim(),
    //        strasseHausNr = $('#ec-strasseHausNr').text().trim(),
    //        plz = $('#ec-plz').text().trim(),
    //        ort = $('#ec-ort').text().trim(),
    //        iban = $('#ec-iban').val().trim();

    //    var showMandat = true;

    //    showMandat &= vorname.length > 0;
    //    showMandat &= nachname.length > 0;
    //    showMandat &= strasseHausNr.length > 0;
    //    showMandat &= plz.length > 0;
    //    showMandat &= ort.length > 0;
    //    showMandat &= iban.length > 0;

    //    if (!showMandat) {
    //        $('#completeMandate').hide();
    //        $('#incompleteMandate').show();
    //    }
    //    else {
    //        $('#completeMandate').find('span[data-rk-placeholder="vorname"]').text(vorname);
    //        $('#completeMandate').find('span[data-rk-placeholder="nachname"]').text(nachname);
    //        $('#completeMandate').find('span[data-rk-placeholder="strasseHausNr"]').text(strasseHausNr);
    //        $('#completeMandate').find('span[data-rk-placeholder="plz"]').text(plz);
    //        $('#completeMandate').find('span[data-rk-placeholder="ort"]').text(ort);
    //        $('#completeMandate').find('span[data-rk-placeholder="iban"]').text(iban);
    //    }

    //    // set time
    //    $('#sepa-date').text(kornCommerce.functions.getToday());
    //};

    //kornCommerce.content.initModal('#modal-easycredit-popup', '#easycredit-popup-container', initEasyCreditSepaConfirmation);

};

kornCommerce.plugins.easyCredit.initHirePurchaseEnd = function (targetUrl, resultTextDone, resultTextFail) {

    $('#resend-mtan').on('click', function () {

        // MHK special
        $('#resend-mtan').attr('disabled', 'disabled'); 

        // reset
        $('#resend-mtan-result').removeClass('text-success text-danger').empty();

        $.ajax({
            cache: false,
            url: targetUrl
        })
        .done(function (result) {
            if (result === 'ok') {
                $('#resend-mtan-result').addClass('text-success').text(resultTextDone);
            }
            else {
                $('#resend-mtan-result').addClass('text-danger').text(resultTextFail);
            }
        })
        .fail(function () {
            $('#resend-mtan-result').addClass('text-danger').text(resultTextFail);
        })
        .always(function () {
            $('#resend-mtan').removeAttr('disabled');
        });
    });

};;
; kornCommerce.plugins = kornCommerce.plugins || {};

kornCommerce.plugins.paypalExpress = kornCommerce.plugins.paypalExpress || {};

kornCommerce.plugins.paypalExpress.init = function (shoppingCartAmount, clientId, clientToken, productId) {

    function showError(errorText) {
        $('#express-checkout-container').next().text(errorText).show();
    };

    function hideError() {
        $('#express-checkout-container').next().hide().text('');
    };

    if (clientToken === '') {
        kornCommerce.plugins.paypalExpress.fail();
        return;
    }

    var amount = parseFloat(shoppingCartAmount).toFixed(2);
    var isSuccessful = false;

    if (typeof braintree === 'undefined' || amount <= 0) {
        kornCommerce.plugins.paypalExpress.fail();
    }
    else {
        //console.log('initBraintree');

        // show loading indicator
        kornCommerce.button.startLoading($('#btn-paypal-checkout'));

        // init braintree
        braintree.client.create({
            authorization: clientToken
        }, function (clientErr, clientInstance) {

            // Create PayPal component
            braintree.paypalCheckout.create({
                client: clientInstance
            }, function (paypalCheckoutErr, paypalCheckoutInstance) {
                //console.log('paypalCheckout created');

                if (typeof paypalCheckoutInstance === 'undefined' || paypalCheckoutErr) {
                    showError('An error occured');
                    return;
                }

                hideError();

                // init Paypal SDK
                paypalCheckoutInstance.loadPayPalSDK({
                    'client-id': clientId,
                    intent: 'authorize',
                    currency: 'EUR',
                    commit: false,
                    vault: false,
                }, function () {
                    //console.log('paypal.Buttons');

                    // example for a second button
                    //paypal.Buttons({
                    //    fundingSource: paypal.FUNDING.SEPA,
                    //    style: {
                    //        layout: 'vertical',
                    //        color: 'silver',
                    //        shape: 'rect',
                    //    },
                    //}).render('#PaypalButton');

                    // https://developer.paypal.com/docs/checkout/integration-features/standalone-buttons/
                    // https://developer.paypal.com/docs/checkout/#try-the-buttons
                    paypal.Buttons({
                        fundingSource: paypal.FUNDING.PAYPAL,
                        // https://developer.paypal.com/docs/checkout/integration-features/customize-button/
                        style: {
                            layout: 'vertical',
                            color: 'silver',
                            shape: 'rect',
                            label: 'checkout',
                            height: 46,
                            tagline: false
                        },

                        createOrder: function () {
                            // Button is clicked, overlay is loading
                            //console.log('createOrder');

                            // disable checkout buttons
                            $('#express-checkout-container button, #shopping-cart-index .form-checkout-index button').attr('disabled', 'disabled');

                            return paypalCheckoutInstance.createPayment({
                                // Include your PayPal options here. For available options, see
                                // http://braintree.github.io/braintree-web/current/PayPalCheckout.html#createPayment
                                flow: 'checkout',
                                intent: 'authorize',
                                amount: amount,
                                currency: 'EUR',
                                displayName: 'Musikhaus Korn',
                                locale: 'de_DE',
                                enableShippingAddress: true,
                                shippingAddressEditable: true,
                            });
                        },

                        onApprove: function (data, actions) {
                            //console.log('onApprove');

                            // hide the rendered button from Paypal, instead show our custom one
                            $('#PaypalButton').hide();
                            $('#btn-paypal-checkout').attr('disabled', 'disabled').show();

                            return paypalCheckoutInstance.tokenizePayment(data, function (err, payload) {
                                //console.log('tokenizePayment', payload);

                                // add productId to POST data if available
                                payload.productId = productId;

                                // Submit 'payload.nonce' to your server
                                var postData = JSON.stringify(payload);

                                // post to server
                                $.ajax({
                                    type: 'POST',
                                    cache: false,
                                    url: '/de/paypalexpress/startexpresspayment',
                                    data: postData,
                                    contentType: 'application/json; charset=utf-8',
                                })
                                .done(function (result) {
                                    //console.log('done', result);

                                    if (result.toString().indexOf('success:') === 0) {
                                        isSuccessful = true;
                                        window.location = result.toString().split('success:')[1];
                                    }
                                    else {
                                        showError(result.replace('error:', ''));
                                    }
                                })
                                .fail(function () {
                                    //console.log('fail');

                                    // stop loading indicator, but stay disabled
                                    kornCommerce.button.endLoading($('#btn-paypal-checkout'));
                                    $('#btn-paypal-checkout').attr('disabled', 'disabled');

                                    showError('An error occured');
                                })
                                .then(function () {
                                    //console.log('then');
                                });
                            });
                        },

                        onCancel: function (data) {
                            //console.log('PayPal payment cancelled', JSON.stringify(data, 0, 2));

                            // reenable checkout buttons
                            $('#express-checkout-container button, #shopping-cart-index .form-checkout-index button').removeAttr('disabled');
                        },

                        onError: function (err) {
                            //console.error('PayPal error', err);

                            // Handle tokenization errors or premature flow closure
                            switch (err.code) {
                                case 'PAYPAL_POPUP_CLOSED':
                                    // not an error
                                    break;
                                case 'PAYPAL_ACCOUNT_TOKENIZATION_FAILED':
                                    //console.log('PayPal tokenization failed. See details: ' + err.details);
                                    break;
                                case 'PAYPAL_FLOW_FAILED':
                                    //console.log('Unable to initialize PayPal flow. Are your options correct? ' + err.details);
                                    showError('Error');
                                    break;
                                default:
                                    break;
                            }

                            showError('Error');
                        }
                    })
                    .render('#PaypalButton')
                    .then(function () {
                        // The PayPal button will be rendered in an html element with the given ID.
                        // This function will be called when the PayPal button is set up and ready to be used.
                        //console.log('render');
                        $('#btn-paypal-checkout').hide();
                        $('#PaypalButton').show();
                    });
                });
            });
        });
    }
};

kornCommerce.plugins.paypalExpress.fail = function () {
    $('#btn-paypal-checkout').attr('disabled', 'disabled');
};;
function initDirectDebit(modalTitle, urlSepaDirectDebitMandate) {

    $('#sepa-direct-debit-mandate').on('click', function (e) {
        loadSepaDirectDebitMandate_Debit(modalTitle, urlSepaDirectDebitMandate);
        if (e.stopPropagation) {
            e.stopPropagation();
        }
        e.preventDefault();
    });
}

function loadSepaDirectDebitMandate_Debit(modalTitle, urlSepaDirectDebitMandate) {
    $.pgwModal({
        target: '#pgw-overlay',
        title: modalTitle,
        url: urlSepaDirectDebitMandate,
        maxWidth: 960,
        loadingContent: '<p class="ta-center"><i class="fa fa-spinner fa-pulse fa-2x"></i></p>',
        ajaxOptions: {
            success: function (data) {
                $.pgwModal({ pushContent: data });
                $.pgwModal({
                    pushContent: function () {
                        $('#pgw-close').on('click', function (e) {
                            $.pgwModal('close');
                        });

                        // check fields
                        var accountholder = $('#dd-accountholder').val().trim(),
                            iban = $('#dd-iban').val().trim(),
                            bic = $('#dd-bic').val().trim();

                        var showMandat = true;

                        showMandat &= accountholder.length > 0;
                        showMandat &= iban.length > 0;
                        showMandat &= bic.length > 0;

                        if (!showMandat) {
                            $('#completeMandate').hide();
                            $('#incompleteMandate').show();
                        }
                        else {
                            $('#completeMandate').find('span[data-dd-placeholder="accountholder"]').text(accountholder);
                            $('#completeMandate').find('span[data-dd-placeholder="iban"]').text(iban);
                            $('#completeMandate').find('span[data-dd-placeholder="bic"]').text(bic);
                        }
                    }
                });
            }
        }
    });
};
