/************************************************************************
                SEO Replace Text, (C) CAKE Websites 2011
 		           Programmed by William Budington

 Usage:
	Add replacement rules with
		replaceText.addRule(search_term, replace_term, search_engine);
	Set elements to replace with
		replaceText.setElements(element_selector_string);

 Example:
	<script type='text/javascript' src='seo_replacetext.js' />
	<script type='text/javascript'> 
		replaceText.addRule("CEO", "Eric Schmidt", "Google");
		replaceText.addRule("CEO", "Steve Ballmer", "Bing");
		replaceText.addRule("Year", "2011", "*");
		replaceText.setElements("p.bodytext, #example_text");
	</script>

 Requires:
	jQuery >= 1.0

************************************************************************/

/* Class: cookieHandler */
/* Retrieves and stores cookie information for SEO referrer */

function cookieHandler(){
	this.referrer;
	this.init();
}

cookieHandler.prototype.setCookie = function(name, value){
	var expires_date = new Date();
	expires_date.setTime(expires_date.getTime() + (1000 * 60 * 60 * 24 * 365 * 20));
	document.cookie = name + "=" + escape(value) + ";expires=" + expires_date.toGMTString();
};

cookieHandler.prototype.getCookie = function(name){
	var arg = name + "=";
	var alen = arg.length;
	var clen = document.cookie.length;
	var i = 0;
	while (i < clen){
		var j = i + alen;
		if (document.cookie.substring(i, j) == arg){
			return this.getCookieVal(j);
		}
		i = document.cookie.indexOf(" ", i) + 1;
		if (i == 0) break; 
	}
	return null;
};

cookieHandler.prototype.getCookieVal = function(offset){
	var endstr = document.cookie.indexOf(";", offset);
	if (endstr == -1)
		endstr = document.cookie.length;
	return unescape(document.cookie.substring(offset, endstr));
};

cookieHandler.prototype.init = function(){
	var cake_refer = this.getCookie('cake_refer');
	if(!cake_refer){
		this.referrer = this.determineReferrer(document.referrer);
		this.setCookie("cake_refer",this.referrer);
	} else {
		this.referrer = cake_refer;
	}
};

