/**
 Hyundai OmnitureController Handler
*/

/**
 * Gets the handler for VSR and VD pop up form events
 */
function getConversionHandler(additionalPublisherData) {
	var debounce = false;
	return function(eventName, publisherData, subscriberData) {
		// on form submission, fire the conversion event
		if (!debounce && !!document.getElementById("inv_form_confirmation_frame")) {
			// Don't allow it to execute for 10 seconds
			debounce = true;
			onConversionEvent(eventName, jQuery.extend({}, publisherData, additionalPublisherData), subscriberData);
			// Allow it to execute again after 10 seconds
			window.setTimeout(function() {
				debounce = false;
			}, 10000);
		}
	}
}

/**
 * Gets the leadId by looking in the ContextManager of the current window and any child windows.
 * @returns if no leadId found, returns null. If one leadId found, a string containing the leadId. If more than one
 * 			leadId found, an array of strings is returned.
 */
function getLeadId() {
	var value = null;
	if (!!ContextManager.leadId) {
		value = ContextManager.leadId;
	} else {
		var frames = jQuery("iframe").get();
		for (var i = 0, iEnd = frames.length; i < iEnd; i++) {
			if (!!frames[i] &&
			  !!frames[i].contentWindow &&
			  !!frames[i].contentWindow.ContextManager &&
			  !!frames[i].contentWindow.ContextManager.leadId) {
				value = frames[i].contentWindow.ContextManager.leadId;
				break;
			}
		}
	}
	return value;
}

function onConversionEvent(eventName, publisherData, subscriberData) {
	OmniturePixelTag.websiteTier = "dealersite";
	var pageName = (!!publisherData && !!publisherData.pageName)
			? publisherData.pageName : ContextManager.pageLayout;
	var event10 = ["event10"];
	var leadId = getLeadId();
	if (!!leadId) {
		event10.push(leadId);
	}
	var pubData = {
		omniturePageName: pageName.replace(/_/, ':')
		,events: event10.join(':')
	};
	var Omniturelayout = pageName.replace(/_/, ':').toLowerCase();
	LSLPOmniturePixelTag.track(pubData,eventName,function(pixelTagObj, pubData){
		pixelTagObj.getWebsiteTier = function() {
			return OmniturePixelTag.websiteTier;
		};
		var options = pixelTagObj.pixelOptions;
		if (options.hierarchy) {
			options.hierachy.replace(/dmasite/, OmniturePixelTag.websiteTier);
	    }
		options.channel = '';
		options.rollupPageName = [OmniturePixelTag.websiteTier, Omniturelayout].join(':');
		s.eVar33 = Omniturelayout;
		s.prop16 = s.eVar36 = ContextManager.webId;
		s.prop14 = leadId;
	});
}

