addListener('load', init, window);
function init() {
	trRegister();
}

//############
//## show/hide
function toggleDisplay(id, link, showText, hideText) {
	var elem = getElement(id);
	elem.style.display = elem.style.display? '' : 'none';
	if (link && showText && hideText) {
		link.innerHTML = elem.style.display? showText : hideText;
	}
	return false;
}

var slideInProgress = false;
function showHide(id, link, showText, hideText) {
	if (slideInProgress) return;
	slideInProgress = true;
	var elem = getElement(id);
	if (link && showText && hideText) {
		link.innerHTML = elem.style.display? hideText : showText;
	}
	var direction = elem.style.display? 1 : -1;
	elem.style.display = '';
	slideContent(id, direction);
	return false;
}
function slideContent(id, direction) {
	var slideSpeed = 13;	// Higher value = faster
	var slideTimer = 8;	// Lower value = faster
	var elem = getElement(id);
	var elemContent = elem.getElementsByTagName('DIV')[0];
	
	var height = elem.clientHeight;
	if (height == 0) height = elem.offsetHeight;
	height = height + 1*slideSpeed*direction;
	var rerunFunction = true;
	if (height > elemContent.offsetHeight) {
		height = elemContent.offsetHeight;
		rerunFunction = false;
	}
	if (height <= 1) {
		height = 1;
		rerunFunction = false;
	}
	elem.style.height = height + 'px';
	var topPos = height - elemContent.offsetHeight;
	if (topPos > 0) topPos = 0;
	elemContent.style.top = topPos + 'px';
	if (rerunFunction) {
		setTimeout("slideContent('" + id + "'," + direction + ")", slideTimer);
	} else {
		slideInProgress = false;
		if (height <= 1) {
			elem.style.display = 'none';
		}
	}
}

function showTranscript(enst) {
	var tab = getElement(enst+'_tab');
	var tabs = tab.parentNode.parentNode.parentNode.getElementsByTagName('DIV');
	for (var i=0; i<tabs.length; i++) {
		if (tabs[i].id) {
			if (tabs[i].id == tab.id) tabs[i].style.display = '';
			else tabs[i].style.display = 'none';
		}
	}
	var img = getElement(enst+'_img');
	var imgs = img.parentNode.getElementsByTagName('DIV');
	for (var i=0; i<imgs.length; i++) {
		if (imgs[i].id) {
			if (imgs[i].id == img.id) imgs[i].style.display = '';
			else imgs[i].style.display = 'none';
		}
	}
}

//###########
//## TR-hover
function trRegister() {
	var tbody = document.getElementsByTagName('TBODY');
	for (var i=0; i<tbody.length; i++) {
		if (tbody[i].className == 'hover') {
			var tr = tbody[i].getElementsByTagName('TR');
			for (var j=0; j<tr.length; j++) {
				addListener('click', trClick, tr[j]);
				addListener('mouseover', trOver, tr[j]);
				addListener('mouseout', trOut, tr[j]);
			}
		}
	}
}
function getTr(e) {
	var trgt = eventTarget(e);
	while (trgt.tagName != 'TR') {
		trgt = trgt.parentNode;
	}
	return trgt;
}
function trClick(e) {
	var a = getTr(e).getElementsByTagName('A');
	if (a.length) {
		document.location.href = a[0].href;
		trOut(e);
	}
}
function trOver(e) {
	getTr(e).className += ' hover';
}
function trOut(e) {
	getTr(e).className = getTr(e).className.replace(/\shover/i, "");
}

//##########
//## Getters
function getElement(id) {
	if (document.getElementById) {
		var elem = document.getElementById(id);
		// Verify id attibute if IE
		if (elem && navigator.userAgent.match(/msie/i)) {
			//alert(elem);
			if (elem.attributes['id'].value == id) return elem;
      else return getElementAll(id);
		}
		return elem;
	}
	else {
		return getElementAll(id);
	}
}
function getElementAll(id) {
	for (var i=1; i<document.all[id].length; i++) {
		if (document.all[id][i].attributes['id'].value == id) {
			return document.all[id][i];
		}
	}
	return null;
}

function getMilliTime() {
	var d = new Date();
	return d.getTime();
}

function getObjectPos(obj) {
	var curleft = 0;
	var curtop = 0;
	if (obj.offsetParent) {
		do {
			curleft += obj.offsetLeft;
			curtop += obj.offsetTop;
		} while (obj = obj.offsetParent);
	}
	return [curleft,curtop];
}

function getPageScroll() {
	var xScroll = 0;
	var yScroll = 0;
	if (self.pageYOffset) {
			yScroll = self.pageYOffset;
			xScroll = self.pageXOffset;
	}
	else if (document.documentElement && (document.documentElement.scrollTop || document.documentElement.scrollLeft)) {
			yScroll = document.documentElement.scrollTop;
			xScroll = document.documentElement.scrollLeft;
	}
	else if (document.body) {
			yScroll = document.body.scrollTop;
			xScroll = document.body.scrollLeft;
	}
	return [xScroll, yScroll];
}

function getMousePos(e) {
	var evt = e || window.event;
	var posx = 0;
	var posy = 0;
	if (evt.pageX || evt.pageY) {
		posx = evt.pageX;
		posy = evt.pageY;
	}
	else if (evt.clientX || evt.clientY) {
		posx = evt.clientX + getPageScroll()[0];
		posy = evt.clientY + getPageScroll()[1];
	}
	return [posx, posy];
}

