var ERM =
{
	// trim() function for javascript.
	trim: function(str)
	{
		if (!str)
			return "";

		return str.replace(/^\s+|\s+$/, '');
	}, // Comma is important to seperate JSON functions

	setTitle: function (title)
	{
		if (!title || !title.length)
			return;

		var n = document.getElementById('ermpage-title');
		if (n) n.innerHTML = title;

		if (document.title)
			document.title = title;
	},

	showWaitCursor: function()
	{
		if (document.body)
			document.body.className = 'showwaitcursor';
	},

	hideWaitCursor: function()
	{
		if (document.body)
		{
			var className = document.body.className;
			className = className.replace(/showwaitcursor/, '');
			document.body.className = className;
		}
	},

	// Useful method for attaching events to DOM nodes on the fly
	attachEvent: function(domElement, sEvent, pFunction)
	{
		// Remove 'on' from the beginning of the string if it's there
		sEvent = sEvent.toLowerCase();
		sEvent = sEvent.replace(/^on/, '');

		// Try to attach event in W3C/Firefox style first, then IE's way, then fall back to traditional way
		if ( typeof domElement.addEventListener != "undefined" ) // W3C, Firefox
			domElement.addEventListener( sEvent, pFunction, false );
		else if ( typeof domElement.attachEvent != "undefined" ) // IE
			domElement.attachEvent( "on" + sEvent, pFunction);
		else
		{
			eval("var pdomElement = domElement.on" + sEvent + ";");
			if ( pdomElement != null )
			{
				eval("var oldEvent = domElement.on" + sEvent + "; domElement.on" + sEvent + " = function(e) { oldEvent(e); pFunction(); };");
			}
			else
			{
				eval("domElement.on" + sEvent + " = pFunction;");
			}
		}
	},

	removeEvent: function(domElement, sEvent, pFunction, bForce)
	{
		// Remove 'on' from the beginning of the string if it's there
		sEvent = sEvent.toLowerCase();
		sEvent = sEvent.replace(/^on/, '');

		// Try to attach event in W3C/Firefox style first, then IE's way, then fall back to traditional way
		if ( typeof domElement.removeEventListener != "undefined" ) // W3C, Firefox
			domElement.removeEventListener( sEvent, pFunction, false );
		else if ( typeof domElement.detachEvent != "undefined" ) // IE
			domElement.detachEvent( "on" + sEvent, pFunction);
		else
		{
			// We really can't seperate old-style events once they're joined, so just set it to null if forced.
			if (bForce)
			{
				eval("domElement.on" + sEvent + " = null;");
			}
		}
	},

	loader: function(pFunction)
	{
		ERM.attachEvent(window, 'load', pFunction);
	},

	// Initialization function for each ERM page (onload event)
	init: function()
	{
		// Load sidebar content from temporary div at bottom of page into main td
		var sidebar = document.getElementById("ermpage-sidebar-loading");
		var content = document.getElementById("ermpage-sidebar-temp");

		if (content && sidebar)
		{
			// We have to do this innerHTML + id swapping junk because of a rendering bug in Firefox
			sidebar.id = 'ermpage-sidebar';
			sidebar.setAttribute('id', 'ermpage-sidebar');
			sidebar.innerHTML = content.innerHTML;

			// Clear the temp junk
			content.parentNode.removeChild(content);
		}

		var loading = document.getElementById("loadingpleasewait");
		if (loading)
			loading.style.display = "none";
	},

	// NavTab More-izer - Adds a "More" button to the NavTabs (if needed)
	navTabHider: function()
	{
		// Temporarily remove the resize event so it doesn't fire multiple times in IE
		ERM.removeEvent(window, 'resize', ERM.navTabHider);

		// If we're on a BlackBerry or iPhone, don't hide any tabs. (Other mobile browsers will probably fail anyway.)
		if (navigator && navigator.userAgent)
		{
			if(navigator.userAgent.match(/iPhone/i) || navigator.userAgent.match(/iPod/i)
			 || navigator.userAgent.match(/BlackBerry/i) || navigator.userAgent.match(/Opera Mini/i))
			{
				var navtabwrapper = document.getElementById('ermpage-navtabs');
				if (navtabwrapper)
				{
					var navtabul = navtabwrapper.getElementsByTagName('UL')[0];
					if (navtabul)
						navtabul.className = 'nomore';
				}

				return;
			}
		}

		// If we have a 'More' tab already, remove it
		var oMoreTab = document.getElementById('ermpage-navtabs-more');
		if (oMoreTab)
			oMoreTab.parentNode.removeChild(oMoreTab);

		if (typeof(ERMDropdown) != 'undefined')
			ERMDropdown.hide();

		// First get our menu pointers
		var navtabwrapper = document.getElementById('ermpage-navtabs');
		if (!navtabwrapper)
			return;

		var navtabul = navtabwrapper.getElementsByTagName('UL')[0];
		if (!navtabul)
			return;

		var navtabs = navtabul.getElementsByTagName('LI');
		if (!navtabs)
			return;

		// First, show all the hidden tabs
		for(var i = 0; i < navtabs.length; i++)
			navtabs[i].style.display = '';

		// Before we do anything else, let's make sure we actually need the More tab in the first place
		if (navtabs[navtabs.length - 1].firstChild.offsetTop < 10)
		{
			ERM.attachEvent(window, 'resize', ERM.navTabHider);	// Re-attach event
			return;
		}


		// Go ahead and add the More tab - we'll delete it later if needed
		oMoreTab = document.createElement('LI');
		oMoreTab.setAttribute('id', 'ermpage-navtabs-more'); // Need to set twice for IE
		oMoreTab.id = 'ermpage-navtabs-more';
		oMoreTab.innerHTML = '<a href="javascript:void({})" title="Click to see more menu choices" '
									+ 'onclick="if (typeof(ERMDropdown) != \'undefined\') ERMDropdown.show(\'edm_NavTabs\', this, event)"'
									+ '><span>More</span></a>';

		navtabul.appendChild(oMoreTab);

		// Now find out if we should keep it or not
		var aHiddenTabs = new Array();
		var iHiddenCount = 0;

		for(var i = navtabs.length - 1; i > 0; i--)
		{
			var tab = navtabs[i];

			// Don't count our "More" tab
			if (tab == oMoreTab || tab.className == 'activenavtab')
				continue;


			// See if the 'More' tab is still on the second row
			if (oMoreTab.firstChild.offsetTop > 9)
			//if (i > 9)
			{
				var o = new Object();

				var a = tab.firstChild;

				o.href = a.href;
				//o.onclick = a.onclick;
				o.title = a.firstChild.innerHTML;

				if (o.title == 'Help')
					continue;

				aHiddenTabs[iHiddenCount++] = o;
				tab.style.display = 'none';
			}
		}

		if (iHiddenCount)
		{
			// We need to make a menu out of our hidden choices
			var edmroot = document.getElementById('edm_NavTabs');
			if (!edmroot)
				return;

			var html = '';
			for(var i = iHiddenCount - 1; i >= 0; i--)
				html += '<a href="' + aHiddenTabs[i].href + '">' + aHiddenTabs[i].title + '</a>';

			var edm = edmroot.lastChild.lastChild;
			edm.innerHTML = html;
		}
		else
			navtabul.removeChild(oMoreTab);

		ERM.attachEvent(window, 'resize', ERM.navTabHider);	// Re-attach event
	},

	// Note to self: DO NOT USE! openModalWindow doesn't get window.opener variable scope in IE, meaning you can't call parent window
	//               javascript functions!
	openModalWindow: function(url, name, width, height)
	{
		if (width == null)
			width = 720;
		if (height == null)
			height = 500;

		if (window.showModalDialog) // Open modal dialog in IE. It's slightly nicer than regular window.open()
		{
			var options = "dialogWidth:" + width + "px;dialogHeight:" + height + "px;center:yes;scroll:yes;status:no;help:no;resizable=yes";
			window.showModalDialog(url, name, options);
		}
		else
		{
			var x = (screen.width/2 - width/2); if (x < 0) x = 0;
			var y = (screen.height/2 - height/2); if (y < 0) y = 0;

			var options = "width=" + width + ",height=" + height + ",screenx=" + x + ",left=" + x + ",screeny=" + y + ",top=" + y ;
			options += ",location=no,scrollbars=yes,menubar=no,toolbar=no,statusbar=no,resizable=yes,modal=yes,";
			window.open(url, name, options);
		}
	},

	openWindow: function(url, name, width, height)
	{
		if (width == null)
			width = 720;
		if (height == null)
			height = 500;

		var x = (screen.width/2 - width/2); if (x < 0) x = 0;
		var y = (screen.height/2 - height/2); if (y < 0) y = 0;

		var options = "width=" + width + ",height=" + height + ",screenx=" + x + ",left=" + x + ",screeny=" + y + ",top=" + y ;
		options += ",location=no,scrollbars=yes,menubar=no,toolbar=no,statusbar=no,resizable=yes,modal=yes,";

		return window.open(url, name, options);
	},

	getWindowWidth: function()
	{
		if (window.self && self.innerWidth)
			return self.innerWidth;

		if (document.documentElement && document.documentElement.clientWidth)
			return document.documentElement.clientWidth;

		return 0;
	},

	getWindowHeight: function()
	{
		if (window.self && self.innerHeight)
			return self.innerHeight;

		if (document.documentElement && document.documentElement.clientHeight)
			return document.documentElement.clientHeight;

		return 0;
	},

	getWindowScrollX: function()
	{
		if (window.self && self.pageXOffset)
			return self.pageXOffset;

		if (document.documentElement && document.documentElement.scrollLeft)
			return document.documentElement.scrollLeft;

		return 0;
	},

	getWindowScrollY: function()
	{
		if (window.self && self.pageYOffset)
			return self.pageYOffset;

		if (document.documentElement && document.documentElement.scrollTop)
			return document.documentElement.scrollTop;

		return 0;
	},

	// Detects whether the user pressed the 'Enter' key. Use with onkeydown/onkeyup events only! (Not onkeypress)
	pressedEnter: function(evt)
	{
		if (!evt) var evt = window.event;

		var key;
		if(evt && evt.which)
			key = evt.which;
		else
			key = evt.keyCode;

		if (key == 13 || key == 3) // Numpad Enter is ascii 3 on Mac (maybe just Safari)
			return true;

		return false;
	},

	createCookie: function(name,value,days)
	{
		if (days)
		{
			var date = new Date();
			date.setTime(date.getTime()+(days*24*60*60*1000));
			var expires = "; expires="+date.toGMTString();
		}
		else
			var expires = "";

		document.cookie = name+"="+value+expires+"; path=/";
	},

	readCookie: function(name)
	{
		var nameEQ = name + "=";
		var ca = document.cookie.split(';');
		for(var i=0;i < ca.length;i++)
		{
			var c = ca[i];
			while (c.charAt(0)==' ') c = c.substring(1,c.length);
			if (c.indexOf(nameEQ) == 0)
				return c.substring(nameEQ.length,c.length);
		}
		return null;
	},

	eraseCookie: function(name)
	{
		ERM.createCookie(name,"",-1);
	},

	boldSidebar: function(section, title, dontunboldothers, unbolditem)
	{
		if (!dontunboldothers)
			dontunboldothers = false;
		if (!unbolditem) // 'hidden' 4th parameter, do we really want to unbold instead?
			unbolditem = false;

		if (!section || (!title && dontunboldothers))
			return;

		var ermsidebar = document.getElementById('ermpage-sidebar');
		if (!ermsidebar)
			return;

		var elements = ermsidebar.childNodes;
		var elemlen = elements.length;
		var bFoundHeader = false;
		var bFoundSection = false;

		for(var i = 0; i < elemlen; i++)
		{
			var elem = elements[i];
			var tagname = elem.tagName;

			if (!tagname)
				continue;
			else if (tagname == 'H1')
			{
				if (bFoundHeader) // If we're back on another header, it means we didn't find our item to bold. So just go ahead and return...
					return;
				else if (elem.innerHTML == section)
					bFoundHeader = true;
			}
			else if (bFoundHeader && tagname == 'UL')
			{
				var li = elem.childNodes;
				var lilen = li.length;

				for(var j = 0; j < lilen; j++)
				{
					var elem2 = li[j];
					var tagname2 = elem2.tagName;

					if (tagname2 && tagname2 == 'LI')
					{
						var a = elem2.childNodes[0];
						if (!a)
							continue;

						if (!dontunboldothers)
							a.className = '';

						// Trim the »&nbsp; off the beginning of the string
						var text = a.innerHTML.substring(7);
						if (text == title)
						{
							a.className = (unbolditem ? '' : 'activeSidebarLink');

							if (dontunboldothers)
								return;
						}
					}
				}
			}
		}

		return;
	},

	unboldSidebar: function(section, title)
	{
		ERM.boldSidebar(section, title, (title ? true : false), true);
	},

	// Leave empty husks for these three debugging-only functions
	debug: function(sMsg) {},
	print_r: function(v, showfunctions, level) {},
	alert_r: function(v, showfunctions) {},
	explainSQL: function(o) {}
}
ERM.loader(ERM.init);
ERM.loader(ERM.navTabHider);