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;


}