/* ----------------------------------------------------------------------------------------- */
/*  JavaScript functions for Notis                                                           */
/* ----------------------------------------------------------------------------------------- */
var elm, elms;
var elmBody;
var titleReplacementVisible = null;
var floatingLayerVisible = true;

/* ----------------------------------------------------------------------------------------- */
/*  functions for adding events                                                              */
/* ----------------------------------------------------------------------------------------- */
function addEvent(obj, type, fn) {
  if (obj.addEventListener) {
    obj.addEventListener(type, fn, false);
    EventCache.add(obj, type, fn);
  } else if (obj.attachEvent) {
    obj["e" + type + fn] = fn;
    obj[type+fn] = function() { obj["e" + type + fn] (window.event); }
    obj.attachEvent("on" + type, obj[type + fn]);
    EventCache.add(obj, type, fn);
  } else {
    obj["on" + type] = obj["e" + type + fn];
  }

  return;
}

var EventCache = function() {
  var listEvents = [];
  return {
    listEvents : listEvents,
    add : function(node, sEventName, fHandler){
        listEvents.push(arguments);
    },
    flush : function(){
     var i, item;
     for (i = listEvents.length - 1; i >= 0; i = i - 1){
       item = listEvents[i];
       if (item[0].removeEventListener){
            item[0].removeEventListener(item[1], item[2], item[3]);
       };
       if (item[1].substring(0, 2) != "on"){
         item[1] = "on" + item[1];
       };
       if (item[0].detachEvent){
         item[0].detachEvent(item[1], item[2]);
       };
        item[0][item[1]] = null;
    };
    }
  };
}();

/* ----------------------------------------------------------------------------------------- */
/*  finds an elements position                                                               */
/* ----------------------------------------------------------------------------------------- */
function findPos(obj) {
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		curleft = obj.offsetLeft
		curtop = obj.offsetTop
		while (obj = obj.offsetParent) {
			curleft += obj.offsetLeft
			curtop += obj.offsetTop
		}
	}

	return [curleft,curtop];
}

/* ----------------------------------------------------------------------------- */
/*  add stylesheet switching to certain links                                    */
/* ----------------------------------------------------------------------------- */
function addStyleSheetSwitchToLinks() {
	if (elm = document.getElementById("StyleSheetSwitch")) {
		if (elms = elm.getElementsByTagName("a")) {
			for (i = 0; i < elms.length; i++) {
				elms[i].href = "javascript:void(0)";
				elms[i].onclick = function() { setActiveStyleSheet(this.title) }
			}
		}
	}

	return;
}

/* ----------------------------------------------------------------------------- */
/*  flyouts (test)                                                               */
/* ----------------------------------------------------------------------------- */
function showFlyout(number) {
	if (elm = document.getElementById("Flyout" + number)) {
		elm.style.display = "block";
	}

	return;
}

/* ----------------------------------------------------------------------------------------- */
/*  fix ":focus" for IE by adding "focus" className on text input elements                   */
/* ----------------------------------------------------------------------------------------- */
function fixFormFocus() {
	var elms;

	// input elements
	elms = document.getElementsByTagName("input");
	for (i = 0; i < elms.length; i++) {
		if (elms[i].type.indexOf("text") >= 0) {
			addEvent(elms[i], "focus", function() { this.className += " focus" })
			addEvent(elms[i], "blur", function() { this.className = this.className.replace(" focus", "") })
		}
	}

	// textarea elements
	elms = document.getElementsByTagName("textarea");
	for (i = 0; i < elms.length; i++) {
		addEvent(elms[i], "focus", function() { this.className += " focus" })
		addEvent(elms[i], "blur", function() { this.className = this.className.replace(" focus", "") })
	}

	return;
}

