Index: /extensions/GrumPluginClasses/css/categorySelector_clear.css
===================================================================
--- /extensions/GrumPluginClasses/css/categorySelector_clear.css	(revision 7348)
+++ /extensions/GrumPluginClasses/css/categorySelector_clear.css	(revision 7349)
@@ -54,9 +54,11 @@
 
 li.ui-category-selector-item:hover {
-  background-color:#999999;
+  background-color:#AAAAAA;
+  color:#DDDDDD;
 }
 
 .ui-category-selector-selected-item {
-  background-color:#AAAAAA;
+  background-color:#999999;
+  color:#DDDDDD;
 }
 
Index: /extensions/GrumPluginClasses/css/tagSelector_clear.css
===================================================================
--- /extensions/GrumPluginClasses/css/tagSelector_clear.css	(revision 7349)
+++ /extensions/GrumPluginClasses/css/tagSelector_clear.css	(revision 7349)
@@ -0,0 +1,62 @@
+/* for tagSelector plugin */
+.ui-tag-selector-input { padding:1px; }
+.ui-tag-selector-input input { border:none; background:transparent; }
+.ui-tag-selector-list { margin-top:-1px; }
+.ui-tag-selector-selected-tag-list { list-style:none; margin:0; padding:0; }
+.ui-tag-selector-selected-tag-list li span {
+  font-family:sans;
+  font-size:80%;
+  font-weight:bold;
+  padding:0 3px;
+  position:relative;
+  top:-1px;
+}
+li.ui-tag-selector-list-item, .ui-tag-selector-text { padding:2px; }
+.ui-tag-selector-selected-tag-list li.ui-tag-selector-selected-tag {
+  -moz-border-radius:8px;
+  -webkit-border-radius:8px;
+  -khtml-border-radius:8px;
+  border-radius:8px;
+  float:left;
+  margin-bottom:1px;
+  margin-right:1px;
+  padding:0 4px;
+  cursor:default;
+}
+.ui-tag-selector-selected-tag-list li.ui-tag-selector-selected-tag span { cursor:pointer; }
+
+/* clear css */
+
+
+.ui-tag-selector-list, .ui-tag-selector-input {
+  background:#DDDDDD;
+  border:1px solid #999999;
+  color:#666666;
+}
+
+.ui-tag-selector-text {
+  font-style:italic;
+  font-size:80%;
+  border-top:1px dotted #999999;
+  background:#DDDDDD;
+  color:#666666;
+}
+
+li.ui-tag-selector-list-item:hover {
+  background:#AAAAAA;
+  color:#DDDDDD;
+  cursor:pointer;
+}
+
+.ui-tag-selector-selected-tag-list li.ui-tag-selector-selected-tag {
+  background:#999999;
+  color:#DDDDDD;
+  margin-top:1px;
+  padding-top:1px;
+}
+
+.ui-tag-selector-highlight {
+  color:#005E89;
+  font-weight:bold;
+  background:#999999;
+}
Index: /extensions/GrumPluginClasses/css/tagSelector_roma.css
===================================================================
--- /extensions/GrumPluginClasses/css/tagSelector_roma.css	(revision 7349)
+++ /extensions/GrumPluginClasses/css/tagSelector_roma.css	(revision 7349)
@@ -0,0 +1,60 @@
+/* for tagSelector plugin */
+.ui-tag-selector-input { padding:1px; }
+.ui-tag-selector-input input { border:none; background:transparent; }
+.ui-tag-selector-list { margin-top:-1px; }
+.ui-tag-selector-selected-tag-list { list-style:none; margin:0; padding:0; }
+.ui-tag-selector-selected-tag-list li span {
+  font-family:sans;
+  font-size:80%;
+  font-weight:bold;
+  padding:0 3px;
+  position:relative;
+  top:-1px;
+}
+li.ui-tag-selector-list-item, .ui-tag-selector-text { padding:2px; }
+.ui-tag-selector-selected-tag-list li.ui-tag-selector-selected-tag {
+  -moz-border-radius:8px;
+  -webkit-border-radius:8px;
+  -khtml-border-radius:8px;
+  border-radius:8px;
+  float:left;
+  margin-bottom:1px;
+  margin-right:1px;
+  padding:0 4px;
+  cursor:default;
+}
+.ui-tag-selector-selected-tag-list li.ui-tag-selector-selected-tag span { cursor:pointer; }
+
+/* roma css */
+
+.ui-tag-selector-list, .ui-tag-selector-input {
+  background:#444444;
+  border:1px solid #666666;
+  color:#999999;
+}
+
+.ui-tag-selector-text {
+  font-style:italic;
+  font-size:80%;
+  border-top:1px dotted #666666;
+  background:#444444;
+  color:#999999;
+}
+
+li.ui-tag-selector-list-item:hover {
+  background:#666666;
+  cursor:pointer;
+}
+
+.ui-tag-selector-selected-tag-list li.ui-tag-selector-selected-tag {
+  background:#666666;
+  color:#999999;
+  margin-top:1px;
+  padding-top:1px;
+}
+
+.ui-tag-selector-highlight {
+  color:#FF7700;
+  font-weight:bold;
+  background:#666666;
+}
Index: /extensions/GrumPluginClasses/gpc_ajax.php
===================================================================
--- /extensions/GrumPluginClasses/gpc_ajax.php	(revision 7348)
+++ /extensions/GrumPluginClasses/gpc_ajax.php	(revision 7349)
@@ -20,4 +20,10 @@
  *  - admin.rbuilder.fillCaddie
  *  - admin.categorySelector.getList
+ *  - public.categorySelector.getList
+ *  - public.rbuilder.searchExecute
+ *  - public.rbuilder.searchGetPage
+ *  - public.tagSelector.get
+ *  - admin.tagSelector.get
+ *
  *
  * -----------------------------------------------------------------------------
@@ -80,5 +86,7 @@
            $_REQUEST['ajaxfct']=='public.rbuilder.searchGetPage' or
            $_REQUEST['ajaxfct']=='admin.categorySelector.getList' or
-           $_REQUEST['ajaxfct']=='public.categorySelector.getList'
+           $_REQUEST['ajaxfct']=='public.categorySelector.getList' or
+           $_REQUEST['ajaxfct']=='public.tagSelector.get' or
+           $_REQUEST['ajaxfct']=='admin.tagSelector.get'
           )
         ) $_REQUEST['ajaxfct']='';
@@ -127,5 +135,26 @@
 
         /*
-         * check admin.categorySelector.getList values
+         * check admin.tagSelector.get values
+         */
+        if($_REQUEST['ajaxfct']=="admin.tagSelector.get" or
+           $_REQUEST['ajaxfct']=="public.tagSelector.get")
+        {
+          if(!isset($_REQUEST['letters'])) $_REQUEST['ajaxfct']="";
+          if(!isset($_REQUEST['filter'])) $_REQUEST['filter']="affected";
+
+          if(!($_REQUEST['filter']=="affected" or
+               $_REQUEST['filter']=="all")
+            ) $_REQUEST['filter']="affected";
+
+          if(!isset($_REQUEST['maxTags'])) $_REQUEST['maxTags']=1000;
+          if($_REQUEST['maxTags']<0) $_REQUEST['maxTags']=0;
+
+          if(!isset($_REQUEST['ignoreCase'])) $_REQUEST['ignoreCase']=true;
+
+        }
+
+
+        /*
+         * check public.categorySelector.getList values
          */
         if($_REQUEST['ajaxfct']=="admin.categorySelector.getList" or
@@ -152,5 +181,4 @@
         }
 
