

try{
  var debug = window.location.href.indexOf("debug=true")>0?true:false;
  var localData;
  function favizone_server_parameters_config(){
    return {
      server: "https://admin.favizone.com/",
      applicationKey : "MGgzWjRBcjdWaWswUFJDcWxxVnEjI2Z2IyNodHRwOi8vZXJhbS5mcg==",
      shop:"210",
      site:"http://eram.fr",
      abTest:false,
      debug : window.location.href.indexOf("debug=true")>0?true:false
    }
  }

  function favizone_api_parameters_config(){
    return {
      GTMevents:"tagManager/displayEvent/<event>",
profile: "api/profile/register",
tracker : "api/addEvent",
renderer:"api/allrecs/<canal>",
preview:"api/preview"
}
}
function favizone_cutsom_scripts() {

    var customScripts =  {"viewProduct":"//categories names\nvar categoriesNames = document.querySelectorAll(\".breadcrumbs ul li a\");\ndata.categoriesNames[0] = \"Catalogue WEB FR-BE/\";\nfor(var j=2;j<categoriesNames.length;j++){\n  if(typeof(categoriesNames[j])!=\"function\"){\n     if(j== categoriesNames.length-1)\n    data.categoriesNames[0] += categoriesNames[j].innerHTML.replace('/', '-').trim();\n  else\n   data.categoriesNames[0] += categoriesNames[j].innerHTML.replace('/', '-').trim()+'/'; \n  }\n \n}\n//price\ndata.price = parseFloat(data.price.toString()+document.querySelector(\".price-info .price-box .right .cent\").textContent.trim().replace(',','.'));\n\n\n//reduction\nif(data.price_without_reduction != null){\ndata.price_without_reduction = parseFloat(data.price_without_reduction.toString()+document.querySelector(\".price-info .price-box .old-price .price .right .cent\").textContent.trim().replace(',','.'));\ndata.isReduced = true;\n}\n//identifier\n//data.identifier= data.identifier.replace( /^\\D+/g, '').trim(); \n//data.identifier= window.location.pathname.replace( /\\D/g, '').trim();\ndata.identifier = document.querySelector(\".product-ref\").innerHTML.replace( /\\D/g, '').trim();\n\n\ndata.available_for_order = true;\ndata.active=true;\ndata.stock=true;\n//reference\ndata.reference = data.identifier\n//facets\n//*sizes\nvar sizes = document.querySelectorAll(\"#configurable_swatch_taille li\");\nvar elt;\nif(sizes && sizes.length>0){\n  if(data[\"facets\"] == null)\n    data[\"facets\"] = {}\n  data[\"facets\"][\"tailles\"] = [];\n  for (var i = 0; i < sizes.length; i++) {\n    if( sizes[i].className.indexOf(\"disabled\")<0){\n      elt = sizes[i].querySelector(\"a\");\n        if(elt && elt.title )\n          data[\"facets\"][\"tailles\"].push( elt.title);\n\n      };\n    }  \n}\n\n//event\n event = tracker.viewProductTracker();\nevent+=data.identifier+\" 1 1\";\nid = data.identifier;\nconsole.log(data);","viewCategory":"//path and idParent\nvar categoriesNames = document.querySelectorAll(\".breadcrumbs ul li a\");\nvar begin = 1;\nif(categoriesNames && categoriesNames[0].textContent.indexOf(\"Retour\")>=0)\n  begin = 2;\nvar path = \"Catalogue WEB FR-BE\";\nvar idParent = \"Catalogue WEB FR-BE\";\n\nfor(var j=begin;j<categoriesNames.length;j++){\n  if(typeof(categoriesNames[j])!=\"function\"){\n    path += '/'+categoriesNames[j].textContent.replace('/', '-').trim(); \n    idParent += '/'+categoriesNames[j].textContent.replace('/', '-').trim();\n    /*if(j== categoriesNames.length-1){\n      path += categoriesNames[j].textContent.replace('/', '-').trim(); \n    idParent += categoriesNames[j].textContent.replace('/', '-').trim();\n     }\n    \n  else{\n    path += '/'+categoriesNames[j].textContent.replace('/', '-').trim(); \n    idParent += '/'+categoriesNames[j].textContent.replace('/', '-').trim();\n  }*/\n  \n  }\n \n}\n\ndata.path = path+\"/\"+data.nameCategory.replace('/', '-');\ndata.idCategory  = data.path;\ndata.idParent = idParent;\ndata.level = data.path.split('/').length-1;\n\n//checks if the id contains html tag or not\nif(/<[a-z][\\s\\S]*>/.test(data.idCategory)){\nvar div = document.createElement(\"div\");\ndiv.innerHTML = data.idCategory;\ndata.idCategory = div.textContent || div.innerText || \"\";\n\ndiv.innerHTML = data.nameCategory;\ndata.nameCategory = div.textContent || div.innerText || \"\";\n\n\n}\nconsole.log(data);","addToCartInner":"event = tracker.addToCartTracker();\nid =  id.replace( /^\\D+/g, '').trim();\nevent += id;\nevent += \" 1 1\";\ndata = [id];","orderDetails":"detail= \"\";\nfor(var l in dataLayer){\n  if(typeof(dataLayer[l]) == \"object\"){\n    if(dataLayer[l].productsInfoCart){\n      for (var elt in dataLayer[l].productsInfoCart) {\n        \n        if(typeof(dataLayer[l].productsInfoCart[elt])== \"object\"){\n        detail +=\"fz#\"+dataLayer[l].productsInfoCart[elt].id+'*'+dataLayer[l].productsInfoCart[elt].quantity+'*'+dataLayer[l].productsInfoCart[elt].price\n        \n        }\n      };\n      break\n      \n    }\n  }\n}\nconsole.log(detail)","confirm":"for(var l in dataLayer){\n  if(typeof(dataLayer[l]) == \"object\"){\n    if(dataLayer[l].email){\n\n      if(! data.custom_event_value)\n         data.custom_event_value = {}\ndata.custom_event_value.session_id= favizone_utilities.connectionIdentifier();\n      data.custom_event_value.id = dataLayer[l].customerId;\n      data.custom_event_value.email = dataLayer[l].email;\n      data.custom_event_value.gender = dataLayer[l].sexe ==\"femme\"?\"f\":\"h\";\n      break\n      \n    }\n  }\n}"};

debugApplication("customScript =", customScripts);
return customScripts;
}

function favizone_event_identifier_config() {


    var contextList =  {"viewProduct":".product-ref","viewCategory":"#category-id","loginUser":"","home":"","cart":"#shopping-cart-table","error":"","search":"","addToCartExtern":"","addToCartInner":"#add-to-cart button"};

debugApplication("contextList =", contextList);
return contextList;
}

function favizone_tagging_events_config(){

    var events =  {"product":{"events":{"renderer":{"product":{"triggerType":"","triggerSelector":"","block-0":{"selector":"","row":0,"type":"","selectorType":"DOM","urlField":null}}}}},"viewProduct":{"events":{"tracker":{"viewProduct":{"triggerType":"onclick","triggerSelector":"","cover":{"selector":"#slider .flex-active-slide img","row":0,"type":"src","selectorType":"DOM","urlField":""},"identifier":{"selector":".product-ref","row":0,"type":"innerHTML","selectorType":"DOM","urlField":""},"price":{"selector":".price-info .price-box .price .left","row":0,"type":"innerHTML","selectorType":"DOM","urlField":""},"price_without_reduction":{"selector":".price-info .old-price .price .left","row":0,"type":"innerHTML","selectorType":"DOM","urlField":""},"description":{"selector":".std-description .description","row":0,"type":"textContent","selectorType":"DOM","urlField":""},"categoriesNames":{"selector":".breadcrumbs ul","row":0,"type":"textContent","selectorType":"DOM","urlField":""},"title":{"selector":".product-name h1","row":0,"type":"innerHTML","selectorType":"DOM","urlField":""},"url":{"selector":null,"row":null,"type":null,"selectorType":"URL","urlField":""}}}}},"category":{"events":{"renderer":{"category":{"triggerType":"","triggerSelector":"","block-0":{"selector":"","row":0,"type":"","selectorType":"DOM","urlField":null}}}}},"viewCategory":{"events":{"tracker":{"viewCategory":{"triggerType":"onclick","triggerSelector":"","nameCategory":{"selector":".category-title h1","row":0,"type":"innerHTML","selectorType":"DOM","urlField":""},"url":{"selector":null,"row":null,"type":null,"selectorType":"URL","urlField":""}}}}},"addToCartInner":{"events":{"tracker":{"addToCartInner":{"triggerType":"onclick","triggerSelector":"#add-to-cart button","idSelector":{"selector":".product-ref","row":0,"type":"innerHTML","selectorType":"DOM","urlField":""}}}}},"cart":{"events":{"renderer":{"cart":{"triggerType":"","triggerSelector":"","block-0":{"selector":"","row":0,"type":"","selectorType":"DOM","urlField":null}}}}},"orderDetails":{"events":{"tracker":{"orderDetails":{"mainSelector":"#shopping-cart-table","contextUrl":"","contextUrlExclude":"","triggerType":"onload","triggerSelector":"","idSelector":{"selector":".product-cart-sku","row":0,"type":"","selectorType":"DOM","urlField":""},"priceSelector":{"selector":".price .left","row":0,"type":"textContent","selectorType":"DOM","urlField":""},"qteSelector":{"selector":".product-quantity-number","row":0,"type":"","selectorType":"DOM","urlField":""}}}}},"confirm":{"events":{"tracker":{"confirm":{"mainSelector":"","contextUrl":"https://www.eram.fr/checkout/multipage/success/","contextUrlExclude":"","triggerType":"onload","triggerSelector":"","idSelector":{"selector":"#favizone","row":0,"type":"","selectorType":"DOM","urlField":""}}}}}};

debugApplication("favizone_tagging_events_config =", events);
return events;
}
/**
 * Description
 * @method debugApplication
 * @param Object data
 * @return boolean
 */
function checkDataValidation(data){
   return true;
   var total = 0;
   for(i in data){
   total +=1;
    if(data[i] == null
    ||(typeof(data[i])=="string" && data[i].length==0)){
        return false;
    }
   }
   if(total>0)
        return true;
   return false;
}

/**
 * Description
 * @method debugApplication
 * @param String ContextName
 * @param String contextValue
 * @return 
 */
function debugApplication(ContextName, contextValue){
  if(debug == true){
     console.log("Favizone Debug === "+ContextName+"  "+contextValue);
  }
}

/**
 * Description
 * @method getCookie
 * @param {} cname
 * @return 
 */
function getCookie(cname) {
    var name = cname + "=";
    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);
        }
        if (c.indexOf(name) == 0) {
            return c.substring(name.length,c.length);
        }
    }
    return "";
}
/**
 * Description
 * @method setCookie
 * @param {} cname
 * @param {} cvalue
 * @param {} exdays
 * @return 
 */
