var cartEntryMap = {};


function showErrorMessage(message) {
    var $errorBox = $('.error-box');
    $errorBox.html('<span>' + message + '</span>');
}

function hideErrorMessage() {
    var $errorBox = $('.error-box');
    $errorBox.html('');
}

function showFlashErrorMessage(message) {
    var $messageContainer = $('#messageContainer');
    $messageContainer.html('<div id="message" class="error-message">' + message + '</div>');
}

function addedProductToCart(productCode, quantity, result) {
//	$('#cartQuantity').html(result.cart.quantity);
//	$('#cartTotalPrice').html(result.cart.totalPrice);
    window.location = cartUrl;
}

function addingProductToCartFailed(productCode, quantity, xhr, error) {
//    alert(xhr + error);
}

function updateRow($row, entry) {
    $row.find('.entryQuantity').val(entry.quantity);
    $row.find('.minOrderQuantity').val(entry.quantity);
    $row.find('.basePrice').html(entry.formattedBasePrice);
    $row.find('.discount').html(entry.formattedDiscount);
    $row.find('.totalPrice').html(entry.formattedTotalPrice);


    $.each(entry.promotions, function (index, promotionData) {
        var color;
        if (promotionData.applied) {
            color = "color:green";
        }
        else {
            color = "color:red";
        }
        $("<tr class='color product-promotions' style='" + color + "'>" +
            " <td class='cel1'><!-- comment --></td>" +
            " <td class='cel2'>" + promotionData.generatedMessage + "</td>" +
            " <td class='cel3'><!-- comment --></td>" +
            "  <td class='cel4'><!-- comment --></td>" +
            "  <td class='cel5'><!-- comment --></td>" +
            "  <td class='cel6'><!-- comment --></td>" +
            "  <td class='cel7 totalPrice'><!-- comment --></td>" +
            "  <td class='cel8'><!-- comment --></td>" +
            "  <td class='cel9'><!-- comment --></td></tr>").insertAfter($row);


    });

    if (entry.inStock) {
        $row.find('.stock .green').show();
        $row.find('.stock .red').hide();
    } else {
        $row.find('.stock .green').hide();
        $row.find('.stock .red').show();
    }
}


function updateCart(result, productCode) {
    if (result.status == 'success') {
        //hide if the cart is empty
        if (result.cart.quantity == 0) {
            $('.displayCart').hide();
            $('.emptyCart').show();
        }

        $('.product-promotions').remove();
        $.each(result.cart.entries, function (index, entry) {
            var $row = cartEntryMap[entry.product.code];
            updateRow($row, entry);
        });
        var $tableTotal = $('.table-total');
        $tableTotal.find('.subtotalPrice').html(result.cart.formattedSubtotalPrice);
        $tableTotal.find('.orderDiscount').html(result.cart.formattedDiscount);
        $tableTotal.find('.bruttoPrice').html(result.cart.formattedBruttoPrice);
        $tableTotal.find('.nettoPrice').html(result.cart.formattedNettoPrice);

        var $promotionBlock = $('.order-promotions');

        $promotionBlock.html("");
        $.each(result.cart.promotions, function (index, promotionData) {
            if (promotionData.applied) {
                $promotionBlock.html("<div style='color: green'> " + promotionData.generatedMessage + "</div>");
            }
            else {
                $promotionBlock.html("<div style='color: red'> " + promotionData.generatedMessage + "</div>");
            }
        });


        //update the mini cart
        var $cartQuantity = $('#cartQuantity');
        $cartQuantity.html(result.cart.countEntries);
        var $totalPrice = $('#cartTotalPrice');
        $totalPrice.html(result.cart.formattedBruttoPrice);
        hideErrorMessage();
        if (result.cartHasErrors) {
            $('.cartForm > .submit').hide();
            showErrorMessage(result.errorMessage);
        } else {
            $('.cartForm > .submit').show();
        }
    } else {
        resetMinOrderQuantity(productCode);
        showErrorMessage(result.errorMessage);
    }
}

