
// Global definitions

var ClientID; 
var strSessionID;

/**
  * Cookie API
  */
function GetCookie(cookiename) {
	var str = cookiename+"=";
	var strlen = str.length;
	var cookielen = document.cookie.length; 
	var i = 0;
	
	while (i < cookielen) { 
		var 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 str = document.cookie.indexOf (";", lastpos);  
	
	if (str == -1) str = document.cookie.length; 
	
	return unescape (document.cookie.substring(lastpos, str));
}

function SetCookie (name, value, expires, secure, path, domain) {
	path="/";
	
	document.cookie = name + "=" + 
		escape (value) + ((expires == null) ? "" : ("; expires=" + 
		expires.toGMTString())) + ((path == null) ? "" : ("; path=" + path)) 
		+ ((domain == null) ? "" : ("; domain=" + domain)) 
		+((secure == true) ? "; secure" : "");
}


function GetQuerystringParam(querystring, name) {
    var localquerystring = querystring.toLowerCase();
    var start = localquerystring.indexOf(name+"=");
    var len = start+name.length+1;
    if ((!start) && (name != localquerystring.substring(0,name.length) )) return null;
    if (start == -1) return null;
    var end = querystring.indexOf("&",len);
    if (end == -1) end = querystring.length;
    return unescape(querystring.substring(len,end));
}

function TPROI_Track(strEventID, dblSaleAmount)
{
	
	
	//var strClientID = '<=request("id")>';
	var strReferrer = escape(document.referrer);
	var strURL = escape(document.URL);
	var strPageTitle = escape(document.title);
	var strVisitID;
	var blnFirstHit;
	
	var strCampID;
	var strSE;
	var strSEKeyword;
		
	// check if referrer is from the local system (from cache)
	if (startsWith(strReferrer, "file://")==true){
		return false;
	}

	// analyze query string
	var querystring = document.location.search;	
	
	strCampID = escape(GetQuerystringParam(querystring, "tproi_cid"));
		
	//strSEKeyword = escape(GetQuerystringParam(querystring, "tproi_kwd"));
	//strSE = escape(GetQuerystringParam(querystring, "tproi_se"));
	var seData = new SEData();
	
	seData.ParseReferrer(document.referrer);
	
	strSEKeyword = escape(seData.strTerm);
	strSE = escape(seData.strSE);
		
	var strCookieName = "TP" + ClientID
	
	var strCookie=GetCookie(strCookieName);
	
	if (strCookie.length == 0)  {
		//alert("No cookie!");
		
		strVisitID = GetGUID();
		blnFirstHit = 1;
		
		if (isEmpty(strReferrer)){
			// either bookmark or directly typed in URL
			//strCampID = ''; //we invalidate campaign ID 
		}
		//alert("First time")
		
		// remember referrer
		SetCookie("REF" + ClientID, strReferrer, xDate);
		
	} else if ((!isEmpty(strCampID)) && (!IsRepeatedReferrer())) {
		//alert('Brand new link');
		 
		strVisitID = GetGUID();
		blnFirstHit = 1;
		
		// remember referrer		
		SetCookie("REF" + ClientID, strReferrer, xDate);
		
	} else {
		strVisitID = strCookie; 
		//some validation here would be nice
		blnFirstHit = 0;
		//alert("Welcome back")		
		
	}	
	
	if(strSessionID != null){
		if(strSessionID.length > 0){
			strVisitID = strSessionID;
			blnFirstHit = 0;
		}
	}

	var xDate=new Date();
	xDate.setHours (xDate.getHours () + 48);

	SetCookie(strCookieName, strVisitID, xDate, false);
	
	
	
	
	if (document.images) { 
		var str
		
		var imgctrl; 
		if (document.images) { 
			imgctrl = new Image();	
		} 
		
		var url = 'https://trafficroi.com/track.asp?';

		//append all parameters
		
			//uidClientID = fixrqstr("cl")
			//uidCampaignID = fixrqstr("cm")
			//uidVisitID = fixrqstr("v")
			//uidEventID = fixrqstr("e")
			//strURL = fixrqstr ("u")
			//strPageTitle = fixrqstr("p")
			//strReferrer = fixrqstr("r")
			//dblSalesAmount = fixrqnum("s")
			//blnFirstHit = fixrqbln("f")
			//strSE = fixrqstr("se")
			//strSEKeyword = fixrqstr("sek")
		//alert((strSE=='null'));
		
		url += "cl=" + ClientID + "&v=" + strVisitID +
			(isEmpty(strCampID) ? "" : "&cm=" + strCampID) +
			(isEmpty(strEventID) ? "" : "&e=" + strEventID ) +
			"&u=" + strURL +
			(isEmpty(strReferrer) ? "" : "&r=" + strReferrer) +
			((dblSaleAmount == null) ? "" : "&s=" + dblSaleAmount) +
			"&f=" + blnFirstHit +
			(isEmpty(strSE) ? "" : "&se=" + strSE) +
			(isEmpty(strSEKeyword) ? "" : "&sek=" + strSEKeyword)
		
		
		//alert ("<!-- geronimo " + url + "-->");
		
		imgctrl.src = url;		
		
	} 
}

function GetLastReferrer(){
	return unescape(GetCookie("REF" + ClientID) );	
}

function IsRepeatedReferrer(){
	//alert('Referrer: ' + document.referrer);
	//alert(' Last referrer: ' + GetLastReferrer());
	//alert('They equal: ' + (document.referrer == GetLastReferrer()));
	return (document.referrer == GetLastReferrer());
}


function isEmpty(strVal){
	return (strVal == null || strVal == 'null' || strVal == '');
}

function SEData(){
	this.strSE;
	this.strTerm;
	
	this.ParseReferrer = function(qString){
						
		var arSE = new Array("google.com", "yahoo.com", "search.msn.com", "search.aol.com", "altavista.com");
		var arSEName = new Array("google.com", "yahoo.com", "msn.com", "aol.com", "altavista.com");
		var arSEParam = new Array("q", "p", "q", "query", "q");
		
		for(i=0;i<arSE.length;i++){
			
			if(qString.indexOf(	arSE[i])>0){
				this.strSE = arSEName[i];
				this.strTerm = GetQuerystringParam(qString, arSEParam[i]);
				
				if (this.strTerm==null){
					//null, dont do anything
				} else if(this.strTerm.length == 0){
					//empty string as well
				} else {
					return true;
				}
			}
		}
		
		this.strSE = null;
		this.strTerm = null;
	}
	
}

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 GetGUID(){
	var tempStr, strPlugins, i
	
	tempStr = navigator.userAgent + Math.random() + navigator.cpuClass + (new Date()).getTime();
	
	return hex_hmac_md4(ClientID, tempStr);
}

/*
 * Configurable variables. You may need to tweak these to be compatible with
 * the server-side, but the defaults work in most cases.
 */
var hexcase = 0;  /* hex output format. 0 - lowercase; 1 - uppercase        */
var b64pad  = ""; /* base-64 pad character. "=" for strict RFC compliance   */
var chrsz   = 8;  /* bits per input character. 8 - ASCII; 16 - Unicode      */

/*
 * These are the functions you'll usually want to call
 */
function hex_md4(s){ return binl2hex(core_md4(str2binl(s), s.length * chrsz));}
function b64_md4(s){ return binl2b64(core_md4(str2binl(s), s.length * chrsz));}
function str_md4(s){ return binl2str(core_md4(str2binl(s), s.length * chrsz));}
function hex_hmac_md4(key, data) { return binl2hex(core_hmac_md4(key, data)); }
function b64_hmac_md4(key, data) { return binl2b64(core_hmac_md4(key, data)); }
function str_hmac_md4(key, data) { return binl2str(core_hmac_md4(key, data)); }

/* 
 * Perform a simple self-test to see if the VM is working 
 */
function md4_vm_test()
{
  return hex_md4("abc") == "a448017aaf21d8525fc10ae87aa6729d";
}

/*
 * Calculate the MD4 of an array of little-endian words, and a bit length
 */
function core_md4(x, len)
{
  /* append padding */
  x[len >> 5] |= 0x80 << (len % 32);
  x[(((len + 64) >>> 9) << 4) + 14] = len;
  
  var a =  1732584193;
  var b = -271733879;
  var c = -1732584194;
  var d =  271733878;

  for(var i = 0; i < x.length; i += 16)
  {
    var olda = a;
    var oldb = b;
    var oldc = c;
    var oldd = d;

    a = md4_ff(a, b, c, d, x[i+ 0], 3 );
    d = md4_ff(d, a, b, c, x[i+ 1], 7 );
    c = md4_ff(c, d, a, b, x[i+ 2], 11);
    b = md4_ff(b, c, d, a, x[i+ 3], 19);
    a = md4_ff(a, b, c, d, x[i+ 4], 3 );
    d = md4_ff(d, a, b, c, x[i+ 5], 7 );
    c = md4_ff(c, d, a, b, x[i+ 6], 11);
    b = md4_ff(b, c, d, a, x[i+ 7], 19);
    a = md4_ff(a, b, c, d, x[i+ 8], 3 );
    d = md4_ff(d, a, b, c, x[i+ 9], 7 );
    c = md4_ff(c, d, a, b, x[i+10], 11);
    b = md4_ff(b, c, d, a, x[i+11], 19);
    a = md4_ff(a, b, c, d, x[i+12], 3 );
    d = md4_ff(d, a, b, c, x[i+13], 7 );
    c = md4_ff(c, d, a, b, x[i+14], 11);
    b = md4_ff(b, c, d, a, x[i+15], 19);

    a = md4_gg(a, b, c, d, x[i+ 0], 3 );
    d = md4_gg(d, a, b, c, x[i+ 4], 5 );
    c = md4_gg(c, d, a, b, x[i+ 8], 9 );
    b = md4_gg(b, c, d, a, x[i+12], 13);
    a = md4_gg(a, b, c, d, x[i+ 1], 3 );
    d = md4_gg(d, a, b, c, x[i+ 5], 5 );
    c = md4_gg(c, d, a, b, x[i+ 9], 9 );
    b = md4_gg(b, c, d, a, x[i+13], 13);
    a = md4_gg(a, b, c, d, x[i+ 2], 3 );
    d = md4_gg(d, a, b, c, x[i+ 6], 5 );
    c = md4_gg(c, d, a, b, x[i+10], 9 );
    b = md4_gg(b, c, d, a, x[i+14], 13);
    a = md4_gg(a, b, c, d, x[i+ 3], 3 );
    d = md4_gg(d, a, b, c, x[i+ 7], 5 );
    c = md4_gg(c, d, a, b, x[i+11], 9 );
    b = md4_gg(b, c, d, a, x[i+15], 13);

    a = md4_hh(a, b, c, d, x[i+ 0], 3 );
    d = md4_hh(d, a, b, c, x[i+ 8], 9 );
    c = md4_hh(c, d, a, b, x[i+ 4], 11);
    b = md4_hh(b, c, d, a, x[i+12], 15);
    a = md4_hh(a, b, c, d, x[i+ 2], 3 );
    d = md4_hh(d, a, b, c, x[i+10], 9 );
    c = md4_hh(c, d, a, b, x[i+ 6], 11);
    b = md4_hh(b, c, d, a, x[i+14], 15);
    a = md4_hh(a, b, c, d, x[i+ 1], 3 );
    d = md4_hh(d, a, b, c, x[i+ 9], 9 );
    c = md4_hh(c, d, a, b, x[i+ 5], 11);
    b = md4_hh(b, c, d, a, x[i+13], 15);
    a = md4_hh(a, b, c, d, x[i+ 3], 3 );
    d = md4_hh(d, a, b, c, x[i+11], 9 );
    c = md4_hh(c, d, a, b, x[i+ 7], 11);
    b = md4_hh(b, c, d, a, x[i+15], 15);

    a = safe_add(a, olda);
    b = safe_add(b, oldb);
    c = safe_add(c, oldc);
    d = safe_add(d, oldd);

  }
  return Array(a, b, c, d);

}

/*
 * These functions implement the basic operation for each round of the
 * algorithm.
 */
function md4_cmn(q, a, b, x, s, t)
{
  return safe_add(rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b);
}
function md4_ff(a, b, c, d, x, s)
{
  return md4_cmn((b & c) | ((~b) & d), a, 0, x, s, 0);
}
function md4_gg(a, b, c, d, x, s)
{
  return md4_cmn((b & c) | (b & d) | (c & d), a, 0, x, s, 1518500249);
}
function md4_hh(a, b, c, d, x, s)
{
  return md4_cmn(b ^ c ^ d, a, 0, x, s, 1859775393);
}

/*
 * Calculate the HMAC-MD4, of a key and some data
 */
function core_hmac_md4(key, data)
{
  var bkey = str2binl(key);
  if(bkey.length > 16) bkey = core_md4(bkey, key.length * chrsz);

  var ipad = Array(16), opad = Array(16);
  for(var i = 0; i < 16; i++) 
  {
    ipad[i] = bkey[i] ^ 0x36363636;
    opad[i] = bkey[i] ^ 0x5C5C5C5C;
  }

  var hash = core_md4(ipad.concat(str2binl(data)), 512 + data.length * chrsz);
  return core_md4(opad.concat(hash), 512 + 128);
}

/*
 * Add integers, wrapping at 2^32. This uses 16-bit operations internally
 * to work around bugs in some JS interpreters.
 */
function safe_add(x, y)
{
  var lsw = (x & 0xFFFF) + (y & 0xFFFF);
  var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
  return (msw << 16) | (lsw & 0xFFFF);
}

/*
 * Bitwise rotate a 32-bit number to the left.
 */
function rol(num, cnt)
{
  return (num << cnt) | (num >>> (32 - cnt));
}

/*
 * Convert a string to an array of little-endian words
 * If chrsz is ASCII, characters >255 have their hi-byte silently ignored.
 */
function str2binl(str)
{
  var bin = Array();
  var mask = (1 << chrsz) - 1;
  for(var i = 0; i < str.length * chrsz; i += chrsz)
    bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (i%32);
  return bin;
}

/*
 * Convert an array of little-endian words to a string
 */
function binl2str(bin)
{
  var str = "";
  var mask = (1 << chrsz) - 1;
  for(var i = 0; i < bin.length * 32; i += chrsz)
    str += String.fromCharCode((bin[i>>5] >>> (i % 32)) & mask);
  return str;
}

/*
 * Convert an array of little-endian words to a hex string.
 */
function binl2hex(binarray)
{
  var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
  var str = "";
  for(var i = 0; i < binarray.length * 4; i++)
  {
    str += hex_tab.charAt((binarray[i>>2] >> ((i%4)*8+4)) & 0xF) +
           hex_tab.charAt((binarray[i>>2] >> ((i%4)*8  )) & 0xF);
  }
  return str;
}

/*
 * Convert an array of little-endian words to a base-64 string
 */
function binl2b64(binarray)
{
  var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  var str = "";
  for(var i = 0; i < binarray.length * 4; i += 3)
  {
    var triplet = (((binarray[i   >> 2] >> 8 * ( i   %4)) & 0xFF) << 16)
                | (((binarray[i+1 >> 2] >> 8 * ((i+1)%4)) & 0xFF) << 8 )
                |  ((binarray[i+2 >> 2] >> 8 * ((i+2)%4)) & 0xFF);
    for(var j = 0; j < 4; j++)
    {
      if(i * 8 + j * 6 > binarray.length * 32) str += b64pad;
      else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F);
    }
  }
  return str;
}
