You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by lu...@apache.org on 2008/06/11 22:22:22 UTC
svn commit: r666827 - in /myfaces/tomahawk/trunk:
core/src/main/java/org/apache/myfaces/custom/navmenu/jscookmenu/
core/src/main/resources/org/apache/myfaces/custom/navmenu/jscookmenu/resource/
core/src/main/resources/org/apache/myfaces/custom/navmenu/...
Author: lu4242
Date: Wed Jun 11 13:22:21 2008
New Revision: 666827
URL: http://svn.apache.org/viewvc?rev=666827&view=rev
Log:
TOMAHAWK-1086 Add the new theme Gray and update the jsCookMenu.js from version 1.31 to 2.0.3
Added:
myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/navmenu/jscookmenu/resource/ThemeGray/
myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/navmenu/jscookmenu/resource/ThemeGray/theme.css (with props)
myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/navmenu/jscookmenu/resource/ThemeGray/theme.js
myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/navmenu/jscookmenu/resource/effect.js
Modified:
myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/custom/navmenu/jscookmenu/HtmlJSCookMenuRenderer.java
myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/navmenu/jscookmenu/resource/JSCookMenu.js
myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/navmenu/jscookmenu/resource/MyFacesHack.js
myfaces/tomahawk/trunk/examples/simple/src/main/webapp/jscookmenu.jsp
Modified: myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/custom/navmenu/jscookmenu/HtmlJSCookMenuRenderer.java
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/custom/navmenu/jscookmenu/HtmlJSCookMenuRenderer.java?rev=666827&r1=666826&r2=666827&view=diff
==============================================================================
--- myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/custom/navmenu/jscookmenu/HtmlJSCookMenuRenderer.java (original)
+++ myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/custom/navmenu/jscookmenu/HtmlJSCookMenuRenderer.java Wed Jun 11 13:22:21 2008
@@ -62,6 +62,8 @@
private static final String MYFACES_HACK_SCRIPT = "MyFacesHack.js";
private static final String JSCOOK_MENU_SCRIPT = "JSCookMenu.js";
+
+ private static final String JSCOOK_EFFECT_SCRIPT = "effect.js";
private static final Log log = LogFactory.getLog(HtmlJSCookMenuRenderer.class);
@@ -75,6 +77,7 @@
builtInThemes.put("ThemeMiniBlack", "ThemeMiniBlack/");
builtInThemes.put("ThemeIE", "ThemeIE/");
builtInThemes.put("ThemePanel", "ThemePanel/");
+ builtInThemes.put("ThemeGray", "ThemeGray/");
}
public void decode(FacesContext context, UIComponent component) {
@@ -402,10 +405,12 @@
if (javascriptLocation != null) {
addResource.addJavaScriptAtPosition(context, AddResource.HEADER_BEGIN, javascriptLocation + "/" + JSCOOK_MENU_SCRIPT);
+ addResource.addJavaScriptAtPosition(context, AddResource.HEADER_BEGIN, javascriptLocation + "/" + JSCOOK_EFFECT_SCRIPT);
addResource.addJavaScriptAtPosition(context, AddResource.HEADER_BEGIN, javascriptLocation + "/" + MYFACES_HACK_SCRIPT);
}
else {
addResource.addJavaScriptAtPosition(context, AddResource.HEADER_BEGIN, HtmlJSCookMenuRenderer.class, JSCOOK_MENU_SCRIPT);
+ addResource.addJavaScriptAtPosition(context, AddResource.HEADER_BEGIN, HtmlJSCookMenuRenderer.class, JSCOOK_EFFECT_SCRIPT);
addResource.addJavaScriptAtPosition(context, AddResource.HEADER_BEGIN, HtmlJSCookMenuRenderer.class, MYFACES_HACK_SCRIPT);
}
Modified: myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/navmenu/jscookmenu/resource/JSCookMenu.js
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/navmenu/jscookmenu/resource/JSCookMenu.js?rev=666827&r1=666826&r2=666827&view=diff
==============================================================================
--- myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/navmenu/jscookmenu/resource/JSCookMenu.js (original)
+++ myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/navmenu/jscookmenu/resource/JSCookMenu.js Wed Jun 11 13:22:21 2008
@@ -1,5 +1,7 @@
/*
- JSCookMenu v1.31. (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"),
@@ -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,26 +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 (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
@@ -88,33 +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 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 + ',' + orient + ',' + index + ')" onmouseout="cmItemMouseOut (this,' + nodeProperties.delay + ')" onmousedown="cmItemMouseDown (this,' + index + ')" onmouseup="cmItemMouseUp (this,' + index + ')"';
+
+ 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(' + param + ',false)" onmousedown="cmItemMouseDownOpenSub (' + param + ')"';
+ else
+ 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 + ',' + orient + ',' + 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];
}
@@ -132,16 +269,20 @@
}
else
classStr += 'HSplit';
- var item = eval (classStr);
- return cmNoActionItem (item, prefix);
+ return eval (classStr);
}
//
// 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;
@@ -158,26 +299,24 @@
if (!item)
continue;
+ 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 == _cmSplit)
- {
- str += cmSplitItem (prefix, 0, true);
- str += '</tr>';
- continue;
- }
-
if (item[0] == _cmNoAction || item[0] == _cmNoClick)
{
- str += cmNoActionItem (item, prefix);
+ str += cmNoActionItem (item);
str += '</tr>';
continue;
}
@@ -192,63 +331,84 @@
else
str += hasChild ? nodeProperties.folderLeft : nodeProperties.itemLeft;
- str += '</td><td class="' + classStr + 'Text">' + item[1] + "</td>";
+ str += '</td><td class="' + classStr + 'Text">' + item[1];
- str += '<td class="' + classStr + 'Right">';
+ str += '</td><td class="' + classStr + 'Right">';
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 (!nodeProperties)
- nodeProperties = _cmNodeProperties;
+ if (!prefix)
+ prefix = nodeProperties.prefix;
if (!prefix)
prefix = '';
+ if (!nodeProperties)
+ nodeProperties = _cmNodeProperties;
+ 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;
}
@@ -266,24 +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)
- {
- str += cmSplitItem (prefix, 1, vertical);
- str += vertical? '</tr>' : '</td>';
- continue;
- }
+ item = cmSplitItem (prefix, 1, vertical);
if (item[0] == _cmNoAction || item[0] == _cmNoClick)
{
- str += cmNoActionItem (item, prefix);
+ str += cmNoActionItem (item);
str += vertical? '</tr>' : '</td>';
continue;
}
@@ -313,13 +472,258 @@
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>");
+}
+
+//
+// The function builds the menu inside the specified element id.
+//
+// This function is similar to cmDraw except that menu is taken from HTML node
+// rather a javascript tree. This feature allows links to be scanned by search
+// bots.
+//
+// This function basically converts HTML node to a javascript tree, and then calls
+// cmDraw to draw the actual menu, replacing the hidden menu tree.
+//
+// Format:
+// <div id="menu">
+// <ul style="visibility: hidden">
+// <li><span>icon</span><a href="link" title="description">main menu text</a>
+// <ul>
+// <li><span>icon</span><a href="link" title="description">submenu item</a>
+// </li>
+// </ul>
+// </li>
+// </ul>
+// </div>
+//
+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)
+ continue;
+ var tag = currentDomItem.tagName.toLowerCase ();
+ if (tag != 'ul' && tag != 'ol')
+ continue;
+ menu = cmDrawFromTextSubMenu (currentDomItem);
+ break;
+ }
+ if (menu)
+ cmDraw (id, menu, orient, nodeProperties, prefix);
+}
+
+//
+// a recursive function that build menu tree structure
+//
+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;
+ var hasAction = false;
+ for (; currentItem; currentItem = currentItem.nextSibling)
+ {
+ // 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)
+ {
+ if (!currentItem.tagName)
+ continue;
+ 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)
+ 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];
+ break;
+ }
+ items[items.length] = item;
+ }
+ 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;
}
//////////////////////////////////////////////////////////////////////
@@ -331,13 +735,26 @@
//
// action should be taken for mouse moving in to the menu item
//
-function cmItemMouseOver (obj, prefix, isMain, idSub, orient, index)
+// Here we just do things concerning this menu item, w/o opening sub menus.
+//
+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;
}
@@ -363,11 +780,17 @@
{
// occationally, we get this case when user
// move the mouse slowly to the border
- if (_cmCurrentItem == thisMenu)
+ if (_cmCurrentItem == obj || _cmCurrentItem == thisMenu)
+ {
+ var item = _cmItemList[index];
+ cmSetStatus (item);
return;
+ }
- var thatPrefix = _cmCurrentItem.cmPrefix;
+ var thatMenuInfo = _cmMenuList[_cmCurrentItem.cmMenuID];
+ var thatPrefix = thatMenuInfo.prefix;
var thatMenu = cmGetThisMenu (_cmCurrentItem, thatPrefix);
+
if (thatMenu != thisMenu.cmParentMenu)
{
if (_cmCurrentItem.cmIsMain)
@@ -375,7 +798,7 @@
else
_cmCurrentItem.className = thatPrefix + 'MenuItem';
if (thatMenu.id != idSub)
- cmHideMenu (thatMenu, thisMenu, thatPrefix);
+ cmHideMenu (thatMenu, thisMenu, thatMenuInfo);
}
}
@@ -396,28 +819,39 @@
obj.className = prefix + 'MenuItemHover';
}
+ cmSetStatus (item);
+}
+
+//
+// action should be taken for mouse moving in to the menu item
+//
+// This function also opens sub menu
+//
+function cmItemMouseOverOpenSub (obj, isMain, idSub, menuID, 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);
}
-
- 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;
}
//
// 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 = '';
}
@@ -425,22 +859,49 @@
//
// 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';
+ }
+}
+
+//
+// action should be taken for mouse button down at a menu item
+// this is one also opens submenu if needed
+//
+function cmItemMouseDownOpenSub (obj, isMain, idSub, menuID, index)
+{
+ if (_cmItemList[index].isDisabled)
+ return;
+
+ _cmClicked = true;
+ cmItemMouseDown (obj, isMain, idSub, menuID, index);
+
+ if (idSub)
+ {
+ var subMenu = cmGetObject (idSub);
+ 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';
@@ -452,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);
@@ -468,7 +931,7 @@
else
obj.className = prefix + 'MenuItem';
}
- cmHideMenu (thisMenu, null, prefix);
+ cmHideMenu (thisMenu, null, menuInfo);
}
else
{
@@ -491,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);
@@ -504,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;
}
//
@@ -572,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
@@ -585,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;
+
+ 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)
+ {
+ _cmHideObjects = 2; // default = not hide, may change behavior later
+ try
+ {
+ if (window.opera)
+ {
+ if (parseInt (navigator.appVersion) < 9)
+ _cmHideObjects = 1;
+ }
+ }
+ catch (e)
+ {
+ }
+ }
- //
- // 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
+ if (_cmHideObjects == 1)
{
- /* part of Felix Zaslavskiy's fix on hiding controls
- not really sure if this part is necessary, but shouldn't
- hurt. */
if (!subMenu.cmOverlap)
subMenu.cmOverlap = new Array ();
-/*@cc_on @*/
-/*@if (@_jscript_version >= 5.5)
-@else @*/
cmHideControl ("IFRAME", subMenu);
-/*@end @*/
- cmHideControl ("SELECT", subMenu);
cmHideControl ("OBJECT", subMenu);
}
}
@@ -631,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';
@@ -645,20 +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
@@ -667,7 +1246,7 @@
var i;
for (i = 0; i < thisMenu.cmSubMenu.length; ++i)
{
- cmHideSubMenu (thisMenu.cmSubMenu[i], prefix);
+ cmHideSubMenu (thisMenu.cmSubMenu[i], menuInfo);
}
}
@@ -677,8 +1256,7 @@
cmResetMenu (thisMenu, prefix);
if (thisMenu.className == str)
{
- thisMenu.style.visibility = 'hidden';
- cmShowControl (thisMenu);
+ cmHideThisMenu (thisMenu, menuInfo);
}
else
break;
@@ -690,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;
@@ -699,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);
}
//
@@ -740,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';
}
}
@@ -781,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)
@@ -836,6 +1443,8 @@
//
function cmGetX (obj)
{
+ if (!obj)
+ return 0;
var x = 0;
do
@@ -863,6 +1472,8 @@
function cmGetY (obj)
{
+ if (!obj)
+ return 0;
var y = 0;
do
{
@@ -906,6 +1517,20 @@
}
//
+// extract description from the menu item and set the status text
+//
+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;
+}
+
+//
// debug function, ignore :)
//
function cmGetProperties (obj)
@@ -920,4 +1545,114 @@
for (i in obj)
msg += i + ' = ' + obj[i] + '; ';
return msg;
-}
\ No newline at end of file
+}
+
+/* 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.
+*/
+/* v1.4.3 1. changed how _cmSplit is handled a bit so that _cmNoClick can work
+ properly. All splits in predefined themes are changed to use
+ _cmNoClick instead of _cmNoAction.
+*/
+/* v1.4.2 1. fixed _cmNoClick mouse hoover bug.
+ 2. fixed a statusbar text problem that cause text to disappear when
+ hoovering mouse within the same menu item.
+ 3. changed the behavior of cmDrawFromText s.t. if the title of the
+ of a link is empty, the actual url is used as text. To clear
+ this link information, title needs to be ' '.
+*/
+/* v1.4.1 1. fixed a problem introduced in 1.4 where re-entering a main menu
+ item which doesn't have a child can disable its hover setting.
+ Apparently I deleted an extra line of code when I was doing
+ cleaning up. Reported by David Maliachi and a few others.
+*/
+/* JSCookMenu v1.4 1. fixed a minor td cell closure problem. Thanks to Georg Lorenz
+ <ge...@lonux.de> for discovering that.
+ 2. added clickOpen to nodeProperties. See _cmNodeProperties for
+ description. Basically menus can be opened on click only.
+ 3. added an ability to draw menu from an html node instead of a javascript
+ tree, making this script search bot friendly (I hope?).
+*/
+/* JSCookMenu v1.31 1. fix a bug on IE with causes submenus to display at the top
+ left corner due to doctype. The fix was provided by
+ Burton Strauss <Bu...@ntopsupport.com>.
+*/
+/* JSCookMenu v1.3 1. automatically realign (left and right) the submenu when
+ client space is not enough.
+ 2. add _cmNoClick to get rid of menu closing behavior
+ on the particular menu item, to make it possible for things
+ such as search box to be inside the menu.
+*/
+/* JSCookMenu v1.25 1. fix Safari positioning issue. The problem is that all TR elements are located
+ at the top left corner. Thus, need to obtain the "virtual"
+ position of these element could be at.
+*/
+/* JSCookMenu v1.24 1. fix window based control hiding bug
+ thanks to Felix Zaslavskiy <fe...@bebinary.com> for the fix.
+*/
+/* JSCookMenu v1.23 1. correct a position bug when the container is positioned.
+ thanks to Andre <an...@netspace.net.au> for narrowing down
+ the problem.
+*/
+/* JSCookMenu v1.22 1. change Array.push (obj) call to Array[length] = obj.
+ Suggestion from Dick van der Kaaden <di...@netrex.nl> to
+ make the script compatible with IE 5.0
+ 2. Changed theme files a little to add z-index: 100 for sub
+ menus. This change is necessary for Netscape to avoid
+ a display problem.
+ 3. some changes to the DOM structure to make this menu working
+ on Netscape 6.0 (tested). The main reason is that NN6 does
+ not do absolute positioning with tables. Therefore an extra
+ div layer must be put around the table.
+*/
+/* JSCookMenu v1.21 1. fixed a bug that didn't add 'px' as part of coordinates.
+ JSCookMenu should be XHTML validator friendly now.
+ 2. removed unnecessary display attribute and corresponding
+ theme entry to fix a problem that Netscape sometimes
+ render Office theme incorrectly
+*/
+/* JSCookMenu v1.2. 1. fix the problem of showing status in Netscape
+ 2. changed the handler parameters a bit to allow
+ string literals to be passed to javascript based
+ links
+ 3. having null in target field would cause the link
+ to be opened in the current window, but this behavior
+ could change in the future releases
+*/
+/* JSCookMenu v1.1. added ability to hide controls in IE to show submenus properly */
+/* JSCookMenu v1.01. cmDraw generates XHTML code */
+/* JSCookMenu v1.0. (c) Copyright 2002 by Heng Yuan */
Modified: myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/navmenu/jscookmenu/resource/MyFacesHack.js
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/navmenu/jscookmenu/resource/MyFacesHack.js?rev=666827&r1=666826&r2=666827&view=diff
==============================================================================
--- myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/navmenu/jscookmenu/resource/MyFacesHack.js (original)
+++ myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/navmenu/jscookmenu/resource/MyFacesHack.js Wed Jun 11 13:22:21 2008
@@ -1,8 +1,12 @@
//
// Overrides the original JSCookMenu function to work with MyFaces
+// 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';
@@ -38,7 +42,8 @@
}
}
- var prefix = obj.cmPrefix;
+ var menuInfo = _cmMenuList[menuID];
+ var prefix = menuInfo.prefix;
var thisMenu = cmGetThisMenu (obj, prefix);
var hasChild = (item.length > 5);
@@ -51,7 +56,7 @@
else
obj.className = prefix + 'MenuItem';
}
- cmHideMenu (thisMenu, null, prefix);
+ cmHideMenu (thisMenu, null, menuInfo);
}
else
{
Added: myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/navmenu/jscookmenu/resource/ThemeGray/theme.css
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/navmenu/jscookmenu/resource/ThemeGray/theme.css?rev=666827&view=auto
==============================================================================
--- myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/navmenu/jscookmenu/resource/ThemeGray/theme.css (added)
+++ myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/navmenu/jscookmenu/resource/ThemeGray/theme.css Wed Jun 11 13:22:21 2008
@@ -0,0 +1,211 @@
+/*
+ * ThemeGray Style Sheet
+ * by Ian Reyes and Heng Yuan
+ */
+
+.ThemeGrayMenu,.ThemeGraySubMenuTable
+{
+ font-family: Tahoma;
+ font-weight: bold;
+ font-size: 11px;
+
+ color: white;
+ background-color: #ffffff;
+
+ cursor: default;
+ cursor: hand !important;
+ white-space: nowrap;
+}
+
+.ThemeGraySubMenu
+{
+ position: absolute;
+ display: block;
+ visibility: hidden;
+ overflow: hidden;
+
+ border: 1px outset #9C9A9C;
+ background-color: transparent;
+}
+
+.ThemeGraySubMenuTable
+{
+ border-collapse: separate;
+ opacity: 0.9;
+ filter:Alpha(style=0,opacity=90);
+}
+
+.ThemeGrayMenuItem,.ThemeGrayMenuItemHover,.ThemeGrayMenuItemActive
+{
+ cursor: default;
+ cursor: hand !important;
+ white-space: nowrap;
+}
+
+.ThemeGrayMainItem,
+.ThemeGrayMenuItem
+{
+ padding: 4px 10px 4px 10px;
+
+ border: 0px solid #ffffff;
+ background-color: #5f5f5f;
+}
+
+.ThemeGrayMainItemHover,
+.ThemeGrayMainItemActive
+{
+ padding: 4px 10px 4px 10px;
+
+ border: 0px solid #ffffff;
+ background-color: #444444;
+}
+
+.ThemeGrayMenuItemHover,
+.ThemeGrayMenuItemActive
+{
+ padding: 5px;
+ border: 1px solid #ffffff;
+ background-color: #333333;
+}
+
+/* horizontal main menu sub components */
+/* panel doesn't really support horizontal menus */
+/* there are simpler approaches, but the setting here allows me to
+ set a background image for the menu without lines all over it */
+
+.ThemeGrayMainFolderLeft,
+.ThemeGrayMainItemLeft,
+.ThemeGrayMainFolderText,
+.ThemeGrayMainItemText,
+.ThemeGrayMainItemRight,
+.ThemeGrayMainFolderRight
+{
+ border: 0;
+ background-color: inherit;
+ white-space: nowrap;
+}
+
+/* sub menus sub components */
+
+.ThemeGrayMenuFolderLeft,
+.ThemeGrayMenuItemLeft
+{
+ padding: 3px 0px 3px 3px;
+ border: 0;
+ white-space: nowrap;
+ background-color: inherit;
+}
+
+.ThemeGrayMenuFolderText,
+.ThemeGrayMenuItemText
+{
+ padding: 3px 3px 3px 5px;
+
+ border: 0;
+ white-space: nowrap;
+ background-color: inherit;
+}
+
+.ThemeGrayMenuItemRight,
+.ThemeGrayMenuFolderRight
+{
+ padding: 3px 1px 3px 0px;
+
+ border: 0;
+ white-space: nowrap;
+ background-color: inherit;
+}
+
+/* hoover and active border */
+.ThemeGrayMenuItemHover .ThemeGrayMenuFolderLeft,
+.ThemeGrayMenuItemActive .ThemeGrayMenuFolderLeft,
+.ThemeGrayMenuItemHover .ThemeGrayMenuItemLeft,
+.ThemeGrayMenuItemActive .ThemeGrayMenuItemLeft,
+.ThemeGrayMenuItemHover .ThemeGrayMenuFolderText,
+.ThemeGrayMenuItemActive .ThemeGrayMenuFolderText,
+.ThemeGrayMenuItemHover .ThemeGrayMenuItemText,
+.ThemeGrayMenuItemActive .ThemeGrayMenuItemText,
+.ThemeGrayMenuItemHover .ThemeGrayMenuFolderRight,
+.ThemeGrayMenuItemActive .ThemeGrayMenuFolderRight,
+.ThemeGrayMenuItemHover .ThemeGrayMenuItemRight,
+.ThemeGrayMenuItemActive .ThemeGrayMenuItemRight
+{
+ border-color: #9C9A9C;
+}
+
+.ThemeGrayMenuItemHover .ThemeGrayMenuFolderLeft,
+.ThemeGrayMenuItemActive .ThemeGrayMenuFolderLeft,
+.ThemeGrayMenuItemHover .ThemeGrayMenuItemLeft,
+.ThemeGrayMenuItemActive .ThemeGrayMenuItemLeft
+{
+ border-width: 1px 0px 1px 1px;
+ border-style: solid;
+ padding: 2px 0px 2px 2px;
+}
+
+.ThemeGrayMenuItemHover .ThemeGrayMenuFolderText,
+.ThemeGrayMenuItemActive .ThemeGrayMenuFolderText,
+.ThemeGrayMenuItemHover .ThemeGrayMenuItemText,
+.ThemeGrayMenuItemActive .ThemeGrayMenuItemText
+{
+ border-width: 1px 0px 1px 0px;
+ border-style: solid;
+ padding: 2px 3px 2px 5px;
+}
+
+.ThemeGrayMenuItemHover .ThemeGrayMenuFolderRight,
+.ThemeGrayMenuItemActive .ThemeGrayMenuFolderRight,
+.ThemeGrayMenuItemHover .ThemeGrayMenuItemRight,
+.ThemeGrayMenuItemActive .ThemeGrayMenuItemRight
+{
+ border-width: 1px 1px 1px 0px;
+ border-style: solid;
+ padding: 2px 0px 2px 0px;
+}
+
+td.ThemeGrayMenuSplit
+{
+ padding: 0px;
+ margin: 0px;
+ height: 5px;
+ border: 0px;
+ background-color: inherit;
+ overflow: hidden;
+}
+
+div.ThemeGrayMenuSplit
+{
+ margin: 2px;
+ height: 1px;
+ overflow: hidden;
+ background-color: inherit;
+ border-top: 1px solid #9C9A9C;
+}
+
+/* image shadow animation */
+
+/*
+ seq1: image for normal
+ seq2: image for hover and active
+
+ To use, in the icon field, input the following:
+ <img class="seq1" src="normal.gif" /><img class="seq2" src="hover.gif" />
+*/
+
+.ThemeGrayMenuItem img.seq1
+{
+ display: inline;
+}
+
+.ThemeGrayMenuItemHover seq2,
+.ThemeGrayMenuItemActive seq2
+{
+ display: inline;
+}
+
+.ThemeGrayMenuItem .seq2,
+.ThemeGrayMenuItemHover .seq1,
+.ThemeGrayMenuItemActive .seq1
+{
+ display: none;
+}
Propchange: myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/navmenu/jscookmenu/resource/ThemeGray/theme.css
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/navmenu/jscookmenu/resource/ThemeGray/theme.css
------------------------------------------------------------------------------
svn:keywords = Date Author Id Revision HeadURL
Added: myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/navmenu/jscookmenu/resource/ThemeGray/theme.js
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/navmenu/jscookmenu/resource/ThemeGray/theme.js?rev=666827&view=auto
==============================================================================
--- myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/navmenu/jscookmenu/resource/ThemeGray/theme.js (added)
+++ myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/navmenu/jscookmenu/resource/ThemeGray/theme.js Wed Jun 11 13:22:21 2008
@@ -0,0 +1,50 @@
+/*
+ * ThemeGray by Ian Reyes and Heng Yuan
+ */
+
+var cmThemeGray =
+{
+ prefix: 'ThemeGray',
+ // main menu display attributes
+ //
+ // Note. When the menu bar is horizontal,
+ // mainFolderLeft and mainFolderRight are
+ // put in <span></span>. When the menu
+ // bar is vertical, they would be put in
+ // a separate TD cell.
+
+ // 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: '',
+
+ // sub menu display attributes
+
+ // 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: 1,
+ // cell spacing for sub menus
+ subSpacing: 0,
+ // auto dispear time for submenus in milli-seconds
+ delay: 200
+
+ // rest use default settings
+};
+
+// for sub menu horizontal split
+var cmThemeGrayHSplit = [_cmNoClick, '<td colspan="3" class="ThemeGrayMenuSplit"><div class="ThemeGrayMenuSplit"></div></td>'];
+// for vertical main menu horizontal split
+var cmThemeGrayMainHSplit = [_cmNoClick, '<td colspan="3" class="ThemeGrayMenuSplit"><div class="ThemeGrayMenuSplit"></div></td>'];
+// for horizontal main menu vertical split
+var cmThemeGrayMainVSplit = [_cmNoClick, '|'];
Added: myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/navmenu/jscookmenu/resource/effect.js
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/navmenu/jscookmenu/resource/effect.js?rev=666827&view=auto
==============================================================================
--- myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/navmenu/jscookmenu/resource/effect.js (added)
+++ myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/navmenu/jscookmenu/resource/effect.js Wed Jun 11 13:22:21 2008
@@ -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);
+}
Modified: myfaces/tomahawk/trunk/examples/simple/src/main/webapp/jscookmenu.jsp
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/examples/simple/src/main/webapp/jscookmenu.jsp?rev=666827&r1=666826&r2=666827&view=diff
==============================================================================
--- myfaces/tomahawk/trunk/examples/simple/src/main/webapp/jscookmenu.jsp (original)
+++ myfaces/tomahawk/trunk/examples/simple/src/main/webapp/jscookmenu.jsp Wed Jun 11 13:22:21 2008
@@ -36,7 +36,7 @@
basename="org.apache.myfaces.examples.resource.example_messages"
var="example_messages" />
<t:jscookMenu layout="hbr" theme="ThemeOffice" styleLocation="css/jscookmenu">
- <%/* Availaible jscookMenu themes: ThemeIE, ThemeMiniBlack, ThemeOffice, ThemePanel
+ <%/* Availaible jscookMenu themes: ThemeIE, ThemeMiniBlack, ThemeOffice, ThemePanel, ThemeGray
Availaible jscookMenu layout: hbr, hbl, hur, hul, vbr, vbl, vur, vul
respect to Heng Yuan http://www.cs.ucla.edu/~heng/JSCookMenu
*/%>