// ====================================================================
// SendROI Tracking Script v. 2.2
// (C)2004 SendTraffic and the Traffic Group
// http://sendtraffic.com/
// unauthorized duplication in any form will be prosecuted
// ====================================================================	

//Global variables to hold data for error tracking.
var glCampaignID = null;
var glSearchTerm = null;
var glCheckpointID = null;
var glFirstHit = null;
var glReferrer = null;
var glConversionAmount = null;
var glConversionID = null;
var glTrackNum=0;
var glURL=null;
var glImgIDbstr="img_";


//TrackProgress("Entered JavaScript");

//window.onerror=Err_Handler; //on error event handler 

glTrackNum=1;

function SENDROI_TrackHit(CheckpointID, ConversionAmount, ConversionID, str2000_URL, str2000_Referrer, CookiePath, CookieDomain, CookieExpHours)
{

try{
    glTrackNum=2;
	var TrackURL = "//track.sendtraffic.com/track.aspx";	
	
	if(CheckpointID){
	    glCheckpointID=CheckpointID;
	}
	if(ConversionAmount){
	    glConversionAmount=ConversionAmount;
	}
	if(ConversionID){
	    glConversionID=ConversionID;
	}
	
	
	
	//TrackProgress("Entered SENDROI_TrackHit Function");
	
	var CookieHours = 1080; //45 days	
	if (!isNaN(CookieExpHours))
	{
		var CookieHours = CookieExpHours;
	}

    glTrackNum=3;
	var Referrer = null;
	if(str2000_Referrer){
	    Referrer=str2000_Referrer;
	}
	else{
	    Referrer = document.referrer;
	}
	
	if(Referrer){
	    glReferrer=Referrer;
	}

	
	var URL = null;
	if(str2000_URL){
	    URL=str2000_URL;
	}
	else{
	    URL = document.URL;
	}	
	
	
	if(URL){
        glURL=URL;
    }

	
	
	var PageTitle = "Cross Domain";
	var CampaignID;
	var SearchTerm;
	var CreativeID;
	var FirstHit;


	var ClientCookieCampaign = new CCookie("SENDROI20CID");
	var ClientCookieTerm = new CCookie("SENDROI20KWD");
	var ClientCookieReferer = new CCookie("SENDROI20REF");
	var ClientCookieCreative = new CCookie("SENDROI20AD");
	var ClientCookieAsstCampaign = new CCookie("SENDROI20AsstCID");
	var ClientCookieAsstTerm = new CCookie("SENDROI20AsstKWD");
			
	glTrackNum=4;

	var	AssistKwd = ClientCookieTerm.GetValue();
	var AssistCampaign    = ClientCookieCampaign.GetValue();	

    glTrackNum=5;

	var pi = new PageInfo();	

	var ExpDate = new Date();
	ExpDate.setHours(ExpDate.getHours() + CookieHours);	
		
	// check if referrer is from the local system (from cache)
	if (startsWith(Referrer, "file://"))
	{
		return false;
	}
	
	glTrackNum=6;

    //extract campaign ID and search term
	var querystring = document.location.search;

	CampaignID = pi.GetQuerystringParam(querystring, "sendroicid");
	SearchTerm = pi.GetQuerystringParam(querystring, "sendroikwd");
	CreativeID = pi.GetQuerystringParam(querystring, "sendroiad");
	
    //glCampaignID=CampaignID;
     if(SearchTerm){
        glSearchTerm=SearchTerm;
    }

   
    glTrackNum=7;
	
	if (isEmpty(CreativeID))
	{
	    CreativeID = "";
	}

    //no parent frame URL for Cross Domain.


    glTrackNum=8;

	var CookieDataString = ClientCookieCampaign.GetValue() + ClientCookieTerm.GetValue() + ClientCookieCreative.GetValue();
	var QueryDataString = CampaignID + SearchTerm + CreativeID;
	
	glTrackNum=9;
	
	if(!isEmpty(CampaignID) && (CookieDataString != QueryDataString))
	{	
		FirstHit = true; // new visitor only if campaignID present and campaign data not the same as the cookies
		
		if(FirstHit){
		    glFirstHit=FirstHit;
		}
	}
	else
	{
		var CookieValueCampaign = ClientCookieCampaign.GetValue();	
		var CookieValueTerm     = ClientCookieTerm.GetValue();
		var CookieValueCreative = ClientCookieCreative.GetValue();

		if (isEmpty(CookieValueCampaign))
		{
			CampaignID = "DIRECT";
			SearchTerm = "";
			CreativeID = "";
			FirstHit = true;			
		}
		else
		{		
			CampaignID = CookieValueCampaign;
			SearchTerm = CookieValueTerm;
			CreativeID = CookieValueCreative;
			Referrer = ClientCookieReferer.GetValue();
			AssistKwd  = CookieValueTerm;
			AssistCampaign = CookieValueCampaign;
			FirstHit = false;
		}
		
		//glCampaignID=CampaignID;
		if(SearchTerm){
             glSearchTerm=SearchTerm;
        }
        if(FirstHit){
            glFirstHit=FirstHit;
        }		
		if(Referrer){
	        glReferrer=Referrer;
	    }		
	}
	
	glTrackNum=10;
	
	//Set the Assist Keyword and Campaign if the Cookie value for the Search term is not empty
	//and the Cookie value differs from the querystring value for the search term
	if ((AssistKwd != SearchTerm) && (!isEmpty(AssistKwd))  && (!isEmpty(SearchTerm)) )
	{
	  ClientCookieAsstCampaign.SetValue(AssistCampaign, ExpDate, false, CookiePath, CookieDomain);
	   ClientCookieAsstTerm.SetValue(AssistKwd, ExpDate, false, CookiePath, CookieDomain);
	}
	else
	{
		AssistCampaign = ClientCookieAsstCampaign.GetValue();
		AssistKwd = ClientCookieAsstTerm.GetValue();
	}
	
	 glTrackNum=11;

   //---logic to check if CampaignID is UID 12/26/2007  
   if(!isEmpty(CampaignID) && CampaignID !="DIRECT"){   
         if(!isUUID(CampaignID)){
            PageTitle = "Old CampaignID|" + CampaignID;
            CampaignID = "DIRECT";            
            
        }    
   }
   
   //glCampaignID=CampaignID;
   //----end logic to check if CampaignID is UID 12/26/2007
   
   glTrackNum=12;
	
	    //set the cookies to the current values	
	ClientCookieCampaign.SetValue(CampaignID, ExpDate, false, CookiePath, CookieDomain);
	ClientCookieTerm.SetValue(SearchTerm, ExpDate, false, CookiePath, CookieDomain);
	ClientCookieCreative.SetValue(CreativeID, ExpDate, false, CookiePath, CookieDomain);
	ClientCookieReferer.SetValue(Referrer, ExpDate, false, CookiePath, CookieDomain);
	
    glTrackNum=13;
	
	if (CampaignID == "DIRECT")
	{
		CampaignID = null;		
		
	}
	
	if(CampaignID){
	    glCampaignID=CampaignID;
	}
	
    //make conversion amount numeric if it is not
	ConversionAmount = parseFloat(ConversionAmount);

	if (String(ConversionAmount).length > 0 && isNaN(ConversionAmount))
	{
		ConversionAmount = 0;
	}
	
	if(ConversionAmount){
	    glConversionAmount=ConversionAmount;
	}
	
	glTrackNum=14;

    //Ignore ConversionId if paramter name is not removed
	if (ConversionID == '[ConversionID]')
	{
		ConversionID = '';
	}
	
	if(ConversionID){
	    glConversionID=ConversionID;
	}
	
	//----Modified to store landing url information 11/26/2007
	var ClientCookieLandingURL = new CCookie("SENDROI20LandURL");
	//var LandingURL=window.top.location.href;
	var LandingURL=URL;
	if(FirstHit == true){
	    ClientCookieLandingURL.SetValue(LandingURL, ExpDate, false, CookiePath, CookieDomain);	
	}	
    var entryURL = ClientCookieLandingURL.GetValue();
	//----//End Modified to store landing url information 11/26/2007
	
	//----1. Modified to fit 2,048 characters in the img src 11/26/2007
	
	//1. Referrer - cut to 350 characters
	    // get Referrer param:	 
	    var ReferrerParam = pi.QueryParameter("&referrer", Referrer);
	    if(Referrer){
	        if(ReferrerParam.length > 350){
	            ReferrerParam=ReferrerParam.substring(0, 350);
	        }	
	    }
	//----//End 1. Modified to fit 2,048 characters in the img src 11/26/2007	
	
	glTrackNum=15;
			
    //compound all tracking info into a query string
	var TrackingInfo =
		pi.QueryParameter("?ckid", CheckpointID) +	
		pi.QueryParameter("&caid", CampaignID) +		
		pi.QueryParameter("&kwd", SearchTerm) +
		pi.QueryParameter("&amount", String(ConversionAmount)) +
		pi.QueryParameter("&cvid", ConversionID) +
		ReferrerParam + //Modified to fit 2,048 characters in the img src 11/26/2007
		pi.QueryParameter("&cachebuster", GetBuster(CheckpointID)) +
		pi.QueryParameter("&firsthit", String(FirstHit)) + 
		pi.QueryParameter("&js", "true") + 
		pi.QueryParameter("&utm_content", CreativeID) +
		pi.QueryParameter("&uv1", AssistKwd) + 
		pi.QueryParameter("&uv2", AssistCampaign) +
		pi.QueryParameter("&url", URL) +		
		pi.QueryParameter("&title", PageTitle)+
		pi.QueryParameter("&entryURL", entryURL); //added entryURL 11/26/2007
		
//----2. Modified to fit 2,048 characters in the img src 11/26/2007
        var totalSrcURL = TrackURL + TrackingInfo;
        
        glTrackNum=16;
               
        //2. if img src > 2048 characters         
        if(totalSrcURL.length > 2048){
            //find difference (How much we have to cut)
            var diffLength=totalSrcURL.length-2048;
            var URLdiff=0; //Will indicate how much we cut from URL
            //If we can leave more than 400 for url. In this case we won’t have to cut from entryURL because it will compensate the difference
              //get URL param:
             var URLparam=pi.QueryParameter("&url", URL);
            if(URLparam.length - diffLength >= 400){ 
                var remURLlength = URLparam.length - diffLength;
                URLdiff=diffLength;
                URLparam=URLparam.substring(0, remURLlength);
            }
            //we have to cut url to 400 
            else if(URLparam.length > 400){
                URLdiff=URLparam.length-400; 
                URLparam=URLparam.substring(0, 400);
            }
          //3. cut entryURL if img src is still > 2048 to make sure img src <= 2048
             //get entryURL param:
             var entryURLparam=pi.QueryParameter("&entryURL", entryURL);             
             if((totalSrcURL.length-URLdiff) > 2048){
                 //find new difference (How much we have to cut EntryURL)
                 var diffNew = totalSrcURL.length-URLdiff-2048;                
                //Remaining entry URL length will be:
                 var remEntryURL=entryURLparam.length-diffNew;
                 //cut entryURL
                     if(remEntryURL>0){
                         entryURLparam=entryURLparam.substring(0, remEntryURL); 
                     }           
              }
            
            
    glTrackNum=17;
    
             //Recompose TrackingInfo:
            TrackingInfo =
		    pi.QueryParameter("?ckid", CheckpointID) +	
		    pi.QueryParameter("&caid", CampaignID) +		
		    pi.QueryParameter("&kwd", SearchTerm) +
		    pi.QueryParameter("&amount", String(ConversionAmount)) +
		    pi.QueryParameter("&cvid", ConversionID) +
		    ReferrerParam + //Modified to fit 2,048 characters in the img src 11/26/2007
		    pi.QueryParameter("&cachebuster", GetBuster(CheckpointID)) +
		    pi.QueryParameter("&firsthit", String(FirstHit)) + 
		    pi.QueryParameter("&js", "true") + 
		    pi.QueryParameter("&utm_content", CreativeID) +
		    pi.QueryParameter("&uv1", AssistKwd) + 
		    pi.QueryParameter("&uv2", AssistCampaign) +
		    URLparam +		
		    pi.QueryParameter("&title", PageTitle)+
		    entryURLparam; 		               
        }
//----//End 2. Modified to fit 2,048 characters in the img src 11/26/2007

 glTrackNum=18;

//TrackProgress("Before Sending Hit in SENDROI_TrackHit Function");

    //output the tracking info to an image object	
	if (document.images)
	{
		var img = new Image();
		img.src = TrackURL + TrackingInfo;
	} 		
	else
	{	
		document.write('<img src="' + TrackURL + TrackingInfo + '" width="1" height="1">');
	} 

//document.write('<i' + 'mg src="' + TrackURL + TrackingInfo + '" id="' + GetBuster(glImgIDbstr) + '" width="1" height="1">');
	
glTrackNum=19;
//TrackProgress("After Sending Hit in SENDROI_TrackHit Function");
	
}//try catch
catch(err){
 var piErr = new PageInfo();
    
        
    var TrackURLErr = "//track.sendtraffic.com/ScriptErrorTracker/TrackError.aspx";
    
    
    var ErrMsgCol="";
    if(err.message){
	    ErrMsgCol=ErrMsgCol + '|message= ' + err.message;
    }
    if(err.fileName){
	    ErrMsgCol=ErrMsgCol + '|fileName= ' + err.fileName;
    }
    if(err.lineNumber){
	    ErrMsgCol=ErrMsgCol + '|lineNumber= ' + err.lineNumber;
    }
    if(err.stack){
	     ErrMsgCol=ErrMsgCol + '|stack= ' + err.stack;
    }
    if(err.name){
	    ErrMsgCol=ErrMsgCol + '|name= ' + err.name;
    }
    if(err.number){
	    ErrMsgCol=ErrMsgCol + '|number= ' + err.number;
    }
    if(err.description){
	    ErrMsgCol=ErrMsgCol + '|description= ' + err.description;
    }
    
    
   var ErrMsgParam=piErr.QueryParameter("?MErr", ErrMsgCol + "|TrackNum= " + glTrackNum.toString());
            if(ErrMsgParam.length > 1500){                 
                ErrMsgParam=ErrMsgParam.substring(0, 1500);
            }
            
            var bstrID="";
            if(glCheckpointID){
             bstrID=glCheckpointID;
            }
            else{
             bstrID="Error_";
            }
            
            
            
    TrackingInfoErr =
            ErrMsgParam +
		    piErr.QueryParameter("&ckid", glCheckpointID) +	
		    piErr.QueryParameter("&caid", glCampaignID) +		       
		   // piErr.QueryParameter("&LErr", String(l)) +
		    piErr.QueryParameter("&UErr", glURL) +		    
		    piErr.QueryParameter("&kwd", glSearchTerm) +
		    piErr.QueryParameter("&amount", String(glConversionAmount)) +
		    piErr.QueryParameter("&cvid", glConversionID) +		 
		    piErr.QueryParameter("&firsthit", String(glFirstHit)) + 
		    piErr.QueryParameter("&cachebuster", GetBuster(bstrID)) +
		    piErr.QueryParameter("&js", "true") + 
		    piErr.QueryParameter("&referrer", glReferrer); 

  var ErrTrackURL = TrackURLErr + TrackingInfoErr;
    if(ErrTrackURL.length > 2048){                 
                ErrTrackURL=ErrTrackURL.substring(0, 2048);
    }

	if (document.images)
	{
		var img = new Image();
		img.src = ErrTrackURL;		
	} 		
	else
	{	
		document.write('<img src="' + ErrTrackURL + '" width="1" height="1">');
	} 


//document.write('<i' + 'mg src="' + ErrTrackURL + '" id="' + GetBuster(glImgIDbstr) + '" width="1" height="1">');

}//try catch

}


