
function $(id) {
	return document.getElementById(id);
}

var Event = {
	add : function(elem, type, fn){
		if (elem.addEventListener) {
			elem.addEventListener(type, fn, false);
			return true;
		} else if (elem.attachEvent) {
			return elem.attachEvent("on" + type, fn);
		}
		return false;
	},
	remove : function(elem, type, fn){
		if (elem.removeEventListener) {
			elem.removeEventListener(type, fn, false);
			return true;
		} else if (elem.detachEvent) {
			return elem.detachEvent("on" + type, fn);
		}
		return false;
	},
	fix : function(event){
		event = event || Calendar.iframe.contentWindow.event;
		if(!event.preventDefault)  event.preventDefault = function() {event.returnValue = false;};
		if(!event.stopPropagation) event.stopPropagation = function(){event.cancelBubble = true;};
		if(!event.target )
			event.target = event.srcElement || document;
		if ( event.target.nodeType == 3 )
			event.target = event.target.parentNode;
		if(!event.relatedTarget && event.fromElement)
			event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement;
		// Calculate pageX/Y if missing and clientX/Y available
		if ( event.pageX == null && event.clientX != null ) {
			var doc = document.documentElement, body = document.body;
			event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc.clientLeft || 0);
			event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc.clientTop || 0);
		}
		// Add which for key events
		if ( !event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) )
			event.which = event.charCode || event.keyCode;
		// Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
		if ( !event.metaKey && event.ctrlKey )
			event.metaKey = event.ctrlKey;
		// Add which for click: 1 == left; 2 == middle; 3 == right
		// Note: button is not normalized, so don't use it
		if ( !event.which && event.button )
			event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
		return event;
	}
};

function hasClass (elem, className) {
	if (!elem || !elem.className) return false;
	return elem.className.match(new RegExp('(^\\s*|\\s+)'+className+'(\\s+|\\s*$)', 'i'));
};
function removeClass (elem, className) {
	if (!elem || !elem.className) return;
	elem.className = elem.className.replace(new RegExp('(^\\s*|\\s+)'+className+'(\\s+|\\s*$)', 'i'),' ');
};
function addClass (elem, className) {
	removeClass(elem, className);
	elem.className += ' ' + className;
};


//triggerMode : mousehover, click, auto
function Tabs(target, mode, speed) {this.init.apply(this, arguments);}
Tabs.prototype = {
	init: function(target, mode, speed) {
		if(typeof target === 'string') {
			target = $(target);
		}
		this.target = target;
		this.labels = [];
		var othis = this, tabMenuItems = this.target.getElementsByTagName('label');

		if(mode == 'autoplay') {
			this.mode = 'autoplay';
			if(typeof parseInt(speed) != 'undefined') {
				this.speed = parseInt(speed);
			} else if(speed == 'fast') {
				this.speed = 1000;
			} else if(speed == 'slow') {
				this.speed = 4000;
			} else {
				this.speed = 2500;
			}
			this.timer = setInterval(function(){othis.setNextTab();}, this.speed);
		} else if(mode == 'hover') {
			this.mode = 'hover';
		} else {
			this.mode = 'click';
		}

		for(var i = 0; i < tabMenuItems.length; i++) {
			if(hasClass(tabMenuItems[i].parentNode, 'tab-menu')) {
				this.attachLabel(tabMenuItems[i]);
			}
		}
		this.currentLabel = this.getCurrentLabel();
		this.currentBody  = $(this.currentLabel.htmlFor);
	},
	attachLabel : function(label) {
		var othis = this;
		this.labels.push(label);
		if(this.mode == 'autoplay') {
			Event.add(label, 'mouseover', function() {
				othis.setTab(label);
				clearInterval(othis.timer);
			});
			Event.add(label, 'mouseout', function() {
				othis.timer = setInterval(function(){othis.setNextTab();}, othis.speed);}
			);
			Event.add($(label.htmlFor), 'mouseover', function() {
				othis.setTab(label);
				clearInterval(othis.timer);
			});
			Event.add($(label.htmlFor), 'mouseout', function() {
				othis.timer = setInterval(function(){othis.setNextTab();}, othis.speed);}
			);
		} else if(this.mode == 'hover'){
			Event.add(label, 'mouseover', function() {othis.setTab(label);});
		} else {
			Event.add(label, 'click', function() {othis.setTab(label);});
		}

	},
	setNextTab : function () {
		for(var i = 0; i < this.labels.length; i++) {
			if(this.labels[i] == this.currentLabel) {
				this.setTab(this.labels[(i + 1) % this.labels.length]);
				return;
			}
		}
	},
	setTab : function (label) {
		if(label == null || this.currentLabel == label) return;
		var body = $(label.htmlFor);
		if(body == null) return;
		removeClass(this.currentLabel, 'current');	
		removeClass(this.currentBody, 'current');	
		addClass(label, 'current');
		addClass(body, 'current');

		this.currentLabel = label;	
		this.currentBody = body;
	},
	getCurrentLabel : function () {
		for(var i = 0; i < this.labels.length;i++) {
			if(hasClass(this.labels[i], 'current')) {
				return this.labels[i];
			}
		}
		return null;
	}
};