function setCookie(cname, cvalue, exdays) { 

  var cookieStr = cname + "=" + cvalue+";" ;
  if(cvalue.length==0){ 
     cookieStr += " expires=Thu, 01 Jan 1970 00:00:01 GMT;";
  } else {
      var today = new Date();
      expires = new Date(today.getTime() + 365 * 24 * 60 * 60 * 1000);     
      expires = expires.toGMTString();
      cookieStr += "expires=" + expires + "; ";
  } 
  document.cookie = cookieStr+ "; path=/"; 
  /*var d = new Date();
  d.setTime(d.getTime() + (365*24*60*60*1000));
  var expires = "expires="+d.toGMTString();
  document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/";*/
}

/**
 * Description
 * @method getType
 * @param {} element
 * @param {} type
 * @return 
 */
function getType(element, type){
    switch (type) {
      
        case 'textContent': return element.textContent;break;
        case 'innerText': return element.innerText;break;
        case 'innerHTML': return element.innerHTML;break;
        case 'value': return element.value;break;
        case 'id': return element.id;break;
        case 'name': return element.name;break;
        case 'src': return element.src;break;
        case 'title': return element.title;break;
        case 'alt': return element.alt;break;
        case 'class': return element.class;break;
        case 'href': return element.href;break;
        default: return "";break;
    }
}

/**
 * Description
 * @method getParent
 * @param {} element
 * @param {} type
 * @return 
 */
function getParent(elem, value, type) {
    switch(value){
        case 0: return elem.parentNode.getAttribute(type);break;
        case 1: return elem.parentNode.parentNode.getAttribute(type);break;
        case 2: return elem.parentNode.parentNode.parentNode.getAttribute(type);break;
        case 3: return elem.parentNode.parentNode.parentNode.parentNode.getAttribute(type);break;
        case 4: return elem.parentNode.parentNode.parentNode.parentNode.parentNode.getAttribute(type);break;
        case 5: return elem.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.getAttribute(type);break;
        case 6: return elem.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.getAttribute(type);break;
        case 7: return elem.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.getAttribute(type);break;
        default: return "";break;
    }
}

/**
 * Description
 * @method findParentNode
 * @param String parentName
 * @param {} childObj
 * @param String attribute
 * @return 
 */
function findParentNode(parentName, childObj, attribute) {

    parentName = parentName.replace(".","");
    parentName = parentName.replace("#","");
    var testObj = childObj.parentNode;
    var count = 1;
    while(typeof(testObj.getAttribute) == "function" && 
        testObj.getAttribute(attribute) &&
        testObj.getAttribute(attribute).indexOf(parentName)>0 &&
        count<100) {
        testObj = testObj.parentNode;
        count++;
    }
    if(count == 100)
        return null;
    // now you have the object you are looking for - do something with it
    return testObj;
}

/**
 * Description
 * @method encodeSpecificSpaces
 * @param String value
 * @return String
 */
 function encodeSpecificSpaces(value){
    value = value.replace(new RegExp(/ /, 'g'), "fz#");
    return value;
 }

 /**
 * Description
 * @method encodeSpecificSpaces
 * @param String value
 * @return String
 */
 function replaceSeparators(value){
    var separators = ['>'];
    /*for(var s in  separators){
      console.log(separators[s]);
      value = value.replace(new RegExp(separators[s], 'g'), "/");
    }*/
    value = value.replace(new RegExp(/>/, 'g'), "/");
    return value;
 }

 /**
 * Description
 * @method encodeSpecificSpaces
 * @param String value
 * @return String
 */
 function parseFloatNumber(value){
    value = value.replace(',', 'fz#'); 
    value = value.replace('.', 'fz#'); 
    var d = value.split('fz#');

    value = d[0].replace(/[^0-9]+/g, '');
    if(d.length>1){
      value = value + '.' + d[1].replace(/[^0-9]+/g, '');
    }
    return parseFloat(value) ;
 }

 /**
 * Description
 * @method removeParam
 * @param String key
 * @param String sourceURL
 * @return String
 */
 function removeParam(key, sourceURL) {
    var rtn = sourceURL.split("?")[0],
        param,
        params_arr = [],
        queryString = (sourceURL.indexOf("?") !== -1) ? sourceURL.split("?")[1] : "";
    if (queryString !== "") {
        params_arr = queryString.split("&");
        for (var i = params_arr.length - 1; i >= 0; i -= 1) {
            param = params_arr[i].split("=")[0];
            if (param === key) {
                params_arr.splice(i, 1);
            }
        }
        rtn = rtn + "?" + params_arr.join("&");
    }
    return rtn;
}
/**
 * Description
 * @method visitTracker
 * @return
 */
function visitTracker() {
    if (getCookie("favizoneVisitTracker")=="false") {
        setCookie("favizoneVisitTracker", "true", 1);
        return tracker.visitTracker();
    } else {
        return "";
    }
}
/**
 * Description
 * @method productTracker
 * @return ObjectExpression
 */
