// JavaScript utilities
// Bradley Searle - 01 January 2007

// Elements
$ = function (Element) { return document.getElementById(Element); }
show = function (Element) { Element.style.display = "block"; }
hide = function (Element) { Element.style.display = "none"; }
isVisible = function (Element) { return Element.style.display == "block" || Element.style.display == ""; }
getVisibility = function (Element) { return Element.style.display; }
setVisibility = function (Element, Visibility) { Element.style.visibility = Visibility; }
getHeight = function (Element) { var OriginallyVisible = isVisible(Element); if (!isVisible(Element)) show(Element); var Height = Element.offsetHeight; if (!OriginallyVisible) hide(Element); return Height; }
setHeight = function (Element, Height) {  if (isNaN(Height)) Element.style.height = Height; else Element.style.height = Height + "px"; }
getWidth = function (Element) { var OriginallyVisible = isVisible(Element); if (!isVisible(Element)) show(Element); var Width = Element.offsetWidth; if (!OriginallyVisible) hide(Element); return Width; }
setWidth = function (Element, Width) { if (isNaN(Width)) Element.style.width = Width; else Element.style.width = Width + "px"; }
getOffsetTop = function (Element) { var Top = 0; while (Element.offsetParent) { Top += getTop(Element); Element = Element.offsetParent; } return Top; }
getTop = function (Element) { var OriginallyVisible = isVisible(Element); if (!isVisible(Element)) show(Element); var Top = Element.offsetTop; if (!OriginallyVisible) hide(Element); return Top; }
setTop = function (Element, Top) { Element.style.top = Top + "px"; }
getOffsetLeft = function (Element) { var Left = 0; while (Element.offsetParent) { Left += getLeft(Element); Element = Element.offsetParent; } return Left; }
getLeft = function (Element) { var OriginallyVisible = isVisible(Element); if (!isVisible(Element)) show(Element); var Left = Element.offsetLeft; if (!OriginallyVisible) hide(Element); return Left; }
setLeft = function (Element, Left) { Element.style.left = Left + "px"; }
getClip = function (Element) { var clips = Element.style.clip.toString().replace(/[^0-9\s]/gi, "").split(" "); return { top: clips[0], right: clips[1], bottom: clips[2], left: clips[3], width: clips[1] - clips[3], height: clips[2] - clips[0] }; }
setClip = function (Element, Top, Left, Width, Height) { Element.style.clip = "rect(" + Top + "px, " + (Left + Width) + "px, " + (Top + Height) + "px, " + Left + "px)"; }
getZindex = function (Element) { return Element.style.zIndex; }
setZindex = function (Element, Index) { Element.style.zIndex = Index; }
setHTML = function (Element, HTML) { Element.innerHTML = HTML; }

// Misc
getScrollX = function () { try { return document.documentElement.scrollLeft + document.body.scrollLeft; } catch (e) { return window.scrollX; } }
getScrollY = function () { try { return document.documentElement.scrollTop + document.body.scrollTop; } catch (e) { return window.scrollY; } }
getMouseX = function (Event) { if (!Event) Event = window.event; return Event.clientX + getScrollX(); }
getMouseY = function (Event) { if (!Event) Event = window.event; return Event.clientY + getScrollY(); }
removeItemFromArray = function (ArrayItem, OriginalArray) { var NewArray = new Array(); for (var i = 0; i < OriginalArray.length; i++) { if (OriginalArray[i] != ArrayItem) NewArray.push(OriginalArray[i]); } return NewArray; }

