function ajaxCartSubmiter (nProductID, strURLParams, htmlTemplate, showCartTemplate) {
    var htmlData = {
        ajaxData: {}
    },
        shopCart = {
        ajaxData: {}
    };

    var testCartArea= document.getElementById("shopcartreturn");

    if (!testCartArea) {
        var newdiv = document.createElement('div');
        newdiv.innerHTML = '<div id="shopcartbody"></div><div id="shopcartcontainer"></div>';
        newdiv.id = "shopcartreturn";
        document.body.insertBefore (newdiv,document.body.getElementsByTagName('*')[0]);
    }

    document.getElementById("shopcartbody").style.height=document.body.scrollHeight+'px';

    var shopcartcontainer=document.getElementById('shopcartcontainer'),
        currentScroll=getScrollXY();

    document.getElementById("shopcartreturn").style.display='block';
    shopcartcontainer.innerHTML='<div id="shopcartpreload"></div>';
    shopcartcontainer.style.top=currentScroll[1]+"px";
    shopcartcontainer.style.position="absolute";

    var state=0;
    ajaxSender (shopCart, 'PBShoppingCart.asp?AjaxMode=1&'+strURLParams, showCart);
    ajaxSender (htmlData, htmlTemplate, showCart);

    function showCart () {
        if (state==0)  {
            state=1;
            return;
        }

        var answer=shopCart.ajaxData.responseText,
            htmlModel=htmlData.ajaxData.responseText,
            objResult = eval('('+ answer.replace('":,','":0,') +')'),
            itemsCount=objResult.result,
            totalItemsCount=objResult.cartqtytotal,
            totalAmount=convertToPrixe(objResult.cartsubtotalnet);

        setDynamicCart (showCartTemplate);
        htmlModel = cleanHtmlTags (htmlModel);
        htmlModel = replaceFromTemplate (htmlModel, 'addedItems', itemsCount, true );
        htmlModel = replaceFromTemplate (htmlModel, 'totalItems', totalItemsCount, true );
        htmlModel = replaceFromTemplate (htmlModel, 'cartAmount', totalAmount, false );

        shopcartcontainer.innerHTML=htmlModel;
    }
}

function ajaxSender(dataType, urlData, functionToExecute) {
    try {
        dataType.ajaxData = new ActiveXObject('Msxml2.XMLHTTP');
    }
    catch (e){
        try {
            dataType.ajaxData = new ActiveXObject('Microsoft.XMLHTTP');
        }
        catch (e2)  {
            try {
                dataType.ajaxData = new XMLHttpRequest();
            }
            catch (e3) {
                dataType.ajaxData = false;
            }
        }
    }

    dataType.ajaxData.onreadystatechange  = function(){
        if(dataType.ajaxData.readyState  == 4) {
            if(dataType.ajaxData.status  == 200) {
                functionToExecute ();
            } else if (window.console) console.log("Error code ", dataType.ajaxData.status);
        }
    };

    var now=new Date();

    if (urlData.search(/\?/g)>0) {
        urlData +='&';
    }
    else {
        urlData +='?';
    }
    urlData +='now='+now.getTime();

    dataType.ajaxData.open( "GET", urlData,  true);
    dataType.ajaxData.send(null);
}

function getCookie(sName) {
    var oRegex = new RegExp("(?:; )?" + sName + "=([^;]*);?");

    if (oRegex.test(document.cookie)) {
        return unescape(RegExp["$1"]);
    } else {
        return null;
    }
}

function SetCookie (sName, value) {
    document.cookie = sName +"=" + escape(value) + ";" ;
}

