ngshopglobals = {
    "rest": "/classes/plugins/ngpluginshop/rest/",
    "root": "/",
    "previewmode": false,
    "shippingaddress": false,
    "shopmode": "B2B",
    "lang": {
        "youhaveput": "Sie haben folgendes Produkt in Ihren Warenkorb gelegt",
        "keepshopping": "Weiter einkaufen",
        "tocart": "Zum Warenkorb",
        "tocheckout": "Zur Kasse",
        "ok": "OK",
        "error": "Ein Fehler ist aufgetreten",
        "quantitychanged": "Für das Produkt gelten Mindest- und/oder Höchstbestellmengen. Die Menge wurde entsprechend angepasst.",
        "product": "Produkt",
        "quantity": "Menge",
        "total": "Gesamtpreis",
        "grandtotal": "Gesamtsumme",
        "grandtotalnet": "Gesamtsumme (netto)",
        "delete": "Löschen",
        "cartempty": "Der Warenkorb ist leer",
        "vatb2c": "Enthaltene USt. ([u])",
        "vatb2b": "Zzgl. USt. ([u])",
        "productid": "Artikelnummer",
        "refreshcart": "Summen aktualisieren",
        "shiptobillingaddress": "An meine Rechnungsadresse liefern",
        "noshippingmethod": "Leider konnten wir keine passende Versandart für Sie finden. Dies kann am Lieferland, aber auch an den bestellten Produkten liegen.",
        "nopaymentmethod": "Leider konnten wir keine passende Zahlart für Sie finden. Dies kann am Lieferland, der ausgewählten Versandart oder dem Bestellwert liegen.",
        "mustcomply": "Bitte bestätigen Sie, dass Sie unsere Bestimmungen gelesen haben und ihnen zustimmen. Ohne diese Bestätigung ist ein Einkauf bei uns leider nicht möglich.",
        "subtotal": "Zwischensumme",
        "shippingduties": "Versandkosten",
        "paymentduties": "Kosten der Zahlmethode",
        "mustcomplytopricacy": "Bitte bestätigen Sie, dass wir Ihre persönlichen Daten gemäß unserer Datenschutzerklärung verarbeiten dürfen. Ohne diese Zustimmung ist ein Einkauf bei uns leider nicht möglich.",
        "discount": "Rabatt",
        "novat": "Als Kleinunternehmer wird keine USt. berechnet.",
        "probibitedforcountry": "Dieses Produkt ist nicht in Ihrem Land verfügbar.",
        "orderproblem": "Es gibt ein Problem mit Ihrer Bestellung",
        "orderproblemsolution": "Wir können Ihre Bestellung daher leider nicht bearbeiten. Bitte korrigieren Sie das angegebene Problem, um fortzufahren.",
        "orderproblembutton": "Problem korrigieren",
        "orderdate": "Bestellt am",
        "shipto": "Lieferung an",
        "yes": "Ja",
        "no": "Nein",
        "orderstate": "Auftragsstatus",
        "orderid": "Auftragsnummer",
        "containsdownloads": "Enthält folgende Downloads:",
        "expired": "abgelaufen",
        "trackingid": "Tracking-Id zur Sendungsverfolgung",
        "billid": "Rechnungsnummer"
    },
    "stdpages": {
        "cart": "/",
        "confirm": "/common/special/w7e0613140004001b8b4b0da69ee01ca",
        "customer": "/common/special/w7e06131400010013663e8b92509b7c9",
        "login": "/common/special/login.html",
        "payment": "/common/special/w7e06131400020035e1e1a1e0d04d4cb",
        "privacy": "/datenschutz/datenschutzerklaerung.html",
        "search": "/common/special/search.html",
        "shopaccount": "/einkaufen/konto/index.html",
        "shopcancellation": "/common/info/widerrufsrecht.html",
        "shopcart": "/einkaufen/einkaufen/index.html",
        "shopconfirm": "/einkaufen/kasse/bestaetigen.html",
        "shopcustomer": "/einkaufen/kasse/index.html",
        "shoppayment": "/einkaufen/kasse/zahlart.html",
        "shopshipping": "/einkaufen/kasse/versandart.html",
        "shopshippingaddress": "/einkaufen/kasse/lieferadresse.html",
        "shopshippinginfo": "/common/info/versand-zahlung.html",
        "shopterms": "/common/info/agb.html",
        "shopthanks": "/einkaufen/kasse/danke.html",
        "thanks": "/common/special/w7e06131400060000274e0c2cf90df90"
    },
    "availability": {
        "InStock": {
            "color": "8fb249",
            "caption": "Sofort ab Lager"
        },
        "Backordered": {
            "color": "b89c08",
            "caption": "Beim Lieferanten bestellt"
        },
        "OutOfStock": {
            "color": "c0504d",
            "caption": "Liefertermin unbekannt"
        }
    }
};

