                      // JavaScript Document

// ###########################################
// Permet enregistrer dans Google Analytics 
// les clics sur les fichiers, fichiers externes, 
// liens externes, fonctions javascript et sections de page (ancres)
// nicolas.debray@micc.gouv.qc.ca
// Derniere mise a jour : 2009-09-04
// ###########################################


// ###########################################
function ClassGooglEvents(){
// ###########################################


// ###########################################
// EDITER CES PARAMETRES
// ###########################################
// Des parametres GET sont ajoutes a l'url envoyee a GoogleAnalytics
// de maniere a pouvoir filtrer les urls recues dans GoogleAnalytics
// sans perdre l'url originale
// ###########################################

// NOMS DES PARAMETRES GET  
  var googleLinkType    = "nature";
  var googleLinkName    = "nom";
  var googleLinkSource  = "source";
  
// VALEURS DES PARAMETRES GET
  var linkTypeInt     = "lien";
  var linkTypeFile    = "fichier";
  var linkTypeExt     = "lien_externe";
  var linkTypeExtFile = "fichier_externe";
  var linkTypeFunc    = "fonction";
  var linkTypeSect    = "section";
  var linkTypeElem    = "element";
  var linkAttributes  = ["alt","title","name","id"];
  
// SUR QUELLE PARTIE ENREGISTRER LES CLICS
  var eventType       = "click";
  var eventZone       = document;

// true POUR TESTER et false POUR USAGE NORMAL 
  var modeTest        = false;     // false OU true 
  var modeTestView    = 1;        // 1 OU 2 
   
// ###########################################

// ###########################################
 
// NE PAS EDITER PLUS BAS A MOINS QUE...
 
// ###########################################
// +++++++++++++++++++++++++++++++++++++++++++
// ###########################################
 
 
 
 
 
 
  var linkElement = null;
  var linkUrl     = "";
  var linkName    = "";
  var linkType    = "";
  var linkSource  = ""; 
  



	var regexScript      = /(javascript:)|(\()|(\))|(;)/gi;
	var regexComma       = /(,)/g;
	var regexQuotes      = /((')|(")|(’))/g;
	var regexUnderscore  = /(_){1,}/g;	
	var regexTab         = /((\t)|(\r)|(\n))/g;
	var regexSpace       = /( ){1,}/g;
	var regexPonctuation = /((,)|(;)|(:)|(\.))/g;
	var regexHttpHost    = location.protocol+"//"+location.hostname;
	var regexHost        = location.hostname;
	var regexLocation    = window.location;
	var regexLocPath     = location.pathname;
	var regexExtensions  = /((.doc)|(.docx)|(.xls)|(.xlsx)|(.rtf)|(.ppt)|(.pps)|(.pdf)|(.jpg)|(.jpeg)|(.gif)|(.png))$/i;
	var regexFunction1   = /((\()(.)*(\)))/;
  	var regexFunction2   = /#$/;
	var regexAnchor      = /(#)(.)*$/;
	var regexBlanks      = /(\0*)|(\n*)|(\f*)|(\r*)|(\t*)|(\v*)|(\s*)/g;
	var regexTrim        = /^(\s*)|(\s*)$/g;
	var regexHTML        = /<\S[^><]*>/g;
	var regexHttp        = /^http/;
	var regexFtp         = /^ftp/;


  this.voidAddEventListener       =    voidAddEventListener;
  this.voidEventAction            =    voidEventAction;
  this.setLinkElement             =    setLinkElement;
  this.elementReturnEventTarget   =    elementReturnEventTarget;
  this.boolValidateLink           =    boolValidateLink;
  this.setLinkType                =    setLinkType;  
  this.stringDetectLinkType       =    stringDetectLinkType;
  this.boolDetectLinkEventScript  =    boolDetectLinkEventScript;
  this.setLinkName                =    setLinkName;
  this.stringReturnLinkName       =    stringReturnLinkName;
  this.stringReturnLinkAttribute  =    stringReturnLinkAttribute;
  this.stringCleanLinkName        =    stringCleanLinkName;
  this.setLinkUrl                 =    setLinkUrl; 
  this.stringCleanLinkUrl         =    stringCleanLinkUrl;
  this.setLinkSource              =    setLinkSource;
  this.stringMakeGoogleString     =    stringMakeGoogleString;
  this.voidGoogleController       =    voidGoogleController;
  this.test                       =    test;
  this.test1                      =    test1;
  this.test2                      =    test2;




//-------------------------------------------
function voidAddEventListener() 
//-------------------------------------------
{
	if ( eventZone.addEventListener ) {
	   eventZone.addEventListener(eventType,voidEventAction,false);
	}  else if ( eventZone.attachEvent ) {
	   eventZone.attachEvent(('on'+eventType),voidEventAction);
	}
}





//-------------------------------------------
function voidEventAction(myEv)
//-------------------------------------------
{
	if (!setLinkElement(myEv)) return;
  if (!setLinkType()) return;
  setLinkName();
  setLinkUrl();
  setLinkSource();
  if (modeTest) test(stringMakeGoogleString());
  else voidGoogleController(stringMakeGoogleString());
}





//-------------------------------------------
function setLinkElement(myEv)
//-------------------------------------------
{
  linkElement = elementReturnEventTarget(myEv);
  return boolValidateLink();
}



//-------------------------------------------
function elementReturnEventTarget(myEv) 
//-------------------------------------------
{
	if (!myEv) var myEv = window.event;
  return myEv.target ? myEv.target : myEv.srcElement;
}




//-------------------------------------------
function boolValidateLink2() 
//-------------------------------------------
{
	if ( linkElement && ( linkElement.nodeType == 3 || linkElement.nodeType == 4 || linkElement.nodeName == "IMG" ) ) linkElement = linkElement.parentNode;
	if ( linkElement && (linkElement.tagName == "A") || (linkElement.tagName == "AREA") ) return true;
	return false;
}







//-------------------------------------------
function boolValidateLink() 
//-------------------------------------------
{
  if ( linkElement.tagName == "A" || linkElement.tagName == "AREA" ) return true;
  if ( linkElement.tagName == "OBJECT" || linkElement.tagName == "EMBED" ) return true;
	while ( linkElement.tagName != "A" && linkElement != eventZone ) {
    linkElement = linkElement.parentNode;
  }
  return ( linkElement.tagName == "A" || linkElement.tagName == "AREA" ) ? true : false;
}






//-------------------------------------------
function setLinkType()
//-------------------------------------------
{
  if (linkType = stringDetectLinkType()) return true;
  return false;
}






//-------------------------------------------
function stringDetectLinkType() 
//-------------------------------------------
{
  if (!linkElement) return null;
  var myHref = linkElement.href.replace(regexTrim,"");
  if (!myHref.match(regexHost)) {
       if ( myHref.match(regexFunction1) ) return linkTypeFunc;
    	 else if ( myHref.match(regexExtensions) ) return linkTypeExtFile;
    	 else return linkTypeExt;
  }
  else if (myHref.match(regexHost)) {
    	if ( myHref.match(regexFunction1) ) return linkTypeFunc;
    	else if ( ( myHref.match(regexFunction2) || myHref == regexLocation || myHref == "" || myHref == regexHttpHost ) && ( boolDetectLinkEventScript() ) ) return linkTypeFunc;
    	else if ( myHref.match(regexExtensions) ) return linkTypeFile;
    	else if ( myHref.match(regexAnchor) ) return linkTypeSect;
    	else return linkTypeInt;
  }
  else return false;             
}







//-------------------------------------------
function boolDetectLinkEventScript()
//-------------------------------------------
{
  if (!linkElement) return false;
  return ( (linkElement.onclick) || (linkElement.onmousedown) || (linkElement.onmouseup) || (linkElement.ondblclick) ) ? true : false;
}






//-------------------------------------------
function setLinkName()
//-------------------------------------------
{
  linkName = stringReturnLinkName(); 
  linkName = stringCleanLinkName(); 
}







//-------------------------------------------
function stringReturnLinkName() 
//-------------------------------------------
{
	if (!linkElement) return null;
	else if (linkElement.tagName == "A") {
      var myChild = linkElement.childNodes;
      for (var i=0; i<=myChild.length-1; i++){
        if (myChild[i].nodeName == "IMG") return stringReturnLinkAttribute(myChild[i]);
      }
      return linkElement.innerHTML.replace(regexHTML,"");
  }
  else return stringReturnLinkAttribute(linkElement); 
  return null;
}






//-------------------------------------------
function stringReturnLinkAttribute(myElem) 
//-------------------------------------------
{
  for (var i=0; i<=linkAttributes.length-1; i++){
    var myAttribute = myElem.getAttribute(linkAttributes[i]);
    if (myAttribute && myAttribute.replace(regexTrim,"") != "" ) return myAttribute;
  }
  return null;
}







//-------------------------------------------
function stringCleanLinkName() 
//-------------------------------------------
{
	if (!linkName) return null;
	linkName = linkName.replace(regexTrim,"");
	linkName = linkName.replace(regexTab,"");
	linkName = linkName.replace(regexSpace,"_");
	linkName = linkName.replace(regexQuotes,"");
	linkName = linkName.replace(regexPonctuation,"_");
	linkName = linkName.replace(regexUnderscore,"_");
	return linkName;
}






//-------------------------------------------
function setLinkUrl()
//-------------------------------------------
{
  linkUrl = stringCleanLinkUrl(); 
}





//-------------------------------------------
function stringCleanLinkUrl() 
//-------------------------------------------
{
	if (!linkElement) return null;
	linkUrl = linkElement.href;
	linkUrl = linkUrl.replace(regexComma,"_");
	linkUrl = linkUrl.replace(regexQuotes,"");
	linkUrl = linkUrl.replace(regexUnderscore,"_");
	linkUrl = decodeURI(linkUrl);
	return linkUrl;
}






//-------------------------------------------
function setLinkSource() 
//-------------------------------------------
{
	linkSource = decodeURI(window.location);
}





//-------------------------------------------
function stringMakeGoogleString()
//-------------------------------------------
{
	return linkUrl+"?"+googleLinkType+"="+linkType+"&"+googleLinkName+"="+linkName+"&"+googleLinkSource+"="+linkSource;
}






//-------------------------------------------
function voidGoogleController(myStr)
//-------------------------------------------
{
	pageTracker._trackPageview(myStr);
}


//-------------------------------------------
function test(myStr)
//-------------------------------------------
{
  (modeTestView == 1) ? test1(myStr) : test2(myStr);
}


//-------------------------------------------
function test1(myStr)
//-------------------------------------------
{
	alert(myStr);
}


//-------------------------------------------
function test2(myStr)
//-------------------------------------------
{
  document.getElementById('googlevents').innerHTML = "<div>"+stringMakeGoogleString()+"</div>";
}












// ###########################################
}
// ###########################################


           
var myClassObj = new ClassGooglEvents();
myClassObj.voidAddEventListener();