function productTracker(str) {
    var viewProduct = str["events"]['tracker']["viewProduct"];
    var event = "";
    var data = {};
    var id="";
    var size = Object.keys(viewProduct).length;

    /*Removes favizone custom parameters from url*/
    var urlData = removeParam("fz_p", favizone_helper.getUrl());
    urlData = removeParam("favizone_rec",urlData);
    urlData = removeParam("utm_source", urlData);
    urlData = removeParam("utm_medium",urlData);
    urlData = removeParam("utm_campaign", urlData);
    var variable;
    /***/
    for (var i=0;i<size;i++) {
        var key = Object.keys(viewProduct)[i];
        if (typeof(viewProduct[key])==Object || typeof(viewProduct[key])=="object") {
            var selectorType = viewProduct[key]["selectorType"].toUpperCase();
            if (selectorType == "DOM") {
                var selector = viewProduct[key]["selector"];
                var row = viewProduct[key]["row"];
                var type = viewProduct[key]["type"];
                
                if(row == '-1' || row == -1){
                    variable = [];
                    var variables = document.querySelectorAll(selector);
                    for (var elt in variables) {
                        
                        if(getType(variables[elt],type))
                            variable.push(replaceSeparators(getType(variables[elt],type).trim()))
                    };
                    if(variable.length>0)
                     data[key] = variable;
                
                } else if(row == '-2' || row == -2){
                    //facets 
                    var variables = document.querySelectorAll(selector);
                    variable = {};
                    var key,spans = [];
                    for (var elt in variables) {
                        if(getType(variables[elt],type)){
                            variable[getType(variables[elt],type).replace("favizone_product_",'')] = [];
                            spans = variables[elt].querySelectorAll("span");
                            for(var s in spans){
                                if(getType(spans[s],"innerHTML"))
                                    variable[getType(variables[elt],type).replace("favizone_product_",'')].push(getType(spans[s],"innerHTML"))
                            }
                            spans = [];
                        }   
                    };
                    if(variable != {})
                        data[key] = variable;

                } else {
                    variable = document.querySelectorAll(selector)[row];
                    if (variable) {
                        switch(key){
                            case "identifier":
                                event = tracker.viewProductTracker();
                                event += getType(variable,type).trim()+" 1 1";
                                id = getType(variable,type).trim();
                                data[key] = getType(variable,type).trim();
                                break;
                            case "categoriesNames":
                                data[key] = [replaceSeparators(getType(variable,type).trim())];
                                break;          
                            default:
                                if(key == "price" || key == "price_without_reduction" )
                                    data[key] = parseFloatNumber(getType(variable,type).trim());
                                else
                                    data[key] = getType(variable,type);
                                break;    
                        }
                    } 
                }
            } else {
                var urlField = viewProduct[key]["urlField"];
                switch(key){
                    case "identifier":
                        event = tracker.viewProductTracker();
                        if (urlField) {

                            event += favizone_helper.getUrlParams()[urlField]+" 1 1";
                            id = favizone_helper.getUrlParams()[urlField];
                        } else {
                            event += urlData+" 1 1";//favizone_helper.getUrl()+" 1 1";
                            id = urlData;//favizone_helper.getUrl();
                        }
                        break;
                    case "categoriesNames":
                        data[key] = [replaceSeparators(getType(variable,type).trim())];
                        break;  
                }

                if (urlField) {
                    if (favizone_helper.getUrlParams()[urlField]) {
                        data[key] = favizone_helper.getUrlParams()[urlField];
                    }
                } else {
                    data[key] = urlData;//favizone_helper.getUrl();
                }
            }
        }
    }
   
    if(favizone_cutsom_scripts_data.viewProduct){
        var script = favizone_cutsom_scripts_data.viewProduct;
        debugApplication("Found custom script to eval =", script);
        eval(script);
    }
    return {data:data, event:event, id:id};
}
/**
 * Description
 * @method categoryTracker
 * @return ObjectExpression
 */
function categoryTracker(str) {

    var viewCategory = str["events"]["tracker"]["viewCategory"];

    var event = "";
    var data = {};
    var id = "";
    var size = Object.keys(viewCategory).length;
    event = tracker.viewCategoryTracker();
    for (var i=0;i<size;i++) {
        var key = Object.keys(viewCategory)[i];
        if(typeof(viewCategory[key])== Object||typeof(viewCategory[key])== "object"){
            var selectorType = viewCategory[key]["selectorType"].toUpperCase();
            if (selectorType == "DOM") {
                var selector = viewCategory[key]["selector"];
                var row = viewCategory[key]["row"];
                var type = viewCategory[key]["type"];
                var variable = document.querySelectorAll(selector)[row];
                if (variable) {
                    if (key=='idCategory') {
                        id = replaceSeparators(getType(variable,type));
                        event += encodeSpecificSpaces(id)+" 1 1";
                        //event += getType(variable,type).trim()+" 1 1";
                       // id = getType(variable,type).trim();
                       data[key] = id;
                       data['path'] = id;

                    } else 
                        data[key] = getType(variable,type).trim();
                }

            } else {
                var urlField = viewCategory[key]["urlField"];
                if (key=='idCategory') {
                    if (urlField) {
                        event += favizone_helper.getUrlParams()[urlField]+" 1 1";
                        id = favizone_helper.getUrlParams()[urlField];
                    } else {
                        event += favizone_helper.getUrl()+" 1 1";
                        id = favizone_helper.getUrl();
                    }
                }
                if (urlField) {
                    if (favizone_helper.getUrlParams()[urlField]) {
                        data[key] = favizone_helper.getUrlParams()[urlField];
                    }
                } else {
                    data[key] = favizone_helper.getUrl();
                }
            }
        }
    }

    if(data.idCategory == null){
        data.idCategory = favizone_helper.getUrl();
        event = tracker.viewCategoryTracker();
        event += encodeSpecificSpaces(data.idCategory)+" 1 1";
        id = data.idCategory;
    }

    if(favizone_cutsom_scripts_data.viewCategory){
        var script = favizone_cutsom_scripts_data.viewCategory;
        debugApplication("Found custom script to eval =", script);
        eval(script);
    }

    return {data:data, event:event,id:id};
}


/**
 * Description
 * @method widgetTracker
 * @return
 */
function widgetTracker(apiResponse) {

    var clickWidget = apiResponse["events"]["clickWidget"];
    var selector = clickWidget['selector'];
    var row = clickWidget['row'];
    var type = clickWidget['type'];
    var query = document.querySelectorAll(selector)[row];
    if (query) {
        var data = tracker.clickWidgetTracker();
        var selectorType = clickWidget['selectorType'];
        if (selectorType.toUpperCase() == "DOM") {
            data += getType(query, type);
        } else {
            data += favizone_helper.getUrl();
        }
        data += " 1 1 "+favizone_helper.getUrlParams()['favizone_widget_email'];
        return data;
    }
}

/**
 * Description
 * @method AddToCartTrackerExtern
 * @return
 */
function AddToCartTrackerExtern(str) {

    var event = tracker.addToCartTracker();
    var addToCartExtern = str['events']['tracker']['addToCartExtern'];
    var data = [];
    var idSelector = addToCartExtern['idSelector']['selector'];
    var idRow = addToCartExtern['idSelector']['row'];
    var idType = addToCartExtern['idSelector']['type'];
    var buttonSelector = addToCartExtern['buttonSelector'];
    var size = document.querySelectorAll(addToCartExtern['mainSelector']).length;
    var mainSelector = addToCartExtern['mainSelector'];
    if (size) {
        if (document.querySelectorAll(mainSelector)[0].className.indexOf('Favizone-') == -1) {
            for (var i=0;i<size;i++) {
                document.querySelectorAll(mainSelector)[i].className+=" Favizone-"+i;
            }
        }
    }

    var id = "";
    //var quantity = 1;
    var counter = 0;
    var idContent="";
    var el = document.querySelectorAll(buttonSelector);
    for (var i = 0 ; i < el.length; i++) {

        el[i].addEventListener(
            "click",
            function () {
                if(counter==0) {
                    var i=0;
                    var t="";
                    if (mainSelector.indexOf(".")!=-1) {
                        t = getParent(this, i, "class");
                    }
                    if (mainSelector.indexOf("#")!=-1) {
                        t = getParent(this, i, "id");
                    }
                    while(t.indexOf(mainSelector.substring(1, mainSelector.length))==-1){
                        i+=1;
                        t = getParent(this, i, "class");

                    }
                    var mystr = "."+getParent(this, i, "class");
                    counter+=1;
                    while( mystr.indexOf(" ") > -1) {
                                mystr = mystr.replace(" ", ".");
                    }
                    id = mystr+" "+idSelector;
                    idContent = getType(document.querySelectorAll(id)[idRow], idType).trim();
                    event += idContent;
                    event += " 1 1";
                    data.push(getType(document.querySelectorAll(id)[idRow],idType));
                    if (getCookie("favizone_cart")!="") {
                        var strcookie= getCookie("favizone_cart");
                        if (strcookie.indexOf(idContent)==-1) {
                            favizone_tracker_sender_onload({data:data, event:event, name:"addToCart"});
                            setCookie("favizone_cart", strcookie+"+"+idContent, 1);
                        }
                    } else {
                        document.cookie = "favizone_cart="+idContent+ "; path=/";
                        favizone_tracker_sender_onload({data:data, event:event, name:"addToCart"});
                    }

                }
            },
            false
        );
    }

    if(favizone_cutsom_scripts_data.addToCartExtern){
        var script = favizone_cutsom_scripts_data.addToCartExtern;
        debugApplication("Found custom script to eval =", script);
        eval(script);
    }
}


/**
 * Description
 * @method adding product to cart from a page other than product page
 * @return
 */
function addProductToCart(str , element){

    var id = "";
    var counter = 0;
    var idContent="";
    var event = tracker.addToCartTracker();
    var addToCartExtern = str['events']['tracker']['addToCartExtern'];
    var data = [];
    var idSelector = addToCartExtern['idSelector']['selector'];
    var idRow = addToCartExtern['idSelector']['row'];
    var idType = addToCartExtern['idSelector']['type'];
    var buttonSelector = addToCartExtern['buttonSelector'];
    var size = document.querySelectorAll(addToCartExtern['mainSelector']).length;
    var mainSelector = addToCartExtern['mainSelector'];
    if (size) {
        if (document.querySelectorAll(mainSelector)[0].className.indexOf('Favizone-') == -1) {
            for (var i=0;i<size;i++) {
                document.querySelectorAll(mainSelector)[i].className+=" Favizone-"+i;
            }
        }
    }
    var mainSelectorName = addToCartExtern['mainSelector'];
    var attributeType = mainSelectorName.indexOf("#")>0?"class":"id";
    var container = findParentNode(mainSelectorName, element, attributeType);
    if(container!=null){
        id = mainSelectorName+" "+idSelector;
        idContent = getType(container.querySelectorAll(id)[idRow], idType).trim();
        event += idContent;
        event += " 1 1";
        data.push(getType(container.querySelectorAll(id)[idRow],idType));
        if (getCookie("favizone_cart")!="") {
            var strcookie= getCookie("favizone_cart");
            if (strcookie.indexOf(idContent)<0) {
                favizone_tracker_sender_onload({data:data, event:event, name:"addToCart"});
                setCookie("favizone_cart", strcookie+"+"+idContent, 1);
            }
        } else {
            //document.cookie = "favizone_cart="+idContent;
            setCookie("favizone_cart", idContent, 1);
            favizone_tracker_sender_onload({data:data, event:event, name:"addToCart"});
        }
    }
}


