[pLog-svn] r6152 - in plog/trunk/js/JSCookMenu: . ThemeOffice

Mark Wu markplace at gmail.com
Tue Jan 8 13:53:34 EST 2008


For reduce the number of javascript  library, maybe switch to yahoo menu is
a good idea.

http://developer.yahoo.com/yui/examples/menu/topnavfrommarkup_source.html

Mark

> -----Original Message-----
> From: plog-svn-bounces at devel.lifetype.net 
> [mailto:plog-svn-bounces at devel.lifetype.net] On Behalf Of 
> mark at devel.lifetype.net
> Sent: Wednesday, January 09, 2008 2:32 AM
> To: plog-svn at devel.lifetype.net
> Subject: [pLog-svn] r6152 - in plog/trunk/js/JSCookMenu: . ThemeOffice
> 
> Author: mark
> Date: 2008-01-08 13:32:15 -0500 (Tue, 08 Jan 2008)
> New Revision: 6152
> 
> Added:
>    plog/trunk/js/JSCookMenu/effect.js
> Modified:
>    plog/trunk/js/JSCookMenu/JSCookMenu.js
>    plog/trunk/js/JSCookMenu/ThemeOffice/theme.css
>    plog/trunk/js/JSCookMenu/ThemeOffice/theme.js
> Log:
> Upgrade JSCookMenu to 2.0.3
> 
> Modified: plog/trunk/js/JSCookMenu/JSCookMenu.js
> ===================================================================
> --- plog/trunk/js/JSCookMenu/JSCookMenu.js	2008-01-08 
> 12:17:06 UTC (rev 6151)
> +++ plog/trunk/js/JSCookMenu/JSCookMenu.js	2008-01-08 
> 18:32:15 UTC (rev 6152)
> @@ -1,6 +1,8 @@
>  /*
> -	JSCookMenu v1.4.4.  (c) Copyright 2002-2005 by Heng Yuan
> +	JSCookMenu v2.0.3 (c) Copyright 2002-2006 by Heng Yuan
>  
> +	http://jscook.sourceforge.net/JSCookMenu/
> +
>  	Permission is hereby granted, free of charge, to any 
> person obtaining a
>  	copy of this software and associated documentation 
> files (the "Software"),
>  	to deal in the Software without restriction, including 
> without limitation
> @@ -20,22 +22,12 @@
>  	DEALINGS IN THE SOFTWARE.
>  */
>  
> -// Globals
> -var _cmIDCount = 0;
> -var _cmIDName = 'cmSubMenuID';		// for creating 
> submenu id
> -
> -var _cmTimeOut = null;			// how long the 
> menu would stay
> -var _cmCurrentItem = null;		// the current menu 
> item being selected;
> -
> -var _cmNoAction = new Object ();	// indicate that the 
> item cannot be hovered.
> -var _cmNoClick = new Object ();		// similar to 
> _cmNoAction but does not respond to mouseup/mousedown events
> -var _cmSplit = new Object ();		// indicate 
> that the item is a menu split
> -
> -var _cmItemList = new Array ();		// a simple 
> list of items
> -
>  // default node properties
>  var _cmNodeProperties =
>  {
> +	// theme prefix
> +	prefix:	'',
> +
>    	// main menu display attributes
>    	//
>    	// Note.  When the menu bar is horizontal,
> @@ -51,34 +43,162 @@
>  	// HTML code to the left of the regular item
>  	mainItemLeft: '',
>  	// HTML code to the right of the regular item
> -	mainItemRight: '',
> +	mainItemRight:	'',
>  
>  	// sub menu display attributes
>  
>  	// HTML code to the left of the folder item
> -	folderLeft: '',
> +	folderLeft:		'',
>  	// HTML code to the right of the folder item
> -	folderRight: '',
> +	folderRight:	'',
>  	// HTML code to the left of the regular item
> -	itemLeft: '',
> +	itemLeft:		'',
>  	// HTML code to the right of the regular item
> -	itemRight: '',
> +	itemRight:		'',
>  	// cell spacing for main menu
> -	mainSpacing: 0,
> +	mainSpacing:	0,
>  	// cell spacing for sub menus
> -	subSpacing: 0,
> +	subSpacing:		0,
> +
> +	// optional settings
> +	// If not set, use the default
> +
>  	// auto disappear time for submenus in milli-seconds
> -	delay: 500,
> +	delay:			500,
>  
> +	// 1st layer sub menu starting index
> +	zIndexStart:	1000,
> +	// z-index incremental step for subsequent layers
> +	zIndexInc:		5,
> +
> +	// sub menu header appears before the sub menu table
> +	subMenuHeader:	null,
> +	// sub menu header appears after the sub menu table
> +	subMenuFooter:	null,
> +
> +	// submenu location adjustments
> +	//
> +	// offsetHMainAdjust for adjusting the first submenu
> +	// 		of a 'hbr' menu.
> +	// offsetVMainAdjust for adjusting the first submenu
> +	//		of a 'vbr' menu.
> +	// offsetSubAdjust for subsequent level of submenus
> +	//
> +	offsetHMainAdjust:	[0, 0],
> +	offsetVMainAdjust:	[0, 0],
> +	offsetSubAdjust:	[0, 0],
> +
>  	// 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
> +	// 3 : click open in all cases (illegal as of 1.5)
> +	clickOpen:		1,
> +
> +	// special effects on open/closing a sub menu
> +	effect:			null
>  };
>  
> +// Globals
> +var _cmIDCount = 0;
> +var _cmIDName = 'cmSubMenuID';		// for creating 
> submenu id
> +
> +var _cmTimeOut = null;				// how 
> long the menu would stay
> +var _cmCurrentItem = null;			// the current 
> menu item being selected;
> +
> +var _cmNoAction = new Object ();	// indicate that the 
> item cannot be hovered.
> +var _cmNoClick = new Object ();		// similar to 
> _cmNoAction but does not respond to mouseup/mousedown events
> +var _cmSplit = new Object ();		// indicate 
> that the item is a menu split
> +
> +var _cmMenuList = new Array ();		// a list of 
> the current menus
> +var _cmItemList = new Array ();		// a simple 
> list of items
> +
> +var _cmFrameList = new Array ();	// a pool of reusable iframes
> +var _cmFrameListSize = 0;			// keep track 
> of the actual size
> +var _cmFrameIDCount = 0;			// keep track 
> of the frame id
> +var _cmFrameMasking = true;			// use the frame masking
> +
> +// disable iframe masking for IE7
> +/*@cc_on
> +	@if (@_jscript_version >= 5.6)
> +		if (_cmFrameMasking)
> +		{
> +			var v = navigator.appVersion;
> +			var i = v.indexOf ("MSIE ");
> +			if (i >= 0)
> +			{
> +				if (parseInt 
> (navigator.appVersion.substring (i + 5)) >= 7)
> +					_cmFrameMasking = false;
> +			}
> +		}
> +	@end
> +@*/
> +
> +var _cmClicked = false;				// for onClick
> +
> +// flag for turning on off hiding objects
> +//
> +// 0: automatic
> +// 1: hiding
> +// 2: no hiding
> +var _cmHideObjects = 0;
> +
> +// Utility function to do a shallow copy a node property
> +function cmClone (nodeProperties)
> +{
> +	var returnVal = new Object ();
> +	for (v in nodeProperties)
> +		returnVal[v] = nodeProperties[v];
> +	return returnVal;
> +}
> +
> +//
> +// store the new menu information into a structure to 
> retrieve it later
> +//
> +function cmAllocMenu (id, menu, orient, nodeProperties, prefix)
> +{
> +	var info = new Object ();
> +	info.div = id;
> +	info.menu = menu;
> +	info.orient = orient;
> +	info.nodeProperties = nodeProperties;
> +	info.prefix = prefix;
> +	var menuID = _cmMenuList.length;
> +	_cmMenuList[menuID] = info;
> +	return menuID;
> +}
> +
> +//
> +// request a frame
> +//
> +function cmAllocFrame ()
> +{
> +	if (_cmFrameListSize > 0)
> +		return cmGetObject (_cmFrameList[--_cmFrameListSize]);
> +	var frameObj = document.createElement ('iframe');
> +	var id = _cmFrameIDCount++;
> +	frameObj.id = 'cmFrame' + id;
> +	frameObj.frameBorder = '0';
> +	frameObj.style.display = 'none';
> +	frameObj.src = 'javascript:false';
> +	document.body.appendChild (frameObj);
> +	frameObj.style.filter = 'alpha(opacity=0)';
> +	frameObj.style.zIndex = 99;
> +	frameObj.style.position = 'absolute';
> +	frameObj.style.border = '0';
> +	frameObj.scrolling = 'no';
> +	return frameObj;
> +}
> +
> +//
> +// make a frame resuable later
> +//
> +function cmFreeFrame (frameObj)
> +{
> +	_cmFrameList[_cmFrameListSize++] = frameObj.id;
> +}
> +
>  
> //////////////////////////////////////////////////////////////////////
>  //
>  // Drawing Functions and Utility Functions
> @@ -96,43 +216,42 @@
>  //
>  // return the property string for the menu item
>  //
> -function cmActionItem (item, prefix, isMain, idSub, orient, 
> nodeProperties)
> +function cmActionItem (item, isMain, idSub, menuInfo, menuID)
>  {
> -	var clickOpen = _cmNodeProperties.clickOpen;
> -	if (nodeProperties.clickOpen)
> -		clickOpen = nodeProperties.clickOpen;
> -
> -	// var index = _cmItemList.push (item) - 1;
>  	_cmItemList[_cmItemList.length] = item;
>  	var index = _cmItemList.length - 1;
>  	idSub = (!idSub) ? 'null' : ('\'' + idSub + '\'');
> -	orient = '\'' + orient + '\'';
> -	prefix = '\'' + prefix + '\'';
> +
> +	var clickOpen = menuInfo.nodeProperties.clickOpen;
>  	var onClick = (clickOpen == 3) || (clickOpen == 2 && isMain);
> +
> +	var param = 'this,' + isMain + ',' + idSub + ',' + 
> menuID + ',' + index;
> +
>  	var returnStr;
>  	if (onClick)
> -		returnStr = ' onmouseover="cmItemMouseOver 
> (this,' + prefix + ',' + isMain + ',' + idSub + ',' + index + 
> ')" onmousedown="cmItemMouseDownOpenSub (this,' + index + ',' 
> + prefix + ',' + orient + ',' + idSub + ')"';
> +		returnStr = ' onmouseover="cmItemMouseOver(' + 
> param + ',false)" onmousedown="cmItemMouseDownOpenSub (' + 
> param + ')"';
>  	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 + ')"';
> +		returnStr = ' 
> onmouseover="cmItemMouseOverOpenSub (' + param + ')" 
> onmousedown="cmItemMouseDown (' + param + ')"';
> +	return returnStr + ' onmouseout="cmItemMouseOut (' + 
> param + ')" onmouseup="cmItemMouseUp (' + param + ')"';
>  }
>  
>  //
>  // this one is used by _cmNoClick to only take care of 
> onmouseover and onmouseout
>  // events which are associated with menu but not actions 
> associated with menu clicking/closing
>  //
> -function cmNoClickItem (item, prefix, isMain, idSub, orient, 
> nodeProperties)
> +function cmNoClickItem (item, isMain, idSub, menuInfo, menuID)
>  {
>  	// var index = _cmItemList.push (item) - 1;
>  	_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 + ')"';
> +
> +	var param = 'this,' + isMain + ',' + idSub + ',' + 
> menuID + ',' + index;
> +
> +	return ' onmouseover="cmItemMouseOver (' + param + ')" 
> onmouseout="cmItemMouseOut (' + param + ')"';
>  }
>  
> -function cmNoActionItem (item, prefix)
> +function cmNoActionItem (item)
>  {
>  	return item[1];
>  }
> @@ -156,9 +275,14 @@
>  //
>  // draw the sub menu recursively
>  //
> -function cmDrawSubMenu (subMenu, prefix, id, orient, nodeProperties)
> +function cmDrawSubMenu (subMenu, prefix, id, nodeProperties, 
> zIndexStart, menuInfo, menuID)
>  {
> -	var str = '<div class="' + prefix + 'SubMenu" id="' + 
> id + '"><table summary="sub menu" cellspacing="' + 
> nodeProperties.subSpacing + '" class="' + prefix + 'SubMenuTable">';
> +	var str = '<div class="' + prefix + 'SubMenu" id="' + 
> id + '" style="z-index: ' + zIndexStart + ';position: 
> absolute; top: 0px; left: 0px;">';
> +	if (nodeProperties.subMenuHeader)
> +		str += nodeProperties.subMenuHeader;
> +
> +	str += '<table summary="sub menu" id="' + id + 'Table" 
> cellspacing="' + nodeProperties.subSpacing + '" class="' + 
> prefix + 'SubMenuTable">';
> +
>  	var strSub = '';
>  
>  	var item;
> @@ -177,20 +301,22 @@
>  
>  		if (item == _cmSplit)
>  			item = cmSplitItem (prefix, 0, true);
> +		item.parentItem = subMenu;
> +		item.subMenuID = id;
>  
>  		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);
> +			str += cmActionItem (item, 0, idSub, 
> menuInfo, menuID);
>  		else
> -			str += cmNoClickItem (item, prefix, 0, 
> idSub, orient, nodeProperties);
> +			str += cmNoClickItem (item, 0, idSub, 
> menuInfo, menuID);
>  		str += '>'
>  
>  		if (item[0] == _cmNoAction || item[0] == _cmNoClick)
>  		{
> -			str += cmNoActionItem (item, prefix);
> +			str += cmNoActionItem (item);
>  			str += '</tr>';
>  			continue;
>  		}
> @@ -212,56 +338,77 @@
>  		if (hasChild)
>  		{
>  			str += nodeProperties.folderRight;
> -			strSub += cmDrawSubMenu (item, prefix, 
> idSub, orient, nodeProperties);
> +			strSub += cmDrawSubMenu (item, prefix, 
> idSub, nodeProperties, zIndexStart + 
> nodeProperties.zIndexInc, menuInfo, menuID);
>  		}
>  		else
>  			str += nodeProperties.itemRight;
>  		str += '</td></tr>';
>  	}
>  
> -	str += '</table></div>' + strSub;
> +	str += '</table>';
> +
> +	if (nodeProperties.subMenuFooter)
> +		str += nodeProperties.subMenuFooter;
> +	str += '</div>' + strSub;
>  	return str;
>  }
>  
>  //
>  // The function that builds the menu inside the specified element id.
>  //
> -// @param	id	id of the element
> -//		orient	orientation of the menu in [hv][ab][lr] format
> -//		menu	the menu object to be drawn
> -//		nodeProperties	properties for each menu node
> +// id				id of the element
> +// orient			orientation of the menu in 
> [hv][ub][lr] format
> +// menu				the menu object to be drawn
> +// nodeProperties	properties for the theme
> +// prefix			prefix of the theme
>  //
>  function cmDraw (id, menu, orient, nodeProperties, prefix)
>  {
>  	var obj = cmGetObject (id);
>  
> +	if (!prefix)
> +		prefix = nodeProperties.prefix;
> +	if (!prefix)
> +		prefix = '';
>  	if (!nodeProperties)
>  		nodeProperties = _cmNodeProperties;
> -	if (!prefix)
> -		prefix = '';
> +	if (!orient)
> +		orient = 'hbr';
>  
> +	var menuID = cmAllocMenu (id, menu, orient, 
> nodeProperties, prefix);
> +	var menuInfo = _cmMenuList[menuID];
> +
> +	// setup potentially missing properties
> +	if (!nodeProperties.delay)
> +		nodeProperties.delay = _cmNodeProperties.delay;
> +	if (!nodeProperties.clickOpen)
> +		nodeProperties.clickOpen = _cmNodeProperties.clickOpen;
> +	if (!nodeProperties.zIndexStart)
> +		nodeProperties.zIndexStart = 
> _cmNodeProperties.zIndexStart;
> +	if (!nodeProperties.zIndexInc)
> +		nodeProperties.zIndexInc = _cmNodeProperties.zIndexInc;
> +	if (!nodeProperties.offsetHMainAdjust)
> +		nodeProperties.offsetHMainAdjust = 
> _cmNodeProperties.offsetHMainAdjust;
> +	if (!nodeProperties.offsetVMainAdjust)
> +		nodeProperties.offsetVMainAdjust = 
> _cmNodeProperties.offsetVMainAdjust;
> +	if (!nodeProperties.offsetSubAdjust)
> +		nodeProperties.offsetSubAdjust = 
> _cmNodeProperties.offsetSubAdjust;
> +	// save user setting on frame masking
> +	menuInfo.cmFrameMasking = _cmFrameMasking;
> +
>  	var str = '<table summary="main menu" class="' + prefix 
> + 'Menu" cellspacing="' + nodeProperties.mainSpacing + '">';
>  	var strSub = '';
>  
> -	if (!orient)
> -		orient = 'hbr';
> -
> -	var orientStr = String (orient);
> -	var orientSub;
>  	var vertical;
>  
>  	// draw the main menu items
> -	if (orientStr.charAt (0) == 'h')
> +	if (orient.charAt (0) == 'h')
>  	{
> -		// horizontal menu
> -		orientSub = 'v' + orientStr.substr (1, 2);
>  		str += '<tr>';
>  		vertical = false;
>  	}
>  	else
>  	{
> -		// vertical menu
> -		orientSub = 'v' + orientStr.substr (1, 2);
>  		vertical = true;
>  	}
>  
> @@ -279,20 +426,23 @@
>  		if (!item)
>  			continue;
>  
> +		item.menu = menu;
> +		item.subMenuID = id;
> +
>  		str += vertical ? '<tr' : '<td';
>  		str += ' class="' + prefix + 'MainItem"';
>  
>  		hasChild = (item.length > 5);
>  		idSub = hasChild ? cmNewID () : null;
>  
> -		str += cmActionItem (item, prefix, 1, idSub, 
> orient, nodeProperties) + '>';
> +		str += cmActionItem (item, 1, idSub, menuInfo, 
> menuID) + '>';
>  
>  		if (item == _cmSplit)
>  			item = cmSplitItem (prefix, 1, vertical);
>  
>  		if (item[0] == _cmNoAction || item[0] == _cmNoClick)
>  		{
> -			str += cmNoActionItem (item, prefix);
> +			str += cmNoActionItem (item);
>  			str += vertical? '</tr>' : '</td>';
>  			continue;
>  		}
> @@ -322,13 +472,12 @@
>  		str += vertical ? '</tr>' : '</td>';
>  
>  		if (hasChild)
> -			strSub += cmDrawSubMenu (item, prefix, 
> idSub, orientSub, nodeProperties);
> +			strSub += cmDrawSubMenu (item, prefix, 
> idSub, nodeProperties, nodeProperties.zIndexStart, menuInfo, menuID);
>  	}
>  	if (!vertical)
>  		str += '</tr>';
>  	str += '</table>' + strSub;
>  	obj.innerHTML = str;
> -	//document.write ("<xmp>" + str + "</xmp>");
>  }
>  
>  //
> @@ -359,8 +508,11 @@
>  	var menu = null;
>  	for (var currentDomItem = domMenu.firstChild; 
> currentDomItem; currentDomItem = currentDomItem.nextSibling)
>  	{
> -		if (!currentDomItem.tagName || 
> currentDomItem.tagName.toLowerCase () != 'ul')
> +		if (!currentDomItem.tagName)
>  			continue;
> +		var tag = currentDomItem.tagName.toLowerCase ();
> +		if (tag != 'ul' && tag != 'ol')
> +			continue;
>  		menu = cmDrawFromTextSubMenu (currentDomItem);
>  		break;
>  	}
> @@ -385,38 +537,75 @@
>  		}
>  		var item = new Array ();
>  		var currentItem = currentDomItem.firstChild;
> +		var hasAction = false;
>  		for (; currentItem; currentItem = 
> currentItem.nextSibling)
>  		{
> -			// scan for span tag
> -			if (!currentItem.tagName || 
> currentItem.tagName.toLowerCase () != 'span')
> +			// scan for span or div tag
> +			if (!currentItem.tagName)
>  				continue;
> +			if (currentItem.className == 'cmNoClick')
> +			{
> +				item[0] = _cmNoClick;
> +				item[1] = getActionHTML (currentItem);
> +				hasAction = true;
> +				break;
> +			}
> +			if (currentItem.className == 'cmNoAction')
> +			{
> +				item[0] = _cmNoAction;
> +				item[1] = getActionHTML (currentItem);
> +				hasAction = true;
> +				break;
> +			}
> +			var tag = currentItem.tagName.toLowerCase ();
> +			if (tag != 'span')
> +				continue;
>  			if (!currentItem.firstChild)
>  				item[0] = null;
>  			else
>  				item[0] = currentItem.innerHTML;
> +			currentItem = currentItem.nextSibling;
>  			break;
>  		}
> +		if (hasAction)
> +		{
> +			items[items.length] = item;
> +			continue;
> +		}
>  		if (!currentItem)
>  			continue;
>  		for (; currentItem; currentItem = 
> currentItem.nextSibling)
>  		{
> -			// scan for span tag
> -			if (!currentItem.tagName || 
> currentItem.tagName.toLowerCase () != 'a')
> +			if (!currentItem.tagName)
>  				continue;
> -			item[1] = currentItem.innerHTML;
> -			item[2] = currentItem.href;
> -			item[3] = currentItem.target;
> -			item[4] = currentItem.title;
> -			if (item[4] == '')
> +			var tag = currentItem.tagName.toLowerCase ();
> +			if (tag == 'a')
> +			{
> +				item[1] = currentItem.innerHTML;
> +				item[2] = currentItem.href;
> +				item[3] = currentItem.target;
> +				item[4] = currentItem.title;
> +				if (item[4] == '')
> +					item[4] = null;
> +			}
> +			else if (tag == 'span' || tag == 'div')
> +			{
> +				item[1] = currentItem.innerHTML;
> +				item[2] = null;
> +				item[3] = null;
>  				item[4] = null;
> +			}
>  			break;
>  		}
>  
>  		for (; currentItem; currentItem = 
> currentItem.nextSibling)
>  		{
>  			// scan for span tag
> -			if (!currentItem.tagName || 
> currentItem.tagName.toLowerCase () != 'ul')
> +			if (!currentItem.tagName)
>  				continue;
> +			var tag = currentItem.tagName.toLowerCase ();
> +			if (tag != 'ul' && tag != 'ol')
> +				continue;
>  			var subMenuItems = 
> cmDrawFromTextSubMenu (currentItem);
>  			for (i = 0; i < subMenuItems.length; ++i)
>  				item[i + 5] = subMenuItems[i];
> @@ -427,6 +616,116 @@
>  	return items;
>  }
>  
> +//
> +// obtain the actual action item's action, which is inside a
> +// table.  The first row should be it
> +//
> +function getActionHTML (htmlNode)
> +{
> +	var returnVal = '<td></td><td></td><td></td>';
> +	var currentDomItem;
> +	// find the table first
> +	for (currentDomItem = htmlNode.firstChild; 
> currentDomItem; currentDomItem = currentDomItem.nextSibling)
> +	{
> +		if (currentDomItem.tagName && 
> currentDomItem.tagName.toLowerCase () == 'table')
> +			break;
> +	}
> +	if (!currentDomItem)
> +		return returnVal;
> +	// skip over tbody
> +	for (currentDomItem = currentDomItem.firstChild; 
> currentDomItem; currentDomItem = currentDomItem.nextSibling)
> +	{
> +		if (currentDomItem.tagName && 
> currentDomItem.tagName.toLowerCase () == 'tbody')
> +			break;
> +	}
> +	if (!currentDomItem)
> +		return returnVal;
> +	// get the first tr
> +	for (currentDomItem = currentDomItem.firstChild; 
> currentDomItem; currentDomItem = currentDomItem.nextSibling)
> +	{
> +		if (currentDomItem.tagName && 
> currentDomItem.tagName.toLowerCase () == 'tr')
> +			break;
> +	}
> +	if (!currentDomItem)
> +		return returnVal;
> +	return currentDomItem.innerHTML;
> +}
> +
> +//
> +// get the DOM object associated with the item
> +//
> +function cmGetMenuItem (item)
> +{
> +	if (!item.subMenuID)
> +		return null;
> +	var subMenu = cmGetObject (item.subMenuID);
> +	// we are dealing with a main menu item
> +	if (item.menu)
> +	{
> +		var menu = item.menu;
> +		// skip over table, tbody, tr, reach td
> +		subMenu = 
> subMenu.firstChild.firstChild.firstChild.firstChild;
> +		var i;
> +		for (i = 0; i < menu.length; ++i)
> +		{
> +			if (menu[i] == item)
> +				return subMenu;
> +			subMenu = subMenu.nextSibling;
> +		}
> +	}
> +	else if (item.parentItem) // sub menu item
> +	{
> +		var menu = item.parentItem;
> +		var table = cmGetObject (item.subMenuID + 'Table');
> +		if (!table)
> +			return null;
> +		// skip over table, tbody, reach tr
> +		subMenu = table.firstChild.firstChild;
> +		var i;
> +		for (i = 5; i < menu.length; ++i)
> +		{
> +			if (menu[i] == item)
> +				return subMenu;
> +			subMenu = subMenu.nextSibling;
> +		}
> +	}
> +	return null;
> +}
> +
> +//
> +// disable a menu item
> +//
> +function cmDisableItem (item, prefix)
> +{
> +	if (!item)
> +		return;
> +	var menuItem = cmGetMenuItem (item);
> +	if (!menuItem)
> +		return;
> +	if (item.menu)
> +		menuItem.className = prefix + 'MainItemDisabled';
> +	else
> +		menuItem.className = prefix + 'MenuItemDisabled';
> +	item.isDisabled = true;
> +}
> +
> +//
> +// enable a menu item
> +//
> +function cmEnableItem (item, prefix)
> +{
> +	if (!item)
> +		return;
> +	var menuItem = cmGetMenuItem (item);
> +	if (!menuItem)
> +		return;
> +	if (item.menu)
> +		menu.className = prefix + 'MainItem';
> +	else
> +		menu.className = prefix + 'MenuItem';
> +	item.isDisabled = true;
> +}
> +
>  
> //////////////////////////////////////////////////////////////////////
>  //
>  // Mouse Event Handling Functions
> @@ -438,13 +737,24 @@
>  //
>  // Here we just do things concerning this menu item, w/o 
> opening sub menus.
>  //
> -function cmItemMouseOver (obj, prefix, isMain, idSub, index)
> +function cmItemMouseOver (obj, isMain, idSub, menuID, index, 
> calledByOpenSub)
>  {
> +	if (!calledByOpenSub && _cmClicked)
> +	{
> +		cmItemMouseOverOpenSub (obj, isMain, idSub, 
> menuID, index);
> +		return;
> +	}
> +
>  	clearTimeout (_cmTimeOut);
>  
> -	if (!obj.cmPrefix)
> +	if (_cmItemList[index].isDisabled)
> +		return;
> +
> +	var prefix = _cmMenuList[menuID].prefix;
> +
> +	if (!obj.cmMenuID)
>  	{
> -		obj.cmPrefix = prefix;
> +		obj.cmMenuID = menuID;
>  		obj.cmIsMain = isMain;
>  	}
>  
> @@ -477,7 +787,8 @@
>  			return;
>  		}
>  
> -		var thatPrefix = _cmCurrentItem.cmPrefix;
> +		var thatMenuInfo = _cmMenuList[_cmCurrentItem.cmMenuID];
> +		var thatPrefix = thatMenuInfo.prefix;
>  		var thatMenu = cmGetThisMenu (_cmCurrentItem, 
> thatPrefix);
>  
>  		if (thatMenu != thisMenu.cmParentMenu)
> @@ -487,7 +798,7 @@
>  			else
>  				_cmCurrentItem.className = 
> thatPrefix + 'MenuItem';
>  			if (thatMenu.id != idSub)
> -				cmHideMenu (thatMenu, thisMenu, 
> thatPrefix);
> +				cmHideMenu (thatMenu, thisMenu, 
> thatMenuInfo);
>  		}
>  	}
>  
> @@ -516,24 +827,31 @@
>  //
>  // This function also opens sub menu
>  //
> -function cmItemMouseOverOpenSub (obj, prefix, isMain, idSub, 
> orient, index)
> +function cmItemMouseOverOpenSub (obj, isMain, idSub, menuID, index)
>  {
> -	cmItemMouseOver (obj, prefix, isMain, idSub, index);
> +	clearTimeout (_cmTimeOut);
>  
> +	if (_cmItemList[index].isDisabled)
> +		return;
> +
> +	cmItemMouseOver (obj, isMain, idSub, menuID, index, true);
> +
>  	if (idSub)
>  	{
>  		var subMenu = cmGetObject (idSub);
> -		cmShowSubMenu (obj, prefix, subMenu, orient);
> +		var menuInfo = _cmMenuList[menuID];
> +		var orient = menuInfo.orient;
> +		var prefix = menuInfo.prefix;
> +		cmShowSubMenu (obj, isMain, subMenu, menuInfo);
>  	}
>  }
>  
>  //
>  // action should be taken for mouse moving out of the menu item
>  //
> -function cmItemMouseOut (obj, delayTime)
> +function cmItemMouseOut (obj, isMain, idSub, menuID, index)
>  {
> -	if (!delayTime)
> -		delayTime = _cmNodeProperties.delay;
> +	var delayTime = _cmMenuList[menuID].nodeProperties.delay;
>  	_cmTimeOut = window.setTimeout ('cmHideMenuTime ()', delayTime);
>  	window.defaultStatus = '';
>  }
> @@ -541,14 +859,18 @@
>  //
>  // action should be taken for mouse button down at a menu item
>  //
> -function cmItemMouseDown (obj, index)
> +function cmItemMouseDown (obj, isMain, idSub, menuID, index)
>  {
> +	if (_cmItemList[index].isDisabled)
> +		return;
> +
>  	if (cmIsDefaultItem (_cmItemList[index]))
>  	{
> +		var prefix = _cmMenuList[menuID].prefix;
>  		if (obj.cmIsMain)
> -			obj.className = obj.cmPrefix + 'MainItemActive';
> +			obj.className = prefix + 'MainItemActive';
>  		else
> -			obj.className = obj.cmPrefix + 'MenuItemActive';
> +			obj.className = prefix + 'MenuItemActive';
>  	}
>  }
>  
> @@ -556,22 +878,30 @@
>  // action should be taken for mouse button down at a menu item
>  // this is one also opens submenu if needed
>  //
> -function cmItemMouseDownOpenSub (obj, index, prefix, orient, idSub)
> +function cmItemMouseDownOpenSub (obj, isMain, idSub, menuID, index)
>  {
> -	cmItemMouseDown (obj, index);
> +	if (_cmItemList[index].isDisabled)
> +		return;
>  
> +	_cmClicked = true;
> +	cmItemMouseDown (obj, isMain, idSub, menuID, index);
> +
>  	if (idSub)
>  	{
>  		var subMenu = cmGetObject (idSub);
> -		cmShowSubMenu (obj, prefix, subMenu, orient);
> +		var menuInfo = _cmMenuList[menuID];
> +		cmShowSubMenu (obj, isMain, subMenu, menuInfo);
>  	}
>  }
>  
>  //
>  // action should be taken for mouse button up at a menu item
>  //
> -function cmItemMouseUp (obj, index)
> +function cmItemMouseUp (obj, isMain, idSub, menuID, index)
>  {
> +	if (_cmItemList[index].isDisabled)
> +		return;
> +
>  	var item = _cmItemList[index];
>  
>  	var link = null, target = '_self';
> @@ -583,10 +913,12 @@
>  
>  	if (link != null)
>  	{
> +		_cmClicked = false;
>  		window.open (link, target);
>  	}
>  
> -	var prefix = obj.cmPrefix;
> +	var menuInfo = _cmMenuList[menuID];
> +	var prefix = menuInfo.prefix;
>  	var thisMenu = cmGetThisMenu (obj, prefix);
>  
>  	var hasChild = (item.length > 5);
> @@ -599,7 +931,7 @@
>  			else
>  				obj.className = prefix + 'MenuItem';
>  		}
> -		cmHideMenu (thisMenu, null, prefix);
> +		cmHideMenu (thisMenu, null, menuInfo);
>  	}
>  	else
>  	{
> @@ -622,12 +954,25 @@
>  //
>  // move submenu to the appropriate location
>  //
> -// @param	obj	the menu item that opens up the subMenu
> -//		subMenu	the sub menu to be shown
> -//		orient	the orientation of the subMenu
> -//
> -function cmMoveSubMenu (obj, subMenu, orient)
> +function cmMoveSubMenu (obj, isMain, subMenu, menuInfo)
>  {
> +	var orient = menuInfo.orient;
> +
> +	var offsetAdjust;
> +
> +	if (isMain)
> +	{
> +		if (orient.charAt (0) == 'h')
> +			offsetAdjust = 
> menuInfo.nodeProperties.offsetHMainAdjust;
> +		else
> +			offsetAdjust = 
> menuInfo.nodeProperties.offsetVMainAdjust;
> +	}
> +	else
> +		offsetAdjust = menuInfo.nodeProperties.offsetSubAdjust;
> +
> +	if (!isMain && orient.charAt (0) == 'h')
> +		orient = 'v' + orient.charAt (1) + orient.charAt (2);
> +
>  	var mode = String (orient);
>  	var p = subMenu.offsetParent;
>  	var subMenuWidth = cmGetWidth (subMenu);
> @@ -635,25 +980,50 @@
>  	if (mode.charAt (0) == 'h')
>  	{
>  		if (mode.charAt (1) == 'b')
> -			subMenu.style.top = (cmGetYAt (obj, p) 
> + cmGetHeight (obj)) + 'px';
> +			subMenu.style.top = (cmGetYAt (obj, p) 
> + cmGetHeight (obj) + offsetAdjust[1]) + 'px';
>  		else
> -			subMenu.style.top = (cmGetYAt (obj, p) 
> - cmGetHeight (subMenu)) + 'px';
> +			subMenu.style.top = (cmGetYAt (obj, p) 
> - cmGetHeight (subMenu) - offsetAdjust[1]) + 'px';
>  		if (horiz == 'r')
> -			subMenu.style.left = (cmGetXAt (obj, p)) + 'px';
> +			subMenu.style.left = (cmGetXAt (obj, p) 
> + offsetAdjust[0]) + 'px';
>  		else
> -			subMenu.style.left = (cmGetXAt (obj, p) 
> + cmGetWidth (obj) - subMenuWidth) + 'px';
> +			subMenu.style.left = (cmGetXAt (obj, p) 
> + cmGetWidth (obj) - subMenuWidth - offsetAdjust[0]) + 'px';
>  	}
>  	else
>  	{
>  		if (horiz == 'r')
> -			subMenu.style.left = (cmGetXAt (obj, p) 
> + cmGetWidth (obj)) + 'px';
> +			subMenu.style.left = (cmGetXAt (obj, p) 
> + cmGetWidth (obj) + offsetAdjust[0]) + 'px';
>  		else
> -			subMenu.style.left = (cmGetXAt (obj, p) 
> - subMenuWidth) + 'px';
> +			subMenu.style.left = (cmGetXAt (obj, p) 
> - subMenuWidth - offsetAdjust[0]) + 'px';
>  		if (mode.charAt (1) == 'b')
> -			subMenu.style.top = (cmGetYAt (obj, p)) + 'px';
> +			subMenu.style.top = (cmGetYAt (obj, p) 
> + offsetAdjust[1]) + 'px';
>  		else
> -			subMenu.style.top = (cmGetYAt (obj, p) 
> + cmGetHeight (obj) - cmGetHeight (subMenu)) + 'px';
> +			subMenu.style.top = (cmGetYAt (obj, p) 
> + cmGetHeight (obj) - cmGetHeight (subMenu) + offsetAdjust[1]) + 'px';
>  	}
> +
> +	// IE specific iframe masking method
> +	/*@cc_on
> +		@if (@_jscript_version >= 5.5)
> +			if (menuInfo.cmFrameMasking)
> +			{
> +				if (!subMenu.cmFrameObj)
> +				{
> +					var frameObj = cmAllocFrame ();
> +					subMenu.cmFrameObj = frameObj;
> +				}
> +
> +				var frameObj = subMenu.cmFrameObj;
> +				frameObj.style.zIndex = 
> subMenu.style.zIndex - 1;
> +				frameObj.style.left = (cmGetX 
> (subMenu) - cmGetX (frameObj.offsetParent)) + 'px';
> +				frameObj.style.top = (cmGetY 
> (subMenu)  - cmGetY (frameObj.offsetParent)) + 'px';
> +				frameObj.style.width = 
> cmGetWidth (subMenu) + 'px';
> +				frameObj.style.height = 
> cmGetHeight (subMenu) + 'px';
> +				frameObj.style.display = 'block';
> +			}
> +		@end
> +	@*/
> +	if (horiz != orient.charAt (2))
> +		orient = orient.charAt (0) + orient.charAt (1) + horiz;
> +	return orient;
>  }
>  
>  //
> @@ -703,12 +1073,10 @@
>  // show the subMenu w/ specified orientation
>  // also move it to the correct coordinates
>  //
> -// @param	obj	the menu item that opens up the subMenu
> -//		subMenu	the sub menu to be shown
> -//		orient	the orientation of the subMenu
> -//
> -function cmShowSubMenu (obj, prefix, subMenu, orient)
> +function cmShowSubMenu (obj, isMain, subMenu, menuInfo)
>  {
> +	var prefix = menuInfo.prefix;
> +
>  	if (!subMenu.cmParentMenu)
>  	{
>  		// establish the tree w/ back edge
> @@ -716,35 +1084,68 @@
>  		subMenu.cmParentMenu = thisMenu;
>  		if (!thisMenu.cmSubMenu)
>  			thisMenu.cmSubMenu = new Array ();
> -		//thisMenu.cmSubMenu.push (subMenu);
>  		thisMenu.cmSubMenu[thisMenu.cmSubMenu.length] = subMenu;
>  	}
>  
> -	// position the sub menu
> -	cmMoveSubMenu (obj, subMenu, orient);
> -	subMenu.style.visibility = 'visible';
> +	var effectInstance = subMenu.cmEffect;
> +	if (effectInstance)
> +		effectInstance.showEffect (true);
> +	else
> +	{
> +		// position the sub menu only if we are not 
> already showing the submenu
> +		var orient = cmMoveSubMenu (obj, isMain, 
> subMenu, menuInfo);
> +		subMenu.cmOrient = orient;
>  
> -	//
> -	// On IE, controls such as SELECT, OBJECT, IFRAME (before 5.5)
> -	// are window based controls.  So, if the sub menu and these
> -	// controls overlap, sub menu would be hidden behind them.  Thus
> -	// one needs to turn the visibility of these controls 
> off when the
> -	// sub menu is showing, and turn their visibility back on
> -	// when the sub menu is hiding.
> -	//
> -	if (document.all)	// it is IE
> +		var forceShow = false;
> +		if (subMenu.style.visibility != 'visible' && 
> menuInfo.nodeProperties.effect)
> +		{
> +			try
> +			{
> +				effectInstance = 
> menuInfo.nodeProperties.effect.getInstance (subMenu, orient);
> +				effectInstance.showEffect (false);
> +			}
> +			catch (e)
> +			{
> +				forceShow = true;
> +				subMenu.cmEffect = null;
> +			}
> +		}
> +		else
> +			forceShow = true;
> +
> +		if (forceShow)
> +		{
> +			subMenu.style.visibility = 'visible';
> +			/*@cc_on
> +				@if (@_jscript_version >= 5.5)
> +					if (subMenu.cmFrameObj)
> +						
> subMenu.cmFrameObj.style.display = 'block';
> +				@end
> +			@*/
> +		}
> +	}
> +
> +	if (!_cmHideObjects)
>  	{
> -		/* part of Felix Zaslavskiy's fix on hiding controls
> -		   not really sure if this part is necessary, 
> but shouldn't
> -		   hurt. */
> +		_cmHideObjects = 2;	// default = not hide, 
> may change behavior later
> +		try
> +		{
> +			if (window.opera)
> +			{
> +				if (parseInt (navigator.appVersion) < 9)
> +					_cmHideObjects = 1;
> +			}
> +		}
> +		catch (e)
> +		{
> +		}
> +	}
> +
> +	if (_cmHideObjects == 1)
> +	{
>  		if (!subMenu.cmOverlap)
>  			subMenu.cmOverlap = new Array ();
> -/*@cc_on @*/
> -/*@if (@_jscript_version >= 5.5)
> - at else @*/
>  		cmHideControl ("IFRAME", subMenu);
> -/*@end @*/
> -		cmHideControl ("SELECT", subMenu);
>  		cmHideControl ("OBJECT", subMenu);
>  	}
>  }
> @@ -762,6 +1163,16 @@
>  		for (i = 0; i < items.length; ++i)
>  		{
>  			if (items[i].cmIsMain)
> +			{
> +				if (items[i].className == 
> (prefix + 'MainItemDisabled'))
> +					continue;
> +			}
> +			else
> +			{
> +				if (items[i].className == 
> (prefix + 'MenuItemDisabled'))
> +					continue;
> +			}
> +			if (items[i].cmIsMain)
>  				str = prefix + 'MainItem';
>  			else
>  				str = prefix + 'MenuItem';
> @@ -776,21 +1187,57 @@
>  //
>  function cmHideMenuTime ()
>  {
> +	_cmClicked = false;
>  	if (_cmCurrentItem)
>  	{
> -		var prefix = _cmCurrentItem.cmPrefix;
> -		cmHideMenu (cmGetThisMenu (_cmCurrentItem, 
> prefix), null, prefix);
> +		var menuInfo = _cmMenuList[_cmCurrentItem.cmMenuID];
> +		var prefix = menuInfo.prefix;
> +		cmHideMenu (cmGetThisMenu (_cmCurrentItem, 
> prefix), null, menuInfo);
>  		_cmCurrentItem = null;
>  	}
>  }
>  
>  //
> +// Only hides this menu
> +//
> +function cmHideThisMenu (thisMenu, menuInfo)
> +{
> +	var effectInstance = thisMenu.cmEffect;
> +	if (effectInstance)
> +		effectInstance.hideEffect (true);
> +	else
> +	{
> +		thisMenu.style.visibility = 'hidden';
> +		thisMenu.style.top = '0px';
> +		thisMenu.style.left = '0px';
> +		thisMenu.cmOrient = null;
> +		/*@cc_on
> +			@if (@_jscript_version >= 5.5)
> +				if (thisMenu.cmFrameObj)
> +				{
> +					var frameObj = 
> thisMenu.cmFrameObj;
> +					frameObj.style.display = 'none';
> +					frameObj.style.width = '1px';
> +					frameObj.style.height = '1px';
> +					thisMenu.cmFrameObj = null;
> +					cmFreeFrame (frameObj);
> +				}
> +			@end
> +		@*/
> +	}
> +
> +	cmShowControl (thisMenu);
> +	thisMenu.cmItems = null;
> +}
> +
> +//
>  // hide thisMenu, children of thisMenu, as well as the ancestor
>  // of thisMenu until currentMenu is encountered.  currentMenu
>  // will not be hidden
>  //
> -function cmHideMenu (thisMenu, currentMenu, prefix)
> +function cmHideMenu (thisMenu, currentMenu, menuInfo)
>  {
> +	var prefix = menuInfo.prefix;
>  	var str = prefix + 'SubMenu';
>  
>  	// hide the down stream menus
> @@ -799,7 +1246,7 @@
>  		var i;
>  		for (i = 0; i < thisMenu.cmSubMenu.length; ++i)
>  		{
> -			cmHideSubMenu (thisMenu.cmSubMenu[i], prefix);
> +			cmHideSubMenu (thisMenu.cmSubMenu[i], menuInfo);
>  		}
>  	}
>  
> @@ -809,8 +1256,7 @@
>  		cmResetMenu (thisMenu, prefix);
>  		if (thisMenu.className == str)
>  		{
> -			thisMenu.style.visibility = 'hidden';
> -			cmShowControl (thisMenu);
> +			cmHideThisMenu (thisMenu, menuInfo);
>  		}
>  		else
>  			break;
> @@ -822,7 +1268,7 @@
>  // hide thisMenu as well as its sub menus if thisMenu is not
>  // already hidden
>  //
> -function cmHideSubMenu (thisMenu, prefix)
> +function cmHideSubMenu (thisMenu, menuInfo)
>  {
>  	if (thisMenu.style.visibility == 'hidden')
>  		return;
> @@ -831,12 +1277,12 @@
>  		var i;
>  		for (i = 0; i < thisMenu.cmSubMenu.length; ++i)
>  		{
> -			cmHideSubMenu (thisMenu.cmSubMenu[i], prefix);
> +			cmHideSubMenu (thisMenu.cmSubMenu[i], menuInfo);
>  		}
>  	}
> +	var prefix = menuInfo.prefix;
>  	cmResetMenu (thisMenu, prefix);
> -	thisMenu.style.visibility = 'hidden';
> -	cmShowControl (thisMenu);
> +	cmHideThisMenu (thisMenu, menuInfo);
>  }
>  
>  //
> @@ -872,12 +1318,12 @@
>  		// submenu then we dont want to put it on 
> overlap list of
>  		// of a submenu a second time.
>  		// - bug fixed by Felix Zaslavskiy
> -		if(obj.style.visibility == "hidden")
> +		if(obj.style.visibility == 'hidden')
>  			continue;
>  
>  		//subMenu.cmOverlap.push (obj);
>  		subMenu.cmOverlap[subMenu.cmOverlap.length] = obj;
> -		obj.style.visibility = "hidden";
> +		obj.style.visibility = 'hidden';
>  	}
>  }
>  
> @@ -913,6 +1359,35 @@
>  }
>  
>  //
> +// A special effect function to hook the menu which contains
> +// special effect object to the timer.
> +//
> +function cmTimeEffect (menuID, show, delayTime)
> +{
> +	window.setTimeout ('cmCallEffect("' + menuID + '",' + 
> show + ')', delayTime);
> +}
> +
> +//
> +// A special effect function.  Called by timer.
> +//
> +function cmCallEffect (menuID, show)
> +{
> +	var menu = cmGetObject (menuID);
> +	if (!menu || !menu.cmEffect)
> +		return;
> +	try
> +	{
> +		if (show)
> +			menu.cmEffect.showEffect (false);
> +		else
> +			menu.cmEffect.hideEffect (false);
> +	}
> +	catch (e)
> +	{
> +	}
> +}
> +
> +//
>  // return true if this item is handled using default handlers
>  //
>  function cmIsDefaultItem (item)
> @@ -968,6 +1443,8 @@
>  //
>  function cmGetX (obj)
>  {
> +	if (!obj)
> +		return 0;
>  	var x = 0;
>  
>  	do
> @@ -995,6 +1472,8 @@
>  
>  function cmGetY (obj)
>  {
> +	if (!obj)
> +		return 0;
>  	var y = 0;
>  	do
>  	{
> @@ -1039,7 +1518,6 @@
>  
>  //
>  // extract description from the menu item and set the status text
> -// @param	item	the menu item
>  //
>  function cmSetStatus (item)
>  {
> @@ -1069,6 +1547,40 @@
>  	return msg;
>  }
>  
> +/* v2.0.3			1. Fix an issue with IE6 
> displaying menu over HTTPS connection.
> +						Thanks to Paul 
> Horton for reporting the bug and testing
> +						possible solutions. */
> +/* v2.0.2			1. Minor clean up and some 
> attempts to reduce memory leak in IE. */
> +/* v2.0.1			1. Disable iframe masking for 
> IE7 since it is no longer necessary. */
> +/* v2.0				1. improves the way 
> handling flash/iframe/select boxes in IE
> +						and firefox and 
> Opera 9.  Hiding these elements is no
> +						longer 
> necessary.  For older versions of Opera, flash/iframe
> +						still need to be hidden.
> +					2. Improves 
> cmDrawFromText ().  Also allows custom actions.
> +					3. Improves clickOpen 
> behavior.  Now once a submenu is opened,
> +						opening other 
> sub menus no longer requires clicking.
> +					4. Special Effects.  
> This version has hooks that allow people
> +						to install 
> special effects to various themes.
> +					5. For a given menu 
> item, cmGetMenuitem(item) provides the ability
> +						to find the 
> corresponding DOM element.
> +					6. Disable API.  If you 
> know which item to disable, you can call
> +						
> cmDisableItem(item, themePrefix) and cmEnableItem(item, themePrefix).
> +						However, you 
> will have to provide your own CSS for the item.
> +						For purposes 
> other than to disable an item, cmGetMenuItem (item)
> +						is provided for 
> locating HTML DOM element of the menu item in concern.
> +					7. Better z-index.  Now 
> you can specify in the theme property the
> +						starting 
> z-index and incremental step for submenus.
> +					8. Allow themes to 
> insert additional elements before and after
> +						the sub menu table.
> +					9. Improved themes.  
> More organized and easier to customize.
> +					10. Add a flag to 
> control hiding/nohiding objects/iframes.  By default,
> +						only Opera 
> before 9 hides objects.
> +					11. Add new property 
> options to control submenu positions to fine tune
> +						the look.
> +					12. It is no longer 
> necessary to specify the theme name while calling
> +						cmDraw and 
> cmDrawFromText.  Currently it still accepts it, but it
> +						will not in the future.
> +*/
>  /* v1.4.4			1. a quick fix for a bug for 
> _cmSplit checking.  reported by
>  						Son Nguyen.
>  */
> 
> Modified: plog/trunk/js/JSCookMenu/ThemeOffice/theme.css
> ===================================================================
> --- plog/trunk/js/JSCookMenu/ThemeOffice/theme.css	
> 2008-01-08 12:17:06 UTC (rev 6151)
> +++ plog/trunk/js/JSCookMenu/ThemeOffice/theme.css	
> 2008-01-08 18:32:15 UTC (rev 6152)
> @@ -2,6 +2,9 @@
>  
>  .ThemeOfficeMenu,.ThemeOfficeSubMenuTable
>  {
> +	font-family:	verdana, arial, sans-serif;
> +	font-size:	13px;
> +
>  	padding:	0;
>  
>  	white-space:	nowrap;
> @@ -12,25 +15,34 @@
>  {
>  	position:	absolute;
>  	visibility:	hidden;
> +	overflow:	hidden;
>  
> -	/*
> -	   Netscape/Mozilla renders borders by increasing
> -	   their z-index.  The following line is necessary
> -	   to cover any borders underneath
> -	*/
> -	z-index:	100;
> -	border:		0;
> -	padding:	0;
> +	padding:	0px;
> +	border:		0px;
>  
> -	overflow:	visible;
> -	border:		1px solid #8C867B;
> +	background-color:	transparent;
> +}
>  
> -/*	
> filter:progid:DXImageTransform.Microsoft.Shadow(color=#BDC3BD,
>  Direction=135, Strength=4);*/
> +.ThemeOfficeSubMenuShadow
> +{
> +	z-index:	-1;
> +	position:	absolute;
> +	top:		9px;
> +	left:		9px;
> +	width:		100%;
> +	height:		300em;
> +	background-color:	black;
> +	opacity:	0.15;
> +	border:		0;
> +	margin:		0;
>  }
>  
>  .ThemeOfficeSubMenuTable
>  {
> -	overflow:	visible;
> +	border:		1px solid #ADAA9C;
> +	background-color:	white;
> +	padding:	1px;
> +	margin:		0px 2px 2px 0px;
>  }
>  
>  
> .ThemeOfficeMainItem,.ThemeOfficeMainItemHover,.ThemeOfficeMai
> nItemActive,
> @@ -41,6 +53,8 @@
>  	white-space:	nowrap;
>  }
>  
> +/* common background color to both horizontal and vertical menus */
> +
>  .ThemeOfficeMainItem
>  {
>  	background-color:	inherit;
> @@ -83,179 +97,169 @@
>  .ThemeOfficeMainFolderRight,.ThemeOfficeMainItemRight
>  {
>  	background-color:	inherit;
> +	white-space:	nowrap;
>  }
>  
>  /* vertical main menu sub components */
>  
> -td.ThemeOfficeMainFolderLeft,td.ThemeOfficeMainItemLeft
> +td.ThemeOfficeMainFolderLeft,
> +td.ThemeOfficeMainItemLeft
>  {
> -	padding-top:	0px;
> -	padding-bottom:	0px;
> -	padding-left:	0px;
> -	padding-right:	2px;
> +	padding:	3px 2px 3px 1px;
>  
> -	border-top:	1px solid #3169C6;
> -	border-bottom:	1px solid #3169C6;
> -	border-left:	1px solid #3169C6;
> -
> +	border:		0;
>  	background-color:	inherit;
> +	white-space:	nowrap;
>  }
>  
> -td.ThemeOfficeMainFolderText,td.ThemeOfficeMainItemText
> +td.ThemeOfficeMainFolderText,
> +td.ThemeOfficeMainItemText
>  {
> -	padding-top:	0px;
> -	padding-bottom:	0px;
> -	padding-left:	5px;
> -	padding-right:	5px;
> +	padding:	3px 5px 3px 5px;
>  
> -	border-top:	1px solid #3169C6;
> -	border-bottom:	1px solid #3169C6;
> -
> +	border:		0;
>  	background-color:	inherit;
>  	white-space:	nowrap;
>  }
>  
> -td.ThemeOfficeMainFolderRight,td.ThemeOfficeMainItemRight
> +td.ThemeOfficeMainItemRight,
> +td.ThemeOfficeMainFolderRight
>  {
> -	padding-top:	0px;
> -	padding-bottom:	0px;
> -	padding-left:	0px;
> -	padding-right:	0px;
> +	padding:	3px 1px 3px 0px;
>  
> -	border-top:	1px solid #3169C6;
> -	border-bottom:	1px solid #3169C6;
> -	border-right:	1px solid #3169C6;
> -
> +	border:		0;
>  	background-color:	inherit;
> +	white-space:	nowrap;
>  }
>  
> -tr.ThemeOfficeMainItem td.ThemeOfficeMainFolderLeft,
> -tr.ThemeOfficeMainItem td.ThemeOfficeMainItemLeft
> +
> +tr.ThemeOfficeMainItemHover td.ThemeOfficeMainFolderLeft,
> +tr.ThemeOfficeMainItemActive td.ThemeOfficeMainFolderLeft,
> +tr.ThemeOfficeMainItemHover td.ThemeOfficeMainItemLeft,
> +tr.ThemeOfficeMainItemActive td.ThemeOfficeMainItemLeft
>  {
> -	padding-top:	1px;
> -	padding-bottom:	1px;
> -	padding-left:	1px;
> -	padding-right:	2px;
> +	padding:	2px 2px 2px 0px;
>  
> -	white-space:	nowrap;
> -
> -	border:		0;
> -	background-color:	inherit;
> +	border-width:	1px 0px 1px 1px;
> +	border-style:	solid;
> +	border-color:	#3169C6;
>  }
>  
> -tr.ThemeOfficeMainItem td.ThemeOfficeMainFolderText,
> -tr.ThemeOfficeMainItem td.ThemeOfficeMainItemText
> +tr.ThemeOfficeMainItemHover td.ThemeOfficeMainFolderText,
> +tr.ThemeOfficeMainItemActive td.ThemeOfficeMainFolderText,
> +tr.ThemeOfficeMainItemHover td.ThemeOfficeMainItemText,
> +tr.ThemeOfficeMainItemActive td.ThemeOfficeMainItemText 
>  {
> -	padding-top:	1px;
> -	padding-bottom:	1px;
> -	padding-left:	5px;
> -	padding-right:	5px;
> +	padding:	2px 5px 2px 5px;
>  
> -	border:		0;
> -	background-color:	inherit;
> +	border-width:	1px 0px 1px 0px;
> +	border-style:	solid;
> +	border-color:	#3169C6;
>  }
>  
> -tr.ThemeOfficeMainItem td.ThemeOfficeMainItemRight,
> -tr.ThemeOfficeMainItem td.ThemeOfficeMainFolderRight
> +tr.ThemeOfficeMainItemHover td.ThemeOfficeMainFolderRight,
> +tr.ThemeOfficeMainItemActive td.ThemeOfficeMainFolderRight,
> +tr.ThemeOfficeMainItemHover td.ThemeOfficeMainItemRight,
> +tr.ThemeOfficeMainItemActive td.ThemeOfficeMainItemRight
>  {
> -	padding-top:	1px;
> -	padding-bottom:	1px;
> -	padding-left:	0px;
> -	padding-right:	1px;
> +	padding:	2px 0px 2px 0px;
>  
> -	border:		0;
> -	background-color:	inherit;
> +	border-width:	1px 1px 1px 0px;
> +	border-style:	solid;
> +	border-color:	#3169C6;
>  }
>  
>  /* sub menu sub components */
>  
> -.ThemeOfficeMenuFolderLeft,.ThemeOfficeMenuItemLeft
> +.ThemeOfficeMenuItem
>  {
> -	padding-top:	0px;
> -	padding-bottom:	0px;
> -	padding-left:	1px;
> -	padding-right:	3px;
> +	background-color:	white;
> +}
>  
> -	border-top:	1px solid #3169C6;
> -	border-bottom:	1px solid #3169C6;
> -	border-left:	1px solid #3169C6;
> +.ThemeOfficeMenuItemHover,.ThemeOfficeMenuItemActive
> +{
> +	background-color:	#C6D3EF;
> +}
>  
> -	background-color:	inherit;
> +.ThemeOfficeMenuFolderLeft,
> +.ThemeOfficeMenuItemLeft
> +{
> +	padding:	3px 3px 3px 2px;
> +	border:		0;
> +
>  	white-space:	nowrap;
> +
> +	background-color:	#EFEFDE;
>  }
>  
> -.ThemeOfficeMenuFolderText,.ThemeOfficeMenuItemText
> +.ThemeOfficeMenuFolderText,
> +.ThemeOfficeMenuItemText
>  {
> -	padding-top:	0px;
> -	padding-bottom:	0px;
> -	padding-left:	5px;
> -	padding-right:	5px;
> +	padding:	3px 5px 3px 5px;
> +	border:		0;
>  
> -	border-top:	1px solid #3169C6;
> -	border-bottom:	1px solid #3169C6;
> -
> -	background-color:	inherit;
>  	white-space:	nowrap;
>  }
>  
> -.ThemeOfficeMenuFolderRight,.ThemeOfficeMenuItemRight
> +.ThemeOfficeMenuFolderRight,
> +.ThemeOfficeMenuItemRight
>  {
> -	padding-top:	0px;
> -	padding-bottom:	0px;
> -	padding-left:	0px;
> -	padding-right:	0px;
> +	padding:	3px 1px 3px 0px;
> +	border:		0;
>  
> -	border-top:	1px solid #3169C6;
> -	border-bottom:	1px solid #3169C6;
> -	border-right:	1px solid #3169C6;
> -
> -	background-color:	inherit;
>  	white-space:	nowrap;
>  }
>  
> -.ThemeOfficeMenuItem .ThemeOfficeMenuFolderLeft,
> -.ThemeOfficeMenuItem .ThemeOfficeMenuItemLeft
> +.ThemeOfficeMenuItemHover .ThemeOfficeMenuFolderLeft,
> +.ThemeOfficeMenuItemActive .ThemeOfficeMenuFolderLeft,
> +.ThemeOfficeMenuItemHover .ThemeOfficeMenuItemLeft,
> +.ThemeOfficeMenuItemActive .ThemeOfficeMenuItemLeft
>  {
> -	padding-top:	1px;
> -	padding-bottom:	1px;
> -	padding-left:	2px;
> -	padding-right:	3px;
> +	padding:	2px 3px 2px 1px;
>  
> -	white-space:	nowrap;
> +	background-color:	#C6D3EF;
>  
> -	border:		0;
> -	background-color:	#EFEFDE;
> +	border-width:	1px 0px 1px 1px;
> +	border-style:	solid;
> +	border-color:	#3169C6;
>  }
>  
> -.ThemeOfficeMenuItem .ThemeOfficeMenuFolderText,
> -.ThemeOfficeMenuItem .ThemeOfficeMenuItemText
> +.ThemeOfficeMenuItemHover .ThemeOfficeMenuFolderText,
> +.ThemeOfficeMenuItemActive .ThemeOfficeMenuFolderText,
> +.ThemeOfficeMenuItemHover .ThemeOfficeMenuItemText,
> +.ThemeOfficeMenuItemActive .ThemeOfficeMenuItemText
>  {
> -	padding-top:	1px;
> -	padding-bottom:	1px;
> -	padding-left:	5px;
> -	padding-right:	5px;
> +	padding:	2px 5px 2px 5px;
>  
> -	border:		0;
> -	background-color:	inherit;
> +	border-width:	1px 0px 1px 0px;
> +	border-style:	solid;
> +	border-color:	#3169C6;
>  }
>  
> -.ThemeOfficeMenuItem .ThemeOfficeMenuFolderRight,
> -.ThemeOfficeMenuItem .ThemeOfficeMenuItemRight
> +.ThemeOfficeMenuItemHover .ThemeOfficeMenuFolderRight,
> +.ThemeOfficeMenuItemActive .ThemeOfficeMenuFolderRight,
> +.ThemeOfficeMenuItemHover .ThemeOfficeMenuItemRight,
> +.ThemeOfficeMenuItemActive .ThemeOfficeMenuItemRight
>  {
> -	padding-top:	1px;
> -	padding-bottom:	1px;
> -	padding-left:	0px;
> -	padding-right:	1px;
> +	padding:	2px 0px 2px 0px;
>  
> -	border:		0;
> -	background-color:	inherit;
> +	border-width:	1px 1px 1px 0px;
> +	border-style:	solid;
> +	border-color:	#3169C6;
>  }
>  
>  /* menu splits */
>  
> -.ThemeOfficeMenuSplit
> +td.ThemeOfficeMenuSplit
>  {
> -	margin:		2px;
> +	margin:		0px;
> +	padding:	0px;
> +	border:		0px;
> +}
> +
> +div.ThemeOfficeMenuSplit
> +{
> +	margin:		3px;
>  	height:		1px;
>  	overflow:	hidden;
>  	background-color:	inherit;
> 
> Modified: plog/trunk/js/JSCookMenu/ThemeOffice/theme.js
> ===================================================================
> --- plog/trunk/js/JSCookMenu/ThemeOffice/theme.js	
> 2008-01-08 12:17:06 UTC (rev 6151)
> +++ plog/trunk/js/JSCookMenu/ThemeOffice/theme.js	
> 2008-01-08 18:32:15 UTC (rev 6152)
> @@ -17,6 +17,7 @@
>  
>  var cmThemeOffice =
>  {
> +	prefix:	'ThemeOffice',
>    	// main menu display attributes
>    	//
>    	// Note.  When the menu bar is horizontal,
> @@ -36,23 +37,33 @@
>  
>  	// sub menu display attributes
>  
> -	// 0, HTML code to the left of the folder item
> +	// HTML code to the left of the folder item
>  	folderLeft: '<img alt="" src="' + cmThemeOfficeBase + 
> 'spacer.gif">',
> -	// 1, HTML code to the right of the folder item
> +	// HTML code to the right of the folder item
>  	folderRight: '<img alt="" src="' + cmThemeOfficeBase + 
> 'arrow.gif">',
> -	// 2, HTML code to the left of the regular item
> +	// HTML code to the left of the regular item
>  	itemLeft: '<img alt="" src="' + cmThemeOfficeBase + 
> 'spacer.gif">',
> -	// 3, HTML code to the right of the regular item
> +	// HTML code to the right of the regular item
>  	itemRight: '<img alt="" src="' + cmThemeOfficeBase + 
> 'blank.gif">',
> -	// 4, cell spacing for main menu
> +	// cell spacing for main menu
>  	mainSpacing: 0,
> -	// 5, cell spacing for sub menus
> +	// cell spacing for sub menus
>  	subSpacing: 0,
> -	// 6, auto dispear time for submenus in milli-seconds
> -	delay: 500
> +
> +	subMenuHeader: '<div class="ThemeOfficeSubMenuShadow"></div>',
> +
> +	offsetHMainAdjust:	[-1, 0],
> +	offsetSubAdjust:	[-1, -1]
> +
> +	// rest use default settings
>  };
>  
>  // for horizontal menu split
> -var cmThemeOfficeHSplit = [_cmNoClick, '<td 
> class="ThemeOfficeMenuItemLeft"></td><td colspan="2"><div 
> class="ThemeOfficeMenuSplit"></div></td>'];
> -var cmThemeOfficeMainHSplit = [_cmNoClick, '<td 
> class="ThemeOfficeMainItemLeft"></td><td colspan="2"><div 
> class="ThemeOfficeMenuSplit"></div></td>'];
> +var cmThemeOfficeHSplit = [_cmNoClick, '<td 
> class="ThemeOfficeMenuItemLeft"></td><td colspan="2" 
> class="ThemeOfficeMenuSplit"><div 
> class="ThemeOfficeMenuSplit"></div></td>'];
> +var cmThemeOfficeMainHSplit = [_cmNoClick, '<td 
> class="ThemeOfficeMainItemLeft"></td><td colspan="2" 
> class="ThemeOfficeMenuSplit"><div 
> class="ThemeOfficeMenuSplit"></div></td>'];
>  var cmThemeOfficeMainVSplit = [_cmNoClick, '|'];
> +
> +/* IE can't do negative margin on tables */
> +/*@cc_on
> +	cmThemeOffice.subMenuHeader = '<div 
> class="ThemeOfficeSubMenuShadow" style="background-color: 
> #cccccc; filter: alpha(opacity=35);"></div>';
> +@*/
> 
> Added: plog/trunk/js/JSCookMenu/effect.js
> ===================================================================
> --- plog/trunk/js/JSCookMenu/effect.js	                
>         (rev 0)
> +++ plog/trunk/js/JSCookMenu/effect.js	2008-01-08 
> 18:32:15 UTC (rev 6152)
> @@ -0,0 +1,385 @@
> +/*
> +	JSCookMenu Effect (c) Copyright 2002-2006 by Heng Yuan
> +
> +	http://jscook.sourceforge.net/JSCookMenu/
> +
> +	Permission is hereby granted, free of charge, to any 
> person obtaining a
> +	copy of this software and associated documentation 
> files (the "Software"),
> +	to deal in the Software without restriction, including 
> without limitation
> +	the rights to use, copy, modify, merge, publish, 
> distribute, sublicense,
> +	and/or sell copies of the Software, and to permit 
> persons to whom the
> +	Software is furnished to do so, subject to the 
> following conditions:
> +
> +	The above copyright notice and this permission notice 
> shall be included
> +	in all copies or substantial portions of the Software.
> +
> +	THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF 
> ANY KIND, EXPRESS
> +	OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 
> OF MERCHANTABILITY,
> +	ITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN 
> NO EVENT SHALL THE
> +	AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 
> DAMAGES OR OTHER
> +	LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 
> OTHERWISE, ARISING
> +	FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 
> USE OR OTHER
> +	DEALINGS IN THE SOFTWARE.
> +*/
> +//
> +// utiltity object to simplify common tasks in effects.
> +//
> +function CMSpecialEffectInstance (effect, menu)
> +{
> +	effect.show = true;
> +	effect.menu = menu;
> +	menu.cmEffect = effect;
> +	this.effect = effect;
> +}
> +
> +CMSpecialEffectInstance.prototype.canShow = function (changed)
> +{
> +	if (changed)
> +	{
> +		if (this.effect.show)
> +			return false;
> +		this.effect.show = true;
> +	}
> +	else if (!this.effect.show)
> +		return false;
> +	return true;
> +}
> +
> +CMSpecialEffectInstance.prototype.canHide = function (changed)
> +{
> +	var effect = this.effect;
> +	if (changed)
> +	{
> +		if (!effect.show)
> +			return false;
> +		effect.show = false;
> +	}
> +	else if (effect.show)
> +		return false;
> +	return true;
> +}
> +
> +//
> +// public function to be called to initate the display of the
> +// menu.
> +//
> +CMSpecialEffectInstance.prototype.startShowing = function ()
> +{
> +	var menu = this.effect.menu;
> +	menu.style.visibility = 'visible';
> +	/*@cc_on
> +		@if (@_jscript_version >= 5.5)
> +			if (menu.cmFrameObj)
> +			{
> +				var frameObj = menu.cmFrameObj;
> +				frameObj.style.display = 'block';
> +			}
> +		@end
> +	@*/
> +}
> +
> +//
> +// public function to be called after showing effect is finished.
> +//
> +CMSpecialEffectInstance.prototype.finishShowing = function ()
> +{
> +}
> +
> +//
> +// clean up after finish hiding effect.
> +//
> +CMSpecialEffectInstance.prototype.finishHiding = function ()
> +{
> +	var menu = this.effect.menu;
> +	menu.style.visibility = 'hidden';
> +	menu.style.top = '0px';
> +	menu.style.left = '0px';
> +	/*@cc_on
> +		@if (@_jscript_version >= 5.5)
> +			if (menu.cmFrameObj)
> +			{
> +				var frameObj = menu.cmFrameObj;
> +				frameObj.style.display = 'none';
> +				frameObj.style.top = '0px';
> +				frameObj.style.left = '0px';
> +				menu.cmFrameObj = null;
> +				cmFreeFrame (frameObj);
> +			}
> +		@end
> +	@*/
> +	menu.cmEffect = null;
> +	menu.cmOrient = null;
> +	this.effect.menu = null;
> +}
> +
> +//
> +// this is the internal class to perform the sliding effect
> +//
> +function CMSlidingEffectInstance (menu, orient, speed)
> +{
> +	this.base = new CMSpecialEffectInstance (this, menu);
> +
> +	menu.style.overflow = 'hidden';
> +
> +	this.x = menu.offsetLeft;
> +	this.y = menu.offsetTop;
> +
> +	if (orient.charAt (0) == 'h')
> +	{
> +		this.slideOrient = 'h';
> +		this.slideDir = orient.charAt (1);
> +	}
> +	else
> +	{
> +		this.slideOrient = 'v';
> +		this.slideDir = orient.charAt (2);
> +	}
> +
> +	this.speed = speed;
> +	this.fullWidth = menu.offsetWidth;
> +	this.fullHeight = menu.offsetHeight;
> +	this.percent = 0;
> +	/*@cc_on
> +		@if (@_jscript_version >= 5.5)
> +			if (menu.cmFrameObj)
> +			{
> +				var frameObj = menu.cmFrameObj;
> +				this.frameX = frameObj.offsetLeft;
> +				this.frameY = frameObj.offsetTop;
> +				this.frameWidth = frameObj.offsetWidth;
> +				this.frameHeight = 
> frameObj.offsetHeight;
> +			}
> +		@end
> +	@*/
> +}
> +	// public function to show the menu
> +CMSlidingEffectInstance.prototype.showEffect = function (changed)
> +{
> +	if (!this.base.canShow (changed))
> +		return;
> +
> +	var percent = this.percent;
> +	if (this.slideOrient == 'h')
> +		this.slideMenuV ();
> +	else
> +		this.slideMenuH ();
> +
> +	if (percent == 0)
> +	{
> +		this.base.startShowing ();
> +	}
> +
> +	if (percent < 100)
> +	{
> +		this.percent += this.speed;
> +		cmTimeEffect (this.menu.id, this.show, 10);
> +	}
> +	else if (this.show)
> +	{
> +		this.base.finishShowing ();
> +	}
> +}
> +
> +// public function to hide the menu
> +CMSlidingEffectInstance.prototype.hideEffect = function (changed)
> +{
> +	if (!this.base.canHide (changed))
> +		return;
> +
> +	var percent = this.percent;
> +	if (this.slideOrient == 'h')
> +		this.slideMenuV ();
> +	else
> +		this.slideMenuH ();
> +
> +	if (percent > 0)
> +	{
> +		this.percent -= this.speed;
> +		cmTimeEffect (this.menu.id, this.show, 10);
> +	}
> +	else if (!this.show)
> +	{
> +		this.menu.style.clip = 'auto';
> +		this.base.finishHiding ();
> +	}
> +}
> +
> +// internal function to scroll a menu left/right
> +CMSlidingEffectInstance.prototype.slideMenuH = function ()
> +{
> +	var percent = this.percent;
> +	if (percent < 0)
> +		percent = 0;
> +	if (percent > 100)
> +		percent = 100;
> +	var fullWidth = this.fullWidth;
> +	var fullHeight = this.fullHeight;
> +	var x = this.x;
> +	var space = percent * fullWidth / 100;
> +	var menu = this.menu;
> +
> +	if (this.slideDir == 'l')
> +	{
> +		menu.style.left = (x + fullWidth - space) + 'px';
> +		menu.style.clip = 'rect(0px ' + space + 'px ' + 
> fullHeight + 'px 0px)';
> +	}
> +	else
> +	{
> +		menu.style.left = (x - fullWidth + space) + 'px';
> +		menu.style.clip = 'rect(0px ' + fullWidth + 'px 
> ' + fullHeight + 'px ' + (fullWidth - space) + 'px)';
> +	}
> +	/*@cc_on
> +		@if (@_jscript_version >= 5.5)
> +			if (menu.cmFrameObj)
> +			{
> +				var frameObj = menu.cmFrameObj;
> +				if (this.slideDir == 'l')
> +					frameObj.style.left = 
> (this.frameX + fullWidth - space) + 'px';
> +				frameObj.style.width = space + 'px';
> +			}
> +		@end
> +	@*/
> +}
> +
> +// internal function to scroll a menu up/down
> +CMSlidingEffectInstance.prototype.slideMenuV = function ()
> +{
> +	var percent = this.percent;
> +	if (percent < 0)
> +		percent = 0;
> +	if (percent > 100)
> +		percent = 100;
> +	var fullWidth = this.fullWidth;
> +	var fullHeight = this.fullHeight;
> +	var y = this.y;
> +	var space = percent * fullHeight / 100;
> +	var menu = this.menu;
> +
> +	if (this.slideDir == 'b')
> +	{
> +		menu.style.top = (y - fullHeight + space) + 'px';
> +		menu.style.clip = 'rect(' + (fullHeight - 
> space) + 'px ' + fullWidth + 'px ' + fullHeight + 'px 0px)';
> +	}
> +	else
> +	{
> +		menu.style.top = (y + fullHeight - space) + 'px';
> +		menu.style.clip = 'rect(0px ' + fullWidth + 'px 
> ' + space + 'px 0px)';
> +	}
> +	/*@cc_on
> +		@if (@_jscript_version >= 5.5)
> +			if (menu.cmFrameObj)
> +			{
> +				var frameObj = menu.cmFrameObj;
> +				if (this.slideDir == 'u')
> +					frameObj.style.top = 
> (this.frameX - space) + 'px';
> +				frameObj.style.height = space + 'px';
> +			}
> +		@end
> +	@*/
> +}
> +
> +//
> +// call
> +//		new CMSlidingEffect (speed)
> +// to create a new effect object.
> +//
> +function CMSlidingEffect (speed)
> +{
> +	if (!speed)
> +		speed = 10;
> +	else if (speed <= 0)
> +		speed = 10;
> +	else if (speed >= 100)
> +		speed = 100;
> +	this.speed = speed;
> +}
> +
> +CMSlidingEffect.prototype.getInstance = function (menu, orient)
> +{
> +	return new CMSlidingEffectInstance (menu, orient, this.speed);
> +}
> +
> +//
> +// this is the internal class to perform the sliding effect
> +//
> +function CMFadingEffectInstance (menu, showSpeed, hideSpeed)
> +{
> +	this.base = new CMSpecialEffectInstance (this, menu);
> +
> +	menu.style.overflow = 'hidden';
> +
> +	this.showSpeed = showSpeed;
> +	this.hideSpeed = hideSpeed;
> +
> +	this.opacity = 0;
> +}
> +
> +// public function to show the menu
> +CMFadingEffectInstance.prototype.showEffect = function (changed)
> +{
> +	if (!this.base.canShow (changed))
> +		return;
> +
> +	var menu = this.menu;
> +	var opacity = this.opacity;
> +
> +	this.setOpacity ();
> +
> +	if (opacity == 0)
> +	{
> +		this.base.startShowing ();
> +	}
> +
> +	if (opacity < 100)
> +	{
> +		this.opacity += 10;
> +		cmTimeEffect (menu.id, this.show, this.showSpeed);
> +	}
> +	else if (this.show)
> +	{
> +		this.base.finishShowing ();
> +	}
> +}
> +
> +// public function to hide the menu
> +CMFadingEffectInstance.prototype.hideEffect = function (changed)
> +{
> +	if (!this.base.canHide (changed))
> +		return;
> +
> +	var menu = this.menu;
> +	var opacity = this.opacity;
> +
> +	this.setOpacity ();
> +
> +	if (this.opacity > 0)
> +	{
> +		this.opacity -= 10;
> +		cmTimeEffect (menu.id, this.show, this.hideSpeed);
> +	}
> +	else if (!this.show)
> +	{
> +		this.base.finishHiding ();
> +	}
> +}
> +
> +// internal functions
> +CMFadingEffectInstance.prototype.setOpacity = function ()
> +{
> +	this.menu.style.opacity = this.opacity / 100;
> +	/*@cc_on
> +		this.menu.style.filter = 'alpha(opacity=' + 
> this.opacity + ')';
> +		//this.menu.style.filter = 
> 'progid:DXImageTransform.Microsoft.Alpha(opacity=' + 
> this.opacity + ')';
> +	@*/
> +}
> +
> +function CMFadingEffect (showSpeed, hideSpeed)
> +{
> +	this.showSpeed = showSpeed;
> +	this.hideSpeed = hideSpeed;
> +}
> +
> +CMFadingEffect.prototype.getInstance = function (menu, orient)
> +{
> +	return new CMFadingEffectInstance (menu, 
> this.showSpeed, this.hideSpeed);
> +}
> 
> _______________________________________________
> pLog-svn mailing list
> pLog-svn at devel.lifetype.net
> http://limedaley.com/mailman/listinfo/plog-svn



More information about the pLog-svn mailing list