function $()
{
	var elements = new Array();
	for(var i = 0; i < arguments.length; i++)
	{
		var element = arguments[i];
		if (typeof element == 'string')
			element = document.getElementById(element);
		if (arguments.length == 1)
			return element;
		elements.push(element);
	}
	return elements;
}

function isDOM()
{
	if(document.getElementById) return true;
	else return false;
}

function insertAfter(node, referenceNode)
{
	referenceNode.parent.insertBefore(node, referenceNode.nextSibling);
}

Array.prototype.inArray = function(value) {
	var i;
	for (i=0; i < this.length; i++) {
		if (this[i] === value) {
			return true;
		}
	}
	return false;
};

function getElementsByClass(searchClass,tag,node)
{
	var classElements = new Array();
	if(node==null) node = document;
	if(tag==null) tag = '*';
	var els = node.getElementsByTagName(tag);
	var elsLen = els.length;
	var pattern = new RegExp("(^|\s)"+searchClass+"(\s|$)");
	for(i = 0,j = 0;i < elsLen; i++)
	{
		if(pattern.test(els[i].className))
		{
			classElements[j] = els[i];
			j++;
		}
	}
	return classElements;
}

function getPageDimensions()
{
	var body = document.getElementsByTagName("body")[0];
	var pageDimensions = [0, 0];
	if(typeof document.documentElement!="undefined" && typeof document.documentElement.scrollWidth!="undefined")
	{
		pageDimensions[0]=document.documentElement.scrollWidth;
		pageDimensions[1]=document.documentElement.scrollHeight;
	}
	if(body.offsetWidth > pageDimensions[0]) pageDimensions[0]=body.offsetWidth;
	if(body.offsetHeight > pageDimensions[1]) pageDimensions[1]=body.offsetHeight;
	if(body.scrollWidth > pageDimensions[0]) pageDimensions[0]=body.scrollWidth;
	if(body.scrollHeight > pageDimensions[1]) pageDimensions[1]=body.scrollHeight;
	return pageDimensions;
}

function getScrollingPosition()
{
	var position = [0, 0];
	if(typeof window.pageYOffset != 'undefined')
		position = [window.pageXOffset,window.pageYOffset];
	if(typeof document.documentElement.scrollTop != 'undefined' && document.documentElement.scrollTop > 0)
	    position = [document.documentElement.scrollLeft,document.documentElement.scrollTop];
	else if(typeof document.body.scrollTop != 'undefined')
		position = [document.body.scrollLeft,document.body.scrollTop];
	return position;
}

function getPosition(el)
{
    var x,y = 0;
	while (el != null)
	{
		x += el.offsetLeft;
		y += el.offsetTop;
		el = el.offsetParent;
	}
	return [isNaN(x)?0:x,isNaN(y)?0:y];
}

function getViewportSize()
{
	var size=[0,0];
	if(typeof window.innerWidth!='undefined') size=[window.innerWidth,window.innerHeight];
	else if(typeof document.documentElement!='undefined' && typeof document.documentElement.clientWidth!='undefined' && document.documentElement.clientWidth!=0) size=[document.documentElement.clientWidth,document.documentElement.clientHeight];
	else size=[document.getElementsByTagName('body')[0].clientWidth,document.getElementsByTagName('body')[0].clientHeight];
	return size;
}

function getCursorPosition(event)
{
	if(typeof event == "undefined") event = window.event;
	var scrollingPosition = getScrollingPosition();
	var cursorPosition = [0, 0];

	if(typeof event.pageX!="undefined" && typeof event.x!="undefined")
	{
		cursorPosition[0] = event.pageX;
		cursorPosition[1] = event.pageY;
	}
	else
	{
		cursorPosition[0] = event.clientX + scrollingPosition[0];
		cursorPosition[1] = event.clientY + scrollingPosition[1];
	}
	return cursorPosition;
}

function detachEventListener(target, eventType, functionRef, capture)
{
	if(typeof target.removeEventListener != "undefined")
		target.removeEventListener(eventType, functionRef, capture)
	else if (typeof target.detachEvent != "undefined")
		target.detachEvent("on" + eventType, functionRef);
	else
		target["on" + eventType] = null;
	return true;
}

function getEventTarget(event,tag)
{
	var target= null;
	if (typeof event.target != "undefined") target= event.target;
    else target= event.srcElement;
    while(target.nodeType == 3 && target.parentNode != null) target= target.parentNode;
	if(tag)
	{
		while(target.nodeName.toLowerCase() != tag) target= target.parentNode;
	}
	return target;
}

function attachEventListener(target, eventType, functionRef, capture)
{
	if (typeof target.addEventListener != "undefined")
		target.addEventListener(eventType, functionRef, capture);
	else if (typeof target.attachEvent != "undefined")
		target.attachEvent("on" + eventType, functionRef);
	else
	{
		eventType = "on" + eventType;
		if(typeof target[eventType] == "function")
		{
			var oldListener = target[eventType];
			target[eventType] = function()
			{
				oldListener();
				return functionRef();
			}
		}
		else
			target[eventType] = functionRef;
	}
	return true;
}

function stopDefaultAction(event)
{
	event.returnValue = false;
	if(typeof event.preventDefault != "undefined")
        event.preventDefault();
    return true;
}

function addLoadListener(fn)
{
	if(typeof window.addEventListener != 'undefined') window.addEventListener('load', fn, false);
	else if(typeof document.addEventListener != 'undefined') document.addEventListener('load', fn, false);
	else if (typeof window.attachEvent != 'undefined') window.attachEvent('onload', fn);
	else
	{
		var oldfn = window.onload;
		if(typeof window.onload != 'function') window.onload = fn;
		else
		{
			window.onload = function() {
				oldfn();
				fn();
			};
		}
	}
}

function retrieveComputedStyle(element, styleProperty)
{
	var computedStyle = null;
	if(typeof element.currentStyle != "undefined") computedStyle = element.currentStyle;
	else computedStyle = document.defaultView.getComputedStyle(element, null);
	return computedStyle[styleProperty];
}