/*
ListMagic v3.1
written by fczbkk
revised by RSe 5.7.2005

requires Dom 3.0

object listMagic - common UL improvement
	METHODS:
		boolean assignItems(HTMLelement list, array liClassArray)
			Adds periodically classnames from liClassArray to list items from list
		boolean addCursor(HTMLelement list, string cursorClass)
			Adds event listener to every list item. On mouseover item's className is set to cursorClass.
		boolean makeFolding(HTMLelement list, string openClass)
			Adds event listener to every list item. On click item's className is set to cursorClass or cursorClass is removed if present.

class Taber - improves DL to work like group of tabs
	PROPERTIES:
		boolean fixedHeight = false
			sets fixed height for dd blocks
		string clsTab = "tab"
			default tab class
		string clsActive = "tabActive"
			default activated class
		string clsInactive = "tabInactive"
			default deactivated class

*/

var listMagic = {
	
	assignItems : function(list, liClassArray) {
		if (typeof list == "undefined") return false;
		if (typeof liClassArray == "undefined") return false;
		var i; // int iterator
		var li = null; // HTMLelement collection
		var counter = 0; // int line counter
		li = list.getElementsByTagName("li");
		for (i = 0; i < li.length; i++) {
			if (li[i].parentNode == list) {
				cls.add(li[i], liClassArray[counter]);
				counter = (++counter == liClassArray.length) ? 0 : counter;
			}
		}
		return true;
	},
	
	addCursor : function(list, cursorClass) {
		if (typeof list == "undefined") return false;
		if (typeof cursorClass == "undefined") return false;
		var i; // iterator
		var li = list.getElementsByTagName("li"); // HTMLcollection of list items
		var getTargetItem = function(e) {
			var obj;
			e = evt.fix(e);
			if (e.currentTarget) obj = e.currentTarget;
			else {
				obj = e.target;
				while (obj.parentNode != list)
					obj = obj.parentNode;
			}
			return obj;
		}
		var showCursor = function(e) {
			var obj = getTargetItem(e);
			cls.add(obj, cursorClass);
		}
		var hideCursor = function(e) {
			var obj = getTargetItem(e);
			cls.remove(obj, cursorClass);
		}
		for (i = 0; i < li.length; i++) {
			if (li[i].parentNode == list) {
				evt.add(li[i], "mouseover", showCursor);
				evt.add(li[i], "mouseout", hideCursor);
			}
		}
		return true;
	},
	
	makeFolding : function(list, openClass) {
		if (typeof list == "undefined") return false;
		if (typeof openClass == "undefined") return false;
		var i; // iterator
		var li = list.getElementsByTagName("li");
		var getTargetItem = function(e) {
			var obj;
			e = evt.fix(e);
			if (e.currentTarget) obj = e.currentTarget;
			else {
				obj = e.target;
				while (obj.parentNode != list)
					obj = obj.parentNode;
				}
			return obj;
		}
		var switchItem = function(e){
			var obj = getTargetItem(e);
			if(cls.has(obj, openClass)) cls.remove(obj, openClass);
			else cls.add(obj, openClass);
		}
		for (i = 0; i < li.length; i++) {
			if (li[i].parentNode == list) {
				evt.add(li[i], "click", switchItem);
			}
		}
	return true;
	}
}

