function ajaxCartSubmiter (nProductID, strURLParams, htmlTemplate, showCartTemplate) {

  
    var htmlData = {
        ajaxData: {}
    },
    shopCart = {
        ajaxData: {}
    };

    var shopCartArea='<div id="shopcartreturn"><div id="shopcartbody"></div><div id="shopcartcontainer"></div></div>';
    var testCartArea= document.getElementById("shopcartreturn");

    if (!testCartArea) {
        var body=document.getElementsByTagName('body');
        body[0].innerHTML=shopCartArea+body[0].innerHTML;
    }
    document.getElementById("shopcartbody").style.height=document.body.scrollHeight+'px';

    var shopcartcontainer=document.getElementById('shopcartcontainer');
    document.getElementById("shopcartreturn").style.display='block';
    shopcartcontainer.innerHTML='<div id="shopcartpreload"></div>';
    shopcartcontainer.style.top=document.body.scrollTop+"px";

    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 +')'),
        itemsCount=objResult.result,
        totalItemsCount=objResult.cartitemcount,
        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("ItemCount=(\\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]);
            totalCart=convertToPrixe(amount[1]);
        }

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

        var body=document.getElementsByTagName('body'),
        btncontainer = document.getElementById('showCartContainer');
        if (!body) {
            return;
        }
        if (!btncontainer) {
            body[0].innerHTML='<div id="showCartContainer">'+cartTemplateCookie+'</div>'+body[0].innerHTML;
        } 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;
}