function setDynamicCart (htmlTemplate) {

    function setCartCookie () {
        var answer=htmlData.ajaxData.responseText;
        answer = cleanHtmlTags (answer);
        SetCookie ('cartTemplateCookie', answer);
        cartTemplateCookie = answer;
        showCartInDocument ();
    }

    var cartTemplateCookie = getCookie('cartTemplateCookie');

    if (!cartTemplateCookie) {
        var htmlData = {
            ajaxData: {}
        };
        ajaxSender (htmlData, htmlTemplate, setCartCookie);
    } else {
        showCartInDocument ();
    }
    
    function showCartInDocument () {
        var reg=new RegExp("QTYTotal=(\\d*)","g"),
            regAmount=new RegExp("SubTotalNet=(\\d*)","g"),
            chaine=getCookie('PCart'),
            nbItems=reg.exec(chaine),
            amount=regAmount.exec(chaine),
            items=0,
            totalCart=0;

        if (nbItems && nbItems.length>=1 && amount && amount.length>1) {
            items=parseInt(nbItems[1]);
            if (amount[1]) totalCart=convertToPrixe(amount[1]);
        }

        cartTemplateCookie = replaceFromTemplate (cartTemplateCookie, 'nbItems', items , true );
        cartTemplateCookie = replaceFromTemplate (cartTemplateCookie, 'cartAmount', totalCart , false );

        var btncontainer = document.getElementById('showCartContainer');
   
        if (!btncontainer) {
            var newdiv2 = document.createElement('div');
            newdiv2.id = "showCartContainer";
            newdiv2.innerHTML = cartTemplateCookie;
            var funtionToOnload=  function () {
                document.body.insertBefore (newdiv2,document.body.getElementsByTagName('*')[0])
            };
            AddFctToOnLoad (funtionToOnload);
        } else {
            btncontainer.innerHTML=cartTemplateCookie;
        }
    }

}

function returnToSite() {
    document.getElementById("shopcartreturn").style.display='none';
}

function cleanHtmlTags (htmlModel){
    var cleanHTML = {
        lineBreaks:new RegExp('\\r?\n|\\r',"g"),
        doctype:new RegExp('<!DOCTYPE[^>]*>',"gi"),
        head:new RegExp('<head[^>]*>(.*)</head>',"gi"),
        body:new RegExp('</?body[^>]*>',"gi"),
        html:new RegExp('</?html[^>]*>',"gi")
    }

    htmlModel=htmlModel.replace(cleanHTML.lineBreaks, "");
    htmlModel=htmlModel.replace(cleanHTML.doctype, "");
    htmlModel=htmlModel.replace(cleanHTML.head, "");
    htmlModel=htmlModel.replace(cleanHTML.body, "");
    htmlModel=htmlModel.replace(cleanHTML.html, "");

    return htmlModel;
}

function convertToPrixe (price) {
    var amount = parseFloat(price)/100;
    amount = amount.toString();
    amount = amount.replace('.', ',');

    var expregTest=new RegExp(',\\d\\d',"g"),
        expregTest2=new RegExp(',',"g"),
        test = amount.match(expregTest),
        test2 = amount.match(expregTest2);

    if  (!test && test2) amount += '0';

    return amount;
}

function replaceFromTemplate (htmlModel, tag, value, recursive) {
    var reg = {};
    if (recursive) {
        reg = {
            expression:new RegExp("\\{"+tag+"\\s*\\[([^\\}|\\]]*)\\]\\s*\\[([^\\}|\\]]*)\\]\\s*\\[([^\\}|\\]]*)\\]\\}", "g"),
            tagValue:new RegExp("#"+tag, "g")
        }
        htmlModel=htmlModel.replace(reg.tagValue, value);
        var doResult=reg.expression.exec(htmlModel);
        if (value>2) value=2;
        htmlModel=htmlModel.replace(reg.expression,doResult[value+1]);
    } else {
        reg = {
            tagValue:new RegExp("{"+tag+"}", "g")
        }
        htmlModel=htmlModel.replace(reg.tagValue,value);
    }
    return htmlModel;
}

function getScrollXY() {
    var scrOfX = 0,
        scrOfY = 0;

    if( typeof( window.pageYOffset ) == 'number' ) {
        //Netscape compliant
        scrOfY = window.pageYOffset;
        scrOfX = window.pageXOffset;
    } else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
        //DOM compliant
        scrOfY = document.body.scrollTop;
        scrOfX = document.body.scrollLeft;
    } else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
        //IE6 standards compliant mode
        scrOfY = document.documentElement.scrollTop;
        scrOfX = document.documentElement.scrollLeft;
    }
    return [ scrOfX, scrOfY ];
}

function AddFctToOnLoad (oAddFct) {
    var oWinOnLoad = window.onload;
    if (typeof window.onload != 'function') {
        window.onload = oAddFct;
    } else {
        window.onload = function () {
            if (oWinOnLoad) oWinOnLoad();
            oAddFct();
        }
    }
}