ngshophelper = {
    rest: function (params) {

        if (params === undefined) params = {};
        if (params.data === undefined) params.data = {};

        if (params.form !== undefined) {
            var allFields = params.form.find('input[type=submit], button');
            allFields.attr('disabled', 'disabled');
            allFields.css('cursor', 'progress');
        }

        if (params.showwait === true) $('html').addClass('sqrshopwait');

        var keepdisabled = false,
            failsilent = false;

        if (params.keepdisabled == true) keepdisabled = true;
        if (params.failsilent == true) failsilent = true;

        $('html').css('cursor', 'progress');

        params.data.previewmode = ngshopglobals.previewmode;

        var url;

        if (params.path !== undefined) url = ngshopglobals.rest + params.path + '/';
        if (params.url !== undefined) url = ngshopglobals.root + params.url;

        $.ajax({
            url: url,
            data: params.data,
            datatype: 'json',
            type: 'POST',
            success: function (result) {
                if (allFields !== undefined && (!keepdisabled || result.state !== 'ok')) {
                    allFields.removeAttr('disabled');
                    allFields.css('cursor', '');
                }

                if (params.hidewait === true || result.state !== 'ok') $('html').removeClass('sqrshopwait');

                $('html').css('cursor', '');
                if (result.state == 'error') {
                    if (params.error !== undefined) params.error(result);
                } else if (result.state == 'exception') {
                    if (!failsilent) {
                        $().ngPopup({
                            message: ngshophelper.format('<p><b>{0}:</b></p><p>{1}</p><p>{2}</p>', ngshopglobals.lang.error, result.code, result.message),
                            trace: result.trace,
                            icon: true,
                            accept: ngshopglobals.lang.ok
                        });
                    }
                } else if (result.state == 'ok') {
                    if (params.success !== undefined) params.success(result);
                } else {
                    $().ngPopup({
                        message: ngshophelper.format('<p><b>{0}:</b></p><p>{1}</p>', ngshopglobals.lang.error, result),
                        accept: ngshopglobals.lang.ok
                    });
                }
            },
            error: function (x, t, s) {
                if (allFields !== undefined) {
                    allFields.removeAttr('disabled');
                    allFields.css('cursor', '');
                }
                $('html').css('cursor', '');
                $('html').removeClass('sqrshopwait');

                if (!failsilent) {
                    $().ngPopup({
                        message: ngshophelper.format('<p><b>{0}:</b></p><p>{1}</p>', ngshopglobals.lang.error, s.toString()),
                        accept: ngshopglobals.lang.ok
                    });
                }
            }
        });

    },

    put: function (uid, variantdescription, quantity, form, configuid, productconfig) {

        var data = {
            'uid': uid,
            'quantity': quantity,
            'variantdescription': variantdescription
        };

        if (configuid !== undefined) {
            data['configuid'] = configuid;

            if (productconfig !== undefined) {

                for (var key in productconfig) {
                    data['ngpc-' + key] = productconfig[key];
                }
            }
        }

        this.rest({
            path: 'put',
            form: form,
            data: data,
            error: function (result) {
                $().ngPopup({
                    message: result.message,
                    icon: true,
                    accept: ngshopglobals.lang.ok
                });
            },
            success: function (result) {

                var message = ngshophelper.format('<p>{0}:</p><p><b>{1}</b>{2}</p><p>{3}</p>',
                    ngshopglobals.lang.youhaveput,
                    result.data.caption,
                    (result.data.quantity !== undefined) ? ' (' + result.data.quantity + ')' : '',
                    result.data.singleprice);

                if (result.data.quantitychanged) {
                    message += ngshophelper.format('<p><i>{0}</i></p>', ngshopglobals.lang.quantitychanged)
                }

                var buttons = [];

                if (ngshopglobals.stdpages.shopcart !== undefined) buttons.push({
                    caption: ngshopglobals.lang.tocart,
                    url: ngshopglobals.stdpages.shopcart
                });
                if (ngshopglobals.stdpages.shopcustomer !== undefined) buttons.push({
                    caption: ngshopglobals.lang.tocheckout,
                    url: ngshopglobals.stdpages.shopcustomer
                });

                $().ngPopup({
                    message: message,
                    picture: result.data.picture,
                    accept: ngshopglobals.lang.keepshopping,
                    buttons: buttons
                });

                $().ngShopUpdateCart();
            }
        });
    },

    format: function (format) {
        var args = Array.prototype.slice.call(arguments, 1);

        return format.replace(/{(\d+)}/g, function (match, number) {
            return typeof args[number] != 'undefined' ? ngshophelper.escapehtml(args[number]) : match;
        });
    },

    escapehtml: function (unsafe) {
        return unsafe.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
    }
};