/* ----------------------------------------------------------------------------------------- */
/*  creates help bubble                                                                      */
/*    to do: ability to specify position of bubble (left, right, top, bottom)                */
/* ----------------------------------------------------------------------------------------- */
function createTitleReplacement(collection, onEventType) {
	var elmNewDiv, elmNewInnerDiv, elmTitle, elmNewH, elmNewP, elmNewTextNode;

	for (i = 0; i < collection.length; i++) {
		if (collection[i].title) {
			/* if (collection[i].title.toLowerCase().indexOf("transform::") >= 0) {*/
				// split TITLE attribute into array
				elmTitle = collection[i].title.split("::");

				// create main DIV element
				elmNewDiv = document.createElement("div");
				elmNewDiv.className = "titleReplacement";

				// create inner DIV element
				elmNewInnerDiv = document.createElement("div");
				elmNewInnerDiv.className = "inner";

				// create H6 element for heading
				elmNewH = document.createElement("h4");
				elmNewTextNode = document.createTextNode((elmTitle.length >= 1 ? elmTitle[0] : "Heading not defined"));
				elmNewH.appendChild(elmNewTextNode);

				// create P element for text
				elmNewP = document.createElement("p")
				elmNewTextNode = document.createTextNode((elmTitle.length >= 2 ? elmTitle[1] : "Text not defined"));
				elmNewP.appendChild(elmNewTextNode);

				// append elements
				elmNewInnerDiv.appendChild(elmNewH);
				elmNewInnerDiv.appendChild(elmNewP);
				elmNewDiv.appendChild(elmNewInnerDiv);
				elmBody.appendChild(elmNewDiv);

				// attach onfocus and onblur events to input element
				if (onEventType == "mouseover") {
					addEvent(collection[i], "mouseover", function() { showTitleReplacement(this) })
					addEvent(collection[i], "mouseout", function() { hideTitleReplacement(this) })
				} else if (onEventType == "focus") {
					addEvent(collection[i], "focus", function() { showTitleReplacement(this) })
					addEvent(collection[i], "blur", function() { hideTitleReplacement(this) })
				}

				// add reference to bubble div and set title to empty string
				collection[i].replacementRef = elmNewDiv;
				collection[i].title = "";
			/*}*/
		}
	}
	return;
}

/* ----------------------------------------------------------------------------------------- */
/*  shows title replacement                                                                  */
/* ----------------------------------------------------------------------------------------- */
function showTitleReplacement(obj) {
	// calculcate position for title replacement and set visibility
	objPosition = findPos(obj);
	obj.replacementRef.style.left = objPosition[0] + 10 + "px";
	obj.replacementRef.style.top = objPosition[1] + obj.offsetHeight + 3 + "px";
	obj.replacementRef.style.visibility = "visible";
	titleReplacementVisible = obj.replacementRef;

	return;
}

/* ----------------------------------------------------------------------------------------- */
/*  hides title replacement                                                                  */
/* ----------------------------------------------------------------------------------------- */
function hideTitleReplacement(obj) {
	obj.replacementRef.style.visibility = "hidden";
	titleReplacementVisible = null;

	return;
}

/* ----------------------------------------------------------------------------------------- */
/*  captures mouse position                                                                  */
/* ----------------------------------------------------------------------------------------- */
function captureMousePosition(e) {
	if (document.all) {
		xMousePos = event.x + document.body.scrollLeft;
		yMousePos = event.y + document.body.scrollTop;
	} else {
		if (document.getElementById) {
			xMousePos = e.pageX;
			yMousePos = e.pageY;
		}
	}

	if (titleReplacementVisible) {
		if (document.all) {
			xMousePos += -20;
			yMousePos += 160;
		}
		titleReplacementVisible.style.left = xMousePos - 20 + "px";
		titleReplacementVisible.style.top  = yMousePos + 25 + "px";
	}

	return;
}

/* ----------------------------------------------------------------------------------------- */
/*  handle window resize/scrolling (position floating layers)                                */
/* ----------------------------------------------------------------------------------------- */
function doOnWindowChange() {
  if (typeof(window.pageYOffset) == "number") {
		scrollTop = window.pageYOffset;
  } else if (document.body && (document.body.scrollLeft || document.body.scrollTop)) {
		scrollTop = document.body.scrollTop;
  } else if (document.documentElement && (document.documentElement.scrollLeft || document.documentElement.scrollTop)) {
		scrollTop = document.documentElement.scrollTop;
  }

	if (document.all) {
		if (document.documentElement.clientHeight) {
			windowInnerHeight = document.documentElement.clientHeight;
		} else {
			windowInnerHeight = document.body.clientHeight;
		}
	}
	if (window.innerHeight) {
		windowInnerHeight = window.innerHeight;
	}

	if (typeof(scrollTop) == "undefined") scrollTop = 0; // fix ie bug

	if (elm = document.getElementById("FloatingLayer")) {
		elm.style.top = windowInnerHeight - 48 + scrollTop + "px";
		if (floatingLayerVisible) {
			elm.style.visibility = "visible";
		}
		elm.style.width = document.getElementById("MainArea").offsetWidth - 22 + "px";
	}

	if (elm = document.getElementById("TSystems")) {
		elm.style.top = windowInnerHeight - 30 + scrollTop + "px";
		elm.style.visibility = "visible";
	}
}

