/*Copyright 2000-2005,Coremetrics 4.2.7 $Revision:111657 $*/if(!cGB){var cGB=true;if(!cm_ClientID){var cm_ClientID="99999999";}if(!cm_HOST){var cm_HOST="test.coremetrics.com/cm?";}if(!cm_ClientTS){var dt=new Date();var cm_ClientTS=dt.getTime();}if(!cm_TrackLink){var cm_TrackLink="";}if(!cm_DelayHandlerReg){var cm_DelayHandlerReg="";}if(!cm_SkipHandlerReg){var cm_SkipHandlerReg="";}if(!cm_TrackTime){var cm_TrackTime=false;}if(!cm_TrackImpressions){var cm_TrackImpressions="";}if(!cm_SecureTags||cm_SecureTags==null){var cm_SecureTags="|2|3|";}if(!cm_FirstPartyDetect){var cm_FirstPartyDetect=false;}if(!cm_DownloadExtensions){var cm_DownloadExtensions=null;}if(!cm_UseUTF8){var cm_UseUTF8=false;}if(!cm_FormError){var cm_FormError="";}if(cm_UseCookie==null){var cm_UseCookie=true;}if(!cm_TimeoutSecs){var cm_TimeoutSecs=15;}if(!cm_OffsiteImpressionsEnabled){var cm_OffsiteImpressionsEnabled=false;}if(!cm_AvidHost){var cm_AvidHost="data.cmcore.com/cookie-id.js?fn=cmSetAvid";}var cm_AvidLoadTimedOut=false;if(!cm_JSFEnabled){var cm_JSFEnabled=false;}if(!cm_JSFPCookieDomain){var cm_JSFPCookieDomain=null;}if(!cm_JSFMigrationEnabled){var cm_JSFMigrationEnabled=0;}if(!cm_JSFSessionType){var cm_JSFSessionType="I";}if(!cm_JSFSessionTimeout){var cm_JSFSessionTimeout=1800;}if(!cm_JSFCoreCookieName){var cm_JSFCoreCookieName="CoreID6";}if(!cm_JSFSpecCookieNames){var cm_JSFSpecCookieNames=new Array();}if(!cmUA){var cmUA=new Object();cmUA["MSIE"]=2083;}if(!cmDefaultLimit){var cmDefaultLimit=8197;}if(cGQ==null){var cGQ=true;}if(!cGO){var cGO=1024;}if(!cGR){var cGR=600000;}if(!encodeURIComponent){var encodeURIComponent=null;}var cG8;var cG8Index;var cG6=document;var cGT;var cG7=new _cG7();cG6.cmTagCtl=cG7;var CI=cmStartTagSet;var CJ=cmSendTagSet;var cG1=0;var cG0=new Array("vn1","vn2","st","pi","rs","ec","rf","ul");var cmLastPageID=null;var cGA=null;var cmMigrationDisabled=0;var cmMigrationFrom1p_CM=1;var cmMigrationFrom1p_SA=2;var cmValidFlag_SessionContinue=1;var cmValidFlag_NewSession=2;var cmValidFlag_NewVisitor=4;var cmValidFlag_SessionReset=32;var cmSACookieName="sauid";var cmCore_JSFParamEnabled="cjen";var cmCore_JSFParamUserID="cjuid";var cmCore_JSFParamSessionID="cjsid";var cmCore_JSFParamValidFlag="cjvf";var cmCore_JSFParamSpecCookiesCount="cjscc";var cmCore_JSFParamSpecCookiesNames="cjscn";var cmCore_JSFParamSpecCookiesValues="cjscv";var cmSpecCookieNames="";var cmSpecCookieValues="";var cmSpecCookiesCount=0;if(!cG4){var cG4=5000;}if(!cG5){var cG5=200;}var cG2=new Object();var cG3=new Object();var cGM=navigator.appVersion;var cGN=navigator.userAgent;var cGS=cGN.indexOf("Opera")>=0;var cGU=cGN.indexOf("Safari")>=0;var cmT2=-1;var cmT3=-1;var cGC="";var cGD="";var cGE="";var cGF="";var cGG="";var cGH="";var cGI="";var cGJ="";var cGK="";var cGL="";var chost=null;var cci=null;CI();for(var cmSpecCookieIndex=0;cmSpecCookieIndex<cm_JSFSpecCookieNames.length;cmSpecCookieIndex++){var currSpecCookieName=cm_JSFSpecCookieNames[cmSpecCookieIndex];var currSpecCookieValue=cI(cm_JSFSpecCookieNames[cmSpecCookieIndex]);if(currSpecCookieValue==null)continue;if(currSpecCookieValue.length==0)continue;cmSpecCookieNames=cmSpecCookieNames+(cmSpecCookieNames!=""?"|":"")+escape(currSpecCookieName);cmSpecCookieValues=cmSpecCookieValues+(cmSpecCookieValues!=""?"|":"")+escape(currSpecCookieValue);cmSpecCookiesCount++;}var dt=new Date();var cmYearOffset=0;if(dt.getFullYear)cmYearOffset=dt.getFullYear();else{cmYearOffset=dt.getYear();if(cmYearOffset<1900)cmYearOffset+=1900;}dt.setYear(cmYearOffset+15);var cmCookieExpDate=dt.toGMTString();if(cm_UseCookie){var pi=cI("cmRS","pi","");if(pi!="")cmLastPageID=pi;chost=cm_HOST;cm_HOST=cI("cmRS","ho",chost);cci=cm_ClientID;cm_ClientID=cI("cmRS","ci",cci);var cT3=cI("cmRS","t3","");if(cT3!=""){cGA=cT3;}var jsfpdata=cI("cmRS","cjen","");if(jsfpdata!=""){cm_JSFEnabled=true;}var cT1=cI("cmRS","t1","");if(cT1!=""&&(!cGA||cm_ClientTS - cGA<cGR)){cmAddShared("st",cT1);var ul=cI("cmRS","ul","");var rf=cI("cmRS","rf","");var cT2=cI("cmRS","t2","");var cT4=cI("cmRS","t4","");if(cm_TrackTime)cN(cT1,cT2,cT3,cT4,true,pi);var hr=cI("cmRS","hr","");if(hr!=""){var ti=cI("cmRS","lti","");if(cm_ClientTS - ti<cGR){var nm=cI("cmRS","ln","");cM(cT1,ti,nm,hr,true,pi,ul,rf);}}var cV6=cI("cmRS","ac","");var cV7=cI("cmRS","fd","");if((cV6!="")||(cV7!="")){var ti=cI("cmRS","fti","");if(cm_ClientTS - ti<cGR){var cV9=cI("cmRS","fn","");var cV0=cI("cmRS","fu","");cL(cT1,ti,cV9,cV6,cV0,cV7,true,pi,ul,rf);}}var cError=unescape(cI("cmRS","uer",""));CH(cT1,cT3,cError,true,pi);}CC("cmRS");}if(!cGS&&(cF(4)||CD(5))){this.onload=cK(this,"onload",this.onload,"cY(e)",cY);this.onunload=cK(this,"onunload",this.onunload,"cZ(e)",cZ);if(cm_DelayHandlerReg.indexOf("L")==-1)window.cX("main");if(cm_DelayHandlerReg.indexOf("F")==-1)cU();}CJ(1);if(cm_OffsiteImpressionsEnabled){var cm_Avid=cI("CMAVID");if(cm_Avid==null){document.write("<script src='"+C8(null)+"//"+cm_AvidHost+"' language='javascript1.1' type='text/javascript'></script>");var cm_AvidLoadTimer=setTimeout("cm_AvidLoadTimedOut=true",2000);}}if(chost)cm_HOST=chost;if(cci)cm_ClientID=cci;}var cI=cI;var cE=cE;function cmStartTagSet(){if(cG8)return;cG8=new Array();cG8[0]=new _cm();cG8Index=1;}function cmAddShared(nm,val){if(cG8)cG8[0][nm]=val;}function cmSendTagSet(){var request;var cG8_tmp=cG8;while((request=C7(arguments[0]))!=null){c9(request,cG8_tmp[0].ci);}cG8=null;}function CQ(pl,host,qs){this.pl=pl;this.hosts=host.split(",");if(qs)this.qs=qs;this.cM5=CR;}function CR(){var a=arguments;var h=a[0]?a[0]:this.hosts[0];return this.pl+"//"+h+(this.qs?this.qs:"");}function _cG7(){this.cM0=new Object();this.uls=new Object();this.rfs=new Object();this.cTI=new Array();this.cPE=0;this.normalizeURL=c2;this.getPageID=c1;this.getPluginPageID=cmGetPluginPageID;}function cmGetPluginPageID(cVA){splitClientIDs=cm_ClientID.split(";");finalClientID=cVA;for(var n=0;n<splitClientIDs.length;n++){if(splitClientIDs[n]==cVA){finalClientID=cm_ClientID;break;}}return this.getPageID(finalClientID);}function c1(cVA){var pi=cG7.cM0[cVA];return pi?pi:"";}function CS(cVA){var ul=cG7.uls[cVA];if(!ul)ul=window.location.href;return ul?ul:"";}function CT(cVA){var rf=cG7.rfs[cVA];if(!rf)rf=cG6.referrer;return rf?rf:"";}function CP(href){var h=cGT;if(!h)h=cGT=cG7.normalizeURL(window.location.href,false);var a=href.indexOf("#");if(a>=0&&a<=h.length){var ha=h.indexOf("#");if(ha<0)ha=h.length;if(href.substring(0,a)==h.substring(0,ha))return href.substring(a);}return href;}function c2(url,isHref){if(isHref){url=CP(url);var pfx=window.location.protocol+"//"+window.location.host;if(url.indexOf(pfx)==0)url=url.substring(pfx.length);}return cD(url);}function c4(){for(var b in cmUA)if(cGM.indexOf(b)!=-1)return cmUA[b];return cmDefaultLimit;}function C0(n){if(cG7){if(cG7.cTI&&cG7.cTI[n]){cG7.cTI[n].cmLD=true;if(cG7.cTI[n].ci){cmJSFSetValidFlagValue(cmValidFlag_SessionContinue,false,cG7.cTI[n].ci);cmJSFSetSessionCookies(false,cG7.cTI[n].ci);}}cG7.cPE--;if(cG7.onResponse)cG7.onResponse(n);}dontExit=false;}function CN(n){if(cG7){cG7.cPE--;var img=null;if(cG7.cTI&&cG7.cTI[n]){img=cG7.cTI[n];img.cmLD=true;}if(cG7.onError&&(!img||!img.cmTO))cG7.onError(3,img);}}function c6(host,n){if(cG3)cG3[host]=true;C0(n);}function CO(n){if(cG7&&cG7.cTI&&cG7.cTI[n]&&!(cG7.cTI[n].cmLD)){var img=cG7.cTI[n];img.cmTO=img.src;if(cG7.onError)cG7.onError(4,img.cmTO);}}function c8(host){if(!cG3||cG3[host])return true;var dt=new Date();if((dt.getTime()-cG2[host])>cG4)return true;return false;}function CV(host,url,cVBH){if(!cVBH)cVBH=cm_ClientID;if((!cG2[host]||c8(host))&&(cm_OffsiteImpressionsEnabled==false||cm_Avid!=null||cm_AvidLoadTimedOut)){var img=new Image();var i=cG1;cG7.cTI[cG1++]=img;if(!cG2[host]){var dt=new Date();cG2[host]=dt.getTime();img.onload=new Function("if(c6)c6('"+host+"',"+i+");");}else{img.onload=new Function("if(C0)C0("+i+");");}img.onerror=new Function("if(CN)CN("+i+");");if(cm_OffsiteImpressionsEnabled&&cm_Avid!=null){url+="&avid="+cm_Avid;}var limit=c4();if(url.length>limit){url=url.substring(0,limit-6)+"&err=O";}if(cG7.onTagSent)cG7.onTagSent(url,i);img.src=url;img.ci=cVBH;setTimeout('if(CO)CO('+i+');',cm_TimeoutSecs * 1000);}else{setTimeout('if(CV)CV("'+host+'","'+url+'","'+cVBH+'");',cG5);}}function c9(img,ci){if(cI("CMDisabled"))return;for(var h=0;h<img.hosts.length;h++){var url=img.cM5(img.hosts[h]);cG7.cPE++;CV(img.hosts[h],url,ci);}}function cC(){if(!this.ul){if(this.tid=="8"||(this.tid=="9"||this.tid=="10")){this.ul=window.location.protocol+"//"+window.location.hostname;}else{this.ul=window.location.href;}}if(cG8)cG8[cG8Index++]=this;else{var request=this.getImgSrc(arguments[0],1);c9(request,this.ci);return request;}}function C4(src,tgt,compact){if(!compact){if(!src.rf){if(!document.referrer)tgt.rf="";else tgt.rf=document.referrer;}else if(src!=tgt)tgt.rf=src.rf;if(!src.ul||src.ul==""||src.ul=="(none)")tgt.ul=window.location.href;else if(src!=tgt)tgt.ul=src.ul;var ul=cG7.normalizeURL(tgt.ul,false);if(ul!="")tgt.ul=ul;}}function C5(tgt,compact){if(cm_FirstPartyDetect&&!compact){if(cI("cmRS")||cI("TestSess")){tgt.ts="Y";}else{CB("TestSess","Y");tgt.ts=cI("TestSess");}tgt.tp=cI("TestPerm");if(tgt.tp!="Y"){dt.setHours(dt.getHours()+5);CB("TestPerm","Y",dt.toGMTString());tgt.tp=cI("TestPerm");}}}function C6(tag,cV3,skipJSFParams){var qs="";if(tag.tid)qs+="tid="+tag.tid;var isPV=(tag.tid==1||(tag.pc&&tag.pc.charAt(0)=='Y'));if(!tag.lp&&isPV)tag.lp=cmLastPageID;for(var cOb in tag){if(!tag[cOb]||tag[cOb]==""||tag[cOb].constructor==Function||cOb=="qs"||cOb=="tid")continue;if(cV3&&cV3[cOb]==tag[cOb])continue;if(qs!="")qs+="&";qs+=cD(cOb)+"="+cE(cD(tag[cOb]));}if(!tag.rs&&tag.ci){if(tag.pi&&isPV)cG7.cM0[tag.ci]=tag.pi;if(tag.ul)cG7.uls[tag.ci]=tag.ul;if(tag.rf)cG7.rfs[tag.ci]=tag.rf;}if(cV3&&cm_SecureTags.indexOf("|"+tag.tid+"|")!=-1)cV3.protocol="https:";if(cm_JSFEnabled&&!skipJSFParams){cmJSFSetSessionCookies(false,tag.ci);qs+=(qs!=""?"&":"")+cmCore_JSFParamEnabled+"=1";var userIdParamValue=cI(cm_JSFCoreCookieName);qs+="&"+cmCore_JSFParamUserID+"="+(userIdParamValue!=null?userIdParamValue:"");qs+="&"+cmCore_JSFParamSessionID+"="+cmJSFGetSessionValue(tag.ci);if(cmSpecCookiesCount>0){qs+="&"+cmCore_JSFParamSpecCookiesCount+"="+cmSpecCookiesCount;qs+="&"+cmCore_JSFParamSpecCookiesNames+"="+cmSpecCookieNames;qs+="&"+cmCore_JSFParamSpecCookiesValues+"="+cmSpecCookieValues;}qs+="&"+cmCore_JSFParamValidFlag+"="+cmJSFGetValidFlagValue(tag.ci);}return qs;}function C8(cV3){var cm_pl=location.protocol;if(cV3&&cV3.protocol)cm_pl=cV3.protocol;if(cm_pl!="http:"&&cm_pl!="https:")cm_pl="http:";return cm_pl;}function c0(){var a=arguments;C4(this,this,a[0]);C5(this,a[0]);var cV3=new Object();var qs=C6(this,cV3);var req=new CQ(C8(cV3),cm_HOST,qs);return a[1]?req:req.cM5();}function C7(){var cV3,first,p,a,pl,lim,len,l,i,tq;if(!cG8||cG8.length<2)return null;cV3=cG8[0];first=cG8[1];cV3.ci=first.ci;for(i=2;i<cG8.length;i++){if(cV3.ci.indexOf(cG8[i].ci)==-1){cV3.ci+=";"+cG8[i].ci;}}for(i=0;i<cG0.length;i++){p=cG0[i];if(!cV3[p])cV3[p]=first[p];}a=arguments;C4(first,cV3,a[0]);C5(cV3,a[0]);pl=C8(cV3);img=new CQ(pl,cm_HOST);img.qs=C6(cV3);lim=c4();len=0;for(var h=0;h<img.hosts.length;h++){l=pl.length+img.hosts[h].length+img.qs.length;if(l>len)len=l;}for(i=1;i<cG8.length;i++){tq=C6(cG8[i],cV3,true);if(i>1&&len+tq.length+1>lim){for(j=1;j<cG8.length-i+1;j++)cG8[j]=cG8[j+i-1];cG8.length=cG8.length-i+1;break;}len+=tq.length+1;img.qs+="&"+tq;}if(i==cG8.length)cG8=null;return img;}function _cm(){var i,a=arguments;this.ci=cm_ClientID;for(i=0;i<a.length;i++)this[a[i]]=a[++i];this.write=cC;this.getImgSrc=c0;this.writeImg=cC;this.st=cm_ClientTS;this.vn1="4.2.7";if(cF(5.5)||!cF(0)){var ec=(cm_UseUTF8&&encodeURIComponent)||cGU?"utf-8":cG6.charset;if(!ec)ec=cG6.defaultCharset;if(!ec)ec=cG6.characterSet;this.ec=ec;}}function cD(s){var z="";s=z+(!s?"":s);return s.split("'").join(z).split("\"").join(z).split("\r").join(z).split("\n").join(z);}function cE(s){var i=0,j;while(s.charAt(i)==" "&&i!=s.length)i++;j=s.length-1;while(s.charAt(j)==" "&&j!=0)j--;s=s.substring(i,j+1);if(cm_UseUTF8&&encodeURIComponent)s=encodeURIComponent(s);else{s=preEscape(s);s=escape(s);var regularExpression=new RegExp("%25u00","g");s=s.replace(regularExpression,"%u00");}s=s.split("+").join("%2B");return s;}function preEscape(str){for(var i=160;i<256;i++){var regularExpression=new RegExp(String.fromCharCode(i),"g");str=str.replace(regularExpression,"%u00"+i.toString(16));}return str;}function cF(ver){var i=cGM.indexOf("MSIE");if(i!=-1)return(parseFloat(cGM.substring(i+5))>=ver);return false;}function CD(ver){return(cGN.indexOf("Gecko")!=-1&&parseInt(cGM)>=ver);}function cI(nm,skey,cV5){var dc=cG6.cookie;var cV4=cJ(nm,dc,";");if(!skey||!cV4){if(!cV4&&cV5!=null){return cV5;}return cV4;}cV4=cJ(skey,cV4,"&");if(!cV4&&cV5!=null){return cV5;}return unescape(cV4);}function CL(){var cookies,dc,nv,i,c=0;dc=cG6.cookie;if(dc){cookies=dc.split(";");c=cookies.length;for(i=0;i<cookies.length;i++){nv=cookies[i].split("=");if(nv.length<2||nv[1]==null||nv[1]==""){c--;}}}return c;}function CB(nm,val,expires,domain){var err,len,v,dc=cG6.cookie;err=null;len=val.length+1;if(!cI(nm)){len+=nm.length;}if(len>4096)err=1;else if(dc){if(CL()>=50)err=2;}if(err){if(cG7.onError)cG7.onError(err,name);return false;}v=nm+"="+val+";path=/";if(domain)v+=";domain="+domain;if(expires)v+=";expires="+expires;cG6.cookie=v;return true;}function cmSetSubCookie(nm,skey,value,expires,domain){var currentCookieVal=cI(nm);var newCookieVal;if(!currentCookieVal){newCookieVal=skey+"="+value;}else{var sep='&';var pfx=skey+"=";var begin=currentCookieVal.indexOf(pfx);if(begin>=0){if(begin>0&&currentCookieVal.charAt(begin - 1)!=sep){begin=currentCookieVal.indexOf(sep+pfx);if(begin>=0){begin++;}}}if(begin>=0){var valueOffset=begin+skey.length+1;var end=currentCookieVal.indexOf(sep,valueOffset);if(end<0){end=currentCookieVal.length;}newCookieVal=currentCookieVal.substring(0,valueOffset)+value+currentCookieVal.substring(end);}else{newCookieVal=currentCookieVal+sep+skey+"="+value;}}CB(nm,newCookieVal,expires,domain);}function CC(nm,domain){var v=cI(nm);if(v!=null){var dt=new Date();dt.setYear(1973);var v=nm+"=;path=/;expires="+dt.toGMTString();if(domain)v+=";domain="+domain;cG6.cookie=v;}return v;}function cJ(nm,src,sep){var pfx,s,begin,end,obj=null;pfx=nm+"=";s=sep+' ';begin=src.indexOf(s+pfx);if(begin==-1){s=sep;begin=src.indexOf(s+pfx);}if(begin==-1){begin=src.indexOf(pfx);if(begin!=0){return null;}}else{begin+=s.length;}end=src.indexOf(s,begin);if(end==-1){end=src.length;}return src.substring(begin+pfx.length,end);}function cK(elt,type,handle,fName,f){if(handle){var event=handle.toString();if(event.indexOf(fName)==-1){if(cGU&&event.indexOf("function "+"(")==0){if(type=="onload"){fName=event.substring(event.indexOf("{"),event.length)+";"+fName+";";}else{fName=fName+";"+event.substring(event.indexOf("{"),event.length);}}else{elt["_c_"+type]=handle;if(type=="onload"){fName="if(!e)var e=null;var ret=this._c_"+type+"("+(cF(5)?"":"e")+");"+fName+";return ret;"}else{fName="if(!e)var e=null;"+fName+";return this._c_"+type+"("+(cF(5)?"":"e")+");"}}if(type=="onsubmit"){elt.cmFunction1=cP;elt.cmFunction2=elt.onsubmit;return cmAlternateOnSubmit;}else{var newfunc=new Function("e",fName);return newfunc;}}else{return handle;}}else{if(type=="onsubmit"){elt.cmFunction1=cP;return cmAlternateOnSubmit;}else{return f;}}}function cmAlternateOnSubmit(e){e=CG(e);if(!e){if(document.cmPostbackForm){e=document.cmPostbackForm;}else if(this.cmFunction1){e=this;}else{return true;}}else if(e){if(e.form){e=e.form;}}else{return true;}if(e.cM1>=0){CI();cO(e?e.cM1:-1,"S");CA(1);CJ(1);CE();}if(e.cmFunction2){return e.cmFunction2();}else{return true;}}function CG(e){var e;if(cF(4)){if(window.event){e=window.event.srcElement;}}else if(e){if(CD(5)){e=e.currentTarget;}else{e=e.target;}}return e;}function CU(cm,cVBH,pi,dest,ref){var ul,rf;cm.pi=pi?pi:c1(cVBH);if(cGQ){if(dest||ref){cm.ul=dest?dest:"";cm.rf=ref?ref:"";}else{ul=CS(cVBH);rf=CT(cVBH);if(cm.pi==""||ul.indexOf("cm_")>0||(rf!=""&&rf.indexOf(window.location.protocol+"//"+window.location.host)!=0)){cm.ul=ul;cm.rf=rf;}}}}function cL(t1,t3,fname,cVB,url,field,resent,pi,dest,ref){var cm=new _cm("tid","10");CU(cm,cm.ci,pi,dest,ref);cm.st=t1;cm.ti=t3;cm.fo=fname;cm.ac=cVB;cm.hr=url;cm.fi=field;if(resent)cm.rs="Y";cm.write(1);}function cM(t1,ti,name,href,resent,pi,dest,ref){var cm=new _cm("tid","8");CU(cm,cm.ci,pi,dest,ref);cm.st=t1;cm.ti=ti;cm.nm=name;cm.hr=href;var cm_crIndex=href.indexOf("cm_cr=");var cm_meIndex=href.indexOf("cm_me=");if(cm_crIndex>-1){var tempIndex=href.indexOf("&",cm_crIndex);if(tempIndex==-1){cm.cm_cr=href.substring(cm_crIndex+6);}else{cm.cm_cr=href.substring(cm_crIndex+6,tempIndex);}}if(cm_meIndex>-1){var tempIndex=href.indexOf("&",cm_meIndex);if(tempIndex==-1){cm.cm_me=href.substring(cm_meIndex+6);}else{cm.cm_me=href.substring(cm_meIndex+6,tempIndex);}}if(resent)cm.rs="Y";cm.write(1);}function cN(t1,t2,cx,t4,resent,pi){var cm=new _cm("tid","11");cm.pi=pi?pi:c1(cm.ci);cm.st=t1;cm.lc=t2;cm.lx=t4;cm.cx=cx;if(resent)cm.rs="Y";cm.write(1);}function CM(href){var n,len,a,q;if((n=href.indexOf("?"))==-1)n=href.lastIndexOf("/");if(n!=-1){len=href.indexOf("#",n);if(len==-1)len=href.length;while(n!=-1&&n<len){n=href.indexOf("cm_",n);if(n!=-1){a=href.indexOf("&",n);if(a==-1)a=len;q=href.indexOf("=",n);if(q!=-1&&q<a)this[href.substring(n,q)]=href.substring(q+1,a);n=a;}}}}function CK(href,trackSP,trackRE,trackCR,trackME){var cm,link,sp,re,cr,me;if((trackSP||trackRE)&&href){cm=new _cm("tid","9");link=new CM(CP(href));if(trackSP){sp=cm.cm_sp_o=link.cm_sp_o;if(!sp)sp=cm.cm_sp=link.cm_sp;}if(trackRE){re=cm.cm_re_o=link.cm_re_o;if(!re)re=cm.cm_re=link.cm_re;}if(trackCR){if(href.indexOf("#")==-1){cr=cm.cm_cr=link.cm_cr;}}if(trackME){me=cm.cm_me=link.cm_me;}if(sp||re||cr||me){cm.pi=c1(cm.ci);cm.st=cm_ClientTS;cm.write(1);}}}function CH(t1,ti,msg,resent,pi){if(msg!=cGL){var cm=new _cm("tid","12");cm.pi=pi?pi:c1(cm.ci);cm.st=t1;cm.ti=ti;if(resent)cm.rs="Y";cm.er=msg;cm.write(1);cGL=cm_FormError;}}function cO(cVC,cVB){var dt,url="";cVB=cVC+":"+cVB;if(cVC!=-1){var curForm=cG6.forms[cVC];if(cF(5))url=curForm.attributes.action.nodeValue;else if(curForm.attributes.getNamedItem){url=curForm.attributes.getNamedItem('action');if(url)url=url.value;}else url=curForm.action;if(!url)url="";}if(cV(url)){dt=new Date();cGH=dt.getTime();cGF=cVB;cGE=cG7.normalizeURL(url,true);cL(cm_ClientTS,cGH,cGD,cGF,cGE,cGC,false);cGG=cGC;cGC="";}else{cGF="";}}function cP(e){CI();var e=CG(e);cO(e?e.cM1:-1,"S");CA(1);CJ(1);CE();}function cQ(e){var e=CG(e);if(e)cO(e.cM1,"R");}function cR(e){var e=CG(e);if(e)e.cM3="xyzzy";}function cS(e){var e=CG(e);if(e)e.cM3=e.value;}function cT(e){var e=CG(e);if(e&&(e.type!="submit")&&(e.type!="reset")){if(e.value!=e.cM3){var cmTempFormID=e.name;if(!cmTempFormID){cmTempFormID=e.id;}var cmTempFieldSeq=cGC+e.cM1+":"+e.cM2+":"+cmTempFormID.split(":").join("|").split(";").join("|")+";";if(cmTempFieldSeq.length<1000){cGC=cmTempFieldSeq;}}}}function CF(e){var e=CG(e);if(e)cGC=cGC+e.cM1+":"+e.cM2+":"+e.name+";";}function cU(){if(cm_SkipHandlerReg.indexOf("F")==-1){var i,form,cV9,j,e;for(i=0;i<cG6.forms.length;i++){form=cG6.forms[i];if(form.cM1==null){form.cM1=i;if(cF(5))if(form.attributes.name){cV9=form.attributes.name.nodeValue;}else if(form.attributes.id){cV9=form.attributes.id.nodeValue;}else{cV9="UNDEFINED";}else if(form.attributes.getNamedItem){cV9=form.attributes.getNamedItem('name');if(cV9)cV9=cV9.value;}else cV9=form.name;if(!cV9)cV9="";cGD=cGD+cV9+":"+i+";";form.onsubmit=cK(form,"onsubmit",form.onsubmit,"cP(e)",cP);form.onreset=cK(form,"onreset",form.onreset,"cQ(e)",cQ);for(j=0;j<form.elements.length;j++){e=form.elements[j];e.cM1=i;e.cM2=j;e.cM3="";e.onfocus=cK(e,"onfocus",e.onfocus,"cS(e)",cS);e.onblur=cK(e,"onblur",e.onblur,"cT(e)",cT);e.onchange=cK(e,"onchange",e.onchange,"cR(e)",cR);if(e.type=='submit'||e.type=='button')e.onclick=cK(e,"onclick",e.onclick,"CF(e)",CF);}}}}}function cV(path){if(cm_TrackLink==true||cm_TrackLink=="A")return true;else{if(cm_TrackLink=="E"&&path.indexOf("/")!=0)return true;var de;if((de=cm_DownloadExtensions)!=null){var p=path.lastIndexOf(".");if(p!=-1){var ext=path.substring(p);for(var e=0;e<de.length;e++){if(ext==de[e])return true;}}}return false;}}function cW(e){CI();var e=CG(e);if(e)C9(e);CA(1);CJ(1);CE();}function C9(e){cGI="";cGJ="";cGK="";var type=e.tagName.toUpperCase();if(type=="AREA"){cGJ=e.href?e.href:"";var p=e.parentElement?e.parentElement:e.parentNode;if(p!=null)cGI=p.name?p.name:"";}else{while(type!="A"&&type!="HTML"){if(!e.parentElement)e=e.parentNode;else e=e.parentElement;if(e)type=e.tagName.toUpperCase();}if(type=="A"){cGJ=e.href?e.href:"";cGI=e.name?e.name:"";}}var man_cm_re=e.getAttribute("manual_cm_re");if(man_cm_re){cGJ=cGJ+((cGJ.indexOf("?")>-1)?"&":"?")+"cm_re="+man_cm_re;}var man_cm_sp=e.getAttribute("manual_cm_sp");if(man_cm_sp){cGJ=cGJ+((cGJ.indexOf("?")>-1)?"&":"?")+"cm_sp="+man_cm_sp;}cGJ=cG7.normalizeURL(cGJ,true);if(cV(cGJ)==true){var dt=new Date();cGK=dt.getTime();cM(cm_ClientTS,cGK,cGI,cGJ,false);}else{cGJ="";}}function cX(phase){CI();var i,lnk,imp,trackSP,trackRE,trackCR,trackME;imp=cm_TrackImpressions;trackSP=(imp.indexOf("S")!=-1);trackRE=(imp.indexOf("R")!=-1);trackCR=(imp.indexOf("C")!=-1);trackME=(imp.indexOf("C")!=-1);for(i=0;i<cG6.links.length;i++){lnk=cG6.links[i];if(cm_SkipHandlerReg.indexOf("L")==-1){if(!CD(5)){lnk.onclick=cK(lnk,"onclick",lnk.onclick,"cW(e)",cW);}else if(!lnk.cM4){lnk.addEventListener("click",cW,false);lnk.cM4=1;}}if(phase=="onload"){var tempLinkHref=lnk.href;if(lnk.getAttribute("manual_cm_re")){if(lnk.href.indexOf("?")>-1){tempLinkHref=tempLinkHref+"&cm_re="+lnk.getAttribute("manual_cm_re");}else{tempLinkHref=tempLinkHref+"?cm_re="+lnk.getAttribute("manual_cm_re");}}if(lnk.getAttribute("manual_cm_sp")){if(lnk.href.indexOf("?")>-1){tempLinkHref=tempLinkHref+"&cm_sp="+lnk.getAttribute("manual_cm_sp");}else{tempLinkHref=tempLinkHref+"?cm_sp="+lnk.getAttribute("manual_cm_sp");}}if(!lnk.cmImpressionSent){CK(tempLinkHref,trackSP,trackRE,trackCR,trackME);lnk.cmImpressionSent=1;}}}CJ(1);}function cY(e){var dt=new Date();cmT2=dt.getTime();CH(cm_ClientTS,cmT2,cm_FormError,false);if(!cGS&&(cF(4)||CD(5))){window.cX("onload");cU();}cGB=null;}function cZ(e){cG3=null;CI();var delay=false;if(cGC!=""){cO(-1,"U");delay=true;}CA(0);CH(cm_ClientTS,cmT3,cm_FormError,false);CJ(1);if(delay){dontExit=true;var d1=new Date();var d2=new Date();for(;dontExit&&(d2-d1<1000);){d2=new Date();}}CE();if(cm_UseCookie&&cG7.cPE==0){var pi=escape(c1(cm_ClientID));CB("cmRS","t3="+cmT3+"&pi="+pi);}if(cG7.onUnload)cG7.onUnload();if(cF(5)&&!cF(5.5)&&window.parent!=window)cG7.cTI=null;else{if(!cGU){for(var i=0;i<cG7.cTI.length;i++){cG7.cTI[i].onload=null;cG7.cTI[i].onerror=null;}}}}function CA(force){var dt=new Date();var cx=dt.getTime();if(cm_TrackTime&&(cmT3==-1||force==1||(cx-cmT3)>10000)){cN(cm_ClientTS,cmT2,cx,cGA,false);}cmT3=cx;}function CE(){if(cm_UseCookie){var cVF,cVG,pg,cVD,cVE="";cVF=cGA?"&t4="+cGA:"";cVG=(cGJ!="")?"&lti="+cGK+"&ln="+escape(cGI)+"&hr="+escape(cGJ):"";pg=new Object();CU(pg,cm_ClientID);var jsfpdata="";if(cm_JSFEnabled){jsfpdata="&cjen=1";}cVD="&t1="+cm_ClientTS+"&t2="+cmT2+"&t3="+cmT3+cVF+cVG+"&fti="+cGH+"&fn="+escape(cGD)+"&ac="+cGF+"&fd="+escape(cGG)+"&uer="+escape(cm_FormError)+"&fu="+escape(cGE)+"&pi="+escape(pg.pi)+"&ho="+escape(cm_HOST)+"&ci="+escape(cm_ClientID);if(pg.ul&&pg.rf&&pg.ul.length+pg.rf.length<cGO)cVE="&ul="+escape(pg.ul)+"&rf="+escape(pg.rf);if(!CB("cmRS",cVD+cVE+jsfpdata))if(!CB("cmRS",cVD+jsfpdata))CB("cmRS","t3="+cmT3+"&pi="+escape(pg.pi)+jsfpdata);}}function cmSetAvid(id){clearTimeout(cm_AvidLoadTimer);if(id){cm_Avid=id;}else{cm_Avid="";}CB("CMAVID",cm_Avid);cm_AvidLoadTimedOut=false;}function cmJSFConvertSAtoCM(value){var len=value.length;var lenSA=22;var lenCM=23;if(len<19)return null;if(value.charAt(0)!="U"&&value.charAt(0)!="u")return null;if(len<lenSA){value=value+value.substring(len -(lenSA - len),len);}var result="99";result=result+value.substring(1,lenCM - 1);return result;}function cmJSFSetSessionCookies(reset,cVBHs){if(!cm_JSFEnabled)return;var splitClientIDs=cVBHs.split(";");for(var n=0;n<splitClientIDs.length;n++){cmJSFSetSingleSessionCookie(reset,splitClientIDs[n]);}}function debugReadCookie(name){var nameEQ=name+"=";var ca=document.cookie.split(';');for(var i=0;i<ca.length;i++){var c=ca[i];while(c.charAt(0)==' ')c=c.substring(1,c.length);if(c.indexOf(nameEQ)==0)return c.substring(nameEQ.length,c.length);}return null;}function cmJSFSetSingleSessionCookie(reset,cVBH,noRecurse){if(!cm_JSFEnabled)return;if(cI(cm_JSFCoreCookieName)==null){if(!cmJSFDoMigrateCookies()){CB(cm_JSFCoreCookieName,cmJSFCreateUserId(),cmCookieExpDate,cm_JSFPCookieDomain);}if(!noRecurse){cmJSFSetSingleSessionCookie(true,cVBH,true);}cmJSFSetValidFlagSingleValue(cmValidFlag_NewSession,false,cVBH);cmJSFSetValidFlagSingleValue(cmValidFlag_NewVisitor,true,cVBH);return;}var sessionCookieExists=(cmJSFGetSessionLoginCookieValue(cVBH)!=null);if(!sessionCookieExists){if(cmJSFCombineSessionCookies(cVBH)){sessionCookieExists=(cmJSFGetSessionLoginCookieValue(cVBH)!=null);}}if(!sessionCookieExists&&!reset){if(!noRecurse){cmJSFSetSingleSessionCookie(true,cVBH,true);}cmJSFSetValidFlagSingleValue(cmValidFlag_NewSession,true,cVBH);return;}var dt=new Date();var cmSessionTime=dt.getTime();var cmSessionExpTime=cmSessionTime+cm_JSFSessionTimeout*1000;var isSessionExpired=cmJSFIsSessionExpired(cmJSFGetSessionExpireCookieValue(cVBH));if((reset!=null&&reset==true)||isSessionExpired){var cmTimeoutStr=cmSessionTime.toString();if(cmTimeoutStr.length<10){while(cmTimeoutStr.length<10)cmTimeoutStr="0"+cmTimeoutStr;}else cmTimeoutStr=cmTimeoutStr.substring(0,10);cmJSFSetSessionLoginCookieValue(cVBH,cmTimeoutStr);if(isSessionExpired)cmJSFSetValidFlagSingleValue(cmValidFlag_SessionReset,true,cVBH);else cmJSFSetValidFlagSingleValue(cmValidFlag_NewSession,true,cVBH);if(cm_JSFSessionType=="T")cmJSFSetSessionExpiresCookieValue(cVBH,cmSessionExpTime.toString());}if(cm_JSFSessionType=="I")cmJSFSetSessionExpiresCookieValue(cVBH,cmSessionExpTime.toString());}function cmJSFIsSessionExpired(cookieExpValue){if(cookieExpValue==null)return false;var dt=new Date();if(dt.getTime()>cookieExpValue)return true;else return false;}function cmJSFCreateUserId(){var currDate=new Date();var rand1=Math.random();if(rand1==0)rand1=Math.random();var rand2=Math.random();if(rand2==0)rand2=Math.random();var userId=rand1.toString().substring(2,4)+rand2.toString().substring(2,12)+currDate.getTime().toString();var len=userId.length;var lenCM=23;if(len<lenCM){userId=userId+userId.substring(len -(lenCM - len),len);}if(len>lenCM){userId=userId.substring(0,lenCM);}return userId;}function cmJSFSetValidFlagValue(value,append,cVBHs){if(!cm_JSFEnabled)return;var splitClientIDs=cVBHs.split(";");for(var n=0;n<splitClientIDs.length;n++){cmJSFSetValidFlagSingleValue(value,append,splitClientIDs[n]);}}function cmJSFSetValidFlagSingleValue(value,append,cVBH){var validFlag=null;var validFlagValueStr=cmJSFGetSessionValidFlagCookieValue(cVBH);if(validFlagValueStr){var validFlagValue=parseInt(validFlagValueStr);if(!isNaN(validFlagValue))validFlag=validFlagValue;}if(validFlag==null)validFlag=cmValidFlag_SessionContinue;if(append){if(value==cmValidFlag_NewSession)validFlag &=~cmValidFlag_SessionReset;if(value==cmValidFlag_SessionReset)validFlag &=~cmValidFlag_NewSession;validFlag |=value;}else{validFlag=value;}validFlag |=cmValidFlag_SessionContinue;cmJSFSetSessionValidFlagCookieValue(cVBH,validFlag);}function cmJSFCreateCombinedSessionCookieName(cVBH){return cVBH+"_clogin";}function cmJSFCombineSessionCookies(cVBH){var loginValue=cI(cVBH+"_login");var expiresValue=cI(cVBH+"_expires");var validFlagValue=cI(cVBH+"_valid");if(loginValue!=null&&expiresValue!=null & validFlagValue!=null){var combinedCookieStr="l="+loginValue+"&e="+expiresValue+"&v="+validFlagValue;CB(cmJSFCreateCombinedSessionCookieName(cVBH),combinedCookieStr,null,cm_JSFPCookieDomain);CC(cVBH+"_login",cm_JSFPCookieDomain);CC(cVBH+"_expires",cm_JSFPCookieDomain);CC(cVBH+"_valid",cm_JSFPCookieDomain);return true;}return false;}function cmJSFSetSessionLoginCookieValue(cVBH,value){cmSetSubCookie(cmJSFCreateCombinedSessionCookieName(cVBH),"l",value,null,cm_JSFPCookieDomain);}function cmJSFSetSessionExpiresCookieValue(cVBH,value){cmSetSubCookie(cmJSFCreateCombinedSessionCookieName(cVBH),"e",value,null,cm_JSFPCookieDomain);}function cmJSFSetSessionValidFlagCookieValue(cVBH,value){cmSetSubCookie(cmJSFCreateCombinedSessionCookieName(cVBH),"v",value,null,cm_JSFPCookieDomain);}function cmJSFGetSessionLoginCookieValue(cVBH){return cI(cmJSFCreateCombinedSessionCookieName(cVBH),"l");}function cmJSFGetSessionExpireCookieValue(cVBH){return cI(cmJSFCreateCombinedSessionCookieName(cVBH),"e");}function cmJSFGetSessionValidFlagCookieValue(cVBH){return cI(cmJSFCreateCombinedSessionCookieName(cVBH),"v");}function cmJSFGetSessionValue(cVBHs){var value="";var delimiter="";var splitClientIDs=cVBHs.split(";");for(var n=0;n<splitClientIDs.length;n++){var cVBH=splitClientIDs[n];if(cVBH=="")continue;var currValue=cmJSFGetSessionLoginCookieValue(cVBH);value+=delimiter+(currValue!=null?currValue:"");if(delimiter=="")delimiter="|";}return value;}function cmJSFGetValidFlagValue(cVBHs){var value="";var delimiter="";var splitClientIDs=cVBHs.split(";");for(var n=0;n<splitClientIDs.length;n++){var cVBH=splitClientIDs[n];if(cVBH=="")continue;var currValue=cmJSFGetSessionValidFlagCookieValue(cVBH);value+=delimiter+(currValue!=null?currValue:"");if(delimiter=="")delimiter="|";}return value;}function cmJSFDoMigrateCookies(){if(cm_JSFMigrationEnabled==cmMigrationFrom1p_SA){if(cI(cm_JSFCoreCookieName)==null){var cmSACookieValue=cI(cmSACookieName);if(cmSACookieValue){cmSACookieValue=cmJSFConvertSAtoCM(cmSACookieValue);if(cmSACookieValue!=null){CB(cm_JSFCoreCookieName,cmSACookieValue,cmCookieExpDate,cm_JSFPCookieDomain);return true;}}}}return false;}_cm.prototype.addTP=function(){var tp=new cmTP(new cmApp());for(var o in tp){if(tp[o]==null||tp[o]==""||tp[o].toString().indexOf("function ")==0)continue;this[o]=cE(cD(tp[o]));}return this;};function cmApp(){var n=navigator,b=n.appName,c=this;if(b=="Netscape"){c.b="ns"}else if(b=="Microsoft Internet Explorer"){c.b="ie"}else{c.b=b}c.v=parseInt(n.appVersion);}function cmTP(c){var n=navigator,w=window.screen;this.jv=cmJv;if(c.b=="ns"&&c.v>=3)for(var i=0;i<n.plugins.length;i++)eval('this.np'+i+'=n.plugins['+i+'].name');if(c.v>3){if(c.v>=4&&(c.b=="ns"||c.b=="ie")){this.je=(n.javaEnabled()==true)?"y":"n";}if(c.b=="ie"){this.ce=n.cookieEnabled;this.cp=n.cpuClass;}this.sw=w.width;this.sh=w.height;this.pd=w.colorDepth;if(this.pd==0){this.pd=w.pixelDepth;}var fs=w.fontSmoothingEnabled;if(fs){this.fs=fs?"y":"n";}}var tz=new Date();if(tz.getTimezoneOffset()==0){this.tz="0";}else{this.tz=tz.getTimezoneOffset()/60;}}
<!--
/*
 * cmdatatagutils.js
 * $Revision: 98360 $
 * $Id:
 * Coremetrics Tag v4.0, 4/18/2003
 * COPYRIGHT 1999-2002 COREMETRICS, INC. 
 * ALL RIGHTS RESERVED. U.S.PATENT PENDING
 *
 * The following functions aid in the creation of Coremetrics data tags.
 * Date				Imp Eng			Desc
 * 03/07/07			Hutch White		consolidate quickenloans.com, quickenloanscareers.com,
 *									rockfinancial.com and realestateinsiders.com libraries
 *	062907			MOCHOA			Added Quizzle.com to consolidated library
 *	071007			MOCHOA			Added Conversion & Element Tagging Function
 *	082307			MOCHOA			Added First Party for Mortagageinsider.com
 *  010208			HWHITE			Added smhl.com to consolidated library
 *  032508			HWHITE			Added optimostParams to pageview and application tags
 *  040908			HWHITE			When Optimost vars for Campaign, Subject and Creative are
 *									present, throw a manual link click tag with real estate
 *									using those as parameters
 * 	070108			MOCHOA			Add SessionID parameter to techprops tag
 *									auto generates conversion event when present
 * 									NOTE: if adding auto techprops, this will be a problem
 *									as pageview does not pass SessionID(the sessionID would need to added to the pageview tag)	
 *	080708			LHIBBARD		Added auto techprops and added SessionID to page view tag
 *	082608			LHIBBARD		Added auto techprops to cmCreateApplicationTags function
 *  091508			HWHITE			Add 1st party subdomain for onereversemortgage.com
 */

