﻿var _cartClientID = "";
var _basketInUse = "";
var _basketEmpty = "";
var _cartLabelID = "";
var _decimal = getDecimalCharacter();
var _adjustPrice = 0;
var _adjustDiscount = 0;
var currChar = "$";
var _isWholeCartDiscountedByPercent = false;
var _wholeCartDiscountPercent = 0;  //this is used when special item is present in the cart. 
                                    //price of the item means percentual discount to be applied
                                    //to the cart total.

var _cartMoneyTotal = 0;
var _cartItemsCountTotal = 0;
var _cartTotalDiscountMoney = 0; //this is discount from _wholeCartDiscountPercent expressed in money based on _cartMoneyTotal
var rowIteration = 1;
var directOrderArticleNumber = '';
var _cartBonusLimitsArray;  //two dimensional arrray with one limit definition per row. limit def = ["Bonus limit text with %%LimitValue%% string", "limit value"]
                            //this array is used for ribbon limit message
                            

/* Used for color choosing logic on product detail page (might be as well used in products grid page)  */
var YOU_NEED_TO_CHOOSE_COLOR_TEXT;
var YOU_NEED_TO_CHOOSE_SIZE_TEXT;
var _articleNumberTextLabel; //used as text label for ArticleId display at product detail page. Ex.: "Article Number: 99721" <- the text "Article Number: " goes here
var _doNotShowToolTipAddedToCart; //used to stop tooltip box "Item added to Cart" from appearing when there is no color/size chosen
/* ------------------------------------------ */




                  

var mrowId = 2;
var m_currentRowId = 0;
var mitems = new Array();
var mrowBg = 0;
var mEnterArticleNo = 'Skriv artikelnummer';
var mShippingCost = 0;
var mShippingCostLimit = 0;
var mShippingCostLimitRemainsString = 'Nakupte ještě za %%ShippingLimit%% a získáte dopravu zdarma!.'
var mShippingCostLimitAchievedString = 'Získali jste dopravu zdarma!.'
var mFavoredShippingCost = 0;
var mFavoredShippingCostLimit = 0;
var mPremiumShippingFreeProduct = 0;
var mProcessLimit = 0;
var mProcessError = "";
var basketTotalSum = 0;
var mDeleteTip = "";
var mDeleteYesNo = "";
var mBoosterLimit = 0;
var mBoosterLimit2 = 0;
var mBoosterValue = 0;
var mLockUpdate = false;
var discountType = "";
var discAmount = 0;
var discCode = "";
var theTotalDiscountAmount = 0;
var ladderDiscount = '';
var ladderDiscountText = '';
var ovbCheckbox = "";
var ovbCheckbox2 = "";
var lblLadderRebate = "";
var mFlexibleOVBLimitPrice = 0;
var mFlexibleOVBDiscountedPrice = 0;
var mFlexibleOVBTextboxID = "";
var mFlexibleOVBPriceLabel = "";
var mFlexibleOVBDiscountedPriceLabel = "";
var mFlexibleOVBFinalPriceLabel = "";
var mFlexibleOVBDescriptionLabel = "";
var mFlexibleOVBArticleCodeTextSC = "";
var mFlexibleOVBLimitPriceMessageSC = "";
var mFlexibleOVBLimitTextSC = "";



function addColorToCart(colorCombo, colorArticle, article, dPrice, nPrice, description, family, count) {
    if (validateColor(colorCombo) == true) {
        var gridItemColorName = Url.encode(colorCombo.GetText());
        var carticle = getSelectedColorArticle(colorArticle, colorCombo.SelectedIndex);
        //addToCart(carticle, dPrice, nPrice, description + " " + colorCombo.GetText(), family, count)
        addToCart(carticle, dPrice, nPrice, description + " " + gridItemColorName, family, count);
    }
    else {
        alert(mColorError);
    }
    checkBonusProducts();
    return false;
}

function addColorToCartFromGrid(colorChooser, isChoiceSize) {

    var selectedColor = colorChooser.SelectedItem;

    if (selectedColor != null) {
        addToCart(
            selectedColor.Attributes["ArticleID"],
            selectedColor.Attributes["discountedPrice"],
            selectedColor.Attributes["regularPrice"],
            Url.encode(selectedColor.Attributes["description"] + " - " + selectedColor.Attributes["ColorNameForHumans"]),
            selectedColor.Attributes["productFamily"],
            1);
    }
    else {

        _doNotShowToolTipAddedToCart = true;
    
        if (!isChoiceSize) {
            alert(YOU_NEED_TO_CHOOSE_COLOR_TEXT);
        }
        else {
            alert(YOU_NEED_TO_CHOOSE_SIZE_TEXT);
        }
    }

    checkBonusProducts();
}




//completely rewritten function for Redesign 2011.
//for use only at product detail page - not in category view (grid)
//for product category view, there is addColorToCartFromGrid(), which handles color choosing
function addToCartProduct(article, discountedPrice, regularPrice, description, family, count, isChoiceSize, sufix) {

    //first we check if article has color variations and therefore it's needed to choose a color
    //article == '' means color/size choice is required
    if (article != null && article != '') {

        //product doesn't have color variations or the color has been already selected (by selectColor function), 
        //so we add it to the cart without any special care
        addToCart(article, discountedPrice, regularPrice, description, family, count);

    }
    else {
        //the product has color variations and color has not yet been chosen

        //we need to let the customer know that he/she needs to choose color
        var alertText;
        if (isChoiceSize) {
            alertText = YOU_NEED_TO_CHOOSE_SIZE_TEXT;
        }
        else {
            alertText = YOU_NEED_TO_CHOOSE_COLOR_TEXT;
        }

        //var productColorChooser = getElementBySubstringId("ProductColorsChooser" + sufix);
        //tooltipRed($(productColorChooser), null, alertText); //YOU_NEED_TO_CHOOSE_COLOR_TEXT is set from codebehind in FdS_ProductDetail

        tooltipRed("ProductColorsChooser" + sufix, null, alertText); //YOU_NEED_TO_CHOOSE_COLOR_TEXT is set from codebehind in FdS_ProductDetail

        _doNotShowToolTipAddedToCart = true;
    }

    checkBonusProducts();
    return false;
}

function selectColor(article, colorNameForHumans, colorHex, colorUrl, regularPrice, discountedPrice) {
    selectColor(article, colorNameForHumans, colorHex, colorUrl, regularPrice, discountedPrice, '', '', '')
}

//completely rewritten function for Redesign 2011. old function used to be in product.js
//usage is intended for product detail page (not for product category)
//had to add sufix parameter, for case component is used more than once on page
function selectColor(article, colorNameForHumans, colorHex, colorUrl, regularPrice, discountedPrice, sufix, family, description, selectedColorContainerId) {

    /* handle selected color properties for the usage in addToCartProduct */

    var descriptionPlusColor = Url.encode(Url.decode(description) + " - " + decodeString(colorNameForHumans));

    var buyButton = document.getElementById("buyButton" + sufix);
    buyButton.setAttribute(
                "onclick",
                "return addToCartProduct('" + article + "','" + discountedPrice + "','" + regularPrice + "','" + descriptionPlusColor + "','" + family + "', 1, " + 'true' + ", '" + sufix + "');");
    
    
    
    /* ========================= */


    /* handle selected color display */

    //create icon for the selected color variation
    var selectedColorIcon = document.createElement("div");
    selectedColorIcon.setAttribute("id", "selectedColorIcon" + sufix);

    if (colorUrl != null && colorUrl != '') {

        var selectedColorImage = document.createElement("img");
        selectedColorImage.setAttribute("id", "selectedColorIcon" + sufix);
        selectedColorImage.setAttribute("src", colorUrl);

        selectedColorIcon.appendChild(selectedColorImage);
    }
    else {
        //if image for the color is not present, we use just div rectangle with png alpha mask
        var selectedColorImage = document.createElement("div");
        selectedColorImage.setAttribute("id", "selectedColorIcon" + sufix);
        selectedColorImage.setAttribute("class", "product-color-selected-choice");
        selectedColorImage.setAttribute("style", "background-color: #" + colorHex); //this is needed as a color choice indication, so it can't be in .css file
        //width is set to the png mask dimension, so that the div won't be larger than the mask

        var divMask = document.createElement("img");
        divMask.setAttribute("src", "/images/color-picker-mask.png");
        selectedColorImage.appendChild(divMask);

        selectedColorIcon.appendChild(selectedColorImage);
    }

    selectedColorIcon.innerHTML += "<br />" + decodeString(colorNameForHumans);

    //add icon to the html
    var productImageContainer = document.getElementById(selectedColorContainerId);
    //if the color has already been chosen, we remove the old choice's icon
    var oldIcon = document.getElementById("selectedColorIcon" + sufix);
    if (oldIcon != null) {
        productImageContainer.removeChild(oldIcon);
    }
    productImageContainer.appendChild(selectedColorIcon);
    /* ========================= */



    /* handle selected color price (if different from original product price) */

    var regularPriceElement = document.getElementById("regularPriceValue" + sufix);
    var discountedPriceElement = document.getElementById("discountedPriceValue" + sufix);


    if (regularPriceElement != null) regularPriceElement.innerHTML = getFormattedPriceString(regularPrice);
    if (discountedPriceElement != null) discountedPriceElement.innerHTML = getFormattedPriceString(discountedPrice);

    /* handle selected color article number */
    var articleNumberElement = document.getElementById("articleNumber" + sufix);
    articleNumberElement.innerHTML = _articleNumberTextLabel + ' ' + article;


    /* ========================= */


    //            if (discount.indexOf(',') > -1) discount = parseFloat(discount);
    //            
    //            if (price.indexOf(',') > -1) price = parseFloat(price);

}

