// ***************************************************
// Static XML providers for error and loading 
// ***************************************************
	
	if(!loadingMsg) loadinMsg = "";
	if(!closingMsg) closingMsg = "";
	
 	// XML provider for loading screen
	var loadingXML = '<?xml version="1.0" ?><winOverlay><winInfo><winWidth>200</winWidth><winHeight>100</winHeight></winInfo><winContent><![CDATA[';
	var loadingXML = loadingXML + '<table align="center" style="padding:0px; margin:0px; border:none;" cellpadding="0" cellspacing="0"><tr style="padding:0px; margin:0px; border:none;"><td style="padding:0px; margin:0px; border:none;">';
	var loadingXML = loadingXML + '<div id="page_overlay_content">' + loadingMsg + '</div>';
	var loadingXML = loadingXML + '</td></tr></table>]]>';
	var loadingXML = loadingXML + '</winContent></winOverlay>';
	
	// XML Provider for Error screen
	var closingXML = '<?xml version="1.0" ?><winOverlay><winInfo><winWidth>200</winWidth><winHeight>100</winHeight></winInfo><winContent><![CDATA[';
	var closingXML = closingXML + '<table align="center" style="padding:0px; margin:0px; border:none;" cellpadding="0" cellspacing="0"><tr style="padding:0px; margin:0px; border:none;"><td style="padding:0px; margin:0px; border:none;">';
	var closingXML = closingXML + '<div id="page_overlay_content">' + closingMsg + '</div>';
	var closingXML = closingXML + '</td></tr></table>]]>';
	var closingXML = closingXML + '</winContent></winOverlay>';
	
	// Serialize Strings into XML objects
	if (window.ActiveXObject){
	  var closingXMLObject = new ActiveXObject("Microsoft.XMLDOM");
	  closingXMLObject.async="false";
	  closingXMLObject.loadXML(closingXML);
	  
	  var loadingXMLObject = new ActiveXObject("Microsoft.XMLDOM");
	  loadingXMLObject.async="false";
	  loadingXMLObject.loadXML(loadingXML);
	} else {
	  var parser = new DOMParser();
	  var loadingXMLObject = parser.parseFromString(loadingXML,"text/xml");
	  var closingXMLObject = parser.parseFromString(closingXML,"text/xml");
	}

	
