// $Revision: 13291 $ $Date: 2011-08-02 15:03:29 -0300 (Tue, 02 Aug 2011) $
var LumisPortal = new LumisPortal();
document.onkeydown = LumisPortal.onKeyDown;

function LumisPortal()
{
	this.onKeyDown = onKeyDown;
	this.onRefresh = onRefresh;
	this.onSubmitForm = onSubmitForm;
	this.onPrint = onPrint;
	this.getCookie = getCookie;
	this.addMessage = addMessage;
	this.onBodyLoad = onBodyLoad;
	this.checkForMessages = checkForMessages;
	this.gotoPage = gotoPage;
	this.htmlEncode = htmlEncode;
	this.mainName = "main.jsp";
	this.pageParameterChannelIdName = "lumChannelId";
	this.pageParameterPageIdName = "lumPageId";
	this.isSubmitting = false;
	this.renderInterfaceInstance = renderInterfaceInstance;
	this.getXmlHttpObject = getXmlHttpObject;
	this.lumisEncodeURIComponent = lumisEncodeURIComponent;
	this.bindReady = bindReady;
	this.openMode = openMode;
	this.openPerspective = openPerspective;
	bindReady(onBodyLoad, LumisPortal);
	
	if(window.addEventListener)
	{
		try
		{
			window.addEventListener("pageshow", onPageShow, false);
		}
		catch(e)
		{
			;
		}
	}
	
	function bindReady(func, thisArg)
	{
		var done = false;
		var f = function()
		{
			if (!done)
			{
				if(!(document.body))
				{
					setTimeout(arguments.callee, 10);
					return;
				}
				else
				{
					done = true;
					func.call(thisArg);
				}
			}
		}
		
		if(document.addEventListener)
		{
			document.addEventListener("DOMContentLoaded", function()
			{
				if (window.opera)
				{
					for (var i = 0; i < document.styleSheets.length; i++)
					{
						if (document.styleSheets[i].disabled)
						{
							setTimeout(arguments.callee, 10);
							return;
						}
					}
				}
				f();
			}, false);
		}
		else if (/msie/i.test(navigator.userAgent)) // IE
		{
			(function() 
			{
				try
				{
					document.documentElement.doScroll("left");
				}
				catch (e)
				{
					setTimeout(arguments.callee, 10);
					return;
				}
				f();
			})();
		}
		else if (/webkit/i.test(navigator.userAgent))
		{
			(function() 
			{
				if (/loaded|complete/i.test(document.readyState) === false)
				{
					setTimeout(arguments.callee, 10);
					return;
				}
				f();
			})();
		}
		else
		{
			var oldonload = window.onload;
			window.onload = function()
			{
				if (oldonload && typeof window.onload == 'function')
					oldonload();
				f();
			}
		}
	}
				
	function onPageShow()
	{
		this.isSubmitting = false;
	}
	
	function gotoPage(lumPageId, lumChannelId)
	{
		var url = this.mainName;
		if(lumPageId != null)
			url += "?"+this.pageParameterPageIdName+"="+lumPageId;
		if(lumChannelId != null)
		{
			if(lumPageId == null)
				url += "?";
			else
				url += "&";
			url += this.pageParameterChannelIdName+"="+lumChannelId;
		}
		
		window.location.href = url;
	}

	function onKeyDown(event)
	{
		if(this.isSubmitting)
			return;
		
		if(!event)
			event = window.event;
		
		if(event)
		{
			if(event.keyCode == 123)
			{
				if(event.ctrlKey)
				{
					document.forms["LumisPortalForm"].elements["lumPerspective"].value = g_LumisAdminPerspective;
					document.forms["LumisPortalForm"].elements["lumSafeRenderMode"].value = g_LumisAdminPerspective;
					document.forms["LumisPortalForm"].submit();
					this.isSubmitting = true;
					return;
				}
	
				var lastMode = LumisPortal.getCookie("lumLastMode");
				var lastPerspective = LumisPortal.getCookie("lumLastPerspective");	

				if (g_LumisDisplayPerspective != g_LumisUserPerspective)
				{
					document.forms["LumisPortalForm"].elements["lumPerspective"].value = g_LumisUserPerspective;
				}
				else if (lastMode != null && g_LumisDisplayPerspective != lastPerspective)
				{
					document.forms["LumisPortalForm"].elements["lumMode"].value = lastMode;
				}
				else
				{
					document.forms["LumisPortalForm"].elements["lumPerspective"].value = g_LumisAdminPerspective;
				}
				
				document.forms["LumisPortalForm"].action = document.forms["LumisPortalForm"].elements["pageOriginalUrl"].value;
				document.forms["LumisPortalForm"].submit();
				this.isSubmitting = true;
			}
		}
	}
	
	function openMode(newMode)
	{
		var lumMode = LumisPortal.getCookie("lumMode");
		if(lumMode == newMode)
			return;
		document.forms["LumisPortalForm"].elements["lumMode"].value = newMode;
		document.forms["LumisPortalForm"].action = document.forms["LumisPortalForm"].elements["pageOriginalUrl"].value;
		document.forms["LumisPortalForm"].submit();
		this.isSubmitting = true;
	}
	
	function openPerspective(newPerspective)
	{
		document.forms["LumisPortalForm"].elements["lumPerspective"].value = newPerspective;
		document.forms["LumisPortalForm"].action = document.forms["LumisPortalForm"].elements["pageOriginalUrl"].value;
		document.forms["LumisPortalForm"].submit();
		this.isSubmitting = true;
	}
	
	function onRefresh()
	{
		if(this.isSubmitting)
			return;

		if (g_LumisIsHtmlCache)
		{
			this.isSubmitting = true;
			document.location.reload();
		}
		else
		{
			var perspective = g_LumisDisplayPerspective;
			if(perspective == undefined || perspective == null)
				perspective = getCookie("lumPerspective");
			if("1"==perspective || "2"==perspective)
				document.forms["LumisPortalForm"].action = document.forms["LumisPortalForm"].elements["pageOriginalUrl"].value;
				
			document.forms["LumisPortalForm"].submit();
			this.isSubmitting = true;
		}
	}
	
	function onPrint(bUseNewWindow)
	{
		if(this.isSubmitting)
			return;

		if(bUseNewWindow)
		{
			var strFormTarget = document.forms['LumisPortalForm'].target;
			
			document.forms['LumisPortalForm'].target = "_blank";
			document.forms['LumisPortalForm'].elements['lumPrinting'].value = '1';
			document.forms["LumisPortalForm"].submit();
			
			document.forms['LumisPortalForm'].target = strFormTarget;
			document.forms['LumisPortalForm'].elements['lumPrinting'].value = '0';
		}
		else
		{
			document.forms['LumisPortalForm'].elements['lumPrinting'].value = '1';
			document.forms["LumisPortalForm"].submit();
			
			this.isSubmitting = true;
		}	
	}
	
	function onSubmitForm(formName, destId, destType, bProcessAction, includeAnchor, updateElementId)
	{
		if(this.isSubmitting)
			return;

		var pForm = document.forms[formName];
		if((!formHasFileInputs(pForm) && !isFormWSRPAction(pForm)) || (updateElementId != null))
		{
			if(destType == null)
				destType = "lumII";
			
			var parameters = "<parameters destId=\""+destId+"\" destType=\""+destType+"\">";
			parameters += getFormParameters(formName);
			parameters += "</parameters>";
	
			var portalForm = document.forms["LumisPortalForm"];
			
			portalForm.elements["lumNewParams"].value = parameters;
			
			var originalPortalFormAction = portalForm.action;
			if(destId != null)
			{
				var destTypeElem = portalForm.elements[destType];
				if(destTypeElem != null)
					destTypeElem.value = destId;
			}
			
			if(includeAnchor != undefined)
				portalForm.action += "#" + includeAnchor;
			
			if(bProcessAction)
			{
				portalForm.elements["lumA"].value = "1";
			}
			else
			{
				if(pForm && pForm.action)
				{
					var strFormAction = pForm.action;
					
					if(updateElementId != null)
					{
						var containerElement = document.getElementById(updateElementId);
						if(containerElement)
						{
							renderInterfaceInstance(containerElement, destId, true);
							portalForm.elements["lumNewParams"].value = "";
							portalForm.action = originalPortalFormAction;
							return;
						}
					}
					else
					{
						var clientRenderedElem = pForm.elements["lumClientRendered"];
						if(clientRenderedElem != null && clientRenderedElem.value == 1)
						{
							var interfaceDiv = document.getElementById("lumIId"+destId);
							if(interfaceDiv)
							{
								renderInterfaceInstance(interfaceDiv, destId);
								portalForm.elements["lumNewParams"].value = "";
								portalForm.action = originalPortalFormAction;
								return;
							}
						}
					}
				}
			}
			
			this.isSubmitting = true;
			portalForm.submit();
		}
		else
		{
			try
			{
				if(bProcessAction)
				{
					if(pForm.elements["lumA"] != null)
						pForm.elements["lumA"].value="1";
				}
				this.isSubmitting = true;
				pForm.submit();
			}
			catch(e)
			{
				if (lumis_doui_control_fileupload_FileUploadControl_msgFileNotFound)
					alert(lumis_doui_control_fileupload_FileUploadControl_msgFileNotFound);
				else
					alert(e.message);
				this.isSubmitting = false;
				return;
			}
		}
	}
	
	function formHasFileInputs(pForm)
	{
		for(var i=0; i<pForm.elements.length; i++)
		{
			pElement = pForm.elements[i];
			if(pElement.type == "file")
				return true;
		}
		
		return false;
	}

	function isFormWSRPAction(pForm)
	{
		return pForm.action && pForm.action.indexOf('&lwsUT=') != -1;
	}

	function getFormParameters(formName)
	{
		var strFormParams = "";
		var pForm = document.forms[formName];
		var pElement;
		
		var strFormAction = pForm.action;
		if(strFormAction && strFormAction.length)
			strFormParams += '<p n="lumFormAction">' + htmlEncode(strFormAction) + '</p>';

		for(var i=0; i<pForm.elements.length; i++)
		{
			pElement = pForm.elements[i];
			
			if(!pElement.type || !pElement.name || !pElement.name.length)
				continue;
			if(pElement.type == "button" || pElement.type == "submit")
				continue;
			else if(pElement.type == "select-one" && pElement.selectedIndex != -1)
			{
				var strValue = pElement.options[pElement.selectedIndex].value;
				if(strValue.length)
					strFormParams += '<p n="'+pElement.name+'">' + htmlEncode(strValue) + '</p>';
			}
			else if(pElement.type == "select-multiple")
			{
				var strValue = "";
				for(var j=0; j<pElement.options.length; j++)
				{
					var strValue = pElement.options[j].value;
					if(pElement.options[j].selected && strValue.length)
						strFormParams += '<p n="'+pElement.name+'">' + htmlEncode(strValue) + '</p>';
				}
			}
			else
			{
				if((pElement.type == "checkbox" || pElement.type == "radio") && !pElement.checked)
					continue;
				
				var strValue = pElement.value;
				
				if(strValue.length)
					strFormParams += '<p n="'+pElement.name+'">' + htmlEncode(strValue) + '</p>';
			}
		}

		return strFormParams;
	}

	function getCookie(sName)
	{
		// cookies are separated by semicolons
		var aCookie = document.cookie.split("; ");
		for (var i=0; i < aCookie.length; i++)
		{
			// a name/value pair (a crumb) is separated by an equal sign
			var aCrumb = aCookie[i].split("=");
			if (sName == aCrumb[0]) 
			{
				var strToDecode = aCrumb[1];
				
				// replace '+' by space, because javascript decoding miss it
				strToDecode = strToDecode.replace(/\+/g, ' ');
				
				if (decodeURIComponent)
					return decodeURIComponent(strToDecode);
				else
					return unescape(strToDecode); // fallback for old browsers. May not display unicode correctly.
			}
		}

		// a cookie with the requested name does not exist
		return null;
	}
	
	function addMessage(message)
	{
		var pMsg = document.forms['LumisPortalForm'].elements['LumisClientMessage'];
		
		if (pMsg.value != '')
			pMsg.value += "\n";
		pMsg.value += message;
	}
	
	function onBodyLoad()
	{
		// clear any parameters set by doing a [back] in browser
		var portalForm = document.forms["LumisPortalForm"];
		portalForm.elements["lumNewParams"].value = "";
		portalForm.elements["lumA"].value = "";
			
		checkForMessages();
	}
	
	function checkForMessages()
	{
		var strClientMessage = document.forms["LumisPortalForm"].elements["LumisClientMessage"].value;
		if (strClientMessage != "") 
			window.setTimeout(showMessages, 1);
	}
	
	function showMessages()
	{
		var strClientMessage = document.forms["LumisPortalForm"].elements["LumisClientMessage"].value;
		if (strClientMessage != "") 
		{ 
			alert(strClientMessage);
			document.forms["LumisPortalForm"].elements["LumisClientMessage"].value = "";
		}
	}

	function htmlEncode(text)
	{
		if ( typeof( text ) != "string" )
			text = text.toString() ;
	
		text = text.replace(/&/g, "&amp;") ;
		text = text.replace(/"/g, "&quot;") ;
		text = text.replace(/</g, "&lt;") ;
		text = text.replace(/>/g, "&gt;") ;
		text = text.replace(/'/g, "&#39;") ;
	
		return text ;
	}
	
	var htmlSer = (function()
	{
		var div = document.createElement('div');
		div.style.display = "none";
		div.innerHTML = "   <link/>";
		return !!div.getElementsByTagName("link").length; 
	})();
	function renderInterfaceInstance(interfaceInstanceElement, interfaceInstanceId, updatingControl)
	{
		if(updatingControl != true && interfaceInstanceElement.innerHTML.length > 0)
		{
	    	var loadingDivBg = document.createElement('div');
	    	loadingDivBg.style.position = "absolute";
	    	loadingDivBg.style.width = (interfaceInstanceElement.offsetWidth)+"px";
	    	loadingDivBg.style.height = (interfaceInstanceElement.offsetHeight)+"px";
	    	loadingDivBg.style.overflow = "hidden";
	    	loadingDivBg.style.zIndex = "1001";
	    	loadingDivBg.className = "cLumClientRenderWaitBox";
	    	
	    	var loadingDiv = document.createElement('div');
	    	loadingDiv.style.position = "absolute";
	    	loadingDiv.style.width = (interfaceInstanceElement.offsetWidth)+"px";
	    	loadingDiv.style.height = (interfaceInstanceElement.offsetHeight)+"px";
	    	loadingDiv.style.overflow = "hidden";
	    	loadingDiv.style.zIndex = "1002";
	    	loadingDiv.className = "cLumClientRenderWaitMessage";
	    	loadingDiv.innerHTML = g_LumisLoadingHtmlMessage;

			if(interfaceInstanceElement.childNodes.length > 0)
				interfaceInstanceElement.insertBefore(loadingDivBg, interfaceInstanceElement.childNodes[0]);
			else
				interfaceInstanceElement.appendChild(loadingDivBg);

			interfaceInstanceElement.insertBefore(loadingDiv, interfaceInstanceElement.childNodes[0]);
		}
		else if(updatingControl != true)
		{
			interfaceInstanceElement.innerHTML = g_LumisLoadingHtmlMessage;
		}
		
		var xmlHttp = getXmlHttpObject();
		
		function handleRenderResponse()
		{
			if ( xmlHttp.readyState == 4 )
			{
				replaceInnerHTML(interfaceInstanceElement, xmlHttp.responseText);
				xmlHttp = null;
			}
			
			function replaceInnerHTML(element, html)
			{
				while (element.firstChild)
					element.removeChild(element.firstChild);
				
				var doc = element.ownerDocument || document;
				var frag = doc.createDocumentFragment();
				var scripts = [];
				extract(html, doc, frag, scripts);
				
				var first;
				if (frag.childNodes.length === 1)
					first = frag = frag.firstChild;
				else
					first = frag.firstChild;

				if (first)
					element.appendChild(frag);

				if (scripts.length)
					for (var i = 0; scripts[i]; i++)
						evalScript(scripts[i]);

				return element;
				
				function extract(html, doc, frag, scripts)
				{
					var elems = [];
					if (html)
					{
						var div = doc.createElement("div");
						if (!htmlSer)
						{
							div.innerHTML = 'div<div>' + html + '</div>';
							div = div.lastChild;
						}
						else
							div.innerHTML = html;

						var elem = div.childNodes;
						if (elem.nodeType)
							elems.push(elem);
						else
							elems = merge(elems, elem);
					}

					for ( var i = 0; elems[i]; i++ )
					{
						if (scripts && (elems[i].tagName || "").toLowerCase() === "script" && (!elems[i].type || elems[i].type.toLowerCase() === "text/javascript"))
						{
							scripts.push(elems[i].parentNode ? elems[i].parentNode.removeChild(elems[i]) : elems[i]);
						}
						else
						{
							if (elems[i].nodeType === 1)
							{
								var retScripts = merge([], elems[i].getElementsByTagName("script"));
								elems.splice.apply(elems, [i+1, 0].concat(retScripts));
							}
							frag.appendChild(elems[i]);
						}
					}
					
					function merge(first, second)
					{
						var i = first.length;
						for (var j=0; j<second.length; j++)
							first[i++] = second[j];
						first.length = i;
						return first;
					}		
				}	
				
				function evalScript(elem)
				{
					var data = elem.text || elem.textContent || elem.innerHTML || "";
					if (data || elem.src)
					{
						var script = document.createElement("script");
						script.type = "text/javascript";
						script.text = data;
						if (elem.src)
							script.src = elem.src;

						var head = document.getElementsByTagName("head")[0] || document.documentElement;
						head.insertBefore(script, head.firstChild);
						head.removeChild(script);
					}

					if (elem.parentNode)
						elem.parentNode.removeChild(elem);
				}
			}
		}
		
		// get the interface content and render it
		var strRequest = "lumPrevParams="+lumisEncodeURIComponent(document.forms["LumisPortalForm"].elements["lumPrevParams"].value);
		strRequest += "&lumNewParams="+lumisEncodeURIComponent(document.forms["LumisPortalForm"].elements["lumNewParams"].value);
		strRequest += "&lumReferer="+lumisEncodeURIComponent(document.location.href);
		xmlHttp.open("POST", document.forms["LumisPortalRenderInterfaceForm"].action+"&lumScript=1&lumRenderII="+interfaceInstanceId, true);
		xmlHttp.onreadystatechange = handleRenderResponse;
		xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		xmlHttp.send(strRequest);
	}
	
	function getXmlHttpObject()
	{
		var httpObj = null;
		
		if (window.XMLHttpRequest)
			httpObj=new XMLHttpRequest();
		else
			httpObj=new ActiveXObject("Microsoft.XMLHTTP");
			
		return httpObj;
	}
	
	function lumisEncodeURIComponent(str)
	{
		if (encodeURIComponent)
			return encodeURIComponent(str);
		else
			return escape(str);
	}
}