//##########
//## Tooltip
var tooltipX = 12;
var tooltipY =  8;
var tooltipDiv = false;
// Hides tooltips and guidelines
function exit() {
	if (tooltipDiv) {
		tooltipDiv.style.display = 'none';
		removeListener('mousemove', tooltipMove, document);
	}
}
// Creates tooltip div
function tooltipCreate(width) {
	if (document.createElement) {
		var elem = document.createElement('div');
		elem.id = 'tooltip_div';
		elem.className = 'tooltip';
		elem.style.display = 'none';
		elem.innerHTML = '&nbsp;';
		document.body.appendChild(elem);
	}
	return elem;
}
// Moves tooltip and guideline when mouse moves
function tooltipMove(e) {
	if (tooltipDiv) {
		var pos = getMousePos(e);
		tooltipDiv.style.left = (pos[0] + tooltipX) + 'px';
		tooltipDiv.style.top = (pos[1] + tooltipY) + 'px';
	}
}
// Shows tooltip
function tooltip(tip, width) {
	if (!tooltipDiv) tooltipDiv = tooltipCreate();
	if (width > 0) {
		tooltipDiv.style.width = width+'px';
	} else {
		tooltipDiv.style.width = '';
	}
	tooltipDiv.innerHTML = tip;
	addListener('mousemove', tooltipMove, document);
	tooltipDiv.style.display = 'block';
}

//###################
//## Cookie functions
function createCookie(name, value, create) {
	if (create) {
		var date = new Date();
		date.setTime(date.getTime()*100); //dont expire
		var expires = "; expires=" + date.toGMTString();
	}
	else {
		var expires = "";
	}
	document.cookie = name + "=" + escape(value) + expires + "; path=" + escape('/') + ";";
}
function readCookie(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;
}
function eraseCookie(name) {
	createCookie(name, "", 0);
}


//#################
//## Ajax functions
function AjaxConnection(url, data, sync) {
	this.ajaxConnect = ajaxConnect;
	this.uri = url;
	this.async = sync? false : true;
	if (data) {
		this.type = 'POST';
		this.data = data;
	}
	else {
		this.type = 'GET';
		this.data = '';
	}
}
function ajaxConnect(returnFunc, target) {
	this.x = ajaxInitObject();
	this.x.open(this.type, this.uri, this.async);
	var self = this;
	this.x.onreadystatechange = function() {
		if (self.x.readyState != 4) return;
		if (self.x.status == 200) {
			if (!returnFunc) returnFunc = 'ajaxCallBack';
			if (target) eval(returnFunc+"(self.x.responseText, '"+target+"')");
			else eval(returnFunc+"(self.x.responseText)");
		}
		if (self.async) delete self.x;
	}
	this.x.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	this.x.send(this.data);
}
function ajaxInitObject() {
	if (typeof XMLHttpRequest != 'undefined') return new XMLHttpRequest();
	else if (window.ActiveXObject) {
		var avers = ["Microsoft.XmlHttp", "MSXML2.XmlHttp", "MSXML2.XmlHttp.3.0",  "MSXML2.XmlHttp.4.0", "MSXML2.XmlHttp.5.0"];
		for (var i = avers.length -1; i >= 0; i--) {
			try {
				httpObj = new ActiveXObject(avers[i]);
				return httpObj;
			}
			catch(e) {}
		}
	}
	throw new Error('XMLHttp (AJAX) not supported');
}
function ajaxCallBack(content, target) {
	if (getElement(target)) getElement(target).innerHTML = content;
}

//##################
//## Event functions
var customEvents = new Array();
function createCustomEvent(name) {
	var evtEl = document.createElement('a');
	evtEl.id = name;
	document.body.appendChild(evtEl);
	customEvents[name] = evtEl;
	return customEvents[name];
}
function fireCustomEvent(name) {
	var evtEl = customEvents[name] || createCustomEvent(name);
	if (document.createEvent) {
	  var evObj = document.createEvent('MouseEvents');
	  evObj.initEvent('click', true, true);
	  evtEl.dispatchEvent(evObj);
	}
	else if (document.createEventObject) {
	  var evObj = document.createEventObject();
	  evtEl.fireEvent('onclick', evObj);
	}
}
function addCutsomListener(name, func) {
	var evtEl = customEvents[name] || createCustomEvent(name);
	var customListener = function(e) {
		var target = eventTarget(e);
		if (target.id == name) {
			func();
		}
	};
	addListener('click', customListener, evtEl);
}

function eventTarget(e) {
	var evt = e || window.event;
	var trgt = evt.target? evt.target : evt.srcElement;
	return trgt;
}

function addListener(evt, func, node) {
	if (!node) node = document;
	if (node.addEventListener) {
		node.addEventListener(evt, func, true);
	}
	else if (node.attachEvent) {
		node.attachEvent("on"+evt, func);
	}
}
function removeListener(evt, func, node) {
	if (!node) node = document;
	if (node.removeEventListener) {
    node.removeEventListener(evt, func, true);
  }
	else if (node.detachEvent) {
    node.detachEvent("on"+evt, func);
  }
}

function cancelDefault(e) {
	var evt = e || window.event;
	if (evt.preventDefault) {
		evt.preventDefault();
	}
	else {
		evt.cancelBubble = true;
		evt.returnValue = false;
		document.onselectstart = new Function('return false');
	}
}


//##################
//## Prototype funcs
String.prototype.trim = function() {
	return this.replace(/^\s+|\s+$/g, "");
}

Array.prototype.find = function(value) {
	for (var i=0; i<this.length; i++) {
		if (this[i] == value) return i;
	}
	return -1;
}
