/** shortcut for getElementById() **/
var $=function(id){return document.getElementById(id);};

/** onloadStack, allows for multiple events to happen onload **/
var __onloadStack = new Array();
window.onload = function() {
	for (i in __onloadStack) {
		__onloadStack[i]();
	}
}

function replaceButtons() {
	var buttons = document.getElementsByTagName('button');
	for(var i = buttons.length-1; i>=0; i--) {
		if(buttons[i].className == 'button') {
			button2link(buttons[i]);
		}
	}
}
function button2link(b) {
	var link = element('a');
	link.className = 'button';
	var form = b.parentNode;
	while(form.nodeName != 'FORM' && form.parentNode) {
		form = form.parentNode;
	}
	if(form && form.action) {
		link.href = ''+form.action;
		while(b.firstChild) {
			link.appendChild(b.firstChild);
		}
		link.onclick = function() { form.submit(); return false; }
		b.parentNode.replaceChild(link, b);
	}
}
__onloadStack.push(replaceButtons);


function setLinkTargets() {
	var links = $('replacelinks').getElementsByTagName('a');
	var baseLength = BASE_URI.length;
	for(var i=0; i<links.length; i++) {
		if(links[i].href.substr(0,baseLength) != BASE_URI) {
			links[i].target = '_blank';
		}
	}
}
__onloadStack.push(setLinkTargets);

/**
 * Prototype the function object with bind. This allows to execute the function
 * in the scope of an object instance
 */
Function.prototype.bind = function(object) {
	var _method = this;
	return function() { return _method.apply(object, arguments); }
}
/** XMLHTTP **/
if (!window.XMLHttpRequest) {
	window.XMLHttpRequest = function() {
		var types = new Array('MSXML2.XMLHTTP.6.0','MSXML2.XMLHTTP.3.0');

		for (var i = 0; i < types.length; i++) {
			try {
				return new ActiveXObject(types[i]);
			} catch(e) {}
		}
		return undefined;
	}
}

/** string **/
function lTrim(str, charlist ) {
	var whitespace = (!charlist) ? ' \n\r\t\f\x0b\xa0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000' : charlist.replace(/([\[\]\(\)\.\?\/\*\{\}\+\$\^\:])/g, '\$1');
	for (var i = 0; i < str.length; i++) {
		if (whitespace.indexOf(str.charAt(i)) === -1) {	str = str.substring(i);	break; }
	}
	return whitespace.indexOf(str.charAt(0)) === -1 ? str : '';
}
function rTrim(str, charlist ) {
	var whitespace = (!charlist) ? ' \n\r\t\f\x0b\xa0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000' : charlist.replace(/([\[\]\(\)\.\?\/\*\{\}\+\$\^\:])/g, '\$1');
	for (i = str.length - 1; i >= 0; i--) {
		if (whitespace.indexOf(str.charAt(i)) === -1) {			str = str.substring(0, i + 1); break; }
	}
	return whitespace.indexOf(str.charAt(0)) === -1 ? str : '';
}
function trim(str, charlist ) {
	var whitespace = (!charlist) ? ' \n\r\t\f\x0b\xa0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000' : charlist.replace(/([\[\]\(\)\.\?\/\*\{\}\+\$\^\:])/g, '\$1');
	for (var i = 0; i < str.length; i++) {
		if (whitespace.indexOf(str.charAt(i)) === -1) {	str = str.substring(i);	break; }
	}
	for (i = str.length - 1; i >= 0; i--) {
		if (whitespace.indexOf(str.charAt(i)) === -1) {	str = str.substring(0, i + 1); break; }
	}
	return whitespace.indexOf(str.charAt(0)) === -1 ? str : '';
}