/**
 * Description
 * @method AddToCartTrackerInner
 * @return
 */
function AddToCartTrackerInner(str) {

    var addToCartInner = str['events']['tracker']['addToCartInner']['idSelector'];
    var event = tracker.addToCartTracker();
    var id = "";
    var data = [];
    var shouldSend = false;

    var selector = addToCartInner['selector'];
    var row = addToCartInner['row'];
    var type = addToCartInner['type'];
    if(selector){
        var variable = document.querySelectorAll(selector)[row];
        if (variable) {
            event += getType(variable,type).trim()+" 1 1";
            id = getType(variable,type).trim();
            data.push(getType(variable,type).trim());
        }
        if (id) {
             event += id;
             event += " 1 1";
            if (getCookie("favizone_cart")!="") {
                if (getCookie("favizone_cart").indexOf(id)==-1) {
                    //favizone_tracker_sender_onload({data:data, event:event,name:"addToCart"});
                    setCookie("favizone_cart", getCookie("favizone_cart")+"+"+id, 1);
                    shouldSend = true;
                    //favizone_tracker_sender_onload({data:data, event:event,name:"addToCart"});
                }
            } else {
                document.cookie = "favizone_cart="+id+ "; path=/";
                shouldSend = true;
                //favizone_tracker_sender_onload({data:data, event:event,name:"addToCart"});
            }
        }
    } else {
        var id = favizone_helper.getUrl();
        event += id;
        event += " 1 1";
        if (getCookie("favizone_cart")!="") {
            if (getCookie("favizone_cart").indexOf(id)==-1) {
               // favizone_tracker_sender_onload({data:data, event:event,name:"addToCart"});
                setCookie("favizone_cart", getCookie("favizone_cart")+"+"+id, 1);
                shouldSend = true;
               // favizone_tracker_sender_onload({data:data, event:event,name:"addToCart"});
            }
        } else {
            //document.cookie = "favizone_cart="+id;
            setCookie("favizone_cart", id, 1);
            shouldSend = true;
           // favizone_tracker_sender_onload({data:data, event:event,name:"addToCart"});
        }
    }
       
         
    if(favizone_cutsom_scripts_data.addToCartInner){
        var script = favizone_cutsom_scripts_data.addToCartInner;
        debugApplication("Found custom script to eval =", script);
        eval(script);
    }

    if(shouldSend){
        favizone_tracker_sender_onload({data:data, event:event,name:"addToCart"});
    }
}
/**
 * Description
 * @method click
 * @return
 */
function click() {
    //setCookie("favizoneRecommendationClick", "true", 1);
   if (getCookie("favizoneRecommendationClick")!="") {
        setCookie("favizoneRecommendationClick", "true", 1);
    } else {
        document.cookie = "favizoneRecommendationClick=true"+ "; path=/";
    }
}

/**
 * Description
 * @method doSearchTracker
 * @return
 */
function doSearchTracker(str) {

    var doSearch = str["events"]["tracker"]["doSearch"]["query"];
    var selectorType = doSearch['selectorType'];
    var data = {};
    var event = tracker.doSearchTracker();
    if (selectorType == "DOM") {
        var selector = doSearch['selector'];
        var row = doSearch['row'];
        var type = doSearch['type'];
        var query = document.querySelectorAll(selector)[row];
        if (query) {
            var inter = getType(query, type).trim();
            while (inter.indexOf(' ')!=-1) {
                inter = inter.replace(' ','+');
            }
            event += inter;
            data['custom_event_value'] = inter;
        } else {
            event = "";
        }

    } else {
        var urlField = doSearch["urlField"];
        if (urlField) {
            event += favizone_helper.getUrlParams()[urlField];
            data['custom_event_value'] = favizone_helper.getUrlParams()[urlField];
        } else {
            event += favizone_helper.getUrl();
            data['custom_event_value'] = favizone_helper.getUrl();
        }
    }
    if (event) {
        event += " 1 1";
        data['custom_event_key'] = "doSearch";
        favizone_tracker_sender_onload({data:data, event:event, name:"doSearch"});
    }
}
/**
 * Description
 * @method LoginUserTracker
 * @return
 */
function LoginUserTracker(str) {

    //setCookie("favizone_loginUser", "true", 1);
    var loginUser = str["events"]["tracker"]["loginUser"];
    var data = {"session_id": favizone_utilities.connectionIdentifier()};
    var size = Object.keys(loginUser).length;
    var event = tracker.loginUser();
    for (var i=0;i<size;i++) {
        var key = Object.keys(loginUser)[i];
        if(typeof(loginUser[key])==Object||typeof(loginUser[key])=="object"){
           var selectorType = loginUser[key]["selectorType"].toUpperCase();
            if (selectorType == "DOM") {
                var selector = loginUser[key]["selector"];
                var row = loginUser[key]["row"];
                var type = loginUser[key]["type"];
                var variable = document.querySelectorAll(selector)[row];
                if (variable) {
                    data[key] = getType(variable,type).trim();
                }

            } else {
                var urlField = viewCategory[key]["urlField"];
                if (urlField) {
                    if (favizone_helper.getUrlParams()[urlField]) {
                        data[key] = favizone_helper.getUrlParams()[urlField];
                    }
                } else {
                    data[key] = favizone_helper.getUrl();
                }
            }
        }

    }
    return {data:data, event:event};
}
/**
 * Description
 * @method OrderDetails
 * @return
 */
function OrderDetails(str) {

    var orderDetails = str['events']['tracker']['orderDetails'];
    var mainSelector = orderDetails['mainSelector'];
    var priceSelector = orderDetails['priceSelector']['selector'];
    var priceType = orderDetails['priceSelector']['type'];
    var idSelector = orderDetails['idSelector']['selector'];
    var idType = orderDetails['idSelector']['type'];
    var qteSelector = orderDetails['qteSelector']['selector'];
    var qteType = orderDetails['qteSelector']['type'];
    var orderSize = document.querySelectorAll(mainSelector+" "+priceSelector).length;
    var getPrice = document.querySelectorAll(mainSelector+" "+priceSelector);
    var detail = "";

    var identifier;
    for (var i=0; i<orderSize; i++) {
        identifier = getType(document.querySelectorAll(mainSelector+" "+idSelector)[i], idType);
        detail += identifier+"*"+getType(document.querySelectorAll(mainSelector+" "+qteSelector)[i], qteType).trim()+"*"+getType(document.querySelectorAll(mainSelector+" "+priceSelector)[i], priceType).trim();
        if (i<orderSize-1) {
            detail += "fz#";
        }
    }
    debugApplication("In OrderDetails method detail =", detail);
    if(favizone_cutsom_scripts_data.orderDetails){
        var script = favizone_cutsom_scripts_data.orderDetails;
        debugApplication("Found custom script to eval =", script);
        eval(script);
    }


    if (getCookie("favizoneOrderDetail")!="") {
        setCookie("favizoneOrderDetail", detail, 1);
    } else {
        setCookie("favizoneOrderDetail", detail, 1);
        //document.cookie ="favizoneOrderDetail="+detail;
    }
    //setCookie("favizoneOrderDetail", detail, 1);
   /* if(favizone_cutsom_scripts_data.orderDetails){
        var script = favizone_cutsom_scripts_data.orderDetails;
        debugApplication("Found custom script to eval =", script);
        eval(script);
    }*/
}
/**
 * Description
 * @method Purchase
 * @return
 */