function resetMinOrderQuantity(productCode) {
    var $row = cartEntryMap[productCode];
    var $minOrderQuantityField = $row.find('.minOrderQuantity');
    var $quantityField = $row.find('.entryQuantity');
    $quantityField.val($minOrderQuantityField.val());
}

function removeEntry(productCode) {
    var $row = cartEntryMap[productCode];
    $row.prev('.line').remove();
    $row.remove();
    $.ajax({ url:removeEntryUrl,
        dataType:'json',
        type:'POST',
        data:{    productCode:productCode},
        success:function (result) {
            if (result.status == 'success') {
                updateCart(result, productCode);
            }
        },
        error:function (xhr, error) {
//            alert(errorUpdatingCart);
        }
    });
}

function changeQuantity(productCode, quantity) {
    $.ajax({ url:changeQuantityUrl,
        dataType:'json',
        type:'POST',
        data:{    productCode:productCode,
            quantity:quantity },
        success:function (result) {
            updateCart(result, productCode);
        },
        error:function (xhr, error) {
            resetMinOrderQuantity(productCode);
        }
    });
}

function addToCart(productCode, quantity) {
    $.ajax({
        url:addToCartUrl,
        dataType:'json',
        type:'POST',
        data:{
            productCode:productCode,
            quantity:quantity
        },
        beforeSend:function () {
            $(".addedToCart-popup").bPopup({follow:[false, false], position:['auto', 'auto']});
        },
        complete:function () {
            window.location = window.location.href;
        },
        success:function (result) {
            if (result.status == 'success') {

            }
        }
    });
}

function addSelectedProductsToCart(products) {
    $.ajax({
        url:addSelectedProductsToCartUrl,
        dataType:'json',
        type:'POST',
        data:{
            products:products
        },
        beforeSend:function () {
            $(".addedToCart-popup").bPopup({follow:[false, false], position:['auto', 'auto']});
        },
        complete:function () {
            window.location = window.location.href;
        },
        success:function (result) {
        }
    });
}

function buildCartEntryMap() {
    var $cart = $('.cartTable');
    var $entries = $cart.find('.cartEntryRow');
    $entries.each(function (index) {
        var $entry = $(this);
        var productCode = $entry.find('.productCode').val();
        cartEntryMap[productCode] = $entry;
    });
}

function removeAddress($addressRow) {
    var addressKey = $addressRow.find('.address').val();
    $.ajax({ url:removeAddressUrl,
        dataType:'json',
        type:'POST',
        data:{    address:addressKey },
        success:function (result) {
            if (result.status == 'error') {
                alert(result.errorMessage);
            }
        }
    });
    $addressRow.remove();
}

function checkForPositiveNumber($field) {
    var value = $field.val();
    var expression = /^[\d]+$/;
    return expression.test(value);
}

function clearContactForm() {
    $('#contact-popup').find('input:not([type=hidden])').each(function () {
        var $input = $(this);
        var $defaultValue = $('#contact-popup').find('input[type=hidden]').filter(function (index) {
            var $default = $(this);
            return $default.attr('class').toLowerCase().match(new RegExp("default" + $input.attr("name").toLowerCase(), "i"));
        });
        if ($defaultValue.length > 0) {
            $(this).val($defaultValue.val());
        } else {
            $(this).val("");
        }
    });
    $('#contact-popup').find('.error span').each(function () {
        $(this).empty();
    });
    $('#contact-popup').find('textarea').each(function () {
        $(this).empty();
    });
    $("#contact-popup .error").remove();
    $("#contact-popup .hasError").removeClass("hasError");
}

function closeContactForm() {
    $("#contact-popup").bPopup().close();
    clearContactForm();
}

function clearReviewForm() {
    $('.addReview-popup').find('.error span').each(function () {
        $(this).empty();
    });
    $('.addReview-popup').find('textarea').each(function () {
        $(this).empty();
    });
    $(".addReview-popup .error").remove();
    $(".addReview-popup .hasError").removeClass("hasError");
}