// ***************************************************
// Operational functions
// ***************************************************

	// Mother Function, launched from links, forms ...
	function loadHTMLinOverlay(provider,param) {
		//Show the loading message
		coverUp();
		//addOverlay("loading");
		
		function onSuccess( request ) {
			if( request.status != 200 ) {
				addOverlay("error");
				return;
			} else {
				addOverlay(request);
				return;
			}
			
		}
		
		// prevent provider caching
		var start = new Date();
		provider = provider + ((provider.indexOf("?") == -1) ? "?" : "&") + "nc=" + start.getTime();
		
		// send AJAX request, get HTML provider, this require prototype.js
		var req = new Ajax.Request(
			provider,
			{
				method: 'post',
				onComplete: onSuccess,
				parameters: param
			}
		);
	}
	
	
	// Master function launched after AJAX request is successful
	function addOverlay(c){
		
		coverUp();
		
		// Create a new div (replacing the current one if necessary)
		var divIdName = "page_overlay";
		var newdiv = ($(divIdName)) ? $(divIdName) : document.createElement('div');
		newdiv.setAttribute("id",divIdName);
		var XMLElement = null;
		
		// switching between XML providers, eith the oneobtain through AJAX, or one of the local vars
		if(typeof(c) == "object"){
			XMLElement = c.responseXML;
		}
		else if(c == "loading"){
			XMLElement = loadingXMLObject;
		} 
		else if(c == "error"){
			XMLElement = errorXMLObject;
		}
		else if(c == "closing"){
			XMLElement = closingXMLObject;
		}
	
		// load HTML in DIV
		//theHTML = "<div style='text-align:right; margin: 0px; padding-bottom: 10px; padding-top:0px padding-left-0px; padding-right:0px; height:20px;'>" +
		//"<a href=\"javascript:removeOverlay();\"><img src='/mercury/unifiedLogin/images/close.jpg' border='0' align='right'></a></div>" +
		theHTML = XMLElement.getElementsByTagName("winContent")[0].firstChild.nodeValue;
			
			
		newdiv.innerHTML = theHTML;
		
		// Get width, height and cent properties from the XML
		wWidth = XMLElement.getElementsByTagName("winWidth")[0].firstChild.nodeValue;
		wHeight = XMLElement.getElementsByTagName("winHeight")[0].firstChild.nodeValue;
		var theCenter = (getWidth()/2)-(wWidth/2);
	
		var newCSS = "text-align: left; position:absolute; z-index:1; background:#FFFFFF; border: 1px #CCCCCC solid; padding:12px; " +
			"width: " + wWidth+"px; " +
			"height: " + wHeight+"px; " +
			"left :" + theCenter+"px; " +
			"top: " +(getScroll()+100)+"px; " +
			"width: " + wWidth+"px; " +
			"display: block";
		
		newdiv.style.cssText = newCSS;
	
		//Put new div into document Object
		document.body.appendChild(newdiv);
		
		/* load global CSS framework
		var start = new Date();
		var oLink = document.createElement("link") 
		oLink.href = "" + start.getTime();
		oLink.rel = "stylesheet"; 
		oLink.type = "text/css"; 
		document.body.appendChild(oLink);
		*/
		
		//launch JS if exist in XML
		if(XMLElement.getElementsByTagName("winFunction")[0]) eval(XMLElement.getElementsByTagName("winFunction")[0].firstChild.nodeValue);
		
		//add onscroll behavior
		//window.onscroll = scrollFix;
		window.onresize = scrollFix;
	
	}
	
	// THis function detroy the coverup layer and the overlay layer
	function removeOverlay(){
		addOverlay("closing");
		var closingWin = window.setTimeout(removeOverlayFinal,2000);
	}
	
	
	// THis function detroy the coverup layer and the overlay layer
	function removeOverlayFinal(){
		document.body.removeChild($('page_overlay'));
		document.body.removeChild($('page_coverUp'));
		window.onscroll = null;
	}
	
	//this function appends a semi-transparent overlay to the DOM covering up ALL the document
	function coverUp(){
		//document.body.style.cssText = document.body.style.cssText = "; height:100%";
		
		var divIdName = "page_coverUp";
		var coverUp = ($(divIdName)) ? $(divIdName) : document.createElement('div');
		coverUp.setAttribute("id",divIdName);
		var vHeight = getHeight();
		var vTop = getScroll();
		
		if(vHeight < 500) vHeight = 2000;
		
		//if((BrowserDetect.version >=7 && BrowserDetect.browser == "Explorer") || BrowserDetect.browser == "Firefox" || BrowserDetect.browser == "chrome"){
		if((BrowserDetect.version >=7 && BrowserDetect.browser == "Explorer") || BrowserDetect.browser == "Firefox" || BrowserDetect.browser == "Chrome"){
			coverUp.style.cssText = "position:absolute; left:0px; top:" + vTop + "px; width:100%; height:" + vHeight + "px; background:gray; filter:alpha(Opacity=50); opacity:0.5; -moz-opacity:0.5; -khtml-opacity:0.5";
		} else{
			coverUp.style.cssText = "position:absolute; left:0px; top:" + vTop + "px; width:100%; height:" + vHeight + "px; background:url(/images/ie6bg.gif) repeat";
		}
		
		
	
		document.body.appendChild(coverUp);
		
	}


