// ***************************************************
// Static XML providers for error and loading 
// ***************************************************

 	// Potential XML provider if source is local (ie: not returned as valid XML on when provider not served by a web server)
	var localXMLObject;
	
	// XML provider for loading screen
	var loadingXML = '<?xml version="1.0" ?><winOverlay><winInfo><winWidth>516</winWidth><winHeight>100</winHeight></winInfo><winContent><![CDATA[';
	var loadingXML = loadingXML + '<div id="page_overlay_content" style="height:205px;"><p align="center" style="padding-top:85px;">Loading <img align="absbottom" src="http://images.autodesk.com/flashassets/staticassets/consolidatedLogin/images/animated_load_gif_02.gif" width="12" height="8"></p></div>]]>';
	var loadingXML = loadingXML + '</winContent></winOverlay>';
	
	// XML Provider for Error screen
	var errorXML = '<?xml version="1.0" ?><winOverlay><winInfo><winWidth>100</winWidth><winHeight>100</winHeight></winInfo><winContent><![CDATA[';
	var errorXML = errorXML + '<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 errorXML = errorXML + '<div id="page_overlay_content"><p align="center">Error loading page.</p></div>';
	var errorXML = errorXML + '</td></tr></table>]]>';
	var errorXML = errorXML + '</winContent></winOverlay>';
	
	// XML Provider for Processing screen
	var processingXML = '<?xml version="1.0" ?><winOverlay><winInfo><winWidth>516</winWidth><winHeight>100</winHeight></winInfo><winContent><![CDATA[';
	var processingXML = processingXML + '<div id="page_overlay_content" style="height:205px;"><p align="center" style="padding-top:85px;">Processing your request <img align="absbottom" src="http://images.autodesk.com/flashassets/staticassets/consolidatedLogin/images/animated_load_gif_02.gif" width="12" height="8"></p></div>]]>';
	var processingXML = processingXML + '</winContent></winOverlay>';
	
	// Serialize Strings into XML objects
	if (window.ActiveXObject){
	  var errorXMLObject = new ActiveXObject("Microsoft.XMLDOM");
	  errorXMLObject.async="false";
	  errorXMLObject.loadXML(errorXML);
	  
	  var loadingXMLObject = new ActiveXObject("Microsoft.XMLDOM");
	  loadingXMLObject.async="false";
	  loadingXMLObject.loadXML(loadingXML);
	  
	  var processingXMLObject = new ActiveXObject("Microsoft.XMLDOM");
	  processingXMLObject.async="false";
	  processingXMLObject.loadXML(processingXML);
	} else {
	  var parser = new DOMParser();
	  var loadingXMLObject = parser.parseFromString(loadingXML,"text/xml");
	  var errorXMLObject = parser.parseFromString(errorXML,"text/xml");
	  var processingXMLObject = parser.parseFromString(errorXML,"text/xml");
	}

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

	// Mother Function, launched from links, forms ...
	function loadHTMLinOverlay(provider,param) {
		//Show the loading message
		coverUp();
		addOverlay("loading");
		
		function onSuccess( request ) {
			// nothing returned
			if( request.responseText == "") {
				addOverlay("error");
				return;
			} 
			// responsetText is filled
			else {
				// status is equal 4 when the responsseText is filled AND the response has valid XML type headers
				if(request.status != 0){
					addOverlay(request);
					return;
				} 
				// staus is equal to zero, the responseText has valid XML, but we need to turn it into a valid JS XML object
				else{
					if (window.ActiveXObject){
					  localXMLObject = new ActiveXObject("Microsoft.XMLDOM");
					  localXMLObject.async="false";
					  localXMLObject.loadXML(request.responseText);
					} else {
					  var parser = new DOMParser();
					  localXMLObject = parser.parseFromString(request.responseText,"text/xml");
					}
					addOverlay("localXML");
					return;
				}
			}
		}
		
		// prevent provider caching
		var start = new Date();
		//provider = provider + ((provider.indexOf("?") == -1) ? "?" : "&") + "a=" + 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){
	
		// Create a new div (replacing the current one if necessary)
		var divIdName = "page_overlay";
		var XMLElement = null;
		var noClose = 0;
		var dropShadowTop = "";
		var	dropShadowMid = "";
		var	dropShadowBottom = "";
		var hasShadow = 0;
		var topFactor = 0;
		
		var newdiv = ($(divIdName)) ? $(divIdName) : document.createElement('div');
		newdiv.setAttribute("id",divIdName);
		
		var doNotLoadCSS = false;
		
		// 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;
			noClose = 1;
			doNotLoadCSS = true;
		} else if(c == "processing"){
			XMLElement = processingXMLObject;
			doNotLoadCSS = true;
			noClose = 1;
		} else if(c == "error"){
			XMLElement = errorXMLObject;
			doNotLoadCSS = true;
		} else if(c == "localXML"){
			XMLElement = localXMLObject;
		}
		
		// Get width, height and cent properties from the XML
		wWidth = 534;
		var theCenter = (getWidth()/2)-(wWidth/2);
		
		if((BrowserDetect.version >=7 && BrowserDetect.browser == "Explorer") || BrowserDetect.browser == "Firefox"){
			dropShadowTop = "background-image:url('http://images.autodesk.com/flashassets/staticassets/consolidatedLogin/images/box_top.png'); height:21px; ";
			dropShadowMid = "background-image:url('http://images.autodesk.com/flashassets/staticassets/consolidatedLogin/images/box_tile.png'); background-repeat:repeat-y; width:534px;";
			dropShadowBottom = "background-image:url('http://images.autodesk.com/flashassets/staticassets/consolidatedLogin/images/box_bottom.png'); background-position:bottom left; height:21px;";
			hasShadow = 1;
			topFactor = 138;
		} else{
			dropShadowTop = "background-color: #FFFFFF; height:0px;";
			dropShadowMid = "background-color: #FFFFFF; width:516px; padding-top:12px; padding-bottom:12px;";
			dropShadowBottom = "background-color: #FFFFFF; height:0px;";
			topFactor = 146;
		}
		
		var newCSS = "position:absolute; z-index:100; padding:0; margin:0; " +
			"width: 534px; " + // -24 reduce padding from totla width
			"height: 10px; " + // just need to be there to fool some CSS integrations, real heigh set by lenght of content
			"left :" + theCenter + "px; " +
			"top: " + (getScroll()+topFactor) + "px; " +
			"display: block";

		// load HTML in DIV
		theHTML = ((hasShadow) ? "<div style=\"width:534px; padding:0; margin:0; " + dropShadowTop + "\"></div>" : "") + 
				  "<div style=\"text-align:center; " + dropShadowMid + "\">"
				  	+ ((!noClose) ? "<div style='width:491px; text-align:right; margin: auto; padding:0; height:36px;'><a href=\"javascript:removeOverlay();\"><img src='http://images.autodesk.com/flashassets/staticassets/consolidatedLogin/images/close.jpg' border='0' align='right'></a></div>" : "") +
						XMLElement.getElementsByTagName("winContent")[0].firstChild.nodeValue + 
				  "</div>" +
				  ((hasShadow) ? "<div style=\"width:534px; " + dropShadowBottom + "\"></div>" : "");

			
		newdiv.innerHTML = theHTML;
		newdiv.style.cssText = newCSS;
	
		//Put new div into document Object
		document.body.appendChild(newdiv);
		
		if(!doNotLoadCSS){
			// load global CSS framework
			var start = new Date();
			var oLink = document.createElement("link") 
			//oLink.href = "http://images.autodesk.com/flashassets/staticassets/consolidatedLogin/css/css.css?a=" + start.getTime();
			oLink.href = "http://images.autodesk.com/flashassets/staticassets/consolidatedLogin/css/css.css";
			oLink.rel = "stylesheet"; 
			oLink.type = "text/css"; 
			// old method unsupported by Safari
			//document.body.appendChild(oLink);
			document.getElementsByTagName("head")[0].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(){
		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();
		
		if((BrowserDetect.version >=7 && BrowserDetect.browser == "Explorer") || BrowserDetect.browser == "Firefox"){
			coverUp.style.cssText = "position:absolute; left:0px; top:0px; width:100%; height:" + vHeight + "px; background:black; filter:alpha(Opacity=25); opacity:0.25; -moz-opacity:0.25; -khtml-opacity:0.25";
		} else{
			coverUp.style.cssText = "position:absolute; left:0px; top:0px; width:100%; height:" + vHeight + "px; background:url(http://images.autodesk.com/flashassets/staticassets/consolidatedLogin/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(){
		if (document.documentElement && document.documentElement.scrollTop){
			theTop = document.documentElement.scrollTop;
		} else if (document.body){
			theTop = document.body.scrollTop
		} else{
			theTop = window.pageYOffset;
		}
		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;
		}
		
		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: "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();
	
	function validateEmail(theEmail) {
		if(/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(theEmail)){
			errorMsg(0);
		} else{
			errorMsg("some email error here");
		}
	}
	
	function errorMsg(msg){
		var errorItem = $("errorMsg");
		if(msg){	
			errorItem.innerHTML = "<div class=\"error\">" + msg + "</div>";
			errorItem.style.display = "";
		} else{
			errorItem.style.display = "none";
		}
	}
