// JavaScript Document

function ctTreeInfo (nodeProperties, prefix, hideType, expandLevel) {
	this.nodeProperties = nodeProperties;
	this.currentItem = null;
	this.prefix = prefix;
	this.hideType =  hideType;
	this.expandLevel = expandLevel;
	this.beginIndex = 0;
	this.endIndex = 0;
}

function ctMenuInfo (id, idSub) {
	this.id = id;
	this.idSub = idSub;
}

var _ctIDSubMenuCount = 0;
var _ctIDSubMenu = 'ctSubTreeID';
var _ctCurrentItem = null;
var _ctNoAction = new Object ();
var _ctItemList = new Array ();
var _ctTreeList = new Array ();
var _ctMenuList = new Array ();
var _ctMenuInitStr = '';

var _ctNodeProperties = {
	folderLeft: [['', '']],
  	folderRight: [['', '']],
	itemLeft: [''],
	itemRight: [''],
	folderConnect: [[['',''],['','']]],
	itemConnect: [['',''],['','']],
	spacer: [['&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;', '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;']],
	themeLevel: 1
};

function ctNewSubMenuID () {
	return _ctIDSubMenu + (++_ctIDSubMenuCount);
}

function ctActionItem () {
	return ' onmouseover="ctItemMouseOver (this.parentNode)" onmouseout="ctItemMouseOut (this.parentNode)" onmousedown="ctItemMouseDown (this.parentNode)" onmouseup="ctItemMouseUp (this.parentNode)"';
}

function ctNoActionItem (item) {
	return item[1];
}

function ctGetPropertyLevel (level, property) {
	return (level >= property.length) ? (property.length - 1) : level;
}

function ctCollapseTree (id) {
	var menu = ctGetObject (id).firstChild;
	var i;
	for (i = 0; i < menu.ctItems.length; ++i)
		ctCloseFolder (menu.ctItems[i]);
}

function ctExpandTree (id, expandLevel) {
	if (expandLevel <= 0)
		return;
	var obj = ctGetObject (id);
	if (!obj)
		return;
	var thisMenu = obj.firstChild;
	if (!thisMenu)
		return;
	ctExpandTreeSub (thisMenu, expandLevel)
}

function ctExpandTreeSub (subMenu, expandLevel) {
	if (subMenu.ctLevel >= expandLevel)
		return;
	var i;
	var item;
	for (i = 0; i < subMenu.ctItems.length; ++i) {
		item = subMenu.ctItems[i];
		if (item.ctIdSub) {
			ctOpenFolder (item);
			ctExpandTreeSub (ctGetObject (item.ctIdSub), expandLevel);
		}
	}
}

function ctExposeItem (treeIndex, link) {
	if (treeIndex < 0 || treeIndex >= _ctTreeList.length)
		return;
	var tree = _ctTreeList[treeIndex];
	var endIndex = tree.endIndex;
	var i;
	for (i = tree.beginIndex; i < endIndex; ++i) {
		if (_ctItemList[i].length > 2 &&
			_ctItemList[i][2] == link) {
			return ctExposeTreeIndex (treeIndex, i);
		}
	}
}

function ctExposeTreeIndex (treeIndex, index) {
	var item = ctGetObject ('ctItemID' + (_ctTreeList[treeIndex].beginIndex + index)).parentNode;
	if (!item)
		return null;
	var parentItem = ctGetThisMenu (item).ctParent;
	if (parentItem)
		ctExposeTreeIndexSub (parentItem);
	ctSetSelectedItem (item);
	return item;
}

function ctExposeTreeIndexSub (item) {
	var parentItem = ctGetThisMenu (item).ctParent;
	if (parentItem)
		ctExposeTreeIndexSub (parentItem);
	ctOpenFolder (item);
}

function ctMarkItem (treeIndex, link) {
	if (treeIndex < 0 || treeIndex >= _ctTreeList.length)
		return;
	var tree = _ctTreeList[treeIndex];
	var endIndex = tree.endIndex;
	var i;
	for (i = tree.beginIndex; i < endIndex; ++i) {
		if (_ctItemList[i].length > 2 &&
			_ctItemList[i][2] == link) {
			var item = ctGetObject ('ctItemID' + (_ctTreeList[treeIndex].beginIndex + i)).parentNode;
			if (!item)
				return null;
			if (item.id == "JSCookTreeItem")
				item.id = 'JSCookTreeMarked';
			return item;
		}
	}
}