(function ($) {

    $.fn.ngShopPutForm = function () {
        $(this).each(function () {
            var form = $(this).eq(0),
                uid = form.children('[name=uid]'),
                variantDescription = form.children('[name=variantdescription]'),
                fieldQuantity = form.children('[name=quantity]'),
                configcontainer = form.find('.ngshopputconfig'),
                configuid = configcontainer.attr('data-ngpc-uid'),
                confignodes = configcontainer.find('[data-ngpc-id]'),
                quantity = 1,
                variantdescriptionval = '';


            form.on('submit', function (e) {
                e.preventDefault();

                if (configuid !== undefined && confignodes.length > 0) {
                    var i,
                        config = [];

                    for (i = 0; i < confignodes.length; i++) {
                        var confignode = confignodes.eq(i),
                            id = confignode.attr('data-ngpc-id');

                        if (confignode.is('input')) {
                            if ((confignode.attr('type') === 'text' || confignode.attr('type') === 'number') && confignode.val() !== '') config[id] = confignode.val();
                            if ((confignode.attr('type') === 'radio' || confignode.attr('type') === 'checkbox') && confignode.prop('checked')) config[id] = confignode.attr('value');
                        }
                        if (confignode.is('textarea') && confignode.val() !== '') config[id] = confignode.val();
                        if (confignode.is('option') && confignode.prop('selected') && confignode.attr('value') !== '') config[id] = confignode.attr('value');
                    }
                }

                if (variantDescription.val() !== undefined) variantdescriptionval = variantdescriptionval = variantDescription.val();

                if (parseInt(fieldQuantity.val()) > 0) quantity = parseInt(fieldQuantity.val());

                ngshophelper.put(uid.val(), variantdescriptionval, quantity, form, configuid, config);
            });

        });
    };

    $.fn.ngShopUpdateCart = function () {
        var indicator = $('.ngshopcartindicator'),
            simpleindicator = $('.ngshopcartindicatorsimple');

        ngshophelper.rest({
            path: 'cartsummary',
            failsilent: true,
            success: function (result) {
                if (result.data.quantity == 0) {
                    indicator.removeClass('ngshopcartindicatoractive');
                    simpleindicator.removeClass('ngshopcartindicatorsimpleactive');
                } else {
                    indicator.addClass('ngshopcartindicatoractive');
                    simpleindicator.addClass('ngshopcartindicatorsimpleactive');
                    if (result.data.quantity > 9) {
                        indicator.text('9+');
                    } else {
                        indicator.text(result.data.quantity);
                    }
                }
            }
        });
    };

    $.fn.ngShopStock = function () {
        var fields = $(this), i, uids = [];

        if (fields.length > 0) {

            for (i = 0; i < fields.length; i++) {
                uids.push(fields.eq(i).attr('data-sqpstock'));
            }

            ngshophelper.rest({
                path: 'updateavailability',
                data: {'uids': uids.join(',')},
                success: function (result) {

                    var i;

                    for (i = 0; i < fields.length; i++) {
                        var field = fields.eq(i),
                            uid = field.attr('data-sqpstock'),
                            stock = result.data[uid];

                        if (stock !== undefined) {
                            field.text(ngshopglobals.availability[stock].caption);
                            field.css('color', '#' + ngshopglobals.availability[stock].color);
                        }
                    }
                }
            });
        }
    }


}(jQuery));

$(document).ready(function () {
    $('.ngshopputform').ngShopPutForm();
    $('[data-sqpstock]').ngShopStock();
    $().ngShopUpdateCart();
});