/*
 ****************************************************************************************
 * TAG GENERATING FUNCTIONS																*
 ****************************************************************************************
 */
function realOptimost(pageID){
	// if optimostParams exists, extract opCampaing,opSubject and opCreative and use as cm_re parameters 
	if (document.optimostParams){
		var optiP=document.optimostParams.split("|");
	
		for (var i=0;i<3;i++){
				optiP[i] = optiP[i].replace(/^\s+|\s+$/g, '');
		}
		if (document.URL.indexOf("?")>-1){
			argChar="&";
		}else{
			argChar="?";
		}
		cmCreateManualLinkClickTag(document.URL+argChar+"cm_re="+optiP[2]+"-_-"+optiP[1]+"-_-"+optiP[0],"Optimost",pageID);
	}
	return;
}

var cmJv = "1.0";
if (typeof(isNaN) == "function") cmJv = "1.1";
if (typeof(isFinite) == "function") cmJv = "1.2";
if (typeof(NaN) == "number") cmJv = "1.3";
if (typeof(decodeURI) == "function") cmJv = "1.5";
if (typeof(Array.forEach) == "function") cmJv = "1.6";
if (typeof(Iterator) == "object") cmJv = "1.7";

if (document.URL.toLowerCase().indexOf("quickenloans.com")>-1){
   var siteTag="Quicken";
   var cm_TrackLink = "A";
   var cm_TrackImpressions = "RS";
   cm_ClientID="90216732";
   cm_HOST="dc.quickenloans.com/eluminate?";
} else if(document.URL.toLowerCase().indexOf("quickenloanscareers.com")>-1){
   var siteTag="Careers";
   var cm_TrackLink = "A";
   var cm_TrackImpressions = "RS";
   cm_ClientID="90101225";
   cm_HOST="dc.quickenloanscareers.com/eluminate?";
} else if(document.URL.toLowerCase().indexOf("mortgageinsiders.com")>-1){
   var siteTag="HLBP";
   var cm_TrackLink = "A";
   var cm_TrackImpressions = "RS";
   cm_ClientID="90098622";
   cm_HOST="dc.mortgageinsiders.com/eluminate?";
} else if(document.URL.toLowerCase().indexOf("realestateinsiders.com")>-1){
   var siteTag="REI";
   var cm_TrackLink = "A";
   var cm_TrackImpressions = "RS";
   cm_ClientID="90098759";
   cm_HOST="dc.realestateinsiders.com/eluminate?";
} else if(document.URL.toLowerCase().indexOf("rockfinancial.com")>-1){
   var siteTag="Rock";
   var cm_TrackLink = "A";
   var cm_TrackImpressions = "RS";
   cm_ClientID="90084648";
   cm_HOST="dc.rockfinancial.com/eluminate?";
} else if(document.URL.toLowerCase().indexOf("smhl.com")>-1){
    var siteTag="SMHL";
	var cm_ClientID = "90205182";
	var cm_TrackLink = "A";
	var cm_TrackImpressions = "RS";
	var cm_JSFEnabled = true; 
} else if(document.URL.toLowerCase().indexOf("quizzle.com")>-1){
   var siteTag="Quizzle";
   var cm_TrackLink = "A";
   var cm_TrackImpressions = "RS";
   cm_ClientID="90168140";
   cm_HOST="dc.quizzle.com/eluminate?";
} else if(document.URL.toLowerCase().indexOf("onereversemortgage.com")>-1){
    var siteTag="ORM";
	var cm_ClientID = "90222440";
	var cm_TrackLink = "A";
	var cm_TrackImpressions = "RS";
	var cm_JSFEnabled = true; 
}

