var $ = function(id){
     if (0 == id.indexOf("#")) {
		return document.getElementById(id.substr(1));
	}
}
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 $Childs = function(parent, tagName){
    var child = parent.firstChild, elems = [];
    while (child) {
        if (child.tagName == tagName.toUpperCase()) {
            elems.push(child);
        }
        child = child.nextSibling;
    }
    return elems;
}

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 TabSwitch(menus, contents, css, eventName, interval) {
	var length = contents.length; 

	if (menus && length != menus.length) {
		throw new Error("the amount of menus and contents is not equal");
	}
	
	var curSeq = 0, timerIds = [], isStopped = true;
	interval = parseInt(interval);
	
	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;
	};
	
	var showNext = function() {
		var next = (curSeq + 1) % length, i = length;
		while (--i >= 0) {
			if (i != next) {
				hide(i);
			} else {
				show(i);
			}
		}
	};
	
	var change = function(event) {
		var e = event;
		if (this != menus[curSeq]) {
			var i = length;
			while (--i >= 0) {
				if (this != menus[i]) {
					hide(i);
				} else {
					show(i);
				}
			}
		}
		e.preventDefault = e.preventDefault || function() {
			e.returnValue = false;
		};
		e.preventDefault();
		e.cancelBubble = true;
	};
	
	this.play = function(speed) {
		if (isStopped) {
			isStopped = false;
			timerIds.push(setInterval(showNext, 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, 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);
	}
}