(function() {
    
    var W = window, D = W.document;
    
    if(!W.LOP) {
        W.LOP = {};
    }
    
    // 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 = "90243739";
    
    // set working environment
    // var reDevHost = /\.(validation|contentmanager3|web[\d]{2})\.e-loreal\./i;
    // 
    // if(!reDevHost.test(location.hostname)) {
    //     W.cmSetProduction();
    // }
    W.cmSetProduction();
    
    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 = {};
    
    // 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]) {
            results.tag = createTag[results.tag](results);
        }        
        // manage case on categories
        if (results.category) {
            results.category = toTitleCase(results.category);   
        }
        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);
        },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);
            }
        },tagErrorView: function(datas) {
            W.cmCreateErrorTag(datas.tag, datas.category);
        },tagElementView: function(datas) {
            W.cmCreatePageElementTag(datas.tag, datas.category);
        },tagConversionView: function(datas){
            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;
                }
            }
        }
        if(c === 0 && !D.getElementById('noTag')) {
            W.cmCreatePageviewTag(null, null, null, null);
        }
    };
    
    // call tags with a descriptive string (can be called from a user click on a link for example)
    LOP.execStatCM = function(str) {
        if(typeof str == 'string' && str) {
            var datas = extract(str);
            
            if(tags[datas.type]) {
                tags[datas.type](datas);
            }
        }   
    };
    
    
})();
