var knownReferrers = ['google', 'yahoo', 'msn', 'live', 'bing'];

//NOTE: must return empty string when not found
function getQueryParam(url, key) {
  default_ = "";
  if ((url == null) || (url == '')) {
    return default_;
  }
  key = key.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
  var regex = new RegExp("[\\?&]" + key + "=([^&#]*)");
  var qs = regex.exec(url);
  if (qs == null) {
    return default_;
  }
  else {
    return qs[1];
  }    
}

//replace http:// with empty string
//replace all .,?,&,+ with _ (underscore)
//NOTE: must return empty string when str is null or empty
function replaceSpecialChars(str) {
  var newString = "";
  if (str != null && str != '') {
    newString = new String(str).replace(/http:\/\//mg, "").replace(/([ .?&+])/g, "_");
  }
  return newString;
}

//NOTE: must return empty string when url is null or empty
function getDomain(url) {
  var domain = "";
  if (url != null && url != '') {
    var newString = new String(url).replace(/http:\/\//mg, "");
    domain = newString.substring(0, newString.indexOf("/"));
  }
  return domain;
}

function validKeywordsParamMap() {
  var qMap = new Array();
  qMap['google'] = "q";
  qMap['yahoo'] = "p";
  qMap['yellowpages'] = "query";
  return qMap;
}

function getSearchWords(url, useDefault) {
  var searchWords = "";
  var host = getDomain(url);
  var keyMap = validKeywordsParamMap();
  for (key in keyMap) {
    if (url.indexOf(key) != -1) {
      var paramName = keyMap[key];
      searchWords = getQueryParam(url, paramName);
      if (searchWords != null && searchWords != '') {
        searchWords = replaceSpecialChars(searchWords);
        break;
      } else {
        searchWords = (useDefault) ? 'no_query' : '';
      }
    }
  }
  return searchWords;
}

function searchArray(arr, toFind) {
	if (arr.constructor != Array) {
    return false;
  }
	for(var i = 0, len = arr.length; i < len; i++) {
		if(arr[i].constructor == Array) {
			if (searchArray(arr[i], toFind)) {
        return true;
      }
		} else if(arr[i] == toFind) {
			return true;
		}
	}
	return false;
}

function getSource(reqURI, refUrl) {
  reqURI = unescape(reqURI);
  var source = getQueryParam(reqURI, "utm_source");
  if (source == null || source == '') {
    var ld_aff = getQueryParam(reqURI, "LD_aff");
    if (ld_aff != null && ld_aff != '') {
      source = ld_aff;
    } 
    else {
      if (refUrl != null && refUrl != '') {
        refUrl = refUrl.toLowerCase();
        if ((refUrl.indexOf('google') != -1) || (refUrl.indexOf('doubleclick') != -1)) {
          source = "Google";
        } else if (refUrl.indexOf('yahoo') != -1) {
          source = "Yahoo";
        } else if ((refUrl.indexOf('msn') != -1) || (refUrl.indexOf('/live') != -1)
            || (refUrl.indexOf('bing') != -1)) {
          source = "MSN";
        } else if (refUrl.indexOf('ziplocal') != -1) {
          source = "Ziplocal";
        } else if (refUrl.indexOf('yellowpages') != -1) {
          source = "Livedeal-YP";
        } else if (refUrl.indexOf('citysearch') != -1) {
          source = "CitySearch";
        } else if (refUrl.indexOf('oodle') != -1) {
          source = "Oodle";
        } else if (refUrl.indexOf('valueclick') != -1) {
          source = "ValueClick";
        } else if (refUrl.indexOf('classifieds') != -1) {
          if (refUrl.indexOf('classifieds.myspace') != -1) {
            source = "Myspace";
          } else if (refUrl.indexOf('classifieds.livedeal') != -1) {
            source = "Livedeal-CL";
          } else {
            var domain = getDomain(refUrl);
            source = replaceSpecialChars(domain);
          }
        } else {
          source = "Others";
        }
      } else {
        source = "Others";
      }
    }
  }
  return source;
}

function isAdvertiser(reqURI) {
  var param_value = getQueryParam(reqURI.toLowerCase(), "ld_advertiser");
  var is_advertiser = (param_value == 'yes') ? true : false;
  return is_advertiser;
}

function isConversion(reqURI) {
  var param_value = getQueryParam(reqURI.toLowerCase(), "ld_conversion");
  var is_conversion = (param_value == 'yes') ? true : false;
  return is_conversion;
}

function getCategoryFirstUrl(source, cat, engine, rurl_host, searchWords) {
  var url = "/" + source;
  if (cat != null) {
    url = url + "/" + cat;
  }
  if (engine != null) {
    url = url + "/" + engine;
  }
  url = url + "/" + rurl_host;
  url = (searchWords != '') ? (url + "/" + searchWords) : url;
  return url;
}

function getDomainFirstUrl(source, cat, engine, rurl_host, searchWords) {
  var url = "/" + rurl_host + "/" + source;
  if (cat != null) {
    url = url + "/" + cat;
  }
  if (engine != null) {
    url = url + "/" + engine;
  }
  url = (searchWords != '') ? (url + "/" + searchWords) : (url + "/");
  return url;
}

function getAnalyticsArraySEM(rurl_host, refUrl, reqURI) {
  var urlCatFirst = "";
  var urlDomainFirst = "";
  var searchWords = getSearchWords(refUrl, true);
  rurl_host = replaceSpecialChars(rurl_host);
  rurl_host = rurl_host.toLowerCase();
  reqURI = unescape(reqURI);
  var refUrlLC = refUrl.toLowerCase();
  
  var is_advertiser = isAdvertiser(reqURI);
  var is_conversion = isConversion(reqURI);
  
  if (is_advertiser) {
    urlCatFirst = "/advertiser/" + rurl_host;
    urlDomainFirst = "/" + rurl_host + "/advertiser";
  }
  else if (is_conversion) {
    urlCatFirst = "/conversion/" + rurl_host;
    urlDomainFirst = "/" + rurl_host + "/conversion";
  }
  else {
    var domain = getDomain(refUrlLC);
    if (domain == '') {
      domain = "no_referrer";
    }
    else {
      domain = replaceSpecialChars(domain);  
    }
      
	  var source = getSource(reqURI, refUrl);
    var isSourceInReferrer = (refUrlLC.indexOf(source.toLowerCase()) != -1);
    var isKnownReferrer = searchArray(knownReferrers, source.toLowerCase());
    if (isKnownReferrer != false) { //known referrer
      if (isSourceInReferrer) {
        urlCatFirst = getCategoryFirstUrl(source, "SEM", null, rurl_host, searchWords);
        urlDomainFirst = getDomainFirstUrl(source, "SEM", null, rurl_host, searchWords);
      }
      else {
        urlCatFirst = getCategoryFirstUrl(source, "Network", domain, rurl_host, searchWords);
        urlDomainFirst = getDomainFirstUrl(source, "Network", domain, rurl_host, searchWords);
      }
    }
    else { //not a known referrer
      if (source.toLowerCase() == 'others') {
        urlCatFirst = getCategoryFirstUrl(source, null, domain, rurl_host, searchWords);
        urlDomainFirst = getDomainFirstUrl(source, null, domain, rurl_host, searchWords);
      }
      else if (source.toLowerCase() == 'oodle') {
        if (isSourceInReferrer) {
          urlCatFirst = getCategoryFirstUrl(source, "Self", null, rurl_host, searchWords);
          urlDomainFirst = getDomainFirstUrl(source, "Self", null, rurl_host, searchWords);
        }
        else {
          urlCatFirst = getCategoryFirstUrl(source, "Network", domain, rurl_host, searchWords);
          urlDomainFirst = getDomainFirstUrl(source, "Network", domain, rurl_host, searchWords);
        }
      }
      else if ((source.toLowerCase() == 'livedeal-yp') || 
          (source.toLowerCase() == 'citysearch')) {
        urlCatFirst = getCategoryFirstUrl(source, null, null, rurl_host, searchWords);
        urlDomainFirst = getDomainFirstUrl(source, null, null, rurl_host, searchWords);
      }
	    else if (source.toLowerCase() == 'valueclick') {
        urlCatFirst = getCategoryFirstUrl(source, null, domain, rurl_host, searchWords);
        urlDomainFirst = getDomainFirstUrl(source, null, domain, rurl_host, searchWords);
      }
      else { //random utm_source or random ld_aff
        urlCatFirst = getCategoryFirstUrl(source, null, domain, rurl_host, searchWords);
        urlDomainFirst = getDomainFirstUrl(source, null, domain, rurl_host, searchWords); 
      }
    }
  }
  //alert("SEM_CAT_FIRST = " + urlCatFirst);
  //alert("SEM_DOM_FIRST = " + urlDomainFirst);
  
  var array = makeAnalyticsArray(urlCatFirst, urlDomainFirst);
  return array;
}

function getAnalyticsArrayOrganic(refUrl, advertiser){
  var urlCatFirst = "";
  var urlDomainFirst = "";  
  advertiser = (advertiser != null) ? replaceSpecialChars(advertiser).toLowerCase() : "";
  var searchWords = getSearchWords(refUrl, true);
  var referrer_host = getDomain(refUrl);
  if (referrer_host == '') {
    urlCatFirst = getCategoryFirstUrl("Direct", null, null, advertiser, searchWords);
    urlDomainFirst = getDomainFirstUrl("Direct", null, null, advertiser, searchWords);
  }
  else {
    var source = getSource(null, refUrl);
    var isKnownReferrer = searchArray(knownReferrers, source.toLowerCase()); 
    if (isKnownReferrer != false) { //known referrer
  	  urlCatFirst = getCategoryFirstUrl(source, "SEO", null, advertiser, searchWords);
      urlDomainFirst = getDomainFirstUrl(source, "SEO", null, advertiser, searchWords);
    }
    else { //not a known referrer
      referrer_host = replaceSpecialChars(referrer_host).toLowerCase();
      urlCatFirst = getCategoryFirstUrl("Organic", null, referrer_host, advertiser, searchWords);
      urlDomainFirst = getDomainFirstUrl("Organic", null, referrer_host, advertiser, searchWords);
    } 
  }
  //alert("ORG_CAT_FIRST = " + urlCatFirst);
  //alert("ORG_DOM_FIRST = " + urlDomainFirst);
    
  var array = makeAnalyticsArray(urlCatFirst, urlDomainFirst);
  return array;
}

function makeAnalyticsArray(urlCatFirst, urlDomainFirst) {
  var analyticsUrlArray = new Array();
  analyticsUrlArray['UA-230502-34'] = urlCatFirst.toLowerCase();
  analyticsUrlArray['UA-230502-35'] = urlDomainFirst.toLowerCase();
  return analyticsUrlArray;
}

function sendAnalyticsSEM(rurl_host, refUrl, reqURI) {
  var gArray = getAnalyticsArraySEM(rurl_host, refUrl, reqURI);
  for (key in gArray) {
    _uacct = key;
    var virtualUrl = gArray[key];
    if (virtualUrl != null && virtualUrl != '') {
      //only send to GA if it doesn't contain /tools_livedeal
      if (virtualUrl.indexOf('/tools_livedeal') == -1) {
        urchinTracker(virtualUrl);
      }
    }
  }
}

function sendAnalyticsOrganicClient(refUrl, advertiser) {
  var gArray = getAnalyticsArrayOrganic(refUrl, advertiser);
  for (key in gArray) {
    _uacct = key;
    var virtualUrl = gArray[key];
    if (virtualUrl != null && virtualUrl != '') {
      //only send to GA if it doesn't contain /tools_livedeal
      if (virtualUrl.indexOf('/tools_livedeal') == -1) {
        urchinTracker(virtualUrl);
      }
    }
  }
}