function ctMarkTreeIndex (treeIndex, index) {
	var item = ctGetObject ('ctItemID' + (_ctTreeList[treeIndex].beginIndex + index)).parentNode;
	if (!item)
		return null;
	if (item.id == "JSCookTreeItem")
		item.id = 'JSCookTreeMarked';
	return item;
}

function ctGetSelectedItem (treeIndex) {
	if (_ctTreeList[treeIndex].hideType <= 1)
		return _ctTreeList[treeIndex].currentItem;
	else
		return _ctCurrentItem;
}

function ctDraw (id, tree, nodeProperties, prefix, hideType, expandLevel) {
	var obj = ctGetObject (id);
	if (!nodeProperties)
		nodeProperties = _ctNodeProperties;
	if (!prefix)
		prefix = '';
	if (!hideType)
		hideType = 0;
	if (!expandLevel)
		expandLevel = 0;
	_ctTreeList[_ctTreeList.length] = new ctTreeInfo (nodeProperties, prefix, hideType, expandLevel);
	var treeIndex = _ctTreeList.length - 1;
	var beginIndex = _ctItemList.length;
	_ctMenuInitStr = '';
	var str = ctDrawSub (tree, true, null, treeIndex, 0, nodeProperties, prefix, '');
	obj.innerHTML = str;
	eval (_ctMenuInitStr);
	_ctMenuInitStr = '';
	var endIndex = _ctItemList.length;
	_ctTreeList[treeIndex].beginIndex = beginIndex;
	_ctTreeList[treeIndex].endIndex = endIndex;
	if (expandLevel)
		ctExpandTree (id, expandLevel);
	return treeIndex;
}

function ctDrawSub (subMenu, isMain, id, treeIndex, level, nodeProperties, prefix, indent) {
	var lvl = level;
	if (lvl > nodeProperties.themeLevel)
		lvl = nodeProperties.themeLevel;
	var str = '<div class="' + prefix + 'TreeLevel' + lvl + '"';
	if (!isMain)
		str += ' id="' + id + '"';
	str += '>';
	var strSub = '';
	var item;
	var idSub;
	var hasChild;
	var classStr;
	var connectSelect;
	var childIndent;
	var index;
	var actionStr;
	var itemID;
	var markerStr;
	var themeLevel = nodeProperties.themeLevel;
	var i;
	if (isMain)
		i = 0;
	else
		i = 5;
	var className = ' class="' + prefix + 'Row"';
	for (; i < subMenu.length; ++i) {
		item = subMenu[i];
		if (!item)
			continue;
		_ctItemList[_ctItemList.length] = item;
		index = _ctItemList.length - 1;
		hasChild = (item.length > 5);
		idSub = hasChild ? ctNewSubMenuID () : null;
		str += '<table cellspacing="0" class="' + prefix + 'Table">';
		str += '<tr' + className;
		if (hasChild)
			str += ' id="JSCookTreeFolderClosed">';
		else
			str += ' id="JSCookTreeItem">';
		classStr = prefix + (hasChild ? 'Folder' : 'Item');
		itemID = 'ctItemID' + index;
		markerStr = ' id="' + itemID + '"';
		_ctMenuInitStr += 'ctSetupItem (ctGetObject ("' + itemID + '").parentNode,' + index + ',' + treeIndex + ',' + level + ',' + (idSub ? ('"' + idSub + '"') : 'null') + ');';
		str += '<td class="' + classStr + 'Spacer"' + markerStr + '>' + indent;
 		str += '</td>';
		if (item[0] == _ctNoAction) {
			str += ctNoActionItem (item, prefix);
			str += '</tr></table>';
			continue;
		}
		actionStr = ctActionItem ();
		str += '<td class="' + classStr + 'Left"' + actionStr + '>';
		if (hasChild) {
			connectSelect = ctHasNextItem (i, subMenu) ? 0 : 1;
			lvl = ctGetPropertyLevel (level, nodeProperties.folderConnect);
			str += '<span class="JSCookTreeFolderClosed">' + nodeProperties.folderConnect[lvl][connectSelect][0] + '</span>' +
				   '<span class="JSCookTreeFolderOpen">' + nodeProperties.folderConnect[lvl][connectSelect][1] + '</span>';
		}
		else {
			connectSelect = ctHasNextItem (i, subMenu) ? 0 : 1;
			lvl = ctGetPropertyLevel (level, nodeProperties.itemConnect);
			str += nodeProperties.itemConnect[lvl][connectSelect];
		}
		if (item[0] != null && item[0] != _ctNoAction) {
			str += item[0];
		}
		else if (hasChild) {
			lvl = ctGetPropertyLevel (level, nodeProperties.folderLeft);
			str += '<span class="JSCookTreeFolderClosed">' + nodeProperties.folderLeft[lvl][0] + '</span>' +
				   '<span class="JSCookTreeFolderOpen">' + nodeProperties.folderLeft[lvl][1] + '</span>';
		}
		else {
			lvl = ctGetPropertyLevel (level, nodeProperties.itemLeft);
			str += nodeProperties.itemLeft[lvl];
		}
		str += '</td>';
		str += '<td class="' + classStr + 'Text"' + actionStr + '>';
		str += '<a';
		if (item[2] != null) {
			str += ' href="' + item[2] + '"';
			if (item[3])
				str += ' target="' + item[3] + '"';
		}
		if (item[4] != null)
			str += ' title="' + item[4] + '"';
		else
			str += ' title="' + item[1] + '"';
		str += '>' + item[1] + '</a></td>';
		str += '<td class="' + classStr + 'Right"' + actionStr + '>';
		if (hasChild) {
			lvl = ctGetPropertyLevel (level, nodeProperties.folderRight);
			str += '<span class="JSCookTreeFolderClosed">' + nodeProperties.folderRight[lvl][0] + '</span>' +
				   '<span class="JSCookTreeFolderOpen">' + nodeProperties.folderRight[lvl][1] + '</span>';
		}
		else {
			lvl = ctGetPropertyLevel (level, nodeProperties.itemRight);
			str += nodeProperties.itemRight[lvl];
		}
		str += '</td>'
		str += '</tr></table>';
		if (hasChild) {
			childIndent = indent;
			lvl = ctGetPropertyLevel (level, nodeProperties.spacer);
			childIndent += nodeProperties.spacer[lvl][connectSelect];
			str += ctDrawSub (item, false, idSub, treeIndex, level + 1, nodeProperties, prefix, childIndent);
		}
	}

	str += '</div>';
	return str;
}