function Purchase() {

    var events = [];
    var data = {};
    var orders_data = [];
    var object = "";
    var secondListSize = [];
    var event = tracker.confirmOrderTracker();
    var products = getCookie("favizoneOrderDetail").trim().split("fz#");
    var size = getCookie("favizoneOrderDetail").split("fz#").length;
    for(var i=0;i<size;i++){
        secondListSize = products[i].toString().split("*");
        if(secondListSize[1]){
            object = event + " confirm" + " "+ secondListSize[0] + " "+ secondListSize[2] + " "+ secondListSize[1];
            events.push(object);
        }
    }
    setCookie("favizoneOrderDetail", "", 1);
    setCookie("favizone_cart", "", 1);
    //customer
    if(favizone_tagging_events_data["loginUser"] && favizone_tagging_events_data["loginUser"]["events"]){
        var customerData = LoginUserTracker(favizone_tagging_events_data["loginUser"]);
        if(customerData && customerData.data){
            data.custom_event_value = customerData.data;
        }
    }
    
    //customSript
    if(favizone_cutsom_scripts_data.confirm){
        var script = favizone_cutsom_scripts_data.confirm;
        debugApplication("Found custom script to eval =", script);
        eval(script);
    }
    favizone_tracker_sender_onload({data:data, event:events,name:"purchase"});
}


/**
 * Description
 * @method favizone_events_tracker
 * @return events
 */
function favizone_events_tracker () {

    var events = {
        /**
         * Description
         * @method loginUser
         * @return eventData
         */
        loginUser: function() {
            var eventData = favizone_utilities.testingVersion();
            eventData += " "+ favizone_utilities.connectionIdentifier();
            eventData += " loginUser 1 1 1";
            return eventData;

        },
        /**
         * Description
         * @method click
         * @return eventData
         */
        click: function() {
            var eventData = favizone_utilities.testingVersion();
            eventData += " "+ favizone_utilities.connectionIdentifier();
            eventData += " click ";
            return eventData;

        },
        /**
         * Description
         * @method click form chatbot
         * @return eventData
         */
        clickBot: function() {
            var eventData = favizone_utilities.testingVersion();
            eventData += " "+ favizone_utilities.connectionIdentifier();
            eventData += " clickBot ";
            return eventData;

        },
        /**
         * Description
         * @method visitTracker
         * @return eventData
         */
        visitTracker: function() {
            var eventData = favizone_utilities.testingVersion();
            eventData += " "+ favizone_utilities.connectionIdentifier();
            eventData += " visit";
            eventData += " 1 1 1";
            return eventData;
        },
        /**
         * Description
         * @method viewProductTracker
         * @return eventData
         */
        viewProductTracker: function() {
            var eventData = favizone_utilities.testingVersion();
            eventData += " "+ favizone_utilities.connectionIdentifier();
            eventData += " viewProduct ";
            return eventData;
        },
        /**
         * Description
         * @method viewCategoryTracker
         * @return eventData
         */
        viewCategoryTracker: function() {
            var eventData = favizone_utilities.testingVersion();
            eventData += " "+ favizone_utilities.connectionIdentifier();
            eventData += " viewCategory ";
            return eventData;
        },
        /**
         * Description
         * @method doSearchTracker
         * @return eventData
         */
        doSearchTracker: function() {
            var eventData = favizone_utilities.testingVersion();
            eventData += " "+ favizone_utilities.connectionIdentifier();
            eventData += " doSearch ";
            return eventData;
        },
        /**
         * Description
         * @method clickWidgetTracker
         * @return eventData
         */
        clickWidgetTracker: function() {
            var eventData = favizone_utilities.testingVersion();
            eventData += " "+ favizone_utilities.connectionIdentifier();
            eventData += " clickWidget";
            eventData += " "+favizone_helper.getUrlParams()['favizone_widget_email'];
            eventData += " 1 1";
            return eventData;
        },

        /**
         * Description
         * @method campaignTracker
         * @return eventData
         */
        campaignTracker: function() {
            var eventData = favizone_utilities.testingVersion();
            eventData += " "+ favizone_utilities.connectionIdentifier();
            eventData += " searchCampaign";
            eventData += " "+favizone_helper.getUrlParams()['favizone'];
            eventData += " 1 1";
            return eventData;
        },
        /**
         * Description
         * @method addToCartTracker
         * @return eventData
         */
        addToCartTracker: function() {
            var eventData = favizone_utilities.testingVersion();
            eventData += " "+ favizone_utilities.connectionIdentifier();
            eventData += " addToCart ";
            return eventData;

        },
        /**
         * Description
         * @method confirmOrderTracker
         * @return eventData
         */
        confirmOrderTracker: function() {
            var customer = {languages:[]};
            var orders_data = [];
            var eventData = favizone_utilities.testingVersion();
            eventData += " "+ favizone_utilities.connectionIdentifier();
            return eventData;
        }
    }
    return events
}

/**
 * Description
 * @method favizone_helper_config
 * @return ObjectExpression
 */
function favizone_helper_config(){

    return {
         /**
         * Description
         * @method getCookie
         * @param {} cname
         * @return
         */
        getCookie : function(cname) {
            if (cname == 'favizone_'+favizone_server_parameters.shop) {
                document.cookie
            }
            var name = cname + "=";
            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);
                if (c.indexOf(name) == 0) return c.substring(name.length,c.length);
            }
            return null;
        },
        /**
         * Description
         * @method setCookie
         * @param {} cname
         * @param {} cvalue
         * @return
         */
        setCookie: function(cname, cvalue) {
            var cookieStr = cname + "=" + cvalue+"; " ;
            if(cvalue.length==0){
               cookieStr += "expires=Thu, 01-Jan-70 00:00:01 GMT" + "; ";
            }
            else {
                var today = new Date();
                expires = new Date(today.getTime() + 365 * 24 * 60 * 60 * 1000);
                expires = expires.toGMTString();
                cookieStr += "expires=" + expires + "; ";
            }
            document.cookie = cookieStr+ "; path=/";
            /*if ((cname == 'favizone_'+favizone_server_parameters.shop || cname == 'favizone_AB_'+favizone_server_parameters.shop) && (navigator.appVersion.indexOf("MSIE") == -1)) {


                var now = new Date();
                var time = now.getTime();
                var expireTime = time + (365*24*60*60*1000);
                now.setTime(expireTime);
                document.cookie = cname + "=" + cvalue +";expires="+now.toGMTString()+"; path=/";
            } else {
                document.cookie = cname + "=" + cvalue +  "; path=/";
            }*/
        },
        /**
         * Description
         * @method getUrlParams
         * @return vars
         */
        getUrlParams: function() {
            var vars = {};
            var parts = window.parent.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi,
            function(m, key, value) {
                vars[key] = value;
            });
            return vars;
        },
        getUrl: function() {
            return window.parent.location.href;
        },
        /**
         * Description
         * @method insertUrlParam
         * @param {} paramName
         * @param {} paramValue
         * @return url
         */
        insertUrlParam: function(paramName, paramValue) {
            var url = window.location.href;
            var hash = location.hash;
            url = url.replace(hash, '');
            if (url.indexOf(paramName + "=") >= 0) {
                var prefix = url.substring(0, url.indexOf(paramName));
                var suffix = url.substring(url.indexOf(paramName));
                suffix = suffix.substring(suffix.indexOf("=") + 1);
                suffix = (suffix.indexOf("&") >= 0) ? suffix.substring(suffix.indexOf("&")) : "";
                url = prefix + paramName + "=" + paramValue + suffix;
            } else {
                if (url.indexOf("?") < 0)
                    url += "?" + paramName + "=" + paramValue;
                else
                    url += "&" + paramName + "=" + paramValue;
            }
            return url;
        },
        /**
         * Description
         * @method evalScripts
         * @param {} html_element
         * @return
         */
        evalScripts: function(html_element) {
            var favizone_scripts =  html_element.getElementsByTagName('script')
            for (var n = 0; n < favizone_scripts.length; n++)
                eval(favizone_scripts[n].innerHTML);
        },
        postProcessEvents : function(event) {
            var url = favizone_server_parameters.server+favizone_api_parameters.GTMevents.replace('<event>', event);
            if (typeof(favizone_helper) != "undefined") {
                var xhttp = new XMLHttpRequest();
                xhttp.open("POST", url, false);
                xhttp.setRequestHeader("Content-type", "application/json");
                xhttp.setRequestHeader("Authorization", "Basic " + favizone_server_parameters.applicationKey);
                xhttp.send();
                var response = JSON.parse(xhttp.responseText);
                return(response);
            }
        },
        /**
         * Description
         * @method postProcess
         * @param {} parameters
         * @param {} operation
         * @return
         */
        postProcess : function(parameters, operation) {
            if (typeof(favizone_helper) != "undefined") {
                var request = new XMLHttpRequest();
                request.open('POST', parameters.url, true);
                /**
                 * Description
                 * @method onreadystatechange
                 * @return
                 */
                request.onreadystatechange = function() {
                    if (request.readyState == 4) {
                        if ( request.status == 200) {
                            switch (operation) {
                                case "preview":
                                var preview_element = window.parent.document.getElementById("favizone_preview");
                                preview_element.innerHTML = request.responseText;
                                favizone_helper.evalScripts(preview_element);
                                break;
                                case "renderer":
                                favizone_helper.contentInner(JSON.parse(request.responseText));
                                break;
                                default :
                                return JSON.parse(request.responseText);
                                break;
                            }
                        }
                    }
                };
                var params = JSON.stringify(parameters.data);
                request.setRequestHeader("Content-type", "application/json");
                //request.setRequestHeader("Content-length", params.length);
                request.setRequestHeader("Authorization", "Basic " + favizone_server_parameters.applicationKey);
                //request.setRequestHeader("Connection", "close");
                request.timeout = 5000;
                /**
                 * Description
                 * @method ontimeout
                 * @return
                 */
                request.ontimeout = function() {}
                request.send(params);
            }
        },
        /**
         * Description
         * @method htmlValue
         * @param {} identifier
         * @return Literal
         */
        htmlValue: function(identifier) {
            if (window.parent.document.getElementById(identifier))
                return window.parent.document.getElementById(identifier).innerHTML;
            return null
        },
        /**
         * Description
         * @method getRandomInt
         * @param {} min
         * @param {} max
         * @return CallExpression
         */
        getRandomInt: function(min, max) {
            return Math.floor(Math.random() * (max - min + 1) + min);
        },
        /**
         * Description
         * @method renderingData
         * @param {} canal
         * @param {} value
         * @return
         */
        renderingData: function(canal, value) {
            if (typeof(favizone_helper) != "undefined") {
                var url = favizone_server_parameters.server+favizone_api_parameters.renderer.replace('<canal>', canal);
                var connection_identifier = favizone_utilities.connectionIdentifier();
                var testing_version = favizone_utilities.testingVersion();
                var event_params = {version:testing_version,session:connection_identifier}
                var parameters = {url:url,data:{cart:favizone_utilities.cartContent(),event_params:event_params, session:connection_identifier}};
                if (favizone_helper.getCookie('favizone_preview') && favizone_helper.getCookie('favizone_preview') == "true")
                    parameters.data["favizone_preview"] = true;
                if (canal == "product"){

                    parameters.data["product"] = value;
                }

                if (canal == "category")
                    parameters.data["category"] = value;
                if (canal == "search")
                    parameters.data["search"] = value;
                //campaign
                if (favizone_helper.getUrlParams()['favizone'])
                    parameters.data["campaign"] = decodeURIComponent(favizone_helper.getUrlParams()['favizone']);
                if (favizone_helper.htmlValue("favizone_category_identifier"))
                    parameters.data["category"] = value;
                return parameters;
            } else
                return {};
        },
        /**
         * Description
         * @method contentInner
         * @param {} result
         * @return
         */
         /* a refaire */
        contentInner:function  (result) {
            for (var key in result) {

               var section = document.querySelector(result[key].container);

                if (section) {
                    section.innerHTML += result[key].template;
                    //Eval scripts if exist
                    if (typeof(favizone_helper)!="undefined")
                        favizone_helper.evalScripts(section);
                    //Binding events
                    var  click;
                    var elements = [];
                    if (window.parent.document.getElementById(key))
                        elements = window.parent.document.getElementById(key).querySelectorAll("[data-context=favizone]");
                    for (var i = 0; i<elements.length; i++) {
                        try{
                            click = window.parent.document.createAttribute("onclick");
                            click.nodeValue = "favizoneClickEvent(this, '"+key+"');";
                            elements[i].setAttributeNode(click);
                        } catch(error) {}
                    }
                }
            }
        }
    }
}