function copyToClipBoard(obj) {
	alert(obj.innerText)
	/*
	holdtext.innerText = copytext.innerText;
	Copied = holdtext.createTextRange();
	Copied.execCommand("Copy");
	*/
}

/* ----------------------------------------------------------------------------------------- */
/*  add/remove selected options from/to selected projects                                    */
/* ----------------------------------------------------------------------------------------- */
function moveOptions(direction) {

	if (direction == "right") {
		elmFromSelect = document.getElementById("AvailableProjects");
		elmToSelect = document.getElementById("SelectedProjects");

		// if first option in "to" select is empty, remove it (fix for validation issue)
		if (elmToSelect.options[0]) {
			if (elmToSelect.options[0].value == "") {
				elmToSelect.removeChild(elmToSelect.options[0]);
			}
		}
	} else {
		elmFromSelect = document.getElementById("SelectedProjects");
		elmToSelect = document.getElementById("AvailableProjects");
	}

	while (elmFromSelect.selectedIndex >= 0) {
		x = elmFromSelect.options[elmFromSelect.selectedIndex]
		if (x.value != "") {
			elmToSelect.appendChild(x);
		} else {
			break;
		}
	}

	return;
}

/* ----------------------------------------------------------------------------------------- */
/*  toggle tab display                                                                       */
/* ----------------------------------------------------------------------------------------- */
function toggleTabDisplay(tab) {
	for (i = 1; i < 5; i++) {
		if (elm = document.getElementById("Tab" + i)) {
			if (elmTab = document.getElementById("Tab" + i + "Display")) {
				if (elm.id == tab.id) {
					elmTab.style.display = "block";
					elm.blur();
					if (elm.parentNode.tagName == "LI") {
						elm.parentNode.className = "current";
					}
					if (elm = document.getElementById("FloatingLayer")) {
						if (i == 1) {
							elm.style.visibility = "visible";
							floatingLayerVisible = true;
						} else {
							elm.style.visibility = "hidden";
							floatingLayerVisible = false;
						}
					}
				} else {
					elmTab.style.display = "none";
					if (elm.parentNode.tagName == "LI") {
						elm.parentNode.className = "";
					}
				}
			}
		}
	}

	return;
}

/* ----------------------------------------------------------------------------------------- */
/*  do on page load                                                                          */
/* ----------------------------------------------------------------------------------------- */
function init() {
	// initialize variables
	elmBody = document.getElementsByTagName("body")[0];

	// capture mouse movements
	if (document.all) {
		document.onmousemove = captureMousePosition;
	} else if (document.getElementById) {
		document.onmousemove = captureMousePosition;
	}

	// add events for clicking tabs
	for (i = 1; i < 5; i++) {
		if (elm = document.getElementById("Tab" + i)) {
			addEvent(elm, "click", function() { toggleTabDisplay(this) })
		}
	}

	// add style sheet switch event to links
	addStyleSheetSwitchToLinks();

	// set focus on login field
	if (elm = document.getElementById("LoginEmail")) {
		elm.focus();
	}
	// add onresize to window
	addEvent(window, "resize", doOnWindowChange);
	addEvent(window, "scroll", doOnWindowChange);
	doOnWindowChange();

	if (elm = document.getElementById("MoveOptionsRight")) {
		addEvent(elm, "click", function() { moveOptions("right") })
	}

	if (elm = document.getElementById("MoveOptionsLeft")) {
		addEvent(elm, "click", function() { moveOptions("left") })
	}
	// transform title attributes to popup layers
	//if (elms = document.getElementsByTagName("tr")) { createTitleReplacement(elms, "mouseover") }

	/*
	if (elms = document.getElementsByTagName("input")) { createHelpBubble(elms, "focus") }
	if (elms = document.getElementsByTagName("textarea")) { createHelpBubble(elms, "focus") }
	if (elms = document.getElementsByTagName("a")) { createHelpBubble(elms, "mouseover") }
	if (elms = document.getElementsByTagName("abbr")) { createHelpBubble(elms, "mouseover") }
	*/
	return;
}

addEvent(window, "load", init);