//COOKIE OBJECT
function CCookie(cookiename)
{
	this.Cookiename = cookiename;
	
	this.SetValue = function(value, expires, secure, path, domain)
	{
		if (path == null)
			path="/";
		
		var pi = new PageInfo();
	
		document.cookie = pi.URLEncode(this.Cookiename) + "=" 
			+ pi.URLEncode(value)
			+ ((expires == null) ? "" : ("; expires=" + expires.toGMTString())) 
			+ ((path == null) ? "" : ("; path=" + path)) 
			+ ((domain == null) ? "" : ("; domain=" + domain)) 
			+ ((secure == true) ? "; secure" : "");
	}

	this.GetValue = function() 
	{
		var pi = new PageInfo();
		var str = pi.URLEncode(cookiename) + "=";
		
		var strlen = str.length;
		var cookielen = document.cookie.length; 
		var i = 0;
		var j;
		
							
		while (i < cookielen)
		{ 			
			j = i + strlen;
	
			if (document.cookie.substring(i, j) == str) 
				return getCookieVal(j);
			
			i = document.cookie.indexOf(" ", i) + 1;
			
			if (i == 0) break;
		} 
		
		return '';
	}	
	
	function getCookieVal(lastpos)
	{   
		var pi = new PageInfo();
		var str = document.cookie.indexOf (";", lastpos);  
	
		if (str == -1)
			str = document.cookie.length; 
	
		return pi.URLDecode(document.cookie.substring(lastpos, str));
	}	
}

