/*
Document Write Override v0.6
Written by Ara Pehlivanian (http://arapehlivanian.com)

This work is licensed under a Creative Commons Licence
http://creativecommons.org/licenses/by-nd/2.5/
*/

var DocumentWriteOverride = {
	Signatures : [
		["dw_one", "<style><!-- @import url(http://www.makepovertyhistory.org", ""],
		["dw_technorati","<p id=\"te_l\"", ""],
		["dw_feedburner","<div class=\"feedburner", ""],
		["dw_adsense","<iframe name=\"google_ads_frame\"", ""],
		["dw_measuremap","<script type='text/javascript' src='http://tracker.measuremap.com", ""]
	],
	
	Stack : [],
	
	Store : function(str){
		DocumentWriteOverride.Stack[DocumentWriteOverride.Stack.length] = str;
	},
	
	Show : function(){
		var signatures = DocumentWriteOverride.Signatures;
		var stack = DocumentWriteOverride.Stack;
		var scripts = document.documentElement.getElementsByTagName("body")[0].getElementsByTagName("script");
		var pointer = -1;
		for(var i=0; i<stack.length; i++){
			for(var j=0; j<signatures.length; j++){
				if(stack[i].toString().indexOf(signatures[j][1]) != -1) pointer=j;
			}
			signatures[pointer][2] += stack[i];
		}		
		
		for(var i=0; i<signatures.length; i++){
			var node = document.getElementById(signatures[i][0]);
			if(typeof node != "undefined"){
				var str = DocumentWriteOverride.Cleaner.Clean(signatures[i][2].toString());
				if(str.indexOf("<script") != -1){
					var parentNodeRef = node.parentNode; //referencing the parent node directly causes the script to bomb
					parentNodeRef.innerHTML += str.substring(0, str.indexOf("<script"));
					DocumentWriteOverride.AddScript(parentNodeRef, str.substring(str.indexOf("<script"), str.indexOf("</script")+9));
					parentNodeRef.innerHTML += str.substring(str.indexOf("</script")+9, str.length);
				}else if(str.length > 0){
					var span = document.createElement("span");
						span.innerHTML = str;
					node.parentNode.insertBefore(span, node.nextSibling);
					//node.parentNode.innerHTML += str;
				}
			}
		}
	},
	
	AddScript : function(parentNodeRef, fragment){
		var delimiter = fragment.substr(fragment.indexOf("src=") + 4, 1);
		var start = fragment.indexOf("src=") + 5;
		var character = fragment.substr(start, 0);
		var src = "";
		while(character != delimiter){
			src += character;
			character = fragment.substr(start++, 1);
		}
		var script = document.createElement("script");
		script.type = "text/javascript";
		script.src = src;
		parentNodeRef.appendChild(script);
	},
	
	Cleaner : {
		Clean : function(str){
			var tmpStr = str;
			
			tmpStr = this.ReplaceAll(tmpStr, "&#187 ", "&#187; ");			// Technorati fix
			tmpStr = this.ReplaceAll(tmpStr, "&#8230<", "&#8230;<");		// FeedBurner fix
			tmpStr = this.ReplaceAll(tmpStr, "&repeat=", "&amp;repeat=");	// MeasureMap fix
			tmpStr = this.ReplaceAll(tmpStr, "&x=", "&amp;x=");				// MeasureMap fix
			tmpStr = this.ReplaceAll(tmpStr, "&dt=", "&amp;dt=");			// Google AdSense fix
			tmpStr = this.ReplaceAll(tmpStr, "&lmt=", "&amp;lmt=");			// Google AdSense fix
			tmpStr = this.ReplaceAll(tmpStr, "&format=", "&amp;format=");	// Google AdSense fix
			tmpStr = this.ReplaceAll(tmpStr, "&output=", "&amp;output=");	// Google AdSense fix
			tmpStr = this.ReplaceAll(tmpStr, "&url=", "&amp;url=");			// Google AdSense fix
			tmpStr = this.ReplaceAll(tmpStr, "&color", "&amp;color");		// Google AdSense fix
			tmpStr = this.ReplaceAll(tmpStr, "&ad_type=", "&amp;ad_type=");	// Google AdSense fix
			tmpStr = this.ReplaceAll(tmpStr, "&u_", "&amp;u_");				// Google AdSense fix
			tmpStr = this.ReplaceAll(tmpStr, "&ref", "&amp;ref");			// Google AdSense fix
			tmpStr = this.ReplaceAll(tmpStr, " usemap=\"#OneLinkMapSmallRight\">", " usemap=\"#OneLinkMapSmallRight\" />"); // One.org fix
			tmpStr = this.ReplaceAll(tmpStr, "http://www.one.org/\" target=\"_blank\">", "http://www.one.org/\" target=\"_blank\" />"); // One.org fix
			tmpStr = this.ReplaceAll(tmpStr, "<style>", "<style type=\"text/css\">"); // One.org fix
			return tmpStr
		},
		
		ReplaceAll : function(str, from, to){								// Hat tip to Mark for this algo (http://www.experts-exchange.com/M_1235249.html)
			var idx = str.indexOf(from);
			while(idx > -1){
				str = str.replace(from, to);
				idx = str.indexOf(from);
			}
			return str
		}
	}	
}
document.write = DocumentWriteOverride.Store;