var uriDomain;
var uriRefDomain;
var expire_duration = 0;
var def_sp_host_name = 'http://www.studyplaces.com';

/* This is for backward compatibility */
function sp_track() {
  sp_tracker_start(def_sp_host_name);
  return;
}


function sp_track_new(sp_host_name_temp) {

  if(sp_host_name_temp && sp_host_name_temp!='')
    sp_host_name = sp_host_name_temp;
    
  if(!sp_host_name || sp_host_name=='')
    sp_host_name = def_sp_host_name;       

	var engines = 'yahoo,google,msn';
	var uri = window.location.href;
	var uriRef = document.referrer;
	var organicParams = new Array();
	organicParams = isOrganicSearch(engines,uriRef);
	var params = getParameters(uri);
	params = myMerge(params, organicParams);
	//var postParams = new Array();
	var image_url = sp_host_name+'/sp/track/pixel';
	var count = 0;
	
	var qstr="";
	for(var i in params) {		
    switch(i) {
    	case 'utm_source':
    	case 'utm_medium':
    	case 'utm_term':
    	case 'utm_content':
    	case 'utm_campaign':
    	case 'utm_referrer_term':
    			//if(count == 0) {
    			//	cleanCampaignCookie();
    			//}
    			//if(i == 'utm_term')
    			//	params.utm_term = URLDecode(params.utm_term);
				params[i] = URLDecode(params[i]);
				//createCookie(map_cookie(i),params[i],expire_duration);
				qstr += map_cookie(i)+'='+URLEncode(params[i])+ '&';
				//postParams[i] = params[i];
				count++;
				break;
		}

	}
	if(count > 0) {
		//postParams['referrer'] = uriRef;
		qstr += 'referrer=' + URLEncode(uriRef)+ '&';
		//createCookie('referrer',uriRef,expire_duration);
		//pixel_image = new Image()
        	//pixel_image.src = image_url; 
		//HTTPPost('/index.php?q=sp_campaign_track',postParams,'','');
	}
	else if(uriRefDomain != '' && uriDomain != uriRefDomain){
	  var sp_track_pixel_fired = readCookie('sp_track_pixel_fired');
	  if(!sp_track_pixel_fired || sp_track_pixel_fired=='') {	  
  		cleanCampaignCookie();
  		var params = new Array();
  		params.utm_medium = 'Organic';
  		params.utm_source = uriRefDomain;
  		params.referrer = uriRef;
  		for(var i in params) {
  			qstr += map_cookie(i)+'='+URLEncode(params[i])+'&';
  			//createCookie(map_cookie(i),params[i],expire_duration);
  		}
    }		  
	}
	

  //add spc_site unconditionally if we have utm entries otherwise only if spc_site has been changed
	var sp_site_cookie = readCookie('spc_site');
	var domain_jump = false;
	if(sp_site_cookie == '' || sp_site_cookie != uriDomain) {
    createCookie('spc_site',uriDomain,expire_duration);
    sp_site_cookie = uriDomain;
    domain_jump = true;
  }
  
  //we have utm entries in url
  if(qstr != ''){
    qstr += 'spc_site='+URLEncode(sp_site_cookie)+'&';
  }
  else {
    if(domain_jump) {
      qstr = 'spc_site='+URLEncode(sp_site_cookie)+'&';
    }
  }

	
	if(qstr != ''){
  	//alert('requesting cookies '+qstr);
  	createImage(1,1,image_url,qstr);
	}
	
}

function map_cookie(cookie_name) {
	return cookie_name.replace('utm_','spc_');
}

function cleanCampaignCookie() {
	//alert('erasing all cookies');
	eraseCookie('spc_source');
	eraseCookie('spc_medium');
	eraseCookie('spc_term');
	eraseCookie('spc_content');
	eraseCookie('spc_campaign');
	eraseCookie('spc_referrer_term');
	eraseCookie('referrer');	
}

