var $GLOBAL = new Object();
$GLOBAL['loadFunctions'] = new Array();

function addEvent(elm, evType, fn, useCapture)
{
	if (elm.addEventListener)
	{
		elm.addEventListener(evType, fn, useCapture);
		return true;
	}
	else if (elm.attachEvent)
	{
		var r = elm.attachEvent('on' + evType, fn);
		return r;
	}
	else
	{
		elm['on' + evType] = fn;
	}
}

function addEvents(elms, evType, fn, useCapture)
{
	for (var i = 0; i < elms.length; i++)
	{
		addEvent(elms[i], evType, fn, useCapture);
	}
}

function getElement(e)
{
	var el;
	if (window.event && window.event.srcElement)
	{
		el = window.event.srcElement;
	}
	if (e && e.target)
	{
		el = e.target;
	}
	
	if (!el)
	{
		return false;
	}
	else
	{
		return el;
	}
}

function addLoadFunction(fn)
{
	if (typeof(fn) != "function")
	{
		alert("Error: You have tried to add a non-function to the load functions array.\nVariable Type: " + typeof(fn));
	}
	else
	{
		$GLOBAL['loadFunctions'][$GLOBAL['loadFunctions'].length] = fn;
	}
}

addEvent(window, 'load', callLoadFunction, false);

function callLoadFunction()
{
	for (var i = 0; i < $GLOBAL['loadFunctions'].length; i++)
	{
		$GLOBAL['loadFunctions'][i]();
	}
}


// Useful Functions

function isArray(obj)
{
	return obj.constructor == Array;
}

// Dom Functions

function $bodyWidth()
{
	var width;
	if (!(width = window.innerWidth))
	{
		if (!(width = document.body.clientWidth))
		{
			width = false;	
		}
	}
	
	return width;

}

function $bodyHeight()
{
	var height;
	if (!(height = window.innerHeight))
	{
		
		if (!(height = document.body.clientHeight))
		{
			height = false;	
		}
	}
	
	return height;

}

function $body()
{
	return $tag('body')[0];
}

function $head()
{
	return $tag('head')[0];
}

function $id(id)
{
	return document.getElementById(id);
}

function $name(form, name)
{
	var retArr = new Array();
	for (var i = 0; i < form.elements.length; i++)
	{
		if (form.elements[i].name == name)
		{
			retArr.push(form.elements[i]);
		}
	}
	if (retArr.length < 1)
	{
		return false;
	}
	if (retArr.length == 1)
	{
		return retArr[0];	
	}
	else
	{
		return retArr;
	}
}

function $tag(tn)
{
	return document.getElementsByTagName(tn);
}

function $tagAndClass(tn, cn)
{
	var elements = $tag(tn);
	var retArr = new Array();
	for(var i = 0; i < elements.length; i++)
	{
		if ($class(elements[i], cn))
		{
			retArr.push(elements[i]);
		}
	}
	return retArr;
}

function $class(el, cn)
{
	var classes = el.className.split(' ');
	var retVal = false;
	for(var i = 0; i < classes.length; i++)
	{
		if (classes[i] == cn)
		{
			retVal = true;	
		}
	}
	return retVal;
}

function $addClass(el, cn)
{
	var classes = el.className.split(' ');
	classes.push(cn);
	if (el.className = classes.join(' '))
	{
		return true;
	}
	else
	{
		return false;
	}
}

function $removeClass(el, cn)
{
	var newClass = new Array();
	
	var classes = el.className.split(' ');
	for (var i = 0; i < classes.length; i++)
	{
		if (classes[i] != cn)
		{
			newClasses.push(classes[i]);
		}
	}
	
	if (el.className = newClasses.join(' '))
	{
		return true;
	}
	else
	{
		return false;
	}
}

function $switchClass(el, cnOut, cnIn)
{
	$removeClass(el, cnOut);
	$addClass(el, cnIn);
}

function $create(type)
{
	return document.createElement(type);
}

function $text(string)
{
	return document.createTextNode(string);
}

function $insertAfter(refNode, node)
{
    refNode.parentNode.insertBefore(node, refNode.nextSibling);
}

function $insertBefore(refNode, node)
{
	refNode.parentNode.insertBefore(node, refNode);
}

function $remove(node)
{
	node.parentNode.removeChild(node);
}

function $preventDefault(e)
{
	if (window.event)
	{
		window.event.returnValue = false;
	}
	else if (e && e.preventDefault)
	{
		e.preventDefault();
	}
	else
	{
		return false;
	}
}

function $loadCSS()
{
	var args = $loadCSS.arguments;
	for (var i = 0; i < args.length; i++)
	{
		var css = $create('link');
		css.href = args[i];
		css.type = 'text/css';
		css.rel = 'stylesheet';
		css.media = 'screen';
		$insertAfter($head().lastChild, css);
	}
}