function Taber(clsTab, clsActive, clsInactive) {
	
	var own = this;
	
	this.fixedHeight = false;
	this.clsTab      = "tab";          // default tab class
	this.clsActive   = "tabActive";    // default activated class
	this.clsInactive = "tabInactive";  // default deactivated class

	if (typeof clsTab != "undefined") own.clsTab = clsTab;
	if (typeof clsActive != "undefined") own.clsActive = clsActive;
	if (typeof clsInactive != "undefined") own.clsInactive = clsInactive;
	
	this.init = function(dl, clsTab, clsActive, clsInactive) {
		if (typeof dl == "undefined") return false;
		if (typeof clsTab != "undefined") own.clsTab = clsTab;
		if (typeof clsActive != "undefined") own.clsActive = clsActive;
		if (typeof clsInactive != "undefined") own.clsInactive = clsInactive;
		var i, j; // int iterators
		var currentNode; // DOM node - iterator
		var dt = null; // HTMLelement dt
		var dd = null; // HTMLelement dd
		var ddCache = new Array(); // cache for dd nodes
		var toRemove = new Array(); // dd nodes to remove
		var ddHeight = 0; // int, height of largest dd

		if (dl && dl.tagName && dl.tagName.toLowerCase() == "dl") { // dl is valid definition list

			dl.activeTab = null;
			dl.firstTab = null;
			dl.lastTab = null;

			currentNode = dl.firstChild;
			do {
				if (currentNode.tagName) { // Node is tag, go on
					if (currentNode.tagName.toLowerCase() == "dt") {
						// definition term found, process it
						dt = currentNode;
						if (dl.firstTab == null) dl.firstTab = dt;
						dl.lastTab = dt;
						dt.tabReference = new Array();
						cls.add(dt, own.clsTab);
						if (cls.has(dt, own.clsActive))
							dl.activeTab = dt;
						cls.add(dt, clsInactive);
						evt.add(dt, "click", own.clickAction);
					} else if (currentNode.tagName.toLowerCase() == "dd") {
						// definition data found
						if (dt == null) return false; // dd found before first dt - bad dl structure, initialization fails
						dd = currentNode.cloneNode(true);
						ddCache[ddCache.length] = dd;
						dt.tabReference[dt.tabReference.length] = dd;
						dd.tabReference = dt;
						cls.add(dd, own.clsTab);
						toRemove[toRemove.length] = currentNode;
					}
				}
				currentNode = currentNode.nextSibling;
			} while (currentNode);
			
			// remove old definition data - they will be inserted to the end of list later

			for (i = 0; i < toRemove.length; i++)
				dl.removeChild(toRemove[i]);

			// insert new definition data now
			for (i = 0; i < ddCache.length; i++) {
				ddCache[i].style.display = "none";
				dl.appendChild(ddCache[i]);
			}

			// set active node
			if (dl.activeTab)
				own.activateTab(dl.activeTab);
			else
				own.activateTab(dl.firstTab);
		}
		return true;
	}
	
	this.getTab = function(e) {
		e = evt.fix(e); // fix MSIE event model
		obj = e.target; // search for the right object
		while(obj.tagName.toLowerCase() != "dt") obj = obj.parentNode;
		return obj;
	}

	this.activateTab = function(tab) {
		if (typeof tab == "undefined") return false;
		var i; // int iterator
		var tabSet; // HTMLelement
		if (tab && (tab.tagName) && (tab.tagName.toLowerCase() == "dt")) {
			tabSet = tab.parentNode;
			// check if given dl is really tabber
			if (tabSet.activeTab == null) tabSet.activeTab = tab;
			else if(tabSet.activeTab) { // this could be really tabber
				if(tab != tabSet.activeTab) { // if tab is not already active
					// set active tab inactive
					cls.replace(tabSet.activeTab, own.clsActive, own.clsInactive);
					for(i = 0; i < tabSet.activeTab.tabReference.length; i++) {
						cls.replace(tabSet.activeTab.tabReference[i], own.clsActive, own.clsInactive);
						tabSet.activeTab.tabReference[i].style.display ="none";
					}
					tabSet.activeTab = tab;
				}
			}
			// set new tab active
			cls.remove(tabSet.activeTab, own.clsInactive);
			cls.add(tabSet.activeTab, own.clsActive);
			for (i = 0; i < tab.tabReference.length; i++) {
				cls.remove(tab.tabReference[i], own.clsInactive);
				cls.add(tab.tabReference[i], own.clsActive);
				tabSet.activeTab.tabReference[i].style.display = "";
			}
			return true;
		}
		return false;
	}
	
	this.clickAction = function(e) {
		var tabLinks; // HTMLcollection
		tab = own.getTab(e);
		if (tab == null) return false;
		tabLinks = tab.getElementsByTagName("a");
		if (tabLinks[0]) window.location = tabLinks[0].href;
		own.activateTab(tab);
		return true;
	}
}

var taber = new Taber("tab", "active", "inactive");