/**
 * Description
 * @method favizoneClickEvent
 * @param {} param
 * @param {} key
 * @return Literal
 */
function favizoneClickEvent(param, key) {

    favizone_helper.setCookie("favizone_id_product",param.getAttribute("favizone-ref"));
    favizone_helper.setCookie("favizone_id_recommendor",key);
    return true;
}


/**
 * Description
 * @method favizone_utilities_config
 * @return ObjectExpression
 */
function favizone_utilities_config() {
    return {
        /**
         * Description
         * @method connectionIdentifier
         * @return identifier
         */
        connectionIdentifier: function() {
            var identifier = favizone_helper.getCookie('favizone_'+favizone_server_parameters.shop);
            if (!identifier && typeof(localData) != "undefined")
                identifier = localData;
            if (!identifier) {
                var url = favizone_server_parameters.server+favizone_api_parameters.profile;
                var request = new XMLHttpRequest();
                request.open('POST', url , false);
                /**
                 * Description
                 * @method onreadystatechange
                 * @return
                 */
                request.onreadystatechange = function() {
                    if (request.readyState == 4) {
                        if ( request.status == 200) {
                            var result = JSON.parse(request.responseText);
                            if (result.identifier) {
                                identifier = result.identifier;
                                favizone_helper.setCookie('favizone_'+favizone_server_parameters.shop, result.identifier);
                                if (navigator.appVersion.indexOf("MSIE") != -1) {
                                    localData = result.identifier;
                                }
                                favizone_events.push(tracker.visitTracker());
                                return identifier;
                            }
                        }
                    }
                };
                var params = JSON.stringify({key:favizone_server_parameters.applicationKey,origin:favizone_server_parameters.site});
                request.setRequestHeader("Content-type", "application/json");
                //request.setRequestHeader("Content-length", params.length);
                request.setRequestHeader("Authorization", "Basic " + favizone_server_parameters.applicationKey);
                //request.setRequestHeader("Connection", "close");
                /**
                 * Description
                 * @method ontimeout
                 * @return
                 */
                request.ontimeout = function () {}
                request.send(params);
            }
            return identifier;
        },
        /**
         * Description
         * @method testingVersion
         * @param {} argument
         * @return version
         */
        testingVersion: function(argument) {
            var version = 'N';
            if (!favizone_helper.getCookie('favizone_'+favizone_server_parameters.shop)) {
                //new user
                if (favizone_server_parameters.abTest) {
                    //A/B test is ON
                    var status = favizone_helper.getRandomInt(0,1);
                    if (status == 0)
                        version = "A";
                    else
                        version = "B";

                }
                favizone_helper.setCookie('favizone_AB_'+favizone_server_parameters.shop, version);
            } else {
                //old user
                if (favizone_server_parameters.abTest) {
                    //A/B test is ON
                    if ( 'N' == favizone_helper.getCookie('favizone_AB_'+favizone_server_parameters.shop)) {
                        var status = favizone_helper.getRandomInt(0,1);
                        if (status == 0)
                            version = "A";
                        else
                            version = "B";
                        favizone_helper.setCookie('favizone_AB_'+favizone_server_parameters.shop, version);
                        //visit event
                        favizone_events.push(tracker.visitTracker()) ;
                    } else {
                        if (!favizone_helper.getCookie('favizone_AB_'+favizone_server_parameters.shop)) {
                                var status = favizone_helper.getRandomInt(0,1);
                                if(status == 0)
                                    version = "A";
                                else
                                    version = "B";
                                favizone_helper.setCookie('favizone_AB_'+favizone_server_parameters.shop, version);
                        }
                        version = favizone_helper.getCookie('favizone_AB_'+favizone_server_parameters.shop);
                    }
                }
        }
        if (version!=favizone_helper.getCookie('favizone_AB_'+favizone_server_parameters.shop))
            favizone_helper.setCookie('favizone_AB_'+favizone_server_parameters.shop, version);
        return version;
        },
        /**
         * Description
         * @method cartContent
         * @return cart_data
         */
        cartContent: function() {
            var cart, cart_data = [];
            cart = favizone_helper.getCookie("favizone_cart");
            if (!cart)
                cart = "";
            cart = cart.split('+');
            for (var c in cart) {
                if (cart[c]!="")
                    cart_data.push(cart[c]);
            };
            return cart_data;
        },
        /**
         * Description
         * @method insertPreviewSection
         * @param {} argument
         * @return
         */
        insertPreviewSection: function(argument) {
            d = window.parent.document.createElement("div");
            d.id = "favizone_preview";
            window.parent.document.body.insertBefore(d, window.parent.document.body.firstChild);
            var data = {store:"5a0c5e19e4b0b104a0989210"};
            if (favizone_helper.getUrlParams()['favizonevalidate']) {
                if (!favizone_helper.getCookie('favizonevalidate')) {
                    favizone_helper.setCookie('favizonevalidate', favizone_helper.getUrlParams()['favizonevalidate']);
                }
                data['validate'] = favizone_helper.getUrlParams()['favizonevalidate'];
            }
            if (favizone_helper.getCookie('favizonevalidate')) {
                data['validate'] = favizone_helper.getCookie('favizonevalidate');
            }
            favizone_helper.postProcess({url:favizone_server_parameters.server+favizone_api_parameters.preview,data:data}, "preview");
        }
    }
}

/**
 * Description
 * @method event_sender
 * @return
 */
function event_sender(){

    if(!favizone_events_data.session)
        favizone_events_data.session = favizone_utilities.connectionIdentifier();
    if (favizone_events.length>0) {
        var data={events:favizone_events};
        for (var key in favizone_events_data) data[key]=favizone_events_data[key];
        favizone_helper.postProcess({data:data, url:favizone_server_parameters.server+favizone_api_parameters.tracker});
    }

}
/**
 * Description
 * @method favizone_tracker_sender
 * @param {} data
 * @return
 */
