/* Component Library
 * Core components (Arrays, DOM, Events)
 * by Dave Schontzler
 * (c) 2002, www.stilleye.com
 */

// Array Methods that may not be supported by older browsers
// return values from www.DevGuru.com reference sheets

// removes and returns last element of array
if(!Array.prototype.pop&&document.all)
{
	Array.prototype.pop = function()
	{
		var L, lastEl;
		if(this.length>0)
		{
			L = this.length-1;
			lastEl = this[L];
			this.length = L;
		}
		return lastEl;
	}
}

// adds 1 or more elements to an array (IE only)
if(!Array.prototype.push)
{
	Array.prototype.push =  function()
	{
		var i;
		for(i=0; j=arguments[i]; i++) this[this.length] = j;
		return this.length;
	}
}

// removes & returns 1st element in array
if(!Array.prototype.shift)
{
	Array.prototype.shift = function()
	{
		var L, firstEl, i;
		L = this.length;
		firstEl = this[0];
		for(i=1;i<L;i++) this[i-1] = this[i];
		delete this[L-1];
		return firstEl;
	}
}

// creates a new array from selection of another array
if(!Array.prototype.slice)
{
	Array.prototype.slice = function(begin,end)
	{
		var s, i;
		s = new Array();
		for(i=begin; i<(end?end:this.length); i++) s[s.length] = this[i];
		return s;
	}
}

// adds 1 or more elements to beginning of array
if(!Array.prototype.unshift)
{
	Array.prototype.unshift = function()
	{
		var a, L, i;
		a = arguments;
		L = this.length;
		for(i=0; i<L; i++) this[i+a.length] = this[i];
		for(i=0; a[i]; i++) this[i] = a[i];
		return this.length;
	}
}

String.prototype.isEmpty = function()
{
	var empty = false;
	if(this=="" || this.length==0) empty = true;
	return empty;
}


// DOM methods abbr and additions
Dom =
{
	is : document.getElementById && document.getElementsByTagName,
	
	getElm : function(id)
	{
		return document.getElementById(id);
	},
	
	getTags : function(tag)
	{
		return document.getElementsByTagName(tag);
	},
	
	getClass : function(cls)
	{
		var el, r, i;
		el = document.all ? document.all : document.getElementsByTagName('*');
		r = new Array();
		for(i=0; el[i]; i++) if(el[i].className == cls) r.push(el[i]);
		if(r.length==0) r = null;
		return r;
	},
	
	traceTree : function(id, reverse)
	{
		var elm, top, temp, i, tree;
		top = Dom.getTags('body').item(0);
		elm = Dom.getElm(id);
		
		tree = new Array();
		temp = elm;
		while(temp.parentNode!=top)
		{
			tree.push(temp);
			temp = temp.parentNode;
		}
		if(reverse) tree = tree.reverse();
		return tree;
	}
}


// Event methods
Event =
{
	mouse : function(e)
	{
		if(!e) e = event;
		this.x = e.clientX||0;
		this.y = e.clientY||0;
		this.layerX = (e.offsetX ? e.offsetX : e.layerX)||0;
		this.layerY = (e.offsetY ? e.offsetY : e.layerY)||0;
		return this;
	},
	
	fix : function(e)
	{
		e = e.srcElement || e.currentTarget;
		return e;
	},
	
	add : function(obj, evType, fn, useCapture)
	{
		if(typeof obj == "string") obj = Dom.getElm(obj);
		if(obj.addEventListener)
		{
			obj.addEventListener(evType, fn, useCapture);
			return true;
		}
		else if (obj.attachEvent) return obj.attachEvent("on"+evType, fn);
		else return null;
	},
	
	remove : function(obj, evType, fn, useCapture)
	{
		if(typeof obj == "string") obj = Dom.getElm(obj);
		if(obj.removeEventListener)
		{
			obj.removeEventListener(evType, fn, useCapture);
			return true;
		}
		else if (obj.detachEvent) return obj.detachEvent("on"+evType, fn);
		else return null;
	}
}