cookieHandler.prototype.determineReferrer = function(referrer){
	var retval = "Direct";
	//list of well known search engines. 
	//  Structure: "SE Name|SE Domain(partial+unique)|query_key|page_key|language_key|locale|"
	var se_array = new Array(
		"Google PPC|www.google.|adurl||||",		// google PPC
		"Google Images|images.google.|prev|start|hl||",  //obsolete
		"Google Images|/imgres?imgurl=|prev|start|hl||", 
		"Google|www.google.|q|cd|hl||",
		"Google|www.google.|as_q|start|hl||",	//advanced query
		"Yahoo Images|images.search.yahoo.com|p||||", 
		"Yahoo Mobile|m.search.yahoo.|p||||", 
		"Yahoo|search.yahoo.|p||||", 
		"Yahoo|answers.yahoo.com|p||||", 
		"Bing Mobile|m.bing.com|q|first|||", 
		"Bing Images|.bing.com/images/|q|first|||", 
		"Bing|.bing.com|q|first|||", 
		"MSN|search.msn.|q|first|||", 
		"Windows Live|search.live.com|q|first|||",
		"100Links|100links.supereva.it|q|||it|",
		"2020Search|.2020search.com|st||||",
		"abcsearch.com|abcsearch.com|terms||||",
		"ABC Sok|verden.abcsok.no|q|||no|",
		"Alice|search.alice.it|qs|||it|", 
		"Altavista|.altavista.com|q||||",
		"Altavista|.altavista.com|aqa||||",	//advanced query
		"Alexa|alexa.com|q||||","Alltheweb|alltheweb.com|q||||",
		"Aol|.aol.|query||||",
		"Aol|aolrecherches.aol.fr|query|||fr|",
		"Arianna|arianna.libero.it|query|||it|",
		"Ask|ask.com|ask||||","Ask|ask.com|q||||",
		"Atlas|search.atlas.cz|q|||cz|",
		"Beedly INT|beedly.us|q||||",
		"Bing Cache|cc.bingj.com|q|first|||", 
		"bluewin|bluewin.ch|query|||ch|", 
		"Centrum|search.centrum.cz|q|||cz|",
		"Clarence|search.clarence.com|q||||",
		"Conduit|search.conduit.com|q||||",
		"DMOZ|search.dmoz.org|search||||", 
		"Dogpile|dogpile.com|q||||",
		"earthlink.net|earthlink.net|q||||",
		"Excite|excite.|q||||",
		"Gazzetta|search.gazzetta.it|q|||it|",
		"Godago|.godago.com|keywords||||",
		"Good Search|goodsearch.com|Keywords||||", 
		"Google Blog|blogsearch.google.|as_q|start|||", 
		"Google Blog|blogsearch.google.|q|start|||",
		"Google Groups|groups.google.|q|start|||", 
		"Google Groups|groups.google.|q|start|||", 
		"Google Translate|translate.google.|prev|start|hl||",
		"Google Translate|translate.googleusercontent.com|prev|start|hl||",
		"Google Cache|http://64.233.1|q|cd|hl||", 
		"Google Cache|http://72.14.|q|cd|hl||", 
		"Google Cache|http://74.125.|q|cd|hl||", 
		"Google Cache|http://209.85.|q|cd|hl||", 
		"Google Cache|.googleusercontent.com|q|cd|hl||",
		"Google IPv6|ipv6.google.|q|cd|hl||",
		"HotBot|hotbot.|query||||",
		"ICQ Search|.icq.com|q||||",
		"Il Trovatore|.iltrovatore.it|q|||it|",
		"Incredimail|.incredimail.com|q||||",
		"ItaliaPuntoNet|italiapuntonet.net|search||||",
		"ixquick|ixquick.com|query||||", 
		"Jyxo|jyxo.1188.cz|q|||cz|",
		"Jumpy|.mediaset.it|searchWord|||it|",
		"Kataweb|kataweb.it|q|||it|", 
		"Kvasir|kvasir.no|searchExpr|||no|", 
		"Lycos|.lycos.it|query|||it|",
		"Lycos|lycos.|q||||",
		"My Search|mysearch.com|searchfor||||",
		"My Way|mysearch.myway.com|searchfor||||",
		"Metacrawler|metacrawler.|q||||", 
		"Metager|metager.de|eingabe|||de|",
		"Netscape Search|search.netscape.com|query||||",
		"Overture|overture.com|Keywords||||",
		"OpenDir|.opendir.cz|cohledas|||cz|",
		"PagineGialle|paginegialle.it|qs|||it|",
		"Picsearch|.picsearch.com|q||||",
		"Search|.search.com|q||||", 
		"Search|.search.it|srctxt|||it|",
		"Seznam|.seznam.cz|q|||cz|", 
		"Start.no|start.no|q||||", 
		"StartNow|search.startnow.|q||||",
		"Supereva|supereva.it|q|||it|",
		"Teoma|teoma.com|q||||",
		"T-Online|suche.t-online.de|q|||de|",
		"Tiscali|search-dyn.tiscali.|key||||",
		"Tiscali|.tiscali.|query||||",
		"Virgilio|.virgilio.it|qs|||it|",
		"Voil|voila.fr|kw|||fr|",
		"Web|.web.de|su|||de|", 
		"Yahoo! Mobile|m.yahoo.com|p||||",
		"Yandex|yandex.ru|text|||ru|",
		"Yippy|search.yippy.com|query||||",
		"Zoohoo|.zoohoo.cz|q|||cz|", 
		"Zoznam|.zoznam.sk|s|||sk|");


	for(se_key in se_array){  // $domain,$key,$page,$lang,$selocale
		var se_value_array = se_array[se_key].toString().split("|");
		var se_name = se_value_array[0];
		var se_domain = se_value_array[1];
		var se_key = se_value_array[2];
		//var se_page = se_value_array[3];
		//var se_lang = se_value_array[4];
		//var se_locale = se_value_array[5];

    if ( (typeof se_domain !== "undefined") && (jQuery.trim(se_domain).length > 0) ) {
    
      var regex = new RegExp("^https?\:\/\/[a-z0-9\.\-]*" + this.regexEscape(se_domain,'/') + '.*[&\?]' + se_key + '\=([^&]+)','i');
      if(referrer.match(regex)){
        retval = se_name;
        break;
      } else if (referrer.match(se_domain)) {
        retval = se_name;
      }
    
    }
	}
	return retval;
};

cookieHandler.prototype.regexEscape = function(str, delimiter){
	return (str+'').replace(new RegExp('[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\'+(delimiter || '')+'-]', 'g'), '\\$&');
}

/* Class: replace */

function replace(cookieHandler){
	this.rules = new Array();
	this.elements = new Array();
	this.cookieHandler = cookieHandler;
};

replace.prototype.addRule = function(searchTerm, replaceTerm, seName){
	this.rules.push(new Array(searchTerm, replaceTerm, seName));
};

replace.prototype.setElements = function(elements){
	this.elements = elements;
};


/*
Called onLoad
*/
replace.prototype.execute = function(){
	var parent = this;
	jQuery(this.elements).each(function(index){
		domElementReplacement = jQuery(this).html();
		for(var x = 0; x < parent.rules.length; x++){
			if(parent.cookieHandler.referrer == parent.rules[x][2] || parent.rules[x][2] == "*"){
				var intIndexOfMatch = domElementReplacement.indexOf(parent.rules[x][0]);
				while(intIndexOfMatch != -1){
					domElementReplacement = domElementReplacement.replace(parent.rules[x][0],parent.rules[x][1]);
					intIndexOfMatch = domElementReplacement.indexOf(parent.rules[x][0]);
				}
			}
		}
		jQuery(this).html(domElementReplacement);
	});
};

replace.prototype.addOnLoad = function(){
	var parent = this;
	jQuery(document).ready(function(){
		parent.execute();
	});
};

/* Initialize replacement variables and add execute replacement to DOM ready state */

var cookieHandlerObj = new cookieHandler();
var replaceText = new replace(cookieHandlerObj);  // Create instance of the replace class
                                                  // to be made available to page.
replaceText.addOnLoad();
