[Linpha-cvs] SF.net SVN: linpha: [4912] trunk/linpha2/lib/js/JSCookMenu
Status: Inactive
Brought to you by:
bzrudi
From: <fan...@us...> - 2008-03-30 21:55:16
|
Revision: 4912 http://linpha.svn.sourceforge.net/linpha/?rev=4912&view=rev Author: fangehrn Date: 2008-03-30 14:55:12 -0700 (Sun, 30 Mar 2008) Log Message: ----------- * JSCookMenu fixed bug in cmEnableItem() reported here: http://sourceforge.net/tracker/index.php?func=detail&aid=1766028&group_id=149372&atid=778279 Modified Paths: -------------- trunk/linpha2/lib/js/JSCookMenu/JSCookMenu.js Added Paths: ----------- trunk/linpha2/lib/js/JSCookMenu/JSCookMenuWithEffects.js trunk/linpha2/lib/js/JSCookMenu/JSCookMenuWithEffects.yui.js Removed Paths: ------------- trunk/linpha2/lib/js/JSCookMenu/JSCookMenu.yui.js Modified: trunk/linpha2/lib/js/JSCookMenu/JSCookMenu.js =================================================================== --- trunk/linpha2/lib/js/JSCookMenu/JSCookMenu.js 2008-03-29 16:23:55 UTC (rev 4911) +++ trunk/linpha2/lib/js/JSCookMenu/JSCookMenu.js 2008-03-30 21:55:12 UTC (rev 4912) @@ -720,10 +720,10 @@ if (!menuItem) return; if (item.menu) - menu.className = prefix + 'MainItem'; + menuItem.className = prefix + 'MainItem'; else - menu.className = prefix + 'MenuItem'; - item.isDisabled = true; + menuItem.className = prefix + 'MenuItem'; + item.isDisabled = false; } ////////////////////////////////////////////////////////////////////// Deleted: trunk/linpha2/lib/js/JSCookMenu/JSCookMenu.yui.js =================================================================== --- trunk/linpha2/lib/js/JSCookMenu/JSCookMenu.yui.js 2008-03-29 16:23:55 UTC (rev 4911) +++ trunk/linpha2/lib/js/JSCookMenu/JSCookMenu.yui.js 2008-03-30 21:55:12 UTC (rev 4912) @@ -1,104 +0,0 @@ -var _cmNodeProperties={prefix:"",mainFolderLeft:"",mainFolderRight:"",mainItemLeft:"",mainItemRight:"",folderLeft:"",folderRight:"",itemLeft:"",itemRight:"",mainSpacing:0,subSpacing:0,delay:500,zIndexStart:1000,zIndexInc:5,subMenuHeader:null,subMenuFooter:null,offsetHMainAdjust:[0,0],offsetVMainAdjust:[0,0],offsetSubAdjust:[0,0],clickOpen:1,effect:null};var _cmIDCount=0;var _cmIDName="cmSubMenuID";var _cmTimeOut=null;var _cmCurrentItem=null;var _cmNoAction=new Object();var _cmNoClick=new Object();var _cmSplit=new Object();var _cmMenuList=new Array();var _cmItemList=new Array();var _cmFrameList=new Array();var _cmFrameListSize=0;var _cmFrameIDCount=0;var _cmFrameMasking=true;/*@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;var _cmHideObjects=0;function cmClone(A){var B=new Object();for(v in A){B[v]=A[v]}return B}function cmAllocMenu(G,F,B,A,C){var D=new Object();D.div=G;D.menu=F;D.orient=B;D.nodeProperties=A;D.prefix=C;var E=_cmMenuList.length;_cmMenuList[E]=D;return E}function cmAllocFrame(){if(_cmFrameListSize>0){return cmGetObject(_cmFrameList[--_cmFrameListSize])}var A=document.createElement("iframe");var B=_cmFrameIDCount++;A.id="cmFrame"+B;A.frameBorder="0";A.style.display="none";A.src="javascript:false";document.body.appendChild(A);A.style.filter="alpha(opacity=0)";A.style.zIndex=99;A.style.position="absolute";A.style.border="0";A.scrolling="no";return A}function cmFreeFrame(A){_cmFrameList[_cmFrameListSize++]=A.id}function cmNewID(){return _cmIDName+(++_cmIDCount)}function cmActionItem(J,I,H,D,A){_cmItemList[_cmItemList.length]=J;var F=_cmItemList.length-1;H=(!H)?"null":("'"+H+"'");var E=D.nodeProperties.clickOpen;var G=(E==3)||(E==2&&I);var C="this,"+I+","+H+","+A+","+F;var B;if(G){B=' onmouseover="cmItemMouseOver('+C+',false)" onmousedown="cmItemMouseDownOpenSub ('+C+')"'}else{B=' onmouseover="cmItemMouseOverOpenSub ('+C+')" onmousedown="cmItemMouseDown ('+C+')"'}return B+' onmouseout="cmItemMouseOut ('+C+')" onmouseup="cmItemMouseUp ('+C+')"'}function cmNoClickItem(D,B,A,E,G){_cmItemList[_cmItemList.length]=D;var C=_cmItemList.length-1;A=(!A)?"null":("'"+A+"'");var F="this,"+B+","+A+","+G+","+C;return' onmouseover="cmItemMouseOver ('+F+')" onmouseout="cmItemMouseOut ('+F+')"'}function cmNoActionItem(A){return A[1]}function cmSplitItem(prefix,isMain,vertical){var classStr="cm"+prefix;if(isMain){classStr+="Main";if(vertical){classStr+="HSplit"}else{classStr+="VSplit"}}else{classStr+="HSplit"}return eval(classStr)}function cmDrawSubMenu(G,J,B,N,D,E,A){var K='<div class="'+J+'SubMenu" id="'+B+'" style="z-index: '+D+';position: absolute; top: 0px; left: 0px;">';if(N.subMenuHeader){K+=N.subMenuHeader}K+='<table summary="sub menu" id="'+B+'Table" cellspacing="'+N.subSpacing+'" class="'+J+'SubMenuTable">';var I="";var M;var L;var C;var H;var F;for(H=5;H<G.length;++H){M=G[H];if(!M){continue}if(M==_cmSplit){M=cmSplitItem(J,0,true)}M.parentItem=G;M.subMenuID=B;C=(M.length>5);L=C?cmNewID():null;K+='<tr class="'+J+'MenuItem"';if(M[0]!=_cmNoClick){K+=cmActionItem(M,0,L,E,A)}else{K+=cmNoClickItem(M,0,L,E,A)}K+=">";if(M[0]==_cmNoAction||M[0]==_cmNoClick){K+=cmNoActionItem(M);K+="</tr>";continue}F=J+"Menu";F+=C?"Folder":"Item";K+='<td class="'+F+'Left">';if(M[0]!=null){K+=M[0]}else{K+=C?N.folderLeft:N.itemLeft}K+='</td><td class="'+F+'Text">'+M[1];K+='</td><td class="'+F+'Right">';if(C){K+=N.folderRight;I+=cmDrawSubMenu(M,J,L,N,D+N.zIndexInc,E,A)}else{K+=N.itemRight}K+="</td></tr>"}K+="</table>";if(N.subMenuFooter){K+=N.subMenuFooter}K+="</div>"+I;return K}function cmDraw(B,C,H,P,L){var J=cmGetObject(B);if(!L){L=P.prefix}if(!L){L=""}if(!P){P=_cmNodeProperties}if(!H){H="hbr"}var A=cmAllocMenu(B,C,H,P,L);var F=_cmMenuList[A];if(!P.delay){P.delay=_cmNodeProperties.delay}if(!P.clickOpen){P.clickOpen=_cmNodeProperties.clickOpen}if(!P.zIndexStart){P.zIndexStart=_cmNodeProperties.zIndexStart}if(!P.zIndexInc){P.zIndexInc=_cmNodeProperties.zIndexInc}if(!P.offsetHMainAdjust){P.offsetHMainAdjust=_cmNodeProperties.offsetHMainAdjust}if(!P.offsetVMainAdjust){P.offsetVMainAdjust=_cmNodeProperties.offsetVMainAdjust}if(!P.offsetSubAdjust){P.offsetSubAdjust=_cmNodeProperties.offsetSubAdjust}F.cmFrameMasking=_cmFrameMasking;var M='<table summary="main menu" class="'+L+'Menu" cellspacing="'+P.mainSpacing+'">';var K="";var E;if(H.charAt(0)=="h"){M+="<tr>";E=false}else{E=true}var I;var O;var N;var D;var G;for(I=0;I<C.length;++I){O=C[I];if(!O){continue}O.menu=C;O.subMenuID=B;M+=E?"<tr":"<td";M+=' class="'+L+'MainItem"';D=(O.length>5);N=D?cmNewID():null;M+=cmActionItem(O,1,N,F,A)+">";if(O==_cmSplit){O=cmSplitItem(L,1,E)}if(O[0]==_cmNoAction||O[0]==_cmNoClick){M+=cmNoActionItem(O);M+=E?"</tr>":"</td>";continue}G=L+"Main"+(D?"Folder":"Item");M+=E?"<td":"<span";M+=' class="'+G+'Left">';M+=(O[0]==null)?(D?P.mainFolderLeft:P.mainItemLeft):O[0];M+=E?"</td>":"</span>";M+=E?"<td":"<span";M+=' class="'+G+'Text">';M+=O[1];M+=E?"</td>":"</span>";M+=E?"<td":"<span";M+=' class="'+G+'Right">';M+=D?P.mainFolderRight:P.mainItemRight;M+=E?"</td>":"</span>";M+=E?"</tr>":"</td>";if(D){K+=cmDrawSubMenu(O,L,N,P,P.zIndexStart,F,A)}}if(!E){M+="</tr>"}M+="</table>"+K;J.innerHTML=M}function cmDrawFromText(H,C,B,E){var F=cmGetObject(H);var G=null;for(var D=F.firstChild;D;D=D.nextSibling){if(!D.tagName){continue}var A=D.tagName.toLowerCase();if(A!="ul"&&A!="ol"){continue}G=cmDrawFromTextSubMenu(D);break}if(G){cmDraw(H,G,C,B,E)}}function cmDrawFromTextSubMenu(H){var D=new Array();for(var G=H.firstChild;G;G=G.nextSibling){if(!G.tagName||G.tagName.toLowerCase()!="li"){continue}if(G.firstChild==null){D[D.length]=_cmSplit;continue}var F=new Array();var E=G.firstChild;var C=false;for(;E;E=E.nextSibling){if(!E.tagName){continue}if(E.className=="cmNoClick"){F[0]=_cmNoClick;F[1]=getActionHTML(E);C=true;break}if(E.className=="cmNoAction"){F[0]=_cmNoAction;F[1]=getActionHTML(E);C=true;break}var A=E.tagName.toLowerCase();if(A!="span"){continue}if(!E.firstChild){F[0]=null}else{F[0]=E.innerHTML}E=E.nextSibling;break}if(C){D[D.length]=F;continue}if(!E){continue}for(;E;E=E.nextSibling){if(!E.tagName){continue}var A=E.tagName.toLowerCase();if(A=="a"){F[1]=E.innerHTML;F[2]=E.href;F[3]=E.target;F[4]=E.title;if(F[4]==""){F[4]=null}}else{if(A=="span"||A=="div"){F[1]=E.innerHTML;F[2]=null;F[3]=null;F[4]=null}}break}for(;E;E=E.nextSibling){if(!E.tagName){continue}var A=E.tagName.toLowerCase();if(A!="ul"&&A!="ol"){continue}var B=cmDrawFromTextSubMenu(E);for(i=0;i<B.length;++i){F[i+5]=B[i]}break}D[D.length]=F}return D}function getActionHTML(C){var A="<td></td><td></td><td></td>";var B;for(B=C.firstChild;B;B=B.nextSibling){if(B.tagName&&B.tagName.toLowerCase()=="table"){break}}if(!B){return A}for(B=B.firstChild;B;B=B.nextSibling){if(B.tagName&&B.tagName.toLowerCase()=="tbody"){break}}if(!B){return A}for(B=B.firstChild;B;B=B.nextSibling){if(B.tagName&&B.tagName.toLowerCase()=="tr"){break}}if(!B){return A}return B.innerHTML}function cmGetMenuItem(D){if(!D.subMenuID){return null}var A=cmGetObject(D.subMenuID);if(D.menu){var E=D.menu;A=A.firstChild.firstChild.firstChild.firstChild;var B;for(B=0;B<E.length;++B){if(E[B]==D){return A}A=A.nextSibling}}else{if(D.parentItem){var E=D.parentItem;var C=cmGetObject(D.subMenuID+"Table");if(!C){return null}A=C.firstChild.firstChild;var B;for(B=5;B<E.length;++B){if(E[B]==D){return A}A=A.nextSibling}}}return null}function cmDisableItem(B,C){if(!B){return }var A=cmGetMenuItem(B);if(!A){return }if(B.menu){A.className=C+"MainItemDisabled"}else{A.className=C+"MenuItemDisabled"}B.isDisabled=true}function cmEnableItem(B,C){if(!B){return }var A=cmGetMenuItem(B);if(!A){return }if(B.menu){menu.className=C+"MainItem"}else{menu.className=C+"MenuItem"}B.isDisabled=true}function cmItemMouseOver(D,L,K,A,F,N){if(!N&&_cmClicked){cmItemMouseOverOpenSub(D,L,K,A,F);return }clearTimeout(_cmTimeOut);if(_cmItemList[F].isDisabled){return }var E=_cmMenuList[A].prefix;if(!D.cmMenuID){D.cmMenuID=A;D.cmIsMain=L}var B=cmGetThisMenu(D,E);if(!B.cmItems){B.cmItems=new Array()}var C;for(C=0;C<B.cmItems.length;++C){if(B.cmItems[C]==D){break}}if(C==B.cmItems.length){B.cmItems[C]=D}if(_cmCurrentItem){if(_cmCurrentItem==D||_cmCurrentItem==B){var M=_cmItemList[F];cmSetStatus(M);return }var H=_cmMenuList[_cmCurrentItem.cmMenuID];var J=H.prefix;var I=cmGetThisMenu(_cmCurrentItem,J);if(I!=B.cmParentMenu){if(_cmCurrentItem.cmIsMain){_cmCurrentItem.className=J+"MainItem"}else{_cmCurrentItem.className=J+"MenuItem"}if(I.id!=K){cmHideMenu(I,B,H)}}}_cmCurrentItem=D;cmResetMenu(B,E);var M=_cmItemList[F];var G=cmIsDefaultItem(M);if(G){if(L){D.className=E+"MainItemHover"}else{D.className=E+"MenuItemHover"}}cmSetStatus(M)}function cmItemMouseOverOpenSub(E,I,H,A,G){clearTimeout(_cmTimeOut);if(_cmItemList[G].isDisabled){return }cmItemMouseOver(E,I,H,A,G,true);if(H){var D=cmGetObject(H);var B=_cmMenuList[A];var C=B.orient;var F=B.prefix;cmShowSubMenu(E,I,D,B)}}function cmItemMouseOut(D,B,A,F,C){var E=_cmMenuList[F].nodeProperties.delay;_cmTimeOut=window.setTimeout("cmHideMenuTime ()",E);window.defaultStatus=""}function cmItemMouseDown(E,B,A,F,C){if(_cmItemList[C].isDisabled){return }if(cmIsDefaultItem(_cmItemList[C])){var D=_cmMenuList[F].prefix;if(E.cmIsMain){E.className=D+"MainItemActive"}else{E.className=D+"MenuItemActive"}}}function cmItemMouseDownOpenSub(F,B,A,G,D){if(_cmItemList[D].isDisabled){return }_cmClicked=true;cmItemMouseDown(F,B,A,G,D);if(A){var C=cmGetObject(A);var E=_cmMenuList[G];cmShowSubMenu(F,B,C,E)}}function cmItemMouseUp(E,K,J,A,G){if(_cmItemList[G].isDisabled){return }var L=_cmItemList[G];var I=null,H="_self";if(L.length>2){I=L[2]}if(L.length>3&&L[3]){H=L[3]}if(I!=null){_cmClicked=false;window.open(I,H)}var D=_cmMenuList[A];var F=D.prefix;var C=cmGetThisMenu(E,F);var B=(L.length>5);if(!B){if(cmIsDefaultItem(L)){if(E.cmIsMain){E.className=F+"MainItem"}else{E.className=F+"MenuItem"}}cmHideMenu(C,null,D)}else{if(cmIsDefaultItem(L)){if(E.cmIsMain){E.className=F+"MainItemHover"}else{E.className=F+"MenuItemHover"}}}}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);var horiz=cmGetHorizontalAlign(obj,mode,p,subMenuWidth);if(mode.charAt(0)=="h"){if(mode.charAt(1)=="b"){subMenu.style.top=(cmGetYAt(obj,p)+cmGetHeight(obj)+offsetAdjust[1])+"px"}else{subMenu.style.top=(cmGetYAt(obj,p)-cmGetHeight(subMenu)-offsetAdjust[1])+"px"}if(horiz=="r"){subMenu.style.left=(cmGetXAt(obj,p)+offsetAdjust[0])+"px"}else{subMenu.style.left=(cmGetXAt(obj,p)+cmGetWidth(obj)-subMenuWidth-offsetAdjust[0])+"px"}}else{if(horiz=="r"){subMenu.style.left=(cmGetXAt(obj,p)+cmGetWidth(obj)+offsetAdjust[0])+"px"}else{subMenu.style.left=(cmGetXAt(obj,p)-subMenuWidth-offsetAdjust[0])+"px"}if(mode.charAt(1)=="b"){subMenu.style.top=(cmGetYAt(obj,p)+offsetAdjust[1])+"px"}else{subMenu.style.top=(cmGetYAt(obj,p)+cmGetHeight(obj)-cmGetHeight(subMenu)+offsetAdjust[1])+"px"}}/*@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}function cmGetHorizontalAlign(F,G,E,C){var H=G.charAt(2);if(!(document.body)){return H}var A=document.body;var B;var D;if(window.innerWidth){B=window.pageXOffset;D=window.innerWidth+B}else{if(A.clientWidth){B=A.clientLeft;D=A.clientWidth+B}else{return H}}if(G.charAt(0)=="h"){if(H=="r"&&(cmGetXAt(F)+C)>D){H="l"}if(H=="l"&&(cmGetXAt(F)+cmGetWidth(F)-C)<B){H="r"}return H}else{if(H=="r"&&(cmGetXAt(F,E)+cmGetWidth(F)+C)>D){H="l"}if(H=="l"&&(cmGetXAt(F,E)-C)<B){H="r"}return H}}function cmShowSubMenu(obj,isMain,subMenu,menuInfo){var prefix=menuInfo.prefix;if(!subMenu.cmParentMenu){var thisMenu=cmGetThisMenu(obj,prefix);subMenu.cmParentMenu=thisMenu;if(!thisMenu.cmSubMenu){thisMenu.cmSubMenu=new Array()}thisMenu.cmSubMenu[thisMenu.cmSubMenu.length]=subMenu}var effectInstance=subMenu.cmEffect;if(effectInstance){effectInstance.showEffect(true)}else{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;try{if(window.opera){if(parseInt(navigator.appVersion)<9){_cmHideObjects=1}}}catch(e){}}if(_cmHideObjects==1){if(!subMenu.cmOverlap){subMenu.cmOverlap=new Array()}cmHideControl("IFRAME",subMenu);cmHideControl("OBJECT",subMenu)}}function cmResetMenu(D,C){if(D.cmItems){var B;var E;var A=D.cmItems;for(B=0;B<A.length;++B){if(A[B].cmIsMain){if(A[B].className==(C+"MainItemDisabled")){continue}}else{if(A[B].className==(C+"MenuItemDisabled")){continue}}if(A[B].cmIsMain){E=C+"MainItem"}else{E=C+"MenuItem"}if(A[B].className!=E){A[B].className=E}}}}function cmHideMenuTime(){_cmClicked=false;if(_cmCurrentItem){var B=_cmMenuList[_cmCurrentItem.cmMenuID];var A=B.prefix;cmHideMenu(cmGetThisMenu(_cmCurrentItem,A),null,B);_cmCurrentItem=null}}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}function cmHideMenu(E,D,C){var B=C.prefix;var F=B+"SubMenu";if(E.cmSubMenu){var A;for(A=0;A<E.cmSubMenu.length;++A){cmHideSubMenu(E.cmSubMenu[A],C)}}while(E&&E!=D){cmResetMenu(E,B);if(E.className==F){cmHideThisMenu(E,C)}else{break}E=cmGetThisMenu(E.cmParentMenu,B)}}function cmHideSubMenu(D,C){if(D.style.visibility=="hidden"){return }if(D.cmSubMenu){var A;for(A=0;A<D.cmSubMenu.length;++A){cmHideSubMenu(D.cmSubMenu[A],C)}}var B=C.prefix;cmResetMenu(D,B);cmHideThisMenu(D,C)}function cmHideControl(D,E){var J=cmGetX(E);var I=cmGetY(E);var K=E.offsetWidth;var H=E.offsetHeight;var G;for(G=0;G<document.all.tags(D).length;++G){var F=document.all.tags(D)[G];if(!F||!F.offsetParent){continue}var B=cmGetX(F);var A=cmGetY(F);var C=F.offsetWidth;var L=F.offsetHeight;if(B>(J+K)||(B+C)<J){continue}if(A>(I+H)||(A+L)<I){continue}if(F.style.visibility=="hidden"){continue}E.cmOverlap[E.cmOverlap.length]=F;F.style.visibility="hidden"}}function cmShowControl(A){if(A.cmOverlap){var B;for(B=0;B<A.cmOverlap.length;++B){A.cmOverlap[B].style.visibility=""}}A.cmOverlap=null}function cmGetThisMenu(D,C){var B=C+"SubMenu";var A=C+"Menu";while(D){if(D.className==B||D.className==A){return D}D=D.parentNode}return null}function cmTimeEffect(C,A,B){window.setTimeout('cmCallEffect("'+C+'",'+A+")",B)}function cmCallEffect(D,A){var C=cmGetObject(D);if(!C||!C.cmEffect){return }try{if(A){C.cmEffect.showEffect(false)}else{C.cmEffect.hideEffect(false)}}catch(B){}}function cmIsDefaultItem(A){if(A==_cmSplit||A[0]==_cmNoAction||A[0]==_cmNoClick){return false}return true}function cmGetObject(A){if(document.all){return document.all[A]}return document.getElementById(A)}function cmGetWidth(B){var A=B.offsetWidth;if(A>0||!cmIsTRNode(B)){return A}if(!B.firstChild){return 0}return B.lastChild.offsetLeft-B.firstChild.offsetLeft+cmGetWidth(B.lastChild)}function cmGetHeight(B){var A=B.offsetHeight;if(A>0||!cmIsTRNode(B)){return A}if(!B.firstChild){return 0}return B.firstChild.offsetHeight}function cmGetX(B){if(!B){return 0}var A=0;do{A+=B.offsetLeft;B=B.offsetParent}while(B);return A}function cmGetXAt(B,C){var A=0;while(B&&B!=C){A+=B.offsetLeft;B=B.offsetParent}if(B==C){return A}return A-cmGetX(C)}function cmGetY(A){if(!A){return 0}var B=0;do{B+=A.offsetTop;A=A.offsetParent}while(A);return B}function cmIsTRNode(B){var A=B.tagName;return A=="TR"||A=="tr"||A=="Tr"||A=="tR"}function cmGetYAt(B,D){var C=0;if(!B.offsetHeight&&cmIsTRNode(B)){var A=B.parentNode.firstChild;B=B.firstChild;C-=A.firstChild.offsetTop}while(B&&B!=D){C+=B.offsetTop;B=B.offsetParent}if(B==D){return C}return C-cmGetY(D)}function cmSetStatus(A){var B="";if(A.length>4){B=(A[4]!=null)?A[4]:(A[2]?A[2]:B)}else{if(A.length>2){B=(A[2]?A[2]:B)}}window.defaultStatus=B}function cmGetProperties(B){if(B==undefined){return"undefined"}if(B==null){return"null"}var C=B+":\n";var A;for(A in B){C+=A+" = "+B[A]+"; "}return C}function CMSpecialEffectInstance(A,B){A.show=true;A.menu=B;B.cmEffect=A;this.effect=A}CMSpecialEffectInstance.prototype.canShow=function(A){if(A){if(this.effect.show){return false}this.effect.show=true}else{if(!this.effect.show){return false}}return true};CMSpecialEffectInstance.prototype.canHide=function(B){var A=this.effect;if(B){if(!A.show){return false}A.show=false}else{if(A.show){return false}}return true};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 - @*/};CMSpecialEffectInstance.prototype.finishShowing=function(){};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};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 - @*/}CMSlidingEffectInstance.prototype.showEffect=function(B){if(!this.base.canShow(B)){return }var A=this.percent;if(this.slideOrient=="h"){this.slideMenuV()}else{this.slideMenuH()}if(A==0){this.base.startShowing()}if(A<100){this.percent+=this.speed;cmTimeEffect(this.menu.id,this.show,10)}else{if(this.show){this.base.finishShowing()}}};CMSlidingEffectInstance.prototype.hideEffect=function(B){if(!this.base.canHide(B)){return }var A=this.percent;if(this.slideOrient=="h"){this.slideMenuV()}else{this.slideMenuH()}if(A>0){this.percent-=this.speed;cmTimeEffect(this.menu.id,this.show,10)}else{if(!this.show){this.menu.style.clip="auto";this.base.finishHiding()}}};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 - @*/};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 - @*/};function CMSlidingEffect(A){if(!A){A=10}else{if(A<=0){A=10}else{if(A>=100){A=100}}}this.speed=A}CMSlidingEffect.prototype.getInstance=function(B,A){return new CMSlidingEffectInstance(B,A,this.speed)};function CMFadingEffectInstance(C,A,B){this.base=new CMSpecialEffectInstance(this,C);C.style.overflow="hidden";this.showSpeed=A;this.hideSpeed=B;this.opacity=0}CMFadingEffectInstance.prototype.showEffect=function(C){if(!this.base.canShow(C)){return }var B=this.menu;var A=this.opacity;this.setOpacity();if(A==0){this.base.startShowing()}if(A<100){this.opacity+=10;cmTimeEffect(B.id,this.show,this.showSpeed)}else{if(this.show){this.base.finishShowing()}}};CMFadingEffectInstance.prototype.hideEffect=function(C){if(!this.base.canHide(C)){return }var B=this.menu;var A=this.opacity;this.setOpacity();if(this.opacity>0){this.opacity-=10;cmTimeEffect(B.id,this.show,this.hideSpeed)}else{if(!this.show){this.base.finishHiding()}}};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(A,B){this.showSpeed=A;this.hideSpeed=B}CMFadingEffect.prototype.getInstance=function(B,A){return new CMFadingEffectInstance(B,this.showSpeed,this.hideSpeed)}; \ No newline at end of file Added: trunk/linpha2/lib/js/JSCookMenu/JSCookMenuWithEffects.js =================================================================== --- trunk/linpha2/lib/js/JSCookMenu/JSCookMenuWithEffects.js (rev 0) +++ trunk/linpha2/lib/js/JSCookMenu/JSCookMenuWithEffects.js 2008-03-30 21:55:12 UTC (rev 4912) @@ -0,0 +1,2044 @@ +/* + 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 + 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. +*/ + +// default node properties +var _cmNodeProperties = +{ + // theme prefix + prefix: '', + + // 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: 0, + // cell spacing for sub menus + subSpacing: 0, + + // optional settings + // If not set, use the default + + // auto disappear time for submenus in milli-seconds + 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 +// +////////////////////////////////////////////////////////////////////// + +// +// produce a new unique id +// +function cmNewID () +{ + return _cmIDName + (++_cmIDCount); +} + +// +// return the property string for the menu item +// +function cmActionItem (item, isMain, idSub, menuInfo, menuID) +{ + _cmItemList[_cmItemList.length] = item; + var index = _cmItemList.length - 1; + idSub = (!idSub) ? 'null' : ('\'' + idSub + '\''); + + 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, isMain, idSub, menuInfo, menuID) +{ + // var index = _cmItemList.push (item) - 1; + _cmItemList[_cmItemList.length] = item; + var index = _cmItemList.length - 1; + idSub = (!idSub) ? 'null' : ('\'' + idSub + '\''); + + var param = 'this,' + isMain + ',' + idSub + ',' + menuID + ',' + index; + + return ' onmouseover="cmItemMouseOver (' + param + ')" onmouseout="cmItemMouseOut (' + param + ')"'; +} + +function cmNoActionItem (item) +{ + return item[1]; +} + +function cmSplitItem (prefix, isMain, vertical) +{ + var classStr = 'cm' + prefix; + if (isMain) + { + classStr += 'Main'; + if (vertical) + classStr += 'HSplit'; + else + classStr += 'VSplit'; + } + else + classStr += 'HSplit'; + return eval (classStr); +} + +// +// draw the sub menu recursively +// +function cmDrawSubMenu (subMenu, prefix, id, nodeProperties, zIndexStart, menuInfo, menuID) +{ + 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; + var idSub; + var hasChild; + + var i; + + var classStr; + + for (i = 5; i < subMenu.length; ++i) + { + item = subMenu[i]; + if (!item) + continue; + + if (item == _cmSplit) + item = cmSplitItem (prefix, 0, true); + 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, 0, idSub, menuInfo, menuID); + else + str += cmNoClickItem (item, 0, idSub, menuInfo, menuID); + str += '>' + + if (item[0] == _cmNoAction || item[0] == _cmNoClick) + { + str += cmNoActionItem (item); + str += '</tr>'; + continue; + } + + classStr = prefix + 'Menu'; + classStr += hasChild ? 'Folder' : 'Item'; + + str += '<td class="' + classStr + 'Left">'; + + if (item[0] != null) + str += item[0]; + else + str += hasChild ? nodeProperties.folderLeft : nodeProperties.itemLeft; + + str += '</td><td class="' + classStr + 'Text">' + item[1]; + + str += '</td><td class="' + classStr + 'Right">'; + + if (hasChild) + { + str += nodeProperties.folderRight; + strSub += cmDrawSubMenu (item, prefix, idSub, nodeProperties, zIndexStart + nodeProperties.zIndexInc, menuInfo, menuID); + } + else + str += nodeProperties.itemRight; + str += '</td></tr>'; + } + + str += '</table>'; + + if (nodeProperties.subMenuFooter) + str += nodeProperties.subMenuFooter; + str += '</div>' + strSub; + return str; +} + +// +// The function that builds the menu inside the specified element id. +// +// 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 (!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 = ''; + + var vertical; + + // draw the main menu items + if (orient.charAt (0) == 'h') + { + str += '<tr>'; + vertical = false; + } + else + { + vertical = true; + } + + var i; + var item; + var idSub; + var hasChild; + + var classStr; + + for (i = 0; i < menu.length; ++i) + { + item = menu[i]; + + if (!item) + continue; + + 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, 1, idSub, menuInfo, menuID) + '>'; + + if (item == _cmSplit) + item = cmSplitItem (prefix, 1, vertical); + + if (item[0] == _cmNoAction || item[0] == _cmNoClick) + { + str += cmNoActionItem (item); + str += vertical? '</tr>' : '</td>'; + continue; + } + + classStr = prefix + 'Main' + (hasChild ? 'Folder' : 'Item'); + + str += vertical ? '<td' : '<span'; + str += ' class="' + classStr + 'Left">'; + + str += (item[0] == null) ? (hasChild ? nodeProperties.mainFolderLeft : nodeProperties.mainItemLeft) + : item[0]; + str += vertical ? '</td>' : '</span>'; + + str += vertical ? '<td' : '<span'; + str += ' class="' + classStr + 'Text">'; + str += item[1]; + + str += vertical ? '</td>' : '</span>'; + + str += vertical ? '<td' : '<span'; + str += ' class="' + classStr + 'Right">'; + + str += hasChild ? nodeProperties.mainFolderRight : nodeProperties.mainItemRight; + + str += vertical ? '</td>' : '</span>'; + + str += vertical ? '</tr>' : '</td>'; + + if (hasChild) + strSub += cmDrawSubMenu (item, prefix, idSub, nodeProperties, nodeProperties.zIndexStart, menuInfo, menuID); + } + if (!vertical) + str += '</tr>'; + str += '</table>' + strSub; + obj.innerHTML = str; +} + +// +// 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) + menuItem.className = prefix + 'MainItem'; + else + menuItem.className = prefix + 'MenuItem'; + item.isDisabled = false; +} + +////////////////////////////////////////////////////////////////////// +// +// Mouse Event Handling Functions +// +////////////////////////////////////////////////////////////////////// + +// +// action should be taken for mouse moving in to the menu item +// +// 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 (_cmItemList[index].isDisabled) + return; + + var prefix = _cmMenuList[menuID].prefix; + + if (!obj.cmMenuID) + { + obj.cmMenuID = menuID; + obj.cmIsMain = isMain; + } + + var thisMenu = cmGetThisMenu (obj, prefix); + + // insert obj into cmItems if cmItems doesn't have obj + if (!thisMenu.cmItems) + thisMenu.cmItems = new Array (); + var i; + for (i = 0; i < thisMenu.cmItems.length; ++i) + { + if (thisMenu.cmItems[i] == obj) + break; + } + if (i == thisMenu.cmItems.length) + { + //thisMenu.cmItems.push (obj); + thisMenu.cmItems[i] = obj; + } + + // hide the previous submenu that is not this branch + if (_cmCurrentItem) + { + // occationally, we get this case when user + // move the mouse slowly to the border + if (_cmCurrentItem == obj || _cmCurrentItem == thisMenu) + { + var item = _cmItemList[index]; + cmSetStatus (item); + return; + } + + var thatMenuInfo = _cmMenuList[_cmCurrentItem.cmMenuID]; + var thatPrefix = thatMenuInfo.prefix; + var thatMenu = cmGetThisMenu (_cmCurrentItem, thatPrefix); + + if (thatMenu != thisMenu.cmParentMenu) + { + if (_cmCurrentItem.cmIsMain) + _cmCurrentItem.className = thatPrefix + 'MainItem'; + else + _cmCurrentItem.className = thatPrefix + 'MenuItem'; + if (thatMenu.id != idSub) + cmHideMenu (thatMenu, thisMenu, thatMenuInfo); + } + } + + // okay, set the current menu to this obj + _cmCurrentItem = obj; + + // just in case, reset all items in this menu to MenuItem + cmResetMenu (thisMenu, prefix); + + var item = _cmItemList[index]; + var isDefaultItem = cmIsDefaultItem (item); + + if (isDefaultItem) + { + if (isMain) + obj.className = prefix + 'MainItemHover'; + else + obj.className = prefix + 'MenuItemHover'; + } + + cmSetStatus (item); +} + +// +// 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); + 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, isMain, idSub, menuID, index) +{ + var delayTime = _cmMenuList[menuID].nodeProperties.delay; + _cmTimeOut = window.setTimeout ('cmHideMenuTime ()', delayTime); + window.defaultStatus = ''; +} + +// +// action should be taken for mouse button down at a menu item +// +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 = prefix + 'MainItemActive'; + else + 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, isMain, idSub, menuID, index) +{ + if (_cmItemList[index].isDisabled) + return; + + var item = _cmItemList[index]; + + var link = null, target = '_self'; + + if (item.length > 2) + link = item[2]; + if (item.length > 3 && item[3]) + target = item[3]; + + if (link != null) + { + _cmClicked = false; + window.open (link, target); + } + + var menuInfo = _cmMenuList[menuID]; + var prefix = menuInfo.prefix; + var thisMenu = cmGetThisMenu (obj, prefix); + + var hasChild = (item.length > 5); + if (!hasChild) + { + if (cmIsDefaultItem (item)) + { + if (obj.cmIsMain) + obj.className = prefix + 'MainItem'; + else + obj.className = prefix + 'MenuItem'; + } + cmHideMenu (thisMenu, null, menuInfo); + } + else + { + if (cmIsDefaultItem (item)) + { + if (obj.cmIsMain) + obj.className = prefix + 'MainItemHover'; + else + obj.className = prefix + 'MenuItemHover'; + } + } +} + +////////////////////////////////////////////////////////////////////// +// +// Mouse Event Support Utility Functions +// +////////////////////////////////////////////////////////////////////// + +// +// move submenu to the appropriate location +// +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); + var horiz = cmGetHorizontalAlign (obj, mode, p, subMenuWidth); + if (mode.charAt (0) == 'h') + { + if (mode.charAt (1) == 'b') + subMenu.style.top = (cmGetYAt (obj, p) + cmGetHeight (obj) + offsetAdjust[1]) + 'px'; + else + subMenu.style.top = (cmGetYAt (obj, p) - cmGetHeight (subMenu) - offsetAdjust[1]) + 'px'; + if (horiz == 'r') + subMenu.style.left = (cmGetXAt (obj, p) + offsetAdjust[0]) + 'px'; + else + subMenu.style.left = (cmGetXAt (obj, p) + cmGetWidth (obj) - subMenuWidth - offsetAdjust[0]) + 'px'; + } + else + { + if (horiz == 'r') + subMenu.style.left = (cmGetXAt (obj, p) + cmGetWidth (obj) + offsetAdjust[0]) + 'px'; + else + subMenu.style.left = (cmGetXAt (obj, p) - subMenuWidth - offsetAdjust[0]) + 'px'; + if (mode.charAt (1) == 'b') + subMenu.style.top = (cmGetYAt (obj, p) + offsetAdjust[1]) + 'px'; + else + 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; +} + +// +// automatically re-adjust the menu position based on available screen size. +// +function cmGetHorizontalAlign (obj, mode, p, subMenuWidth) +{ + var horiz = mode.charAt (2); + if (!(document.body)) + return horiz; + var body = document.body; + var browserLeft; + var browserRight; + if (window.innerWidth) + { + // DOM window attributes + browserLeft = window.pageXOffset; + browserRight = window.innerWidth + browserLeft; + } + else if (body.clientWidth) + { + // IE attributes + browserLeft = body.clientLeft; + browserRight = body.clientWidth + browserLeft; + } + else + return horiz; + if (mode.charAt (0) == 'h') + { + if (horiz == 'r' && (cmGetXAt (obj) + subMenuWidth) > browserRight) + horiz = 'l'; + if (horiz == 'l' && (cmGetXAt (obj) + cmGetWidth (obj) - subMenuWidth) < browserLeft) + horiz = 'r'; + return horiz; + } + else + { + if (horiz == 'r' && (cmGetXAt (obj, p) + cmGetWidth (obj) + subMenuWidth) > browserRight) + horiz = 'l'; + if (horiz == 'l' && (cmGetXAt (obj, p) - subMenuWidth) < browserLeft) + horiz = 'r'; + return horiz; + } +} + +// +// show the subMenu w/ specified orientation +// also move it to the correct coordinates +// +function cmShowSubMenu (obj, isMain, subMenu, menuInfo) +{ + var prefix = menuInfo.prefix; + + if (!subMenu.cmParentMenu) + { + // establish the tree w/ back edge + var thisMenu = cmGetThisMenu (obj, prefix); + subMenu.cmParentMenu = thisMenu; + if (!thisMenu.cmSubMenu) + thisMenu.cmSubMenu = new Array (); + thisMenu.cmSubMenu[thisMenu.cmSubMenu.length] = subMenu; + } + + 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) + { + } + } + + if (_cmHideObjects == 1) + { + if (!subMenu.cmOverlap) + subMenu.cmOverlap = new Array (); + cmHideControl ("IFRAME", subMenu); + cmHideControl ("OBJECT", subMenu); + } +} + +// +// reset all the menu items to class MenuItem in thisMenu +// +function cmResetMenu (thisMenu, prefix) +{ + if (thisMenu.cmItems) + { + var i; + var str; + var items = thisMenu.cmItems; + for (i = 0; i < items.length; ++i) + { + if (items[i].cmIsMain) + { + 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'; + if (items[i].className != str) + items[i].className = str; + } + } +} + +// +// called by the timer to hide the menu +// +function cmHideMenuTime () +{ + _cmClicked = false; + if (_cmCurrentItem) + { + 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, menuInfo) +{ + var prefix = menuInfo.prefix; + var str = prefix + 'SubMenu'; + + // hide the down stream menus + if (thisMenu.cmSubMenu) + { + var i; + for (i = 0; i < thisMenu.cmSubMenu.length; ++i) + { + cmHideSubMenu (thisMenu.cmSubMenu[i], menuInfo); + } + } + + // hide the upstream menus + while (thisMenu && thisMenu != currentMenu) + { + cmResetMenu (thisMenu, prefix); + if (thisMenu.className == str) + { + cmHideThisMenu (thisMenu, menuInfo); + } + else + break; + thisMenu = cmGetThisMenu (thisMenu.cmParentMenu, prefix); + } +} + +// +// hide thisMenu as well as its sub menus if thisMenu is not +// already hidden +// +function cmHideSubMenu (thisMenu, menuInfo) +{ + if (thisMenu.style.visibility == 'hidden') + return; + if (thisMenu.cmSubMenu) + { + var i; + for (i = 0; i < thisMenu.cmSubMenu.length; ++i) + { + cmHideSubMenu (thisMenu.cmSubMenu[i], menuInfo); + } + } + var prefix = menuInfo.prefix; + cmResetMenu (thisMenu, prefix); + cmHideThisMenu (thisMenu, menuInfo); +} + +// +// hide a control such as IFRAME +// +function cmHideControl (tagName, subMenu) +{ + var x = cmGetX (subMenu); + var y = cmGetY (subMenu); + var w = subMenu.offsetWidth; + var h = subMenu.offsetHeight; + + var i; + for (i = 0; i < document.all.tags(tagName).length; ++i) + { + var obj = document.all.tags(tagName)[i]; + if (!obj || !obj.offsetParent) + continue; + + // check if the object and the subMenu overlap + + var ox = cmGetX (obj); + var oy = cmGetY (obj); + var ow = obj.offsetWidth; + var oh = obj.offsetHeight; + + if (ox > (x + w) || (ox + ow) < x) + continue; + if (oy > (y + h) || (oy + oh) < y) + continue; + + // if object is already made hidden by a different + // 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') + continue; + + //subMenu.cmOverlap.push (obj); + subMenu.cmOverlap[subMenu.cmOverlap.length] = obj; + obj.style.visibility = 'hidden'; + } +} + +// +// show the control hidden by the subMenu +// +function cmShowControl (subMenu) +{ + if (subMenu.cmOverlap) + { + var i; + for (i = 0; i < subMenu.cmOverlap.length; ++i) + subMenu.cmOverlap[i].style.visibility = ""; + } + subMenu.cmOverlap = null; +} + +// +// returns the main menu or the submenu table where this obj (menu item) +// is in +// +function cmGetThisMenu (obj, prefix) +{ + var str1 = prefix + 'SubMenu'; + var str2 = prefix + 'Menu'; + while (obj) + { + if (obj.className == str1 || obj.className == str2) + return obj; + obj = obj.parentNode; + } + return null; +} + +// +// 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... [truncated message content] |