function myMerge(params, organicParams) {
	if( (!params || ( !params['utm_source'] && !params['utm_medium'] && !params['utm_term'] && !params['utm_content'] && !params['utm_campaign'] ) ) && organicParams ) {
		return organicParams;
	}
	else {
		if(organicParams && organicParams.utm_referrer_term)
			params.utm_referrer_term = organicParams.utm_referrer_term;
		return params;
	}
}
	
	
function isOrganicSearch(engines,uri) {
	var uriObj = parseUri(uri);
	var domain = uriObj.domain;
	uriRefDomain = domain;
	var engines_arr = engines.split(',');
	var engine = '';
	var query = '';
	for(i=0;i<engines_arr.length; i++) {
		var reg = new RegExp(engines_arr[i],'i');
		if(reg.test(domain)) {
		  var params = new Array();
  		engine = engines_arr[i];
		  params.utm_medium = 'Organic';
		  params.utm_source = engine;
			switch(engine) {
				case 'google':
					params.utm_referrer_term = getGoogleQueryString(uriObj.query);
					break;
				case 'yahoo':
					params.utm_referrer_term = getYahooQueryString(uriObj.query);
					break;
				case 'msn':
					params.utm_referrer_term = getMsnQueryString(uriObj.query);
					break;					
			}
			if(params.utm_referrer_term)
				params.utm_referrer_term = URLDecode(params.utm_referrer_term);
			return params;
		}
	}
	return null;
}

function getMsnQueryString(query) {
	var params = query.split("&");
	var retparams = new Array();
	for(var i = 0 ; i < params.length ; i++) {
		 var pairArray = params[i].split("=");
		 if(pairArray.length == 2){
			 retparams[pairArray[0]] = pairArray[1];
		 }
	}
	if(retparams.q)
		return retparams.q;
	else
		return null;
}

function getGoogleQueryString(query) {
	var params = query.split("&");
	var retparams = new Array();
	for(var i = 0 ; i < params.length ; i++) {
		 var pairArray = params[i].split("=");
		 if(pairArray.length == 2){
			 retparams[pairArray[0]] = pairArray[1];
		 }
	}
	if(retparams.q)
		return retparams.q;
	else
		return null;
}
	
function getYahooQueryString(query) {
	var params = query.split("&");
	var retparams = new Array();
	for(var i = 0 ; i < params.length ; i++) {
		 var pairArray = params[i].split("=");
		 if(pairArray.length == 2){
			 retparams[pairArray[0]] = pairArray[1];
		 }
	}
	if(retparams.p)
		return retparams.p;
	else
		return null;
}	

function parseUri(sourceUri){
    var uriPartNames = ["source","protocol","authority","domain","port","path","directoryPath","fileName","query","anchor"];
    var uriParts = new RegExp("^(?:([^:/?#.]+):)?(?://)?(([^:/?#]*)(?::(\\d*))?)?((/(?:[^?#](?![^?#/]*\\.[^?#/.]+(?:[\\?#]|$)))*/?)?([^?#/]*))?(?:\\?([^#]*))?(?:#(.*))?").exec(sourceUri);
    var uri = {};
    
    for(var i = 0; i < 10; i++){
        uri[uriPartNames[i]] = (uriParts[i] ? uriParts[i] : "");
    }
    
    // Always end directoryPath with a trailing backslash if a path was present in the source URI
    // Note that a trailing backslash is NOT automatically inserted within or appended to the "path" key
    if(uri.directoryPath.length > 0){
        uri.directoryPath = uri.directoryPath.replace(/\/?$/, "/");
    }
    
    return uri;
}

function getParameters(uri) {

   var params = new Array();
   var url = uri;
   var uriObj = parseUri(url);
   var paramString = uriObj.query;
   uriDomain = uriObj.domain;
   var hasMoreParams = true;
	 var retparams = new Array();
   if(paramString){

     var params = paramString.split("&");
     for(var i = 0 ; i < params.length ; i++) {

       var pairArray = params[i].split("=");

       if(pairArray.length == 2){
         retparams[pairArray[0]] = pairArray[1];
       }

     }
     return retparams;
   }
   return null;
}

function createCookie(name,value,days) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(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 eraseCookie(name) {
	createCookie(name,"",-1);
}

function URLEncode( uri)
{
	// The Javascript escape and unescape functions do not correspond
	// with what browsers actually do...
	var SAFECHARS = "0123456789" +					// Numeric
					"ABCDEFGHIJKLMNOPQRSTUVWXYZ" +	// Alphabetic
					"abcdefghijklmnopqrstuvwxyz" +
					"-_.!~*'()";					// RFC2396 Mark characters
	var HEX = "0123456789ABCDEF";

	var plaintext = uri;
	var 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) {
			    alert( "Unicode Character '" 
                        + ch 
                        + "' cannot be encoded using standard URL encoding.\n" +
				          "(URL encoding only supports 8-bit characters.)\n" +
						  "A space (+) will be substituted." );
				encoded += "+";
			} else {
				encoded += "%";
				encoded += HEX.charAt((charCode >> 4) & 0xF);
				encoded += HEX.charAt(charCode & 0xF);
			}
		}
	} // for

	
	return encoded;
};