// ***************************************************
// Utility functions
// ***************************************************

	// this function is attached to windows.onscroll to update the overlay X position as user scrolls
	function scrollFix(){
		if($('page_overlay')){
			$('page_overlay').style.top = getScroll()+"px";
			$('page_overlay').style.left = ((getWidth()/2)-(wWidth/2))+"px";
		}
	}
	
	//returns the top position of the scroll status, and add X pixels to determine X position of the overlay
	function getScroll(){
		var theTop;
		/*if (document.documentElement && document.documentElement.scrollTop){
			theTop = document.documentElement.scrollTop;
		} else if (document.body){
			theTop = document.body.scrollTop
		} else{
			theTop = window.pageYOffset;
		}*/
		theTop = document.viewport.getScrollOffsets().top;
		return theTop;
	}
	
	//Return the curent width of the view port in browser
	function getWidth() {
		var myWidth = 0;
		if( typeof( window.innerWidth ) == 'number' ) {
			//Non-IE
			myWidth = window.innerWidth;
		} else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
			//IE 6+ in 'standards compliant mode'
			myWidth = document.documentElement.clientWidth;
		} else if( document.body && document.body.clientWidth ) {
			//IE 4 compatible
			myWidth = document.body.clientWidth;
		}
		return myWidth;
	}
	
	//Retunrs the total height of the document, not just the visible part
	function getHeight(){
		var docHeight;
		
		if (typeof document.height != 'undefined') {
			docHeight = document.height;
		} else if (document.body && typeof document.body.scrollHeight !='undefined') {
			docHeight = document.body.scrollHeight;
		} 
		
		if (typeof document.height != 'undefined') {
			docHeight = document.height;
		} else if (document.compatMode && document.compatMode != 'BackCompat') {
			docHeight = document.documentElement.scrollHeight;
		} else if (document.body && typeof document.body.scrollHeight != 'undefined') {
			docHeight = document.body.scrollHeight;
		}
		
		//docHeight = document.viewport.getHeight();
		
		return docHeight;
	}
	
	
	//Browser detection class
	var BrowserDetect = {
		init: function () {
			this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
			this.version = this.searchVersion(navigator.userAgent)
				|| this.searchVersion(navigator.appVersion)
				|| "an unknown version";
			this.OS = this.searchString(this.dataOS) || "an unknown OS";
		},
		searchString: function (data) {
			for (var i=0;i<data.length;i++)	{
				var dataString = data[i].string;
				var dataProp = data[i].prop;
				this.versionSearchString = data[i].versionSearch || data[i].identity;
				if (dataString) {
					if (dataString.indexOf(data[i].subString) != -1)
						return data[i].identity;
				}
				else if (dataProp)
					return data[i].identity;
			}
		},
		searchVersion: function (dataString) {
			var index = dataString.indexOf(this.versionSearchString);
			if (index == -1) return;
			return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
		},
		dataBrowser: [
			{
				string: navigator.userAgent,
				subString: "Chrome",
				identity: "Chrome"
			},
			{ 	string: navigator.userAgent,
				subString: "OmniWeb",
				versionSearch: "OmniWeb/",
				identity: "OmniWeb"
			},
			{
				string: navigator.vendor,
				subString: "Apple",
				identity: "Safari"
			},
			{
				prop: window.opera,
				identity: "Opera"
			},
			{
				string: navigator.vendor,
				subString: "iCab",
				identity: "iCab"
			},
			{
				string: navigator.vendor,
				subString: "KDE",
				identity: "Konqueror"
			},
			{
				string: navigator.userAgent,
				subString: "Firefox",
				identity: "Firefox"
			},
			{
				string: navigator.vendor,
				subString: "Camino",
				identity: "Camino"
			},
			{		// for newer Netscapes (6+)
				string: navigator.userAgent,
				subString: "Netscape",
				identity: "Netscape"
			},
			{
				string: navigator.userAgent,
				subString: "MSIE",
				identity: "Explorer",
				versionSearch: "MSIE"
			},
			{
				string: navigator.userAgent,
				subString: "Gecko",
				identity: "Mozilla",
				versionSearch: "rv"
			},
			{ 		// for older Netscapes (4-)
				string: navigator.userAgent,
				subString: "Mozilla",
				identity: "Netscape",
				versionSearch: "Mozilla"
			}
		],
		dataOS : [
			{
				string: navigator.platform,
				subString: "Win",
				identity: "Windows"
			},
			{
				string: navigator.platform,
				subString: "Mac",
				identity: "Mac"
			},
			{
				string: navigator.platform,
				subString: "Linux",
				identity: "Linux"
			}
		]
	
	};
	BrowserDetect.init();