function colorChooserRADColorWasSelected(selectedColor) {
    
    var discountedPrice = selectedColor.Attributes["discountedPrice"];
    var regularPrice = selectedColor.Attributes["regularPrice"];
    var articleNumber = selectedColor.Attributes["ArticleID"];

    //prepare id prefix for identifying price divs
    var productBoxClientIDPrefix = selectedColor.ClientID;
    var colorChooserRADTextposition = productBoxClientIDPrefix.indexOf("colorChooserRAD");
    productBoxClientIDPrefix = productBoxClientIDPrefix.substring(0, colorChooserRADTextposition);

    var discountedPriceDIV = document.getElementById(productBoxClientIDPrefix + "discountedPrice");
    var regularPriceDIV = document.getElementById(productBoxClientIDPrefix + "price");
    var articleNumberDIV = document.getElementById(productBoxClientIDPrefix + "articleNumber");

    if (discountedPrice != "") {
        //setting both prices
        discountedPriceDIV.innerHTML = getFormattedPriceString(discountedPrice);
        regularPriceDIV.innerHTML = getFormattedPriceString(regularPrice);
    }
    else {
        //we use discounted price div due to the css styling.
        //if there is just one price, it's got the discounted css styling.
        discountedPriceDIV.innerHTML = getFormattedPriceString(regularPrice);
    }

    articleNumberDIV.innerHTML = articleNumber;
    
}


function getSelectedColorArticle(colorArticle, index) {
    if (index == -1) return;
    var articles = document.getElementById(colorArticle).value.split(",");
    return articles[index];
}

function checkBonusProducts() {

    var cartData = loadCart();
    
    //if cart total money (excluding bonus products) doesn't reach 
    //limit for acquiring bonus products, we remove all bonus products from cart
    if (cartExceedsMaxWithoutBonusProducts() < _bonusPriceLimit) {
    
        if (cartData != null) {
            var cartItem;
            cartItems = cartData.split("|");
        }
        
        for (var i = 0; i < cartItems.length; i++) {
            if (cartItems[i] != "") {
                try {
                    cartItem = jQuery.parseJSON(cartItems[i]);
                    if (_bonusProducts.indexOf(cartItem.article) != -1) {
                        removeItemFromCart(cartItem.article);
                    }
                }
                catch (e) {
                    cartItems[i] = "";
                }
            }
        }
    }

    //now we check if the cart total money reaches bonus product acquirement limit.
    //if not, we hide products marked as bonus products
    //if yes, we reveal them
    var arr = document.getElementsByName("bonusProduct");
    for (i = 0; i < arr.length; i++) {
        if (cartExceedsMax() < _bonusPriceLimit) {
            arr[i].style.visibility = 'hidden';
        } else {
            arr[i].style.visibility = 'visible';
        }
    }
}

function cartExceedsMaxWithoutBonusProducts() {
//this function just counts cart total money exluding bonus products

    var cartData = loadCart();
    var cartItems = new Array();
    var cartAmount = 0;
    //dPrice = dPrice.toString().replace(",", _decimal);
    //nPrice = nPrice.toString().replace(",", _decimal);
    if (cartData != null) {

        cartItems = cartData.split("|");
        
        var cartItem;
        for (var w = 0; w < cartItems.length; w++) {

            if (cartItems[w] != "") {
            
                try {
                    cartItem = jQuery.parseJSON(cartItems[w]);
                    
                    //true, if item is not bonus product
                    if (_bonusProducts.indexOf(cartItem.article) == -1) {
                        
                        if (cartItem.discount > 0) {
                            cartAmount += (parseInt(cartItem.count) * cartItem.discount);
                        } else {
                            cartAmount += (parseInt(cartItem.count) * cartItem.price);
                        }
                    }
                }
                catch (e) {
                }
            }
        }
        return cartAmount;
    }
    else {
        return 0;
    }
}

function cartExceedsMax() {
    var cartData = loadCart();
    var cartItems = new Array();
    var cartAmount = 0;
    //dPrice = dPrice.toString().replace(",", _decimal);
    //nPrice = nPrice.toString().replace(",", _decimal);
    if (cartData != null) {
        cartItems = cartData.split("|");
        var cartItem;
        for (var w = 0; w < cartItems.length; w++) {
            if (cartItems[w] != "") {
                try {
                    cartItem = jQuery.parseJSON(cartItems[w]);
                    if (cartItem.discount > 0) {
                        cartAmount += (parseInt(cartItem.count) * cartItem.discount);
                    } else {
                        cartAmount += (parseInt(cartItem.count) * cartItem.price);
                    }
                }
                catch (e) {
                } 
            }
        }
        return cartAmount;
    }
    else {
        return 0;
    }
}

function addTriggeredToCart(article, dPrice, nPrice, description, family, count) {
    addToCart(article, dPrice, nPrice, description, family, count);
    location.reload(true);
}

function addToCart(article, dPrice, nPrice, description, family, count) {
    //Load stored cart
    var cartData = loadCart();
    var cartItemFound = false;
    var cartItems = new Array();
    var cartAmount = 0;

    //DEBUG only - this should be defined somwhere else (loaded from sitecore)
    //var _buyLimit = 10000;


    //Format prices
    dPrice = dPrice.toString().replace(",", _decimal);
    nPrice = nPrice.toString().replace(",", _decimal);

    if (cartData != null) {
        
        cartItems = cartData.split("|");

        calculateCartTotals(cartItems);

        //Buy limit has been already exceeded even before trying to add new item to the cart
        //This is more of a cautionary measure just to be sure
        if (_cartMoneyTotal > _buyLimit) {
            alert(_buyLimitAlert);
            return false;
        }

        //now we expect the buyLimit to be OK
        

        //if the item we want to add is already in the cart, 
        //we just want to raise its count number

        for (var i = 0; i < cartItems.length; i++) {

            if (cartItems[i] != "") {
            
                try {
                    //cartItem = JSON.decode(cartItems[i]); //this is old mootools version
                    cartItem = jQuery.parseJSON(cartItems[i]);

                    if (cartItem.article == article) {

                        //we found the same article, so we raise count number
                        cartItem.count = parseInt(cartItem.count) + count;
                        
                        //why the hell would be the count less than 1? 
                        //this is legacy code and I don't understand why would it...
                        if (cartItem.count > 0) {
                            //cartItems[i] = JSON.encode(cartItem); //mootools old method. Javascript now has native method JSON.stringify()
                            cartItems[i] = JSON.stringify(cartItem); //not native JSON, this comes from JSON2.js
                        } else {
                            cartItems[i] = "";
                        }
                        cartItemFound = true;
                    }
                }
                catch (e) {
                    cartItems[i] = "";
                }
            }
        }
       
    }


    //If the item hasn't been found in cart (and therefore its count would have been raised),
    //we want to add this item to the cart
    if (!cartItemFound) {
        
        var itemString = '{"article":"' + article + '", "discount":"' + dPrice + '", "price":"' + nPrice + '", "description":"' + description + '", "family":"' + family + '", "count":"' + count + '", "status":0}';

        if (cartItems.length == 1 && cartItems[0] == "") {
            cartItems[0] = itemString;
        }
        else {

            cartItems.push(itemString);
        }
    }
    
    //now we check if buy limit is exceeded after adding new item
    //(or raising count of item that was already present in the cart)
    calculateCartTotals(cartItems);
    
    if (_cartMoneyTotal > _buyLimit) {
        alert(_buyLimitAlert);
        return false;
    }

   

    //Parse changes
    parseCartChanges(cartItems);

    //now we are sure that product has been added, so we want the "Item added to Cart" tooltip to be displayed
    _doNotShowToolTipAddedToCart = false;

    checkBonusProducts();
    
    return false;
}

