// by id
function $(id)
{
	return document.getElementById(id);
}

// get by tag
function byTag(tag, obj)
{
	return (obj || document).getElementsByTagName(tag);
}

function create(el)
{
	return document.createElement(el);
}

// extend objects
function extend(obj, props, force)
{
	for (var x in props) {
		if (typeof(obj[x]) == "undefined" || force) {
			obj[x] = props[x];
		}
	}
}

// returns objs document co-ordinates
function position(obj, type)
{
	type = type.toLowerCase().ucFirst();
	var orig = obj;
	var retval = 0;
	if (type == "Left" && obj.x) {
		return obj.x;
	}
	else if (type == "Top" && obj.y) {
		return obj.y;
	}
	else {
		var useType = (type == "Left" || type == "Right" || type == "Center") ? "Left" : "Top";
		while (obj.offsetParent) {
			//if (obj && obj.style && obj.style.position) obj.style.position = "relative";
			retval += eval("obj.offset" + useType);
			obj = obj.offsetParent;
		}
		switch (type) {
			case "Center" : return retval + (orig.offsetWidth / 2); break;
			case "Right" : return retval + (orig.offsetWidth); break;
			default: return retval;
		}			
	}
	return false;

}


// Add easier event handling
if (! window.Event) {
	var Event = {};
}

// Event object extending
var ev = {
	
	get: function(e)
	{
		return (! e) ? window.event : e;
	},

	target: function(e)
	{
		e = this.get(e);
		return (e.target) ? e.target : (e.srcElement) ? e.srcElement : false;
	},

	add: function(elm, evType, fn, useCapture)
	{
		// cross-browser event handling for IE5+, NS6 and Mozilla By Scott Andrew
		if (elm.addEventListener) {
			elm.addEventListener(evType, fn, useCapture);
			return elm;
		} 
		else if (elm.attachEvent) {
			var r = elm.attachEvent('on' + evType, fn);
			return elm;
		} 
		else {
			elm['on' + evType] = fn;
			return elm;
		}	
	},
		
	key: function(e)
	{
		e = this.get(e);
		return (e.keyCode) ? e.keyCode : (e.which) ? e.which : e.charCode;
	},
		
	stop: function(e)
	{
		e = this.get(e);
		if (document.all) {
			e.returnValue = false;
			e.cancelBubble = true;
		}
		else {
			e.preventDefault();
			e.stopPropagation();
		}		
	}
	
};
extend(Event, ev);

// uppercase first letter
String.prototype.ucFirst = function() {
	return this.substring(0,1).toUpperCase() + this.substring(1);
};

// Array extensions
Array.prototype.search = function(value, offset) {
	if (typeof(offset) == "undefined") {
		offset = 0;
	}
	for (var q = offset, l = this.length; q < l; q ++) {
		if (this[q] == value || this[q].match(value)) {
			return q;
		}
	}
	return -1;
};

Array.prototype.has = function(value) {
	return (this.search(value) != -1);
};

Array.prototype.walk = function(func) {
	for (var x = 0, l = this.length; x < l; x ++) {
		func(this[x]);
	}
};