-
       }
     } //checkRequest()
@@ -179,4 +207,10 @@
         case 'public.categorySelector.getList':
           $result=$this->ajax_gpc_public_CategorySelectorGetList($_REQUEST['filter'], $_REQUEST['galleryRoot'], $_REQUEST['tree']);
+          break;
+        case 'admin.tagSelector.get':
+          $result=$this->ajax_gpc_both_TagSelectorGet('admin', $_REQUEST['letters'], $_REQUEST['filter'], $_REQUEST['maxTags'], $_REQUEST['ignoreCase']);
+          break;
+        case 'public.tagSelector.get':
+          $result=$this->ajax_gpc_both_TagSelectorGet('public', $_REQUEST['letters'], $_REQUEST['filter'], $_REQUEST['maxTags'], $_REQUEST['ignoreCase']);
           break;
       }
@@ -322,7 +356,89 @@
 
 
+
+    /**
+     * return the list of all known tags
+     *
+     * @param Striong $mode : 'admin' or 'public'
+     * @param String $letters : filtering on letters
+     * @param String $filter : 'accessible' or 'all'
+     * @param Integer $maxTags : maximum of items returned ; 0 = no limits
+     * @return String : json string
+     */
+    private function ajax_gpc_both_TagSelectorGet($mode, $letters, $filter, $maxTags, $ignoreCase)
+    {
+      global $user;
+
+      $returned=array(
+        'totalNbTags' => 0,
+        'tags' => array(),
+      );
+
+      $binary='';
+      if(!$ignoreCase) $binary=" BINARY ";
+
+
+      $sql="SELECT DISTINCT SQL_CALC_FOUND_ROWS ptt.id, ptt.name
+            FROM ((".TAGS_TABLE." ptt ";
+
+      if($filter=='affected')
+      {
+        $sql.=" JOIN ".IMAGE_TAG_TABLE." pitt
+                ON pitt.tag_id = ptt.id ) ";
+      }
+      else
+      {
+        $sql.=" ) ";
+      }
+
+
+      if($mode=='public' and $filter=='affected')
+      {
+        $sql.=" JOIN ".IMAGE_CATEGORY_TABLE." pict
+                ON pict.image_id = pitt.image_id )
+                JOIN ".USER_CACHE_CATEGORIES_TABLE." pucc
+                ON (pucc.cat_id = pict.category_id AND pucc.user_id='".$user['id']."' )";
+      }
+      else
+      {
+        $sql.=" ) ";
+      }
+
+      $sql.=" WHERE ptt.name LIKE $binary '%$letters%'
+            ORDER BY ptt.name ";
+
+      if($maxTags>0) $sql.=" LIMIT 0, ".$maxTags;
+
+      $result=pwg_query($sql);
+      if($result)
+      {
+        while($row=pwg_db_fetch_assoc($result))
+        {
+          $returned['tags'][]=$row;
+        }
+
+        $sql="SELECT FOUND_ROWS();";
+        $result=pwg_query($sql);
+        if($result)
+        {
+          while($row=pwg_db_fetch_row($result))
+          {
+            $returned['totalNbTags']=$row[0];
+          }
+        }
+      }
+
+      return(json_encode($returned));
+    } //ajax_gpc_both_TagSelectorGet
+
+
   } //class
 
 
   $returned=new GPC_Ajax($prefixeTable, __FILE__);
+
+
+
+
+
 ?>