function checkFlexibleOVB(totalPrice) {
    var TextboxElement = document.getElementById(mFlexibleOVBTextboxID);
    if (TextboxElement == null) return 0;
    //check Limit Price
    if (mFlexibleOVBLimitPrice < totalPrice) {
        TextboxElement.disabled = false;
        //load OVB product from session
        var articleJSON = loadFlexibleOVBproduct();
        var articleObject = jQuery.parseJSON(articleJSON);
        // status = -1  -> article wasn't loaded
        // status = 2   -> article was loaded, but is not in current catalog and
        // cannot be used as flexible OVB
        if (articleObject != null && articleObject.status > -1 && articleObject.status != 2) {
            if (articleObject.article != null  && mFlexibleOVBLimitPrice > articleObject.price) {
                TextboxElement.value = articleObject.article;
                showFlexibleOVBproduct(articleObject);
                return parseFloat(formatNumber(mFlexibleOVBDiscountedPrice));
            } 
        }
    } else {
        TextboxElement.disabled = true;
        //clear flexible ovb textbox and prices
        ClearFlexibleOVB();
    }
    return 0;
}


function removeItemFromCart(article) {
    //Load stored cart
    var cartData = loadCart();
    if (cartData == null) return;
    var cartItems = cartData.split("|");

    //Find item
    var cartItemFound = false;
    var cartItem;
    for (var i = 0; i < cartItems.length; i++) {
        if (cartItems[i] != "") {
            // cartItem = JSON.decode(cartItems[i]);
            cartItem = jQuery.parseJSON(cartItems[i]);
            if (cartItem.article == article) {
                cartItems.splice(i, 1);
                //cartItems.pop(i);
                break;
            }
        }
    }

    //Parse changes
    parseCartChanges(cartItems);
}


function parseCartChanges(cartItems) {
    //Parse cart data and save        
    var count = 0;
    var cartValues = "";
    var cartItem;

    for (var i = 0; i < cartItems.length; i++) {
        
        cartValues += cartItems[i];

        if (cartItems[i] != "") {
            //cartItem = JSON.decode(cartItems[i]); //this is mootools function. now we use browsers' native JSON parsing ability
            //cartItem = JSON.parse(cartItems[i]);  //native JSON showed up to have poor support across browsers, je we use jQuery
            cartItem = jQuery.parseJSON(cartItems[i]);
            count += parseInt(cartItem.count);
        }

        if (i < (cartItems.length - 1)) {
            cartValues += "|";
        }
    }

//TODO - Redesign2011 - We need to act upon empty basket in the mini-cart-box
    //Update text
//    if (count == 0) {
//        document.getElementById(_cartLabelID).innerHTML = _basketEmpty;
//    }
//    else {
//        document.getElementById(_cartLabelID).innerHTML = _basketInUse + " " + count;
//    }


    
    saveCart(cartValues);
    updateCartGauge(cartItems);
    //highlightCart();
    
    
    debugCart();
    
}

function updateCartGauge(cartItems) {
    //this function updates values in mini widget showing cart overview in footer-ribbon
    //param cartItems needs to be array of cart items, i.e. cartItems=loadCart().split("|");   
    
    var itemsCount = 0;
    var moneyTotal = 0;

    calculateCartTotals(cartItems);

    //now we set the text on the gauge widget
    var itemsCountSPAN = document.getElementById("cart-items-count");
    var moneyTotalSPAN = document.getElementById("cart-total-money");

    itemsCountSPAN.innerHTML = _cartItemsCountTotal;
    //moneyTotalSPAN.innerHTML = _cartMoneyTotal + " " + currChar;
    moneyTotalSPAN.innerHTML = getFormattedPriceString(_cartMoneyTotal);

    updateCartBonusMessage();
    
    //parseCartChanges(""); //used for manually flushing the cart during debugging
}


// Calculates money and items count totals.
// Then it sets these values to _cartMoneyTotal and _cartItemsCountTotal and _cartTotalDiscount
// param cartItems = loadCart() splitted by "|"
function calculateCartTotals(cartItems) {

    _cartMoneyTotal = 0;
    _cartItemsCountTotal = 0;
    _cartTotalDiscountMoney = 0;
    if (cartItems == null) {
        var cartData = loadCart();
        if (cartData == null) return;
        cartItems = cartData.split("|");
    }
    for (var i = 0; i < cartItems.length; i++)
    {
        if (cartItems[i] != "")
        {
            //item = JSON.parse(cartItems[i]);
            var item = jQuery.parseJSON(decodeString(cartItems[i]));
            
            //first we check for special items 99998 
            //which means all items in the cart are discounted by percent
            if (item.article == 99998)
            {
                //alert('Discount is percent');
                _isWholeCartDiscountedByPercent = true;
                _wholeCartDiscountPercent = item.price;
            }
            else
            {
                var itemCount = parseInt(item.count);
                var itemPrice = 0;
                
                if ((item.discount == "0") || (item.discount == "")) {                    
                    itemPrice = item.price;
                } 
                else {
                    itemPrice = item.discount;
                }

                _cartMoneyTotal += itemPrice * itemCount;
                _cartItemsCountTotal += itemCount; 
            }
        }
    }

    var flexibleOVBprice = checkFlexibleOVB(_cartMoneyTotal);
    _cartMoneyTotal += flexibleOVBprice;
    if (flexibleOVBprice > 0) _cartItemsCountTotal++;
    
    if (_isWholeCartDiscountedByPercent) {
        _cartTotalDiscountMoney = _cartMoneyTotal * _wholeCartDiscountPercent / 100
        _cartMoneyTotal = _cartMoneyTotal - _cartTotalDiscountMoney;
    }
    _cartMoneyTotal = _cartMoneyTotal.toFixed(2);    
}

function updateCartBonusMessage() {

    var correctedMoney = parseFloat(_cartMoneyTotal);

    var activeLimit;
    for (var i = 0; i < _cartBonusLimitsArray.length; i++) {

        //limit value is on the second position in each array row ( [1] )
        if (correctedMoney < _cartBonusLimitsArray[i][1]) {
            activeLimit = _cartBonusLimitsArray[i]; 
            break;
        }
    }


    var bonusLimitElement = document.getElementById("bonusLimitText");
    
    if (activeLimit != null) {


        var bonusLimitValueTemp = activeLimit[1] - correctedMoney;
        bonusLimitValue = getFormattedPriceString(bonusLimitValueTemp);

        var bonusLimitText = activeLimit[0].replace("%%LimitValue%%", bonusLimitValue);
        bonusLimitText = activeLimit[0].replace("%%ShippingLimit%%", bonusLimitValue); //this is special case of old limit definition before %%LimitValue%% convention
    
        bonusLimitElement.innerHTML = bonusLimitText;
    }
    else {
        bonusLimitElement.innerHTML = null;
    }
}


function showCartStatus() {
    //Load stored cart
    var cartData = loadCart();
    var count = 0;

    if (cartData != null) {
        var cartItems = cartData.split("|");

        //Parse cart data and save
        var cartValues = "";
        var cartItem;
        for (var i = 0; i < cartItems.length; i++) {
            cartValues += cartItems[i];

            if (cartItems[i] != "") {
                cartItem = jQuery.parseJSON(cartItems[i]);
                count += parseInt(cartItem.count);
            }

            if (i < (cartItems.length - 1)) {
                cartValues += "|";
            }
        }
    }

    //Update text
    if (count == 0) {
        document.getElementById(_cartLabelID).innerHTML = _basketEmpty;
    }
    else {
        document.getElementById(_cartLabelID).innerHTML = _basketInUse + " " + count;
    }
}

function debugCart() {
    return false;
    var rows = loadCart();
    if (rows == null) return;
    rows = rows.split("|");
    var debug = document.getElementById("cartDebugText");
    debug.value = "";
    for (var i = 0; i < rows.length; i++) {
        debug.value += rows[i] + "\n";
        debug.value += "==========================" + "\n";
    }
}


//function saveCart(data)
//{
//    var days = 1;
//    if (days) 
//    {
//	    var date = new Date();
//	    date.setTime(date.getTime()+(days*24*60*60*1000));
//	    var expires = "; expires="+date.toGMTString();
//    }
//    else var expires = "";
//    document.cookie = "fdscart="+data+expires+"; path=/";
//}

function saveCart(data) {
    data = data.replace(new RegExp(",", "g"), "#");
    //data = data.replace(",","@") 
    var days = 1;
    if (days) {
        var date = new Date();
        date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
        var expires = "; expires=" + date.toGMTString();
    }
    else var expires = "";
    document.cookie = "fdscart=" + data + expires + "; path=/";
}

function saveFlexibleOVB(articleJSON) {
    var days = 1;
    if (days) {
        var date = new Date();
        date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
        var expires = "; expires=" + date.toGMTString();
    }
    else var expires = "";
    document.cookie = "fdsFlexibleOVB=" + articleJSON + expires + "; path=/";
}

//function loadCart() 
//{
//    var nameEQ = "fdscart=";
//    var ca = document.cookie.split(';');	    
//    for(var i=0;i < ca.length;i++) 
//    {
//	    var c = ca[i];
//	    while (c.charAt(0)==' ') c = c.substring(1,c.length);
//	    if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
//    }
//    return null;
//}    