//PAGEINFO OBJECT
function PageInfo()
{
	this.GetQuerystringParam = function(querystring, name) 
	{
		var i;
		var arr = querystring.substr(1).split("&");
		
		for (i = 0; i < arr.length; i++)
		{
			if (arr[i].indexOf(name + "=") == 0)
				return this.URLDecode(arr[i].split("=")[1]); 
		}
		
		return null;
	}
	
	this.IsRepeatedReferrer = function()
	{
		return (document.referrer == GetLastReferrer());
	}	

	this.GetLastReferrer = function()
	{
		var c = new CCookie("SENDROI_REF");
		var s = c.GetValue();
		return s;
	}
	
	this.QueryParameter = function(name, value)
	{
		if (!isEmpty(value))
			return name + "=" + this.URLEncode(value);
		else
			return "";
	}
	
// ====================================================================
//       URLEncode and URLDecode functions
//
// Copyright Albion Research Ltd. 2002
// http://www.albionresearch.com/
// ====================================================================	
	
	this.URLEncode = function(plaintext)
	{
		var SAFECHARS = "0123456789" +					// Numeric
						"ABCDEFGHIJKLMNOPQRSTUVWXYZ" +	// Alphabetic
						"abcdefghijklmnopqrstuvwxyz" +
						"-_.!~*'()";					// RFC2396 Mark characters
		var HEX = "0123456789ABCDEF";
		
		var encoded = "";
		
		//if plaintext is null- return empty. added 12/27/2007
		if(isEmpty(plaintext)){
		    return encoded;
		}
		
		for (var i = 0; i < plaintext.length; i++ ) {
			var ch = plaintext.charAt(i);
			if (ch == " ") {
				encoded += "+";				// x-www-urlencoded, rather than %20
			} else if (SAFECHARS.indexOf(ch) != -1) {
				encoded += ch;
			} else {
				var charCode = ch.charCodeAt(0);
				if (charCode > 255) {
					encoded += "+";
				} else {
					encoded += "%";
					encoded += HEX.charAt((charCode >> 4) & 0xF);
					encoded += HEX.charAt(charCode & 0xF);
				}
			}
		} // for

		return encoded;
	};

	this.URLDecode = function(encoded)
	{
		var HEXCHARS = "0123456789ABCDEFabcdef"; 
		var plaintext = "";
		
		//if encoded is null- return empty. added 12/27/2007
		if(isEmpty(encoded)){
		    return plaintext;
		}
		
		var i = 0;
		while (i < encoded.length) {
			var ch = encoded.charAt(i);
			if (ch == "+") {
				plaintext += " ";
				i++;
			} else if (ch == "%") {
					if (i < (encoded.length-2) 
							&& HEXCHARS.indexOf(encoded.charAt(i+1)) != -1 
							&& HEXCHARS.indexOf(encoded.charAt(i+2)) != -1 ) {
						plaintext += unescape( encoded.substr(i,3) );
						i += 3;
					} else {
						plaintext += "%[ERROR]";
						i++;
					}
				} else {
				plaintext += ch;
				i++;
				}
			} // while
		return plaintext;
	}
}

