Ignore:
Timestamp:
Jun 26, 2010, 8:54:20 PM (14 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.