function loadCart() {
    var nameEQ = "fdscart=";
    var ca = document.cookie.split(';');  
    for (var i = 0; i < ca.length; i++) {
        var c = ca[i];
        while (c.charAt(0) == ' ') c = c.substring(1, c.length);
        if (c.indexOf(nameEQ) == 0)
        //return c.substring(nameEQ.length,c.length).replace("@",",") ;
            return c.substring(nameEQ.length, c.length).replace(new RegExp("#", "g"), ",");
    }
    return null;
}

function loadFlexibleOVBproduct(){
    var nameEQ = "fdsFlexibleOVB=";
    var ca = document.cookie.split(';');
    for (var i = 0; i < ca.length; i++) {
        var c = ca[i];
        while (c.charAt(0) == ' ') c = c.substring(1, c.length);
        if (c.indexOf(nameEQ) == 0)
        //return c.substring(nameEQ.length,c.length).replace("@",",") ;
            return c.substring(nameEQ.length, c.length).replace(new RegExp("#", "g"), ",");
    }
    return null;
}

function deleteCart() {
    document.cookie = "fdscart=; path=/";
}

function highlightCart() {
    document.getElementById(_cartClientID).style.color = "#ff0000";
    var morph = new Fx.Morph(document.getElementById(_cartClientID), { duration: 'long' });
    morph.start({
        color: '#ffffff'
    });
    try {
    }
    catch (e)
    { }
}

function getDecimalCharacter() {
    var cChar = "1.1";
    var checkSum = parseFloat(cChar) + "";
    var returnValue = "";
    if (checkSum.length > 1) {
        returnValue = ".";
    } else {
        returnValue = ",";
    }
    return returnValue;
}

//========================================== PRICE FORMATTING =====================================
//=================================================================================================

var _marketID; //This is set from codebehind

//this function expects decimal number with "." as a decimal
//separator. If anything other than (plain) number is passed,
//the function returns original parameter. This includes
//cases where we pass already formatted price as the parameter.
//Idea behind this is that we cannot cover all formatting styles:
// 1 200.50 $
// 1,200.50 $
// 1200,50 $
// 1200,50
// 1200,-
// 1 200,-
//etc...
function getFormattedPriceString(unformattedPrice) {


    //strip all non-numeric or non-dot characters
    //this, of course wouldn't work if the decimal char is not "."
    var strippedPrice = unformattedPrice.toString().replace(/[^0-9\.]+/g, "");
    if (strippedPrice.toString() != unformattedPrice.toString()) return unformattedPrice;


    //  WATCH OUT - THERE IS ALSO A CODEBEHIND FORMATTING LOGIC IN BasePage.GetFormattedPriceString

    if (_marketID == 1) //Sweden
    {
        return _getFormattedPriceForSE(unformattedPrice);
    }
    else if (_marketID == 2) //Norway
    {
        return _getFormattedPriceForNO(unformattedPrice);
    }
    else if (_marketID == 3) //Czech
    {
        return _getFormattedPriceForCZ(unformattedPrice);
    }
    else if (_marketID == 5) //Hungary
    {
        return _getFormattedPriceForHU(unformattedPrice);
    }
    else if (_marketID == 7) //Slovenia
    {
        return _getFormattedPriceForSL(unformattedPrice);
    }
    else if (_marketID == 4) //Slovakia
    {
        return _getFormattedPriceForSK(unformattedPrice);
    }
    else {
        //we consider SK formatting code to be the fallback.
        //this is an arbitrary choice and the fallback formatting
        //can be whatever we (you) like at the moment
        return _getFormattedPriceForSK(unformattedPrice);
    }

}


function _getFormattedPriceForSE(price) {

    var currencyChar = currChar;

    var priceWithDecimals = parseFloat(price).toFixed(2);
    priceWithDecimals = _insertThousandsSeparators(priceWithDecimals, "&nbsp;", "."); //now we add thousands separators

    if (currencyChar.indexOf("-") != -1) {
        //ex.: Price: 320:-
        //ex.: Price: 320:20
        
        var lastTwoNumbers = priceWithDecimals.substring(priceWithDecimals.length - 2);

        if (lastTwoNumbers == "00") {
            return priceWithDecimals.substr(0, priceWithDecimals.length - 3) + currencyChar;
        }

        return priceWithDecimals.replace('.', ':');
    }
    else {
        //ex.: Price: 320.00 SEK
        return priceWithDecimals + "&nbsp;" + currencyChar;
    }
}


function _getFormattedPriceForNO(price) {

    var currencyChar = currChar;

    var priceWithDecimals = parseFloat(price).toFixed(2);
    priceWithDecimals = _insertThousandsSeparators(priceWithDecimals, "&nbsp;", "."); //now we add thousands separators

    if (currencyChar.indexOf("-") != -1) {
        //ex.: Price: 320,-
        //ex.: Price: 320,20
        
        var lastTwoNumbers = priceWithDecimals.substring(priceWithDecimals.length - 2);

        if (lastTwoNumbers == "00") {
            return priceWithDecimals.substr(0, priceWithDecimals.length - 3) + currencyChar;
        }

        return priceWithDecimals.replace('.', ',');
    }
    else {
        //ex.: Price: 320.00 NOK
        return priceWithDecimals + " " + currencyChar;
    }
}


function _getFormattedPriceForCZ(price) {

    var currencyChar = currChar;

    var priceWithDecimals = parseFloat(price).toFixed(2);
    priceWithDecimals = _insertThousandsSeparators(priceWithDecimals, "&nbsp;", "."); //now we add thousands separators

    if (currencyChar.indexOf("-") != -1) {
        //ex.: Price: 320,-
        //ex.: Price: 320,20
        
        var lastTwoNumbers = priceWithDecimals.substring(priceWithDecimals.length - 2);

        if (lastTwoNumbers == "00") {
            return priceWithDecimals.substr(0, priceWithDecimals.length - 3) + currencyChar;
        }

        return priceWithDecimals.replace('.', ',');
    }
    else {
        //ex.: Price: 320.00 Kč
        return priceWithDecimals.substr(0, priceWithDecimals.length - 3) + "&nbsp;" + currencyChar;
    }

}


function _getFormattedPriceForHU(price) {

    var currencyChar = currChar;

    if (currencyChar.indexOf("-") != -1) {
        //ex.: Price: 1 320,-
        //ex.: Price: 1 320,20
        var priceWithDecimals = parseFloat(price).toFixed(2); //we make the price to have two numbers after decimal point (even 0.00)
        priceWithDecimals = _insertThousandsSeparators(priceWithDecimals, "&nbsp;", "."); //now we add thousands separators
        var lastTwoNumbers = priceWithDecimals.substring(priceWithDecimals.length - 2);

        if (lastTwoNumbers == "00") {
            //we strip the trailing 00 and decimal char, then add a currChar (which in this case is '-')
            return priceWithDecimals.substr(0, priceWithDecimals.length - 3) + currencyChar;
        }

        return priceWithDecimals.replace('.', ',');
    }
    else {
        //ex.: Price: 1,320.00 Ft

        var priceWithDecimals = parseFloat(price).toFixed(2);
        priceWithDecimals = _insertThousandsSeparators(priceWithDecimals, "&nbsp;", "."); //now we add thousands separators
        var lastTwoNumbers = priceWithDecimals.substring(priceWithDecimals.length - 2);


        if (lastTwoNumbers == "00") {
            //we strip '.00' portion of the price and then we add " " + currChar
            return priceWithDecimals.substr(0, priceWithDecimals.length - 3) + "&nbsp;" + currencyChar;
        }

        return priceWithDecimals + "&nbsp;" + currencyChar;
    }
}


function _getFormattedPriceForSL(price) {

    var currencyChar = currChar;

    var priceWithDecimals = parseFloat(price).toFixed(2);
    priceWithDecimals = _insertThousandsSeparators(priceWithDecimals, ",", "."); //now we add thousands separators

    if (currencyChar.indexOf("-") != -1) {
        //ex.: Price: 320,-
        //ex.: Price: 320,20
        
        var lastTwoNumbers = priceWithDecimals.substring(priceWithDecimals.length - 2);

        if (lastTwoNumbers == "00") {
            return parseFloat(price).toFixed(0) + currencyChar;
        }

        return priceWithDecimals.replace('.', ',');
    }
    else {
        //ex.: Price: 320.00 EUR
        return parseFloat(price).toFixed(2) + "&nbsp;" + currencyChar;
    }
}


function _getFormattedPriceForSK(price) {

    var currencyChar = currChar;

    var priceWithDecimals = parseFloat(price).toFixed(2);
    priceWithDecimals = _insertThousandsSeparators(priceWithDecimals, ",", "."); //now we add thousands separators

    if (currencyChar.indexOf("-") != -1) {
        //ex.: Price: 320,-
        //ex.: Price: 320,20
        
        var lastTwoNumbers = priceWithDecimals.substring(priceWithDecimals.length - 2);

        if (lastTwoNumbers == "00") {
            return parseFloat(price).toFixed(0) + currencyChar;
        }

        return priceWithDecimals.replace('.', ',');
    }
    else {
        //ex.: Price: 320.00 EUR
        return parseFloat(price).toFixed(2) + "&nbsp;" + currencyChar;
    }
}



