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 (opening){
str = ' onmouseover="ctItemMouseOver (this.parentNode)" onmouseout="ctItemMouseOut (this.parentNode)" onmousedown="ctItemMouseDown (this.parentNode)"';
if (opening==0)
str += ' onmouseup="ctItemMouseUp (this.parentNode)"';
return str;}
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 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 (0);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];}actionStr = ctActionItem (item[4]);
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] + '"';}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;}