function URLDecode(uri )
{
   // Replace + with ' '
   // Replace %xx with equivalent character
   // Put [ERROR] in output if %xx is invalid.
   var HEXCHARS = "0123456789ABCDEFabcdef"; 
   var encoded = uri;
   var 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 {
				alert( 'Bad escape combination near ...' + encoded.substr(i) );
				plaintext += "%[ERROR]";
				i++;
			}
		} else {
		   plaintext += ch;
		   i++;
		}
	} // while
	return plaintext;
};

function sp_populate_form() {
	var uri = window.location.href;
	var params = getParameters(uri);
	if(params)
  for(var i in params) {
    if((i == 'leadid' || i == 'uid' || i == 'isNewUser') && /^\d+$/.test(params[i])) {
      insertHidden(i,params[i]);
    }
    else {
      sp_populate_form_field(i,params[i]);
    }    
  }  
}

function sp_populate_form_field(fieldName,fieldValue) {
  var elem = document.getElementsByName(fieldName);
  for(var i=0;i<elem.length;i++) {
    if(!elem[i].value || elem[i].value == '') {
      elem[i].value = URLDecode(fieldValue);
      elem[i].readOnly = true;
    }
  }
}

function insertHidden(fieldName,fieldValue) {
  var elem = document.getElementsByTagName('form');
  for(var i=0;i<elem.length;i++) {
    var newdiv = document.createElement('input');
    newdiv.setAttribute('id',fieldName);
    newdiv.setAttribute('name',fieldName);
    newdiv.setAttribute('value',fieldValue);
    newdiv.setAttribute('type','hidden');
    elem[i].appendChild(newdiv);
  }  
}

function sp_conversion() {
   var cookie_conversion = readCookie('utm_conversion_txn');
   if (cookie_conversion) {
	    url = sp_host_name+'/sp_conversion/pixel';
	    var iframe = document.createElement("iframe");
	    iframe.id = "conversion_frame";
	    iframe.name = "testiframe";
	    iframe.frameborder = 0;
	    iframe.height = 0;
	    iframe.width = 0;
	    iframe.style.display = "none";
	    iframe.src = url;
	    window.document.body.appendChild(iframe);
		//record conversion confirmation
	    //var image_url = sp_host_name+'/sp/track/pixel/confirm?';
		//pixel_image = new Image();
        //pixel_image.src = image_url + 'txn_id='+cookie_conversion;
		//erase cookie
		//eraseCookie('utm_conversion_txn');
   }
}

function createImage(height,width,path,params){
	  var i=new Image(1,1);
	  i.src=path+"?"+params;
	  i.onload=function() { _uVoid(); };
	  return;
}
function _uVoid(){
 return;
}

function getUriDomain(uri) {
  if(!uri) {
    uri = window.location.href;
  }
  var uriObj = parseUri(uri);
  if(uriObj)
    return uriObj.domain;
  return null;  
}

function isTrackerOnSameHost(sp_host_name) {
  if(getUriDomain()==getUriDomain(sp_host_name))
    return true;
  return false;
}

function isPhpSessionOpenInTracker() {
    var sessionId = readCookie('PHPSESSID');
    if(sessionId==null || sessionId == '') {
      return false;
    }
    return true;
}

function sp_tracker_start(sp_host_name) {
  //alert('test');
  //only try to start php session if tracker js is on same host[sp_host_name == url domain] otherwise we cant do ajax query on sp_host_name
  //also check if we don not already have phpsessid
  if(isTrackerOnSameHost(sp_host_name) && !isPhpSessionOpenInTracker()) {
    HTTPGet('/start_session.php', function(data, xmlHttp, sp_host_name){sp_track_new(sp_host_name);}, sp_host_name);
  }
  else {
    sp_track_new(sp_host_name);    
  }    
  //sp_conversion();
}