// taken from http://webdesign.onyou.ch/2010/08/04/javascript-inserting-thousand-separators/
function _insertThousandsSeparators(price, separatorChar, decimalChar) {

    if (arguments.length == 2) decimalChar = ".";
    if (arguments.length == 1) { separatorChar = ","; decimalChar = "."; }

    price = price.toString();

    // separate the whole number and the fraction if possible
    var a = price.split(decimalChar);
    var decimalPortion = a[0]; // decimal
    var fractionPortion = a[1]; // fraction
    var z = "";
    var decimalPortionLength = decimalPortion.length;

    while (decimalPortionLength > 3) {
        z = separatorChar + decimalPortion.substr(decimalPortionLength - 3, 3) + z;
        decimalPortionLength -= 3;
    }
    z = price.substr(0, decimalPortionLength) + z;

    if (a.length > 1)
        z = z + decimalChar + fractionPortion;
    return z;
}





//=======================================  END PRICE FORMATTING ===================================
//=================================================================================================
    


//############################################  Shopping Basket code ###################################################
//######################################################################################################################


// count of article rows in article table
_articleRowsCount = 0;
_emptyString = "";
//mLockUpdate = true;

function addFlexibleOVBProduct() {
    var articleField = document.getElementById(mFlexibleOVBTextboxID);

    //If article is blank
    if (articleField.value == _emptyString) {
        ClearFlexibleOVB();
        saveFlexibleOVB("");
        calculateTotal();
        updateCartGauge();
        return;
    }

    //If article is default value
    if (articleField.value == mEnterArticleNo) {
        ClearFlexibleOVB();
        saveFlexibleOVB("");
        calculateTotal();
        updateCartGauge();
        return;
    }

    //Trim article number
    articleField.value = articleField.value.replace(/^\s+|\s+$/g, '');

    //Load article, send it to method checkOVBArticle
    LoadArticle2(articleField.value);        
}

function addDirectOrderArticleInDirectOrderControl() {
    var articleField = document.getElementById(directOrderArticleNumber);

    //If article if blank
    if (articleField.value == _emptyString) {
        return;
    }

    //If article is default value
    if (articleField.value == mEnterArticleNo) {
        return;
    }

    //Trim article number
    articleField.value = articleField.value.replace(/^\s+|\s+$/g, '');

    //Load and add article
    LoadArticle(articleField.value);
    articleField.value = _emptyString;
}


// adds article by article number specified in directOrderArticleNumber input field
function addDirectOrderArticle() {

    var articleField = document.getElementById(directOrderArticleNumber);

    //If article if blank
    if (articleField.value == _emptyString) {
        return;
    }

    //If article is default value
    if (articleField.value == mEnterArticleNo) {
        return;
    }

    //Trim article number
    articleField.value = articleField.value.replace(/^\s+|\s+$/g, '');

    //Load and add article
    LoadArticle(articleField.value);
    articleField.value = _emptyString;
}

//Callback receiving article
function ArticleLoaded(param, context) {
    //Get data
    var articleObject = jQuery.parseJSON(param);

    if (articleObject.status > -1) {
        var articleRow = getArticleRow(articleObject.article);
        if (articleRow == -1) {
            articleRow = addRowToBasketTable();
            articleObject.count = 1;
            showArticle(articleObject, articleRow);
        }
        else {
            var count = document.getElementById("productAmountInput_" + articleRow);
            count.value = parseInt(count.value) + 1;
            updatePrice(articleRow);
        }
    }
}

//Callback receiving article from ShoppingBasket by LoadArticle
function CheckOVBArticle(param, context) {
    //Get data
    var articleObject = jQuery.parseJSON(param);
    // status = -1  -> article wasn't loaded
    // status = 2   -> article was loaded, but is not in current catalog and
    // cannot be used as flexible OVB
    if (articleObject.status > -1 && articleObject.status != 2) {
        //check limit price
        if (articleObject.price > mFlexibleOVBLimitPrice) {
            alert(mFlexibleOVBLimitPriceMessageSC);
            ClearFlexibleOVB();
            updateCartGauge();
        } else {
            //show product price and discounted price
            showFlexibleOVBproduct(articleObject);
            //save OVB product to session
            saveFlexibleOVB(param);
            calculateTotal();
            updateCartGauge();
        }
    } else ClearFlexibleOVB();
}

function removeFlexibleOVB() {
        var articleField = document.getElementById(mFlexibleOVBTextboxID);
        if (articleField == null) return;
        articleField.value = '';
        addFlexibleOVBProduct();
}

function showFlexibleOVBproduct(articleObject) {
    var priceLabel = document.getElementById(mFlexibleOVBPriceLabel);
    var discountedPriceLabel = document.getElementById(mFlexibleOVBDiscountedPriceLabel);
    var finalPriceLabel = document.getElementById(mFlexibleOVBFinalPriceLabel);
    var descriptionLabel = document.getElementById(mFlexibleOVBDescriptionLabel);
    var removeFlexibleOVBButton = document.getElementById('removeFlexibleOVBButton');

    priceLabel.innerHTML = getFormattedPriceString(articleObject.price);
    discountedPriceLabel.innerHTML = getFormattedPriceString(mFlexibleOVBDiscountedPrice);
    finalPriceLabel.innerHTML = getFormattedPriceString(mFlexibleOVBDiscountedPrice);
    finalPriceLabel.visibility = true;
    descriptionLabel.innerHTML = decodeString(articleObject.description);
    removeFlexibleOVBButton.style.visibility = 'visible';
}

function ClearFlexibleOVB() {
    var articleField = document.getElementById(mFlexibleOVBTextboxID);
    articleField.value = "";
    var priceLabel = document.getElementById(mFlexibleOVBPriceLabel);
    var discountedPriceLabel = document.getElementById(mFlexibleOVBDiscountedPriceLabel);
    var finalPriceLabel = document.getElementById(mFlexibleOVBFinalPriceLabel);
    var descriptionLabel = document.getElementById(mFlexibleOVBDescriptionLabel);
    var removeFlexibleOVBButton = document.getElementById('removeFlexibleOVBButton');
    priceLabel.innerHTML = "";
    discountedPriceLabel.innerHTML = "";
    finalPriceLabel.innerHTML = "";
    descriptionLabel.innerHTML = "";
    finalPriceLabel.visibility = false;
    removeFlexibleOVBButton.style.visibility = 'hidden';
}

// Callback receiving article - for FdS_DirectOrderBox.ascx user control
function AddArticleToCart(param, context){
    //Get data
    //var articleObject = JSON.decode(param);
    var articleObject = JSON.parse(param);
    if (articleObject.status > -1) {
        addItem(articleObject, -1);
    }
}

// fuction for get basket table row index for article no
// returns null if the article is not in basket
function getArticleRow(articleNo) {
    var tbl = document.getElementById('tblBasket');
    for(var i = 1; i < tbl.rows.length; i++) {
        var article = document.getElementById("productNumber_" + i);
        if (article == null) continue;
        if (article.innerHTML == articleNo.toString()) return i;
    }
    return -1;
}

function addRowToBasketTable() {
    var tbl = document.getElementById('tblBasket');
    var lastRow = tbl.rows.length;
    // if there's no header row in the table, then iteration = lastRow + 1
    var rowId = rowIteration;
    rowIteration++;
    var row = tbl.insertRow(lastRow);
    row.id = "productRow_" + rowId;

    // productNumber_
    var cellProductNumber = row.insertCell(0);
    cellProductNumber.id = "productNumber_" + rowId;
    cellProductNumber.className = "number";
    
    // productDesc_
    var cellProductDesc = row.insertCell(1);
    cellProductDesc.id = "productDesc_" + rowId;
    cellProductDesc.className = "productDesc";

    // productAmount_
    var cellProductAmount = row.insertCell(2);
    cellProductAmount.id = "productAmount_" + rowId;
    cellProductAmount.className = "number";
    var input = document.createElement('input');
    input.type = 'text';
    input.name = 'number'
    input.className = 'number'
    input.id = 'productAmountInput_' + rowId;
    input.onchange = function() { updatePrice(rowId); }
    input.onkeypress = function(event) { productAmountInputKeyPress(event); }  
    var a = document.createElement('a');
    a.setAttribute('href', 'javascript:removeRow(' + rowId + ');');
    var img = document.createElement('img');
    img.setAttribute('src', '/img/delete.png');
    cellProductAmount.appendChild(input);
    cellProductAmount.appendChild(a);
    a.appendChild(img);
    

    // productOriginalPrice_
    var cellProductOriginalPrice = row.insertCell(3);
    cellProductOriginalPrice.id = "productOriginalPrice_" + rowId;
    cellProductOriginalPrice.className = "price";

    // productPrice_
    var cellProductPrice = row.insertCell(4);
    cellProductPrice.className = "price"; 
    var price = document.createElement('strong');
    price.className = 'red';
    price.id = 'productPrice_' + rowId;
    cellProductPrice.appendChild(price);

    // totalProductPrice_
    var cellTotalProductPrice_ = row.insertCell(5);
    cellTotalProductPrice_.id = "totalProductPrice_" + rowId;
    cellTotalProductPrice_.className = "price";

    return rowId;
}

