if(typeof _cmIDCount=='undefined'){
var _cmIDCount=0;
var _cmIDName='cmSubMenuID';
var _cmTimeOut=null;
var _cmCurrentItem=null;
var _cmNoAction=new Object();
var _cmNoClick=new Object();
var _cmSplit=new Object();
var _cmItemList=new Array();
var _cmNodeProperties={
// HTML code to the left of the folder item
mainFolderLeft: '',
// HTML code to the right of the folder item
mainFolderRight: '',
// HTML code to the left of the regular item
mainItemLeft: '',
// HTML code to the right of the regular item
mainItemRight: '',
// HTML code to the left of the folder item
folderLeft: '',
// HTML code to the right of the folder item
folderRight: '',
// HTML code to the left of the regular item
itemLeft: '',
// HTML code to the right of the regular item
itemRight: '',
// cell spacing for main menu
mainSpacing: 0,
// cell spacing for sub menus
subSpacing: 0,
// auto disappear time for submenus in milli-seconds
delay: 500,
// act on click to open sub menu
// not yet implemented
// 0 : use default behavior
// 1 : hover open in all cases
// 2 : click on main, hover on sub
// 3 : click open in all cases
clickOpen: 1
};
function cmNewID ()
{
return _cmIDName + (++_cmIDCount);
}
function cmActionItem (item, prefix, isMain, idSub, orient, nodeProperties)
{
var clickOpen=_cmNodeProperties.clickOpen;
if (nodeProperties.clickOpen)
clickOpen=nodeProperties.clickOpen;
_cmItemList[_cmItemList.length]=item;
var index=_cmItemList.length - 1;
idSub=(!idSub) ? 'null' : ('\'' + idSub + '\'');
orient='\'' + orient + '\'';
prefix='\'' + prefix + '\'';
var onClick=(clickOpen==3) || (clickOpen==2 && isMain);
var returnStr;
if (onClick)
returnStr=' onmouseover="cmItemMouseOver (this,' + prefix + ',' + isMain + ',' + idSub + ',' + index + ')" onmousedown="cmItemMouseDownOpenSub (this,' + index + ',' + prefix + ',' + orient + ',' + idSub + ')"';
else
returnStr=' onmouseover="cmItemMouseOverOpenSub (this,' + prefix + ',' + isMain + ',' + idSub + ',' + orient + ',' + index + ')" onmousedown="cmItemMouseDown (this,' + index + ')"';
return returnStr + ' onmouseout="cmItemMouseOut (this,' + nodeProperties.delay + ')" onmouseup="cmItemMouseUp (this,' + index + ')"';
}
function cmNoClickItem (item, prefix, isMain, idSub, orient, nodeProperties)
{
_cmItemList[_cmItemList.length]=item;
var index=_cmItemList.length - 1;
idSub=(!idSub) ? 'null' : ('\'' + idSub + '\'');
orient='\'' + orient + '\'';
prefix='\'' + prefix + '\'';
return ' onmouseover="cmItemMouseOver (this,' + prefix + ',' + isMain + ',' + idSub + ',' + index + ')" onmouseout="cmItemMouseOut (this,' + nodeProperties.delay + ')"';
}

function cmNoActionItem (item, prefix)
{
return item[1];
}

function cmSplitItem (prefix, isMain, vertical)
{
var classStr='cm' + prefix;
if (isMain)
{
classStr +='Main';
if (vertical)
classStr +='HSplit';
else
classStr +='VSplit';
}
else
classStr +='HSplit';
return eval (classStr);
}
function cmDrawSubMenu (subMenu, prefix, id, orient, nodeProperties)
{
var str='<div class="' + prefix + 'SubMenu" id="' + id + '"><table summary="sub menu" cellspacing="' + nodeProperties.subSpacing + '" class="' + prefix + 'SubMenuTable">';
var strSub='';

var item;
var idSub;
var hasChild;

var i;

var classStr;

for (i=5; i < subMenu.length; ++i)
{
item=subMenu[i];
if (!item)
continue;

if (item==_cmSplit)
item=cmSplitItem (prefix, 0, true);

hasChild=(item.length > 5);
idSub=hasChild ? cmNewID () : null;

str +='<tr class="' + prefix + 'MenuItem"';
if (item[0] !=_cmNoClick)
str +=cmActionItem (item, prefix, 0, idSub, orient, nodeProperties);
else
str +=cmNoClickItem (item, prefix, 0, idSub, orient, nodeProperties);
str +='>'

if (item[0]==_cmNoAction || item[0]==_cmNoClick)
{
str +=cmNoActionItem (item, prefix);
str +='</tr>';
continue;
}

classStr=prefix + 'Menu';
classStr +=hasChild ? 'Folder' : 'Item';

str +='<td class="' + classStr + 'Left">';

if (item[0] !=null)
str +=item[0];
else
str +=hasChild ? nodeProperties.folderLeft : nodeProperties.itemLeft;

str +='</td><td class="' + classStr + 'Text">' + item[1];

str +='</td><td class="' + classStr + 'Right">';

if (hasChild)
{
str +=nodeProperties.folderRight;
strSub +=cmDrawSubMenu (item, prefix, idSub, orient, nodeProperties);
}
else
str +=nodeProperties.itemRight;
str +='</td></tr>';
}

str +='</table></div>' + strSub;
return str;
}
function cmDraw (id, menu, orient, nodeProperties, prefix)
{
var obj=cmGetObject (id);

if (!nodeProperties)
nodeProperties=_cmNodeProperties;
if (!prefix)
prefix='';
if (!orient)
orient='hbr';
var orientStr=String (orient);
var orientSub;
var vertical;
var orientVorH=orientStr.charAt(0).toUpperCase();
var str='<table summary="main menu" class="' + prefix + 'Menu' + orientVorH + '" cellspacing="' + nodeProperties.mainSpacing + '">';
var strSub='';
if (orientStr.charAt (0)=='h')
{
orientSub='v' + orientStr.substr (1, 2);
str +='<tr>';
vertical=false;
}
else
{
orientSub='v' + orientStr.substr (1, 2);
vertical=true;
}

var i;
var item;
var idSub;
var hasChild;

var classStr;

for (i=0; i < menu.length; ++i)
{
item=menu[i];

if (!item)
continue;

str +=vertical ? '<tr' : '<td';
str +=' class="' + prefix + 'MainItem"';

hasChild=(item.length > 5);
idSub=hasChild ? cmNewID () : null;

str +=cmActionItem (item, prefix, 1, idSub, orient, nodeProperties) + '>';

if (item==_cmSplit)
item=cmSplitItem (prefix, 1, vertical);

if (item[0]==_cmNoAction || item[0]==_cmNoClick)
{
str +=cmNoActionItem (item, prefix);
str +=vertical? '</tr>' : '</td>';
continue;
}

classStr=prefix + 'Main' + (hasChild ? 'Folder' : 'Item');

str +=vertical ? '<td' : '<span';
str +=' class="' + classStr + 'Left">';

str +=(item[0]==null) ? (hasChild ? nodeProperties.mainFolderLeft : nodeProperties.mainItemLeft)
: item[0];
str +=vertical ? '</td>' : '</span>';

str +=vertical ? '<td' : '<span';
str +=' class="' + classStr + 'Text">';
str +=item[1];

str +=vertical ? '</td>' : '</span>';

str +=vertical ? '<td' : '<span';
str +=' class="' + classStr + 'Right">';

str +=hasChild ? nodeProperties.mainFolderRight : nodeProperties.mainItemRight;

str +=vertical ? '</td>' : '</span>';

str +=vertical ? '</tr>' : '</td>';

if (hasChild)
strSub +=cmDrawSubMenu (item, prefix, idSub, orientSub, nodeProperties);
}
if (!vertical)
str +='</tr>';
str +='</table>' + strSub;
obj.innerHTML=str;
}
function cmDrawFromText (id, orient, nodeProperties, prefix)
{
var domMenu=cmGetObject (id);
var menu=null;
for (var currentDomItem=domMenu.firstChild; currentDomItem; currentDomItem=currentDomItem.nextSibling)
{
if (!currentDomItem.tagName || currentDomItem.tagName.toLowerCase () !='ul')
continue;
menu=cmDrawFromTextSubMenu (currentDomItem);
break;
}
if (menu)
cmDraw (id, menu, orient, nodeProperties, prefix);
}
function cmDrawFromTextSubMenu (domMenu)
{
var items=new Array ();
for (var currentDomItem=domMenu.firstChild; currentDomItem; currentDomItem=currentDomItem.nextSibling)
{
if (!currentDomItem.tagName || currentDomItem.tagName.toLowerCase () !='li')
continue;
if (currentDomItem.firstChild==null)
{
items[items.length]=_cmSplit;
continue;
}
var item=new Array ();
var currentItem=currentDomItem.firstChild;
for (; currentItem; currentItem=currentItem.nextSibling)
{
if (!currentItem.tagName || currentItem.tagName.toLowerCase () !='span')
continue;
if (!currentItem.firstChild)
item[0]=null;
else
item[0]=currentItem.innerHTML;
break;
}
if (!currentItem)
continue;
for (; currentItem; currentItem=currentItem.nextSibling)
{
if (!currentItem.tagName || currentItem.tagName.toLowerCase () !='a')
continue;
item[1]=currentItem.innerHTML;
item[2]=currentItem.href;
item[3]=currentItem.target;
item[4]=currentItem.title;
if (item[4]=='')
item[4]=null;
break;
}

for (; currentItem; currentItem=currentItem.nextSibling)
{
if (!currentItem.tagName || currentItem.tagName.toLowerCase () !='ul')
continue;
var subMenuItems=cmDrawFromTextSubMenu (currentItem);
for (i=0; i < subMenuItems.length; ++i)
item[i + 5]=subMenuItems[i];
break;
}
items[items.length]=item;
}
return items;
}
function cmItemMouseOver (obj, prefix, isMain, idSub, index)
{
clearTimeout (_cmTimeOut);

if (!obj.cmPrefix)
{
obj.cmPrefix=prefix;
obj.cmIsMain=isMain;
}

var thisMenu=cmGetThisMenu (obj, prefix);
if (!thisMenu.cmItems)
thisMenu.cmItems=new Array ();
var i;
for (i=0; i < thisMenu.cmItems.length; ++i)
{
if (thisMenu.cmItems[i]==obj)
break;
}
if (i==thisMenu.cmItems.length)
{
thisMenu.cmItems[i]=obj;
}
if (_cmCurrentItem)
{
if (_cmCurrentItem==obj || _cmCurrentItem==thisMenu)
{
var item=_cmItemList[index];
cmSetStatus (item);
return;
}

var thatPrefix=_cmCurrentItem.cmPrefix;
var thatMenu=cmGetThisMenu (_cmCurrentItem, thatPrefix);

if (thatMenu !=thisMenu.cmParentMenu)
{
if (_cmCurrentItem.cmIsMain)
_cmCurrentItem.className=thatPrefix + 'MainItem';
else
_cmCurrentItem.className=thatPrefix + 'MenuItem';
if (thatMenu.id !=idSub)
cmHideMenu (thatMenu, thisMenu, thatPrefix);
}
}
_cmCurrentItem=obj;
cmResetMenu (thisMenu, prefix);

var item=_cmItemList[index];
var isDefaultItem=cmIsDefaultItem (item);

if (isDefaultItem)
{
if (isMain)
obj.className=prefix + 'MainItemHover';
else
obj.className=prefix + 'MenuItemHover';
}

cmSetStatus (item);
}
function cmItemMouseOverOpenSub (obj, prefix, isMain, idSub, orient, index)
{
cmItemMouseOver (obj, prefix, isMain, idSub, index);

if (idSub)
{
var subMenu=cmGetObject (idSub);
cmShowSubMenu (obj, prefix, subMenu, orient);
}
}
function cmItemMouseOut (obj, delayTime)
{
if (!delayTime)
delayTime=_cmNodeProperties.delay;
_cmTimeOut=window.setTimeout ('cmHideMenuTime ()', delayTime);
window.defaultStatus='';
}
function cmItemMouseDown (obj, index)
{
if (cmIsDefaultItem (_cmItemList[index]))
{
if (obj.cmIsMain)
obj.className=obj.cmPrefix + 'MainItemActive';
else
obj.className=obj.cmPrefix + 'MenuItemActive';
}
}
function cmItemMouseDownOpenSub (obj, index, prefix, orient, idSub)
{
cmItemMouseDown (obj, index);

if (idSub)
{
var subMenu=cmGetObject (idSub);
cmShowSubMenu (obj, prefix, subMenu, orient);
}
}
function cmItemMouseUp (obj, index)
{
var item=_cmItemList[index];

var link=null, target='_self';

if (item.length > 2)
link=item[2];
if (item.length > 3 && item[3])
target=item[3];

if (link !=null)
{
window.open (link, target);
}

var prefix=obj.cmPrefix;
var thisMenu=cmGetThisMenu (obj, prefix);

var hasChild=(item.length > 5);
if (!hasChild)
{
if (cmIsDefaultItem (item))
{
if (obj.cmIsMain)
obj.className=prefix + 'MainItem';
else
obj.className=prefix + 'MenuItem';
}
cmHideMenu (thisMenu, null, prefix);
}
else
{
if (cmIsDefaultItem (item))
{
if (obj.cmIsMain)
obj.className=prefix + 'MainItemHover';
else
obj.className=prefix + 'MenuItemHover';
}
}
}
function cmMoveSubMenu (obj, subMenu, orient)
{
var mode=String (orient);
var p=subMenu.offsetParent;
var subMenuWidth=cmGetWidth (subMenu);
var horiz=cmGetHorizontalAlign (obj, mode, p, subMenuWidth);
if (mode.charAt (0)=='h')
{
if (mode.charAt (1)=='b')
subMenu.style.top=(cmGetYAt (obj, p) + cmGetHeight (obj)) + 'px';
else
subMenu.style.top=(cmGetYAt (obj, p) - cmGetHeight (subMenu)) + 'px';
if (horiz=='r')
subMenu.style.left=(cmGetXAt (obj, p)) + 'px';
else
subMenu.style.left=(cmGetXAt (obj, p) + cmGetWidth (obj) - subMenuWidth) + 'px';
}
else
{
if (horiz=='r')
subMenu.style.left=(cmGetXAt (obj, p) + cmGetWidth (obj)) + 'px';
else
subMenu.style.left=(cmGetXAt (obj, p) - subMenuWidth) + 'px';
if (mode.charAt (1)=='b')
subMenu.style.top=(cmGetYAt (obj, p)) + 'px';
else
subMenu.style.top=(cmGetYAt (obj, p) + cmGetHeight (obj) - cmGetHeight (subMenu)) + 'px';
}
}
function cmGetHorizontalAlign (obj, mode, p, subMenuWidth)
{
var horiz=mode.charAt (2);
if (!(document.body))
return horiz;
var body=document.body;
var browserLeft;
var browserRight;
if (window.innerWidth)
{
browserLeft=window.pageXOffset;
browserRight=window.innerWidth + browserLeft;
}
else if (body.clientWidth)
{
browserLeft=body.clientLeft;
browserRight=body.clientWidth + browserLeft;
}
else
return horiz;
if (mode.charAt (0)=='h')
{
if (horiz=='r' && (cmGetXAt (obj) + subMenuWidth) > browserRight)
horiz='l';
if (horiz=='l' && (cmGetXAt (obj) + cmGetWidth (obj) - subMenuWidth) < browserLeft)
horiz='r';
return horiz;
}
else
{
if (horiz=='r' && (cmGetXAt (obj, p) + cmGetWidth (obj) + subMenuWidth) > browserRight)
horiz='l';
if (horiz=='l' && (cmGetXAt (obj, p) - subMenuWidth) < browserLeft)
horiz='r';
return horiz;
}
}
function cmShowSubMenu (obj, prefix, subMenu, orient)
{
if (!subMenu.cmParentMenu)
{
var thisMenu=cmGetThisMenu (obj, prefix);
subMenu.cmParentMenu=thisMenu;
if (!thisMenu.cmSubMenu)
thisMenu.cmSubMenu=new Array ();
thisMenu.cmSubMenu[thisMenu.cmSubMenu.length]=subMenu;
}
cmMoveSubMenu (obj, subMenu, orient);
subMenu.style.visibility='visible';
if (document.all)
{
if (!subMenu.cmOverlap)
subMenu.cmOverlap=new Array ();
cmHideControl ("IFRAME", subMenu);
cmHideControl ("SELECT", subMenu);
cmHideControl ("OBJECT", subMenu);
}
}
function cmResetMenu (thisMenu, prefix)
{
if (thisMenu.cmItems)
{
var i;
var str;
var items=thisMenu.cmItems;
for (i=0; i < items.length; ++i)
{
if (items[i].cmIsMain)
str=prefix + 'MainItem';
else
str=prefix + 'MenuItem';
if (items[i].className !=str)
items[i].className=str;
}
}
}
function cmHideMenuTime ()
{
if (_cmCurrentItem)
{
var prefix=_cmCurrentItem.cmPrefix;
cmHideMenu (cmGetThisMenu (_cmCurrentItem, prefix), null, prefix);
_cmCurrentItem=null;
}
}
function cmHideMenu (thisMenu, currentMenu, prefix)
{
var str=prefix + 'SubMenu';
if (thisMenu.cmSubMenu)
{
var i;
for (i=0; i < thisMenu.cmSubMenu.length; ++i)
{
cmHideSubMenu (thisMenu.cmSubMenu[i], prefix);
}
}
while (thisMenu && thisMenu !=currentMenu)
{
cmResetMenu (thisMenu, prefix);
if (thisMenu.className==str)
{
thisMenu.style.visibility='hidden';
cmShowControl (thisMenu);
}
else
break;
thisMenu=cmGetThisMenu (thisMenu.cmParentMenu, prefix);
}
}
function cmHideSubMenu (thisMenu, prefix)
{
if (thisMenu.style.visibility=='hidden')
return;
if (thisMenu.cmSubMenu)
{
var i;
for (i=0; i < thisMenu.cmSubMenu.length; ++i)
{
cmHideSubMenu (thisMenu.cmSubMenu[i], prefix);
}
}
cmResetMenu (thisMenu, prefix);
thisMenu.style.visibility='hidden';
cmShowControl (thisMenu);
}
function cmHideControl (tagName, subMenu)
{
var x=cmGetX (subMenu);
var y=cmGetY (subMenu);
var w=subMenu.offsetWidth;
var h=subMenu.offsetHeight;

var i;
for (i=0; i < document.all.tags(tagName).length; ++i)
{
var obj=document.all.tags(tagName)[i];
if (!obj || !obj.offsetParent)
continue;

var ox=cmGetX (obj);
var oy=cmGetY (obj);
var ow=obj.offsetWidth;
var oh=obj.offsetHeight;

if (ox > (x + w) || (ox + ow) < x)
continue;
if (oy > (y + h) || (oy + oh) < y)
continue;
if(obj.style.visibility=="hidden")
continue;
subMenu.cmOverlap[subMenu.cmOverlap.length]=obj;
obj.style.visibility="hidden";
}
}
function cmShowControl (subMenu)
{
if (subMenu.cmOverlap)
{
var i;
for (i=0; i < subMenu.cmOverlap.length; ++i)
subMenu.cmOverlap[i].style.visibility="";
}
subMenu.cmOverlap=null;
}
function cmGetThisMenu (obj, prefix)
{
var str1=prefix + 'SubMenu';
var str2=prefix + 'MenuH';
var str3=prefix + 'MenuV';
while (obj)
{
if (obj.className==str1 || obj.className==str2 || obj.className==str3)
return obj;
obj=obj.parentNode;
}
return null;
}
function cmIsDefaultItem (item)
{
if (item==_cmSplit || item[0]==_cmNoAction || item[0]==_cmNoClick)
return false;
return true;
}
function cmGetObject (id)
{
if (document.all)
return document.all[id];
return document.getElementById (id);
}
function cmGetWidth (obj)
{
var width=obj.offsetWidth;
if (width > 0 || !cmIsTRNode (obj))
return width;
if (!obj.firstChild)
return 0;
return obj.lastChild.offsetLeft - obj.firstChild.offsetLeft + cmGetWidth (obj.lastChild);
}
function cmGetHeight (obj)
{
var height=obj.offsetHeight;
if (height > 0 || !cmIsTRNode (obj))
return height;
if (!obj.firstChild)
return 0;
return obj.firstChild.offsetHeight;
}

function cmGetX (obj)
{
var x=0;

do
{
x +=obj.offsetLeft;
obj=obj.offsetParent;
}
while (obj);
return x;
}

function cmGetXAt (obj, elm)
{
var x=0;

while (obj && obj !=elm)
{
x +=obj.offsetLeft;
obj=obj.offsetParent;
}
if (obj==elm)
return x;
return x - cmGetX (elm);
}

function cmGetY (obj){
var y=0;
do{
y +=obj.offsetTop;
obj=obj.offsetParent;
}
while (obj);
return y;
}

function cmIsTRNode (obj){
var tagName=obj.tagName;
return tagName=="TR" || tagName=="tr" || tagName=="Tr" || tagName=="tR";
}

function cmGetYAt (obj, elm){
var y=0;
if (!obj.offsetHeight && cmIsTRNode (obj)){
var firstTR=obj.parentNode.firstChild;
obj=obj.firstChild;
y -=firstTR.firstChild.offsetTop;
}

while (obj && obj !=elm)
{
y +=obj.offsetTop;
obj=obj.offsetParent;
}

if (obj==elm) return y;
return y-cmGetY (elm);}
function cmSetStatus (item){
var descript='';
if (item.length > 4)
descript=(item[4] !=null) ? item[4] : (item[2] ? item[2] : descript);
else if (item.length > 2)
descript=(item[2] ? item[2] : descript);
window.defaultStatus=descript;
}

function cmGetProperties(obj){
if(obj==undefined) return 'undefined';
if(obj==null) return 'null';
var msg=obj + ':\n';var i;
for(i in obj) msg +=i + '=' + obj[i] + '; ';
return msg;}}