function closeReviewForm() {
    $(".addReview-popup").bPopup().close();
    clearReviewForm();
}

function showError($row, message) {
    $row.find('.quickOrderProcess').val(false);
    $row.find('.error').html(message);
    $row.find('.error').show();
}

function hideError($row) {
    $row.find('.quickOrderProcess').val(true);
    $row.find('.error').hide();
}

function checkMinOrderQuantity($row) {
    if ($row.find('.productName').is(":visible")) {
        var minOrderQuanity = $row.find('.minOrderQuantity').val();
        var quantity = $row.find('.quickQuantity').val();
        if (!checkForPositiveNumber($row.find('.quickQuantity')) || quantity % minOrderQuanity != 0) {
            $row.find('.productName').hide();
            showError($row, wrongQuantity.replace('{0}', minOrderQuanity));
        } else {
            hideError($row);
        }
    }
    getProductInformation($row);
}

function getProductInformation($row) {
    var $productCode = $row.find('.quickProductCode');
    if ($productCode.val()) {
        //there is a value in this field see if it is a correct product code
        $.ajax({
            url:lookupProductUrl,
            dataType:'json',
            type:'POST',
            data:{    productCode:$productCode.val() },

            success:function (result) {
                if (result.status == 'success') {
                    $row.find('.minOrderQuantity').val(result.minOrderQuantity);
                    $row.find('.productName').html(result.productName);
                    $row.find('.productName').show();
                    hideError($row);
                    checkMinOrderQuantity($row);
                } else if (result.status == 'error') {
                    $row.find('.productName').hide();
                    showError($row, result.errorMessage);
                }
            }
        });
    } else {
        $row.find('.quickOrderProcess').val(false);
        //if there are anny messages hide them
        $row.find('.productName').hide();
        $row.find('.error').hide();
    }
}

function createRecaptcha() {
    var RecaptchaOptions = {
        theme:'clean'
    };
    Recaptcha.create('6Lc0UsUSAAAAAIfyGvjSjoEVRkCtx5TUmoxZUyWf', 'recaptcha_div', RecaptchaOptions);
}

function addToWishlist(productCode) {
    $.ajax({
        url:addToWishlistUrl,
        dataType:'json',
        type:'POST',
        data:{productCode:productCode },
        success:function (result) {
            if (result.status == 'success') {
                $(".addedToWishList-popup").bPopup({follow:[false, false], position:['auto', 'auto']});
            }
            else if (result.errorMessage == 'double_entry') {
                $(".addedToWishList-popup").bPopup({follow:[false, false], position:['auto', 'auto']});
            }

        },
        error:function (xhr, error) {

        }
    });
}

function limitTextLength(field, maxLength) {
    if (field.value.length > maxLength) {
        field.value = field.value.length.substring(0, maxLength);
    }
}

function removeFromWishlist(productCode) {
    $.ajax({
        url:removeFromWishlistUrl,
        dataType:'json',
        type:'POST',
        data:{productCode:productCode },
        success:function (result) {
            if (result.status == 'success') {
                //Want to show a message?
            }
        },
        error:function (xhr, error) {

        }
    });
}

function validateEmail(email) {
    return emailPattern.test(email);
}

function validateToField() {
    var recipients = $(".mail-popup .to").val().split("[;,]");
    for (var i in recipients) {
        if (!validateEmail(recipients[i])) {
            //TODO: show error message
            return false;
        }
    }
    //TODO: hide error message
    return true;
}

function validateFromField() {
    var valid = validateEmail($(".mail-popup .from").val());
    if (valid) {
        //TODO: hide error message
    } else {
        //TODO: show error message
    }
    return valid;
}

