function byId(id) { return document.getElementById(id); }

function byTag(element, tag, toArray) {
	if (typeof element == 'string') { element = byId(element) }
	if (!toArray) { return element.getElementsByTagName(tag); }

	var a = element.getElementsByTagName(tag), l = a.length, i = 0,
		result = Array.prototype.slice.call(a, 0);

	if (l && !result[0]) { for (; i < l; i++) { result[i] = a[i]; } }
	return result;
}

function byTagAndClass(element, tag, klass) {
	klass = classRegExp(klass);

	for (var i = 0, a = byTag(element, tag), l = a.length, r = new Array; i < l; i++) {
		if (a[i].className.match(klass)) { r[r.length] = a[i]; }
	}

	return r;
}

function parentByTag(element, tag, isSelf) {
	if (typeof element == 'string') { element = byId(element) }
	if (!isSelf) { element = element.parentNode; }

	tag = tag.toUpperCase();
	while (element && element != document && element.nodeName != tag)
	{ element = element.parentNode; }

	return element == document ? null : element;
}

function parentByClass(element, klass, isSelf) {
	if (typeof element == 'string') { element = byId(element) }
	if (!isSelf) { element = element.parentNode; }

	klass = classRegExp(klass);
	while (element && element != document && !klass.test(element.className))
	{ element = element.parentNode; }

	return element == document ? null : element;
}

function addClass(element, klass) {
	if (!classRegExp(klass).test(element.className)) { element.className += ' '+ klass; }
}

function removeClass(element, klass) {
	if (typeof klass == 'string') { return removeClass(element, classRegExp(klass)); }
	if (klass.test(element.className)) { element.className = element.className.replace(klass, '$1'); }
}

function classRegExp(klass) { return new RegExp('(^|\\s+)'+ RegExp.escape(klass) +'($|\\s+)', 'g'); }

if (!RegExp.escape) {
	RegExp.escape = function (string) { return string.replace(arguments.callee.sRE, '\\$&'); }
	RegExp.escape.sRE = new RegExp('[\\/\\.\\*\\+\\?\\|\\(\\)\\[\\]\\{\\}\\\\]', 'g');
}

function object(target) { var fn = new Function; fn.prototype = target; return new fn; }
function extend(object, target) { for (var i in target) { object[i] = target[i]; } }

var Ease = new Object({
	cos: function (p) { return -Math.cos(p*Math.PI)/2 + .5; }
});

function Callback(fn, object) {
	this.fn = fn;
	this.object = object || null;
}

Callback.prototype = new Object({
	call: function () {
		try { return this.fn.apply(this.object, arguments); }
		catch (ex) { return this.throwExeption(ex); }
	},

	throwExeption: function (ex) {
		setTimeout(function(){ throw ex; }, 0);
		return false;
	}
});

var InitIt = new Array;