/*
 * Redirects tag traffic (by default, aimed at test servers) to Coremetrics production servers.
 * Should be called from and only from production environments.
 */
function cmSetProduction(){
	if (document.URL.toLowerCase().indexOf("quickenloans.com")>-1){
	   cm_HOST="dc.quickenloans.com/eluminate?";
	} else if(document.URL.toLowerCase().indexOf("quickenloanscareers.com")>-1){
	   cm_HOST="dc.quickenloanscareers.com/eluminate?";
	} else if(document.URL.toLowerCase().indexOf("mortgageinsiders.com")>-1){
	   cm_HOST="dc.mortgageinsiders.com/eluminate?";
	} else if(document.URL.toLowerCase().indexOf("realestateinsiders.com")>-1){
	   cm_HOST="dc.realestateinsiders.com/eluminate?";
	} else if(document.URL.toLowerCase().indexOf("rockfinancial.com")>-1){
	   cm_HOST="dc.rockfinancial.com/eluminate?";
	} else if(document.URL.toLowerCase().indexOf("smhl.com")>-1){
		cm_HOST="data.coremetrics.com/eluminate?";
		cm_JSFPCookieDomain = "smhl.com";	   
	} else if(document.URL.toLowerCase().indexOf("onereversemortgage.com")>-1){
		cm_HOST="dc.onereversemortgage.com/eluminate?";  
	} else if(document.URL.toLowerCase().indexOf("quizzle.com")>-1){
	   cm_HOST="dc.quizzle.com/eluminate?";
	}
}