function favizone_tracker_sender(data){

    favizone_events = [];
    favizone_events_data = {};
    var connectionIdentifier = favizone_utilities.connectionIdentifier();
    if(connectionIdentifier != null){
        if (data['name'] == "addToCart") {
            favizone_events.push(data['event']);
            favizone_events_data.cart=data['data'];
        } else if (data['name'] == "purchase") {
            favizone_events = data['event'];
            if(data['data']['custom_event_value'])
                favizone_events_data.custom_event_value = data['data']['custom_event_value'];
            //favizone_events_data.cart=data['data'];

        } else {
            //doSearch
            favizone_events_data.custom_event_value=data['data']['custom_event_value'];
            favizone_events_data.custom_event_key=data['data']['custom_event_key'];
            favizone_events.push(data['event']);

        }
        event_sender();
    }
}
/**
 * Description
 * @method favizone_tracker_sender_onload
 * @param {} data
 * @return
 */
function favizone_tracker_sender_onload(data) {
    /**** CALL OF TRACKER METHOD ****/
    if (data == "") {
        var viewProductcontext = "";
        var viewCategorycontext = "";
        var loginUsercontext = "";
        var cartContext = "";
        //identification of the context
        if (favizone_event_identifier.viewProduct)
            viewProductcontext = document.querySelector(favizone_event_identifier.viewProduct);
        if (favizone_event_identifier.viewCategory)
            viewCategorycontext = document.querySelector(favizone_event_identifier.viewCategory);
        if (favizone_event_identifier.loginUser)
            loginUsercontext = document.querySelector(favizone_event_identifier.loginUser);
         if (favizone_event_identifier.cart)
            cartContext = document.querySelector(favizone_event_identifier.cart);
        if(cartContext){
            debugApplication("orderDetails context ", "");
            OrderDetails(favizone_tagging_events_data["orderDetails"]);
        }
        if (viewProductcontext) {
            debugApplication("viewProductcontext ", "");
            //var interVar =favizone_helper.postProcessEvents("viewProduct");
            var interVar = favizone_tagging_events_data["viewProduct"];

            if (Object.keys(interVar).length != 0) {
                var clickEvent="";
                var idRecommendor = "";
                var response = productTracker(interVar);



                /*if (getCookie("favizoneRecommendationClick")=="true") {
                    setCookie("favizoneRecommendationClick", "false", 1);
                    clickEvent = tracker.click();


                } else if(getCookie("favizoneRecommendationClick")=="") {
                    document.cookie = "favizoneRecommendationClick=false";
                }*/
                if(getCookie("favizone_id_recommendor")){
                    //debugApplication("click on recommendations ", "");
                    if(getCookie("favizone_id_product")){
                       clickEvent = tracker.click();
                       idRecommendor = getCookie("favizone_id_recommendor");
                       setCookie("favizone_id_recommendor", "", 1);
                       setCookie("favizone_id_product", "", 1);
                    }
                }

                if (clickEvent!="") {
                    favizone_events.push(clickEvent+response['id']+" 1 1 "+idRecommendor);
                }
                
                if(favizone_helper.getUrlParams()['favizone_rec']){
                    favizone_events.push(tracker.clickBot()+response['id']+" 1 1 "+favizone_helper.getUrlParams()['favizone_rec']);
                }
                if(response['event'])
                    favizone_events.push(response['event']);
                favizone_events_data.product = response['data'];

            }
        }
        if (viewCategorycontext) {
            debugApplication("viewCategorycontext ", "");
            //var interVar =favizone_helper.postProcessEvents("viewCategory");
            var interVar = favizone_tagging_events_data["viewCategory"];
            var response = categoryTracker(interVar);
            if (Object.keys(interVar).length != 0) {
                favizone_events.push(response['event']);
                favizone_events_data.category = response['data'];
                favizone_events_data.custom_event_key = "viewCategory";
                favizone_events_data.custom_event_value = response['id'];
            }
        }
        if (loginUsercontext) {
            debugApplication("loginUsercontext ", "");
            if (getCookie("favizone_loginUser")=="") {
                //var interVar =favizone_helper.postProcessEvents("loginUser");
                var interVar = favizone_tagging_events_data["loginUser"];
                var response = LoginUserTracker(interVar);
                favizone_events_data.custom_event_value = response['data'];
                favizone_events.push(response['event']);
            }
        }

        //campaign
        if(favizone_helper.getUrlParams()['favizone']){
            debugApplication("campaign from url ", "");
            favizone_events.push(tracker.campaignTracker());
            favizone_events_data.search_campaign_value = favizone_helper.getUrlParams()['favizone'];
        }
        //user coming from FB messenger
        if(favizone_helper.getUrlParams()['fz_p']){
            debugApplication("user coming from FB messenger ", "");
            favizone_events_data.favizone_facebook_profile = favizone_helper.getUrlParams()['fz_p'];
        }
        if(favizone_helper.getUrlParams()['favizone_widget_email']){
            debugApplication("favizone_widget_email from url ", "");
            favizone_events.push(tracker.clickWidgetTracker());
        }
        if(favizone_events.length>0)
            event_sender();
        //Binding Events
        bindEvents(favizone_event_identifier);
       
    } else {
        favizone_tracker_sender(data);
    }
}

/**
 * Description
 * @method favizone_preview
 * @return
 */
function favizone_preview() {

    var url_params = favizone_helper.getUrlParams();
    if (url_params["favizone_preview"] && url_params["favizone_preview"] == "true") {
        favizone_helper.setCookie('favizone_preview', "true");
    } else {
        if (url_params["favizone_preview"] == "false") {
            favizone_helper.setCookie('favizone_preview', "");
            if (favizone_helper.getCookie('favizonevalidate'))
                favizone_helper.setCookie('favizonevalidate', "");
        }
    }
    //debug  mode
    if (favizone_helper.getCookie('favizone_preview') && favizone_helper.getCookie('favizone_preview') == "true") {
        favizone_utilities.insertPreviewSection();
    }
}


function bindEvents(dataStructure){

    if(dataStructure.addToCartExtern){
       //add to cart extern
        var addToCartButtons = document.querySelectorAll(dataStructure.addToCartExtern);
        if(addToCartButtons!= null && addToCartButtons.length>0){
            //var externalCartData =favizone_helper.postProcessEvents("addToCartExtern");
            var externalCartData = favizone_tagging_events_data["addToCartExtern"];
            for (var buttons in addToCartButtons) {
                if(typeof(addToCartButtons[buttons].addEventListener)=="function"){
                  addToCartButtons[buttons].addEventListener('click', function(event) {
                    debugApplication("addToCartExtern", this);
                    addProductToCart(externalCartData, this);
                  });
                }
            }
        } 
    }
    
    if(dataStructure.addToCartInner){
        //add to cart inner
        var addToCartButton = document.querySelector(dataStructure.addToCartInner);
        debugApplication("addToCartInner binded", "");
        if(addToCartButton!=null){
            //var internalCartData =favizone_helper.postProcessEvents("addToCartInner");
            var internalCartData = favizone_tagging_events_data["addToCartInner"];
            addToCartButton.addEventListener('click', function(event) {
                debugApplication("addToCartInner", this);
                AddToCartTrackerInner(internalCartData);
            });
        }
    }


    //search
    var searchData = favizone_tagging_events_data.doSearch;
    if(searchData){
        if(searchData.events.tracker.doSearch.triggerType == "onload"){
             doSearchTracker(searchData);
        }
        if(searchData.events.tracker.doSearch.triggerType == "onclick"){
            var search_button = searchData.events.tracker.doSearch.triggerSelector;
            search_button = document.querySelector(search_button);
            if(search_button!=null){
                search_button.addEventListener('click', function(event) {
                    debugApplication("doSearch event", this);
                    doSearchTracker(searchData);
                });
            }
        }
    }
    //order confirmation
    var orderData = favizone_tagging_events_data.confirm;
    if(orderData){
        if(orderData.events.tracker.confirm.triggerType == "onload"){
            var contextUrl =  orderData.events.tracker.confirm.contextUrl;
            if(contextUrl && contextUrl.length>0){
                var parameters = orderData.events.tracker.confirm.contextUrlExclude;
                var shouldSend = false;
                if(window.location.href.indexOf(contextUrl)>=0){
                    shouldSend = true;
                    if(parameters && parameters.length>0){
                        parameters = parameters.split("fz#"); 
                        for(var p in parameters){
                            if(window.location.href.indexOf(parameters[p])>=0)
                                shouldSend = false;
                        }
                    }
                }
                debugApplication("shouldSend == ", shouldSend);
                if(shouldSend)
                    Purchase();
            } else{
                var order_selector = orderData.events.tracker.confirm.mainSelector;
                order_selector = document.querySelector(order_selector);
                debugApplication("order_selector ", order_selector);
                if(order_selector!=null)
                    Purchase();
            }  
        }
        if(orderData.events.tracker.confirm.triggerType == "onclick"){
            var order_button = orderData.events.tracker.confirm.triggerSelector;
            order_button = document.querySelector(order_button);
            if(order_button!=null){
                order_button.addEventListener('click', function(event) {
                    debugApplication("confirm", this);
                    Purchase();
                });
            }
        }
    }
}

