
/****************************************************
Script: EventHandler
Date: (October 4th 2007)
Author: Dimitri Troncquo
Contact: dimi3.t@gmail.com
Description: 
Event Hanlder framework to facilitate dynamic event binding
in various use case scenarios.
EventHandler ensures maximum browser support on event binding. 

Last Update: (October 21st 2007)
Description: 
Added  support for anonymous functions.
****************************************************/

var EventHandler = {};

EventHandler.type = "EventHandler";
EventHandler.anonymousFunctions = { 
	functionCounter: 0,
	registerAnonymous: function(funcName, handler){
		while(funcName in this){
			funcName = funcName + "_" + this.functionCounter;
			this.functionCounter++;
		}
		this[funcName] = handler;
		return funcName;
    }
 };
 
if (document.addEventListener){
    EventHandler.register = function(element, type, handler, isAnonymous){
		if(isAnonymous)
			isAnonymous = this.anonymousFunctions.registerAnonymous(isAnonymous, handler);
		element.addEventListener(type, handler, false);
		return isAnonymous;
    };
    
    EventHandler.unregister = function(element, type, handler, isAnonymous){
		if(isAnonymous)
			if(isAnonymous in this.anonymousFunctions)
				handler = this.anonymousFunctions[isAnonymous];
        element.removeEventListener(type, handler, false);
        if(isAnonymous)
			if(isAnonymous in this.anonymousFunctions)
				delete this.anonymousFunctions[isAnonymous];
    };
}else{
    EventHandler.registeredHandlers = new Array();
    
    EventHandler.unregisterAllHandlers = function(){
        if(document.eventHandler){
            var ev = (this.type == "EventHandler")?this:document.eventHandler;
            for(var i=0; i<ev.registeredHandlers.length;i++)
                ev.unregister(ev.registeredHandlers[i].element, ev.registeredHandlers[i].type, ev.registeredHandlers[i].wrapper || ev.registeredHandlers[i].handler);           
            document.eventHandler = null;
        }
    }
    
    EventHandler.findHandler = function(element, type, handler){
        for (var i = 0; i<this.registeredHandlers.length; i++){
            if(this.registeredHandlers[i].element == element && this.registeredHandlers[i].type == type && this.registeredHandlers[i].handler == handler)
                return i;
        }
        return -1;
    };
    
    EventHandler.getHandlerWrapper = function(element, handler){
        var handlerWrapper = function(ev){
            if(!ev)ev = window.event;
            var e = {
                event: ev,
                type: ev.type,
                target: ev.srcElement,
                currentTarget: element,
                relatedTarget: ev.fromElement || ev.toElement,
                eventPhase: (ev.srcElement==element)?2:3,
                
                clientX: ev.clientX,
                clientY: ev.clientY,
                screenX: ev.screenX,
                screenY: ev.screenY,
                altKey: ev.altKey,
                ctrlKey: ev.ctrlKey,
                shiftKey: ev.shiftKey,
                charCode: ev.keyCode,
                
                stopPropagation: function(){this.event.cancelBubble = true;},
                preventDefault: function(){this.event.returnValue = false;} 
            };  
            if(Function.prototype.call)
                handler.call(element, e);
            else{
                element.cH = handler;
                element.cH(e);
                element.cH = null;
            }
        };
        return handlerWrapper;
    };
    
    if(document.attachEvent){
        EventHandler.register = function(element, type, handler, isAnonymous){
            if(this.findHandler(element, type, handler) != -1) return;
             var newEvent = this.getHandlerWrapper(element, handler);
             if(isAnonymous)
				isAnonymous = EventHandler.anonymousFunctions.registerAnonymous(isAnonymous, newEvent);
            element.attachEvent("on"+type, newEvent);
            this.registeredHandlers.push({element: element, type: type, handler: handler, wrapper: newEvent });
            return isAnonymous;
        };
        
        EventHandler.unregister = function(element, type, handler, isAnonymous){
            var handlerIndex = this.findHandler(element, type, handler);            
            var curHandler;
            if(handlerIndex != -1)
				curHandler = this.registeredHandlers[handlerIndex].wrapper;
            if(isAnonymous)
				if(isAnonymous in this.anonymousFunctions)
					curHandler = this.anonymousFunctions[isAnonymous];
			if(!curHandler) return;
            element.detachEvent("on"+type, curHandler);
            this.registeredHandlers.splice(handlerIndex, 1);
            if(isAnonymous)
				if(isAnonymous in this.anonymousFunctions)
					delete this.anonymousFunctions[isAnonymous];
        };
        
    }else{
        EventHandler.register = function(element, type, handler, isAnonymous, reRegister){
            if(!reRegister)
                if(this.findHandler(element, type, handler) != -1) return;
            if(isAnonymous)
				isAnonymous = this.anonymousFunctions.registerAnonymous(isAnonymous, handler);
            var oldEvent = element["on"+type];
            var newEvent = this.getHandlerWrapper(element, handler); 
            if (typeof element["on"+type] != 'function')
                element["on"+type] = function(e) {newEvent(e)};
            else {
                element["on"+type] = function(e) {
                    oldEvent(e);
                    newEvent(e);
                }
            }
            if(!reRegister)
                this.registeredHandlers.push({element: element, type: type, handler: handler });
            return isAnonymous;
        };
        
        EventHandler.unregister = function(element, type, handler, isAnonymous){          
            var handlerIndex = this.findHandler(element, type, handler);
            if(handlerIndex == -1) return;
            element["on"+type] =  null;
            if(isAnonymous){
				if(isAnonymous in this.anonymousFunctions)
					delete this.anonymousFunctions[isAnonymous];
			}   
            if(Array.prototype.splice)
                this.registeredHandlers.splice(handlerIndex, 1);
            else{//if the browser does not support attachEvent, chances are it does not support splice either
                var newHandlers = new Array();
                for (var i = 0; i<this.registeredHandlers.length; i++){
                    if(i != handlerIndex)
                        newHandlers.push(this.registeredHandlers[i]);
                }
                this.registeredHandlers = newHandlers;
            }
            for (var i = 0; i<this.registeredHandlers.length; i++){            
                if(this.registeredHandlers[i].element == element && this.registeredHandlers[i].type == type)
                    this.register(element, type, this.registeredHandlers[i].handler, true);
            }         
        };
    }
}
if(!document.eventHandler)
    document.eventHandler = EventHandler;