function cmCreateConversionEventTag(eventID, actionType, categoryID, points) {
	var cm = new _cm("tid", "14", "vn2", "e4.0");
	cm.cid = eventID;
	cm.cat = actionType;
	cm.ccid = categoryID;
	cm.cpt = points;
	cm.writeImg();
}

function cmCreatePageElementTag(elementID, elementCategory, pageID, pageCategoryID, elementLocation) {
	var cm=new _cm("tid", "15", "vn2", "e4.0");
	
	cm.eid=elementID;
	cm.ecat=elementCategory;
	cm.pflg=0;
	cm.pid=pageID;
	cm.pcat=pageCategoryID;
	cm.eloc=elementLocation;
	
	cm.writeImg();
}

function cmCreateProductElementTag(elementID, elementCategory, productID, productCategoryID, elementLocation) {
	var cm=new _cm("tid", "15", "vn2", "e4.0");

	cm.eid=elementID;
	cm.ecat=elementCategory;
	cm.pflg=1;
	cm.pid=productID;	
	cm.pcat=productCategoryID;
	cm.eloc=elementLocation;
	
	cm.writeImg();
}

function cmCreateManualImpressionTag(pageID, trackSP, trackRE) {
		var cm = new _cm("tid","9","vn2","e4.0");
		cm.pi = pageID;
		cm.cm_sp = trackSP;
		cm.cm_re = trackRE;
		cm.st = cm_ClientTS;
		cm.writeImg();
}

