Index: /extensions/rv_menutree/branches/2.0-radu/index.php
===================================================================
--- /extensions/rv_menutree/branches/2.0-radu/index.php	(revision 3573)
+++ /extensions/rv_menutree/branches/2.0-radu/index.php	(revision 3573)
@@ -0,0 +1,33 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | PhpWebGallery - a PHP based picture gallery                           |
+// | Copyright (C) 2002-2003 Pierrick LE GALL - pierrick@phpwebgallery.net |
+// | Copyright (C) 2003-2007 PhpWebGallery Team - http://phpwebgallery.net |
+// +-----------------------------------------------------------------------+
+// | file          : $Id$
+// | last update   : $Date$
+// | last modifier : $Author$
+// | revision      : $Revision$
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: /extensions/rv_menutree/branches/2.0-radu/main.inc.php
===================================================================
--- /extensions/rv_menutree/branches/2.0-radu/main.inc.php	(revision 3573)
+++ /extensions/rv_menutree/branches/2.0-radu/main.inc.php	(revision 3573)
@@ -0,0 +1,152 @@
+<?php /*
+Plugin Name: RV Menu Tree
+Version: 2.0.c
+Plugin URI: http://phpwebgallery.net/ext/extension_view.php?eid=238
+Description: Replaces the categories in the menu bar with a nicer one (javascript).
+Author: rvelices
+Author URI: http://www.modusoptimus.com
+*/
+
+if (!function_exists('rv_ua_is_handheld'))
+{
+	function rv_ua_is_handheld()
+	{
+		if ( isset($_SESSION['is_handheld']) )
+			return $_SESSION['is_handheld'];
+		$ret=false;
+		if ( strpos($_SERVER['HTTP_USER_AGENT'], 'BlackBerry')!==false )
+			$ret=true;
+		if ( session_id()!="" )
+			$_SESSION['is_handheld']=$ret;
+		return $ret;
+	}
+}
+
+add_event_handler('get_categories_menu_sql_where', 'rv_mt_get_categories_menu_sql_where', EVENT_HANDLER_PRIORITY_NEUTRAL, 3 );
+
+function rv_mt_get_categories_menu_sql_where($where, $expand, $filter)
+{
+	if (rv_ua_is_handheld()) return $where;
+	add_event_handler('get_html_menu_category', 'rv_mt_get_html_menu_category', EVENT_HANDLER_PRIORITY_NEUTRAL, 3);
+
+	if ($expand)
+		return $where;
+	if ($filter)
+	{
+		global $rv_mt_all_open;
+		$rv_mt_all_open = true;
+		return $where;
+	}
+
+	global $page;
+	if ( !isset($page['category']) )
+		$where = 'id_uppercat IS NULL OR uppercats REGEXP \'^[0-9]+,[0-9]+$\'';
+	else
+	{
+		$where = 'id_uppercat is NULL
+  OR uppercats LIKE "'.$page['category']['upper_names'][0]['id'].',%"
+  OR uppercats REGEXP \'^[0-9]+,[0-9]+$\'';
+	}
+	return $where;
+}
+
+
+function rv_mt_get_html_menu_category($menu, $categories, $selected_category)
+{
+	$start = get_moment();
+
+	$ref_level = 0;
+	$level = 0;
+	$menu = '';
+
+	$upper_ids=array();
+	if ( null!=$selected_category)
+		$upper_ids = array_flip( explode(',', $selected_category['uppercats']) );
+
+	$url_perma = make_index_url( array( 'category' => array('id'=>0, 'name'=>'', 'permalink'=> '@permalink@') ) );
+	$url_no_perma = make_index_url( array( 'category' => array('id'=>999999, 'name'=>'xxxnamexxx', 'permalink'=> '') ) );
+
+	foreach ($categories as $category)
+	{
+		$level = substr_count($category['global_rank'], '.') + 1;
+		if ($level > $ref_level)
+		{
+			if ($ref_level==0)
+				$menu.= "\n<ul class=\"rvTree\" id=\"theCategoryMenu\">";
+			else
+				$menu.= "\n<ul>";
+		}
+		elseif ($level == $ref_level)
+			$menu.= "</li>";
+		elseif ($level < $ref_level)
+		{
+			// we may have to close more than one level at the same time...
+			$menu.= "</li>";
+			$menu.= str_repeat("\n</ul></li>",($ref_level-$level));
+		}
+		$ref_level = $level;
+
+		$menu.= "\n<li";
+		$class_names = array();
+		if ($category['id'] == @$selected_category['id'])
+			array_push( $class_names, 'selected');
+		global $rv_mt_all_open;
+
+		if ($category['count_categories']>0)
+		{
+			if ( isset($rv_mt_all_open) and $rv_mt_all_open )
+				array_push( $class_names, 'liOpen');
+			elseif ( isset( $upper_ids[ $category['id'] ] ) )
+			{
+				array_push( $class_names, 'liOpen');
+				unset($upper_ids[ $category['id'] ] );
+			}
+			else
+				array_push( $class_names, 'liClosed');
+		}
+
+		if (count($class_names))
+			$menu.= ' class="'.implode($class_names,' ').'"';
+		$menu.= '>';
+
+		if ( empty($category['permalink']) )
+			$url = str_replace( array('999999', 'xxxnamexxx'), array($category['id'], str2url($category['name'])), $url_no_perma);
+		else
+			$url = str_replace('@permalink@', $category['permalink'], $url_perma);
+
+		$title = get_display_images_count(
+							$category['nb_images'], $category['count_images'], $category['count_categories'],
+							false,
+							' / '
+						);
+
+		$menu.= '<a href="'.$url.'"';
+		if ($selected_category!=null and $category['id'] == $selected_category['id_uppercat'])
+			$menu.= ' rel="up"';
+		$menu.= ' title="'.$title.'">'
+			//.trigger_event('render_category_name', $category['name'], 'get_html_menu_category')
+			.$category['name']
+			.'</a>';
+
+		if ( $category['count_images']>0 )
+		{// at least one direct or indirect image
+			$menu.= '<span class="menuInfoCat'
+				.($category['nb_images'] == 0 ? 'ByChild' : '')
+				.'" title="'.$title.'"> ['.$category['count_images'].']</span>';
+		}
+		$menu.= get_icon($category['max_date_last'], @$category['max_date_last']> @$category['date_last']);
+	}
+
+	$menu.= str_repeat("\n</li></ul>",($level));
+	$menu.= '<script type="text/javascript">RVTree.convertTree( document.getElementById("theCategoryMenu") );</script>';
+
+	$dirname = dirname(__FILE__);
+	$head = '<style type="text/css">'. str_replace( 'url(', 'url('.get_root_url().'plugins/'.basename($dirname).'/',file_get_contents($dirname.'/rvtree-min.css')).'</style>
+<script type="text/javascript" src="'.get_root_url().'plugins/'. basename(dirname(__FILE__)).'/rvtree-min.js"></script>';
+
+	pwg_debug('rv_mt_get_html_menu_category took '.number_format(get_moment() - $start,3,'.',' ') );
+	global $template;
+	$template->append( 'head_elements', $head);
+	return $menu;
+}
+?>
Index: /extensions/rv_menutree/branches/2.0-radu/rvtree-min.css
===================================================================
--- /extensions/rv_menutree/branches/2.0-radu/rvtree-min.css	(revision 3573)
+++ /extensions/rv_menutree/branches/2.0-radu/rvtree-min.css	(revision 3573)
@@ -0,0 +1,5 @@
+ul.rvTree li .bullet{padding-left:14px;margin-left:0;background:url(img/bpm.gif) no-repeat scroll;}
+ul.rvTree li.liOpen .bullet{cursor:pointer;background-position:-38px center;}
+ul.rvTree li.liClosed .bullet{cursor:pointer;background-position:-19px center;}
+ul.rvTree li.liBullet .bullet{cursor:default;background-position:0 center;}
+ul.rvTree li.liClosed ul{display:none;}
Index: /extensions/rv_menutree/branches/2.0-radu/rvtree-min.js
===================================================================
--- /extensions/rv_menutree/branches/2.0-radu/rvtree-min.js	(revision 3573)
+++ /extensions/rv_menutree/branches/2.0-radu/rvtree-min.js	(revision 3573)
@@ -0,0 +1,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;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&&(window.attachEvent&&!window.opera))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"}}
Index: /extensions/rv_menutree/branches/2.0-radu/rvtree.css
===================================================================
--- /extensions/rv_menutree/branches/2.0-radu/rvtree.css	(revision 3573)
+++ /extensions/rv_menutree/branches/2.0-radu/rvtree.css	(revision 3573)
@@ -0,0 +1,16 @@
+/*This is not used directly. Compress it to rvtree-min.css using
+http://www.cleancss.com/
+http://www.creativyst.com/Prod/3/
+*/
+
+/* do it in JS so that if browser JS is turned off it looks as before
+ul.rvTree  li { list-style-type: none !important; }
+ul.rvTree     { margin-left:0 !important; padding-left:0 !important;}
+ul.rvTree ul 	{ margin-left:0 !important; padding-left:8px !important;}*/
+
+ul.rvTree  li           .bullet { padding-left: 14px; margin-left: 0; background: url(img/bpm.gif) no-repeat scroll; }
+ul.rvTree  li.liOpen    .bullet { cursor: pointer; background-position: -38px center;}
+ul.rvTree  li.liClosed  .bullet { cursor: pointer; background-position: -19px center;}
+ul.rvTree  li.liBullet  .bullet { cursor: default; background-position: 0 center;}
+	
+ul.rvTree  li.liClosed  ul { display: none; }
Index: /extensions/rv_menutree/branches/2.0-radu/rvtree.js
===================================================================
--- /extensions/rv_menutree/branches/2.0-radu/rvtree.js	(revision 3573)
+++ /extensions/rv_menutree/branches/2.0-radu/rvtree.js	(revision 3573)
@@ -0,0 +1,125 @@
+/* this is not directly used - compress it as rvtree-min.js on http://www.compressjavascript.com/ or somewhere else
+Based on Matt Kruse <matt@mattkruse.com> http://www.mattkruse.com/ */
+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; // Without createElement, we can't do anything
+		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++)
+		{ //Iterate LIs
+      var item = ul.childNodes[i];
+      if (item.nodeName != "LI")
+        continue;
+
+      // Iterate things in this LI
+		  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'; // &nbsp;
+			s.className = RVTree.options.nodeLinkClass;
+			if (subLists)
+      {
+				// This LI has UL's in it, so it's a +/- node
+				if ( !XElement.hasClassName(item, RVTree.options.nodeOpenClass) )
+					XElement.addClassName(item, RVTree.options.nodeClosedClass);
+
+				// If it's just text, make the text work as the link also
+				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
+      {// No sublists
+        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 && /*IE*/ (window.attachEvent && !window.opera) )
+        item.style.marginLeft="-16px"; // thats IE6 what about IE7 ?
+			if (s)
+			{
+				s.appendChild(document.createTextNode(t));
+				item.insertBefore(s,item.firstChild);
+			}
+		}
+		ul.style.marginLeft = 0;
+		ul.style.paddingLeft = isRoot ? 0 : "8px";
+	}
+}