/**
 * Description
 * @method favizone_tracker_handler
 * @return
 */
function favizone_tracker_handler(){
    var connectionIdentifier = favizone_utilities.connectionIdentifier();
    if (connectionIdentifier != null) {
        favizone_preview();
        favizone_tracker_sender_onload("");
    }
}
/**
 * Description
 * @method selectorQuery
 * @param {} data
 * @param {} size
 * @return Literal
 */
function selectorQuery(data, size){
  if (size>0) {
    for (var i=0;i<size;i++) {
      var key = Object.keys(data)[i];
      if (data[key]["selector"]!="") {
        var selector = data[key][Object.keys(data[key])[0]];
        var row = data[key][Object.keys(data[key])[1]];
        var variable = document.querySelectorAll(selector)[row];
        if (variable) {
          return {response:variable};
        }
      }
    }
  }
  return "";
}
/**
 * Description
 * @method favizone_content_renderer
 * @param {} argument
 * @return renderer
 */
function favizone_content_renderer (argument) {

  var renderer = {

    /**
     * Description
     * @method homeRenderer
     * @param {} argument
     * @return 
     */
    homeRenderer: function(argument) {
      favizone_helper.postProcess(favizone_helper.renderingData("home", argument), "renderer");
    },
    /**
     * Description
     * @method productRenderer
     * @param {} argument
     * @return 
     */
    productRenderer: function(argument) {
      favizone_helper.postProcess(favizone_helper.renderingData("product", argument), "renderer");
    },
    /**
     * Description
     * @method categoryRenderer
     * @param {} argument
     * @return 
     */
    categoryRenderer: function(argument) {
      favizone_helper.postProcess(favizone_helper.renderingData("category", argument), "renderer");
    },
    /**
     * Description
     * @method cartRenderer
     * @param {} argument
     * @return 
     */
    cartRenderer: function(argument) {
      favizone_helper.postProcess(favizone_helper.renderingData("cart", argument), "renderer");
    },
    /**
     * Description
     * @method searchRenderer
     * @param {} argument
     * @return 
     */
    searchRenderer: function(argument) {
      favizone_helper.postProcess(favizone_helper.renderingData("search", argument), "renderer");
    },
    /**
     * Description
     * @method errorRenderer
     * @param {} argument
     * @return 
     */
    errorRenderer: function(argument) {
      favizone_helper.postProcess(favizone_helper.renderingData("error", argument), "renderer");
    },
    /**
     * Description
     * @method otherRenderer
     * @param {} argument
     * @return 
     */
    otherRenderer: function(argument) {
      favizone_helper.postProcess(favizone_helper.renderingData("others", argument), "renderer");
    }
  }
  return renderer
}

/**
 * Description
 * @method favizone_renderer_manager
 * @return 
 */
function favizone_renderer_manager() {
  
  var testing_version = favizone_utilities.testingVersion();
  
  if (testing_version == "B" || testing_version == 'N') {
    //identification of the context
      var homecontext = "";
      var viewProduct = "";
      var viewCategory = "";
      var cartcontext = "";
      var errorcontext = "";
      var searchcontext = "";
      if (favizone_event_identifier.home)
          homecontext = document.querySelector(favizone_event_identifier.home);
        if (favizone_event_identifier.viewProduct)
          viewProduct = document.querySelector(favizone_event_identifier.viewProduct);
        if (favizone_event_identifier.viewCategory)
          viewCategory = document.querySelector(favizone_event_identifier.viewCategory);
        if (favizone_event_identifier.cart)
          cartcontext = document.querySelector(favizone_event_identifier.cart);
      if (favizone_event_identifier.error)
          errorcontext = document.querySelector(favizone_event_identifier.error);
        if (favizone_event_identifier.search)
          searchcontext = document.querySelector(favizone_event_identifier.search);

        if (homecontext || viewProduct || viewCategory || cartcontext || errorcontext || searchcontext) {
          if (homecontext) {
           // var interVar =favizone_helper.postProcessEvents("home");
            var interVar = favizone_tagging_events_data["home"];
            if (Object.keys(interVar).length != 0) {
              var data = interVar["events"]["renderer"]['home'];
              var size = Object.keys(data).length;
              renderer.homeRenderer(selectorQuery(data, size)['response']);
            }
          }
          if (viewProduct) {
           // var interVar =favizone_helper.postProcessEvents("product");
            var interVar = favizone_tagging_events_data["product"];

            if (typeof(interVar)!='undefined' && Object.keys(interVar).length != 0) {
              var data = interVar["events"]["renderer"]['product'];
          var size = Object.keys(data).length;
          //renderer.productRenderer(selectorQuery(data, size)['response']);
          renderer.productRenderer(favizone_events_data['product']['identifier']);
            }
          }
          if (viewCategory) {
            //var interVar =favizone_helper.postProcessEvents("category");
            var interVar = favizone_tagging_events_data["category"];
            if (typeof(interVar)!='undefined' && Object.keys(interVar).length != 0) {
              var data = interVar["events"]["renderer"]['category'];
          var size = Object.keys(data).length;
          //renderer.categoryRenderer(selectorQuery(data, size)['response']);
            renderer.categoryRenderer(favizone_events_data['category']['idCategory']);
            }
          }
          if (cartcontext) {
            //var interVar =favizone_helper.postProcessEvents("cart");
            var interVar = favizone_tagging_events_data["cart"];
            if (typeof(interVar)!='undefined' && Object.keys(interVar).length != 0) {
              var data = interVar["events"]["renderer"]['cart'];
          var size = Object.keys(data).length;
          renderer.cartRenderer(selectorQuery(data, size)['response']);
            }
          }
          if (errorcontext) {
            //var interVar =favizone_helper.postProcessEvents("error");
            var interVar = favizone_tagging_events_data["error"];
            if (typeof(interVar)!='undefined' && Object.keys(interVar).length != 0) {
              var data = interVar["events"]["renderer"]['error'];
          var size = Object.keys(data).length;
          renderer.errorRenderer(selectorQuery(data, size)['response']);
            }
          }
          if(searchcontext){
            var interVar = favizone_tagging_events_data["doSearch"];
            if (typeof(interVar)!='undefined' && Object.keys(interVar).length != 0) {
              var data = interVar["events"]["tracker"]['doSearch'];
              var size = Object.keys(data).length;
              renderer.searchRenderer(document.querySelector(data.query.selector)[data.query.type]);
            }
          }
        } else {
         // var interVar =favizone_helper.postProcessEvents("other");
          var interVar = favizone_tagging_events_data["other"];
          if (typeof(interVar)!='undefined' && Object.keys(interVar).length != 0) {
            var data = interVar["events"]["renderer"]['other'];
        var size = Object.keys(data).length;
        renderer.otherRenderer(selectorQuery(data, size)['response']);
          }
        }
  }
}

/**
 * Description
 * @method favizone_renderer_handler
 * @return 
 */
function favizone_renderer_handler() {

  var connectionIdentifier = favizone_utilities.connectionIdentifier();
  if (connectionIdentifier != null) {
    favizone_renderer_manager();
  }
}


//Begin
var favizone_event_identifier = favizone_event_identifier_config();
var favizone_tagging_events_data = favizone_tagging_events_config();
var favizone_cutsom_scripts_data = favizone_cutsom_scripts();
//Init
var localData;
var validation_context = false;
var favizone_events = [];
var favizone_events_data = {};
var favizone_cart = [];
var favizone_server_parameters = favizone_server_parameters_config();
debug = favizone_server_parameters.debug;
var favizone_api_parameters = favizone_api_parameters_config();
var favizone_utilities = favizone_utilities_config();
var tracker =  favizone_events_tracker ();
var favizone_helper = favizone_helper_config();
if(checkDataValidation(favizone_event_identifier)){
debugApplication("====> sending events process is ready !", "");
if (getCookie("favizoneVisitTracker")=="") {
setCookie("favizoneVisitTracker", "false", 1);
}
favizone_tracker_handler();
}
if(checkDataValidation(favizone_tagging_events_data)){
debugApplication("====> rendering  process is ready !", "");
var renderer =  favizone_content_renderer();
favizone_renderer_handler();
}
} catch(error){
console.log("======>"+error.message);
if(debug == true){
console.log("Favizone Debug Stack Trace === ");
console.log(error.stack);
}
}