if(!document.addEventListener)
    document.eventHandler.register(window, "unload", function(){document.eventHandler.unregisterAllHandlers();});

/****************************************************
     Script: addLinkerEvents
     Author: Brian J Clifton
     Url: http://www.advanced-web-metrics.com
     This script is free to use as long as this info is left in
     
     Combined script for tracking external links and file downloads
     
     All scripts presented have been tested and validated by the author and are believed to be correct
     as of the date of publication or posting. The Google Analytics software on which they depend is 
     subject to change, however; and therefore no warranty is expressed or implied that they will
     work as described in the future. Always check the most current Google Analytics documentation.

****************************************************/


// Only links written to the page (already in the DOM) will be tagged
// This version is for ga.js (May 26th 2008)

/******************************************************************
Script: addLinkerEvents
Revision 1:  (July 9th 2008)
Author: Dimitri Troncquo, Lodestar
Description: 
Tweaked to maximize Browser support on event binding.
Fix to retrieve correct doc name. 
Fix to stop script from registering documents without httpheader as outbound links. 
Fix to  filter documents with similar extensions (i.e. .doc and .docx).
Fixed erroneous  break on encountering 1st mailto link.

Revision 2:  (August 25th 2008)
Author: Dimitri Troncquo, Lodestar
Description: 
Fixed logic for external links.
Fix to retrieve just the document name instead of the full path.
Fix to prevent documents to show as external links
*******************************************************************/


function addLinkerEvents() {
	var as = document.getElementsByTagName("a");
	var extTrack = ["esko.com", "esko-graphics.com"];
	var extDoc = [".doc",".xls",".exe",".zip",".pdf",".js",".jpeg",".jpg",".gif",".png", ".mp3", ".flv",".swf"];

	for(var i=0; i<as.length; i++) {
	
		// Tracking links off site - no GATC
		var isExternalCandidate = true;
		for (var j=0; j<extTrack.length; j++) {
			if (as[i].href.indexOf(extTrack[j]) > -1  && as[i].href.indexOf('google-analytics.com') == -1 ){ 
				isExternalCandidate = false;		
				break;
			}
		}	
			
		// Tracking electronic documents 
		for (var j=0; j<extDoc.length; j++) {
		
			if (as[i].href.indexOf(extDoc[j]) + extDoc[j].length == as[i].href.length) {
				function registerTracker(link, docUrl){
					document.eventHandler.register(link, "click", function(e){
						pageTracker._trackPageview(docUrl);
					});
				}
				registerTracker(as[i], "/downloads/" + as[i].href.substring(as[i].href.lastIndexOf("/")+1));
				/*registerTracker(as[i], "/downloads/" + as[i].href.substring(as[i].href.indexOf("/"))+1);
				*  use this last line instead of the one above
				*  to retrieve the entire document path instead of just the document name */
				isExternalCandidate = false;				
				break;
			}
		}
		
		if(isExternalCandidate && as[i].href.indexOf("http://") == 0){
			function registerTracker(link, outboundUrl){
				document.eventHandler.register(link, "click", function(e){
					pageTracker._trackPageview(outboundUrl);
				});
			}
			registerTracker(as[i], "/outgoing_links/" + as[i].href.split("http://")[1]);
		}
		
		// added to track mailto links 23-Oct-2003
		if (as[i].href.indexOf("mailto:") != -1  && as[i].href.indexOf("gashbug@google.com") == -1 ) {
			function registerTracker(link, mailtoUrl){
					document.eventHandler.register(link, "click", function(e){
						pageTracker._trackPageview(mailtoUrl);
					});
				}				
				registerTracker(as[i], as[i].href.replace("mailto:", "/mail_leads/"));
		}
	}

}

//Event registration for addLinkerEvents begin
document.eventHandler.register(window, "load", function(e){
	if(addLinkerEvents)
		addLinkerEvents();
});
//Event registration for addLinkerEvents end