var mo = function() {
	var visible = false;			// whether the overlay is visible or not
	var browser;					// The Browser
	var hideSelects = false;		// If IE, Hide the Selects
	var pageWidth = 0;				// Page Width
	var pageHeight = 0;				// Page Height
	var tabIndexes = new Array();	// Tab Indexes
	var tabbableTags = new Array("A","BUTTON","TEXTAREA","INPUT","IFRAME");	// Tab Tags
	
	var alertBrowser = true;

	return {
		addEvent: function(obj, evType, fn) {
			if (obj.addEventListener) {
				obj.addEventListener(evType, fn, false);
				return true;
			} else if (obj.attachEvent) {
				var r = obj.attachEvent("on"+evType, fn);
				return r;
			} else {
				return false;
			}
		},
		removeEvent: function(obj, evType, fn, useCapture) {
			if (obj.removeEventListener) {
				obj.removeEventListener(evType, fn, useCapture);
				return true;
			} else if (obj.detachEvent) {
				var r = obj.detachEvent("on"+evType, fn);
				return r;
			} else {
				alert("Handler could not be removed");
			}
		},
		initLaunchBox: function() {
			pageBody = document.getElementsByTagName('BODY')[0];
		
			fadeDiv = document.createElement('div');
			fadeDiv.id = 'fadeDiv';
			launchCont = document.createElement('div');
			launchCont.id = 'launchCont';
	
			pageBody.appendChild(fadeDiv);
			pageBody.appendChild(launchCont);
			
			mo.setFadeSize();
			
			if (navigator.userAgent.indexOf("Firefox") != -1) {
				browser = 'firefox';
			} else if (navigator.userAgent.indexOf("Chrome") != -1) {
				browser = 'chrome';
			} else if (navigator.appVersion.toLowerCase().indexOf('safari') != -1) {
				browser = 'safari';
			} else if (window.opera) {
				browser = 'opera';
			} else {
				browser = 'ie';
			}
			
			// check to see if this is IE version 6 or lower. hide select boxes if so
			var brsVersion = parseInt(window.navigator.appVersion.charAt(0), 10);
			if (brsVersion <= 6 && window.navigator.userAgent.indexOf("MSIE") > -1) {
				hideSelects = true;
			}
		},
		showLaunchBox: function() {
			visible = true;
			mo.disableTabIndexes();
			mo.setFadeSize();
			document.getElementById('fadeDiv').style.display = 'block';
			document.getElementById('launchCont').style.display = 'block';
			mo.centerLaunchBox();
			// for IE
			if (hideSelects == true) {
				mo.hideSelectBoxes();
			}
			if (document.forms['checkout']) {
				var els=document.forms['checkout'].elements;
				for (var i=0; i<els.length; i++) {
					if(/^text/.test(els[i].type)) {
						els[i].hasFocus=false;
						els[i].onfocus=function(){this.hasFocus=true;};
						els[i].onblur=function(){this.hasFocus=false;};
					}
				}
			}
		},
		hideLaunchBox: function() {
			visible = false;
			mo.restoreTabIndexes();
			document.getElementById('fadeDiv').style.display = 'none';
			document.getElementById('launchCont').style.display = 'none';
			
			// for IE
			if (hideSelects == true) {
				mo.displaySelectBoxes();
			}
		},
		centerLaunchBox: function() {
			if (visible) {
				width = document.getElementById('launchCont').offsetWidth;
				height = document.getElementById('launchCont').offsetHeight;

				var pageBody = document.getElementsByTagName("BODY")[0];
				var scTop = parseInt(mo.getScrollTop(),10);
				var scLeft = parseInt(pageBody.scrollLeft,10);
				
				mo.setFadeSize();
				mo.getPageDimensions();
				
				document.getElementById('launchCont').style.top = (scTop + ((pageHeight - height) / 2)) + "px";
				document.getElementById('launchCont').style.left =  (scLeft + ((pageWidth - width) / 2)) + "px";
			} else {
				mo.setFadeSize();
			}
		},
		setFadeSize: function() {
			var pageBody = document.getElementsByTagName("BODY")[0];
			
			mo.getPageDimensions();
			
			if (pageHeight > pageBody.scrollHeight) {
				fadeHeight = pageHeight;
			} else {
				if (browser == 'firefox' || browser == 'opera') {
					fadeHeight = pageBody.scrollHeight + 55;
				} else if (browser == 'safari' || browser == 'chrome') {
					fadeHeight = pageBody.scrollHeight;
				} else {
					fadeHeight = pageBody.scrollHeight;
				}
			}
			
			if (pageWidth < pageBody.scrollWidth) {
				fadeWidth = pageWidth;
			} else {
				fadeWidth = pageBody.scrollWidth;
			}
			
			if (document.getElementById('fadeDiv')) {
				document.getElementById('fadeDiv').style.height = fadeHeight + 'px';
				document.getElementById('fadeDiv').style.width = fadeWidth + 'px';
			}
		},
		getPageDimensions: function() {
			if (browser == 'safari' || browser == 'chrome') {
				pageWidth = window.innerWidth;
				pageHeight = window.innerHeight;
			} else {
				pageWidth = document.documentElement.clientWidth||document.body.clientWidth||document.body.scrollWidth;
				pageHeight = document.documentElement.clientHeight||document.body.clientHeight||document.body.scrollHeight;
			}
		},
		getPageHeight: function() {
			if (window.innerHeight!=window.undefined) return window.innerHeight;
			if (document.compatMode=='CSS1Compat') return document.documentElement.clientHeight;
			if (document.body) return document.body.clientHeight; 
	
			return window.undefined;
		},
		getPageWidth: function() {
			var offset = 17;
			var width = null;
			if (window.innerWidth!=window.undefined) return window.innerWidth-offset; 
			if (document.compatMode=='CSS1Compat') return document.documentElement.clientWidth-offset; 
			if (document.body) return document.body.clientWidth-offset;
		},
		getScrollTop: function() {
			if (self.pageYOffset) {
				return self.pageYOffset;
			} else if (document.documentElement && document.documentElement.scrollTop) { // Explorer 6 Strict
				return document.documentElement.scrollTop;
			} else if (document.body) { // all other Explorers
				return document.body.scrollTop;
			}
		},
		getScrollBot: function() {
			return (document.getElementsByTagName("BODY")[0].scrollHeight - (mo.getScrollTop() + mo.getPageHeight()));
		},
		getScrollLeft: function() {
			if (self.pageXOffset) {
				return self.pageXOffset;
			} else if (document.documentElement && document.documentElement.scrollLeft) { // Explorer 6 Strict
				return document.documentElement.scrollLeft;
			} else if (document.body) { // all other Explorers
				return document.body.scrollLeft;
			}
		},
		keyDownHandler: function(e) {
			if (visible && e.keyCode == 9) {
				if (document.forms["checkout"]) {
					var els = document.forms["checkout"].elements;
					for (var i=0; i<els.length; i++) {
						if (els[i].hasFocus) {
							if (els[i+1]) {
								els[i+1].focus();
							} else {
								var j = 0;
								while (!/^text/.test(els[j].type)) {
									j++;
								}
								els[j].focus();
							}
							break;
						}
						
					}
					return false;
				} else {
					return false;
				}
			}
		},
		disableTabIndexes: function() { // For IE.  Go through predefined tags and disable tabbing into them.
			if (document.all) {
				var i = 0;
				for (var j = 0; j < tabbableTags.length; j++) {
					var tagElements = document.getElementsByTagName(tabbableTags[j]);
					for (var k = 0 ; k < tagElements.length; k++) {
						tabIndexes[i] = tagElements[k].tabIndex;
						if (tagElements[k].id != 'firstName' && tagElements[k].id != 'lastName' && tagElements[k].id != 'email' && tagElements[k].id != 'continue') {
							tagElements[k].tabIndex="-1";
						}
						i++;
					}
				}
			}
		},
		restoreTabIndexes: function() { // For IE. Restore tab-indexes.
			if (document.all) {
				var i = 0;
				for (var j = 0; j < tabbableTags.length; j++) {
					var tagElements = document.getElementsByTagName(tabbableTags[j]);
					for (var k = 0 ; k < tagElements.length; k++) {
						tagElements[k].tabIndex = tabIndexes[i];
						tagElements[k].tabEnabled = true;
						i++;
					}
				}
			}
		},
		hideSelectBoxes: function() { // IE: Hides all drop down form select boxes on the screen so they do not appear above the mask layer.
			var x = document.getElementsByTagName("SELECT");
			for (i=0;x && i < x.length; i++) {
				x[i].style.visibility = "hidden";
			}
		},
		displaySelectBoxes: function() {
			var x = document.getElementsByTagName("SELECT");	
			for (i=0;x && i < x.length; i++){
				x[i].style.visibility = "visible";
			}
		},
		isVisible: function() {
			return visible;
		}
	};
}();

// If using Mozilla or Firefox, use Tab-key trap.
if (!document.all) {
	document.onkeypress = mo.keyDownHandler;
}

mo.addEvent(window, "load", mo.initLaunchBox);
mo.addEvent(window, "resize", mo.centerLaunchBox);
mo.addEvent(window, "scroll", mo.centerLaunchBox);
window.onscroll = mo.centerLaunchBox;