function ctItemMouseOver (item) {
	var treeItem = _ctItemList[item.ctIndex];
	var isDefaultItem = ctIsDefaultItem (treeItem);
	if (isDefaultItem) {
		var className = ctGetDefaultClassName (item);
		if (item.className == className)
			item.className = className + 'Hover';
	}
}

function ctItemMouseOut (item) {
	if (ctIsDefaultItem (_ctItemList[item.ctIndex])) {
		var className = ctGetDefaultClassName (item);
		if (item.className == (className + 'Hover') || item.className == (className + 'Active')) {
			var tree = _ctTreeList[item.ctTreeIndex];
			var currentItem = (tree.hideType <= 1) ? tree.currentItem : _ctCurrentItem;
			if (item == currentItem)
				item.className = className + 'Selected';
			else
				item.className = className;
		}
	}
}

function ctItemMouseDown (item) {
	if (ctIsDefaultItem (_ctItemList[item.ctIndex])) {
		var className = ctGetDefaultClassName (item);
		if (item.className == (className + 'Hover'))
			item.className = className + 'Active';
	}
}

function ctItemMouseUp (item) {
	if (item.ctIdSub) {
		var subMenu = ctGetObject (item.ctIdSub);
		if (subMenu.style.display == 'block') {
			ctCloseFolder (item);
		}
		else {
			ctOpenFolder (item);
		}
	}
	ctSetSelectedItem (item);
}

function ctSetSelectedItem (item) {
	var tree = _ctTreeList[item.ctTreeIndex];
	var hideType = tree.hideType;
	var otherItem;
	if (hideType <= 1)
		otherItem = tree.currentItem;
	else
		otherItem = _ctCurrentItem;
	if (otherItem != item) {
		ctLabelMenu (item);
		if (otherItem) {
			if (ctIsDefaultItem (_ctItemList[otherItem.ctIndex])) {
				var className = ctGetDefaultClassName (otherItem);
				if (otherItem.className == (className + 'Selected'))
					otherItem.className = className;
			}
			if (hideType > 0 && otherItem)
				ctHideMenu (otherItem, item);
		}
		if (hideType <= 1)
			tree.currentItem = item;
		else
			_ctCurrentItem = item;
		if (ctIsDefaultItem (_ctItemList[item.ctIndex])) {
			var className = ctGetDefaultClassName (item);
			item.className = className + 'Selected';
		}
	}
}