function getRowIndexFromRowId(rowId) {
    var tbl = document.getElementById('tblBasket');
    var lastRow = tbl.rows.length;
    for (var i = 0; i < tbl.rows.length; i++) {
        if (tbl.rows[i].id == "productRow_" + rowId)
            return i + 1;
    }
}

//Show an article
function showArticle(articleObject, rowId) {

    //Check for errors
    if (articleObject.status > -1) {
        //Display
        var description = document.getElementById("productDesc_" + rowId);
        var priceDiscount = document.getElementById("productPrice_" + rowId);
        var priceOrig = document.getElementById("productOriginalPrice_" + rowId);
        var rowsum = document.getElementById("totalProductPrice_" + rowId);
        var article = document.getElementById("productNumber_" + rowId);
        var count = document.getElementById("productAmountInput_" + rowId);

        //Show data
        var desc = "<strong>" + articleObject.description + "</strong><br />" + articleObject.family;
        description.innerHTML = decodeString(desc);
        var price = (articleObject.discount > 0) ? articleObject.discount : articleObject.price;
        priceDiscount.innerHTML = getFormattedPriceString(price);
        priceOrig.innerHTML = getFormattedPriceString(articleObject.price);
        count.value = articleObject.count;
        rowsum.innerHTML = getFormattedPriceString(price * count.value);
        article.innerHTML = articleObject.article;
        //Add to internal list
        addItem(articleObject, rowId);
    }
    else {
        //Display alert
        if (articleObject.status == -1) {
            showErrorDialog(rowId);
        }
        if (articleObject.status == -2) {
            showErrorDialog2(rowId);
        }
        //error_dialog
        return;
    }

    return 0;
}

function addItem(item, rowId) {
    var bLimit = 100000;
    try {
        bLimit = _buyLimit;
    }
    catch (e) {
    }
    // function cartExceedsMax is defined in cart.js
    if (cartExceedsMax() < bLimit) {
        var newItem = new Object();

        //Check if item is in internal list
        for (var i = 0; i < mitems.length; i++) {
            if (mitems[i].rowId == rowId) {
                mitems.splice(i, 1);
                break;
            }
        }

        //Set item properties
        newItem.rowId = rowId;
        newItem.articleId = item.article;
        newItem.discount = item.discount;
        newItem.description = item.description;
        newItem.family = item.family;
        newItem.count = 1;
        newItem.price = parseFloat(formatNumber(item.price));
        var price = (item.discount > 0) ? item.discount : item.price;
        newItem.rowsum = parseFloat(formatNumber(price));


        //Reflect changes in shop cart
        if (!mLockUpdate) {
            addToCart(item.article, item.discount, item.price, item.description, item.family, 1);
            
            //display the "Added to Cart" message 
            //var cartBox = document.getElementById("mini-cart-open");
            //tooltip($(cartBox), "", _itemAddedToCartMessage);
            addedToCartTooltip(_itemAddedToCartMessage);
        }


        //Add to list
        mitems.push(newItem);

        //Update prices
        calculateTotal();

        //Check triggered banners        
        // NOT USED
        //parseTriggeredBannerCartChanges();

        saveItems();
        //Debug
        //printDebug();
    }
}

function saveItems() {
    //alert(document.getElementById('dTest').value);
    document.getElementById(discCode).value = document.getElementById('diCode').value;
    var debugOutput = document.getElementById(savedItems);
    debugOutput.value = "";
    var row = "";

    for (var i = 0; i < mitems.length; i++) {
        //alert('saveItems, mitems[i].price='+mitems[i].price);
        row = "!" + mitems[i].articleId + ";" + mitems[i].count + ";" + mitems[i].price.toString().replace(_decimal, ",") + ";" + mitems[i].discount.toString().replace(_decimal, ",") + ";" + mitems[i].rowsum.toString().replace(_decimal, ",");
        debugOutput.value += row;
    }
}

function showErrorDialog(rowId) {
    var directOrderArticleNumberField = document.getElementById(directOrderArticleNumber);
    directOrderArticleNumberField.className = "direct-order-article-error";
    var errorDialog = document.getElementById('error_dialog');

    //Position error dialog
    var objOffset = findPos(directOrderArticleNumber);
    errorDialog.style.left = objOffset[0] + 50 + "px";
    errorDialog.style.top = objOffset[1] - 12 + "px";

    //Select article field
    articleField.focus();
    articleField.select();

    errorDialog.style.display = "block";
}

function showErrorDialog2(rowId) {
    var directOrderArticleNumberField = document.getElementById(directOrderArticleNumber);
    directOrderArticleNumberField.className = "direct-order-article-error";
    var errorDialog = document.getElementById('error_dialog2');

    //Position error dialog
    var objOffset = findPos(directOrderArticleNumberField);
    errorDialog.style.left = objOffset[0] + 50 + "px";
    errorDialog.style.top = objOffset[1] - 12 + "px";

    //Select article field
    articleField.focus();
    articleField.select();

    errorDialog.style.display = "block";
}

function hideErrorDialog() {
    document.getElementById('error_dialog').style.display = 'none';
    document.getElementById('error_dialog2').style.display = 'none';
}

function updatePrice(rowId) {
    updatePrice(rowId, false);
}

var keyPressServed = false;


function updatePrice(rowId, keyPress) {
    if (keyPressServed && !keyPress) {
        keyPressServed = false;
        return;
    }

    if (keyPress) keyPressServed = true;
    
    var bLimit = 100000;
    try {
        bLimit = _buyLimit;
    }
    catch (e) {
    }
    if (cartExceedsMax() < bLimit) {
        var countField = document.getElementById("productAmountInput_" + rowId);
        var previousCount = 0;
        var newCount = countField.value;
        var rowSumLabel;
        var rowSum = 0;
        var item;


        //Check for invalid counts
        if (isNaN(newCount)) {
            countField.value = 1;
            newCount = 1;
        }

        if (countField.value == 0) {
            removeRow(rowId);
            return;
        }

        //Find item in internal list
        for (var i = 0; i < mitems.length; i++) {
            if (mitems[i].rowId == rowId) {
                var price = (mitems[i].discount > 0) ? mitems[i].discount : mitems[i].price;
                rowSum = parseInt(newCount) * parseFloat(formatNumber(price));
                rowSumLabel = document.getElementById("totalProductPrice_" + rowId);
                rowSumLabel.innerHTML = getFormattedPriceString(rowSum);

                previousCount = mitems[i].count;
                mitems[i].count = newCount;
                mitems[i].rowsum = rowSum;
                item = mitems[i];
            }
        }


        //Reflect changes in shop cart
        if (!mLockUpdate) addToCart(item.articleId, item.discount, item.price, "desc", "family", newCount - previousCount);

        //Show row total
        calculateTotal();

        saveItems();
        //Debug
        //printDebug();
    }
    else {
        //Value exsceeds max limit
        alert(_buyLimitAlert);
        removeRowLimitExceeded(rowId);
    }
}






//////////////////////////////////////////////////


// just copied, seems to be ok
function setDefaultValues(ShippingCost, ShippingLimit, ArticleText) {
    var mEnterArticleNo = ArticleText;
    var mShippingCost = ShippingCost;
    var mShippingCostLimit = ShippingLimit;
}



function rebateCodeValidation(article) {
    var valid = false;
    if (article != "") {
        rebate = jQuery.parseJSON(article);
        if (rebate.status == 50 || rebate.status == 51 || rebate.status == 52) {
            valid = true;
            setDiscountTypeVars(rebate)
        }
    }

    if (valid) {
        //remove all old rebate articles
        for (var i = 0; i < mitems.length; i++) {
            if (mitems[i].articleId == 99997) {
                removeItemFromCart(mitems[i].articleId);
                mitems.splice(i, 1);
                //mitems.pop(i);
                break;
            }
        }
        for (var i = 0; i < mitems.length; i++) {
            if (mitems[i].articleId == 99998) {
                removeItemFromCart(mitems[i].articleId);
                mitems.splice(i, 1);
                //mitems.pop(i);
                break;
            }
        }
        for (var i = 0; i < mitems.length; i++) {
            if (mitems[i].articleId == 99999) {
                removeItemFromCart(mitems[i].articleId);
                mitems.splice(i, 1);
                //mitems.pop(i);
                break;
            }
        }
        calculateTotal();
        saveChanges();
        showRebate(rebate);
    }
    else {
        //document.getElementById("totals-rebate").style.display = "none";
        //removeData(-1);
    }
}

