/**
* The main class for frame versioning voodoo
* @author  John Brandle
* @version 1.3.3
*/
this.frameprocessor = function()
{
	var _parentAPI;
	var _parentWindow = window;
	
	var _childAPI;
	var _childWindow;
	
	var _dummyAPI;
	
	var _urlproxies = new Object();
	
	var _listeners = new Object();
	var READY = 'onReady';
	
	var _kfpConfig;
	var _cdnHost;
	var _cdnClientPath;
	var KFPCONFIG_XML_URI = 'xml/kfpConfig.xml';
	
	var _crossDomainSWF;
	var _crossDomainSWFReady = false;
	var _activeCrossDomainRequests = new Object();
	var CROSSDOMAIN_SWF_URI = '../assets/swfs/crossdomain.swf';
	var CROSSDOMAIN_READY = 'onCrossDomainReady';
	
	var _lsoSWF;
	var _lsoSWFReady = false;
	var LSO_SWF_URI = '../assets/swfs/lso.swf';
	var LSO_READY = 'onLSOReady';
	
	var NO_IE_HTM_URI = 'frames/NoIE6_splash_frame.html';
	var NO_FLASH_HTM_URI = 'frames/noflash_splash_frame.html';
	var REQ_FLASH_VER_MAJOR = 10;

	var DEBUG = false;
	
	function init(uri)
	{
		loadURLProxiesXML(uri);
	
		loadJS('js/adddomloadevent.js', _parentWindow);
		loadJS('js/browserdetect.js', _parentWindow);
		loadJS('js/swfobject.js', _parentWindow);
				
		if (isIE() && browserDetect.version < 7) 
		{
			loadFrame(NO_IE_HTM_URI);
			return _dummyAPI;
		}

		if (swfobject.getFlashPlayerVersion().major < REQ_FLASH_VER_MAJOR) 
		{
			loadFrame(NO_FLASH_HTM_URI);
			return _dummyAPI;
		}
				
		loadKfpConfig();
		
		loadCrossDomainSWF();
		loadLSOSWF();
		
		return _parentAPI;
	}
	
	function loadURLProxiesXML(uri)
	{	
		uri += "?=" + new Date().getTime();

		var urlproxiesXML = doHTTPRequest(uri, 'xml').getElementsByTagName('urlproxy');
		
		for (var i = 0; i < urlproxiesXML.length; i++)
		{
			var urlproxy = urlproxiesXML[i];
			_urlproxies[urlproxy.getAttribute('prop')] = urlproxy.getAttribute('value');
		}
	}
	
	function loadKfpConfig()
	{		
		_kfpConfig = doHTTPRequest(KFPCONFIG_XML_URI + "?=" + new Date().getTime(), 'xml');
		_cdnHost = getText(_kfpConfig.getElementsByTagName('cdnHost')[0]);
		_cdnClientPath = getText(_kfpConfig.getElementsByTagName('cdnClientPath')[0]);
	}
		
	function loadCrossDomainSWF()
	{
		function callback(swf) 
		{
			_crossDomainSWF = swf;
		}
	
		createSWF(CROSSDOMAIN_SWF_URI, 'crossdomain', {}, callback);
	}
	
	function loadLSOSWF()
	{
		var uri = (_cdnHost) ? ('http://' + _cdnHost + '/' + LSO_SWF_URI) : LSO_SWF_URI;
		
		function callback(swf) 
		{
			_lsoSWF = swf;
		}
		
		createSWF(uri, 'lso', {}, callback);
	}
	
	function createSWF(uri, name, params, callback)
	{
		var defaults = {width:'100', height:'100', allowscriptaccess:'always', allowNetworking:'all', wmode:'transparent', quality:'low'};
		for (var prop in defaults)
		{
			if (!params[prop])
			{
				params[prop] = defaults[prop];
			}
		}
	
		function onDomReady()
		{
			removeEventListener(READY, onDomReady);
			
			var swfContainer = _childWindow.document.createElement('div');

			var body = _childWindow.document.body;
			body.appendChild(swfContainer);

			if (!isIE())
			{
				var object = _childWindow.document.createElement('object');
				swfContainer.appendChild(object);

				var embed = _childWindow.document.createElement('embed');
				object.appendChild(embed);
				
				params['name'] = name;
				params['src'] = uri;
				for (var prop in params)
				{
					embed.setAttribute(prop, params[prop]);
				}
			
				callback(_childWindow.document[name]);
				return;
			}
			
			paramsHTML = '';
			params['movie'] = uri;
			for (var prop in params)
			{
				paramsHTML += '<param name=' + prop + ' value="' + params[prop] + '">';
			}
			
			swfContainer.innerHTML = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" width="' + params['width'] + '" height="' + params['height'] + '" id="' + name + '">' + paramsHTML + '</object>';
			
			callback(_childWindow[name]);
		}
		
		addEventListener(READY, onDomReady);
	}

	function doHTTPRequest(uri, type)  //type = "js" || "xml" || "css"
	{	
		var xmlHttpRequest;
		var mimeType = (type == 'js') ? 'text/javascript' : 'text/xml';
		mimeType = (type == 'css') ? 'text/css' : mimeType;
		
		if (_parentWindow.ActiveXObject)  //IE
		{
			xmlHttpRequest = new ActiveXObject('Microsoft.XMLHTTP');
			if (xmlHttpRequest)
			{
				xmlHttpRequest.open('GET', uri, false);
				xmlHttpRequest.setRequestHeader('Content-Type', mimeType);				
				xmlHttpRequest.send();
				
				return (type == 'xml') ? xmlHttpRequest.responseXML.childNodes[1] : xmlHttpRequest.responseText;
			}
			else 
			{
				alert('ActiveX must be enabled in your browser\'s security settings for this website to function. Please enable ActiveX, and try again.');
			}
		}
		else if (_parentWindow.XMLHttpRequest)
		{
			xmlHttpRequest = new XMLHttpRequest();
			xmlHttpRequest.open('GET', uri, false);
			xmlHttpRequest.overrideMimeType(mimeType);
			xmlHttpRequest.send(null);
			
			return (type == 'xml') ? xmlHttpRequest.responseXML.firstChild : xmlHttpRequest.responseText;
		}
		
		alert('Your browser is not supported. Please update your browser, and try again.');
		return '';
	}
	
	function doXMLRequestAndProcess(uri)
	{
		uri = processURI(uri);
	
		var xml = doHTTPRequest(uri, 'xml');
		process(xml);
				
		if (_parentWindow.ActiveXObject)  //IE
		{
			return xml.xml;
		}
		return (new XMLSerializer()).serializeToString(xml);
		
		function process(xml)
		{
			var splits = ['.flv', '.jpg', '.mp3', '.png', '.swf', '.zip'];
			
			for (var i = 0; i < xml.childNodes.length; i++)
			{
				var node = xml.childNodes[i];
			
				if (node.childNodes.length > 0)
				{
					process(node);
					continue;
				}
				
				var nodeValue = node.nodeValue;
				
				if (!nodeValue)
				{
					continue;
				}
				
				for (var j = 0; j < splits.length; j++)
				{
					var splitOn = splits[j];
					if (nodeValue.split(splitOn).length > 1)
					{
						node.nodeValue = processURI(nodeValue);
						break;
					}
				}
			}
			
			return xml;
		}
	}
	
	function doCrossDomainRequest(method, uri, vars, callback)  //method = "post" || "get"
	{
		if (!_crossDomainSWFReady)
		{
			callback(false, "crossDomainSWF not ready");
			return;
		}
	
		var data = method + "^" + uri + "^" + vars;
		var id = _crossDomainSWF.doCrossDomainRequest(data);
		
		_activeCrossDomainRequests[id] = callback;
	}
	
	function doCrossDomainRequestResponse(id, success, data)
	{
		var callback = _activeCrossDomainRequests[id];
		delete _activeCrossDomainRequests[id];

		var xmlDoc;
		if (_parentWindow.DOMParser)
		{
			var parser = new DOMParser();
			xmlDoc = parser.parseFromString(data, "text/xml");
		}
		else if (_parentWindow.ActiveXObject)  //IE
		{
			xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
			xmlDoc.async = "false";
			xmlDoc.loadXML(data); 
		}
		else 
		{
			//TODO
		}
		
		callback(success == "true", xmlDoc);
	}
	
	function getSharedObject(id)
	{
		if (!_lsoSWFReady)
		{
			return {};
		}
	
		return _lsoSWF.getSharedObject(id);
	}
	
	function setSharedObject(id, sharedObject)
	{
		if (!_lsoSWFReady)
		{
			return;
		}
		
		_lsoSWF.setSharedObject(id, sharedObject);
	}
	
	function onCrossDomainSWFReady()
	{
		if (_crossDomainSWFReady)
		{
			return;
		}
		_crossDomainSWFReady = true;

		dispatchEvent(CROSSDOMAIN_READY);
	}
	
	function onLSOSWFReady()
	{
		if (_lsoSWFReady)
		{
			return;
		}
		_lsoSWFReady = true;

		dispatchEvent(LSO_READY);
	}
	
	function loadFrame(frameURI)
	{	
		frameURI = processURI(frameURI, _parentWindow);

		if (_parentWindow.location.search)
		{
			frameURI += (frameURI.indexOf("?") == -1) ? '?' : '&';
			frameURI += _parentWindow.location.search.substring(1);
		}
		
		_parentWindow.document.write('<frameset><frame id="childframe" src="' + frameURI + '"></frame></frameset>');
		
		return _parentAPI;
	}
	
	function processPage(windowRef)
	{
		_childWindow = windowRef;
		_childWindow.processURI = processURI;  //Flash API
		_childWindow.doXMLRequestAndProcess = doXMLRequestAndProcess;  //Flash API
		_childWindow.gotoURI = gotoURI;  //Flash API
		_childWindow.onCrossDomainSWFReady = onCrossDomainSWFReady;  //Flash API
		_childWindow.onLSOSWFReady = onLSOSWFReady;  //Flash API
		_childWindow.doCrossDomainRequestResponse = doCrossDomainRequestResponse;  //Flash API
		
		function onDOMReady()
		{
			var tags = {frame:'src', img:'src', a:'href'};
			for (var prop in tags)
			{
				var value = tags[prop];
				var elements = windowRef.document.getElementsByTagName(prop);
				
				for (var i = 0; i < elements.length; i++)
				{
					var element = elements[i];
					
					var src = element.getAttribute(value);
					
					if (!src || src == "/" || src == "#")
					{
						continue;
					}
					
					doReplacement(element, prop, value, src);
				}
			}
			
			dispatchEvent(READY);
		}

		var addDOMLoadEventFunction = new addDOMLoadEvent();
		addDOMLoadEventFunction(onDOMReady, windowRef);
		
		return _childAPI;
	}
	
	function doReplacement(element, prop, value, src)
	{		
		element.setAttribute(value, processURI(src));
	}
	
	function processURI(uri, windowRef)
	{
		windowRef = (windowRef) ? windowRef : _childWindow;

		var splits = uri.split('?');
		var uri = splits[0];
		var params = '';
		if (splits.length > 1)
		{
			params = '?' + splits[1];
		}
		
		//if uri contains protocal + hostname --fix for ie compat mode
		var hostname = windowRef.location.protocol + '//' + windowRef.location.hostname;		
		var uriSplit = uri.split(hostname);	
		if (uriSplit.length > 1)
		{
			uri = ".." + uriSplit[1];
		}

		var processedURI = _urlproxies[uri];
		if (!processedURI)
		{
			if (DEBUG)
			{
				alert('uri not found in urlproxies: ' + uri);
			}
			
			processedURI = uri;
		}
		
		return processedURI + params;
	}
	
	function gotoURI(uri, windowRef)
	{
		windowRef = (windowRef) ? windowRef : _parentWindow;
		
		if (windowRef.location.search)
		{
			uri += (uri.indexOf("?") == -1) ? '?' : '&';
			uri += windowRef.location.search.substring(1);
		}
		
		windowRef.location = uri;
	}
	
	function loadJS(uri, windowRef)
	{
		windowRef = (windowRef) ? windowRef : _childWindow;
	
		uri = processURI(uri, windowRef);
		
		var js = doHTTPRequest(uri, 'js');
		
		if (windowRef.execScript)  //IE
		{
			windowRef.execScript(js);
			return;
		}

		windowRef.eval.call(windowRef, js);
	}
	
	function loadCSS(uri)
	{
		uri = processURI(uri);
		
		var cssText = doHTTPRequest(uri, 'css');
		
		var cssNode = _childWindow.document.createElement('style');
		cssNode.type = 'text/css';
		cssNode.rel = 'stylesheet';
		
		cssLines = cssText.split('\n');
		for (var j = 0; j < cssLines.length; j++)
		{
			var cssLine = cssLines[j];
			
			if (cssLine.indexOf('url(') == -1)
			{
				continue;
			}
			
			var regx = /url\(['"]([\w\.\/-]+)['"]\)+/;
			var results = cssLine.match(regx);
			
			if (!results)
			{
				if (DEBUG)
				{
					alert(cssLine);
				}
				
				continue;
			}

			cssLines[j] = cssLine.split(results[1]).join(processURI(results[1]));
		}
		cssText = cssLines.join('\n');
		
		addEventListener(READY, addCSS);
		
		function addCSS()
		{
			removeEventListener(READY, addCSS);
			
			if (isIE())
			{
				cssNode.styleSheet.cssText = cssText;
			}
			else
			{
				var textNode = document.createTextNode(cssText);
				cssNode.appendChild(textNode);
			}
			
			_childWindow.document.getElementsByTagName("head")[0].appendChild(cssNode);
		}
	}
	
	function getKfpConfig()
	{
		return _kfpConfig;
	}
	
	function addEventListener(event, listener)
	{
		if (!_listeners[event])
		{
			_listeners[event] = new Array();
		}
		
		var index = _listeners[event].indexOf(listener);
		if (index > -1)
		{
			return;
		}
		
		_listeners[event].push(listener);
	}
	
	function removeEventListener(event, listener)
	{
		if (!_listeners[event])
		{
			return;
		}

		var index = _listeners[event].indexOf(listener);
		if (index == -1)
		{
			return;
		}
		
		_listeners[event].splice(index, 1);		
		if (_listeners[event].length == 0)
		{
			delete _listeners[event];
		}
	}
	
	function dispatchEvent(event)
	{
		var listenerList = _listeners[event];
		if (!listenerList)
		{
			return;
		}
		
		listenerList = listenerList.slice();
		for (var i = 0; i < listenerList.length; i++)
		{
			var listener = listenerList[i];
			
			listener();
		}
	}

	function isIE()
	{
		return browserDetect.browser == "Explorer";
	}
	
	function browserVersion()
	{
		return browserDetect.version;
	}
	
	if (!Array.indexOf)  //IE
	{
		Array.prototype.indexOf = function(obj)
		{
			for (var i = 0; i < this.length; i++)
			{
				if (this[i] == obj)
				{
					return i;
				}
			}
			return -1;
		}
	}
	
	function getText(elem)
	{
		if (!elem)
		{
			return "";
		}

		if (elem.innerText != undefined)
		{
			return elem.innerText;
		}
		if (elem.textContent != undefined)
		{
			return elem.textContent;
		}
		
		return elem.text;
	}
	
	_childAPI = {process:processPage, processURI:processURI, loadJS:loadJS, loadCSS:loadCSS, addEventListener:addEventListener, removeEventListener:removeEventListener, READY:READY, CROSSDOMAIN_READY:CROSSDOMAIN_READY, LSO_READY:LSO_READY, parentWindow:_parentWindow, gotoURI:gotoURI, doHTTPRequest:doHTTPRequest, doCrossDomainRequest:doCrossDomainRequest, getSharedObject:getSharedObject, setSharedObject:setSharedObject, crossDomainSWFReady:_crossDomainSWFReady, lsoSWFReady:_lsoSWFReady, IE:isIE, browserVersion:browserVersion, getKfpConfig:getKfpConfig};
	_parentAPI = {init:init, loadFrame:loadFrame, childAPI:_childAPI};
	_dummyAPI = {loadFrame:function(arg1){}};
	
	return _parentAPI;
}();
