function TabSystem(id, last) {
	var rootId = id;
	var bAddLastItem = (last == undefined) ? true : false;
	
	var objRootElement = null;
	var objTabs = null;
	var objTabPanels = null;
	var currentTab = null;
	var panelable = true;
	var classNames = {
		selected:'selected',
		unselected:'unselected',
		show:'tabPanel',
		hide:'hidden',
		noshadow:'noshadow',
		lightshadow:'lightshadow',
		deepshadow:'deepshadow',
		lightblank:'lightblank',
		deepblank:'deepblank'
	};
	
	this.initialize = function (tabId, anchorable) {
		if (tabId == undefined)
			tabId = 0;
		if (anchorable == undefined)
			panelable = true;
		else
			panelable = anchorable;
		
		objRootElement = document.getElementById(rootId);
		objTabs = objRootElement.getElementsByTagName('li');
		if (panelable == true)
			objTabPanels = Object.getChildNodes(objRootElement.parentNode, 'div', 'tabPanel');
		
		for (var i=0; i<objTabs.length; i++) {
			objTabs[i].className = objTabs[i].className + ' ' + classNames.unselected;
			var objSpan = document.createElement('span');
			objSpan.appendChild(objTabs[i].firstChild.removeChild(objTabs[i].firstChild.firstChild));
			objTabs[i].firstChild.appendChild(objSpan);
			objTabs[i].onclick = function () { this.firstChild.onclick(); return !panelable; }
			objTabs[i].firstChild.onclick = function () { return selectTab(this); }
			
			if (panelable == true && objTabPanels[i] != undefined)
				objTabPanels[i].className = classNames.hide;
		}
		
		addLastBlankTab();
		selectTab(objTabs[tabId].firstChild);
	}
	
	var selectTab = function (obj) {
		if (obj.parentNode == currentTab)
			return false;
		
		if (currentTab != null) {
			var oldIndex = getTabIndex(currentTab);
			objTabs[oldIndex].className = objTabs[oldIndex].className.replace(/ ([^ ]+)$/, ' ' + classNames.unselected);
			if (panelable == true && objTabPanels[oldIndex] != undefined)
				objTabPanels[oldIndex].className = classNames.hide;
		}
		
		var tabIndex = getTabIndex(obj.parentNode);
		objTabs[tabIndex].className = objTabs[tabIndex].className.replace(/ ([^ ]+)$/, ' ' + classNames.selected);
		
		if (panelable == true && objTabPanels[tabIndex] != undefined)
			objTabPanels[tabIndex].className = classNames.show;
		currentTab = objTabs[tabIndex];
		
		dressTabShadow(tabIndex);
		
		return !panelable;
	}
	
	var dressTabShadow = function (tabIndex) {
		var checked = false;
		
		for (var i=0; i<objTabs.length; i++) {
			if (tabIndex == i) {
				checked = true;
				continue;
			}
			
			switch (checked) {
			case true:
				if (i == objTabs.length - 1)
					objTabs[i].className = classNames.deepblank;
				else
					objTabs[i].className = objTabs[i].className.replace(/ ([^ ]+)$/, ' ' + classNames.deepshadow);
				checked = false;
				break;
			case false:
				if (i == 0)
					objTabs[i].className = objTabs[i].className.replace(/ ([^ ]+)$/, ' ' + classNames.noshadow);
				else if (i == objTabs.length - 1)
					objTabs[i].className = classNames.lightblank;
				else
					objTabs[i].className = objTabs[i].className.replace(/ ([^ ]+)$/, ' ' + classNames.lightshadow);
				break;
			}
		}
	}
	
	var addLastBlankTab = function () {
		if (bAddLastItem) {
			var objTempTab = document.createElement('li');
			objRootElement.appendChild(objTempTab);
		}
	}
	
	var getTabIndex = function (tab) {
		for (var i=0; i<objTabs.length; i++) {
			if (objTabs[i] == tab) {
				return i;
			}
		}
		
		return null;
	}
}