Index: /extensions/GrumPluginClasses/js/ui.tagSelector.js
===================================================================
--- /extensions/GrumPluginClasses/js/ui.tagSelector.js	(revision 7349)
+++ /extensions/GrumPluginClasses/js/ui.tagSelector.js	(revision 7349)
@@ -0,0 +1,1275 @@
+/**
+ * -----------------------------------------------------------------------------
+ * file: ui.tagSelector.js
+ * file version: 1.0.0
+ * date: 2010-10-22
+ *
+ * A jQuery plugin provided by the piwigo's plugin "GrumPluginClasses"
+ *
+ * -----------------------------------------------------------------------------
+ * Author     : Grum
+ *   email    : grum@piwigo.com
+ *   website  : http://photos.grum.fr
+ *   PWG user : http://forum.phpwebgallery.net/profile.php?id=3706
+ *
+ *   << May the Little SpaceFrog be with you ! >>
+ * -----------------------------------------------------------------------------
+ *
+ *
+ *
+ *
+ * :: HISTORY ::
+ *
+ * | release | date       |
+ * | 1.0.0   | 2010/10/10 | first release
+ * |         |            |
+ * |         |            |
+ * |         |            |
+ * |         |            |
+ * |         |            |
+ * |         |            |
+ *
+ */
+
+
+
+(
+  function($)
+  {
+    /*
+     * plugin 'public' functions
+     */
+    var publicMethods =
+    {
+      init : function (opt)
+        {
+          return this.each(function()
+            {
+              // default values for the plugin
+              var $this=$(this),
+                  data = $this.data('options'),
+                  objects = $this.data('objects'),
+                  properties = $this.data('properties'),
+                  options =
+                    {
+                      ignoreCase:true,
+                      //allowCreate:false,
+                      serverUrl:'plugins/GrumPluginClasses/gpc_ajax.php',
+                      serverCallDelay:250,
+
+                      listMaxWidth:0,
+                      listMaxHeight:0,
+                      maximumTagLoaded:0,  //0 = no limits
+
+                      textStart:'Start to type text...',
+                      textFound:'%s tags found',
+                      textDisplay:'display only %s tags',
+
+                      mode:'public',
+                      filter:'affected',
+
+                      inputNumCar:5,
+
+                      add:null,
+                      remove:null,
+                      popup:null,
+                      load:null
+                    };
+
+              // if options given, merge it
+              // if(opt) $.extend(options, opt); ==> options are set by setters
+
+              $this.data('options', options);
+
+
+              if(!properties)
+              {
+                $this.data('properties',
+                  {
+                    initialized:false,
+                    selectorVisible:false,
+                    totalTags:0,
+                    tags:[], // a tag = {id:0, name:''}
+                    cache:[],
+                    timerHandle:null,
+                  }
+                );
+                properties=$this.data('properties');
+              }
+
+              if(!objects)
+              {
+                objects =
+                  {
+                    container:$('<div/>',
+                        {
+                          'class':'ui-tag-selector-input',
+                          css:{
+                            width:'100%'
+                          }
+                        }
+                    ).bind('click.tagSelector',
+                        function ()
+                        {
+                          objects.input.focus();
+                        }
+                      ),
+                    selectedTagList:$('<ul/>',
+                      {
+                        html: '',
+                        'class':'ui-tag-selector-selected-tag-list',
+                      }
+                    ),
+                    input:$('<input>',
+                      {
+                        type:"text",
+                        value:''
+                      }
+                    ).bind('focusout.tagSelector',
+                        function ()
+                        {
+                          privateMethods.lostFocus($this);
+                        }
+                      )
+                      .bind('focus.tagSelector',
+                          function ()
+                          {
+                            privateMethods.getFocus($this);
+                          }
+                        )
+                      .bind('keypress.tagSelector',
+                          function ()
+                          {
+                            privateMethods.setTimerHandle($this);
+                          }
+                        ),
+                    selectorList:$('<div/>',
+                        {
+                          html: "",
+                          'class':'ui-tag-selector-list',
+                          css: {
+                            display:'none',
+                            position:'absolute',
+                            zIndex:9999,
+                          }
+                        }
+                    ).bind('mouseleave.tagSelector',
+                        function ()
+                        {
+                          privateMethods.displaySelector($this, false);
+                        }
+                      ),
+                    tagList:$('<ul/>',
+                      {
+                        css: {
+                          listStyle:'none',
+                          padding:'0px',
+                          margin:'0px',
+                          overflow:"auto",
+                        }
+                      }
+                    ),
+                    textArea:$('<div/>',
+                      {
+                        html:'',
+                        'class':'ui-tag-selector-text'
+                      }
+                    )
+                  };
+
+                $this
+                  .html('')
+                  .append(objects.container.append(objects.selectedTagList.append($('<li/>').append(objects.input) ) ) )
+                  .append(objects.selectorList.append(objects.tagList).append(objects.textArea));
+
+                $this.data('objects', objects);
+              }
+
+              privateMethods.setOptions($this, opt);
+            }
+          );
+        }, // init
+      destroy : function ()
+        {
+          return this.each(
+            function()
+            {
+              // default values for the plugin
+              var $this=$(this),
+                  objects = $this.data('objects');
+              objects.selectedTagList.children().unbind();
+              objects.input.unbind().remove();
+              objects.container.unbind().remove();
+              objects.selectorList.unbind().remove();
+              objects.tagList.remove();
+              $this
+                .unbind('.categorySelector')
+                .css(
+                  {
+                    width:'',
+                    height:''
+                  }
+                );
+            }
+          );
+        }, // destroy
+
+      options: function (value)
+        {
+          this.each(function()
+            {
+              var $this=$(this);
+              privateMethods.setOptions($this, value);
+              return($this);
+            }
+          );
+        }, // autoLoad
+
+
+      ignoreCase: function (value)
+        {
+          if(value)
+          {
+            this.each(function()
+              {
+                var $this=$(this);
+                privateMethods.setIgnoreCase($this, value);
+                return($this);
+              }
+            );
+          }
+          else
+          {
+            var options = this.data('options');
+
+            if(options)
+            {
+              return(options.ignoreCase);
+            }
+            else
+            {
+              return(true);
+            }
+          }
+        }, // ignoreCase
+
+      inputNumCar: function (value)
+        {
+          if(value)
+          {
+            this.each(function()
+              {
+                var $this=$(this);
+                privateMethods.setInputNumCar($this, value);
+                return($this);
+              }
+            );
+          }
+          else
+          {
+            var options = this.data('options');
+
+            if(options)
+            {
+              return(options.inputNumCar);
+            }
+            else
+            {
+              return(true);
+            }
+          }
+        }, // ignoreCase
+
+/*
+      allowCreate: function (value)
+        {
+          if(value)
+          {
+            this.each(function()
+              {
+                var $this=$(this);
+                privateMethods.setAllowCreate($this, value);
+                return($this);
+              }
+            );
+          }
+          else
+          {
+            var options = this.data('options');
+
+            if(options)
+            {
+              return(options.allowCreate);
+            }
+            else
+            {
+              return(false);
+            }
+          }
+        }, // allowCreate
+*/
+      maximumTagLoaded: function (value)
+        {
+          if(value)
+          {
+            this.each(function()
+              {
+                var $this=$(this);
+                privateMethods.setMaximumTagLoaded($this, value);
+                return($this);
+              }
+            );
+          }
+          else
+          {
+            var options = this.data('options');
+
+            if(options)
+            {
+              return(options.maximumTagLoaded);
+            }
+            else
+            {
+              return(0);
+            }
+          }
+        }, // maximumTagLoaded
+
+      listMaxWidth: function (value)
+        {
+          if(value)
+          {
+            this.each(function()
+              {
+                var $this=$(this);
+                privateMethods.setListMaxWidth($this, value);
+                return($this);
+              }
+            );
+          }
+          else
+          {
+            var options = this.data('options');
+
+            if(options)
+            {
+              return(options.listMaxWidth);
+            }
+            else
+            {
+              return(0);
+            }
+          }
+        }, // listMaxWidth
+
+      listMaxHeight: function (value)
+        {
+          if(value)
+          {
+            this.each(function()
+              {
+                var $this=$(this);
+                privateMethods.setListMaxHeight($this, value);
+                return($this);
+              }
+            );
+          }
+          else
+          {
+            var options = this.data('options');
+
+            if(options)
+            {
+              return(options.listMaxHeight);
+            }
+            else
+            {
+              return(0);
+            }
+          }
+        }, // listMaxHeight
+
+
+      serverCallDelay: function (value)
+        {
+          if(value)
+          {
+            this.each(function()
+              {
+                var $this=$(this);
+                privateMethods.setServerCallDelay($this, value);
+                return($this);
+              }
+            );
+          }
+          else
+          {
+            var options = this.data('options');
+
+            if(options)
+            {
+              return(options.serverCallDelay);
+            }
+            else
+            {
+              return(0);
+            }
+          }
+        }, // serverCallDelay
+
+
+      serverUrl: function (value)
+        {
+          if(value)
+          {
+            this.each(function()
+              {
+                var $this=$(this);
+                privateMethods.setServerUrl($this, value);
+                return($this);
+              }
+            );
+          }
+          else
+          {
+            var options = this.data('options');
+
+            if(options)
+            {
+              return(options.serverUrl);
+            }
+            else
+            {
+              return('');
+            }
+          }
+        }, // serverUrl
+
+      textStart: function (value)
+        {
+          if(value)
+          {
+            this.each(function()
+              {
+                var $this=$(this);
+                privateMethods.setTextStart($this, value);
+                return($this);
+              }
+            );
+          }
+          else
+          {
+            var options = this.data('options');
+
+            if(options)
+            {
+              return(options.textStart);
+            }
+            else
+            {
+              return('');
+            }
+          }
+        }, // textStart
+
+      textFound: function (value)
+        {
+          if(value)
+          {
+            this.each(function()
+              {
+                var $this=$(this);
+                privateMethods.setTextFound($this, value);
+                return($this);
+              }
+            );
+          }
+          else
+          {
+            var options = this.data('options');
+
+            if(options)
+            {
+              return(options.textFound);
+            }
+            else
+            {
+              return('');
+            }
+          }
+        }, // textFound
+
+      textDisplay: function (value)
+        {
+          if(value)
+          {
+            this.each(function()
+              {
+                var $this=$(this);
+                privateMethods.setTextDisplay($this, value);
+                return($this);
+              }
+            );
+          }
+          else
+          {
+            var options = this.data('options');
+
+            if(options)
+            {
+              return(options.textDisplay);
+            }
+            else
+            {
+              return('');
+            }
+          }
+        }, // textDisplay
+
+      filter: function (value)
+        {
+          if(value)
+          {
+            this.each(function()
+              {
+                var $this=$(this);
+                privateMethods.setFilter($this, value);
+                return($this);
+              }
+            );
+          }
+          else
+          {
+            var options = this.data('options');
+
+            if(options)
+            {
+              return(options.filter);
+            }
+            else
+            {
+              return(true);
+            }
+          }
+        }, // filter
+
+      mode: function (value)
+        {
+          if(value)
+          {
+            this.each(function()
+              {
+                var $this=$(this);
+                privateMethods.setMode($this, value);
+                return($this);
+              }
+            );
+          }
+          else
+          {
+            var options = this.data('options');
+
+            if(options)
+            {
+              return(options.mode);
+            }
+            else
+            {
+              return(true);
+            }
+          }
+        }, // mode
+
+      value: function (value)
+        {
+          if(value)
+          {
+            // set selected value
+            return this.each(function()
+              {
+                privateMethods.setValue($(this), value);
+              }
+            );
+          }
+          else
+          {
+            // return the selected tags
+            var properties=this.data('properties');
+            return(properties.tags);
+          }
+        }, // value
+
+      load: function (value)
+        {
+          /*
+           * two functionnalities :
+           *  - if value is set, use it to set the load event function
+           *  - if no value, loads data from server
+           */
+          if(value && $.isFunction(value))
+          {
+            // set selected value
+            this.each(function()
+              {
+                var $this=$(this);
+                privateMethods.setEventLoad($this, value);
+                return($this);
+              }
+            );
+          }
+          else
+          {
+            // loads data from server
+            privateMethods.load(this);
+          }
+        },
+
+      popup: function (value)
+        {
+          if(value && $.isFunction(value))
+          {
+            // set selected value
+            this.each(function()
+              {
+                var $this=$(this);
+                privateMethods.setEventPopup($this, value);
+                return($this);
+              }
+            );
+          }
+          else
+          {
+            // return the selected value
+            var options=this.data('options');
+
+            if(options)
+            {
+              return(options.popup);
+            }
+            else
+            {
+              return(null);
+            }
+          }
+        }, // popup
+      add: function (value)
+        {
+          if(value && $.isFunction(value))
+          {
+            // set selected value
+            this.each(function()
+              {
+                var $this=$(this);
+                privateMethods.setEventAdd($this, value);
+                return($this);
+              }
+            );
+          }
+          else
+          {
+            // return the selected value
+            var options=this.data('options');
+
+            if(options)
+            {
+              return(options.add);
+            }
+            else
+            {
+              return(null);
+            }
+          }
+        }, // add
+      remove: function (value)
+        {
+          if(value && $.isFunction(value))
+          {
+            // set selected value
+            this.each(function()
+              {
+                var $this=$(this);
+                privateMethods.setEventRemove($this, value);
+                return($this);
+              }
+            );
+          }
+          else
+          {
+            // return the selected value
+            var options=this.data('options');
+
+            if(options)
+            {
+              return(options.remove);
+            }
+            else
+            {
+              return(null);
+            }
+          }
+        }, // remove
+      numberOfTags: function ()
+        {
+          var properties=this.data('properties');
+
+          if(properties)
+          {
+            return(properties.tags.length);
+          }
+          else
+          {
+            return(null);
+          }
+        } // numberOfTags
+
+    }; // methods
+
+
+    /*
+     * plugin 'private' methods
+     */
+    var privateMethods =
+    {
+      setOptions : function (object, value)
+        {
+          var properties=object.data('properties'),
+              options=object.data('options');
+
+          if(!$.isPlainObject(value)) return(false);
+
+          properties.initialized=false;
+
+          privateMethods.setIgnoreCase(object, (value.ignoreCase!=null)?value.ignoreCase:options.ignoreCase);
+          privateMethods.setInputNumCar(object, (value.inputNumCar!=null)?value.inputNumCar:options.inputNumCar);
+          //privateMethods.setAllowCreate(object, (value.allowCreate!=null)?value.allowCreate:options.allowCreate);
+          privateMethods.setValue(object, (value.value!=null)?value.value:[]);
+          privateMethods.setMaximumTagLoaded(object, (value.maximumTagLoaded!=null)?value.maximumTagLoaded:options.maximumTagLoaded);
+          privateMethods.setTextStart(object, (value.textStart!=null)?value.textStart:options.textStart);
+          privateMethods.setTextFound(object, (value.textFound!=null)?value.textFound:options.textFound);
+          privateMethods.setTextDisplay(object, (value.textDisplay!=null)?value.textDisplay:options.textDisplay);
+          privateMethods.setListMaxWidth(object, (value.listMaxWidth!=null)?value.listMaxWidth:options.listMaxWidth);
+          privateMethods.setListMaxHeight(object, (value.listMaxHeight!=null)?value.listMaxHeight:options.listMaxHeight);
+          privateMethods.setServerCallDelay(object, (value.serverCallDelay!=null)?value.serverCallDelay:options.serverCallDelay);
+          privateMethods.setServerUrl(object, (value.serverUrl!=null)?value.serverUrl:options.serverUrl);
+          privateMethods.setMode(object, (value.mode!=null)?value.mode:options.mode);
+          privateMethods.setFilter(object, (value.filter!=null)?value.filter:options.filter);
+          privateMethods.setEventPopup(object, (value.popup!=null)?value.popup:options.popup);
+          privateMethods.setEventAdd(object, (value.add!=null)?value.add:options.add);
+          privateMethods.setEventRemove(object, (value.remove!=null)?value.remove:options.remove);
+          privateMethods.setEventLoad(object, (value.load!=null)?value.load:options.load);
+
+          if(options.autoLoad) privateMethods.load(object);
+
+          properties.initialized=true;
+        },
+
+      setIgnoreCase : function (object, value)
+        {
+          var options=object.data('options'),
+              properties=object.data('properties');
+          if((!properties.initialized || options.ignoreCase!=value) && (value==true || value==false))
+          {
+            options.ignoreCase=value;
+          }
+          return(options.ignoreCase);
+        },
+
+      setInputNumCar : function (object, value)
+        {
+          var options=object.data('options'),
+              objects=object.data('objects'),
+              properties=object.data('properties');
+          if((!properties.initialized || options.inputNumCar!=value) && value>0)
+          {
+            options.inputNumCar=value;
+            objects.input.attr('size', options.inputNumCar);
+          }
+          return(options.inputNumCar);
+        },
+
+/*
+      setAllowCreate : function (object, value)
+        {
+          var options=object.data('options'),
+              properties=object.data('properties');
+          if((!properties.initialized || options.allowCreate!=value) && (value==true || value==false))
+          {
+            options.allowCreate=value;
+          }
+          return(options.allowCreate);
+        },
+*/
+
+      setMaximumTagLoaded : function (object, value)
+        {
+          var options=object.data('options'),
+              properties=object.data('properties');
+          if((!properties.initialized || options.setMaximumTagLoaded!=value) && value>=0)
+          {
+            options.maximumTagLoaded=value;
+          }
+          return(options.maximumTagLoaded);
+        },
+
+
+      setTextStart : function (object, value)
+        {
+          var options=object.data('options'),
+              properties=object.data('properties');
+          if(!properties.initialized || options.textStart!=value)
+          {
+            options.textStart=value;
+          }
+          return(options.textStart);
+        },
+
+      setTextFound : function (object, value)
+        {
+          var options=object.data('options'),
+              properties=object.data('properties');
+          if(!properties.initialized || options.textFound!=value)
+          {
+            options.textFound=value;
+          }
+          return(options.textFound);
+        },
+
+      setTextDisplay : function (object, value)
+        {
+          var options=object.data('options'),
+              properties=object.data('properties');
+          if(!properties.initialized || options.textDisplay!=value)
+          {
+            options.textDisplay=value;
+          }
+          return(options.textDisplay);
+        },
+
+      setListMaxWidth : function (object, value)
+        {
+          var options=object.data('options'),
+              properties=object.data('properties'),
+              objects=object.data('objects');
+          if((!properties.initialized || options.listMaxWidth!=value) && value>=0)
+          {
+            options.listMaxWidth=value;
+            if(options.listMaxWidth>0)
+            {
+              objects.selectorList.css('max-width', options.listMaxWidth+'px');
+            }
+            else
+            {
+              objects.selectorList.css('max-width', '');
+            }
+          }
+          return(options.listMaxWidth);
+        },
+
+      setListMaxHeight : function (object, value)
+        {
+          var options=object.data('options'),
+              properties=object.data('properties'),
+              objects=object.data('objects');
+          if((!properties.initialized || options.listMaxHeight!=value) && value>=0)
+          {
+            options.listMaxHeight=value;
+            if(options.listMaxHeight>0)
+            {
+              objects.tagList.css('max-height', options.listMaxHeight+'px');
+            }
+            else
+            {
+              objects.tagList.css('max-height', '');
+            }
+          }
+          return(options.listMaxHeight);
+        },
+
+      setServerCallDelay : function (object, value)
+        {
+          var options=object.data('options'),
+              properties=object.data('properties');
+          if((!properties.initialized || options.serverCallDelay!=value) && value>0 )
+          {
+            options.serverCallDelay=value;
+          }
+          return(options.serverCallDelay);
+        },
+
+      setServerUrl : function (object, value)
+        {
+          var options=object.data('options'),
+              properties=object.data('properties');
+          if(!properties.initialized || options.serverUrl!=value)
+          {
+            options.serverUrl=value;
+            if(options.autoLoad && properties.initialized) privateMethods.load(object);
+          }
+          return(options.serverUrl);
+        },
+
+
+      setMode : function (object, value)
+        {
+          var options=object.data('options'),
+              properties=object.data('properties');
+          if((!properties.initialized || options.mode!=value) && (value=='admin' || value=='public'))
+          {
+            options.mode=value;
+          }
+          return(options.mode);
+        },
+
+      setFilter : function (object, value)
+        {
+          var options=object.data('options'),
+              properties=object.data('properties');
+          if((!properties.initialized || options.filter!=value) && (value=='all' || value=='affected'))
+          {
+            options.filter=value;
+          }
+          return(options.filter);
+        },
+
+
+      setValue : function (object, value)
+        {
+          var options=object.data('options'),
+              properties=object.data('properties'),
+              objects=object.data('objects');
+
+          if(value=='clear')
+          {
+            properties.tags=[];
+            objects.selectedTagList.children('.ui-tag-selector-selected-tag').remove();
+          }
+          else
+          {
+            if(!$.isArray(value))
+            {
+              value=[value]; //works with array only
+            }
+
+            for(var i=0;i<value.length;i++)
+            {
+              if(value[i].id!=null && value[i].name!=null)
+              {
+                // remove tag if present, otherwise add it
+                if(privateMethods.removeTag(object, value[i].id)==-1) privateMethods.addTag(object, value[i].id, value[i].name);
+              }
+              else
+              {
+                //not an object, consider it's a tag id to be removed
+                privateMethods.removeTag(object, value[i]);
+              }
+            }
+          }
+
+          return(null);
+        }, //setValue
+
+
+      displaySelector : function (object, value)
+        {
+          var options=object.data('options'),
+              properties=object.data('properties'),
+              objects=object.data('objects'),
+              popup=false;
+
+          if(properties.selectorVisible!=value) popup=true;;
+
+          properties.selectorVisible=value;
+
+          if(properties.selectorVisible)
+          {
+            if(properties.cache.length>0)
+            {
+              objects.tagList.css('display', 'block');
+              if(properties.cache.length<properties.totalTags)
+              {
+                objects.textArea.html(
+                  options.textFound.replace('%s', properties.totalTags)+', '+
+                  options.textDisplay.replace('%s', properties.cache.length)
+                ).css('display', 'block');
+              }
+              else
+              {
+                objects.textArea.html(options.textFound.replace('%s', properties.cache.length)).css('display', 'block');
+              }
+            }
+            else if(options.textStart!='')
+            {
+              objects.tagList.css('display', 'none');
+              objects.textArea.html(options.textStart).css('display', 'block');
+            }
+            else
+            {
+              objects.textArea.html('').css('display', 'none');
+            }
+
+            objects.selectorList
+              .css(
+                {
+                  display:'block',
+                  'min-width':objects.selectorList.parent().css('width')
+                }
+              );
+          }
+          else
+          {
+            objects.selectorList.css('display', 'none');
+          }
+
+          if(options.popup && popup) object.trigger('tagSelectorPopup', [properties.selectorVisible]);
+
+          return(properties.selectorVisible);
+        }, //displaySelector
+
+      load : function (object)
+        {
+          // load datas from server through an asynchronous ajax call
+          var options=object.data('options'),
+              properties=object.data('properties'),
+              objects=object.data('objects');
+
+          privateMethods.clearTimerHandle(object);
+
+          $.ajax(
+            {
+              type: "POST",
+              url: options.serverUrl,
+              data: {
+                ajaxfct:options.mode+'.tagSelector.get',
+                filter:options.filter,
+                maxTags:options.maximumTagLoaded,
+                ignoreCase:options.ignoreCase,
+                letters:objects.input.val()
+              },
+              async: true,
+              success: function(msg)
+                {
+                  list=$.parseJSON(msg);
+
+                  properties.totalTags=list.totalNbTags;
+                  privateMethods.cacheClear(object);
+                  privateMethods.cacheAddItems(object, list.tags);
+                  if(options.load) object.trigger('tagSelectorLoad');
+
+                  privateMethods.displaySelector(object, true);
+                },
+              error: function(msg)
+                {
+                  objects.selectorList.html('Error ! '+msg);
+                },
+            }
+         );
+        },
+
+      cacheClear : function (object)
+        {
+          // clear the cache tag list
+          var objects=object.data('objects'),
+              options=object.data('options'),
+              properties=object.data('properties');
+
+          objects.tagList.children().unbind().remove();
+          properties.cache=[];
+        },
+      cacheAddItems : function (object, listItems)
+        {
+          // add the items to the cache list
+          var options=object.data('options'),
+              properties=object.data('properties'),
+              objects=object.data('objects');
+
+          for(var i=0;i<listItems.length;i++)
+          {
+            properties.cache.push(
+              {
+                id:listItems[i].id,
+                name:listItems[i].name,
+              }
+            );
+
+            if(options.ignoreCase)
+            {
+              var re=new RegExp('(.*)('+objects.input.val()+')(.*)', 'i');
+            }
+            else
+            {
+              var re=new RegExp('(.*)('+objects.input.val()+')(.*)');
+            }
+            tmpResult=re.exec(listItems[i].name);
+            if(tmpResult!=null)
+            {
+              tmpResult=tmpResult[1]+'<span class="ui-tag-selector-highlight">'+tmpResult[2]+'</span>'+tmpResult[3];
+            }
+            else
+            {
+              tmpResult=listItems[i].name;
+            }
+
+            var li=$('<li/>',
+                      {
+                        html:tmpResult,
+                        value:listItems[i].id,
+                        'class':'ui-tag-selector-list-item'
+                      }
+                    ).bind('mousedown.tagSelector',
+                          {object:object},
+                          function (event)
+                          {
+                            privateMethods.addTag(event.data.object, $(this).attr('value'), $(this).text());
+                          }
+                      );
+            objects.tagList.append(li);
+          }
+        },
+
+      addTag : function (object, id, name)
+        {
+          var options=object.data('options'),
+              properties=object.data('properties'),
+              objects=object.data('objects');
+
+          if(privateMethods.findTagById(object, id)==-1)
+          {
+            //add only if not already selected..
+            properties.tags.push({id:id, name:name});
+
+            var li=$('<li/>',
+                      {
+                        value:id,
+                        html:name,
+                        'class':'ui-tag-selector-selected-tag'
+                      }
+                    ).prepend(
+                      $('<span/>',
+                        {
+                          html:'x'
+                        }
+                       ).bind('click.tagSelector',
+                          {object:object},
+                          function (event)
+                          {
+                            privateMethods.removeTag(event.data.object, $(this).parent().attr('value'));
+                          }
+                        )
+                      );
+            objects.input.val('').parent().before(li);
+            if(options.add) object.trigger('tagSelectorAdd', id);
+          }
+        },
+
+      removeTag : function (object, id)
+        {
+          var options=object.data('options'),
+              properties=object.data('properties'),
+              objects=object.data('objects');
+
+          var index=privateMethods.findTagById(object, id);
+          if(index>-1)
+          {
+            properties.tags.splice(index,1);
+            item=objects.selectedTagList.children('[value='+id+']').remove();
+
+            if(options.remove) object.trigger('tagSelectorRemove', id);
+          }
+          return(index);
+        },
+
+      findTagById : function (object, value)
+        {
+          var properties=object.data('properties');
+
+          for(var i=0;i<properties.tags.length;i++)
+          {
+            if(properties.tags[i].id==value) return(i);
+          }
+          return(-1);
+        },
+
+      getFocus : function (object)
+        {
+          privateMethods.displaySelector(object, true);
+        },
+
+      lostFocus : function (object)
+        {
+          privateMethods.displaySelector(object, false);
+        },
+
+      setEventPopup : function (object, value)
+        {
+          var options=object.data('options');
+          options.popup=value;
+          object.unbind('tagSelectorPopup');
+          if(value) object.bind('tagSelectorPopup', options.popup);
+          return(options.popup);
+        },
+      setEventAdd : function (object, value)
+        {
+          var options=object.data('options');
+          options.add=value;
+          object.unbind('tagSelectorAdd');
+          if(value) object.bind('tagSelectorAdd', options.add);
+          return(options.add);
+        },
+      setEventRemove : function (object, value)
+        {
+          var options=object.data('options');
+          options.remove=value;
+          object.unbind('tagSelectorRemove');
+          if(value) object.bind('tagSelectorRemove', options.remove);
+          return(options.remove);
+        },
+      setEventLoad : function (object, value)
+        {
+          var options=object.data('options');
+          options.load=value;
+          object.unbind('categorySelectorLoad');
+          if(value) object.bind('tagSelectorLoad', options.load);
+          return(options.load);
+        },
+
+      clearTimerHandle : function(object)
+        {
+          var properties=object.data('properties');
+
+          if(properties.timerHandle!=null)
+          {
+            window.clearInterval(properties.timerHandle);
+            properties.timerHandle=null;
+          }
+        },
+      setTimerHandle : function(object)
+        {
+          var properties=object.data('properties'),
+              options=object.data('options');
+
+          privateMethods.clearTimerHandle(object);
+          properties.timerHandle=window.setInterval(function () { privateMethods.load(object); }, options.serverCallDelay);
+        },
+    };
+
+
+    $.fn.tagSelector = function(method)
+    {
+      if(publicMethods[method])
+      {
+        return publicMethods[method].apply( this, Array.prototype.slice.call( arguments, 1 ));
+      }
+      else if(typeof method === 'object' || ! method)
+      {
+        return publicMethods.init.apply(this, arguments);
+      }
+      else
+      {
+        $.error( 'Method ' +  method + ' does not exist on jQuery.tagSelector' );
+      }
+    } // $.fn.tagSelector
+
+  }
+)(jQuery);
+
+
Index: /extensions/GrumPluginClasses/js/ui.tagSelector.packed.js
===================================================================
--- /extensions/GrumPluginClasses/js/ui.tagSelector.packed.js	(revision 7349)
+++ /extensions/GrumPluginClasses/js/ui.tagSelector.packed.js	(revision 7349)
@@ -0,0 +1,2 @@
+/* file: ui.tagSelector.js - v1.0.0 | packed on 2010/10/20 with http://joliclic.free.fr/php/javascript-packer/ */
+eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('(b($){e 1j={2c:b(2i){c 8.k(b(){e $8=$(8),a=$8.a(\'4\'),f=$8.a(\'f\'),9=$8.a(\'9\'),4={t:C,I:\'2y/2u/2t.2v\',M:2w,D:0,E:0,R:0,z:\'2m 2o 1s 1l...\',B:\'%s A 2p\',K:\'N 2q %s A\',F:\'20\',v:\'1Z\',J:5,H:j,l:j,q:j,p:j};$8.a(\'4\',4);d(!9){$8.a(\'9\',{o:V,13:V,1i:0,A:[],11:[],1b:j,});9=$8.a(\'9\')}d(!f){f={1q:$(\'<1p/>\',{\'Y\':\'U-u-S-w\',m:{15:\'2x%\'}}).y(\'21.L\',b(){f.w.28()}),17:$(\'<26/>\',{r:\'\',\'Y\':\'U-u-S-1L-u-12\',}),w:$(\'<w>\',{1s:"1l",6:\'\'}).y(\'2z.L\',b(){g.24($8)}).y(\'28.L\',b(){g.2e($8)}).y(\'2H.L\',b(){g.23($8)}),P:$(\'<1p/>\',{r:"",\'Y\':\'U-u-S-12\',m:{N:\'19\',2L:\'2F\',2C:2D,}}).y(\'2B.L\',b(){g.1a($8,V)}),Q:$(\'<26/>\',{m:{2n:\'19\',2r:\'2l\',2J:\'2l\',2M:"2G",}}),14:$(\'<1p/>\',{r:\'\',\'Y\':\'U-u-S-1l\'})};$8.r(\'\').W(f.1q.W(f.17.W($(\'<Z/>\').W(f.w)))).W(f.P.W(f.Q).W(f.14));$8.a(\'f\',f)}g.1t($8,2i)})},2A:b(){c 8.k(b(){e $8=$(8),f=$8.a(\'f\');f.17.1k().G();f.w.G().l();f.1q.G().l();f.P.G().l();f.Q.l();$8.G(\'.2s\').m({15:\'\',1y:\'\'})})},4:b(6){8.k(b(){e $8=$(8);g.1t($8,6);c($8)})},t:b(6){d(6){8.k(b(){e $8=$(8);g.1r($8,6);c($8)})}h{e 4=8.a(\'4\');d(4){c(4.t)}h{c(C)}}},J:b(6){d(6){8.k(b(){e $8=$(8);g.1x($8,6);c($8)})}h{e 4=8.a(\'4\');d(4){c(4.J)}h{c(C)}}},R:b(6){d(6){8.k(b(){e $8=$(8);g.1f($8,6);c($8)})}h{e 4=8.a(\'4\');d(4){c(4.R)}h{c(0)}}},D:b(6){d(6){8.k(b(){e $8=$(8);g.1P($8,6);c($8)})}h{e 4=8.a(\'4\');d(4){c(4.D)}h{c(0)}}},E:b(6){d(6){8.k(b(){e $8=$(8);g.1v($8,6);c($8)})}h{e 4=8.a(\'4\');d(4){c(4.E)}h{c(0)}}},M:b(6){d(6){8.k(b(){e $8=$(8);g.1V($8,6);c($8)})}h{e 4=8.a(\'4\');d(4){c(4.M)}h{c(0)}}},I:b(6){d(6){8.k(b(){e $8=$(8);g.1T($8,6);c($8)})}h{e 4=8.a(\'4\');d(4){c(4.I)}h{c(\'\')}}},z:b(6){d(6){8.k(b(){e $8=$(8);g.1S($8,6);c($8)})}h{e 4=8.a(\'4\');d(4){c(4.z)}h{c(\'\')}}},B:b(6){d(6){8.k(b(){e $8=$(8);g.1I($8,6);c($8)})}h{e 4=8.a(\'4\');d(4){c(4.B)}h{c(\'\')}}},K:b(6){d(6){8.k(b(){e $8=$(8);g.1K($8,6);c($8)})}h{e 4=8.a(\'4\');d(4){c(4.K)}h{c(\'\')}}},v:b(6){d(6){8.k(b(){e $8=$(8);g.1J($8,6);c($8)})}h{e 4=8.a(\'4\');d(4){c(4.v)}h{c(C)}}},F:b(6){d(6){8.k(b(){e $8=$(8);g.1A($8,6);c($8)})}h{e 4=8.a(\'4\');d(4){c(4.F)}h{c(C)}}},6:b(6){d(6){c 8.k(b(){g.1H($(8),6)})}h{e 9=8.a(\'9\');c(9.A)}},p:b(6){d(6&&$.1d(6)){8.k(b(){e $8=$(8);g.1E($8,6);c($8)})}h{g.p(8)}},q:b(6){d(6&&$.1d(6)){8.k(b(){e $8=$(8);g.1R($8,6);c($8)})}h{e 4=8.a(\'4\');d(4){c(4.q)}h{c(j)}}},H:b(6){d(6&&$.1d(6)){8.k(b(){e $8=$(8);g.1D($8,6);c($8)})}h{e 4=8.a(\'4\');d(4){c(4.H)}h{c(j)}}},l:b(6){d(6&&$.1d(6)){8.k(b(){e $8=$(8);g.1B($8,6);c($8)})}h{e 4=8.a(\'4\');d(4){c(4.l)}h{c(j)}}},2K:b(){e 9=8.a(\'9\');d(9){c(9.A.X)}h{c(j)}}};e g={1t:b(7,6){e 9=7.a(\'9\'),4=7.a(\'4\');d(!$.2I(6))c(V);9.o=V;g.1r(7,(6.t!=j)?6.t:4.t);g.1x(7,(6.J!=j)?6.J:4.J);g.1H(7,(6.6!=j)?6.6:[]);g.1f(7,(6.R!=j)?6.R:4.R);g.1S(7,(6.z!=j)?6.z:4.z);g.1I(7,(6.B!=j)?6.B:4.B);g.1K(7,(6.K!=j)?6.K:4.K);g.1P(7,(6.D!=j)?6.D:4.D);g.1v(7,(6.E!=j)?6.E:4.E);g.1V(7,(6.M!=j)?6.M:4.M);g.1T(7,(6.I!=j)?6.I:4.I);g.1A(7,(6.F!=j)?6.F:4.F);g.1J(7,(6.v!=j)?6.v:4.v);g.1R(7,(6.q!=j)?6.q:4.q);g.1D(7,(6.H!=j)?6.H:4.H);g.1B(7,(6.l!=j)?6.l:4.l);g.1E(7,(6.p!=j)?6.p:4.p);d(4.1Y)g.p(7);9.o=C},1r:b(7,6){e 4=7.a(\'4\'),9=7.a(\'9\');d((!9.o||4.t!=6)&&(6==C||6==V)){4.t=6}c(4.t)},1x:b(7,6){e 4=7.a(\'4\'),f=7.a(\'f\'),9=7.a(\'9\');d((!9.o||4.J!=6)&&6>0){4.J=6;f.w.1O(\'2E\',4.J)}c(4.J)},1f:b(7,6){e 4=7.a(\'4\'),9=7.a(\'9\');d((!9.o||4.1f!=6)&&6>=0){4.R=6}c(4.R)},1S:b(7,6){e 4=7.a(\'4\'),9=7.a(\'9\');d(!9.o||4.z!=6){4.z=6}c(4.z)},1I:b(7,6){e 4=7.a(\'4\'),9=7.a(\'9\');d(!9.o||4.B!=6){4.B=6}c(4.B)},1K:b(7,6){e 4=7.a(\'4\'),9=7.a(\'9\');d(!9.o||4.K!=6){4.K=6}c(4.K)},1P:b(7,6){e 4=7.a(\'4\'),9=7.a(\'9\'),f=7.a(\'f\');d((!9.o||4.D!=6)&&6>=0){4.D=6;d(4.D>0){f.P.m(\'1n-15\',4.D+\'1X\')}h{f.P.m(\'1n-15\',\'\')}}c(4.D)},1v:b(7,6){e 4=7.a(\'4\'),9=7.a(\'9\'),f=7.a(\'f\');d((!9.o||4.E!=6)&&6>=0){4.E=6;d(4.E>0){f.Q.m(\'1n-1y\',4.E+\'1X\')}h{f.Q.m(\'1n-1y\',\'\')}}c(4.E)},1V:b(7,6){e 4=7.a(\'4\'),9=7.a(\'9\');d((!9.o||4.M!=6)&&6>0){4.M=6}c(4.M)},1T:b(7,6){e 4=7.a(\'4\'),9=7.a(\'9\');d(!9.o||4.I!=6){4.I=6;d(4.1Y&&9.o)g.p(7)}c(4.I)},1A:b(7,6){e 4=7.a(\'4\'),9=7.a(\'9\');d((!9.o||4.F!=6)&&(6==\'35\'||6==\'20\')){4.F=6}c(4.F)},1J:b(7,6){e 4=7.a(\'4\'),9=7.a(\'9\');d((!9.o||4.v!=6)&&(6==\'3d\'||6==\'1Z\')){4.v=6}c(4.v)},1H:b(7,6){e 4=7.a(\'4\'),9=7.a(\'9\'),f=7.a(\'f\');d(6==\'3e\'){9.A=[];f.17.1k(\'.U-u-S-1L-u\').l()}h{d(!$.3f(6)){6=[6]}1W(e i=0;i<6.X;i++){d(6[i].n!=j&&6[i].O!=j){d(g.1e(7,6[i].n)==-1)g.1w(7,6[i].n,6[i].O)}h{g.1e(7,6[i])}}}c(j)},1a:b(7,6){e 4=7.a(\'4\'),9=7.a(\'9\'),f=7.a(\'f\'),q=V;d(9.13!=6)q=C;9.13=6;d(9.13){d(9.11.X>0){f.Q.m(\'N\',\'18\');d(9.11.X<9.1i){f.14.r(4.B.1F(\'%s\',9.1i)+\', \'+4.K.1F(\'%s\',9.11.X)).m(\'N\',\'18\')}h{f.14.r(4.B.1F(\'%s\',9.11.X)).m(\'N\',\'18\')}}h d(4.z!=\'\'){f.Q.m(\'N\',\'19\');f.14.r(4.z).m(\'N\',\'18\')}h{f.14.r(\'\').m(\'N\',\'19\')}f.P.m({N:\'18\',\'3c-15\':f.P.1N().m(\'15\')})}h{f.P.m(\'N\',\'19\')}d(4.q&&q)7.1h(\'1M\',[9.13]);c(9.13)},p:b(7){e 4=7.a(\'4\'),9=7.a(\'9\'),f=7.a(\'f\');g.1G(7);$.3b({1s:"37",38:4.I,a:{39:4.F+\'.L.3a\',v:4.v,3h:4.R,t:4.t,3g:f.w.1c()},3l:C,3n:b(1g){12=$.3m(1g);9.1i=12.3i;g.2h(7);g.2g(7,12.A);d(4.p)7.1h(\'22\');g.1a(7,C)},29:b(1g){f.P.r(\'3j ! \'+1g)},})},2h:b(7){e f=7.a(\'f\'),4=7.a(\'4\'),9=7.a(\'9\');f.Q.1k().G().l();9.11=[]},2g:b(7,10){e 4=7.a(\'4\'),9=7.a(\'9\'),f=7.a(\'f\');1W(e i=0;i<10.X;i++){9.11.2d({n:10[i].n,O:10[i].O,});d(4.t){e 1u=2f 2k(\'(.*)(\'+f.w.1c()+\')(.*)\',\'i\')}h{e 1u=2f 2k(\'(.*)(\'+f.w.1c()+\')(.*)\')}T=1u.3k(10[i].O);d(T!=j){T=T[1]+\'<1Q Y="U-u-S-2N">\'+T[2]+\'</1Q>\'+T[3]}h{T=10[i].O}e Z=$(\'<Z/>\',{r:T,6:10[i].n,\'Y\':\'U-u-S-12-25\'}).y(\'36.L\',{7:7},b(1m){g.1w(1m.a.7,$(8).1O(\'6\'),$(8).1l())});f.Q.W(Z)}},1w:b(7,n,O){e 4=7.a(\'4\'),9=7.a(\'9\'),f=7.a(\'f\');d(g.1U(7,n)==-1){9.A.2d({n:n,O:O});e Z=$(\'<Z/>\',{6:n,r:O,\'Y\':\'U-u-S-1L-u\'}).2T($(\'<1Q/>\',{r:\'x\'}).y(\'21.L\',{7:7},b(1m){g.1e(1m.a.7,$(8).1N().1O(\'6\'))}));f.w.1c(\'\').1N().2U(Z);d(4.H)7.1h(\'1C\',n)}},1e:b(7,n){e 4=7.a(\'4\'),9=7.a(\'9\'),f=7.a(\'f\');e 1o=g.1U(7,n);d(1o>-1){9.A.2V(1o,1);25=f.17.1k(\'[6=\'+n+\']\').l();d(4.l)7.1h(\'1z\',n)}c(1o)},1U:b(7,6){e 9=7.a(\'9\');1W(e i=0;i<9.A.X;i++){d(9.A[i].n==6)c(i)}c(-1)},2e:b(7){g.1a(7,C)},24:b(7){g.1a(7,V)},1R:b(7,6){e 4=7.a(\'4\');4.q=6;7.G(\'1M\');d(6)7.y(\'1M\',4.q);c(4.q)},1D:b(7,6){e 4=7.a(\'4\');4.H=6;7.G(\'1C\');d(6)7.y(\'1C\',4.H);c(4.H)},1B:b(7,6){e 4=7.a(\'4\');4.l=6;7.G(\'1z\');d(6)7.y(\'1z\',4.l);c(4.l)},1E:b(7,6){e 4=7.a(\'4\');4.p=6;7.G(\'2S\');d(6)7.y(\'22\',4.p);c(4.p)},1G:b(7){e 9=7.a(\'9\');d(9.1b!=j){27.2R(9.1b);9.1b=j}},23:b(7){e 9=7.a(\'9\'),4=7.a(\'4\');g.1G(7);9.1b=27.2O(b(){g.p(7)},4.M)},};$.2P.L=b(16){d(1j[16]){c 1j[16].2b(8,2Q.2W.2X.33(2a,1))}h d(34 16===\'7\'||!16){c 1j.2c.2b(8,2a)}h{$.29(\'32 \'+16+\' 31 2Y 2Z 30 2j.L\')}}})(2j);',62,210,'||||options||value|object|this|properties|data|function|return|if|var|objects|privateMethods|else||null|each|remove|css|id|initialized|load|popup|html||ignoreCase|tag|filter|input||bind|textStart|tags|textFound|true|listMaxWidth|listMaxHeight|mode|unbind|add|serverUrl|inputNumCar|textDisplay|tagSelector|serverCallDelay|display|name|selectorList|tagList|maximumTagLoaded|selector|tmpResult|ui|false|append|length|class|li|listItems|cache|list|selectorVisible|textArea|width|method|selectedTagList|block|none|displaySelector|timerHandle|val|isFunction|removeTag|setMaximumTagLoaded|msg|trigger|totalTags|publicMethods|children|text|event|max|index|div|container|setIgnoreCase|type|setOptions|re|setListMaxHeight|addTag|setInputNumCar|height|tagSelectorRemove|setMode|setEventRemove|tagSelectorAdd|setEventAdd|setEventLoad|replace|clearTimerHandle|setValue|setTextFound|setFilter|setTextDisplay|selected|tagSelectorPopup|parent|attr|setListMaxWidth|span|setEventPopup|setTextStart|setServerUrl|findTagById|setServerCallDelay|for|px|autoLoad|affected|public|click|tagSelectorLoad|setTimerHandle|lostFocus|item|ul|window|focus|error|arguments|apply|init|push|getFocus|new|cacheAddItems|cacheClear|opt|jQuery|RegExp|0px|Start|listStyle|to|found|only|padding|categorySelector|gpc_ajax|GrumPluginClasses|php|250|100|plugins|focusout|destroy|mouseleave|zIndex|9999|size|absolute|auto|keypress|isPlainObject|margin|numberOfTags|position|overflow|highlight|setInterval|fn|Array|clearInterval|categorySelectorLoad|prepend|before|splice|prototype|slice|not|exist|on|does|Method|call|typeof|admin|mousedown|POST|url|ajaxfct|get|ajax|min|all|clear|isArray|letters|maxTags|totalNbTags|Error|exec|async|parseJSON|success'.split('|'),0,{}))
Index: /extensions/GrumPluginClasses/main.inc.php
===================================================================
--- /extensions/GrumPluginClasses/main.inc.php	(revision 7348)
+++ /extensions/GrumPluginClasses/main.inc.php	(revision 7349)
@@ -85,4 +85,9 @@
 |         |            |   and templates
 |         |            |
+|         |            | * Add the jQuery plugins
+|         |            |   . ui.tagSelector.js + ui.tagSelector.packed.js
+|         |            |
+|         |            |
+|         |            |
 |         |            |
 |         |            | ===== Don't forget to update the plugin version ! =====
Index: /extensions/GrumPluginClasses/templates/GPCRequestBuilder_search.tpl
===================================================================
--- /extensions/GrumPluginClasses/templates/GPCRequestBuilder_search.tpl	(revision 7348)
+++ /extensions/GrumPluginClasses/templates/GPCRequestBuilder_search.tpl	(revision 7349)
@@ -376,4 +376,6 @@
   {/foreach}
 
+  $('.ui-dialog').css('overflow', 'visible');
+
   init();
 </script>