function setDiscountTypeVars(article) {
    if (article.articleId == 99997) discountType = "ff";
    if (article.articleId == 99998) discountType = "pe";
    if (article.articleId == 99999) discountType = "am";
}

// it is not working - elements has another ids now
function showRebate(article) {
    document.getElementById("totals-rebate").style.display = "block";
    if ((decodeString(article.description).split('@')[1]) != "") {
        var dCode = "";
        dCode = (decodeString(article.description).split('@')[1]);
        document.getElementById('diCode').value = dCode;
    }
    document.getElementById("<% =lblRebate.ClientID %>").innerHTML = decodeString(article.description).split('@')[0];
    if (discountType == "pe") {
        document.getElementById("rebateTotal").innerHTML = "";
    }
    else {
        document.getElementById("rebateTotal").innerHTML = article.discount + ",-";
    }

    //Check if rebate is added
    var isAdded = false;

    for (var i = 0; i < mitems.length; i++) {
        if (mitems[i].articleId == 0) {
            isAdded = true;
            break;
        }
    }

    if (!isAdded) {
        article.family = "******";
        addItem(article, -1);
    }
}

function toggleBooster(checkbox, articleId, price, discountLabel, rowsumLabel, productName, familyName) {
    var newItem = new Object();

    if (checkbox.checked) {
        //Create item
        newItem.rowId = -2;
        newItem.articleId = articleId;
        newItem.discount = price;
        newItem.count = 1;
        newItem.price = parseFloat(formatNumber(price));
        newItem.rowsum = parseFloat(formatNumber(price));
        newItem.description = productName;
        newItem.family = familyName;

        //Reflect change in cart
        addToCart(newItem.articleId, newItem.discount, newItem.price, newItem.description, newItem.family, 1);

        //Add to list
        mitems.push(newItem);

        //Show prices
        //document.getElementById(discountLabel).style.visibility = 'visible';
        document.getElementById(rowsumLabel).style.visibility = 'visible';
    }
    else {
        //Remove item
        for (var i = 0; i < mitems.length; i++) {
            if (mitems[i].articleId == articleId) {
                removeItemFromCart(mitems[i].articleId);
                mitems.splice(i, 1);
                //mitems.pop(i);
                break;
            }
        }

        //Show prices
        //document.getElementById(discountLabel).style.visibility = 'hidden';
        document.getElementById(rowsumLabel).style.visibility = 'hidden';
    }


    //Update prices
    calculateTotal();
    saveChanges();

    //Debug
    printDebug();
}

// it is not working - elements has another ids now
//function formatBoosters() {
//    document.getElementById("<% =premiumPriceOrig.ClientID %>").innerHTML = parseFloat(formatNumber(document.getElementById("<% =premiumPriceOrig.ClientID %>").innerHTML)) + currChar;
//    document.getElementById("<% =premiumDiscountPrice.ClientID %>").innerHTML = parseFloat(formatNumber(document.getElementById("<% =premiumDiscountPrice.ClientID %>").innerHTML)) + currChar;
//    document.getElementById("<% =premiumRowPrice.ClientID %>").innerHTML = parseFloat(formatNumber(document.getElementById("<% =premiumRowPrice.ClientID %>").innerHTML)) + currChar;

//    document.getElementById("<% =ovbPriceOrig.ClientID %>").innerHTML = parseFloat(formatNumber(document.getElementById("<% =ovbPriceOrig.ClientID %>").innerHTML)) + currChar;
//    document.getElementById("<% =ovbDiscountPrice.ClientID %>").innerHTML = parseFloat(formatNumber(document.getElementById("<% =ovbDiscountPrice.ClientID %>").innerHTML)) + currChar;
//    document.getElementById("<% =ovbRowPrice.ClientID %>").innerHTML = parseFloat(formatNumber(document.getElementById("<% =ovbRowPrice.ClientID %>").innerHTML)) + currChar;

//    document.getElementById("<% =ovbPriceOrig2.ClientID %>").innerHTML = parseFloat(formatNumber(document.getElementById("<% =ovbPriceOrig2.ClientID %>").innerHTML)) + currChar;
//    document.getElementById("<% =ovbDiscountPrice2.ClientID %>").innerHTML = parseFloat(formatNumber(document.getElementById("<% =ovbDiscountPrice2.ClientID %>").innerHTML)) + currChar;
//    document.getElementById("<% =ovbRowPrice2.ClientID %>").innerHTML = parseFloat(formatNumber(document.getElementById("<% =ovbRowPrice2.ClientID %>").innerHTML)) + currChar;
//}


function loadItemsFromCart() {
    //Load stored cart
    var cartData = loadCart();

    if (cartData != null) {
        var cartItems = cartData.split("|");
        var item;
        var row = 1;

        //Check OVB/PA
        //ovb = JSON.decode(mOvb);
        //ovb2 = JSON.decode(mOvb2);
        //pa = JSON.decode(mPa);

        var ovb = null;
        var ovb2 = null;
        var pa = null;
        try {
            pa = jQuery.parseJSON(mPa);
        } catch (e) {}
        try {
            ovb = jQuery.parseJSON(mOvb);
        } catch (e) {}
        try{
            ovb2 = jQuery.parseJSON(mOvb2);
        } catch (e) { } {}

        for (var i = 0; i < cartItems.length; i++) {
            if (cartItems[i] != "") {
                //item = JSON.decode(cartItems[i]);
                item = jQuery.parseJSON(cartItems[i]);
                if (item.discount < 0) {
                    //alert(item.price);
                    setDiscountTypeVars(item)
                }
            }
        }


        mLockUpdate = true;
        try{
            //Loop all items in cart
            for (var i = 0; i < cartItems.length; i++) {
                if (cartItems[i] != "") {

                    // item = JSON.decode(cartItems[i]);
                    item = jQuery.parseJSON(cartItems[i]);
                    if (
                        (ovb != null && item.article == ovb.article) || 
                        (pa != null && item.article == pa.article) || 
                        (ovb2 != null && item.article == ovb2.article)) {
                        if (item.article == ovb.article) {
                            document.getElementById(ovb.checkbox).checked = true;
                            document.getElementById(ovb.label).style.visibility = 'visible';
                            loadBooster(cartItems[i]);
                        }
                        if (item.article == ovb2.article) {
                            document.getElementById(ovb2.checkbox).checked = true;
                            document.getElementById(ovb2.label).style.visibility = 'visible';
                            loadBooster(cartItems[i]);
                        }
                        if (item.article == pa.article) {
                            document.getElementById(pa.checkbox).checked = true;
                            document.getElementById(pa.label).style.visibility = 'visible';
                            loadBooster(cartItems[i]);
                        }
                    }
                    else {
                        if (item.discount < 0) {
                            showRebate(item);
                        }
                        else {
                            addRowToBasketTable();
                            showArticle(item, row);
                            //blurArticle(row);
                            updatePrice(row);
                            row++;
                        }
                    }

                    
                }
            }
        } catch(e) {}
        mLockUpdate = false;
        //formatBoosters();
    }
    calculateTotal();

}

function loadBooster(data) {
    //Get data
    //var article = JSON.decode(data);
    var article = jQuery.parseJSON(data);

    var newItem = new Object();
    newItem.rowId = -2;
    newItem.articleId = article.article;
    newItem.discount = article.discount;
    newItem.description = article.description;
    newItem.family = article.family;
    newItem.count = 1;
    newItem.price = parseFloat(formatNumber(article.price));
    newItem.rowsum = parseFloat(formatNumber(article.discount));


    //Add to list
    mitems.push(newItem);
}

function saveChanges() {
    document.getElementById(discCode).value = document.getElementById('diCode').value;
    var debugOutput = document.getElementById(GetHdnID);
    debugOutput.value = "";

    var row = "";
    for (var i = 0; i < mitems.length; i++) {
        row = "!" + mitems[i].articleId + ";" + mitems[i].count + ";" + mitems[i].price.toString().replace(_decimal, ",") + ";" + mitems[i].discount.toString().replace(_decimal, ",") + ";" + mitems[i].rowsum.toString().replace(_decimal, ",");
        debugOutput.value += row;
    }
    var flexibleOVBCookie = loadFlexibleOVBproduct();
    if (flexibleOVBCookie != null) {
        var articleJSON = flexibleOVBCookie;
        var articleObject = jQuery.parseJSON(articleJSON);
        if (articleObject != null) {
            var flexibleOVBHiddenField = document.getElementById(GetFlexibleOVBID);
            flexibleOVBHiddenField.value = "!" + articleObject.article + ";" + 1 + ";" + articleObject.price.toString().replace(",", _decimal) + ";" + mFlexibleOVBDiscountedPrice.toString().replace(_decimal, ",") + ";" + mFlexibleOVBDiscountedPrice.toString().replace(_decimal, ",");
        }
    }
}


