﻿var fstq = fstq || {}; // Création du namespace publique fstq.
var _gaq = _gaq || []; // Création de la variable de traquage Google Analytics.

(function ($) {
    var opts = null;

    function initialiser(parametres) {
        // fusionne les paramètres par défaut et les paramètres de l'utilisateur.
        opts = $.extend(true, {}, fstq.googleAnalytics.defaults, parametres);

        var idGoogleAnalytics = estPageAdhesion() ? idGAAdhesion : idGAPortail;
        _gaq.push(['_setAccount', idGoogleAnalytics]);

        // Active un traqueur standard pour toutes les pages.
		if(opts.traqueurDefaut) {
			_gaq.push(['_trackPageview']);
            debug('Initialiser traqueur défaut');
		}

		(function() {
			var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
			ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
			var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
		})();
    };

    function traquerEvenement(parametres) {
        opts = $.extend(true, {}, fstq.googleAnalytics.defaults, { evenement: parametres });

        if (opts.evenement.label == null) {
            opts.evenement.label = opts.evenement.defautLabel();
        }
        if (opts.evenement.action == null) {
            opts.evenement.action = opts.evenement.defautAction();
        }

        _gaq.push([opts.evenement.evenement, opts.evenement.categorie, filtreTexte(opts.evenement.action), filtreTexte(opts.evenement.label)]);
        debug([opts.evenement.evenement, opts.evenement.categorie, filtreTexte(opts.evenement.action), filtreTexte(opts.evenement.label)]);
    };

    function traquerFormulaire(parametres) {
        opts = $.extend(true, {}, fstq.googleAnalytics.defaults, { formulaire: parametres });

        var action = opts.formulaire.pageUrl + '?ga_action=' + opts.formulaire.identifiant + '-' + opts.formulaire.type;
        _gaq.push([opts.formulaire.evenement, action]);
        debug([opts.formulaire.evenement, action]);
    };

    function traquerRecherche(parametres) {
        opts = $.extend(true, {}, fstq.googleAnalytics.defaults, { recherche: parametres });

        var action = opts.recherche.pageUrl + '?q=' + opts.recherche.motClef;

        _gaq.push([opts.recherche.evenement, action]);
        debug([opts.recherche.evenement, action]);
    };

    function traquerEtapeAdhesion(parametres) {
        opts = $.extend(true, {}, fstq.googleAnalytics.defaults, { adhesion: parametres });

        var labelRL  = opts.adhesion.estRL ? 'RL' : '';

        var action = document.location.pathname + '?ga_step=';
        action += 'cotisation' + labelRL + opts.adhesion.mappageTypeEtape[opts.adhesion.nomEtape];
       
        $.each(opts.adhesion.typeEtape, function (clef, valeur) {
            if (valeur) {
                action += '-' + opts.adhesion.mappageTypeEtape[clef];
            }
        });

        _gaq.push([opts.adhesion.evenement, action]);

        debug(action);
        debug([opts.adhesion.evenement, action]);
    };

    // Permet de traquer une page.
    function traquerPage(parametres) {
        opts = $.extend(true, {}, fstq.googleAnalytics.defaults, { page: parametres });
        var estDansGaq = false;

        // Évite d'envoyer plusieurs fois le même traqueur de la page.
        // Dû à l'héritage des gabarits de Sitecore.
         $.each(_gaq, function (clef, valeur) {
            if ($.inArray(opts.page.evenement, valeur) != -1) {
                estDansGaq = true; 
            }
        });
      
        if(!estDansGaq) {
            _gaq.push([opts.page.evenement]);
            debug([opts.page.evenement]);
        }
    }

    function estPageAdhesion() {
        var estAdhesion = false;
        var elementsUrl = document.location.pathname.split("/");

        if (elementsUrl.length > 2 && elementsUrl[2].toLowerCase() == "adhesion") {
            estAdhesion = true;
        }

        return estAdhesion;
    }

    function traquerEcommerce(parametres) {
        opts = $.extend(true, {}, fstq.googleAnalytics.defaults, { ecommerce: parametres });

        _gaq.push(['_setDomainName', 'none']);
        _gaq.push(['_setAllowLinker', true]);
        _gaq.push(['_addTrans',
            opts.ecommerce.commandeId,
            opts.ecommerce.commerceNom,
            opts.ecommerce.prix,
            opts.ecommerce.taxe,
            opts.ecommerce.envoi,
            opts.ecommerce.ville,
            opts.ecommerce.province,
            opts.ecommerce.pays
        ]);
        _gaq.push(['_addItem',
            opts.ecommerce.commandeId,
            opts.ecommerce.sku,
            opts.ecommerce.nomProduit,
            opts.ecommerce.nomCategorie,
            opts.ecommerce.prix,
            opts.ecommerce.quantite
        ]);
        _gaq.push(['_trackTrans']);

        debug(opts.ecommerce);
    };

    function filtreTexte(chaine) {
        chaine = $.trim(chaine);
        chaine = chaine.replace(/\\/g, "\\\\");
        chaine = chaine.replace(/\'/g, "\\'");
        chaine = chaine.replace(/\"/g, "\\\"");
        return chaine;
    };

    function debug(contenu) {
        opts.debug && ecrireConsole(contenu);
    };

    function ecrireConsole(contenu) {
        console && console.log(contenu);
    };

    fstq.googleAnalytics = $.extend(fstq.googleAnalytics ? fstq.googleAnalytics : {}, {
        defaults: {
            debug: false,
            arguments: null,
            methode: null,
            ecommerce: {
                categorie: null,
                commandeId: null,
                commerceNom: null,
                envoi: 0,
                nomProduit: null,
                pays: 'Canada',
                prix: null,
                province: null,
                quantite: 1,
                sku: null,
                taxe: 0,
                desactiveTraqueurDefaut: false,
                ville: null
            },
            evenement: {
                action: null,
                evenement: '_trackEvent',
                categorie: 'Lightbox',
                desactiveTraqueurDefaut: false,
                defautAction: function() {
                    return $('#menu-lateral h2').text();
                },
                defautLabel: function () {
                    return $('#fenetre h1').text();
                },
                label: null
            },
            formulaire: {
                evenement: '_trackPageview',
                desactiveTraqueurDefaut: false,
                pageUrl: document.location.pathname,
                identifiant: null,
                type: null
            },
            page: {
                evenement: '_trackPageview'
            },
            recherche: {
                evenement: '_trackPageview',
                desactiveTraqueurDefaut: false,
                pageUrl: document.location.pathname,
                motClef: null
            },
            adhesion: {
                evenement: '_trackPageview',
                desactiveTraqueurDefaut: false,
                mappageTypeEtape: {
                    cc: '-confirm',
                    cr: '-restrictions',
                    crp: '-renseignements-personnels',
                    cs: '-soumission',
                    ctv: '-type-versement',
                    estPBA: 'VP-PBA',
                    estPBU: 'VU-PBU',
                    estRSS: 'VP-prelevement-paie',
                    estVirement: 'VU-institution-bancaire'
                },
                estRL: false,
                nomEtape: null,
                typeEtape: []
            },		    
            traqueurDefaut: true
        },
        initialiser: initialiser,
        traquerFormulaire: traquerFormulaire,
        traquerEcommerce: traquerEcommerce,
        traquerEtapeAdhesion: traquerEtapeAdhesion,
        traquerEvenement: traquerEvenement,
        traquerPage: traquerPage,
        traquerRecherche: traquerRecherche
    });
})(jQuery);
