// Copyright 2007 FreeWheel Media Inc.
var fwLib = {
	version:1.0,
	loadComplete:false,
	currentSwapIndex:0,
	knownSlots: [],
	fwJSLibsLoaded:function() 
	{
		return true;
	},
	flIntegration: {
		testFn:function()
		{	
			alert("FL Integration");
		},	       
		getElementsByClass:function(startNode, tagFilter, classFilter)
		{
			var arrElms = (tagFilter == "*" && startNode.all) ? startNode.all : startNode.getElementsByTagName(tagFilter);
			var arrRetElms = new Array();
			var arrRegExpClassNames = new Array();
			if(typeof classFilter == "object")
			{
				for(var i=0; i<classFilter.length; i++)
				{
					arrRegExpClassNames.push(new RegExp("(^|\\s)" + classFilter[i].replace(/\-/g, "\\-") + "(\\s|$)"));
				}
			}
			else
			{
				arrRegExpClassNames.push(new RegExp("(^|\\s)" + classFilter.replace(/\-/g, "\\-") + "(\\s|$)"));
			}
			var element;
			var matchesAll;
			for(var j=0; j<arrElms.length; j++)
			{
				element = arrElms[j];
				matchesAll = true;
				for(var k=0; k<arrRegExpClassNames.length; k++)
				{
					if(!arrRegExpClassNames[k].test(element.className))
					{
						matchesAll = false;
						break;
					}
				}
				if(matchesAll)
				{
					arrRetElms.push(element);
				}
			} 
			return arrRetElms;
		},
		findPageSlots:function()
		{
			fwLib.knownSlots = [];
			var ret = new Array();
			var id = "";
			var dup = false;
			for(var s=0; s < window.frames.length; s++)
			{
				try
				{
					var spans = this.getElementsByClass(window.frames[s].document, "span", "_fwph");
					for(var l = 0; l < spans.length; l++)
					{
						id = spans[l].getAttribute("id");
						var input = window.frames[s].document.getElementById("_fw_input_" + id);
						if (input && !this.isDuplicate(id))
		                {
		                    ret.push(id);
						    ret.push(input.getAttribute("value"));
							fwLib.knownSlots.push({scope:"window.frames["+s+"].document", id:id});
		                }
						dup = false;
					}
				}
				catch(e){}
			}
			try{
				var arr2 = this.getElementsByClass(parent.document, "span", "_fwph");
				for(var x=0; x < arr2.length; ++x)
				{
					id = arr2[x].getAttribute("id");
					var input = parent.document.getElementById("_fw_input_" + id);
					if(input && !this.isDuplicate(id))
					{
						ret.push(id);
						ret.push(input.getAttribute("value"));
						fwLib.knownSlots.push({scope:"parent.document", id:id});
					}
					dup = false;
				}
			} catch(e){}
			var arr = this.getElementsByClass(document, "span", "_fwph");
			for(var i=0; i < arr.length; ++i)
			{
				id = arr[i].getAttribute("id");
				var input = document.getElementById("_fw_input_" + id);
				if (input && !this.isDuplicate(id))
                {
                	ret.push(id);
				    ret.push(input.getAttribute("value"));
					fwLib.knownSlots.push({scope:"document", id:id});
                }
				dup = false;
			}
			return ret;
		},
		getScope:function(safeId){
			if (document.getElementById(safeId))
			{
			  document.scopeName = 'document';
				return document;
			}
			if (parent.document.getElementById(safeId))
			{
				parent.document.scopeName = 'parent.document';
				return parent.document;
			}
			var scope;
			for (var k = 0; k < window.frames.length; ++k)
			{
			  if (window.frames[k].document.getElementById(safeId))
				{
				  scope = window.frames[k].document;
					scope.scopeName = 'window.frames[' + k + '].document';
					break;
				}
			}
		  return scope;
    },
		isDuplicate:function(id){
			for(var j=0; j<fwLib.knownSlots.length; j++)
			{
				if(fwLib.knownSlots[j].id == id)
				{
					return true;
				}
			}
			return false;
		},
		savedSlots: [],
		replacePageSlotInnerHtml:function(innerHTML, safeId, saveOrigin) {
			setTimeout(function(){ fwLib.flIntegration._replacePageSlotInnerHtml(innerHTML, safeId, saveOrigin); }, 0);
			return true;
		},
		_replacePageSlotInnerHtml:function(innerHTML, safeId, saveOrigin)
		{
			var scope = fwLib.flIntegration.getScope(safeId);
			var fw_re = "var fw_scope = document;";
			var correctString = "var fw_scope = " + scope.scopeName + ";";
			var fw_code = innerHTML.replace(fw_re, correctString);
			var parentContainer = scope.getElementById(safeId);
			var originalContainer = scope.getElementById("_fw_container_" + safeId);
			var adContainer = scope.createElement('span');
			
			var isIE = navigator.appVersion.match(/\bMSIE\b/);
			//if (originalContainer.hasAttributes()) { //FIXME IE<=6 has no hasAttributes, assume true
			
			// remove slots created over the original ad already
			if(scope.getElementById("_fw_container_" + safeId + "_new_" + fwLib.currentSwapIndex))
			{
				this.restorePageSlot(safeId);
			}
			
			var newSpanId = "_fw_container_" + safeId;
			if (saveOrigin) newSpanId += "_new_" + fwLib.currentSwapIndex;
			
			var attrs = originalContainer.attributes;
			for(var i=0; i<attrs.length; i++) {
				var name = attrs[i].name || attrs[i].nodeName;
				var value = attrs[i].value || attrs[i].nodeValue;
				if ( isIE && (!name || value === 'null' || value === 'false' || !value) ) continue;
				if ( name == "id") value = newSpanId;
				adContainer.setAttribute(name, value);
			}
			if (isIE) { //XXX IE treat style separately
				for (var i in originalContainer.style) {
					try {
						if (i=='content') continue; //XXX workaround IE8b1 crash
						adContainer.style[i] = originalContainer.style[i];
					} catch (e) {
					}
				}
			}
			if (saveOrigin){
				originalContainer.style.display = "none";
				parentContainer.appendChild( adContainer );
			}
			else {
				originalContainer.parentNode.replaceChild(adContainer, originalContainer);
			}

			adContainer.innerHTML = fw_code;
			var scripts = adContainer.getElementsByTagName('script');
			var head = scope.getElementsByTagName("head")[0];
			for (var i=0;i<scripts.length;i++) {
				var script = scripts[i];
				if (script.src) {
					var script2 = scope.createElement("script");
					if (script.charset) script2.charset = script.charset;
					script2.src = script.src;
					script2.onload = script2.onreadystatechange = function(){ 
						if (!this.readyState || this.readyState == "loaded" || this.readyState == "complete") {
							head.removeChild( script2 );
						}
					};
					head.appendChild(script2);
				} else {
					eval(script.innerHTML);
				}
			}
		},
		restorePageSlot:function(safeId) {
			var scope = fwLib.flIntegration.getScope(safeId);
			if(!scope.getElementById("_fw_container_" + safeId + "_new_" + fwLib.currentSwapIndex)) 
				return false;
			var adContainer = scope.getElementById("_fw_container_" + safeId + "_new_" + fwLib.currentSwapIndex);
			scope.getElementById(safeId).removeChild( adContainer );
			
			var originalContainer = scope.getElementById("_fw_container_" + safeId);
			originalContainer.style.display = "inline";
			return true;
		},
		clearSavedPageSlots:function() { //TODO: should call this when document.unload at least in IE<=6, or there'll be leak
			for (var safeId in fwLib.flIntegration.savedSlots) {
				fwLib.flIntegration.savedSlots[safeId] = null;
			}
		},
		isPageLoaded:function()
		{
			return fwLib.loadComplete;
		},
		onLoadComplete:function()
		{
			fwLib.loadComplete = true;
		},
		addLoadEvent:function(func) 
		{
			var oldonload = window.onload;
			if (typeof window.onload != 'function') 
			{
				window.onload = func;
			}
			else 
			{
				window.onload = function() 
				{
					if (oldonload) {
						oldonload();
					}
					func();
				}
			}
		}
	}
}
fwLib.flIntegration.addLoadEvent(fwLib.flIntegration.onLoadComplete);

