﻿(function($) {
    
    var W = window, D = W.document;
    
    if(!W.LOC) {
        W.LOC = {};
    }
    
    // if(typeof W.console != 'object') {
    //     W.console = {};
    //     W.console.log = function() {};
    // }
    
    if(!W.cmSetProduction || 
       !W.cmCreatePageviewTag || 
       !W.cmCreateProductviewTag || 
       !W.cmCreateRegistrationTag || 
       !W.cmCreateErrorTag || 
       !W.cmCreatePageElementTag || 
       !W.cmCreateConversionEventTag) {
        return;
    }
    
    // define ClientID as global var
    cm_ClientID = "90301322";
	
	//define prefix of all tags
	var prefixTag = "DEDE-";
	//define country directory (for manipulating URL strings)
	var site = "/_de/_de/";
	
    // set working environment
    var reDevHost = /\.(validation|contentmanager2|web[\d]{2})\.e-loreal\./i;
   // alert("location.hostname: " + location.hostname + " && reDevHost.test(location.hostname): " + reDevHost.test(location.hostname));
    if(!reDevHost.test(location.hostname)) {
        W.cmSetProduction();
    }
    
    // flag for popin tag duplicates
    var isPopin = false;
    
    var toTitleCase = function(str) {
        var tmp = str.split('_'), i = 0, l = tmp.length;
        while(i < l) {
            tmp[i] = tmp[i].charAt(0).toUpperCase() + tmp[i].substring(1);
            i++;
        }
        return tmp.join('_');
    };
    
    // specific tag creation
    var createTag = {
        pageURLfromHtml: function(datas) {
            //XL manage results.tag from URL
			var hurle = top.location.href.toLowerCase();
			var separ1 = "/html/";
			var separ2 = ".aspx";
			var hurleString = hurle.substring(hurle.indexOf(separ1) + separ1.length, hurle.indexOf(separ2));
			var express = new RegExp("/", "g");
			var zeTag = hurleString.replace(express, "-");
			return(prefixTag + zeTag);
        }
		,pageURLfromSite: function(datas) {
            //XL manage results.tag from URL
			var hurle = top.location.href.toLowerCase();
			var separ1 = site;
			var separ2 = ".aspx";
			var hurleString = hurle.substring(hurle.indexOf(separ1) + separ1.length, hurle.indexOf(separ2));
			var express = new RegExp("/", "g");
			var zeTag = hurleString.replace(express, "-");
			return(prefixTag + zeTag);
        }
    };
    // specific category creation
    var createCat = {
        pageURLfromHtml: function(datas) {
            //XL manage results.category from URL
			var hurle = top.location.href.toLowerCase();
			var separ1 = "/html/";
			var separ2 = hurle.lastIndexOf("/");
			var hurleString = hurle.substring(hurle.indexOf(separ1) + separ1.length, separ2);
			var express = new RegExp("/", "g");
			var zeCat = hurleString.replace(express, "-");
			return(prefixTag + zeCat);
        }
		,pageURLfromSite: function(datas) {
            //XL manage results.category from URL
			var hurle = top.location.href.toLowerCase();
			var separ1 = site;
			var separ2 = hurle.lastIndexOf("/");
			var hurleString = hurle.substring(hurle.indexOf(separ1) + separ1.length, separ2);
			var express = new RegExp("/", "g");
			var zeCat = hurleString.replace(express, "-");
			return(prefixTag + zeCat);
        }
	}
    // extract tag datas from a string value and return a map
    var extract = function(str) {
        var results = {}, parts = str.split(';'), i = parts.length, tmp;
        while(i--) {
            tmp = parts[i].split('=');
            results[tmp[0]] = tmp[1];
        }
        if(createTag[results.tag]) {
            // trim product category hierarchy
            if(results.tag == 'product' && results.category.indexOf('^') > -1) {
                results.category = results.category.replace(/.+\^/, '');
            }
            results.tag = createTag[results.tag](results);
        }
		if(createCat[results.category]) {
            results.category = createCat[results.category](results);
        }
        // manage search datas
        if(results.category == 'Search' && results.search) {
            var pages = D.getElementById('pages'), prd = D.getElementById('products');
            if(pages && prd) {
                results.number = pages.getElementsByTagName('li').length + prd.getElementsByTagName('li').length;
            } else {
                results.number = '0';
            }
        }
        // manage case on categories
        if (results.category) {
            results.category = toTitleCase(results.category);   
        }
		//remplacement "LANGPAYS-" par prefixTag
		results.tag = results.tag.replace("LANGPAYS-", prefixTag);
		results.category = results.category.replace("LANGPAYS-", prefixTag);
        //console.log(results);
        return results;
    };
    
    // extract parameters from URL query string and return a map
    var getURLParams = function() {
        var qs = location.search;
        if(qs) {
            qs = qs.replace('?', '');
            var p = qs.split('&'), i = p.length, l = i - 1, tmp, r = {};
            while(i--) {
                tmp = p[l - i].split('=');
                if(tmp[1]) {
                    r[tmp[0]] = tmp[1];
                }
            }
            return r;
        }
        return null;
    };
    
    // tags bridges to CM methods, always need a datas object returned from the extract method
    var tags = {
        tagPageView: function(datas) {
            W.cmCreatePageviewTag(datas.tag, datas.category, datas.search || null, datas.number || null);
        }
		//seule tagPageView() est utilisée pour l'instant sur LOC
		,tagPopinPageView: function(datas) {
            W.cmCreatePageviewTag(datas.tag, datas.category, null, null);
        }
		,tagProductView: function(datas) {
            W.cmCreateProductviewTag(datas.code, datas.tag, datas.category);
        }
		,tagRegisterView: function(datas) {
            if(createTag.register()) {
                W.cmCreateRegistrationTag(datas.email, datas.email, datas.city, null, datas.zip, null, null);
            }
        }
		,tagLoginView: function(datas) {
            W.cmCreateRegistrationTag(datas.email, datas.email, datas.city, null, datas.zip, null, null);
        }
		,tagErrorView: function(datas) {
            W.cmCreateErrorTag(datas.tag, datas.category);
        }
		,tagElementView: function(datas) {
            W.cmCreatePageElementTag(datas.tag, datas.category);
        }
		,tagConversionView: function(datas){
            if(datas.page == 'optional') {
                if(createTag.register()) {
                    W.cmCreateConversionEventTag(datas.event, datas.type, datas.category, null);
                }   
            } else {
                W.cmCreateConversionEventTag(datas.event, datas.type, datas.category, null);
            }
        }
    };
    
    var reValidPreProdHost = /\.(validation|web[\d]{2})\.e-loreal\./i;
    
    // loop on HTML identifiers to find and call tags (if possible)
    var findAndExecTags = function() {
        // on validation or preprod hosts, no tagging allowed
        if(reValidPreProdHost.test(location.hostname)) {
           // return;
        }
        
        var i = arguments.length, field, type, c = 0;
        
        while(i--) {
            type = arguments[i];
            if(tags[type]) {
                field = D.getElementById(type);
                if(field && field.value) {
                    tags[type](extract(field.value));
                    ++c;
                }
            }
        }
        
        // speed tagging if no tag found on page
        if(c === 0 && !isPopin) {
            W.cmCreatePageviewTag(null, null, null, null);
        }
        
        isPopin = false;
    };
    
    // find tags on domReady
    $(function() {
        // find tags on popins opening
        if(LOC.popins) {
            LOC.popins.addListeners({
                'open': {
                    'fn': function() {
                        isPopin = true;
                        findAndExecTags('tagPopinPageView');
                    }
                },
                'open#brand': {
                    'fn': function() {
                        isPopin = true;
                        findAndExecTags('tagPopinPageView');
                    }
                }
            });
        }
        findAndExecTags('tagPageView');//seulement des tagPageView pour LOC
       // findAndExecTags('tagPageView', 'tagProductView', 'tagRegisterView', 'tagLoginView', 'tagErrorView', 'tagConversionView');
    });
    
    LOC.findAndExecPopinTag = function() {
        isPopin = true;
        findAndExecTags('tagPopinPageView');
    };
    
    // call tags with a descriptive string (can be called from a user click on a link for example)
    LOC.execStatCM = function(str) {
        if(typeof str == 'string' && str) {
            var datas = extract(str);
            
            if(tags[datas.type]) {
                tags[datas.type](datas);
            }
        }   
    };
    
})(jQuery);