function sendMail() {
    var valid = true;
    valid = valid && validateToField();
    valid = valid && validateFromField();
    limitTextLength($(".mail-popup .message")[0], 255);
    if (!valid) {
        return false;
    }
    var from = $('.mail-popup .from').val();
    var to = $('.mail-popup .to').val();
    var message = $('.mail-popup .message').val();
    $.ajax({
        url:sendMailUrl,
        dataType:'json',
        type:'POST',
        data:{
            from:from,
            to:to,
            message:message
        },
        success:function (result) {
            if (result.status == 'success') {
                //TODO: show confirmation message a
            } else {
                //TODO: show error in popup
            }
        },
        error:function (xhr, status, error) {
            //TODO: show erro in popup
        }
    });
    return false;
}

function ProductData(productCode, quantity) {
    this.productCode = productCode;
    this.quantity = quantity;
}

$(document).ready(function () {
    //$('.ajax-loader').hide();

    buildCartEntryMap();

    //TODO: has to be a better way to do this:
    // add cssClass to footer contact link
    // as the contact popup will only work when a link contains the 'contact' class
    $("#footer").find('a[href="/contact.html"]').addClass('contact');

    $(".language-form").change(function () {
        var $location = window.location.pathname;
        if ($location.indexOf("?") == -1) {
            window.location = $location + "?locale=" + this.value;
        } else {
            window.location = $location + "&locale=" + this.value;
        }
    });

    //register add to cart button
    $('.addProduct').click(function () {
        var $productBlock = $(this).parents('.productBlock');
        var $productCode = $productBlock.find('.productCode');
        var productCode = $productCode.val();
        var $quantity = $productBlock.find('.quantity');
        var $minOrderQuantity = $productBlock.find('.minOrderQuantity');
        var quantity = $quantity.val();
        var minOrderQuantity = $minOrderQuantity.html();
        if (!minOrderQuantity) {
            minOrderQuantity = $minOrderQuantity.val();
        }

        // only multiplications of the minOrderQuantity can be ordered
        // (ex. minOrderQuantity 10 --> 10, 20, 30,...)
        var correctAmount = parseInt(quantity) % parseInt(minOrderQuantity);

        if (parseInt(quantity) < parseInt(minOrderQuantity) || correctAmount != 0) {
            $productBlock.find('.quantityError').show();
            return false;
        }
        addToCart(productCode, quantity);
        return false;
    });

    $('.addAllToCartFromWishlist').click(function () {

        var $productRows = $(".wishlistEntryRow");
        //var products = new Array();

        var products = '';
        var hasErrors = false;

        $.each($productRows, function (index, row) {
            if ($(row).find(".wishlist-checked").attr("checked")) {
                var $productBlock = $(row).find('.productBlock');
                var $productCode = $productBlock.find('.productCode');
                var productCode = $productCode.val();
                var $quantity = $productBlock.find('.quantity');
                var $minOrderQuantity = $productBlock.find('.minOrderQuantity');
                var quantity = $quantity.val();
                var minOrderQuantity = $minOrderQuantity.html();

                // only multiplications of the minOrderQuantity can be ordered
                // (ex. minOrderQuantity 10 --> 10, 20, 30,...)
                var correctAmount = parseInt(quantity) % parseInt(minOrderQuantity);

                if (parseInt(quantity) < parseInt(minOrderQuantity) || correctAmount != 0) {
                    $productBlock.find('.quantityError').show();
                    hasErrors = true;
                }
                //var product = new ProductData(productCode, quantity);
                products += productCode;
                products += ',';
                products += quantity;
                products += ';';
            }
        });

        if (!hasErrors && products) {
            addSelectedProductsToCart(products);
        }
        return false;
    });

    //register add to wishlist button
    $('.addToWishlist').click(function () {
        var $productBlock = $(this).parents('.productBlock');
        var $productCode = $productBlock.find('.productCode');
        var productCode = $productCode.val();


        addToWishlist(productCode);
        return false;
    });


    //the quantity changes in the cartPage
    $('.entryQuantity').blur(function () {
        var valid = checkForPositiveNumber($(this));
        var $entryRow = $(this).parents('.cartEntryRow');
        var productCode = $entryRow.find('.productCode').val();
        if (valid) {
            var quantity = this.value;
            changeQuantity(productCode, quantity);
        } else {
            resetMinOrderQuantity(productCode);
            showErrorMessage(notAValidQuantity);
        }
    });

    $('.entryQuantity').keypress(function (e) {
        var keyCode = (e.keyCode ? e.keyCode : e.which);
        if (keyCode == 13) {
            $(this).blur();
        }
    });

    $('.referenceText').blur(function () {
        $.ajax({
            url:saveReferenceTextUrl,
            dataType:'json',
            type:'POST',
            data:{    referenceText:this.value },
            success:function (result) {
            }, error:function (var1, var2) {

            }
        });
    });

    $('.referenceText').keypress(function (e) {

        var keyCode = (e.keyCode ? e.keyCode : e.which);
        if (keyCode == 13) {
            $(this).blur();
        }
    });

    //remove entry from cart
    $('.entryRemove').click(function () {
        var $entryRow = $(this).parents('.cartEntryRow');
        var productCode = $entryRow.find('.productCode').val();
        removeEntry(productCode);
        return false;
    });

    //remove entry from wishlist
    $('.wishlistRemove').click(function () {
        var $entryRow = $(this).parents('.wishlistEntryRow');
        var productCode = $entryRow.attr("id");
        removeFromWishlist(productCode);
        $entryRow.remove();
        return false;
    });

    $('.removeAllFromWishList').click(function () {

        var $productRows = $(".wishlistEntryRow");

        $.each($productRows, function (index, row) {
            if ($(row).find(".wishlist-checked").attr("checked")) {
                $(row).find(".wishlistRemove").click();
            }
        });


        return false;
    });

    //remove address
    $('.removeAddress').click(function () {
        var $addressRow = $(this).parents('.addressRow');
        removeAddress($addressRow);
        return false;
    });

    $('.quickOrderForm .quickProductCode').blur(function () {
        var $this = $(this);
        var $row = $this.parents('.quickOrderForm > ul > div > li > div');
        getProductInformation($row);
    });

    $('.quickOrderForm .quickQuantity').blur(function () {
        var $this = $(this);
        var $row = $this.parents('.quickOrderForm > ul > div > li > div');
        checkMinOrderQuantity($row);
    });
    // Used on the Product detailpage when clicking on the detail image 
    // (opens a dimmedlayer with the large image)
    $('.frame').click(function () {
        var index = $('.gallery-wrap').find('a.active').attr('id');
        index -= 1;
        $('#popup').find('img').each(function (i) {
            $(this).attr('style', 'display: none');
            if (index == i) {
                $(this).attr('style', 'display: block');
            }
        });

        $("#popup").bPopup({follow:[false, false], position:['auto', 'auto']});
        return false;
    });

    // Add event to the 'X' button to close the popup (image zoom)
    $('#popup .close-popup').click(function () {
        $("#popup").bPopup().close();
    });

    $(".quickOrderForm").submit(function () {
        //TODO do quantity checks and if an item is in stock
        var $this = $(this);
        var errors = false;
        var $productBlocks = $this.find('.productBlock');
        $productBlocks.each(function () {
            var $this = $(this);
            var $process = $this.find('.process');
            if ($process.length > 0 && $process.val()) {
                var $amount = $this.find('.amount');
                var error = !checkForPositiveNumber($amount);
                if (error) {
                    //show error message
                    errors = errors || error;
                }
            }
        });
        //my account quickOrderForm
        if ($this.find('.quickOrderProcess[value="true"]').length == 0 && $this.find('.process:checked').length == 0) {
            showFlashErrorMessage(noProductsAdded);
            return false;
        }
        if (errors) {
            showFlashErrorMessage(couldNotSendQuickOrderForm);
        }
        $(".addedToCart-popup").bPopup({follow:[false, false], position:['auto', 'auto']});

        return !errors;
    });


    //check quick order form

    // Open the dimmedlayer with the contact form
    $('.contact').click(function () {
        clearContactForm();
        $("#contact-popup").bPopup({follow:[false, false], position:['auto', 'auto']});
        return false;
    });

    $('.addReview').click(function () {
        $(".addReview-popup").bPopup({follow:[false, false], position:['auto', 'auto']});
        return false;
    });

    // Ajax call when submitting the contact form in the dimmedlayer
    $('#send-contact').click(function () {
        $(".captchaResponse").val(Recaptcha.get_response());
        $(".captchaChallenge").val(Recaptcha.get_challenge());
        $.ajax({
            url:contactAjaxUrl + '?' + $('#contact-popup #contact-form').serialize(),
            dataType:'html',
            type:'POST',
            success:function (html) {
                var status = html.indexOf('success');
                var message = html.substr(html.indexOf('<br/>') + 5);
                if (status > 0) {
                    $("#messageContainer").html(message);
                    closeContactForm();
                } else {
                    $("#contact-popup #contact-form").remove();
                    $("#send-contact").before(html);
                    createRecaptcha();
                }
            }
        });
    });

    // Add event to the 'X' button to close the popup
    $('#contact-popup .close-popup').click(function () {
        closeContactForm();
    });

    if (window.reviewPopupOnLoad != undefined) {
        reviewPopupOnLoad();
    }

    $('.addReview-popup .close-popup').click(function () {
        closeReviewForm();
    });

    $('.email').click(function () {
        $(".mail-popup").bPopup({follow:[false, false], position:['auto', 'auto']});
        return false;
    });

    $('.mail-popup .close-popup').click(function () {
        $(".mail-popup").bPopup().close();
    });

    $('.addedToWishList-popup .close-popup').click(function () {
        $(".addedToWishList-popup").bPopup().close();
    });

    $('.deliveryAndPaymentForm').submit(function () {
        var $termsAndConditions = $('input.termsAndConditions');
        if ($termsAndConditions.is(':checked')) {
            return true;
        } else {
            $(this).find('.error').show();
            return false;
        }
    });
    $('.deliveryAndPaymentForm').find('input.termsAndConditions').click(function () {
        if ($(this).is(':checked')) {
            $('.deliveryAndPaymentForm').find('.error').hide();
        }
    });

    $(".contact").click(function () {
        createRecaptcha();
    });
    $(function () {
        $(".datepicker").datepicker({ dateFormat:'dd/mm/yy' });
    });
    $(".mail-popup .send").click(function () {
        sendMail();
    });

    $(".mail-popup .message").keypress(function () {
        limitTextLength(this, 255);
    });

    $(".addReview-popup").find(".rating_bar").mousemove(function (e) {
        var percent = (e.pageX - this.offsetLeft - $(".addReview-popup").position().left) * 100 / this.clientWidth;
        if (percent < 20) {
            percent = 20;
        } else if (percent < 40) {
            percent = 40;
        } else if (percent < 60) {
            percent = 60;
        } else if (percent < 80) {
            percent = 80;
        } else {
            percent = 100;
        }
        $(".stars_percentage").attr("style", "width:" + percent + "%");
    });

    $(".addReview-popup").find(".rating_bar").mouseleave(function (e) {
        $(".stars_percentage").attr("style", "width:" + $("#rating").attr("value") + "%");
    });
    $(".addReview-popup").find(".rating_bar").click(function (e) {
        var percent = (e.pageX - this.offsetLeft - $(".addReview-popup").position().left) * 100 / this.clientWidth;
        if (percent < 20) {
            percent = 20;
        } else if (percent < 40) {
            percent = 40;
        } else if (percent < 60) {
            percent = 60;
        } else if (percent < 80) {
            percent = 80;
        } else {
            percent = 100;
        }
        $(".stars_percentage").attr("style", "width:" + percent + "%");
        $("#rating").attr("value", percent);
    });

});