function cmCreateManualLinkClickTag(href,name,pageID) {	
	if (cmCreateLinkTag == null && cM != null) {
		var cmCreateLinkTag = cM;
	}
	if (cmCreateLinkTag != null) {		
		var dt = new Date();
		cmLnkT3 = dt.getTime();
		cmCreateLinkTag(cm_ClientTS, cmLnkT3, name, href, false, pageID);
	}
}

/* manual PageviewTag for off site page tagging.  Allows client to supply URL and Referring URL
*/
function cmCreateManualPageviewTag(pageID, categoryID,DestinationURL,ReferringURL) {
	var cm = new _cm("tid","1","vn2","e4.0");
	cm.pi = pageID;
	cm.cg = categoryID;
	cm.ul = DestinationURL;
	cm.rf = ReferringURL;
	cm.writeImg();
}

/*
 * Creates a Pageview tag with the given Page ID
 *
 * pageID		: required. Page ID to set on this Pageview tag.  If not populated,
				  default page ID is created.
 * categoryID	: optional. Category ID to set on this Pageview tag
 * searchString	: optional. Internal search string enterred by user to reach
 *				  this page.
 * helpFlag		: optional.  T/F to indicate if user is seeing a help message.
 * errorFlag	: optional.  T/F to indicate if user is seeing an error message.
 * toolFlag		: optional.  T/F to indicate if user is using a tool, calculator, etc.
 *
 * optmostParams	: Pipe delimited value.  Fields opCreative,opSubject,opCampaign.  Stored in 
 *					  stored in pv5, pv6 and pv7, respectively
 * returns nothing, causes a document.write of an image request for this tag.
 */
