/*
*
* Date: 28-01-2009
* File: multi-track.js
* Author: Richard Assar
* 
*	Multi-Track: 
*		Adds extra functionality to the Google Analytics tracker, allowing
*		multiple paths to be associated with a unique Google Analytics account.		
*
*/

var HyperActive = {				
	startListening : function(obj,evnt,func) {
	    if (obj.addEventListener) {
	            obj.addEventListener(evnt,func,false);
	    } else if (obj.attachEvent) {
	            obj.attachEvent("on" + evnt,func);
	    }
	},
	 
	trackMailto : function(evnt) {
	    var href = (evnt.srcElement) ? evnt.srcElement.href : this.href;
	    var mailto = "/mailto/" + href.substring(7);	 	 	    	 
	    HyperActive.pageTracker._trackPageview(mailto);
	},
	 
	trackDocumentLinks : function(evnt) {
	    var href = (evnt.srcElement) ? evnt.srcElement.href : this.href;
	    var download = "/downloads/" + href.substring(7);	    
	    HyperActive.pageTracker._trackPageview(download);
	},
	 
	trackExternalLinks : function(evnt) {
	    var e = (evnt.srcElement) ? evnt.srcElement : this;
	    while (e.tagName != "A") { e = e.parentNode; }
	    var lnk = (e.pathname.charAt(0) == "/") ? e.pathname : "/" + e.pathname;
	    if (e.search && e.pathname.indexOf(e.search) == -1) lnk += e.search;
	    lnk = "/external/" + e.hostname + lnk;	    
	    HyperActive.pageTracker._trackPageview(lnk);
	},
	
	initialise : function(notifyNewWindow){		
		if (document.getElementsByTagName) {
			var hrefs = document.getElementsByTagName("a");
			for (var l = 0; l < hrefs.length; l++) {
				try{ //protocol, host, hostname, port, pathname, search, hash
					if (hrefs[l].protocol == "mailto:") {
						HyperActive.startListening(hrefs[l],"click",HyperActive.trackMailto);
					} else if (hrefs[l].hostname == location.host) {
						var path = hrefs[l].pathname + hrefs[l].search;
						var isDoc = path.match(/\.(?:doc|eps|jpg|png|svg|xls|ppt|pdf|xls|zip|txt|vsd|vxd|js|css|rar|exe|wma|mov|avi|wmv|mp3)($|\&|\?)/);
						if (isDoc) { 
							HyperActive.startListening(hrefs[l],"click",HyperActive.trackDocumentLinks); 							
						}
					} else if (hrefs[l].hostname != location.host) { 
						var note = document.createElement("span");
						
						if(notifyNewWindow) {
							note.innerHTML = "(link opens in a new window) ";												
							hrefs[l].parentNode.insertBefore(note,hrefs[l]);
						}
						
						hrefs[l].onclick=function() { window.open(this.href); return false;}						
						HyperActive.startListening(hrefs[l],"click",HyperActive.trackExternalLinks);
					}
				}
				catch(e){
					continue;
				}				
			}
		}
	}	
	
};
	
var MultiTrack = {	
	
	// Paths relative to the root directory.
	accounts: [
		{
			path:"/",
			code:"UA-7207991-1"
		},
		{
			path:"/scotlandnow",
			code:"UA-7209227-1"		
		}
	],

	// Retreives an entry index given a path. I've kept this generic, who knows what else you might need...
	getEntry : function(currentPath) {	
		// Find the maximum length path matching the current path.
		var pathLength = 0;
		var selectedEntry;
	
		// Iterate over all the accounts	
		for(entry in MultiTrack.accounts)
		{	
			if(currentPath.search(MultiTrack.accounts[entry].path) > -1) { // If there's a match
				if(MultiTrack.accounts[entry].path.length > pathLength) { // And it is more specific than the last
					pathLength = MultiTrack.accounts[entry].path.length; // Use it!
					selectedEntry = entry;
				}
			}
		}
		
		return selectedEntry;
	},

	// Retreives the code for a given path.
	getCode : function(currentPath) {	
		return MultiTrack.accounts[MultiTrack.getEntry(currentPath)].code;
	},

	// Insert google analytics script block with the selected code.
	gAppend : function(trackerCode) {	
		var gscript=document.createElement('script');		
		
		gscript.type='text/javascript';		
		gscript.language='JavaScript';
		gscript.src= (("https:" == document.location.protocol) ? "https://ssl." : "http://www.") + "google-analytics.com/ga.js";
		
		$.get(
			"/includes/ga-link.php", 
			function(data, textStatus) { 															
				eval(data);
				try {		
					HyperActive.pageTracker = _gat._getTracker(trackerCode);
					HyperActive.pageTracker._trackPageview();
				} catch(err) { 
					alert(err);				
				}			
		 	}, 
		 	"script"		 	
	 	);						
	},

	// Appends function calls to the window.onload function.
	chain : function(f) {
	  var o=window.onload;window.onload=function() {if(o) o();f();}
	}
}

MultiTrack.chain(function(){ MultiTrack.gAppend(MultiTrack.getCode(window.location.pathname));});
MultiTrack.chain(function(){ HyperActive.initialise(false);});