// Events
attachEventListener = function (Element, Method, Function, Capture) { if (Element.addEventListener) Element.addEventListener(Method, Function, Capture); else if (Element.attachEvent) Element.attachEvent("on" + Method, Function); else eval("Element.on" + Method + "=" + Function); }
detachEventListener = function (Element, Method, Function, Capture) { if (Element.removeEventListener) Element.removeEventListener(Method, Function, Capture); else if (Element.detachEvent) Element.detachEvent("on" + Method, Function); else eval("delete Element.on" + Method); }
cancelEventBubble = function (Event) { if (!Event) Event = window.event; if (Event.cancelBubble){ Event.cancelBubble = true;	Event.returnValue = false; } if (Event.preventDefault) Event.preventDefault(); if (Event.stopPropagation) Event.stopPropagation(); }
getEventTarget = function (Event) { var Target; if (!Event) var Event = window.event; if (Event.target) Target = Event.target; else if (Event.srcElement) Target = Event.srcElement; if (Target && Target.nodeType == 3) Target = Target.parentNode; return Target; }
getKeyCode = function (Event) { if (!Event) var Event = window.event; if (Event.keyCode) return Event.keyCode; else if (Event.which) return Event.which; }
isEnterKey = function (Event) { if (getKeyCode(Event) == 13) return true; else return false; }
ignoreEnterKey = function (Event) { if (isEnterKey(Event)) return false; }

// Document
getDocumentWidth = function () { if (window.innerWidth) return window.innerWidth; if (document.documentElement.clientWidth) return document.documentElement.clientWidth; if (document.body.clientWidth) return document.body.clientWidth; }	
getDocumentHeight = function () { if (window.innerHeight) return window.innerHeight; if (document.documentElement.clientHeight) return document.documentElement.clientHeight; if (document.body.clientHeight) return document.body.clientHeight; }	
getScrollTop = function () { if (document.documentElement && document.documentElement.scrollTop) return document.documentElement.scrollTop; else if (document.body) return document.body.scrollTop; else return 0; }
getScrollLeft = function () { if (document.documentElement && document.documentElement.scrollLeft) return document.documentElement.scrollLeft; else if (document.body) return document.body.scrollLeft; else return 0; }