function cmCreatePageviewTag(pageID, categoryID, searchString, numSearchResults,solutionID,leadFormGUID,optimostParams,visitorSessionID) {
	var cm = new _cm("tid", "1", "vn2", "e4.0");
	if (pageID) {
		cm.pi = pageID;
	} else {
		cm.pi = getDefaultPageID();
	}
	cmStartTagSet();
	if (cI("cmTPSet") != 'Y') {
		cm.tid = "6";
		cm.pc = "Y";
		cm.addTP();
		if (visitorSessionID){
			cmCreateConversionEventTag(visitorSessionID, "2", "Client Session ID", "50")
		}
		document.cookie = "cmTPSet=Y; path=/";
	}
	if (this.cmOptimostPageID && (siteTag=="Quicken" || siteTag=="HLBP")) {
		cm.pi = cmOptimostPageID;
	}

	cm.se = searchString;
	cm.sr = numSearchResults;
	cm.cg = categoryID;	
	cm.ul = document.location.href + cmTransformMMCParameters();

	if (solutionID) {
		if (cm.pi.indexOf("Complete") > -1) {
			cm.li = "105"; 
			if (siteTag=="Quicken" || siteTag=="HLBP" || siteTag=="REI" || siteTag=="Rock"){
			    var tempCustID = cI("metricsid");
			    var d = new Date();
			    var tempOrderID = tempCustID + "|" +  d.getTime();
			    cmCreateShopAction9Tag(solutionID, tempCustID, tempOrderID, solutionID);
			    cmCreateOrderTag(tempOrderID, solutionID, tempCustID);	
            }
		}
		else {
			cm.li = "100";	
			if (siteTag=="Quicken" || siteTag=="HLBP" || siteTag=="REI"){
			    cmCreateShopAction5Tag(solutionID, solutionID);
			}
		}
	cm.ps1 = solutionID;
	cm.ps2 = document.referrer.substring(document.referrer.indexOf("/",9) + 1,document.referrer.indexOf("?"));
	cm.ps3 = leadFormGUID;
	}

	var tempSessionID = cI("metricsid") + "";
	cm.pv1 = tempSessionID.substring(0,100);
	cm.pv2 = tempSessionID.substring(100,200);
	cm.pv3 = tempSessionID.substring(200,300);
	if (optimostParams){
		var optiP=optimostParams.split("|");
		cm.pv5=optiP[0];
		cm.pv6=optiP[1];
		cm.pv7=optiP[2]
	}
	
	realOptimost(cm.pi);
	cm.writeImg();
	cmSendTagSet();
}

/*
 * Creates a technical properties tag
 *
 * pageID		: required. Page ID to set on this tag.  If not populated,
				  default page ID is created.
 * categoryID	: optional. Category ID to set on this tag
 *
 * Page Count = "Y", so this tag also registers as a pageview.  No explicit
					pageview tag is necessary.
 */
function cmCreateTechPropsTag(pageID, categoryID,visitorSessionID){
	var cm = new _cm("tid", "6", "vn2", "e4.0");
	cm.addTP();
	if (pageID) {
		cm.pi = pageID;
	} else {
		cm.pi = getDefaultPageID();
	}

	if (this.cmOptimostPageID && (siteTag=="Quicken" || siteTag=="HLBP")) {
		cm.pi = cmOptimostPageID;
	}
	
	if (categoryID) {
		cm.cg = categoryID;
	}
	
	if (visitorSessionID){
		cmStartTagSet();
		cmCreateConversionEventTag(visitorSessionID, "2", "Client Session ID", "50")
	}
	
	cm.pc = "Y";
	cm.ul = document.location.href + cmTransformMMCParameters();
	var tempSessionID = cI("metricsid") + "";
	cm.pv1 = tempSessionID.substring(0,100);
	cm.pv2 = tempSessionID.substring(100,200);
	cm.pv3 = tempSessionID.substring(200,300);
	document.cookie = "cmTPSet=Y; path=/";
	realOptimost(cm.pi);
	cm.writeImg();
	if (visitorSessionID){
		cmSendTagSet();
	}
}

/*
 * Creates a registration tag
 *
 * pageID		: required. Page ID to set on this tag.  If not populated,
				  default page ID is created.
 * categoryID	: optional. Category ID to set on this tag.
 * visitorID	: required.  Unique visitor ID for this user.
 *
 * Page Count = "Y", so this tag also registers as a pageview.  No explicit
					pageview tag is necessary.
 */
function cmCreateRegistrationTag(pageID, categoryID, visitorID) {
	var cm = new _cm("tid", "2", "vn2", "e4.0");		
	cm.cd = visitorID;
	if (pageID) {
		cm.pi = pageID;
	} else {
		cm.pi = getDefaultPageID();
	}
	cm.cg = categoryID;
	cm.pc = "Y";
	cm.ul = document.location.href + cmTransformMMCParameters();
	cm.writeImg();
}

/*
 * Creates application-related tags: 
 *		Pageview tag, application tag, any form field tags.
 *
 * pageID			: required.  Page ID to set on the embedded Pageview tag.  If not populated,
					  default application page ID is created.
 * categoryID		: optional.  Category ID to set on this tag.
 * appName			: required.  Name of application for this tag.
 * appStepNumber	: required.  Number of step in application.
 * appStepName		: required.  Name of step in application.
 * helpFlag			: optional.  T/F to indicate if user is seeing a help message in application flow.
 * errorFlag		: optional.  T/F to indicate if user is seeing an error message in application flow.
 * toolFlag			: optional.  T/F to indicate if user is using a tool, calculator, etc. in application flow.
 * firstStepFlag	: optional.  T/F to indicate if step is first step in application flow.
 * lastStepFlag		: optional.  T/F to indicate if step is last step in application flow.
 * visitorID		: required for last step in application.  Unique visitor ID for this user.
 * transactionID	: required for last step in application.  Unique transaction ID or order ID.
 *					  If not populated, unique ID is created.
 * optmostParams	: Pipe delimited value.  Fields opCreative,opSubject,opCampaign.  Stored in 
 *					  stored in pv5, pv6 and pv7, respectively
 */
function cmCreateApplicationTags(pageID, categoryID, appName, appStepNumber, appStepName, helpFlag, errorFlag, 
	toolFlag, firstStepFlag, lastStepFlag, visitorID, transactionID,optimostParams,visitorSessionID) {

	var cm = new _cm("tid", "1", "vn2", "e4.0");
	if (pageID) {
		cm.pi = pageID;
	} else {
		cm.pi = getDefaultApplicationPageID(appName, appStepName, appStepNumber );
	}
	cmStartTagSet();
	if (cI("cmTPSet") != 'Y') {
		cm.tid = "6";
		cm.pc = "Y";
		cm.addTP();
		if (visitorSessionID){
			cmCreateConversionEventTag(visitorSessionID, "2", "Client Session ID", "50")
		}
		document.cookie = "cmTPSet=Y; path=/";
	}
	if (this.cmOptimostPageID && (siteTag=="Quicken" || siteTag=="HLBP")) {
		cm.pi = cmOptimostPageID;
	}
	if (optimostParams){
		var optiP=optimostParams.split("|");
		cm.pv5=optiP[0];
		cm.pv6=optiP[1];
		cm.pv7=optiP[2]
	}
	
	if (categoryID){
		cm.cg = categoryID;
	}
	
	if (appName) {
		appName = cmRemoveWhiteSpace(appName);
		cm.pv1 = appName;
	}
	if (appStepNumber) {
		cm.pv2 = appStepNumber;
	}	
	if (appStepName) {
		cm.pv3 = appStepName;
	}
	if (helpFlag) {
		cm.pv4 = "HELP";
	}
	if (toolFlag) {
		cm.pv4 = "TOOL";
	}
	if (errorFlag) {
		cm.pv4 = "ERROR";
	}

	if (!transactionID) {
		transactionID = cmGetDefaultOrderID();
	}
	if ((firstStepFlag)&&(appName)) {
		cmCreateShopAction5Tag(appName, categoryID);
	}
	if ((lastStepFlag)&&(appName)) {
		cmCreateShopAction9Tag(appName, visitorID, transactionID, categoryID);
		cmCreateOrderTag(transactionID, appName, visitorID);
	}
	
	// if available, override the referrer with the frameset referrer
	if (parent.cm_ref != null) {
		cm.rf = parent.cm_ref;
		parent.cm_ref = document.URL;
	}
	cm.ul = document.location.href + cmTransformMMCParameters();
	realOptimost(cm.pi);
	cm.writeImg();
	cmSendTagSet();
	cmAppName = appName;
	cmAppStepName = appStepName;
	cmAppStepNumber = appStepNumber;
	cmSetupApplicationTextBoxTags(categoryID, firstStepFlag, lastStepFlag);
}

