	function getParentNode(element, level)
	{
		var i;
		for(i=0; i<level; i++)
			element = element.parentNode;
		return element;
	}

	function getChildNode(element, level)
	{
		var i;
		for(i=0; i<level; i++)
			element = element.firstChild;
		return element;
	}

	function showDialog(url, width, height, name, newWindow)
	{
		if(name == undefined)
			name = "";
		if(newWindow == true)
		{
			window.open(url, name, "width="+width+", height="+height+", left="+(document.body.clientWidth-width)/2+", top="+(document.body.clientHeight+200-height)/2+", toolbar=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=no");
		}
		else if(window.showModalDialog)
		{
			window.showModalDialog(url, name, "dialogWidth:"+width+"px;dialogHeight:"+height+"px");
		}
		else
		{
			window.open(url, name, "width="+width+", height="+height+", left="+(document.body.clientWidth-width)/2+", top="+(document.body.clientHeight+200-height)/2+", toolbar=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=no, modal=yes");
		}
	}

	function makeHttpRequest(url, callback_function, return_xml, method, parameter, async, callback_value)
	{
		var http_request = false;

		if(method == undefined)
			method = "GET";
		if(parameter == undefined)
			parameter = null;
		if(async == undefined)
			async = true;
		if(callback_value == undefined)
			callback_value = "";
		else callback_value = ", "+callback_value;

		var now=new Date();
		if(window.XMLHttpRequest)
		{
			http_request = new XMLHttpRequest();
			if(http_request.overrideMimeType)
				http_request.overrideMimeType('text/xml [15]');
		}
		else if(window.ActiveXObject)
		{
			try{
				http_request = new ActiveXObject("Msxml2.XMLHTTP");
			}catch (e){try{
				http_request = new ActiveXObject("Microsoft.XMLHTTP");
			}catch (e){}}
		}

		http_request.onreadystatechange=function()
		{
			if(http_request.readyState==4)
				if(http_request.status==200)
				{
					try
					{
						if(return_xml)
							eval(callback_function+"(http_request.responseXML"+callback_value+")");
						else eval(callback_function+"(http_request.responseText"+callback_value+")");
					}
					catch (e){}
				}
		}

		if(url.indexOf("?")<0)
			url+="?time="+now.getTime();
		else url+="&time="+now.getTime();

		http_request.open(method, url, async);
		if(method == "POST")
		{
			http_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
			//http_request.setRequestHeader("Content-length", parameters.length);
			//http_request.setRequestHeader("Connection", "close");
		}
		http_request.send(parameter);

		if(!async)
		{
			try
			{
				if(return_xml)
					eval(callback_function+"(http_request.responseXML"+callback_value+")");
				else eval(callback_function+"(http_request.responseText"+callback_value+")");
			}
			catch (e){}
		}
	}

	function arrList()
	{
		this.list = new Array();
	}
	arrList.prototype.count = function()
	{
		return this.list.length;
	}
	arrList.prototype.add = function(item)
	{
		return this.list.push(item);
	}
	arrList.prototype.getAt = function(index)
	{
		if(index >= 0 && index < this.list.length)
			return this.list[index];
		return undefined;
	}
	arrList.prototype.clear = function()
	{
		this.list = new Array();
	}
	arrList.prototype.remove = function(item)
	{
		var index = this.indexOf(item);
		this.removeAt(index);
		return index;
	}
	arrList.prototype.removeAt = function(index)
	{
		var length = this.list.length;
		if(length == 0 || index < 0 || index >= length)
			return false;
		if(index == 0)
		{
			this.list.shift();
			return true;
		}
		if(index == length - 1)
		{
			this.list.pop();
			return true;
		}
		this.list = this.list.slice(0,index).concat(this.list.slice(index+1));
		return true;
	}
	arrList.prototype.insert = function(item,index)
	{
		var length = this.list.length;
		if(index < 0 || index > length)
			return -1;
		if(index == 0)
		{
			this.list.unshift(item);
			return 0;
		}
		if(index == length)
		{
			this.list.push(item);
			return length;
		}
		var tmp = this.list.slice(0,index);
		tmp.push(item);
		this.list = tmp.concat(this.list.slice(index));
		return index;
	}
	arrList.prototype.indexOf = function (item,start)
	{
		if(start == undefined)
			start = 0;
		var i;
		for(i=start;i<this.list.length;i++)
			if(this.list[i] == item)
				return i;
		return -1;
	}

	function hashTable()
	{
		this.key = new arrList();
		this.value = new arrList();
	}
	hashTable.prototype.containsKey = function(key)
	{
		if(this.key.indexOf(key)<0)
			return false;
		return true;
	}
	hashTable.prototype.get = function(key)
	{
		return this.value.getAt(this.key.indexOf(key));
	}
	hashTable.prototype.put = function(key,value)
	{
		this.key.add(key);
		this.value.add(value);
	}
	hashTable.prototype.remove = function(key)
	{
		var value = this.value.getAt(this.key.indexOf(key));
		this.value.removeAt(this.key.remove(key));
		return value;
	}

	var equalHeight = new function()
	{
		this.list = new arrList();

		this.run = function()
		{
			var i, j;
			for(i=0; i<equalHeight.list.count(); i++)
			{
				var arr = equalHeight.list.getAt(i);
				var max = 0;

				for(j=0; j<arr.length; j++)
					if(max < document.getElementById(arr[j]).offsetHeight)
						max = document.getElementById(arr[j]).offsetHeight;

				for(j=0; j<arr.length; j++)
					document.getElementById(arr[j]).height = max;
			}
		}
	}

	function getItemValue(obj)
	{
		try
		{
			while(obj.nodeType != 3)
				obj = obj.firstChild;
			return obj.nodeValue;

			//return = obj.innerHTML;

			//return = obj.firstChild.nodeValue;
		}
		catch (e){}
		return "";
	}

	function strcmp(a, b, ASC)
	{
		var i;
		for(i=0;i<a.length && i<b.length;i++)
		{
			if(a.charAt(i) < b.charAt(i))
				return ASC;
			if(a.charAt(i) > b.charAt(i))
				return !ASC;
		}

		if(i<a.length)
			return ASC;
		return !ASC;
	}

	var sortTable_lastTable		= null;
	var sortTable_lastOrderBy	= null;
	var sortTable_lastASC		= true;

	function sortTable(table, orderBy, ASC)
	{
		if(ASC == undefined)
		{
			if(sortTable_lastTable == table && sortTable_lastOrderBy == orderBy)
			{
				ASC = sortTable_lastASC;
				sortTable_lastASC = !ASC;
			}
			else
			{
				sortTable_lastTable		= table;
				sortTable_lastOrderBy	= orderBy;
				sortTable_lastASC		= true;
			}
		}
		else
		{
			sortTable_lastTable		= null;
			sortTable_lastOrderBy	= null;
			sortTable_lastASC		= true;
		}

		var tbodyElement = document.getElementById(table).firstChild;

		var i,j;
		for(i=2;i<tbodyElement.childNodes.length;i++)
		{
			for(j=i-1;j>0;j--)
			{
				var item_a = getItemValue(tbodyElement.childNodes.item(j).childNodes.item(orderBy));//tbodyElement.childNodes.item(j).childNodes.item(orderBy).firstChild.nodeValue;
				var item_b = getItemValue(tbodyElement.childNodes.item(j+1).childNodes.item(orderBy));//tbodyElement.childNodes.item(j+1).childNodes.item(orderBy).firstChild.nodeValue;

				if(strcmp(item_a, item_b, ASC))
				{
					//tbodyElement.insertBefore(tbodyElement.childNodes.item(j+1), tbodyElement.childNodes.item(j));

					var tmpElement = null;

					var firstTdElement = tbodyElement.childNodes.item(j).firstChild;
					var secondTdElement = tbodyElement.childNodes.item(j+1).firstChild;
					while(firstTdElement != null)
					{
						tmpElement = firstTdElement.innerHTML;
						firstTdElement.innerHTML = secondTdElement.innerHTML;
						secondTdElement.innerHTML = tmpElement;

						firstTdElement = firstTdElement.nextSibling;
						secondTdElement = secondTdElement.nextSibling;
					}
				}
				else break;
			}
		}
	}

	function sortTableClass(table, orderBy, ASC, delay, type)
	{
		this.tbodyElement = document.getElementById(table).firstChild;
		this.orderBy = orderBy;
		this.delay = delay;
		this.ASC = ASC;

		this.i = 0;
		this.j = 0;

		if(type == undefined)
			this.type = "insertion";
		else this.type = type;

		this.timeOut = null;
	}

	var sortTableDelay = new function()
	{
		this.sortArr = new hashTable();

		this.sort = function(table, orderBy, ASC, delay, type)
		{
			if(sortTableDelay.sortArr.containsKey(table))
				sortTableDelay.remove(table);

			var sortTableObj = new sortTableClass(table, orderBy, ASC, delay, type);
			sortTableDelay.sortArr.put(table, sortTableObj);

			sortTableDelay.runSort(table);
		}

		this.runSort = function(table)
		{
			var sortTableObj = sortTableDelay.sortArr.get(table);

			if(sortTableObj.type == "insertion")
			{
				if(sortTableObj.j == 0)
				{
					if(sortTableObj.i == 0)
						sortTableObj.i = 1;

					sortTableObj.i++;
					sortTableObj.j = sortTableObj.i-1;

					if(sortTableObj.i == sortTableObj.tbodyElement.childNodes.length)
					{
						sortTableDelay.remove(table);
						return;
					}
				}

				var item_a = getItemValue(sortTableObj.tbodyElement.childNodes.item(sortTableObj.j).childNodes.item(sortTableObj.orderBy));//sortTableObj.tbodyElement.childNodes.item(sortTableObj.j).childNodes.item(sortTableObj.orderBy).firstChild.nodeValue;
				var item_b = getItemValue(sortTableObj.tbodyElement.childNodes.item(sortTableObj.j+1).childNodes.item(sortTableObj.orderBy));//sortTableObj.tbodyElement.childNodes.item(sortTableObj.j+1).childNodes.item(sortTableObj.orderBy).firstChild.nodeValue;

				if(strcmp(item_a, item_b, sortTableObj.ASC))
				{
					sortTableObj.tbodyElement.insertBefore(sortTableObj.tbodyElement.childNodes.item(sortTableObj.j+1), sortTableObj.tbodyElement.childNodes.item(sortTableObj.j));
					sortTableObj.j--;

					sortTableObj.timeOut = setTimeout("sortTableDelay.runSort('"+table+"')", sortTableObj.delay);
				}
				else
				{
					sortTableObj.j = 0;

					sortTableDelay.runSort(table);
				}
			}
		}

		this.remove = function(table)
		{
			if(sortTableDelay.sortArr.get(table).timeOut != null)
				clearTimeout(sortTableDelay.sortArr.get(table).timeOut);
			sortTableDelay.sortArr.remove(table);
		}
	}

	function setCookie(NameOfCookie, value, expiredays)
	{
		var ExpireDate = new Date ();
		var indexS = window.location.href.indexOf("#");
		var oldlocation = window.location.href;
		if (indexS != -1) {
			oldlocation = window.location.href.substring(0, indexS);	
		}
		ExpireDate.setTime(ExpireDate.getTime() + (expiredays * 24 * 3600 * 1000));
		document.cookie = NameOfCookie + '=' + escape(value) + ((expiredays == null) ? "" : "; expires=" + ExpireDate.toGMTString());
		window.location.href = oldlocation;
	}