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;
		}
	},

	remove: 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, c) {
		return o.className.match(new RegExp("\\b" + c + "\\b"));
	}
};
function Coordinate(e) {
	this.x = (e.pageX || e.x || 0);
	this.y = (e.pageY || e.y || 0);
	if ((!this.x || !this.y) && e.offsetParent) {
		var i = e;
		while (i.offsetParent) {
			this.x += i.offsetLeft;
			this.y += i.offsetTop;
			i = i.offsetParent;
		}
	}
}
var Easing = {
	linear: function(t, b, c, d) { return c*t/d + b; },
	easeIn: function(t, b, c, d) { return c*(t/=d)*t*t + b; },
	easeOut: function(t, b, c, d) { return c*((t=t/d-1)*t*t + 1) + b; },
	easeInOut: function(t, b, c, d) {
		if ((t/=d/2) < 1) return c/2*t*t*t + b;
		return c/2*((t-=2)*t*t + 2) + b;
	}
};
if (!Event) {
	var Event = {};
}
Event.modify = function(obj, event, fnct, context, actions, attach) {
	var fn = Function.bind(fnct, (context || obj));
	var custom = obj["_on" + event];
	if (custom && attach) {
		obj["_on" + event] = function() {
			return ((custom.apply(this, arguments) !== false ? true : false) && (fn.apply(this, arguments) !== false ? true : false));
		};
	} else if (!custom) {
		var handle = Function.bind(Event.handle, Event, fn, actions);
		if (obj.addEventListener) {
			obj[(attach ? "add" : "remove") + "EventListener"](event, handle, false);
		} else {
			obj[(attach ? "at" : "de") + "tachEvent"]("on" + event, handle);
		}
	}
};
Event.attach = function (obj, event, fnct, context, actions) { Event.modify(obj, event, fnct, context, actions, true); };
Event.detach = function (obj, event, fnct, context, actions) { Event.modify(obj, event, fnct, context, actions, false); };
Event.handle = function(fnct, actions, e) {
	e = (e || window.event);
	if (!e.target) {
		e.target = e.srcElement;
	}
	if (actions) {
		for (var i = 0, action; action = actions[i]; i++) {
			switch (action) {
				case Event.actions.PREVENT_DEFAULT:
					if (e.preventDefault) {
						e.preventDefault();
					} else {
						e.returnValue = false;
					}
					break;
				
				case Event.actions.STOP_PROPAGATION:
					if (e.stopPropagation) {
						e.stopPropagation();
					} else {
						e.cancelBubble = true;
					}
					break;
				
				case Event.actions.BLUR:
					if (e.target && e.target.blur) {
						e.target.blur();
					}
					break;
			}
		}
	}
	fnct(e);
};
Event.actions = {
	PREVENT_DEFAULT: 1,
	STOP_PROPAGATION: 2,
	BLUR: 4
};
Function.bind = function(fnct, context) {
	var args = $a(arguments).slice(2, arguments.length);
	var cache = Function.bind.cache;
	for (var i = 0, cacheFnct; cacheFnct = cache[i]; i++) {
		if (cacheFnct.fnct == fnct && cacheFnct.context == context && cacheFnct.args.length == args.length) {
			var t = true;
			for (var j = 0, a1, a2; (a1 = cacheFnct.args[j]) && (a2 = a[j]); j++) {
				t = (a1 == a2);
				if (!t) {
					break;
				}
			}
			if (t) {
				return cacheFnct.method;
			}
		}
	}
	
	var newFnct = {
		fnct: fnct,
		obj: context,
		args: args,
		method: function() {
			return fnct.apply(context, (args ? args.concat($a(arguments)) : arguments));
		}
	};
	
	cache.push(newFnct);
	return newFnct.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;
}
function Fx(node, duration, easing) {
	this.node = node;
	this.duration = (duration || 1);
	this.easing = (easing || Easing.easeOut);
	this.totalFrames = 30 * this.duration;
	this.animations = [];
}
Fx.prototype = {
	addFx: function(animation, startX, endX, startY, endY) {
		var newAni = {
				fnct: animation,
				startX: parseInt(startX),
				endX: parseInt(endX),
				startY: parseInt(startY),
				endY: parseInt(endY)
			};
		
		this.animations.push(newAni);
		return newAni;
	},
	go: function() {
		this._onstart();
		this.currentFrame = 0;
		this.started = new Date();
		this.action();
	},
	_onstart: function() {},
	action: function() {
		if (this.currentFrame < this.totalFrames) {
			this.computeFrame();
			for (var i = 0, animation; animation = this.animations[i]; i++) {
				var resultX = (!isNaN(animation.startX) && !isNaN(animation.endX) ? this.easing(this.currentFrame, animation.startX, (animation.endX - animation.startX), this.totalFrames) : 0);
				var resultY = (!isNaN(animation.startY) && !isNaN(animation.endY) ? this.easing(this.currentFrame, animation.startY, (animation.endY - animation.startY), this.totalFrames) : 0);
				animation.fnct(this.node, resultX, resultY);
			}
			setTimeout(Function.bind(this.action, this), 1);
		} else {
			this._onend();
		}
	},
	_onend: function() {},
	computeFrame: function() {
		var time = (new Date() - this.started);
		var calcFrame = Math.round((time * this.totalFrames) / (this.duration * 500)) + 1;
		this.currentFrame = (calcFrame <= this.totalFrames ? calcFrame : this.totalFrames);
	}
};