function isEmpty(strVal)
{
	return (strVal == null || strVal == 'null' || strVal == '');
}

function startsWith(strSource, strMatch)
{
	if (strMatch == null || strSource == null) {
		return false;
	}
	
	if (strMatch.length > strSource.length){
		return false;
	}
	
	if (strSource.substring(0, strMatch.length) == strMatch){
		return true;
	}
	
	return false;
}

function GetBuster(str)
{
	var buster = str.replace(new RegExp("-", "g"), "");
	buster += new Date().valueOf() + Math.random() * 10000;
	return buster.substring(0,50);
}

//----------------- added 12/26/2007 ----------------

//checks if hexadecimal 
function isHexadecimal(strVal)
{
    if(isEmpty(strVal)){
     return false;
    }
 var HexCharSet='0123456789ABCDEF';// hex characters    
    strVal=strVal.toUpperCase();
    for (var i=0;i<strVal.length;i++){
        if(HexCharSet.indexOf(strVal.charAt(i))<0){
         return false;
        }
    }
    return true;
}


function isUUID(strVal)  //UID: 32 hexadecimal digits, displayed in 5 groups separated by hyphens
{
    if(isEmpty(strVal)){
     return false;
    }

 var arrIDs=strVal.split("-");
    if(arrIDs.length!=5){
    return false;
    }
    if(arrIDs[0].length!=8 || arrIDs[1].length!=4 || arrIDs[2].length!=4 || 
        arrIDs[3].length!=4 || arrIDs[4].length!=12){
    return false;
    }
    if(!isHexadecimal(arrIDs[0]) || !isHexadecimal(arrIDs[1]) || !isHexadecimal(arrIDs[2]) 
        || !isHexadecimal(arrIDs[3]) || !isHexadecimal(arrIDs[4])){
    return false;
    }
 return true;
}