/** Dom helper **/
function textNode(str) { return document.createTextNode(str); }
function element(type,clss) { var e = document.createElement(type); if(clss) { e.className=clss; } return e; }
function plainElement(type, text) { var e = element(type); e.appendChild(document.createTextNode(text)); return e; }
function createLabel(forid, text) {	var l = plainElement('label', text); l.setAttribute('for', forid); return l; }
function createInput(type, id, value) { i = document.createElement('input'); i.type=type; i.id=id; i.name=id; i.value=value; return i; }
function createTextArea(id, value) { var t = plainElement('textarea', value); t.id = id; return t; }
function createOption(value, label) { var o = plainElement('option',label); o.value = value; return o; }
/***********************
 * Form helper
 ***********************/
function getSelectedVal(selectNode) {
	var val = false;
	if (selectNode.nodeName.toLowerCase() == 'select') {
		var idx = selectNode.selectedIndex;
		if(idx > -1) {
			var val = selectNode.options[idx].value;
		}
	}
	return val;
}
function getSelectOptions(selectNode) {
	var val = false;
	if (selectNode.nodeName.toLowerCase() == 'select') {
		var val = new Array;

		for (i=0; i<selectNode.length; i++) {
			if (selectNode.options[i] && selectNode.options[i].value) {
				val.push(selectNode.options[i].value);
			}
		}
	}
	return val;
}
function setSelectVal(selectNode, val) {
	if (selectNode.nodeName.toLowerCase() == 'select') {
		for(var i=0; i<selectNode.options.length; i++) {
			var opt = selectNode.options[i];
			if(opt.value == val) {
				selectNode.options[selectNode.selectedIndex].selected = false;
				opt.selected = true;
				return;
			}
		}
	}
}

/** Table helper */
function getCellValue(td,deep) {
	var ret = '';
	while(deep && td &&  td.firstChild && !td.firstChild.nodeValue) {
		td = td.firstChild;
	}
	if(td && td.firstChild && td.firstChild.nodeValue) {
		var ret = trim(td.firstChild.nodeValue);
	}
	return ret;
}
function getCellValueNum(tr, n) {
	var cells = tr.getElementsByTagName('td');
	if( cells[n] ) {
		return getCellValue(cells[n], true)
	}	
}
function getCellClass(tr, n) {
	var cl = '';
	var cells = tr.getElementsByTagName('td');
	if( cells[n] ) {
		cl = cells[n].className;
	}
	return cl;
}
/**
 * Document coordinates 
 */
function getScrollTop() {
	var ret = 0;
	if (window.pageYOffset) {
		ret = window.pageYOffset;
	} else if (document.body.scrollTop) {
		ret = document.body.scrollTop;
	} else if (document.documentElement.scrollTop) {
		ret = document.documentElement.scrollTop;
	}
	return ret;	
}
function getDocHeight() {
	if (document.body && document.body.clientHeight) {
		ret = document.body.clientHeight;
	} else if (document.documentElement && document.documentElement.clientHeight) {
		ret = document.documentElement.clientHeight;
	}
	return ret;}
function getPosition(node){
	var left = 0;
	var top  = 0;
	while (node.offsetParent) {
		left += node.offsetLeft;
		top  += node.offsetTop;
		node     = node.offsetParent;
	}
	left += node.offsetLeft;
	top  += node.offsetTop;
	return {x:left, y:top};
}
function getDimensions(node) {
	var dim = getPosition(node);
	dim.h = node.offsetHeight;
	dim.w = node.offsetWidth;
	return dim;
}
function mouseCoords(ev){
	if(ev.pageX || ev.pageY){
		return {x:ev.pageX, y:ev.pageY};
	}
	return {
		x:ev.clientX + document.body.scrollLeft - document.body.clientLeft,
		y:ev.clientY + document.body.scrollTop  - document.body.clientTop
	};
}
function getMouseOffset(target, ev){
	var docPos    = getPosition(target);
	var mousePos  = mouseCoords(ev);
	return {x:mousePos.x - docPos.x, y:mousePos.y - docPos.y};
}

function in_array(needle, haystack) {
	for(var i=0; i<haystack.length; ++i) {
		if(haystack[i]==needle) {
			return true;
		}
	}
	return false;
}