function ScrollingAnchors(parent) {
	var anchors = $t("a", parent);
	var hashRe = new RegExp("^#|" + window.location.href.replace(/#.*$/, "") + "#");
	for (var i = 0, anchor; anchor = anchors[i]; i++) {
		var href, id = ((href = anchor.getAttribute("href")) && href ? href.replace(hashRe, "") : null);
		if (id && $i(id)) {
			Event.attach(anchor, "click", function() {
					var id = this.getAttribute("href").replace(hashRe, "");
					var obj;
					if (id && (obj = $i(id))) {
						var fx = new Fx(window);
						var de = document.documentElement;
						fx.addFx(Fx.animations.SCROLL, (window.scrollX || de.scrollLeft), 0, (window.scrollY || de.scrollTop), new Coordinate(obj).y);
						fx.go();
					}
				}, [ Event.actions.PREVENT_DEFAULT, Event.actions.BLUR ]);
		}
	}
}

function Slider(parent, next, previous) {
	this.parent = parent;
	this.anchors = $t("li", parent);
	this.anchorWidth = 195;
	this.fx = new Fx(parent);
	this.animation = this.fx.addFx(function(node, left) {
		node.style.left = left + "px";
	});
	
	Event.attach(next, "click", this.next, this, [ Event.actions.PREVENT_DEFAULT ]);
	Event.attach(previous, "click", this.previous, this, [ Event.actions.PREVENT_DEFAULT ]);
}
Slider.prototype = {
	previous: function() {
		this.resetNodes();
		var last = this.anchors[this.anchors.length - 1];
		this.parent.removeChild(last);
		this.parent.insertBefore(last, this.anchors[0]);
		this.parent.style.left = "-195px";
		this.animation.startX = -195;
		this.animation.endX = 0;
		this.fx.go();
	},
	next: function() {
		this.resetNodes();
		this.animation.startX = 0;
		this.animation.endX = -195;
		this.fx.go();
	},
	resetNodes: function() {
		if (this.parent.style.left.length > 0 && this.parent.style.left != "0px") {
			
		}
	}
};
function InputTitle(input) {
	this.input = input;
	Event.attach(input, "focus", this.focus, this);
	Event.attach(input, "blur", this.blur, this);
	this.blur();
}
InputTitle.prototype = {
	focus: function() {
		var input = this.input;
		if (input.value == input.title) {
			input.value = "";
			Class.remove(input, "empty");
		}
	},
	blur: function() {
		var input = this.input;
		if (input.value == "") {
			input.value = input.title;
			Class.add(input, "empty");
		}
	}
};
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;
}
function Tabs(parent, className, tag, parentLevel) {
	tag = (tag || "a");
	if (parentLevel === undefined || parentLevel === null) {
		parentLevel = 1;
	}
	this.tabs = [];
	var anchors = (className ? $c(className, tag, parent) : $t(tag, parent));
	for (var i = 0, anchor; anchor = anchors[i]; i++) {
		var contentID = anchor.id.replace(Tabs.idRe, "");
		var tab = new Tab(this, anchor, (contentID != anchor.id ? $i(contentID) : null), Tabs.getParent(anchor, parentLevel));
		this.tabs.push(tab);
		Event.attach(anchor, "click", tab.click, tab, [ Event.actions.PREVENT_DEFAULT, Event.actions.BLUR ]);
	}
}
Tabs.getParent = function(node, level) {
	var parent = node;
	var current = level;
	while (current > 0) {
		parent = parent.parentNode;
		current--;
	}
	return parent;
};
Tabs.idRe = /-[^-]+$/;
Tabs.prototype = {
	_onchange: function(newTab, oldTab) {},
	select: function(selectTab) {
		var oldTab;
		for (var i = 0, tab; tab = this.tabs[i]; i++) {
			if (Class.get(tab.parent, "selected")) {
				oldTab = tab;
			}
		}
		if (selectTab != oldTab && this._onchange(selectTab, oldTab) != false) {
			this.display(oldTab, false);
			this.display(selectTab, true);
		}
	},
	display: function(tab, select) {
		if (tab) {
			Class[select ? "add" : "remove"](tab.parent, "selected");
			if (tab.content) {
				Class[select ? "add" : "remove"](tab.content, "selected");
			}
		}
	},
	clear: function() {
		for (var i = 0, tab; tab = this.tabs[i]; i++) {
			this.display(tab, false);
		}
	}
};
function Tab(container, anchor, content, parent) {
	this.container = container;
	this.anchor = anchor;
	this.content = content;
	this.parent = parent;
}
Tab.prototype = {
	click: function(e) {
		this.container.select(this);
	}
};