function $ (e)
{
	return document.getElementById(e);
}
getElementsByClassName = function()
{
	if (document.getElementsByClassName) 
	{
		return function (className, tag, elm) 
		{
			elm = elm || document;
			
			var elements = elm.getElementsByClassName(className),
			
			nodeName = (tag)? new RegExp("\\b" + tag + "\\b", "i") : null,
			
			returnElements = [],
			current;
			
			for(var i=0, il=elements.length; i<il; i+=1) 
			{
				current = elements[i];
				if(!nodeName || nodeName.test(current.nodeName))
				{
					returnElements.push(current);
				}
			}
			return returnElements;
		}; 
	}
	else if (document.evaluate) 
	{
		return function (className, tag, elm) 
		{
			tag = tag || "*";
			elm = elm || document;
			
			var classes = className.split(" "),
			classesToCheck = "",
			xhtmlNamespace = "http://www.w3.org/1999/xhtml",
			namespaceResolver = (document.documentElement.namespaceURI === xhtmlNamespace)? xhtmlNamespace : null,
			returnElements = [],
			elements,
			node;
			
			for(var j=0, jl=classes.length; j<jl; j+=1)
			{
				classesToCheck += "[contains(concat(' ', @class, ' '), ' " + classes[j] + " ')]";
			}
			try 
			{
				elements = document.evaluate(".//" + tag + classesToCheck, elm, namespaceResolver, 0, null);
			}
			catch (e) 
			{
				elements = document.evaluate(".//" + tag + classesToCheck, elm, null, 0, null);
			}
			while ((node = elements.iterateNext())) 
			{
				returnElements.push(node);
			}
			
			return returnElements;
		};
	}
	else 
	{
		return function (className, tag, elm) 
		{
			tag = tag || "*";
			elm = elm || document;
			
			var classes = className.split(" "),
			classesToCheck = [],
			elements = (tag === "*" && elm.all)? elm.all : elm.getElementsByTagName(tag),
			current,
			returnElements = [],
			match;
			
			for(var k=0, kl=classes.length; k<kl; k+=1)
			{
				classesToCheck.push(new RegExp("(^|\\s)" + classes[k] + "(\\s|$)"));
			}
			
			for(var l=0, ll=elements.length; l<ll; l+=1)
			{
				current = elements[l];
				match = false;
				
				for(var m=0, ml=classesToCheck.length; m<ml; m+=1)
				{
					match = classesToCheck[m].test(current.className);
					if (!match) 
					{
						break;
					}
				}
				
				if (match) 
				{
					returnElements.push(current);
				}
			}
			return returnElements;
		};
	}
}();

function $ (e)
{
	return document.getElementById(e);
}

var Utils = {

	_setClass : function (obj, classStr)
	{
		obj.setAttribute('class', classStr);
		obj.setAttribute('className', classStr);
	},
	
	hasClass: function(element, classname) {
		var cl, c;
		
		c = element.getAttribute('class');
		if(!c) {
			return false;
		}
		
		cl = c.split(' ');
		for(var i = 0; i < cl.length; ++i) {
			if(cl[i] == classname) {
				return true;
			}
		}
		return false;
	},
	
	addClass: function(element, classname) {
		if(!Utils.hasClass(element, classname)) {
			var newcl = element.getAttribute('class');
			// It can be null.
			if(typeof newcl != 'string' || newcl === '') {
				newcl = classname;
			}
			else {
				newcl += ' ' + classname;
			}
			
			element.setAttribute('class', newcl);
			if(navigator.appName.indexOf('MSIE') != -1) {
				element.setAttribute('className', newcl);
			}
			return true;
		}
		else {
			return false;
		}
	},
	
	_doRegisterEvent: function(element, event, callback, data) {
		if(element.addEventListener) {
			element.addEventListener(event, function(e) { callback(e, data); }, false);
		}
		else {
			element.attachEvent('on' + event, function(e) { if(!e) e = window.event; callback(e, data); });
		}
	},
	_getElementPos : function (obj) {
		var curleft = curtop = 0;
		if (obj.offsetParent) {
			curleft = obj.offsetLeft
			curtop = obj.offsetTop
			while (obj = obj.offsetParent) {
				curleft += obj.offsetLeft
				curtop += obj.offsetTop
			}
		}
		return [curleft,curtop];
	},
	
	_getSrcElement : function (evt)
	{
		if (evt.srcElement)
			return evt.srcElement;
		else
			return evt.currentTarget;
	},

	_getComputedWidth : function (element)
	{
		if (navigator.userAgent.indexOf('MSIE') != -1)
		{
			return document.getElementById(element).offsetWidth;
		}
		else
		{
		  var tmpWidth1 = document.defaultView.getComputedStyle(element, "").getPropertyValue("width");
		                tmpWidth = tmpWidth1.split('px');
		                tmpWidth = tmpWidth[0];
			return tmpWidth;
		}
	},
	
	getClone : function(element) 
	{
		// This function isn't needed for anything that isn't an "object".
		if(typeof element != 'object') {
			return element;
		}
		
			var vars = {};
			for(var key in element) {
				vars[key] = element[key];
			}
			return vars;

	}
};