var $ = function(id) {
	return document.getElementById(id);
};
Function.prototype.bind = function() {
	if (arguments.length < 2 && arguments[0] == null) {
		return this;
	}
    var __method = this, args = $A(arguments), object = args.shift();
    return function() {
		return __method.apply(object, args.concat($A(arguments)));
    };
};
var isArray = function(testVar) {
	return Array == testVar.constructor ? 1 : String != testVar.constructor && null != testVar.length && !testVar.alert && !testVar.nodeType ? 2 : 0;
};
var $A = function(variable) {
	switch (isArray(variable)) {
		case 1:
			return variable;
		case 2:
			var arr = [], i = -1, len = variable.length;
			while (++i < len) {
				arr[i] = variable[i];
			}
			return arr;
		default:
			return [variable];
	}
};
var addClass = function(elem, className) {
	if ((" " + elem.className + " ").indexOf(" " + className + " ") == -1) {
		if (elem.className == "") {
			elem.className = className;
		} else {
			elem.className += (" " + className);
		}
	}
};
var removeClass = function(elem, className) {
	var newClass = (" " + elem.className + " ").replace(" " + className + " ", " ");
	elem.className = newClass.substr(1, newClass.length - 2);
};
var addEvent = function(elem, eventName, handler) {
	if (elem.addEventListener) {
		elem.addEventListener(eventName, handler, false);
	} else if (elem.attachEvent) {
		elem.attachEvent("on" + eventName, handler);
	}
};
function Slide(menus, contents, css, eventName, interval) {
	var curSeq = 0, length = contents.length, timerIds = [], isStopped;
	if (menus && length != menus.length) {
		throw new Error("the amount of menus and contents is not equal");
	}
	
	var hide = function(seq) {
		removeClass(contents[seq], css);
		if (menus) {
			removeClass(menus[seq], css);
		}
	};
	
	var show = function(seq) {
		addClass(contents[seq], css);
		if (menus) {
			addClass(menus[seq], css);
		}
		curSeq = seq;
	};
	
	this.showNext = function() {
		var next = curSeq + 1;
		if (next >= length) {
			next = 0;
		}
		var i = length;
		while (--i >= 0) {
			if (i != next) {
				hide(i);
			} else {
				show(i);
			}
		}
	};
	
	this.change = function(event) {
		if (this != menus[curSeq]) {
			var i = length;
			while (--i >= 0) {
				if (menus[i] != this) {
					hide(i);
				} else {
					show(i);
				}
			}
		}
		e = window.event || event;
		e.cancelBubble = true;
	};
	
	this.play = function(speed) {
		isStopped = false;
		timerIds.push(setInterval(this.showNext.bind(this), speed));
	};
	
	this.pause = function() {
		isStopped = true;
		var i = length;
		while (--i >= 0) {
			clearInterval(timerIds[i]);
			timerIds.splice(i, 1);
		}
	};
	
	var i = length;
	while (--i >= 0) {
		addEvent(menus[i], eventName, this.change.bind(menus[i]));
		if (interval > 0) {
			addEvent(menus[i], "mouseover", this.pause);
			addEvent(menus[i], "mouseout", this.play.bind(this, interval));
		}
	}
	if (interval > 0) {
		this.play(interval);
	}
}
