﻿var YTabs = function(){
	var D = document;
	
	return {
		stopEvent: function(evt){
			this.stopPropagation(evt);
			this.preventDefault(evt);
		},
		stopPropagation: function(evt){
			if (evt.stopPropagation) {
				evt.stopPropagation();
			}
			else {
				evt.cancelBubble = true;
			}
		},
		preventDefault: function(evt){
			if (evt.preventDefault) {
				evt.preventDefault();
			}
			else {
				evt.returnValue = false;
			}
		},
		hasClass: function(elem, className){
			var has = new RegExp("(?:^|\\s+)" + className + "(?:\\s+|$)");
			return has.test(elem.className);
		},
		addClass: function(elem, className){
			if (this.hasClass(elem, className)) {
				return;
			}
			elem.className = [elem.className, className].join(" ");
		},
		removeClass: function(elem, className){
			var replace = new RegExp("(?:^|\\s+)" + className + "(?:\\s+|$)", "g");
			if (!this.hasClass(elem, className)) {
				return;
			}
			var o = elem.className;
			elem.className = o.replace(replace, " ");
			if (this.hasClass(elem, className)) {
				this.removeClass(elem, className);
			}
		},
		getByClassName: function(className, tag, rootTag){
			var elems = [], i, tempCnt = D.getElementById(rootTag).getElementsByTagName(tag), len = tempCnt.length;
			for (i = 0; i < len; i++) {
				if (YTabs.hasClass(tempCnt[i], className)) {
					elems.push(tempCnt[i]);
				}
			}
			if (elems.length < 1) {
				return false;
			}
			else {
				return elems;
			}
		},
		tabs: function(){
			var j, len = arguments.length;
			for (j = 0; j < len; j += 1) {
				(function(config){
					var tabCnt = (config.tabId) ? D.getElementById(config.tabId) : (config.tabRoot || null), tabs = (config.tTag) ? tabCnt.getElementsByTagName(config.tTag) : (config.tabs || null), contents = (config.cTag) ? tabCnt.getElementsByTagName(config.cTag) : (config.contents || null), defaultClass = config.defaultClass || 'current', defaultIndex = config.defaultIndex || 0, lastIndex = defaultIndex, previousClass = config.previousClass || '', previousClassTab = null, hideAll = config.hideAll || false, evtName = config.evt || 'mouseover', i, length = tabs.length, lastTab = tabs[defaultIndex], lastTabClass = config.lastTabClass || '', lastContent = contents[defaultIndex];
					if (tabs && contents) {
						if (!hideAll) {
							YTabs.addClass(lastTab, defaultClass);
							lastContent.style.display = 'block';
						}
						else {
							YTabs.removeClass(lastTab, defaultClass);
							lastContent.style.display = 'none';
						}
						for (i = 0; i < length; i += 1) {
							if (i !== defaultIndex) {
								YTabs.removeClass(tabs[i], 'current');
								contents[i].style.display = 'none';
							}
							tabs[i]['on' + evtName] = function(index){
								return function(event){
									var currentContent = contents[index];
									YTabs.removeClass(lastTab, (YTabs.hasClass(lastTab, defaultClass) ? defaultClass : 'current'));
									if (this === tabs[defaultIndex]) {
										YTabs.addClass(this, defaultClass);
									}
									else {
										YTabs.addClass(this, 'current');
									}
									if (previousClass) {
										if (previousClassTab) {
											YTabs.removeClass(previousClassTab, previousClass);
										}
										if (index !== 0) {
											YTabs.addClass(tabs[index - 1], previousClass);
											if ((index - 1) === defaultIndex) {
												YTabs.removeClass(tabs[index - 1], defaultClass);
											}
											previousClassTab = (tabs[index - 1]);
										}
									}
									lastContent.style.display = "none";
									currentContent.style.display = "block";
									lastContent = currentContent;
									lastTab = this;
									lastIndex = index;
									if (evtName === 'click') {
										var evt = event || window.event;
										YTabs.stopEvent(evt);
									}
								}
							}(i);
							if (hideAll && evtName === 'mouseover') {
								tabs[i]['onmouseout'] = function(index){
									return function(){
										if (lastTab === this) {
											YTabs.removeClass(this, (YTabs.hasClass(this, defaultClass) ? defaultClass : 'current'));
										}
										if (previousClassTab) {
											YTabs.removeClass(previousClassTab, previousClass);
										}
										contents[index].style.display = 'none';
									}
								}(i);
							}
						}
					}
				})(arguments[j]);
			}
		},
		moveElement: function(element, final_x, final_y, speed){
			if (!D.getElementById) {
				return false;
			}
			var elem = (typeof element === 'string') ? D.getElementById(element) : element;
			var style = elem.style;
			if (timer) {
				clearTimeout(timer);
			}
			if (!style.left) {
				style.left = '0';
			}
			if (!style.top) {
				style.top = '0';
			}
			var xpos = parseInt(style.left, 10);
			var ypos = parseInt(style.top, 10);
			if (xpos == final_x && ypos == final_y) {
				return true;
			}
			if (xpos < final_x) {
				var dist = Math.ceil((final_x - xpos) / 10);
				xpos = xpos + dist;
			}
			if (xpos > final_x) {
				var dist = Math.ceil((xpos - final_x) / 10);
				xpos = xpos - dist;
			}
			if (ypos < final_y) {
				var dist = Math.ceil((final_y - ypos) / 10);
				ypos = ypos + dist;
			}
			if (ypos > final_y) {
				var dist = Math.ceil((ypos - final_y) / 10);
				ypos = ypos - dist;
			}
			style.left = xpos + 'px';
			style.top = ypos + 'px';
			var timer = setTimeout(function(){
				YTabs.moveElement(element, final_x, final_y, speed);
			}, speed);
		}
	};
}();