//-----------------End added 12/26/2007 ----------------


////error event handler
//function Err_Handler(msg,url,l)
//{
//   

//return true;
//}


//tracking of progress
function TrackProgress(place)
{
    var pi = new PageInfo();    
        
    var TrackURL = "//track.sendtraffic.com/ScriptErrorTracker/TrackError.aspx";
    
   var msg="Track Progress - " + place;
   var ErrMsgParam=pi.QueryParameter("?MErr", msg);
   
   var bstrID="";
            if(glCheckpointID){
             bstrID=glCheckpointID;
            }
            else{
             bstrID="Tracking_";
            }
            
            
            
    TrackingInfo =
            ErrMsgParam +
		    pi.QueryParameter("&ckid", glCheckpointID) +	
		    pi.QueryParameter("&caid", glCampaignID) +		    
		    pi.QueryParameter("&LErr", String(-1)) +
		    pi.QueryParameter("&UErr", document.URL) +		    
		    pi.QueryParameter("&kwd", glSearchTerm) +
		    pi.QueryParameter("&amount", String(glConversionAmount)) +
		    pi.QueryParameter("&cvid", glConversionID) +		 
		    pi.QueryParameter("&firsthit", String(glFirstHit)) + 
		    pi.QueryParameter("&cachebuster", GetBuster(bstrID)) +
		    pi.QueryParameter("&js", "true") + 
		    pi.QueryParameter("&referrer", glReferrer); 

  var ErrTrackURL = TrackURL + TrackingInfo;
    if(ErrTrackURL.length > 2048){                 
                ErrTrackURL=ErrTrackURL.substring(0, 2048);
    }

	if (document.images)
	{
		var img = new Image();
		img.src = ErrTrackURL;
	} 		
	else
	{	
		document.write('<img src="' + ErrTrackURL + '" width="1" height="1">');
	} 

//document.write('<i' + 'mg src="' + ErrTrackURL + '" id="' + GetBuster(glImgIDbstr) + '" width="1" height="1">');

}


//TrackProgress("End of JavaScript");