var addTrackingToElement = function(elObject,tText,objSettings){
	
	/* Set Object Setting From Inputted Parameters Variables */
	var isStringInput = (typeof objSettings === "string");

	var os = (typeof objSettings!="undefined") ? {
		text: tText,
		elm: elObject,
		evtType: objSettings.eventType,
		evtHandler: objSettings.eventHandler,
		evtDefault: objSettings.defaultAction,
		evtOverwrite: objSettings.overWriteHandler
	} : {text: tText,elm: elObject};
	
	/* If Only Two Parameters Are Included */
	os.defaultEventType = (arguments.length < 3) ? "click" : null;
	
	/* When More Than One Element Object Is Selected */
	os.cancelOnMultipleSelect = true;
	
	/* Check For jQuery Support On The Page */
	os.isJquery = (typeof jQuery!="undefined" && typeof jQuery=="function") ? true : false;

	/* Track Once Per Event Per Element */
	os.isTrackOnce = true;
	
	/* Has This Particular Element Been Tracked Default To False - See addToTrackedElements Method */
	os.hasTrackedElement = false;
	
		
	/* Return HTML Element Object After Validation */ 
	os.elm = (os.isJquery) ? function(elmObj){
			return ((elmObj!="" && elmObj!=null) && jQuery(elmObj)) ? jQuery(elmObj) : null
		}(os.elm) : function(elmObj){
			return (typeof elmObj == "string") ? 
				((document.getElementById(elmObj)) ? 
					document.getElementById(elmObj) 
					: null) 
				: ((elmObj && elmObj.nodeType) ? elmObj : null);
		}(os.elm);
	

	/************************************************************************
	 CRITICAL CHECK 1: Cancel Function If HTML Element Object Is Not Defined 
	*************************************************************************/
	if(os.elm==null){return null}	

	/* Validate Inputted Parameters */
	os.text =  (typeof os.text == "string" && os.text !="") ? os.text : null;
	os.evtType = (typeof os.evtType == "string" && os.evtType !="") ? os.evtType : ((isStringInput==true) ? objSettings : os.defaultEventType);
	os.evtDefault = (typeof os.evtDefault != "undefined" && os.evtDefault!=true) ? false : true;
	os.evtHandler = (typeof os.evtHandler == "function") ? os.evtHandler : function(){runTrackingCode(os.elm,os.text); return os.evtDefault};
	
		
	/* Function Utility To Reformats The Event Type String */
	var eventStrFormat = function(str,includeOnStr){
		var reFormat = /^(on)([a-zA-Z]+)$/;
		includeOnStr = (includeOnStr!==false) ? true : false;
		
		if(!includeOnStr){
			return str.replace(reFormat,"$2");
		}else{
			return (reFormat.test(str)) ? str : "on" + str;
		}
		
	}
	
	/* Include Tracking Function If Not There Can Be Overwritten If Needed */
	if(!addTrackingToElement.reportwVUSToOmniture){
		addTrackingToElement.reportwVUSToOmniture = function(v,obj,t,acct){

			if((!WVOM || !v) || (!obj || v=='')){return false}
			try{
				acct = (acct) ? acct : WVOM.acct;
				t = (typeof t==='string') ? t : 'o'; 
				var s=s_gi(acct);
				s.tl(obj,t,v);
				return true;
			}catch(e){return false}

		}
	}


	/* Include Default Tracking Code Function */
	var runTrackingCode = function(o,t){
		var o = o || os.elm;
		
		/* Check For SiteCatalyst Object First */
		if(typeof s_objectID!="undefined" && canElementTrack(o)){
			t = t || os.text;
			return addTrackingToElement.reportwVUSToOmniture(t, toDOMObject(o));
		}else{
			return false;
		}
	}
	
		
	var canElementTrack = function(o){
		var isNewTracked = addToTrackedElements(toDOMObject(o));
		if(isNewTracked==true){os.hasTrackedElement = true}
		return isNewTracked || os.isTrackOnce != true;
	}
	
	
	/* To Convert jQuery To DOM Object */
	var toDOMObject = function(obj){
		if(os.isJquery && obj.get){
			obj = obj.get(0);
		}
		return obj;
	}

	/* Track Elements List And Add To Global Accessible Variable */
	var addToTrackedElements = function(obj){
		/* If Global Variable Does not Exist Then Create To Keep Track Of Elements */
		if(typeof addTrackingToElement.list == "undefined"){addTrackingToElement.list=[];}	
		var tList = addTrackingToElement.list;
		var tListLen = tList.length;
		var rtnVal = true;	
				
		if(tListLen > 0){
			for(var x=0;x<tListLen;x++){
				if(tList[x].elm == obj && tList[x].evType == os.evtType){os.hasTrackedElement = true; rtnVal = false; break;};	
			}
		}
			
		
		if(os.hasTrackedElement != true){addTrackingToElement.list[tListLen] = {elm:obj,evType:os.evtType}; rtnVal = true}
		
		return 	rtnVal;
	}
		
	
	
	/************************************************************************************
	 CRITICAL CHECK 2: Cancel Function If Tracking Text And Event Type Are Not Defined 
	************************************************************************************/
	if(os.text==null || os.evtType==null){return null}

	/* 
	----------------------------------
	  When jQuery is Available 
	----------------------------------
	*/
	if(os.isJquery){
		

		var isMultipleSelect = (os.elm.length > 1);

		/****************************************************************************************************
		 CRITICAL CHECK 3: Cancel Function If Multiple Element Are Selected And CancelOnMultiple Is True
		*****************************************************************************************************/	
		if(isMultipleSelect && os.cancelOnMultipleSelect){return null}
		
		/* Create Non-jQuery DOM Element Object */
		os.elmDOM = toDOMObject(os.elm);
		os.evtType = eventStrFormat(os.evtType,false);
		
		
		/* If Previous Event Call Needs To Be Removed */
		if(os.evtOverwrite===true){
			/* Remove Event Binding Via jQuery */
			os.elm.unbind(os.evtType);
				
			/* If Event Attached By Traditional Method On Event Handler Attachment */
			if(typeof os.elmDOM[os.evtType] == "function"){os.elmDOM["on"+ os.evtType] = function(){};}
			
		}

		os.elm.bind(os.evtType,function(){
			var rtnVal = os.evtHandler(this,os.text,os.evtDefault,runTrackingCode);
			rtnVal = (typeof rtnVal!="undefined") ? rtnVal : os.evtDefault;
				return rtnVal;
		})	
	
	/* 
	----------------------------------
	 When jQuery is Not Available 
	----------------------------------
	*/
	}else{
		os.evtType = eventStrFormat(os.evtType,true);
		var previousHandler = (typeof os.elm[os.evtType] == "function") ? os.elm[os.evtType] : function(){runTrackingCode(this,os.text);return os.evtDefault};
			
		os.elm[os.evtType] = function(e){
			var rtnVal = os.evtDefault;
			
			
			/* If Previous Event Call Needs To Be Removed */
			if(os.evtOverwrite!==true){rtnVal = previousHandler.apply(this,[os.elm.event || window.event]);}
			
			
			rtnVal = os.evtHandler(os.elm,os.text,os.evtDefault,runTrackingCode);
			rtnVal = (typeof rtnVal!="undefined") ? rtnVal : os.evtDefault;
				
			
			return rtnVal;
		}
	}

	
			
}