/* Creates an Error Tag
 *
 * pageID	: required.  If not populated, default page ID is created.
 *
 * returns nothing, causes a document.write of an image request for this tag.
 */
function cmCreateErrorTag(pageID) {
	var cm=new _cm("tid", "404", "vn2", "e4.0");  //DO NOT CHANGE THESE PARAMETERS
	
	// get the referrer from the frameset
	if (parent.cm_ref != null) {
		cm.rf = parent.cm_ref;
		parent.cm_ref = document.URL;
	}

	cm.pc = "Y";
	if (pageID) {
		cm.pi = pageID;
	} else {
		cm.pi = getDefaultPageID();
	}
	cm.ul = document.location.href + cmTransformMMCParameters();
	cm.writeImg();
}

/*
 * Creates a Pageview tag with the default value for Page ID. 
 * Format of Page ID is "x/y/z/MyPage.asp"
 *
 * returns nothing, causes a document.write of an image request for this tag.
 */
function cmCreateDefaultPageviewTag() {
	cmCreatePageviewTag(getDefaultPageID(), null, null);
}

/*
 ****************************************************************************************
 * INTERNAL TAG-CREATING FUNCTIONS														*
 ****************************************************************************************
 */

/*
 * Creates a Shop tag with Action 5 (First step in application)
 *
 * productID		: required. Product ID to set on this Shop tag
 * categoryID		: optional. Category to set on this Shop tag
 *
 * returns nothing, causes a document.write of an image request for this tag.
 */
function cmCreateShopAction5Tag(productID, categoryID){
	
	var cm = new _cm("tid", "4", "vn2", "e4.0");
	cm.at = "5";
	cm.pr = productID;
	cm.pm = productID;
	cm.qt = "1";
	cm.bp = "1";
	if (categoryID) {
		cm.cg = categoryID;
	}
	var tempSessionID = cI("metricsid") + "";
	cm.sx1 = tempSessionID.substring(0,100);
	cm.sx2 = tempSessionID.substring(100,200);
	cm.sx3 = tempSessionID.substring(200,300);
    if (siteTag=="Quicken" || siteTag=="HLBP" || siteTag=="REI" || siteTag=="Rock") {
	    cm.ul = document.location.href + cmTransformMMCParameters();
    }
	cm.writeImg();

}

/*
 * Creates a Shop tag with Action 9 (Application submitted page)
 *
 * productID		: required. Product ID to set on this Shop tag
 * cust_id			: required. ID of customer making the purchase
 * orderID			: required. ID of order this lineitem belongs to
 * categoryID		: optional. Category to set on this Shop tag
 *
 * returns nothing, causes a document.write of an image request for this tag.
 */
function cmCreateShopAction9Tag(productID, cust_id, orderID, categoryID) {
	var cm = new _cm("tid", "4", "vn2", "e4.0");
	cm.at = "9";
	cm.pr = productID;
	cm.pm = productID;
	cm.qt = "1";
	cm.bp = "1";
	cm.cd = cust_id;
	cm.on = orderID;
	cm.tr = "1";
	if (categoryID) {
		cm.cg = categoryID;
	}
	var tempSessionID = cI("metricsid") + "";
	cm.sx1 = tempSessionID.substring(0,100);
	cm.sx2 = tempSessionID.substring(100,200);
	cm.sx3 = tempSessionID.substring(200,300);
    if (siteTag=="Quicken" || siteTag=="HLBP" || siteTag=="REI" || siteTag=="Rock") {
	    cm.ul = document.location.href + cmTransformMMCParameters();
    }
	cm.writeImg();
}

/*
 * Creates an Order tag
 *
 * orderID			: required. Order ID of this order
 * appName			: required. Product applied for in this order
 * customerID		: required. Customer ID that placed this order
 *
 * returns nothing, causes a document.write of an image request for this tag.
 */
function cmCreateOrderTag(orderID, appName, customerID) {
	var cm = new _cm("tid", "3", "vn2", "e4.0");
	cm.on = orderID;
	cm.tr = "1";
	cm.osk = '|' + appName + '|1|1|';
	cm.sg = "0";
	cm.cd = customerID;
	cm.ul = document.location.href + cmTransformMMCParameters();
	cm.writeImg();
}

/*
 * Creates Form Field activity tags
 */
function cmSetupApplicationTextBoxTags(category, first, last){
	var dt=new Date();
	cmRandom = dt.getTime()%10000000;

	var cm = new _cm("tid", "7", "vn2", "e4.0");
	cm.li = 1;
	cm.ps1= cmAppName;
	cm.ps2 = cmAppStepNumber;
	cm.ps3 = cmAppStepName;
	cm.ps4 = cmRandom;
	cm.ps5= category;
	if (first){
		cm.ps6="FIRST";
	}
	if (last){
		cm.ps7="LAST";
	}
	cm.writeImg();

	for (var i=0;i<document.forms.length; i++){
		for (var j=0;j<document.forms[i].elements.length; j++)
		{
			if (document.forms[i].elements[j].type=="text")
			{
				if(document.forms[i].elements[j].value==""){
					cmCheckForOnChange(document.forms[i].elements[j]);
				} else {
					cmSendFormFieldTag(document.forms[i].elements[j].name, true);
				}
			}
		}
	}
}

/*
 ****************************************************************************************
 * INTERNAL HELPER FUNCTIONS															*
 ****************************************************************************************
 */

var cmRandom;
var cmAppName;
var cmAppStepName;
var cmAppStepNumber;
var cmOnChangeCounter = 0;
var cmOnChangeTextBoxName = new Array();
var cmOnChangePointer = new Array();
var cmOnChangeFirst = new Array();

// Removes beginning, ending, and double spaces from strings
function cmRemoveWhiteSpace(str){
	while (str.substring(0,1) == ' ') str = str.substring(1);
    while (str.substring(str.length-1,str.length) == ' ') str = str.substring(0,str.length-1);
	var check = true;
	while (check) {
		var pos = str.indexOf('  ');
		if (pos>-1){
			str = str.substring(0,pos) + str.substring(pos,str.length);
    	} else {
			check = false;
		}
	}
    return(str);
}

/*
 * Creates an acceptable default Page ID value to use for Pageview tags.
 * The default Page ID is based on the URL, and consists of the path and
 * filename (without the protocol, domain and query string).
 * 
 * example:
 * returns "x/y/MyPage.asp" for the URL http://www.mysite.com/x/y/MyPage.asp
 */
function getDefaultPageID() { 
	if (document.title) 
	{
		var doctitle = document.title;

		if (doctitle.length >= 100)
		{
			doctitle = doctitle.substring(0,90);
		}

		return doctitle;
	}

	var pageName = window.location.pathname; 

	// eliminates everything after "?" (for Opera browswers)
	var tempIndex1 = pageName.indexOf("?");
	if (tempIndex1 != -1) {
		pageName = pageName.substr(0, tempIndex1);
	}
	// eliminates everything after "#" (for Opera browswers)
	var tempIndex2 = pageName.indexOf("#");
	if (tempIndex2 != -1) {
		pageName = pageName.substr(0, tempIndex2);
	}
	// eliminates everything after ";"
	var tempIndex3 = pageName.indexOf(";");
	if (tempIndex3 != -1) {
		pageName = pageName.substr(0, tempIndex3);
	}

	var slashPos = pageName.lastIndexOf("/");
	if (slashPos == pageName.length - 1) {
		pageName = pageName + "default.asp"; /****************** SET TO DEFAULT DOC NAME */
	}

	while (pageName.indexOf("/") == 0) {
		pageName = pageName.substr(1,pageName.length);
	}

	return(pageName); 
}

/*
 * Creates an acceptable default Page ID value to use for Pageview tags.
 */
function getDefaultApplicationPageID(appName, appStepName, appStepNumber){
	var	cmPageID = "Application: " + appName + " Step: " + appStepNumber + " (" + appStepName + ")";
	return(cmPageID);
}

function cmGetDefaultOrderID(){
	var dt = new Date();
	var randomOrderID = Math.round(Math.random() * 1000 );
	// alert( dt.getTime()%10000000 + '' + randomOrderID );
	return dt.getTime()%10000000 + '' + randomOrderID;
}

function cmCheckForOnChange(textbox){
	cmOnChangeTextBoxName[cmOnChangeCounter] = textbox.name;
	cmOnChangePointer[cmOnChangeCounter] = textbox.onchange;
	cmOnChangeFirst[cmOnChangeCounter] = true;
	textbox.onchange = new Function("cmMultipleOnChange(" + cmOnChangeCounter + ");");
	cmOnChangeCounter++;
}
 
//Even though the event parameter is not used, it must remain since Netscape will 
//automatically send it as the first parameter, the rest of the time it will be null
function cmSendFormFieldTag(name, write){
	var cm = new _cm("tid", "7", "vn2", "e4.0");
	cm.li  = 2;
	cm.ps1 = cmAppName;
	cm.ps2 = cmAppStepNumber;
	cm.ps3 = cmAppStepName;
	cm.ps4 = cmRandom;
	cm.ps5 = name;
	
	if (write)
	{
		cm.writeImg();
	} else {
		var image1 = new Image();
		image1.src = cm.getImgSrc();
	}
}

function cmMultipleOnChange(id){
	if (cmOnChangeFirst[id]){
		cmSendFormFieldTag(cmOnChangeTextBoxName[id], false);
		cmOnChangeFirst[id] = false;
	}
	if (cmOnChangePointer[id]!=null){
		cmOnChangePointer[id]();
	}
}

function cmIndexOfParameter (parameter) {
	return document.URL.toLowerCase().indexOf(parameter);
}

function cmExtractParameter (parameter) {
    if (cmIndexOfParameter(parameter) == -1) {
        return null;
    }
	var s = location.search;
	var begin = s.toLowerCase().indexOf(parameter);
	var end = s.indexOf("&", begin);
	if (end == -1) {
		end = s.length;
	}
	var middle = s.indexOf("=", begin);
	return s.substring(middle + 1, end);
}

function cmTransformMMCParameters() {
	var cm_qls = cmExtractParameter("qls");
	if (cm_qls) {
		var tempMMCVendor = "";
		var tempMMCCategory = "";
		var tempMMCPlacement = "NA";
		var tempMMCItem = "";
		tempMMCVendor = cm_qls.substring(0,3);
		var tempIndex1 = cm_qls.indexOf("_");
		var tempIndex2 = cm_qls.indexOf(".");
		tempMMCCategory = cm_qls.substring(tempIndex1 + 1,tempIndex2);
		tempMMCItem = cm_qls.substring(tempIndex2);
		return ("&cm_mmc=" + tempMMCVendor + "-_-" + tempMMCCategory + "-_-" + tempMMCPlacement + "-_-" + tempMMCItem);
	}
	else {
		return "";
	}
}
if (defaultNormalize == null) { var defaultNormalize = null;}