function calculateTotal() {
    var rowTotal = 0;
    var shippingCost = mShippingCost;
    var rebate = 0;
    var basketContainsFF = false;
    var basketContainsPremiumShippingFreeProduct = false;

    //Find item in internal list
    for (var i = 0; i < mitems.length; i++) {
        //alert('calculateTotal, mitems.articleId='+mitems[i].articleId);
        //Calc row total
        if (mitems[i].rowsum > 0) {
            rowTotal += mitems[i].rowsum;
        }
        else {
            if (mitems[i].articleId == 99997 || mitems[i].articleId == 99998 || mitems[i].articleId == 99999) {
                if (mitems[i].articleId == 99997) {
                    basketContainsFF = true;
                }
                rebate = mitems[i].price
                setDiscountTypeVars(mitems[i]);
            }
            //else alert('rowsum is 0 and its not rebate');

        }
        if (mitems[i].articleId == mPremiumShippingFreeProduct) {
            basketContainsPremiumShippingFreeProduct = true;
        }

    }
    mRowTotal = rowTotal;
    if (rebate != 0) {
        discAmount = (rebate / 100) * rowTotal;
    }
    //check flexibleOVB product and return OVB price
    rowTotal += checkFlexibleOVB(rowTotal);

    //Show row total
    document.getElementById("rowtotal").innerHTML = getFormattedPriceString(rowTotal);
        
    // shipping cost rules
    var freePostageRemains = document.getElementById("freePostageRemains");

    var limitString =
        '<strong class="red">' +
        getFormattedPriceString(mShippingCostLimit - rowTotal) +
        '</strong>';

    var freePostageRemainsAmount =
        mShippingCostLimitRemainsString.replace('%%ShippingLimit%%', limitString);

    var freePostageAchieved = 
        '<strong class="red">' +
        mShippingCostLimitAchievedString
        '</strong>';

    if (rowTotal > mShippingCostLimit) {
        freePostageRemains.innerHTML = freePostageAchieved;
    }
    else {
        freePostageRemains.innerHTML = freePostageRemainsAmount;
//        if (rowTotal >= mFavoredShippingCostLimit && rowTotal <= mShippingCostLimit && mFavoredShippingCost > 0) {
//            shippingCost = mFavoredShippingCost;
//        }
//        document.getElementById('direct_order_shippingcost').className = "direct-order-totals-ordersum-label";
    }

    if (basketContainsFF || basketContainsPremiumShippingFreeProduct) {
        freePostageRemains = freePostageRemainsAmount;
    }

    // OVB
    var ovbCheck = document.getElementById(ovbCheckbox);
    var ovbCheck2 = document.getElementById(ovbCheckbox2);

    // count total amount without boosters
    var totalOrderValue = rowTotal -
                    ((ovbCheck != null && ovbCheck.checked) ? mBoosterValue : 0) -
                    ((ovbCheck2 != null && ovbCheck2.checked) ? mBoosterValue2 : 0);

    //Check first OVB
    if (ovbCheck != null && ovbCheck.checked) {

        if (totalOrderValue < mBoosterLimit) {
            ovbCheck.checked = false;
            try {
                removeBooster();
            } catch (e) { }
        }
    } else {
        if (totalOrderValue >= mBoosterLimit) {
            if (ovbCheck != null) ovbCheck.disabled = false;
        }
        else {

            if (ovbCheck != null) ovbCheck.disabled = true;
        }
    }


    //Check second OVB
    if (ovbCheck2 != null && ovbCheck2.checked) {

        if (totalOrderValue < mBoosterLimit2) {
            ovbCheck2.checked = false;
            try {
                removeBooster2();
            } catch (e) { }
        }
    } else {
        if (totalOrderValue >= mBoosterLimit2) {
            if (ovbCheck2 != null) ovbCheck2.disabled = false;
        }
        else {

            if (ovbCheck2 != null) ovbCheck2.disabled = true;
        }
    }
    

    //Calculate the ladder discount
    var ladder = ladderDiscount.split('$');
    var ladderDiscountPercentage = 0;
    var calculatedLadderDiscount = 0;
    if (ladder[0].split(';')[0] != '0') {
        for (var steps = 0; steps < ladder.length; steps++) {
            if (rowTotal > ladder[steps].split(';')[0]) ladderDiscountPercentage = ladder[steps].split(';')[1];
        }
        if (ladderDiscountPercentage > 0) {
            document.getElementById("ladder-rebate").style.display = "block";
            document.getElementById(lblLadderRebate).innerHTML = ladderDiscountText.replace('%%discountlevel%%', ladderDiscountPercentage + '%');
            calculatedLadderDiscount = 0 - (rowTotal * ladderDiscountPercentage / 100);
            document.getElementById("ladderRebateTotal").innerHTML = getFormattedPriceString(calculatedLadderDiscount);
        }
        else {
            document.getElementById("ladder-rebate").style.display = "none";
        }
    }
    else {
        document.getElementById("ladder-rebate").style.display = "none";
    }

//    //Show grand total
//    var ship = 0;
//    if (discountType == "ff") {
//        document.getElementById("grandtotal").innerHTML = formatNumber(ship + rowTotal + basketTotalSum + calculatedLadderDiscount).toString().replace(_decimal, ",") + currChar;
//    }
//    else {
//        if (discountType == "pe") {
//            ship = parseFloat(formatNumber(shippingCost));
//            document.getElementById("rebateTotal").innerHTML = formatNumber(discAmount).toString().replace(_decimal, ",") + currChar;
//            document.getElementById("grandtotal").innerHTML = formatNumber(ship + rowTotal + basketTotalSum + discAmount + calculatedLadderDiscount).toString().replace(_decimal, ",") + currChar;
//            theTotalDiscountAmount = discAmount;
//        }
//        else {
//            //alert('Rabatt='+rebate);
//            ship = parseFloat(formatNumber(shippingCost));
//            document.getElementById("grandtotal").innerHTML = formatNumber(ship + rowTotal + basketTotalSum + rebate + calculatedLadderDiscount).toString().replace(_decimal, ",") + currChar;
//            theTotalDiscountAmount = rebate;
//        }
//    }
    saveChanges();
}

function removeRowLimitExceeded(rowId) {
//    var orderRow = document.getElementById(rowId + "_orderrow");

    //Clear data
    removeData(rowId);
    calculateTotal();

    //Hide row
    var myVerticalSlide = new Fx.Slide(orderRow, {
        duration: 800,
        transition: Fx.Transitions.Pow.easeOut,
        onComplete: function() { disableRow(rowId); }
    });

    myVerticalSlide.slideOut();

    saveItems();
    //Debug
    printDebug();
}

function removeRow(rowId) {

    var orderRow = document.getElementById("productRow_" + rowId);

    //Validate click
    if (orderRow == null || !confirm(mDeleteYesNo)) {
        if (document.getElementById("productAmount_" + rowId).value == 0) {
            document.getElementById("productAmount_" + rowId).value = 1;
            updatePrice(rowId);
        }
        return;
    }

    //Clear data
    removeData(rowId);
    calculateTotal();

    //Hide row
    orderRow.style.display = 'none';
    var table = document.getElementById("tblBasket");
    table.deleteRow(rowId);
    
//    var myVerticalSlide = new Fx.Slide(orderRow, {
//        duration: 800,
//        transition: Fx.Transitions.Pow.easeOut,
//        onComplete: function() { disableRow(rowId); }
//    });

    //    myVerticalSlide.slideOut();


    saveItems();
    //Debug
    //printDebug();
    return;
}

function removeData(rowId) {

    //Check if item is in internal list
    for (var i = 0; i < mitems.length; i++) {
        if (mitems[i].rowId == rowId) {
            removeItemFromCart(mitems[i].articleId);
            mitems.splice(i, 1);
            break;
        }
    }
}

// fuctions suppressig enter press

function directOrderArticleNumberKeyPress(e, action) {
    e = e || window.event;
    if (e.keyCode == 13) {
        e.cancelBubble = true;
        e.returnValue = false;
        if (e.preventDefault) e.preventDefault();
        if (e.stopPropagation) e.stopPropagation();
        if (action == 'addDirectOrderArticleInDirectOrderControl')
            addDirectOrderArticleInDirectOrderControl();
        if (action == 'addDirectOrderArticle')
            addDirectOrderArticle();
    }
}

function productAmountInputKeyPress(e) {
    e = e || window.event;
    if (e.keyCode == 13) {
        e.cancelBubble = true;
        e.returnValue = false;
        if (e.preventDefault) e.preventDefault();
        if (e.stopPropagation) e.stopPropagation();
        var element = e.target;
        var rowId = element.id.replace("productAmountInput_", "");
        updatePrice(rowId, true);
    }
}
   
