﻿// o8 autotracker
// written by matthias [dot] jaeggli [at] orange8 [dot] com
// tested in FF2, FF3, IE6, IE7, Opera 9.5, Safari 3

// Licence:
// According to: http://www.dustindiaz.com/rock-solid-addevent/ because of some code copying

// Changelog:
// 2008.07.02	v1.1		Kentico GetFile compatibility added
//					IE compatible debugging
// 2008.06.19	v1.0		initial release v 0.1

//--------------------- http://www.dustindiaz.com/rock-solid-addevent/ ----------------------
function addEvent( obj, type, fn ) {
	if (obj.addEventListener) {
		obj.addEventListener( type, fn, false );
		EventCache.add(obj, type, fn);
	}
	else if (obj.attachEvent) {
		obj["e"+type+fn] = fn;
		obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }
		obj.attachEvent( "on"+type, obj[type+fn] );
		EventCache.add(obj, type, fn);
	}
	else {
		obj["on"+type] = obj["e"+type+fn];
	}
}

var EventCache = function(){
	var listEvents = [];
	return {
		listEvents : listEvents,
		add : function(node, sEventName, fHandler){
			listEvents.push(arguments);
		},
		flush : function(){
			var i, item;
			for(i = listEvents.length - 1; i >= 0; i = i - 1){
				item = listEvents[i];
				if(item[0].removeEventListener){
					item[0].removeEventListener(item[1], item[2], item[3]);
				};
				if(item[1].substring(0, 2) != "on"){
					item[1] = "on" + item[1];
				};
				if(item[0].detachEvent){
					item[0].detachEvent(item[1], item[2]);
				};
				item[0][item[1]] = null;
			};
		}
	};
}();
addEvent(window,'unload',EventCache.flush);
//--------------------- end http://www.dustindiaz.com/rock-solid-addevent/ ----------------------

// the tracker object
var o8autotracker = function(){
	return {
		// Pfad der im analytics erscheinen wird, für externe links
		outboundPath: "/outgoing/",	

		// debug? (braucht ein <pre id="console"></pre> im body
		// zum debuggen, init(true) aufrufen
		debug: false,
		
		// links suchen und event lister anbinden
		init: function(debug){
			// Alle a Tags sammeln
			var anchors = document.getElementsByTagName("a");
			debug = debug? true : false;
			this.debug = debug;
			var outboundPath = this.outboundPath;
			
			var stopEvent = function(event){
				if(event.preventDefault){
					event.preventDefault();
					event.stopPropagation();
				}
				else{ //IE6, IE7
					event.returnValue = false;
					event.cancelBubble = true;
				}
			}
		
			// Event Funktion für lokale downloads
			var trackLocalFile = function(event){
				if(debug){
					stopEvent(event);
				}				
				return trackIt(this.pathname + (this.search || ""));
			}

			//Event Funktion für externe links
			var trackOutboundLink = function(event){
				if(debug){
					stopEvent(event);
				}				
				return trackIt(outboundPath + this.hostname);
			}

			var trackIt = function(path){	
				if(debug){
					document.getElementById("console").innerHTML += path +"<br>";
				}
				
				// try to track with NEW analytics
				pageTracker = window.pageTracker || false;
				if(pageTracker){
					return pageTracker._trackPageview(path)? true : false;
				} 
								
				// track with OLD analytics
				return window.urchinTracker && window.urchinTracker(path)? true : false;				
			}
		
			// event lister anbinden
			for(var i=0; i<anchors.length; i++){
				try{			
					if(location.host == anchors[i].hostname){	
						
						if (anchors[i].pathname){		
							var pn = anchors[i].pathname;
									
							// Dateien auf eigenem Server verfolgen
							if (pn.match(/\.(avi|css|doc|exe|js|mov|mp3|rar|txt|pdf|ppt|wma|wmv|xls|zip)$/)){
								addEvent(anchors[i], "click", trackLocalFile);
							}	
							
							// Kentico generierte Dateien auf eigenem Server verfolgen
							if (pn.match(new RegExp("GetFile.aspx")) || pn.match(new RegExp("getattachement"))){							
								addEvent(anchors[i], "click", trackLocalFile);
							}
						}
						
					} 
					else{					
						// Externe Links verfolgen
						addEvent(anchors[i], "click", trackOutboundLink);
					}
				}
				catch(err){}
			}
			
			return this;
		}
	};
}();