function ctIsFolderOpen (item) {
	if (item.id == 'JSCookTreeFolderOpen')
		return true;
	return false;
}

function ctOpenFolder (item) {
	if (ctIsFolderOpen (item))
		return;
	if (item.ctIdSub) {
		var subMenu = ctGetObject (item.ctIdSub);
		subMenu.style.display = 'block';

		item.id = 'JSCookTreeFolderOpen';
	}
}

function ctCloseFolder (item) {
	if (!ctIsFolderOpen (item))
		return;
	if (item.ctIdSub) {
		var subMenu = ctGetObject (item.ctIdSub);
		var i;
		for (i = 0; i < subMenu.ctSubMenu.length; ++i)
			ctCloseFolder (subMenu.ctSubMenu[i].ctParent);
		var expandLevel = _ctTreeList[item.ctTreeIndex].expandLevel;
		if (item.ctLevel < expandLevel)
			return;
		subMenu.style.display = 'none';
		item.id = 'JSCookTreeFolderClosed';
	}
}

function ctSetupItem (item, index, treeIndex, level, idSub) {
	if (!item.ctIndex) {
		item.ctIndex = index;
		item.ctTreeIndex = treeIndex;
		item.ctLevel = level;
		item.ctIdSub = idSub;
	}
	var thisMenu = ctGetThisMenu (item);
	ctSetupMenu (thisMenu, item, null, null);
	if (idSub) {
		var subMenu = ctGetObject (idSub);
		ctSetupMenu (subMenu, null, thisMenu, item);
	}
}

function ctSetupMenu (thisMenu, thisItem, parentMenu, parentItem) {
	if (!thisMenu.ctSubMenu)
			thisMenu.ctSubMenu = new Array ();
	if (parentItem) {
		if (!thisMenu.ctParent) {
			thisMenu.ctParent = parentItem;
			thisMenu.ctLevel = parentItem.ctLevel + 1;
			parentMenu.ctSubMenu[parentMenu.ctSubMenu.length] = thisMenu;
		}
	}
	if (thisItem) {
		if (!thisItem.ctMenu) {
			thisItem.ctMenu = thisMenu;
			thisMenu.ctLevel = thisItem.ctLevel;
			if (!thisMenu.ctItems)
				thisMenu.ctItems = new Array ();
			thisMenu.ctItems[thisMenu.ctItems.length] = thisItem;
		}
	}
}

function ctLabelMenu (item) {
	var thisMenu = ctGetThisMenu (item);
	while (thisMenu && thisMenu.ctLevel != 0) {
		thisMenu.ctCurrentItem = item;
		thisMenu = ctGetThisMenu (thisMenu.ctParent);
	}
}

function ctHideMenu (item, activeItem) {
	var subMenu;
	while (item) {
		if (item.ctIdSub &&
			(subMenu = ctGetObject (item.ctIdSub)).ctLevel &&
			(subMenu.ctCurrentItem != activeItem)) {
			ctCloseFolder (item);
		}
		item = ctGetThisMenu (item).ctParent;
	}
}

function ctGetThisMenu (item) {
	var str = _ctTreeList[item.ctTreeIndex].prefix;
	if (item.ctLevel == 0)
		str += 'TreeLevel0';
	else {
		var themeLevel = _ctTreeList[item.ctTreeIndex].nodeProperties.themeLevel;
		var lvl = (item.ctLevel < themeLevel) ? item.ctLevel : themeLevel;
		str += 'TreeLevel' + lvl;
	}
	while (item) {
		if (item.className == str)
			return item;
		item = item.parentNode;
	}
	return null;
}

function ctHasNextItem (index, tree) {
	if (index < (tree.length - 2) ||
		(index == (tree.length - 2) && tree[index + 1]))
		return true;
	else
		return false;
}

function ctGetDefaultClassName (item) {
	var tree = _ctTreeList[item.ctTreeIndex];
	return tree.prefix + 'Row';
}

function ctIsDefaultItem (item) {
	if (item[0] == _ctNoAction)
		return false;
	return true;
}

function ctGetObject (id) {
	if (document.all)
		return document.all[id];
	return document.getElementById (id);
}

function ctGetProperties (obj) {
	var msg = obj + ':\n';
	var i;
	for (i in obj)
		msg += i + ' = ' + obj[i] + '; ';
	return msg;
}
