Ignore:
Timestamp:
06/26/10 20:54:20 (10 years ago)
Author:
rvelices
Message:

rv_menutree improved javascript (faster, async loading in browser, better compressed zith google closure compiler)

Location:
extensions/rv_menutree/trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • extensions/rv_menutree/trunk/changelog.txt

    r6413 r6608  
     12.1.c 
     2        - improved javascript (faster, async loading in browser, better compressed zith google closure compiler) 
     3 
     42.1.b 
     5        - themes can define their own rv_menutree_categories.tpl 
     6 
     72.1.a 
     8        - compatibility with piwigo 2.1 
     9 
    1102.0.c 
    211        - optimizations by calling make_index_url less frequently 
    312        - compatible with IE8 
    413 
    5 2.1.a 
    6         - compatibility with piwigo 2.1 
    7  
    8 2.1.b 
    9         - themes can define their own rv_menutree_categories.tpl 
  • extensions/rv_menutree/trunk/js/rvtree-min.js

    r6413 r6608  
    1 var XElement={hasClassName:function(element,className){if(!element)return false;var elementClassName=element.className;if(elementClassName.length==0)return false;if(elementClassName==className||elementClassName.match(new RegExp("(^|\\s)"+className+"(\\s|$)")))return true;return false},addClassName:function(element,className){if(!element)return;var classNames=element.className.split(/\s+/);for(var i=0;i<classNames.length;i++)if(className==classNames[i])return;classNames.splice(0,0,className);element.className=classNames.join(' ');return element},toggleClassName:function(element,className){if(!element)return;var classNames=element.className.split(/\s+/);for(var i=0;i<classNames.length;i++)if(classNames[i]==className)break;if(i==classNames.length)classNames.splice(0,0,className);else classNames.splice(i,1);element.className=classNames.join(' ');return element}};var RVTree={options:{nodeClosedClass:"liClosed",nodeOpenClass:"liOpen",nodeBulletClass:"liBullet",nodeLinkClass:"bullet"},convertTree:function(root){if(!document.createElement)return;if(window.attachEvent&&!window.opera){if(new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})").exec(navigator.userAgent)!=null)RVTree.options.IEVersion=parseFloat(RegExp.$1)}RVTree._processList(root,true)},_processList:function(ul,isRoot){if(!ul.childNodes||ul.childNodes.length==0)return;for(var i=0;i<ul.childNodes.length;i++){var item=ul.childNodes[i];if(item.nodeName!="LI")continue;var subLists=false;for(var sitemi=0;sitemi<item.childNodes.length;sitemi++){var sitem=item.childNodes[sitemi];if(sitem.nodeName=="UL"){subLists=true;RVTree._processList(sitem,false)}}var s=document.createElement("SPAN");var t='\u00A0';s.className=RVTree.options.nodeLinkClass;if(subLists){if(!XElement.hasClassName(item,RVTree.options.nodeOpenClass))XElement.addClassName(item,RVTree.options.nodeClosedClass);if(item.firstChild.nodeName=="#text"){t=t+item.firstChild.nodeValue;item.removeChild(item.firstChild)}s.onclick=function(){XElement.toggleClassName(this.parentNode,RVTree.options.nodeOpenClass);XElement.toggleClassName(this.parentNode,RVTree.options.nodeClosedClass);return false}}else{if(XElement.hasClassName(item,RVTree.options.nodeClosedClass)){s.onclick=function(){var nodes=this.parentNode.getElementsByTagName("A");if(nodes.length)document.location=nodes[0].href}}else XElement.addClassName(item,RVTree.options.nodeBulletClass)}item.style.listStyleType='none';if(isRoot&&RVTree.options.IEVersion&&RVTree.options.IEVersion<8)item.style.marginLeft="-16px";if(s){s.appendChild(document.createTextNode(t));item.insertBefore(s,item.firstChild)}}ul.style.marginLeft=0;ul.style.paddingLeft=isRoot?0:"8px"}} 
     1var XElement={hasClass:function(b,e){if(!b)return false;var f=b.className;return f.length>0&&(f==e||(new RegExp("(^|\\s)"+e+"(\\s|$)")).test(f))},addClass:function(b,e){if(b){XElement.hasClass(b,e)||(b.className+=(b.className?" ":"")+e);return b}},toggleClasses:function(b,e,f){if(b){for(var a=b.className.split(/\s+/),g=-1,c=-1,d=0;d<a.length;d++){if(a[d]==e)g=d;if(a[d]==f)c=d}if(g>=0){a.splice(g,1);c>=g&&c--}else a.push(e);c>=0?a.splice(c,1):a.push(f);b.className=a.join(" ");return b}}},RVTree={options:{nodeClosedClass:"liClosed", 
     2nodeOpenClass:"liOpen",nodeBulletClass:"liBullet",nodeLinkClass:"bullet"},convertTree:function(b){if(document.createElement){if(window.attachEvent&&!window.opera)if(/MSIE ([0-9]{1,}[.0-9]{0,})/.exec(navigator.userAgent)!=null)RVTree.options.IEVersion=parseFloat(RegExp.$1);RVTree._processList(b,true)}},_processList:function(b,e){if(!(!b.childNodes||b.childNodes.length==0)){for(var f=0;f<b.childNodes.length;f++){var a=b.childNodes[f];if(a.nodeName=="LI"){for(var g=false,c=0;c<a.childNodes.length;c++){var d= 
     3a.childNodes[c];if(d.nodeName=="UL"){g=true;RVTree._processList(d,false)}}c=document.createElement("SPAN");d="\u00a0";c.className=RVTree.options.nodeLinkClass;if(g){XElement.hasClass(a,RVTree.options.nodeOpenClass)||XElement.addClass(a,RVTree.options.nodeClosedClass);if(a.firstChild.nodeName=="#text"){d+=a.firstChild.nodeValue;a.removeChild(a.firstChild)}c.onclick=function(){XElement.toggleClasses(this.parentNode,RVTree.options.nodeOpenClass,RVTree.options.nodeClosedClass);return false}}else if(XElement.hasClass(a, 
     4RVTree.options.nodeClosedClass))c.onclick=function(){var h=this.parentNode.getElementsByTagName("A");if(h.length)document.location=h[0].href};else XElement.addClass(a,RVTree.options.nodeBulletClass);a.style.listStyleType="none";if(e&&RVTree.options.IEVersion&&RVTree.options.IEVersion<8)a.style.marginLeft="-16px";if(c){c.appendChild(document.createTextNode(d));a.insertBefore(c,a.firstChild)}}}b.style.marginLeft=0;b.style.paddingLeft=e?0:"8px"}}};typeof rvTreeAutoConvert!="undefined"&&RVTree.convertTree(rvTreeAutoConvert); 
  • extensions/rv_menutree/trunk/js/rvtree.js

    r6413 r6608  
    1 /* this is not directly used - compress it as rvtree-min.js on http://www.compressjavascript.com/ or somewhere else 
     1/* this is not directly used - compress it as rvtree-min.js on http://javascriptcompressor.com/ or http://closure-compiler.appspot.com 
    22Based on Matt Kruse <matt@mattkruse.com> http://www.mattkruse.com/ */ 
    33var XElement = { 
    4         hasClassName: function(element, className) { 
     4        hasClass: function(element, className) { 
    55                if (!element) return false; 
    66                var elementClassName = element.className; 
    7                 if (elementClassName.length == 0) return false; 
    8                 if (elementClassName == className || 
    9                                 elementClassName.match(new RegExp("(^|\\s)" + className + "(\\s|$)"))) 
    10                         return true; 
    11                 return false; 
     7                return ( elementClassName.length > 0 && (elementClassName == className || 
     8                                                new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName)) ); 
    129        }, 
    1310 
    14         addClassName: function(element, className) { 
     11        addClass: function(element, className) { 
    1512                if (!element) return; 
    16                 var classNames = element.className.split(/\s+/); 
    17                 for (var i=0; i<classNames.length; i++) 
    18                         if (className==classNames[i]) return; 
    19                 classNames.splice(0,0,className); 
    20                 element.className = classNames.join(' '); 
     13                if (!XElement.hasClass(element, className)) 
     14                                element.className += (element.className ? ' ' : '') + className; 
    2115                return element; 
    2216        }, 
    2317 
    24         toggleClassName: function(element, className) { 
     18        toggleClasses: function(element, class1, class2) { 
    2519                if (!element) return; 
    2620                var classNames = element.className.split(/\s+/); 
     21                var i1=-1, i2=-1; 
    2722                for (var i=0; i<classNames.length; i++) 
    28                         if (classNames[i]==className) break; 
    29                 if (i==classNames.length) 
    30                         classNames.splice(0,0,className); 
     23                { 
     24                                if (classNames[i]==class1) i1=i; 
     25                                if (classNames[i]==class2) i2=i; 
     26                } 
     27                if (i1>=0) 
     28                { 
     29                                classNames.splice(i1,1); 
     30                                if (i2>=i1) 
     31                                                i2--; 
     32                } 
    3133                else 
    32                         classNames.splice(i, 1); 
     34                                classNames.push(class1); 
     35          
     36                if (i2>=0) 
     37                                classNames.splice(i2,1); 
     38                else 
     39                                classNames.push(class2); 
    3340                element.className = classNames.join(' '); 
    3441                return element; 
     
    4855        convertTree: function (root) 
    4956        { 
    50                 if (!document.createElement) return; // Without createElement, we can't do anything 
     57                if (!document.createElement) 
     58                        return; // Without createElement, we can't do anything 
    5159                if (window.attachEvent && !window.opera) 
    5260                { 
     
    5967        _processList: function(ul, isRoot) 
    6068        { 
    61                 if (!ul.childNodes || ul.childNodes.length==0) return; 
     69                if (!ul.childNodes || ul.childNodes.length==0)  
     70                        return; 
    6271 
    6372                for (var i=0; i<ul.childNodes.length; i++) 
     
    8594                        { 
    8695                                // This LI has UL's in it, so it's a +/- node 
    87                                 if ( !XElement.hasClassName(item, RVTree.options.nodeOpenClass) ) 
    88                                         XElement.addClassName(item, RVTree.options.nodeClosedClass); 
     96                                if ( !XElement.hasClass(item, RVTree.options.nodeOpenClass) ) 
     97                                        XElement.addClass(item, RVTree.options.nodeClosedClass); 
    8998 
    9099                                // If it's just text, make the text work as the link also 
     
    96105                                s.onclick = function () 
    97106                                { 
    98                                         XElement.toggleClassName( this.parentNode, RVTree.options.nodeOpenClass ); 
    99                                         XElement.toggleClassName( this.parentNode, RVTree.options.nodeClosedClass ); 
     107                                        XElement.toggleClasses(this.parentNode, RVTree.options.nodeOpenClass, RVTree.options.nodeClosedClass ); 
    100108                                        return false; 
    101109                                } 
     
    103111                        else 
    104112                        {// No sublists 
    105                                 if ( XElement.hasClassName(item, RVTree.options.nodeClosedClass) ) 
     113                                if ( XElement.hasClass(item, RVTree.options.nodeClosedClass) ) 
    106114                                { 
    107115                                        s.onclick = function() 
     
    113121                                } 
    114122                                else 
    115                                         XElement.addClassName(item, RVTree.options.nodeBulletClass); 
     123                                        XElement.addClass(item, RVTree.options.nodeBulletClass); 
    116124                        } 
    117125 
     
    129137        } 
    130138} 
     139 
     140if ( typeof rvTreeAutoConvert != 'undefined') 
     141{ 
     142        RVTree.convertTree( rvTreeAutoConvert ); 
     143} 
  • extensions/rv_menutree/trunk/template/rv_menutree_categories.tpl

    r6413 r6608  
    1 {known_script id="rvtree" src=$RVMT_PATH|@cat:"js/rvtree-min.js" } 
    21{html_head} 
    32<style type="text/css"> 
    4 ul.rvTree li .bullet {ldelim}padding-left:14px;margin-left:0;background:url({$RVMT_PATH}img/bpm.gif) no-repeat scroll;} 
    5 ul.rvTree li.liOpen .bullet {ldelim}cursor:pointer;background-position:-38px center;} 
    6 ul.rvTree li.liClosed .bullet {ldelim}cursor:pointer;background-position:-19px center;} 
    7 ul.rvTree li.liBullet .bullet {ldelim}cursor:default;background-position:0 center;} 
    8 ul.rvTree li.liClosed ul {ldelim}display:none;} 
     3.rvTree li .bullet {ldelim}padding-left:14px;margin-left:0;background:url({$RVMT_PATH}img/bpm.gif) no-repeat scroll;} 
     4.rvTree li.liOpen .bullet {ldelim}cursor:pointer;background-position:-38px center;} 
     5.rvTree li.liClosed .bullet {ldelim}cursor:pointer;background-position:-19px center;} 
     6.rvTree li.liBullet .bullet {ldelim}cursor:default;background-position:0 center;} 
     7.rvTree li.liClosed ul {ldelim}display:none;} 
    98</style> 
    109{/html_head} 
     
    5554{'</li></ul>'|@str_repeat:$ref_level} 
    5655<script type="text/javascript"> 
    57   RVTree.convertTree( document.getElementById("theCategoryMenu") ); 
     56        rvTreeAutoConvert = document.getElementById("theCategoryMenu"); 
     57        (function () {ldelim} 
     58        var s = document.createElement('script'); s.type = 'text/javascript'; s.async = true; s.src = '{$RVMT_PATH|@cat:"js/rvtree-min.js"}'; 
     59        var s0 = document.getElementsByTagName('script')[0]; s0.parentNode.insertBefore(s, s0); 
     60        })(); 
     61  //RVTree.convertTree( document.getElementById("theCategoryMenu") ); 
    5862</script> 
    5963        {if isset($block->data.U_UPLOAD)} 
Note: See TracChangeset for help on using the changeset viewer.