function myNormalizeURL(url, isHref) {

	 if(isHref) {	
		var newURL;
		var optiKount;
 	 	chkURL=url.split("/");
	 	for (var i=0;i<chkURL.length;i++){
	 		if (chkURL[i].indexOf("52-")>-1){
	 			optiKount=i;
	 		}
	 	}
	 	delete chkURL[optiKount+1];
	 	newURL=chkURL.join("/");
     }
   if (defaultNormalize != null) {
		newURL = defaultNormalize(newURL, isHref);
   } 
   return newURL;
}

if (document.cmTagCtl != null) {
	var func = "" + document.cmTagCtl.normalizeURL;
	if (func.indexOf('myNormalizeURL') == -1) { 
		defaultNormalize = document.cmTagCtl.normalizeURL;
		document.cmTagCtl.normalizeURL = myNormalizeURL;
	}
}
//-->

if (typeof(QL.vendors) === 'undefined') {
    QL.namespace('vendors');
}

/**
 * Checks to see if we are in production. If so, calls
 * the cmSetProduction() method.
 *
 * @method setEnvironment
 * @static
 */
var setEnvironment = function()
{
    if ( document.domain.toLowerCase().indexOf( 'www' ) >- 1 ) {
        cmSetProduction();
    }

    return;
}();


/**
 *
 * @namespace QL.vendors
 * @class Coremetrics
 * @constructor
 */
QL.vendors.Coremetrics = function()
{

    /**
     * Valid Coremetrics tagging attributes.
     *
     * @param {Array}
     */
    var coreAttributes = {
        re: 'manual_cm_re',
        sp: 'manual_cm_sp'
    };

    /**
     * String delimiter for core parameters.
     *
     * @param {String}
     */
    var delimiter = '-_-';

    /**
     * Status of whether the page tag been set yet.
     *
     * @param {Bool}
     */
    var pageTagSet = false;

    /**
     * Object of any elements that have been "tagged".
     *
     * @param {Object}
     */
    var taggedElements = {
        re: [],
        sp: []
    };

    /**
     * Custom meta tags.
     *
     * @param {Object}
     */
    var customMetaTags = {
        applicationName: $S.query('meta[name=application_name]'),
        categoryID: $S.query('meta[name=category_id]'),
        pageID: $S.query('meta[name=page_id]'),
        searchQuery: $S.query('meta[name=search_query]'),
		numSearchResults: $S.query('meta[name=search_results]'),
        stepNumber: $S.query('meta[name=step_number]')
    };


    /**
     * Iterates through the customMetaTags object and
     * gets the 'content' attribute if it exists, otherwise
     * it set the property value to ''.
     */
    var setCustomMetaTags = function()
    {
        for (tag in customMetaTags) {
            if (customMetaTags[tag].length === 0 || !customMetaTags[tag][0].getAttribute('content')) {
                customMetaTags[tag] = '';
            } else {
                customMetaTags[tag] = customMetaTags[tag][0].getAttribute('content');
            }
        }
		customMetaTags['sessionId'] = QL.util.Cookie.get('PHPSESSID');
    };


    /**
     * Iterates the coreAttributes properties and returns a
     * string of queryable class names.
     *
     * @return  {String}    classNames
     */
    var getElementsToQuery = function()
    {
        var classNames = '';

        for (className in coreAttributes) {
            classNames += '.' + className + ', ';
        }

        classNames = classNames.substr(0, classNames.length - 2);

        return classNames;
    };


    /**
     * Sets the Coremetrics attribute on each "tagged" element.
     */
     var setAttributes = function()
     {
         // Get all elements that have been tagged
         var elements = getTaggedElements();

         for (attribute in elements) {
             $D.batch(elements[attribute], function(el) {
                 setCoreAttribute(el, attribute);
             });
         }
    };


    /**
     * Gets every "tagged" element on the page.
     *
     * @param   {Object}    container
     * @param   {Object}    attribute
     * @return  {Array}
     */
    var getTaggedElements = function(container, attribute)
    {
        // Definitions
        var attribute = attribute || '';
        var container = container || '';
        var elements = [];

        if (container !== '') {
            elements = container.getElementsByTagName('A');
        } else {
            elements = $S.query(getElementsToQuery());
        }

        $D.batch(elements, function(el) {
            attribute = getElementAttribute(el) || attribute;

            if (el.nodeName.toUpperCase() !== 'A') {
                getTaggedElements(el, attribute);
            } else {
                taggedElements[attribute].push(el);
            }
        });

        return taggedElements;
    };


    var getElementAttribute = function(el)
    {
        if (!el) return false;

        var attribute;

        for (c in coreAttributes) {
            if ($D.hasClass(el, c)) return c;
        }
    };


    /**
     * Sets the proper Coremetrics attribute on the specified element.
     *
     * @param   {Object}    el
     * @param   {String}    attribute
     */
    var setCoreAttribute = function(el, attribute)
    {
        if (!el) return false;

        el.setAttribute(coreAttributes[attribute], setTagValue(el, attribute));
    };


    /**
     * Sets the appropriate Coremetrics tag based on the 'attribute'
     * parameter.
     *
     * @param   {Object}    el
     * @param   {String}    attribute
     */
    var setTagValue = function(el, attribute)
    {
        if (!el) return false;

        switch (attribute) {
            case 're':
                return setRealEstateValue(el);
                break;

            case 'sp':
                return setSitePromotionValue(el);
                break;

            default:

        }
    };


    /**
     * Sets the appropriate Coremetrics page-level tag based
     * on various criteria.
     */
     var setAutoPageTag = function()
     {
        if ( pageTagSet === true ) {
            return;
        }

        // Set Appliction Tag.
        if (customMetaTags.applicationName !== '') {
            cmCreateApplicationTags(
                customMetaTags.pageID, // pageID
                customMetaTags.categoryID, // categoryID
                customMetaTags.applicationName, // appName
                customMetaTags.stepNumber, // appStepNumber
                'Step ' + customMetaTags.stepNumber, // appStepName
                null, // helpFlag
                null, // errorFlag
                null, // toolFlag
                customMetaTags.stepNumber == 'last' ? false : true, // firstStepFlag
                customMetaTags.stepNumber == 'last' ? true : false, // lastStepFlag
                QL.util.Cookie.get('PHPSESSID'), // visitorID
                null, // transactionID
				null, // optimostParams
				QL.util.Cookie.get('PHPSESSID')//visitorSessionID
			);
			
			handleFormAnnotationsOnPost();
					
			return;
        } else if (customMetaTags.numSearchResults){//having a number of search results implies that you are on the search results page ergo show how many results
			cmCreatePageviewTag(customMetaTags.pageID, customMetaTags.categoryID, customMetaTags.searchQuery, customMetaTags.numSearchResults);
			return;
		}
		// ALWAYS Set Page View Tag.
        cmCreatePageviewTag(customMetaTags.pageID, customMetaTags.categoryID, null, null, null, null, null, QL.util.Cookie.get('PHPSESSID'));

        pageTagSet = true;
    };


    /**
     * Allows Core Metrics to track forms of method post
     * in their visual tracking tool.
     *
     * @param   {Object}    el
     * @return  null
     */
	var handleFormAnnotationsOnPost = function () {
		$E.on( document.getElementsByTagName( 'FORM' ), 'click', function( ev ) {			
			var target = $E.getTarget( ev ),
				form = $D.getAncestorByTagName( target, 'FORM' );

			// If the form posts, we need to set the cmPostbackForm variable
			// in order for Core to annotate the form in their visual tracking
			// tool.
			if ( form && form.getAttribute( 'method' ).toUpperCase() != 'POST' ) return;	
			var cmPostbackForm = form;
		} );
	};


    /**
     * Sets the appropriate parameters used in Real Estate tagging.
     *
     * @param   {Object}    el
     * @return  {String}
     */
    var setRealEstateValue = function(el)
    {
        if (!el) return false;

        // Definitions.
        var category1, category2, category3;

        // Category 1 is the pageID.
        category1 = customMetaTags.pageID;

        // Category 2 is the first ancestor ID.
        category2 = getAncestors(el)[0];

        // Category 3 is the elements nodeValue.
        category3 = el.getAttribute('href');

        return createValueString(category1, category2, category3);
    };


    /**
     * Sets the appropriate parameters used in Site Promotion tagging.
     *
     * @param   {Object}    el
     * @return  {String}
     */
    var setSitePromotionValue = function(el)
    {
        if (!el) return false;

        // Definitions.
        var ancestors, category1, category2, category3, i = 0;

        // Get ancestors.
        ancestors = getAncestors(el);

        category1 = ancestors[1];
        category2 = ancestors[0];

        // Category 2 is the elements nodeValue.
        category3 = el.firstChild.nodeValue.trim();

        return createValueString(category1, category2, category3);
    };


    /**
     * Concatenates the 3 categories together with the delimiter.
     *
     * @param   {String}    category1
     * @param   {String}    category2
     * @param   {String}    category3
     * @return  {String}
     */
    var createValueString = function(category1, category2, category3)
    {
        var categories = [category1, category2, category3];
        var string = '';

        for (var i = 0; i < categories.length; i++) {
            categories[i] = categories[i].replace(/_/g, ' ');
            categories[i] = encodeURI(categories[i].toTitleCase());

            string += categories[i] + delimiter;
        }

        string = string.replace(/-_-$/, '');

        return string;
    };


    /**
     * Retrieves the ancestor element's ID of the function passed
     * in element.
     *
     * @param {Object} el
     * @return {Mixed}
     */
    var getAncestors = function(el)
    {
        if (!el) return false;

        // Definitions.
        var ancestorsWithID = [];

        // Get ancestor container ID.
        var ancestors = $D.getAncestors(el);

        // Use only elements with an ID
        $D.batch(ancestors, function(a) {
            if (!a.getAttribute('id')) return false;

            ancestorsWithID.push( a.getAttribute( 'id' ).trim() );
        })

        return ancestorsWithID;
    };


    return {

        init: function()
        {
            $E.addListener( window, 'load', function() {
                setCustomMetaTags();
                setAttributes();
                setAutoPageTag();
            } );
        }(),

        setPageTag: function( func )
        {
            func();
            pageTagSet = true;
        }
    };
}();