// Strings
isValidEmail = function (Email) { return Email.match(/^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3} \.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)/gi); }
isValidFormText = function (Text) { return !Text.match(/[\&\#\<\>]+/gi); }
isValidExtension = function (FilePath, Extension) { var Extensions = Extension.split(","); for (var i = 0; i < Extensions.length; i++) { if (FilePath.match(new RegExp(Extensions[i] + "$", "gi"))) return true; } return false; }
isEmpty = function (Text) { return !Text.match(/[^\s]+/gi); }
sentenceCase = function (Text) { var Words = Text.split(" "); var Sentence = ""; for (var i = 0; i < Words.length; i++) { Sentence += Words[i].replace(/^[a-z]/gi, Words[i].substr(0,1).toUpperCase()) + (i < Words.length - 1 ? " " : ""); } return Sentence; }
trimWhiteSpace = function (Text) { return Text.replace(/^\s*/, "").replace(/\s*$/, ""); }
truncate = function(Text, Length, Suffix) { return (Text.length <= Length) ? Text : Text.substr(0, Length) + "..."; }

// Toggle select box visibility (IE only)
toggleSelectBoxes = function (State) { if (!document.all) return; var Selects = document.getElementsByTagName("select"); for (var i = 0; i < Selects.length; i++) Selects[i].style.visibility = (State == "on") ? "visible" : "hidden"; }
hideSelectBoxes = function () { toggleSelectBoxes("off"); }
showSelectBoxes = function () { toggleSelectBoxes("on"); }

// Easing functions -- Copyright (c) 2001 Robert Penner
// t: current time, b: beginning value, c: change in value, d: duration
strongEaseOut = function (t, b, c, d) { return c*((t=t/d-1)*t*t*t*t + 1) + b; }
strongEaseIn = function (t, b, c, d) { return c*(t/=d)*t*t*t*t + b; }
strongEaseInOut = function (t, b, c, d) { if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b; return c/2*((t-=2)*t*t*t*t + 2) + b; }

// Write anti-spam e-mail address
// arguments[0]: username, arguments[1-n]: domain
noSpam = function () { var EmailHtml = ""; for (var i = 0; i < arguments.length; i++) { EmailHtml += arguments[i]; if (i == 0) EmailHtml += "@"; else if (i < arguments.length - 1) EmailHtml += "."; } EmailHtml = "<a href=\"mail" + "to:" + EmailHtml + "\" title=\"Send an e-mail to " + EmailHtml + "\">" + EmailHtml + "</a>"; document.write (EmailHtml); }

// Modal dialogues
showPopupImage = function (Src, Width, Height) { var Html = "<div class=\"PopupImageClose\"><img src=\"/Images/ClosePopup.gif\" width=\"17\" height=\"17\" onclick=\"clearInterval($('PopupImage').ResizeListener);closeModal();\"/></div><img id=\"PopupImage\" src=\"" + Src + "\" width=\"" + Width + "\" height=\"" + Height + "\" alt=\"\" />"; showModal(Html, "auto"); setImageSize(Width, Height); if ($("PopupImage").ResizeListener) clearInterval($("PopupImage").ResizeListener); $("PopupImage").ResizeListener = setInterval("setImageSize(" + Width + ", " + Height + ")", 50); }
setImageSize = function (Width, Height) { var paddingWidth = 50; var paddingHeight = 100; if (Width > (getDocumentWidth() - paddingWidth)) { var Ratio = (getDocumentWidth() - paddingWidth) / Width; Width = getDocumentWidth() - paddingWidth; Height *= Ratio; } if (Height > (getDocumentHeight() - paddingHeight)) { var Ratio = (getDocumentHeight() - paddingHeight) / Height; Height = getDocumentHeight() - paddingHeight; Width *= Ratio; } setWidth($("PopupImage"), Width); setHeight($("PopupImage"), Height); setModal(); }
showAlert = function (Message) { var Html = "<div class=\"Message\">" + Message + "</div><div class=\"Buttons\"><button onclick=\"closeModal();\">OK</button></div>"; showModal(Html); }
submitUpload = function () { var NeatUploadId = ""; var Inputs = document.getElementsByTagName("INPUT"); for (var i = 0; i < Inputs.length; i++) { if (Inputs[i].type.toLowerCase() == "file" && Inputs[i].value.match(/[^\s]+/gi)) { NeatUploadId = Inputs[i].name.match(/^NeatUpload_[0-9A-Z]+/gi); } } showModal(""); if (!$("ModalIframe")) { var ModalIframe = document.createElement("iframe"); ModalIframe.setAttribute("id", "ModalIframe"); ModalIframe.setAttribute("width", "400"); ModalIframe.setAttribute("height", "100"); ModalIframe.setAttribute("scrolling", "no"); ModalIframe.setAttribute("frameborder", "0"); $("ModalDialogue").appendChild(ModalIframe); } $("ModalIframe").src = "/Common/Scripts/Upload/UploadProgressHtml.aspx?postBackID=" + NeatUploadId; setTimeout("document.forms[0].submit();", 1000); }
showModal = function (Html, Width) { hideSelectBoxes(); if (!$("ModalOverlay")) { var ModalOverlay = document.createElement("div"); ModalOverlay.setAttribute("id", "ModalOverlay"); document.body.appendChild(ModalOverlay); } if (!$("ModalDialogue")) { var ModalDialogue = document.createElement("div"); ModalDialogue.setAttribute("id", "ModalDialogue"); ModalDialogue.setAttribute("style", "display:none;top:-10000;left:-10000;"); document.body.appendChild(ModalDialogue); } setHTML($("ModalDialogue"), Html); if (Width) setWidth($("ModalDialogue"), Width); setModal(); if ($("ModalOverlay").StageListener) clearInterval($("ModalOverlay").StageListener); $("ModalOverlay").StageListener = setInterval("setModal()", 50); }
closeModal = function () { if ($("ModalOverlay") && $("ModalOverlay").StageListener) clearInterval($("ModalOverlay").StageListener); if($("ModalDialogue")) $("ModalDialogue").parentNode.removeChild($("ModalDialogue")); if($("ModalOverlay")) $("ModalOverlay").parentNode.removeChild($("ModalOverlay")); showSelectBoxes(); }
setModal = function () { setTop($("ModalOverlay"), getScrollTop()); setLeft($("ModalOverlay"), getScrollLeft()); setHeight($("ModalOverlay"), getDocumentHeight()); setTop($("ModalDialogue"), getScrollTop() + (getDocumentHeight() - getHeight($("ModalDialogue"))) / 2); setLeft($("ModalDialogue"), getScrollLeft() + (getDocumentWidth() - getWidth($("ModalDialogue"))) / 2); show($("ModalDialogue")); }

// Tasks
monitorTaskProgress = function (TaskId) { sendPostRequest("/Common/Scripts/Task/TaskProgressXml.aspx", "<request taskid=\"" + TaskId + "\" abort=\"false\" />", "getTaskProgress"); }
abortTask = function (TaskId) { sendPostRequest("/Common/Scripts/Task/TaskProgressXml.aspx", "<request taskid=\"" + TaskId + "\" abort=\"true\" />", "getTaskProgress"); }
getTaskProgress = function (Request) { var Xml = Request.responseXML; var Id =  Xml.documentElement.getAttribute("id"); var PercentComplete = Xml.documentElement.getAttribute("percentcomplete"); var ElapsedTime = Xml.documentElement.getAttribute("elapsedtime"); var Status = Xml.documentElement.getAttribute("status"); var Error = Xml.documentElement.firstChild.nodeValue; UpdateTaskProgress(PercentComplete, Error); if (PercentComplete < 1) sendPostRequest("/Common/Scripts/Task/TaskProgressXml.aspx", "<request taskid=\"" + Id + "\" abort=\"false\" />", "getTaskProgress"); }

// AJAX
makeHttpRequest = function (ScriptUrl, Method, PostData, SuccessCallbackFunction, FailureCallbackFunction) { var Request; var RefreshQS = "Refresh=" + (Math.random() * 999999); if (ScriptUrl.indexOf("?") > -1) ScriptUrl += "&" + RefreshQS; else ScriptUrl += "?" + RefreshQS; if (window.XMLHttpRequest) { Request = new XMLHttpRequest(); Request.onreadystatechange = function () { if(Request.readyState == 4) { if (Request.status != 200) eval(FailureCallbackFunction + "(Request);"); else eval(SuccessCallbackFunction + "(Request);"); } }; Request.open(Method, ScriptUrl, true);  if (Method.toUpperCase() == "POST") Request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");  Request.send(PostData); } else if (window.ActiveXObject) { Request = new ActiveXObject("Microsoft.XMLHTTP"); if (Request) { Request.onreadystatechange = function () { if(Request.readyState == 4) { if (Request.status != 200) eval(FailureCallbackFunction + "(Request);"); else eval(SuccessCallbackFunction + "(Request);"); } }; Request.open(Method, ScriptUrl, true); if (Method.toUpperCase() == "POST") Request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); Request.send(PostData); } } return Request; }
makeHttpRequestFailed = function (Request) { showAlert(Request.responseText); /*"<div class=\"Warning\">Unable to complete request!</div>"); */}
sendPostRequest = function (ScriptUrl, PostData, CallbackFunction) { makeHttpRequest (ScriptUrl, "POST", PostData, CallbackFunction, "makeHttpRequestFailed"); }
sendGetRequest = function (ScriptUrl, CallbackFunction) { makeHttpRequest (ScriptUrl, "GET", "", CallbackFunction, "makeHttpRequestFailed"); }



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();











// JavaScript Document
/*
	Developed by Robert Nyman, http://www.robertnyman.com
	Code/licensing: http://code.google.com/p/getelementsbyclassname/
*/
var getElementsByClassName = function (className, tag, elm){
	if (document.getElementsByClassName) {
		getElementsByClassName = function (className, tag, elm) {
			elm = elm || document;
			var elements = elm.getElementsByClassName(className),
				nodeName = (tag)? new RegExp("\\b" + tag + "\\b", "i") : null,
				returnElements = [],
				current;
			for(var i=0, il=elements.length; i<il; i+=1){
				current = elements[i];
				if(!nodeName || nodeName.test(current.nodeName)) {
					returnElements.push(current);
				}
			}
			return returnElements;
		};
	}
	else if (document.evaluate) {
		getElementsByClassName = function (className, tag, elm) {
			tag = tag || "*";
			elm = elm || document;
			var classes = className.split(" "),
				classesToCheck = "",
				xhtmlNamespace = "http://www.w3.org/1999/xhtml",
				namespaceResolver = (document.documentElement.namespaceURI === xhtmlNamespace)? xhtmlNamespace : null,
				returnElements = [],
				elements,
				node;
			for(var j=0, jl=classes.length; j<jl; j+=1){
				classesToCheck += "[contains(concat(' ', @class, ' '), ' " + classes[j] + " ')]";
			}
			try	{
				elements = document.evaluate(".//" + tag + classesToCheck, elm, namespaceResolver, 0, null);
			}
			catch (e) {
				elements = document.evaluate(".//" + tag + classesToCheck, elm, null, 0, null);
			}
			while ((node = elements.iterateNext())) {
				returnElements.push(node);
			}
			return returnElements;
		};
	}
	else {
		getElementsByClassName = function (className, tag, elm) {
			tag = tag || "*";
			elm = elm || document;
			var classes = className.split(" "),
				classesToCheck = [],
				elements = (tag === "*" && elm.all)? elm.all : elm.getElementsByTagName(tag),
				current,
				returnElements = [],
				match;
			for(var k=0, kl=classes.length; k<kl; k+=1){
				classesToCheck.push(new RegExp("(^|\\s)" + classes[k] + "(\\s|$)"));
			}
			for(var l=0, ll=elements.length; l<ll; l+=1){
				current = elements[l];
				match = false;
				for(var m=0, ml=classesToCheck.length; m<ml; m+=1){
					match = classesToCheck[m].test(current.className);
					if (!match) {
						break;
					}
				}
				if (match) {
					returnElements.push(current);
				}
			}
			return returnElements;
		};
	}
	return getElementsByClassName(className, tag, elm);
};


	function glossary(){
		var elmnts = getElementsByClassName("glossary", "span");
		var span;
		for(var i =0; i < elmnts.length; i++){			
			elmnts[i].onmouseover = function(){	tooltip(this);	};
			elmnts[i].onmouseout = function(){	closeTip();	};
		}
	}	

	function tooltip(glossaryLink){
		//alert(glossaryLink.innerHTML);

		var tempStr = glossaryLink.innerHTML;
		tempStr = tempStr.replace(/<[\/a-z\"= \s]*>/ig, "");
		var tooltipDiv = document.getElementById(tempStr).cloneNode(true);
		tooltipDiv.id = 'tooltip';
		tooltipDiv.style.display = 'block';
		tooltipDiv.style.position = "absolute";
		tooltipDiv.style.zIndex = "101";
				
		var offSetXAdd = glossaryLink.innerHTML.length * 7;
		var offSetYAdd = 20;
		if(BrowserDetect.browser == "Explorer")
		{			
			if(getOffsetLeft(glossaryLink) > 400 - offSetXAdd)
			{
				offSetXAdd =  -250;
			}
			tooltipDiv.style.top = (getOffsetTop(glossaryLink) + offSetYAdd) + "px";
			tooltipDiv.style.left = (getOffsetLeft(glossaryLink) + offSetXAdd) + "px";	
		}
		else
		{
			tooltipDiv.style.top = (getTop(glossaryLink) + 20) + "px";
			tooltipDiv.style.left = (getLeft(glossaryLink) + 10) + "px";		
		}
		//glossaryLink.parentNode.insertBefore(tooltipDiv,glossaryLink); -- breaks pageflow in IE
		document.body.appendChild(tooltipDiv);
	}
	
	function closeTip(){
		var currentTip = document.getElementById('tooltip');
		if(currentTip)
		{
			//currentTip.parentNode.removeChild(currentTip); //Kamikaze
			document.body.removeChild(currentTip);
		}
	}