window.OmnitureController = {
	/**
	 * sProps: An object that includes all of the settings need to set up Omniture and fire
	 * events.
	 */
	sProps:{         /* should be in a properties file */
        ACCOUNT: "bzreshyundev" /* Dev: "bzreshyundev",  Prod: "bzreshyunprod" */
        ,CHARSET: "ISO-8859-1"
        ,CURRCODE: "USD"
        ,VISITORNS: "bzreshyundev" /* Dev: "bzreshyundev",  Prod: "bzreshyunprod" */
        ,DC: "112"
        ,DO_LINKTRACKING:true
        ,DO_FORMANALYSIS:true
        ,DO_DEFINEPLUGINS:true
        ,DO_DIRECTIONDIALOGHACK:true
        ,trackingServer: 'bzresults.122.2o7.net'
    }
	/**
	 * eventHandlers: Defines event handlers that will be added to the Cobalt EventManager/OpenAjax. These
	 * handlers forward OpenAjax events to Omniture events.
	 * 
	 * These events can either be set up here or in the 'Manage Pixel Tags' screen in WSM.
	 */
	,eventHandlers: [{
		source: "Cobalt"
		,eventName: "com.cobaltgroup.ws.action.click.getaquote"
		,handler: getConversionHandler({pageName: "getaquote_thankyoupage"})
	},{
		source: "Cobalt"
		,eventName: "com.cobaltgroup.ws.action.click.askaquestion"
		,handler: getConversionHandler({pageName: "askaquestion_thankyoupage"})
	},{
		source: "Cobalt"
		,eventName: "com.cobaltgroup.ws.action.click.makeanoffer"
		,handler: getConversionHandler({pageName: "makeanoffer_thankyoupage"})
	},{
		eventName: 'com.cobaltgroup.ws.view.conversion',
		handler: onConversionEvent,
		source: 'Omniture'
	},{
		source: 'Omniture',
		eventName: 'com.cobaltgroup.ws.view.page',
		handler: function(eventName, publisherData, subscriberData) {
			if (ContextManager.pageLabel !== "HoursAndDirections") {
				return;
			}
			OmniturePixelTag.websiteTier = "dealersite";
			var pubData = {
				omniturePageName: ContextManager.pageLabel
				,events: "event11:" + ContextManager.sessionId
			};
			LSLPOmniturePixelTag.track(pubData, eventName, function(pixelTagObj, pubData){
				pixelTagObj.getWebsiteTier = function() {
					return OmniturePixelTag.websiteTier;
				};
				var options = pixelTagObj.pixelOptions;
				if (options.hierarchy) {
					options.hierachy.replace(/dmasite/, OmniturePixelTag.websiteTier);
			    }
				options.channel = "";
				options.rollupPageName = [OmniturePixelTag.websiteTier, ContextManager.pageLabel].join(':');
				s.prop16 = s.eVar36 = ContextManager.webId;
			});
		}
	},{
		eventName:'com.cobaltgroup.ws.Omniture.init',
		handler:function(eventName, publisherData, subscriberData) {
			publisherData.ACCOUNT = "bzreshyundev"; /* Dev: "bzreshyundev", Prod: "bzreshyunprod" */
			publisherData.CHARSET = "ISO-8859-1";
			publisherData.CURRCODE = "USD";
			publisherData.VISITORNS = "bzreshyundev"; /* Dev: "bzreshyundev", Prod: "bzreshyunprod" */
			publisherData.DC = "112";
			publisherData.initialized = true;
			publisherData.trackingServer = 'bzresults.122.2o7.net'
		},
		source:'Omniture'
	}]
	, plugins: {
		trackTNT: function(v, p, b) {
			var s=this, 
				n="s_tnt", 
				p=(p)?p:n, 
				v=(v)?v:n,
				r="",
				pm=false, 
				b=(b)?b:true;
			if(s.getQueryParam) pm = s.getQueryParam(p); //grab the parameter 
			if(pm) r += (pm + ","); // append the parameter 
			if(s.wd[v]!= undefined) r += s.wd[v]; // get the global variable 
			if(b) s.wd[v] = ""; //Blank out the global variable for ajax requests 
			return r;
		}
			
		,p_gpv: new Function("k","u","" 
			+"var s=this,v='',i=u.indexOf('?'),q;if(k&&i>-1){q=u.substring(i+1);v"
			+"=s.pt(q,'&','p_gvf',k)}return v")
		,p_gvf: new Function("t","k",""
			+"if(t){var s=this,i=t.indexOf('='),p=i<0?t:t.substring(0,i),v=i<0?'T"
			+"rue':t.substring(i+1);if(p.toLowerCase()==k.toLowerCase())return s."
			+"epa(v)}return ''")		 
		 
		,getQueryParam: new Function("qp","d",""
			+"var s=this,v='',i,t;d=d?d:'';while(qp){i=qp.indexOf(',');i=i<0?qp.l"
			+"ength:i;t=s.gcgi(qp.substring(0,i));if(t)v+=v?d+t:t;qp=qp.substring"
			+"(i==qp.length?i:i+1)}return v")
		,gcgi: new Function("k",""
			+"var v='',s=this;if(k&&s.wd.location.search){var q=s.wd.location.sea"
			+"rch.toLowerCase(),qq=q.indexOf('?');q=qq<0?q:q.substring(qq+1);v=s."
			+"pt(q,'&','cgif',k.toLowerCase())}return v")
		,cgif: new Function("t","k",""
			+"if(t){var s=this,i=t.indexOf('='),sk=i<0?t:t.substring(0,i),sv=i<0?"
			+"'True':t.substring(i+1);if(sk.toLowerCase()==k)return s.epa(sv)}ret"
			+"urn ''")

		/*
		 * Plugin: getValOnce 0.2 - get a value once per session or number of days
		 */
		,getValOnce: new Function("v","c","e",""
			+"var s=this,k=s.c_r(c),a=new Date;e=e?e:0;if(v){a.setTime(a.getTime("
			+")+e*86400000);s.c_w(c,v,e?a:0);}return v==k?'':v")

		/*
		 *	Plug-in: crossVisitParticipation v1.7 - stacks values from
		 *	specified variable in cookie and returns value
		 */
		,crossVisitParticipation: new Function("v","cn","ex","ct","dl","ev","dv",""
			+"var s=this,ce;if(typeof(dv)==='undefined')dv=0;if(s.events&&ev){var"
			+" ay=s.split(ev,',');var ea=s.split(s.events,',');for(var u=0;u<ay.l"
			+"ength;u++){for(var x=0;x<ea.length;x++){if(ay[u]==ea[x]){ce=1;}}}}i"
			+"f(!v||v==''){if(ce){s.c_w(cn,'');return'';}else return'';}v=escape("
			+"v);var arry=new Array(),a=new Array(),c=s.c_r(cn),g=0,h=new Array()"
			+";if(c&&c!=''){arry=s.split(c,'],[');for(q=0;q<arry.length;q++){z=ar"
			+"ry[q];z=s.repl(z,'[','');z=s.repl(z,']','');z=s.repl(z,\"'\",'');arry"
			+"[q]=s.split(z,',')}}var e=new Date();e.setFullYear(e.getFullYear()+"
			+"5);if(dv==0&&arry.length>0&&arry[arry.length-1][0]==v)arry[arry.len"
			+"gth-1]=[v,new Date().getTime()];else arry[arry.length]=[v,new Date("
			+").getTime()];var start=arry.length-ct<0?0:arry.length-ct;var td=new"
			+" Date();for(var x=start;x<arry.length;x++){var diff=Math.round((td."
			+"getTime()-arry[x][1])/86400000);if(diff<ex){h[g]=unescape(arry[x][0"
			+"]);a[g]=[arry[x][0],arry[x][1]];g++;}}var data=s.join(a,{delim:',',"
			+"front:'[',back:']',wrap:\"'\"});s.c_w(cn,data,e);var r=s.join(h,{deli"
			+"m:dl});if(ce)s.c_w(cn,'');return r;")
		
		/*
		 * Plugin Utility: Replace v1.0
		 */
		,repl: new Function("x","o","n",""
			+"var i=x.indexOf(o),l=n.length;while(x&&i>=0){x=x.substring(0,i)+n+x."
			+"substring(i+o.length);i=x.indexOf(o,i+l)}return x")
		
		/*
		 * s.join: 1.0 - s.join(v,p)
		 *
		 *  v - Array (may also be array of array)
		 *  p - formatting parameters (front, back, delim, wrap)
		 *
		 */
		,join: new Function("v","p",""
			+"var s = this;var f,b,d,w;if(p){f=p.front?p.front:'';b=p.back?p.back"
			+":'';d=p.delim?p.delim:'';w=p.wrap?p.wrap:'';}var str='';for(var x=0"
			+";x<v.length;x++){if(typeof(v[x])=='object' )str+=s.join( v[x],p);el"
			+"se str+=w+v[x]+w;if(x<v.length-1)str+=d;}return f+str+b;")
		
		/*
		 * Utility Function: split v1.5 (JS 1.0 compatible)
		 */
		,split: new Function("l","d",""
			+"var i,x=0,a=new Array;while(l){i=l.indexOf(d);i=i>-1?i:l.length;a[x"
			+"++]=l.substring(0,i);l=l.substring(i+d.length);}return a")
	}
};
EventManager.registerHandlers(OmnitureController.eventHandlers);

