function $i(s, p) {
	return (p || document).getElementById(s);
}

function $t(t, p) {
	return (p || document).getElementsByTagName(t || "*");
}

function $c(c, t, p) {
	var a = [];
	var ts = $t(t, p);
	var r = new RegExp("\\b" + c + "\\b");
	for (var i = 0, t; t = ts[i]; i++) {
		if (t.className.match(r)) {
			a.push(t);
		}
	}
	return a;
}

var Class = {
	add: function (o, c) {
		var cn = o.className;
		var m = new RegExp("\\b" + c + "\\b", "i").exec(cn);
		if (!m) {
			o.className += (cn.length > 0 ? " " : "") + c;
		}
	},
	del: function (o, c) {
		var cn = o.className;
		var m = new RegExp("\\b" + c + "\\b", "i").exec(cn);
		if (m) {
			o.className = (cn.replace(new RegExp(m), ""));
		}
	},
	
	get: function(o) {
		return o.className.match(/\b\w+\b/g);
	}
};

Function.bind = function(f, o) {
	var a;
	if (arguments.length > 0) {
		a = $a(arguments).slice(2, arguments.length);
	}
	for (var i = 0, l = Function.bind.cache.length; i < l; i++) {
		var fn = Function.bind.cache[i];
		if (fn.fnct == f && fn.obj == o && fn.args.length == a.length) {
			var t = true;
			for (var j = 0, a1, a2; (a1 = fn.args[j]) && (a2 = a[j]); j++) {
				t = a1 == a2;
				if (!t) {
					break;
				}
			}
			if (t) {
				return fn.method;
			}
		}
	}
	var fn = {
		fnct: f,
		obj: o,
		args: a,
		method: function() {
			return f.apply(o, (a ? a.concat($a(arguments)) : arguments));
		}
	};
	Function.bind.cache.push(fn);
	return fn.method;
};

Function.bind.cache = [];

function $a(a) {
	var r = new Array();
	for (var i = 0, l = a.length; i < l; i++) {
		r.push(a[i]);
	}
	return r;
}

if (!Event) {
	var Event = {};
}

Event.attach = function (o, t, f, fc, c, a) {
	var fn = Function.bind(f, (fc || o));
	var z = o["_on" + t];
	if (z) {
		o["_on" + t] = function() {
			var f1 = z.apply(this, arguments);
			var f2 = fn.apply(this, arguments);
			return ((f1 !== false ? true : false) && (f2 !== false ? true : false));
		};
	} else {
		var h = Function.bind(Event.handle, Event, fn, a);
		if (o.addEventListener) {
			o.addEventListener(t, h, (c ? true : false));
		} else {
			o.attachEvent("on" + t, h);
		}
	}
};

Event.detach = function(o, t, f, fc, c, a) {
	var fn = Function.bind(f, (fc || o));
	var z = o["_on" + t];
	if (!z) {
		var h = Function.bind(Event.handle, Event, fn, a);
		if (o.removeEventListener) {
			o.removeEventListener(t, h, (c ? true : false));
		} else {
			o.detachEvent("on" + t, h);
		}
	}
};

Event.handle = function(f, as, e) {
	if (!e) {
		e = window.event;
	}
	if (!e.preventDefault) {
		e.preventDefault = function() {
			this.returnValue = false;
		};
	}
	if (!e.stopPropagation) {
		e.stopPropagation = function() {
			this.cancelBubble = true;
		};
	}
	if (!e.target && e.srcElement) {
		e.target = e.srcElement;
		if (e.type == "onmouseout") {
			e.relatedTarget = e.toElement;
		} else if (e.type == "onmouseover") {
			e.relatedTarget = e.fromElement;
		}
	}
	if (!e.detail && e.wheelDelta) {
		e.detail = e.wheelDelta * -1;
	}
	if (as) {
		for (var i = 0, a; a = as[i]; i++) {
			switch(a) {
				case Event.actions.PREVENTDEFAULT:
					e.preventDefault();
					break;
				
				case Event.actions.STOPPROPAGATION:
					e.stopPropagation();
					break;
			}
		}
	}
	f(e);
};

Event.actions = {
	PREVENTDEFAULT: 1,
	STOPPROPAGATION: 2
};

function Tabs(p, c) {
	this.parent = p;
	this.tabs = [];
	var as = (c ? $c(c, "a", p) : $t("a", p));
	for (var i = 0, a; a = as[i]; i++) {
		this.tabs.push(new Tab(a));
		Event.attach(a, "click", this.click, this, null, [ Event.actions.PREVENTDEFAULT ]);
	}
}

Tabs.re = /\bselected\b/i;

Tabs.prototype = {
	setContent: function(a, c, n) {
		for (var i = 0, t; t = this.tabs[i]; i++) {
			if (t.anchor == a) {
				t.content = c;
				t.name = n;
				break;
			}
		}
	},
	click: function(e) {
		var t = e.target;
		if (t.blur) {
			t.blur();
		}
		var s = this.select(t);
		this.change(s.newTab, s.oldTab);
	},
	change: function(n, o) {
		this._onchange(n, o);
	},
	_onchange: function(n, o) {},
	current: null,
	select: function(n) {
		var oldTab, newTab;
		this.current = n;
		for (var i = 0, t; t = this.tabs[i]; i++) {
			var a = t.anchor;
			var c = t.content;
			var m = Tabs.re.exec(a.parentNode.className);
			if (m) {
				o = a;
			}
			if ((a == n && !m) || (a != n && m)) {
				
				Class[a == n ? "add" : "del"](a.parentNode, "selected");
				if (c) {
					Class[a == n ? "add" : "del"](c, "selected");
				}
			}
		}
		return o;
	},
	selectName: function(n) {
		for (var i = 0, t; t = this.tabs[i]; i++) {
			if (t.name == n) {
				this.select(t.anchor);
				break;
			}
		}
	},
	clear: function() {
		for (var i = 0, t; t = this.tabs[i]; i++) {
			Class.del(t.anchor.parentNode, "selected");
			var c = t.content;
			if (c) {
				Class.del(c, "selected");
			}
		}
	}
};

function Tab(a, c, n) {
	this.anchor = a;
	this.content = c;
	this.name = n;
}
