if (!Array.prototype.indexOf) {
	Array.prototype.indexOf = function (obj, fromIndex) {
		if (fromIndex == null) {
			fromIndex = 0;
		} else {
			if (fromIndex < 0) {
				fromIndex = Math.max(0, this.length + fromIndex);
			}
		}
		for (var i = fromIndex; i < this.length; i++) {
			if (this[i] === obj) {
				return i;
			}
		}
		return -1;
	};
}
if (!Array.prototype.lastIndexOf) {
	Array.prototype.lastIndexOf = function (obj, fromIndex) {
		if (fromIndex == null) {
			fromIndex = this.length - 1;
		} else {
			if (fromIndex < 0) {
				fromIndex = Math.max(0, this.length + fromIndex);
			}
		}
		for (var i = fromIndex; i >= 0; i--) {
			if (this[i] === obj) {
				return i;
			}
		}
		return -1;
	};
}
if (!Array.prototype.forEach) {
	Array.prototype.forEach = function (f, obj) {
		var l = this.length;
		for (var i = 0; i < l; i++) {
			f.call(obj, this[i], i, this);
		}
	};
}
if (!Array.prototype.filter) {
	Array.prototype.filter = function (f, obj) {
		var l = this.length;
		var res = [];
		for (var i = 0; i < l; i++) {
			if (f.call(obj, this[i], i, this)) {
				res.push(this[i]);
			}
		}
		return res;
	};
}
if (!Array.prototype.map) {
	Array.prototype.map = function (f, obj) {
		var l = this.length;
		var res = [];
		for (var i = 0; i < l; i++) {
			res.push(f.call(obj, this[i], i, this));
		}
		return res;
	};
}
if (!Array.prototype.some) {
	Array.prototype.some = function (f, obj) {
		var l = this.length;
		for (var i = 0; i < l; i++) {
			if (f.call(obj, this[i], i, this)) {
				return true;
			}
		}
		return false;
	};
}
if (!Array.prototype.every) {
	Array.prototype.every = function (f, obj) {
		var l = this.length;
		for (var i = 0; i < l; i++) {
			if (!f.call(obj, this[i], i, this)) {
				return false;
			}
		}
		return true;
	};
}
Array.prototype.contains = function (obj) {
	return this.indexOf(obj) != -1;
};
Array.prototype.copy = function (obj) {
	return this.concat();
};
Array.prototype.insertAt = function (obj, i) {
	this.splice(i, 0, obj);
};
Array.prototype.insertBefore = function (obj, obj2) {
	var i = this.indexOf(obj2);
	if (i == -1) {
		this.push(obj);
	} else {
		this.splice(i, 0, obj);
	}
};
Array.prototype.removeAt = function (i) {
	this.splice(i, 1);
};
Array.prototype.remove = function (obj) {
	var i = this.indexOf(obj);
	if (i != -1) {
		this.splice(i, 1);
	}
};
TB = {};
TB.common = {getCookie:function (name) {
	var value = document.cookie.match("(?:^|;)\\s*" + name + "=([^;]*)");
	return value ? unescape(value[1]) : "";
}, setCookie:function (name, value, expire, domain, path) {
	value = escape(value);
	value += (domain) ? "; domain=" + domain : "";
	value += (path) ? "; path=" + path : "";
	if (expire) {
		var date = new Date();
		date.setTime(date.getTime() + (expire * 86400000));
		value += "; expires=" + date.toGMTString();
	}
	document.cookie = name + "=" + value;
}, removeCookie:function (name) {
	setCookie(name, "", -1);
}, pickDocumentDomain:function () {
	var da = location.hostname.split("."), len = da.length;
	var deep = arguments[0] || (len < 3 ? 0 : 1);
	if (deep >= len || len - deep < 2) {
		deep = len - 2;
	}
	return da.slice(deep).join(".") + (location.port ? ":" + location.port : "");
}, trim:function (str) {
	return str.replace(/(^\s*)|(\s*$)/g, "");
}, escapeHTML:function (str) {
	var div = document.createElement("div");
	var text = document.createTextNode(str);
	div.appendChild(text);
	return div.innerHTML;
}, unescapeHTML:function (str) {
	var div = document.createElement("div");
	div.innerHTML = str.replace(/<\/?[^>]+>/gi, "");
	return div.childNodes[0] ? div.childNodes[0].nodeValue : "";
}, toArray:function (list, start) {
	var array = [];
	for (var i = start || 0; i < list.length; i++) {
		array[array.length] = list[i];
	}
	return array;
}, applyConfig:function (obj, config) {
	if (obj && config && typeof config == "object") {
		for (var p in config) {
			if (!YAHOO.lang.hasOwnProperty(obj, p)) {
				obj[p] = config[p];
			}
		}
	}
	return obj;
}};
TB.widget = {};
TB.widget.SimpleScroll = {};
TB.widget.SimpleMarquee = {};
TB.widget.SimpleTab = new function () {
	var Y = YAHOO.util;
	var defConfig = {eventType:"click", currentClass:"Current", tabClass:"", autoSwitchToFirst:true, stopEvent:true, delay:0.3};
	var getImmediateDescendants = function (p) {
		var ret = [];
		if (!p) {
			return ret;
		}
		for (var i = 0, c = p.childNodes; i < c.length; i++) {
			if (c[i].nodeType == 1) {
				ret[ret.length] = c[i];
			}
		}
		return ret;
	};
	this.decorate = function (container, config) {
		container = Y.Dom.get(container);
		config = TB.common.applyConfig(config || {}, defConfig);
		var tabPanels = getImmediateDescendants(container);
		var tab = tabPanels.shift(0);
		var tabTriggerBoxs = tab.getElementsByTagName("li");
		var tabTriggers, delayTimeId;
		if (config.tabClass) {
			tabTriggers = Y.Dom.getElementsByClassName(config.tabClass, "*", container);
		} else {
			tabTriggers = TB.common.toArray(tab.getElementsByTagName("a"));
		}
		var onSwitchEvent = new Y.CustomEvent("onSwitch", null, false, Y.CustomEvent.FLAT);
		if (config.onSwitch) {
			onSwitchEvent.subscribe(config.onSwitch);
		}
		var handler = {switchTab:function (idx) {
			Y.Dom.setStyle(tabPanels, "display", "none");
			Y.Dom.removeClass(tabTriggerBoxs, config.currentClass);
			Y.Dom.addClass(tabTriggerBoxs[idx], config.currentClass);
			Y.Dom.setStyle(tabPanels[idx], "display", "block");
		}, subscribeOnSwitch:function (func) {
			onSwitchEvent.subscribe(func);
		}};
		var focusHandler = function (ev) {
			if (delayTimeId) {
				cacelHandler();
			}
			var idx = tabTriggers.indexOf(this);
			handler.switchTab(idx);
			onSwitchEvent.fire(idx);
			if (config.stopEvent) {
				Y.Event.stopEvent(ev);
			}
			return !config.stopEvent;
		};
		var delayHandler = function () {
			var target = this;
			delayTimeId = setTimeout(function () {
				focusHandler.call(target);
			}, config.delay * 1000);
			if (config.stopEvent) {
				Y.Event.stopEvent(ev);
			}
			return !config.stopEvent;
		};
		var cacelHandler = function () {
			clearTimeout(delayTimeId);
		};
		for (var i = 0; i < tabTriggers.length; i++) {
			Y.Event.on(tabTriggers[i], "focus", focusHandler);
			if (config.eventType == "mouse") {
				Y.Event.on(tabTriggers[i], "mouseover", config.delay ? delayHandler : focusHandler);
				Y.Event.on(tabTriggers[i], "mouseout", cacelHandler);
			} else {
				Y.Event.on(tabTriggers[i], "click", focusHandler);
			}
		}
		Y.Dom.setStyle(tabPanels, "display", "none");
		if (config.autoSwitchToFirst) {
			handler.switchTab(0);
		}
		return handler;
	};
};
(function () {
	var Y = YAHOO.util;
	TB.widget.Slide = function (container, config) {
		this.init(container, config);
	};
	TB.widget.Slide.defConfig = {slidesClass:"Slides", triggersClass:"SlideTriggers", currentClass:"Current", eventType:"click", autoPlayTimeout:5, disableAutoPlay:false};
	TB.widget.Slide.prototype = {init:function (container, config) {
		this.container = Y.Dom.get(container);
		this.config = TB.common.applyConfig(config || {}, TB.widget.Slide.defConfig);
		try {
			this.slidesUL = Y.Dom.getElementsByClassName(this.config.slidesClass, "ul", this.container)[0];
			this.slides = this.slidesUL.getElementsByTagName("li");
		}
		catch (e) {
			throw new Error("can't find slides!");
		}
		this.delayTimeId = null;
		this.autoPlayTimeId = null;
		this.curSlide = -1;
		this.sliding = false;
		this.pause = false;
		this.onSlide = new Y.CustomEvent("onSlide", this, false, Y.CustomEvent.FLAT);
		if (YAHOO.lang.isFunction(this.config.onSlide)) {
			this.onSlide.subscribe(this.config.onSlide, this, true);
		}
		this.initSlides();
		this.initTriggers();
		if (this.slides.length > 0) {
			this.play(1);
		}
		if (!this.config.disableAutoPlay) {
			this.autoPlay();
		}
	}, initTriggers:function () {
		var ul = document.createElement("ul");
		this.container.appendChild(ul);
		for (var i = 0; i < this.slides.length; i++) {
			var li = document.createElement("li");
			li.innerHTML = i + 1;
			ul.appendChild(li);
		}
		ul.className = this.config.triggersClass;
		this.triggersUL = ul;
		if (this.config.eventType == "mouse") {
			Y.Event.on(this.triggersUL, "mouseover", this.mouseHandler, this, true);
			Y.Event.on(this.triggersUL, "mouseout", function (e) {
				clearTimeout(this.delayTimeId);
			}, this, true);
		} else {
			Y.Event.on(this.triggersUL, "click", this.clickHandler, this, true);
		}
	}, initSlides:function () {
		Y.Event.on(this.slides, "mouseover", function () {
			this.pause = true;
		}, this, true);
		Y.Event.on(this.slides, "mouseout", function () {
			this.pause = false;
		}, this, true);
		Y.Dom.setStyle(this.slides, "display", "none");
	}, clickHandler:function (e) {
		var t = YAHOO.util.Event.getTarget(e);
		var idx = parseInt(t.innerHTML);
		while (t != this.container) {
			if (t.nodeName.toUpperCase() == "LI") {
				if (!this.sliding) {
					this.play(idx, true);
				}
				break;
			} else {
				t = t.parentNode;
			}
		}
	}, mouseHandler:function (e) {
		var t = Y.Event.getTarget(e);
		var idx = parseInt(t.innerHTML);
		while (t != this.container) {
			if (t.nodeName.toUpperCase() == "LI") {
				var self = this;
				this.delayTimeId = setTimeout(function () {
					self.play(idx, true);
				}, (self.sliding ? 0.5 : 0.1) * 1000);
				break;
			} else {
				t = t.parentNode;
			}
		}
	}, play:function (n, flag) {
		n = n - 1;
		if (n == this.curSlide) {
			return;
		}
		if (this.curSlide == -1) {
			this.curSlide = 0;
		}
		if (flag && this.autoPlayTimeId) {
			clearInterval(this.autoPlayTimeId);
		}
		var triggersLis = this.triggersUL.getElementsByTagName("li");
		triggersLis[this.curSlide].className = "";
		triggersLis[n].className = this.config.currentClass;
		this.slide(n);
		this.curSlide = n;
		if (flag && !this.config.disableAutoPlay) {
			this.autoPlay();
		}
	}, slide:function (n) {
		this.sliding = true;
		Y.Dom.setStyle(this.slides[this.curSlide], "display", "none");
		Y.Dom.setStyle(this.slides[n], "display", "block");
		this.sliding = false;
		this.onSlide.fire(n);
	}, autoPlay:function () {
		var self = this;
		var callback = function () {
			if (!self.pause && !self.sliding) {
				var n = (self.curSlide + 1) % self.slides.length + 1;
				self.play(n, false);
			}
		};
		this.autoPlayTimeId = setInterval(callback, this.config.autoPlayTimeout * 1000);
	}};
	TB.widget.ScrollSlide = function (container, config) {
		this.init(container, config);
	};
	YAHOO.extend(TB.widget.ScrollSlide, TB.widget.Slide, {initSlides:function () {
		TB.widget.ScrollSlide.superclass.initSlides.call(this);
		Y.Dom.setStyle(this.slides, "display", "");
	}, slide:function (n) {
		var args = {scroll:{by:[0, this.slidesUL.offsetHeight * (n - this.curSlide)]}};
		var anim = new Y.Scroll(this.slidesUL, args, 0.5, Y.Easing.easeOutStrong);
		anim.onComplete.subscribe(function () {
			this.sliding = false;
			this.onSlide.fire(n);
		}, this, true);
		anim.animate();
		this.sliding = true;
	}});
})();
TB.widget.SimpleSlide = new function () {
	this.decoration = function (container, config) {
		if (!container) {
			return;
		}
		config = config || {};
		if (config.effect == "scroll") {
			if (navigator.product && navigator.product == "Gecko") {
				if (YAHOO.util.Dom.get(container).getElementsByTagName("iframe").length > 0) {
					new TB.widget.Slide(container, config);
					return;
				}
			}
			new TB.widget.ScrollSlide(container, config);
		} else {
			new TB.widget.Slide(container, config);
		}
	};
};


