Index: /extensions/GrumPluginClasses/classes/CommonPlugin.class.inc.php
===================================================================
--- /extensions/GrumPluginClasses/classes/CommonPlugin.class.inc.php	(revision 8960)
+++ /extensions/GrumPluginClasses/classes/CommonPlugin.class.inc.php	(revision 8961)
@@ -8,6 +8,6 @@
   ------------------------------------------------------------------------------
   Author     : Grum
-    email    : grum@grum.dnsalias.com
-    website  : http://photos.grum.dnsalias.com
+    email    : grum@piwigo.org
+    website  : http://photos.grum.fr
     PWG user : http://forum.phpwebgallery.net/profile.php?id=3706
 
Index: /extensions/GrumPluginClasses/classes/GPCCore.class.inc.php
===================================================================
--- /extensions/GrumPluginClasses/classes/GPCCore.class.inc.php	(revision 8960)
+++ /extensions/GrumPluginClasses/classes/GPCCore.class.inc.php	(revision 8961)
@@ -3,7 +3,7 @@
 /* -----------------------------------------------------------------------------
   class name     : GPCCore
-  class version  : 1.3.1
-  plugin version : 3.3.2
-  date           : 2010-10-20
+  class version  : 1.3.2
+  plugin version : 3.4.0
+  date           : 2011-01-28
   ------------------------------------------------------------------------------
   author: grum at piwigo.org
@@ -28,7 +28,12 @@
 |         |            |   extended description function if present
 |         |            |
-|         |            | * implement the getPiwigoSystemPath function
-|         |            |
-|         |            | * implement the rmDir function
+|         |            | * implement the getPiwigoSystemPath() function
+|         |            |
+|         |            | * implement the rmDir() function
+|         |            |
+| 1.3.2   | 2011/01/28 | * implement the addUI() function
+|         |            |
+|         |            | * implement getMinified() & setMinifiedState() functions
+|         |            |
 |         |            |
 |         |            |
@@ -47,4 +52,7 @@
     - static function addHeaderCSS
     - static function addHeaderJS
+    - static function addUI
+    - static function getMinified
+    - static function setMinifiedState
     - static function getUserLanguageDesc
     - static function getPiwigoSystemPath
@@ -58,4 +66,5 @@
 {
   static private $piwigoSystemPath;
+  static private $minified='.min';
 
   static public $pluginName = "GPCCore";
@@ -79,13 +88,14 @@
         Array('name' => "CommonPlugin", 'version' => "2.2.0"),
         Array('name' => "GPCAjax", 'version' => "3.0.0"),
-        Array('name' => "GPCCore", 'version' => "1.3.1"),
+        Array('name' => "GPCCategorySelector", 'version' => "1.0.1"),
+        Array('name' => "GPCCore", 'version' => "1.3.2"),
         Array('name' => "GPCCss", 'version' => "3.0.0"),
-        Array('name' => "GPCPagesNavigations", 'version' => "2.0.0"),
+        Array('name' => "GPCPagesNavigation", 'version' => "2.0.0"),
         Array('name' => "GPCPublicIntegration", 'version' => "2.0.0"),
-        Array('name' => "GPCRequestBuilder", 'version' => "1.1.0"),
+        Array('name' => "GPCRequestBuilder", 'version' => "1.1.2"),
         Array('name' => "GPCTables", 'version' => "1.5.0"),
         Array('name' => "GPCTabSheet", 'version' => "1.1.1"),
-        Array('name' => "GPCTranslate", 'version' => "2.1.0"),
-        Array('name' => "GPCUsersGroups", 'version' => "2.0.0"),
+        Array('name' => "GPCTranslate", 'version' => "2.1.1"),
+        Array('name' => "GPCUsersGroups", 'version' => "2.1.0")
       )
     );
@@ -365,4 +375,6 @@
   {
     global $template;
+    $dummy1=null;
+    $dummy2=null;
 
     foreach(self::$headerItems['css'] as $file)
@@ -373,7 +385,157 @@
     foreach(self::$headerItems['js'] as $file)
     {
-      $template->append('head_elements', '<script type="text/javascript" src="'.$file.'"></script>');
-    }
-  }
+      //$template->append('head_elements', '<script type="text/javascript" src="'.$file.'"></script>');
+      $template->block_html_head(null, '<script type="text/javascript" src="'.$file.'"></script>', $dummy1, $dummy2);
+    }
+  }
+
+  /**
+   * add a ui component ; css & js dependencies are managed
+   *
+   * @param Array $list : possibles values are
+   *                        - inputCheckbox
+   *                        - inputColorPicker
+   *                        - inputColorsFB
+   *                        - inputConsole
+   *                        - inputDotArea
+   *                        - inputList
+   *                        - inputNum
+   *                        - inputPosition
+   *                        - inputRadio
+   *                        - inputStatusBar
+   *                        - inputText
+   *                        - categorySelector
+   */
+  static public function addUI($list)
+  {
+    global $template;
+
+    if(is_string($list)) $list=explode(',', $list);
+    if(!is_array($list)) return(false);
+
+    if(defined('IN_ADMIN'))
+    {
+      $themeFile=GPC_PATH.'css/%s_'.$template->get_themeconf('name').'.css';
+    }
+    else
+    {
+      $themeFile='themes/'.$template->get_themeconf('name').'/css/GPC%s.css';
+    }
+
+    foreach($list as $ui)
+    {
+      switch($ui)
+      {
+        case 'googleTranslate':
+          self::addHeaderJS('google.jsapi', 'http://www.google.com/jsapi');
+          self::addHeaderJS('gpc.googleTranslate', 'plugins/GrumPluginClasses/js/google_translate'.self::$minified.'.js');
+        case 'categorySelector':
+          self::addHeaderCSS('gpc.categorySelector', GPC_PATH.'css/categorySelector.css');
+          self::addHeaderCSS('gpc.categorySelectorT', sprintf($themeFile, 'categorySelector'));
+          self::addHeaderJS('gpc.categorySelector', GPC_PATH.'js/ui.categorySelector'.self::$minified.'.js');
+          break;
+        case 'inputCheckbox':
+          self::addHeaderCSS('gpc.inputCheckbox', GPC_PATH.'css/inputCheckbox.css');
+          self::addHeaderJS('gpc.inputCheckbox', GPC_PATH.'js/ui.inputCheckbox'.self::$minified.'.js');
+          break;
+        case 'inputColorPicker':
+          self::addHeaderCSS('gpc.inputText', GPC_PATH.'css/inputText.css');
+          self::addHeaderCSS('gpc.inputNum', GPC_PATH.'css/inputNum.css');
+          self::addHeaderCSS('gpc.inputColorsFB', GPC_PATH.'css/inputColorsFB.css');
+          self::addHeaderCSS('gpc.inputDotArea', GPC_PATH.'css/inputDotArea.css');
+          self::addHeaderCSS('gpc.inputColorPicker', GPC_PATH.'css/inputColorPicker.css');
+          self::addHeaderCSS('gpc.inputTextT', sprintf($themeFile, 'inputText'));
+          self::addHeaderCSS('gpc.inputNumT', sprintf($themeFile, 'inputNum'));
+          self::addHeaderCSS('gpc.inputColorsFBT', sprintf($themeFile, 'inputColorsFB'));
+          self::addHeaderCSS('gpc.inputDotAreaT', sprintf($themeFile, 'inputDotArea'));
+          self::addHeaderCSS('gpc.inputColorPickerT', sprintf($themeFile, 'inputColorPicker'));
+          self::addHeaderJS('jquery.ui', 'themes/default/js/ui/packed/ui.core.packed.js');
+          self::addHeaderJS('jquery.ui.slider', 'themes/default/js/ui/packed/ui.slider.packed.js');
+          self::addHeaderJS('jquery.ui.draggable', 'themes/default/js/ui/packed/ui.draggable.packed.js');
+          self::addHeaderJS('jquery.ui.dialog', 'themes/default/js/ui/packed/ui.slider.dialog.js');
+          self::addHeaderJS('gpc.inputText', GPC_PATH.'js/ui.inputText'.self::$minified.'.js');
+          self::addHeaderJS('gpc.inputNum', GPC_PATH.'js/ui.inputNum'.self::$minified.'.js');
+          self::addHeaderJS('gpc.inputColorsFB', GPC_PATH.'js/ui.inputColorsFB'.self::$minified.'.js');
+          self::addHeaderJS('gpc.inputDotArea', GPC_PATH.'js/ui.inputDotArea'.self::$minified.'.js');
+          self::addHeaderJS('gpc.inputColorPicker', GPC_PATH.'js/ui.inputColorPicker'.self::$minified.'.js');
+          break;
+        case 'inputColorsFB':
+          self::addHeaderCSS('gpc.inputColorsFB', GPC_PATH.'css/inputColorsFB.css');
+          self::addHeaderCSS('gpc.inputColorsFBT', sprintf($themeFile, 'inputColorsFB'));
+          self::addHeaderJS('gpc.inputColorsFB', GPC_PATH.'js/ui.inputColorsFB'.self::$minified.'.js');
+          break;
+        case 'inputConsole':
+          self::addHeaderCSS('gpc.inputConsole', GPC_PATH.'css/inputConsole.css');
+          self::addHeaderCSS('gpc.inputConsoleT', sprintf($themeFile, 'inputConsole'));
+          self::addHeaderJS('gpc.inputConsole', GPC_PATH.'js/ui.inputConsole'.self::$minified.'.js');
+          break;
+        case 'inputDotArea':
+          self::addHeaderCSS('gpc.inputDotArea', GPC_PATH.'css/inputDotArea.css');
+          self::addHeaderCSS('gpc.inputDotAreaT', sprintf($themeFile, 'inputDotArea'));
+          self::addHeaderJS('gpc.inputDotArea', GPC_PATH.'js/ui.inputDotArea'.self::$minified.'.js');
+          break;
+        case 'inputList':
+          self::addHeaderCSS('gpc.inputList', GPC_PATH.'css/inputList.css');
+          self::addHeaderCSS('gpc.inputListT', sprintf($themeFile, 'inputList'));
+          self::addHeaderJS('gpc.inputList', GPC_PATH.'js/ui.inputList'.self::$minified.'.js');
+          break;
+        case 'inputNum':
+          self::addHeaderCSS('gpc.inputNum', GPC_PATH.'css/inputNum.css');
+          self::addHeaderCSS('gpc.inputNumT', sprintf($themeFile, 'inputNum'));
+          self::addHeaderJS('jquery.ui', 'themes/default/js/ui/packed/ui.core.packed.js');
+          self::addHeaderJS('jquery.ui.slider', 'themes/default/js/ui/packed/ui.slider.packed.js');
+          self::addHeaderJS('gpc.inputNum', GPC_PATH.'js/ui.inputNum'.self::$minified.'.js');
+          break;
+        case 'inputPosition':
+          self::addHeaderCSS('gpc.inputPosition', GPC_PATH.'css/inputPosition.css');
+          self::addHeaderCSS('gpc.inputPositionT', sprintf($themeFile, 'inputPosition'));
+          self::addHeaderJS('gpc.inputPosition', GPC_PATH.'js/ui.inputPosition'.self::$minified.'.js');
+          break;
+        case 'inputRadio':
+          self::addHeaderJS('gpc.inputRadio', GPC_PATH.'js/ui.inputRadio'.self::$minified.'.js');
+          break;
+        case 'inputStatusBar':
+          self::addHeaderCSS('gpc.inputStatusBar', GPC_PATH.'css/inputStatusBar.css');
+          self::addHeaderCSS('gpc.inputStatusBarT', sprintf($themeFile, 'inputStatusBar'));
+          self::addHeaderJS('gpc.inputStatusBar', GPC_PATH.'js/ui.inputStatusBar'.self::$minified.'.js');
+          break;
+        case 'inputText':
+          self::addHeaderCSS('gpc.inputText', GPC_PATH.'css/inputText.css');
+          self::addHeaderCSS('gpc.inputTextT', sprintf($themeFile, 'inputText'));
+          self::addHeaderJS('gpc.inputText', GPC_PATH.'js/ui.inputText'.self::$minified.'.js');
+          break;
+      }
+    }
+  }
+
+  /**
+   * return the minified value
+   *
+   * @return String
+   */
+  static public function getMinified()
+  {
+    return(self::$minified);
+  }
+
+  /**
+   * set the minified state
+   *
+   * @param Bool $state
+   * @return Bool
+   */
+  static public function setMinifiedState($state)
+  {
+    if($state)
+    {
+      self::$minified='.min';
+    }
+    else
+    {
+      self::$minified='';
+    }
+    return(self::$minified!='');
+  }
+
 
   /**
Index: /extensions/GrumPluginClasses/classes/GPCRequestBuilder.class.inc.php
===================================================================
--- /extensions/GrumPluginClasses/classes/GPCRequestBuilder.class.inc.php	(revision 8960)
+++ /extensions/GrumPluginClasses/classes/GPCRequestBuilder.class.inc.php	(revision 8961)
@@ -2,6 +2,6 @@
 /* -----------------------------------------------------------------------------
   class name: GCPRequestBuilder
-  class version  : 1.1.1
-  plugin version : 3.3.2
+  class version  : 1.1.2
+  plugin version : 3.3.3
   date           : 2010-09-08
 
@@ -75,6 +75,7 @@
 |         |            | * fix bug on user level access to picture
 |         |            |
-|         |            |
-|         |            |
+| 1.1.2   | 2010/11/01 | * mantis bug:1984
+|         |            |   . RBuilder returns an error message when one picture
+|         |            |     have multiple categories
 |         |            |
 |         |            |
@@ -522,5 +523,5 @@
     GPCCore::addHeaderJS('gpc.interface', 'plugins/'.$baseName.'external/interface/interface.js');
     GPCCore::addHeaderJS('gpc.inestedsortable', 'plugins/'.$baseName.'external/inestedsortable.pack.js');
-    GPCCore::addHeaderJS('gpc.rbCriteriaBuilder', 'plugins/'.$baseName.'rbCriteriaBuilder.packed.js');
+    GPCCore::addHeaderJS('gpc.rbCriteriaBuilder', 'plugins/'.$baseName.'rbCriteriaBuilder'.GPCCore::getMinified().'.js');
 
     $template->append('head_elements',
@@ -829,8 +830,8 @@
       'SELECT' => Array(
         'RB_PIT' => "pit.id AS imageId, pit.name AS imageName, pit.path AS imagePath", // from the piwigo's image table
-        'RB_PIC' => "GROUP_CONCAT(DISTINCT pic.category_id SEPARATOR ',') AS imageCategoriesId",     // from the piwigo's image_category table
-        'RB_PCT' => "GROUP_CONCAT(DISTINCT CASE WHEN pct.name IS NULL THEN '' ELSE pct.name END SEPARATOR '#sep#') AS imageCategoriesNames,
-                     GROUP_CONCAT(DISTINCT CASE WHEN pct.permalink IS NULL THEN '' ELSE pct.permalink END SEPARATOR '#sep#') AS imageCategoriesPLink,
-                     GROUP_CONCAT(DISTINCT CASE WHEN pct.dir IS NULL THEN 'V' ELSE 'P' END) AS imageCategoriesDir",   //from the piwigo's categories table
+        'RB_PIC' => "GROUP_CONCAT( pic.category_id SEPARATOR ',') AS imageCategoriesId",     // from the piwigo's image_category table
+        'RB_PCT' => "GROUP_CONCAT( CASE WHEN pct.name IS NULL THEN '' ELSE pct.name END SEPARATOR '#sep#') AS imageCategoriesNames,
+                     GROUP_CONCAT( CASE WHEN pct.permalink IS NULL THEN '' ELSE pct.permalink END SEPARATOR '#sep#') AS imageCategoriesPLink,
+                     GROUP_CONCAT( CASE WHEN pct.dir IS NULL THEN 'V' ELSE 'P' END) AS imageCategoriesDir",   //from the piwigo's categories table
       ),
       'FROM' => Array(
@@ -1374,4 +1375,10 @@
     $filter=array_flip($filter);
 
+    GPCCore::addHeaderJS('jquery.ui', 'themes/default/js/ui/packed/ui.core.packed.js');
+    GPCCore::addHeaderJS('jquery.ui.dialog', 'themes/default/js/ui/packed/ui.dialog.packed.js');
+    GPCCore::addHeaderJS('gpc.pagesNavigator', 'plugins/'.$baseName.'/js/pagesNavigator'.GPCCore::getMinified().'.js');
+    GPCCore::addHeaderJS('gpc.rbSearch', 'plugins/'.$baseName.'/js/rbSearch'.GPCCore::getMinified().'.js');
+
+
     $template->set_filename('gpc_search_page',
                 dirname(dirname(__FILE__)).'/templates/GPCRequestBuilder_search.tpl');
Index: /extensions/GrumPluginClasses/classes/GPCTranslate.class.inc.php
===================================================================
--- /extensions/GrumPluginClasses/classes/GPCTranslate.class.inc.php	(revision 8960)
+++ /extensions/GrumPluginClasses/classes/GPCTranslate.class.inc.php	(revision 8961)
@@ -3,12 +3,11 @@
 /* -----------------------------------------------------------------------------
   class name     : GPCTranslate
-  class version  : 2.1.0
-  plugin version : 3.0.0
-  date           : 2010-03-31
+  class version  : 2.1.1
+  plugin version : 3.4.0
+  date           : 2011-01-28
   ------------------------------------------------------------------------------
   author: grum at piwigo.org
   << May the Little SpaceFrog be with you >>
   ------------------------------------------------------------------------------
-
 
   ------------------------------------------------------------------------------
@@ -19,17 +18,16 @@
 | 2.1.0   | 2010/03/31 | * update class & functions names
 |         |            |
+| 2.1.1   | 2011/01/09 | * fixbug on js loading
 |         |            |
-|         |            |
+|         |            | * use GPCCore::addUI function (the class is kept for
+|         |            |   compatibility with older plugins)
 |         |            |
 |         |            |
 
   ------------------------------------------------------------------------------
-
-
    class call API in HTML header, and provide a .js file manage API call
         >>  http://code.google.com/apis/ajaxlanguage/
 
     - constructor
-
    ---------------------------------------------------------------------- */
 class GPCTranslate
@@ -37,18 +35,6 @@
   public function __construct()
   {
-    add_event_handler('loc_end_page_header', array(&$this, 'loadJS'));
+    GPCCore::addUI('googleTranslate');
   }
-
-  public function loadJS()
-  {
-    global $template;
-
-    $googleload='
-<script type="text/javascript" src="http://www.google.com/jsapi"></script>
-<script type="text/javascript" src="plugins/'.basename(dirname(__FILE__)).'/google_translate.js"></script>';
-
-    $template->append('head_elements', $googleload);
-  }
-
 } //class
 
Index: /extensions/GrumPluginClasses/classes/GPCUsersGroups.class.inc.php
===================================================================
--- /extensions/GrumPluginClasses/classes/GPCUsersGroups.class.inc.php	(revision 8960)
+++ /extensions/GrumPluginClasses/classes/GPCUsersGroups.class.inc.php	(revision 8961)
@@ -3,6 +3,6 @@
 /* -----------------------------------------------------------------------------
   class name: GPCAllowedAccess, GPCGroups, GPCUsers
-  class version  : 2.0.0
-  plugin version : 3.0.0
+  class version  : 2.1.0
+  plugin version : 3.4.0
   date           : 2010-03-30
   ------------------------------------------------------------------------------
@@ -14,14 +14,12 @@
   groups and users classes extends GPCAllowedAccess classes
 
-    - constructor GPCAllowedAccess($alloweds="")
-    - constructor groups($alloweds="")
-    - constructor users($alloweds="")
+    - constructor GPCAllowedAccess($alloweds = array(), $accessMode='a')
+    - constructor groups($alloweds = array(), $accessMode='a')
+    - constructor users($alloweds = array(), $accessMode='a')
     - (public) function getList()
     - (public) function setAllowed($id, $allowed)
-    - (public) function setAlloweds()
-    - (public) function getAlloweds($return_type)
+    - (public) function setAlloweds($idList, $allowed)
+    - (public) function getAlloweds()
     - (public) function isAllowed($id)
-    - (public) function htmlView($sep=", ", $empty="")
-    - (public) function htmlForm($basename)
     - (private) function initList()
 
@@ -34,4 +32,8 @@
 |         |            | * update classes & functions names
 |         |            |
+| 2.1.0   | 2011/01/15 | * remove html function
+|         |            |
+|         |            | * implement accessMode
+|         |            |
 |         |            |
 
@@ -39,90 +41,105 @@
 class GPCAllowedAccess
 {
-  public $access_list;
-
-  /*
-    constructor initialize the groups_getListgetListlist
-  */
-  public function __construct($alloweds = "")
+  protected $accessList;
+  protected $accessMode='a'; // 'a' : allowed, 'n' : not allowed
+
+  /**
+   * constructor initialize default values
+   *
+   * @param Array $alloweds  : list of items
+   *        String $alloweds : list of items (separator : '/')
+   *
+   * @param String $accessMode : 'a' = access is allowed by default for all values, $allowed param is a list of not allowed values
+   *                             'n' = access is not allowed by default for all values, $allowed param is a list of allowed values
+   *                             priority is given to the $allowed value
+   */
+  public function __construct($alloweds = array(), $accessMode='a')
   {
     $this->initList();
-    $this->setAlloweds($alloweds);
+    $this->setAlloweds($alloweds, $accessMode=='n');
   }
 
   public function __destruct()
   {
-    unset($this->access_list);
-  }
-
-  /*
-    initialize the groups list
-  */
+    unset($this->accessList);
+  }
+
+  /**
+   * destroy the groups list
+   */
   protected function initList()
   {
-    $this->access_list=array();
-  }
-
-  /*
-    returns list (as an array)
-  */
+    $this->accessList=array();
+  }
+
+  /**
+   * returns list of items (as an array)
+   * each array item is an array :
+   *  'id'      : (String) id of item
+   *  'name'    : (String) name of item
+   *  'allowed' : (Bool)   access is allowed or not
+   *
+   * @return Array
+   */
   function getList()
   {
-    return($this->access_list);
-  }
-
-  /*
-    set element an allowed state
-  */
+    return($this->accessList);
+  }
+
+  /**
+   * set allowed value for an item
+   *
+   * @param String $id : id of item
+   * @param Bool $allowed : access allowed or not
+   */
   function setAllowed($id, $allowed)
   {
-    if(isset($this->access_list[$id]))
-    {
-      $this->access_list[$id]['allowed']=$allowed;
-    }
-  }
-
-  /*
-    set a group enabled/disabled state
-  */
-  function setState($id, $enabled)
-  {
-    if(isset($this->access_list[$id]))
-    {
-      $this->access_list[$id]['enabled']=$enabled;
-    }
-  }
-
-  /*
-    set alloweds list
-    $list is string of id, separated with "/"
-  */
-  function setAlloweds($list)
-  {
-    $alloweds=explode("/", $list);
-    $alloweds=array_flip($alloweds);
-    foreach($this->access_list as $key => $val)
-    {
-      if(isset($alloweds[$key]))
+    if(isset($this->accessList[$id]))
+    {
+      $this->accessList[$id]['allowed']=$allowed;
+    }
+  }
+
+
+  /**
+   * set alloweds items (can be given as an array or a string with separator '/')
+   * according to the
+   *
+   * @param Array $idList  : list of items to set
+   * @param String $idList
+   * @param Bool $allowed : access allowed or not
+   */
+  function setAlloweds($idList, $allowed)
+  {
+    if(!is_array($idList)) $idList=explode("/", $idList);
+
+    $idList=array_flip($idList);
+
+    foreach($this->accessList as $key => $val)
+    {
+      if(isset($idList[$key]))
       {
-        $this->access_list[$key]['allowed']=true;
+        $this->accessList[$key]['allowed']=$allowed;
       }
       else
       {
-        $this->access_list[$key]['allowed']=false;
+        $this->accessList[$key]['allowed']=!$allowed;
       }
     }
   }
 
-  /*
-    get alloweds list
-    return a string of groups, separated with "/"
-  */
-  function getAlloweds($return_type = 'name')
-  {
-    $returned="";
-    foreach($this->access_list as $key => $val)
-    {
-      if($val['allowed'])
-      { $returned.=$val[$return_type]."/"; }
+
+  /**
+   * return list of alloweds items
+   *
+   * @return Array
+   */
+  function getAlloweds()
+  {
+    $returned=Array();
+
+    foreach($this->accessList as $key => $val)
+    {
+      if($val['allowed']) $returned[]=$val;
     }
     return($returned);
@@ -130,100 +147,22 @@
 
 
-  /*
-    returns true if is allowed
-  */
+  /**
+   * returns true if is allowed
+   *
+   * @param String $id : item id
+   * @retrun Bool
+   */
   function isAllowed($id)
   {
-    if(isset($this->access_list[$id]))
-    { return($this->access_list[$id]['allowed']); }
+    if(isset($this->accessList[$id]))
+    {
+      return($this->accessList[$id]['allowed']);
+    }
     else
-    { return(false); }
-  }
-
-  /*
-    returns true if all or one is allowed
-      ids is an array
-  */
-  function areAllowed($ids, $all=false)
-  {
-    foreach($ids as $val)
-    {
-      if($all)
-      {
-        if(!$this->isAllowed($val))
-        {
-          return(false);
-        }
-      }
-      else
-      {
-        if($this->isAllowed($val))
-        {
-          return(true);
-        }
-      }
-    }
-    return(false);
-  }
-
-  /*
-    returns an HTML list with label rather than id
-  */
-  function htmlView($sep=", ", $empty="")
-  {
-    $returned="";
-    foreach($this->access_list as $key => $val)
-    {
-      if($val['allowed'])
-      {
-        if($returned!="")
-        {
-          $returned.=$sep;
-        }
-        $returned.=$val['name'];
-      }
-    }
-    if($returned=="")
-    {
-      $returned=$empty;
-    }
-    return($returned);
-  }
-  /*
-    returns a generic HTML form to manage the groups access
-  */
-  function htmlForm($basename)
-  {
-    /*
-    <!-- BEGIN allowed_group_row -->
-    <label><input type="checkbox" name="fmypolls_att_allowed_groups_{allowed_group_row.ID}" {allowed_group_row.CHECKED}/>&nbsp;{allowed_group_row.NAME}</label>
-    <!-- END allowed_group_row -->
-    */
-    $text='';
-    foreach($this->access_list as $key => $val)
-    {
-      if($val['allowed'])
-      {
-        $checked=' checked';
-      }
-      else
-      {
-        $checked='';
-      }
-
-      if($val['enabled'])
-      {
-        $enabled='';
-      }
-      else
-      {
-        $enabled=' disabled';
-      }
-
-      $text.='<label><input type="checkbox" name="'.$basename.$val['id'].'" '.$checked.$enabled.'/>
-          &nbsp;'.$val['name'].'</label>&nbsp;';
-    }
-    return($text);
-  }
+    {
+      return($this->accessMode=='a');
+    }
+  }
+
 } //GPCAllowedAccess
 
@@ -235,16 +174,18 @@
 
 
-/* ----------------------------------------------------------------------
-   this class provides base functions to manage groups access
-    initList redefined to initialize access_list from database GROUPS
-   ---------------------------------------------------------------------- */
+/**
+ * ----------------------------------------------------------------------------
+ *  this class provides base functions to manage groups access
+ *  initList redefined to initialize accessList from database GROUPS
+ * ----------------------------------------------------------------------------
+ */
 class GPCGroups extends GPCAllowedAccess
 {
-  /*
-    initialize the groups list
-  */
+  /**
+   * initialize the groups list
+   */
   protected  function initList()
   {
-    $this->access_list=array();
+    $this->accessList=array();
     $sql="SELECT id, name FROM ".GROUPS_TABLE." ORDER BY name";
     $result=pwg_query($sql);
@@ -253,9 +194,9 @@
       while($row=pwg_db_fetch_assoc($result))
       {
-        $this->access_list[$row['id']] =
-                   array('id' => $row['id'],
-                         'name' => $row['name'],
-                         'allowed' => false,
-                         'enabled' => true);
+        $this->accessList[$row['id']]=array(
+            'id' => $row['id'],
+            'name' => $row['name'],
+            'allowed' => ($this->accessMode=='a')
+          );
       }
     }
@@ -270,33 +211,26 @@
 
 
-/* -----------------------------------------------------------------------------
-   this class provides base functions to manage users access
------------------------------------------------------------------------------ */
+/**
+ * ----------------------------------------------------------------------------
+ *  this class provides base functions to manage users access
+ *  initList redefined to initialize accessList from piwigo's predefined values
+ * ----------------------------------------------------------------------------
+ */
 class GPCUsers extends GPCAllowedAccess
 {
-  /*
-    constructor
-  */
-  public function __construct($alloweds = "")
-  {
-    parent::__construct($alloweds);
-    $this->setState('admin', false);
-    $this->setAllowed('admin', true);
-  }
-
-  /*
-    initialize the groups list
-  */
+  /**
+   * initialize the users list
+   */
   protected function initList()
   {
-    $users_list = array('guest', 'generic', 'normal', 'webmaster', 'admin');
-    $this->access_list=array();
-    foreach($users_list as $val)
-    {
-      $this->access_list[$val] =
-                  array('id' => $val,
-                        'name' => l10n('user_status_'.$val),
-                        'allowed' => false,
-                        'enabled' => true);
+    $usersList = array('guest', 'generic', 'normal', 'webmaster', 'admin');
+    $this->accessList=array();
+    foreach($usersList as $val)
+    {
+      $this->accessList[$val]=array(
+          'id' => $val,
+          'name' => l10n('user_status_'.$val),
+          'allowed' => ($this->accessMode=='a')
+        );
     }
   }
Index: /extensions/GrumPluginClasses/classes/genericjs.class.inc.php
===================================================================
--- /extensions/GrumPluginClasses/classes/genericjs.class.inc.php	(revision 8960)
+++ /extensions/GrumPluginClasses/classes/genericjs.class.inc.php	(revision 8961)
@@ -1,41 +1,7 @@
 <?php
-
-/* -----------------------------------------------------------------------------
-  class name: genericjs
-  class version: 2.0
-  date: 2008-07-20
-  ------------------------------------------------------------------------------
-  author: grum at grum.dnsalias.com
-  << May the Little SpaceFrog be with you >>
-  ------------------------------------------------------------------------------
-
-   this classes provides base functions to add genericjs.js file into html page
-
-   > see genericjs.js file to know javascript functions added
-
-    - constructor genericjs()
-   ---------------------------------------------------------------------- */
-
-
-class genericjs
-{
-  function genericjs()
-  {
-    add_event_handler('loc_end_page_header', array(&$this, 'load_JS'));
-  }
-
-  function load_JS()
-  {
-    global $template;
-
-    $name='plugins/'.basename(dirname(dirname(__FILE__))).'/js/genericjs.js';
-
-    $template->append('head_elements', '<script src="'.$name.'" type="text/javascript"></script>');
-
-  }
-
-} //class
-
-$genericjs=new genericjs();
-
+/*
+ * dummy file to avoid compatibility problem with older plugin.
+ *
+ * this file have to be removed on the next release.
+ */
 ?>
Index: /extensions/GrumPluginClasses/css/categorySelector.css
===================================================================
--- /extensions/GrumPluginClasses/css/categorySelector.css	(revision 8961)
+++ /extensions/GrumPluginClasses/css/categorySelector.css	(revision 8961)
@@ -0,0 +1,4 @@
+/*
+ * empty file - next release of GPC need to move common css definition from
+ * files roma&clear files
+ */
Index: /extensions/GrumPluginClasses/css/categorySelector_clear.css
===================================================================
--- /extensions/GrumPluginClasses/css/categorySelector_clear.css	(revision 8960)
+++ /extensions/GrumPluginClasses/css/categorySelector_clear.css	(revision 8961)
@@ -2,5 +2,9 @@
 .ui-category-selector {
   cursor:default;
-  padding:2px;
+  min-height:17px;
+  padding:0;
+}
+div.ui-category-selector:focus {
+  outline:none;
 }
 
@@ -10,4 +14,5 @@
   float:right;
   font-size:8px;
+  max-height:8px;
 }
 
@@ -17,4 +22,5 @@
   font-size:14px;
   font-family:sans-serif;
+  z-index:9999;
 }
 
@@ -23,8 +29,8 @@
 }
 
-li.ui-category-selector-item div {
-  margin:2px;
+div.ui-category-selector-multiple div.ui-category-selector-check,
+div.ui-category-selector-multiple div.ui-category-selector-name {
+   display:inline-block;
 }
-
 .ui-category-selector-expandable-item,
 .ui-category-selector-collapsable-item {
@@ -33,10 +39,49 @@
 
 .ui-category-selector-check {
-  position:absolute;
-  left:0px;
-  width:15px;
-  height:15px;
-  background: none no-repeat scroll 0px 0px;
+  background:none no-repeat scroll 0 0 transparent;
+  display:inline-block;
+  height:13px;
+  width:17px;
 }
+
+
+/* --- */
+.ui-category-selector-name ul { list-style:none; margin:0; padding:0; }
+.ui-category-selector-name li.ui-category-selector-selected-cat {
+  -moz-border-radius:3px;
+  -webkit-border-radius:3px;
+  -khtml-border-radius:3px;
+  border-radius:3px;
+  float:left;
+  margin-bottom:1px;
+  margin-right:1px;
+  padding:0 4px;
+  cursor:default;
+}
+.ui-category-selector-name ul li.ui-category-selector-selected-cat span { cursor:pointer; }
+.ui-category-selector-name li span {
+  font-family:sans;
+  font-size:80%;
+  font-weight:bold;
+  padding:0 3px;
+  position:relative;
+  top:-1px;
+}
+.ui-category-selector-arrow {
+  border-style:solid;
+  border-width:1px;
+  cursor:pointer;
+  font-weight:bold;
+  width:14px;
+  margin-top:1px;
+  height:14px;
+  text-align:center;
+  display:inline-block;
+}
+.ui-category-selector-name {
+  padding:1px;
+}
+
+
 
 /* clear css */
@@ -77,2 +122,26 @@
   background-image:url(./../icons/check_checked_clear.png);
 }
+
+/* --- */
+.ui-category-selector-name ul li.ui-category-selector-selected-cat {
+  background:#999999;
+  color:#DDDDDD;
+  margin-top:1px;
+  padding-top:1px;
+}
+
+.ui-error, input[type='text'].ui-error {
+  background:#ff8080;
+  border-color:#800000;
+  color:#800000;
+}
+
+.ui-category-selector-arrow {
+  background:none repeat scroll 0 0 #999999;
+  border-color:#DDDDDD #666666 #666666 #DDDDDD;
+  color:#005E89;
+}
+
+.ui-category-selector-arrow-active {
+  border-color:#666666 #DDDDDD #DDDDDD #666666;
+}
Index: /extensions/GrumPluginClasses/css/categorySelector_roma.css
===================================================================
--- /extensions/GrumPluginClasses/css/categorySelector_roma.css	(revision 8960)
+++ /extensions/GrumPluginClasses/css/categorySelector_roma.css	(revision 8961)
@@ -2,5 +2,9 @@
 .ui-category-selector {
   cursor:default;
-  padding:2px;
+  min-height:17px;
+  padding:0;
+}
+div.ui-category-selector:focus {
+  outline:none;
 }
 
@@ -10,4 +14,5 @@
   float:right;
   font-size:8px;
+  max-height:8px;
 }
 
@@ -17,4 +22,5 @@
   font-size:14px;
   font-family:sans-serif;
+  z-index:9999;
 }
 
@@ -23,8 +29,8 @@
 }
 
-li.ui-category-selector-item div {
-  margin:2px;
+div.ui-category-selector-multiple div.ui-category-selector-check,
+div.ui-category-selector-multiple div.ui-category-selector-name {
+   display:inline-block;
 }
-
 .ui-category-selector-expandable-item,
 .ui-category-selector-collapsable-item {
@@ -33,16 +39,49 @@
 
 .ui-category-selector-check {
-  position:absolute;
-  left:0px;
-  width:15px;
-  height:15px;
-  background: none no-repeat scroll 0px 0px;
+  background:none no-repeat scroll 0 0 transparent;
+  display:inline-block;
+  height:13px;
+  width:17px;
+}
+
+
+/* --- */
+.ui-category-selector-name ul { list-style:none; margin:0; padding:0; }
+.ui-category-selector-name li.ui-category-selector-selected-cat {
+  -moz-border-radius:3px;
+  -webkit-border-radius:3px;
+  -khtml-border-radius:3px;
+  border-radius:3px;
+  float:left;
+  margin-bottom:1px;
+  margin-right:1px;
+  padding:0 4px;
+  cursor:default;
+}
+.ui-category-selector-name ul li.ui-category-selector-selected-cat span { cursor:pointer; }
+.ui-category-selector-name li span {
+  font-family:sans;
+  font-size:80%;
+  font-weight:bold;
+  padding:0 3px;
+  position:relative;
+  top:-1px;
+}
+.ui-category-selector-arrow {
+  border-style:solid;
+  border-width:1px;
+  cursor:pointer;
+  font-weight:bold;
+  width:14px;
+  margin-top:1px;
+  height:14px;
+  text-align:center;
+  display:inline-block;
+}
+.ui-category-selector-name {
+  padding:1px;
 }
 
 /* roma css */
-
-.ui-category-selector-arrow {
-  color:#FF3363;
-}
 
 .ui-category-selector,
@@ -75,2 +114,26 @@
   background-image:url(./../icons/check_checked_roma.png);
 }
+
+/* --- */
+.ui-category-selector-name ul li.ui-category-selector-selected-cat {
+  background:#666666;
+  color:#999999;
+  margin-top:1px;
+  padding-top:1px;
+}
+
+.ui-error, input[type='text'].ui-error {
+  background:#ff8080;
+  border-color:#800000;
+  color:#800000;
+}
+
+.ui-category-selector-arrow {
+  background:none repeat scroll 0 0 #666666;
+  border-color:#999999 #444444 #444444 #999999;
+  color:#FF3363;
+}
+
+.ui-category-selector-arrow-active {
+  border-color:#444444 #999999 #999999 #444444;
+}
Index: /extensions/GrumPluginClasses/css/inputCheckbox.css
===================================================================
--- /extensions/GrumPluginClasses/css/inputCheckbox.css	(revision 8961)
+++ /extensions/GrumPluginClasses/css/inputCheckbox.css	(revision 8961)
@@ -0,0 +1,9 @@
+/* for inputCheckbox plugin */
+.ui-inputCheckbox.ui-error {
+  background:#ff8080;
+  border:1px solid #800000;
+  color:#800000;
+}
+.ui-inputCheckbox.ui-error label {
+  color:#800000;
+}
Index: /extensions/GrumPluginClasses/css/inputColorPicker.css
===================================================================
--- /extensions/GrumPluginClasses/css/inputColorPicker.css	(revision 8961)
+++ /extensions/GrumPluginClasses/css/inputColorPicker.css	(revision 8961)
@@ -0,0 +1,107 @@
+/* for inputColorPicker plugin */
+.ui-inputColorPicker {
+  min-width:332px;
+  min-height:140px;
+}
+
+.ui-inputColorPicker div.ui-inputColorPicker-dotAreaSV {
+  display:inline-block;
+  float:left;
+  margin:3px;
+}
+.ui-inputColorPicker div.ui-inputColorPicker-dotAreaSV div.ui-inputDotArea {
+  background:url(./../icons/colorSV.png) no-repeat 0 0 #000000;
+}
+.ui-inputColorPicker div.ui-inputColorPicker-dotAreaH {
+  display:inline-block;
+  float:left;
+  margin:3px 6px;
+}
+.ui-inputColorPicker div.ui-inputColorPicker-dotAreaH div.ui-inputDotArea {
+  background:url(./../icons/colorH.png) no-repeat 0 0 transparent;
+}
+
+.ui-inputColorPicker table.ui-inputColorPicker-inputContainer {
+  font-size:10px;
+  display:inline-block;
+  text-align: left;
+}
+
+.ui-inputColorPicker div.ui-inputColorsFB {
+  margin:auto;
+}
+
+.ui-inputColorPicker table.ui-inputColorPicker-inputContainer tr {
+  vertical-align:middle;
+}
+
+.ui-inputColorPicker table.ui-inputColorPicker-inputContainer td.label {
+  text-align:center;
+  width:8px;
+}
+
+.ui-inputColorPicker table.ui-inputColorPicker-inputContainer td.input {
+  width:55px;
+  max-width:55px;
+  padding-right:8px;
+  display:inline-block;
+  min-height:23px;
+}
+
+table.ui-inputColorPicker-inputContainer div.ui-inputNum {
+  height:14px;
+  max-width:55px;
+}
+
+table.ui-inputColorPicker-inputContainer div.ui-inputNum div.ui-slider {
+  position:absolute;
+  margin-left:-1px;
+  border:1px solid;
+  padding-right:12px;
+}
+table.ui-inputColorPicker-inputContainer div.ui-inputNum div.ui-slider-horizontal {
+  height:9px;
+}
+
+table.ui-inputColorPicker-inputContainer div.ui-inputNum a.ui-slider-handle {
+  height:7px;
+  margin-top:0;
+}
+
+.ui-inputNum-btDec, .ui-inputNum-btInc {
+  width:11px;
+  height:11px;
+}
+
+/* --- */
+.ui-inputDialogColor div.ui-inputColorPicker {
+  min-width:346px;
+  min-height:140px;
+}
+.ui-inputDialogColor div.ui-dialog-titlebar {
+  cursor:move;
+}
+.ui-inputDialogColor div.ui-dialog-buttonpane {
+  text-align:left;
+}
+.ui-inputDialogColor div.ui-dialog-buttonpane button {
+  border-style:solid;
+  border-width:1px;
+  cursor:pointer;
+  font-weight:bold;
+  margin-top:1px;
+  text-align:center;
+  display:inline-block;
+}
+.ui-inputDialogColor div.ui-dialog-content {
+  margin:4px;
+}
+.ui-inputDialogColor a.ui-dialog-titlebar-close {
+  display:inline-block;
+  margin:0 4px;
+  outline:none;
+}
+
+div.dialogColor {
+  overflow:hidden;
+}
Index: /extensions/GrumPluginClasses/css/inputColorPicker_clear.css
===================================================================
--- /extensions/GrumPluginClasses/css/inputColorPicker_clear.css	(revision 8961)
+++ /extensions/GrumPluginClasses/css/inputColorPicker_clear.css	(revision 8961)
@@ -0,0 +1,22 @@
+/* clear css */
+table.ui-inputColorPicker-inputContainer div.ui-inputNum div.ui-slider {
+  border-color:#999999;
+}
+
+.ui-inputDialogColor {
+  background:#AAAAAA;
+  border:1px solid #999999;
+}
+.ui-inputDialogColor div.ui-dialog-titlebar {
+  background:#DDDDDD;
+  color:#666666;
+}
+.ui-inputDialogColor div.ui-dialog-buttonpane button {
+  background:none repeat scroll 0 0 #999999;
+  border-color:#DDDDDD #666666 #666666 #DDDDDD;
+  color:#005E89;
+}
+.ui-inputDialogColor div.ui-dialog-buttonpane button:active {
+  border-color:#666666 #DDDDDD #DDDDDD #666666;
+}
+
Index: /extensions/GrumPluginClasses/css/inputColorPicker_roma.css
===================================================================
--- /extensions/GrumPluginClasses/css/inputColorPicker_roma.css	(revision 8961)
+++ /extensions/GrumPluginClasses/css/inputColorPicker_roma.css	(revision 8961)
@@ -0,0 +1,22 @@
+
+/* roma css */
+table.ui-inputColorPicker-inputContainer div.ui-inputNum div.ui-slider {
+  border-color:#666666;
+}
+
+.ui-inputDialogColor {
+  background:#222222;
+  border:1px solid #666666;
+}
+.ui-inputDialogColor div.ui-dialog-titlebar {
+  background:#666666;
+  color:#222222;
+}
+.ui-inputDialogColor div.ui-dialog-buttonpane button {
+  background:none repeat scroll 0 0 #666666;
+  border-color:#999999 #444444 #444444 #999999;
+  color:#ff3363;
+}
+.ui-inputDialogColor div.ui-dialog-buttonpane button:active {
+  border-color:#444444 #999999 #999999 #444444;
+}
Index: /extensions/GrumPluginClasses/css/inputColorsFB.css
===================================================================
--- /extensions/GrumPluginClasses/css/inputColorsFB.css	(revision 8961)
+++ /extensions/GrumPluginClasses/css/inputColorsFB.css	(revision 8961)
@@ -0,0 +1,25 @@
+/* for inputColorsFB plugin */
+.ui-inputColorsFB {
+  padding:0px;
+}
+
+.ui-inputColorsFB-clickable {
+  cursor:pointer;
+}
+
+.ui-inputColorsFB-fgopacity, .ui-inputColorsFB-bgopacity  {
+  background:url(./../icons/bgopacity.png) repeat 0 0 #000000;
+  border:1px solid;
+  position:absolute;
+}
+
+.ui-inputColorsFB-fgopacity {
+  z-index:100;
+}
+.ui-inputColorsFB-bgopacity {
+  z-index:50;
+}
+.ui-inputColorsFB-fg, .ui-inputColorsFB-bg {
+  width:100%;
+  height:100%;
+}
Index: /extensions/GrumPluginClasses/css/inputColorsFB_clear.css
===================================================================
--- /extensions/GrumPluginClasses/css/inputColorsFB_clear.css	(revision 8961)
+++ /extensions/GrumPluginClasses/css/inputColorsFB_clear.css	(revision 8961)
@@ -0,0 +1,8 @@
+/* roma css */
+.ui-inputColorsFB-fgopacity, .ui-inputColorsFB-bgopacity {
+  border-color:#999999;
+}
+
+.ui-inputColorsFB-selected {
+  border:2px solid #666666;
+}
Index: /extensions/GrumPluginClasses/css/inputColorsFB_roma.css
===================================================================
--- /extensions/GrumPluginClasses/css/inputColorsFB_roma.css	(revision 8961)
+++ /extensions/GrumPluginClasses/css/inputColorsFB_roma.css	(revision 8961)
@@ -0,0 +1,9 @@
+/* roma css */
+
+.ui-inputColorsFB-fgopacity, .ui-inputColorsFB-bgopacity {
+  border-color:#999999;
+}
+
+.ui-inputColorsFB-selected {
+  border:2px solid #ffffff;
+}
Index: /extensions/GrumPluginClasses/css/inputConsole.css
===================================================================
--- /extensions/GrumPluginClasses/css/inputConsole.css	(revision 8961)
+++ /extensions/GrumPluginClasses/css/inputConsole.css	(revision 8961)
@@ -0,0 +1,28 @@
+/* for inputConsole plugin */
+.ui-inputConsole {
+  padding:0px;
+}
+.ui-inputConsole-input {
+  width:100%;
+}
+.ui-inputConsole-prompt {
+  display:inline-block;
+  margin:0;
+  padding:0 4px;
+}
+.ui-inputConsole input[type='text'] {
+  border:none;
+  background:transparent;
+  display:inline-block;
+  padding-right:2px;
+}
+.ui-inputConsole-history ul {
+  margin:0px;
+  padding:0 0 0 20px;
+}
+.ui-inputConsole-history {
+  overflow:auto;
+  border:1px solid;
+  border-bottom:1px dotted;
+  position:absolute;
+}
Index: /extensions/GrumPluginClasses/css/inputConsole_clear.css
===================================================================
--- /extensions/GrumPluginClasses/css/inputConsole_clear.css	(revision 8961)
+++ /extensions/GrumPluginClasses/css/inputConsole_clear.css	(revision 8961)
@@ -0,0 +1,17 @@
+/* clear css */
+.ui-inputConsole {
+  background:#DDDDDD;
+  border:1px solid #999999;
+  color:#666666;
+}
+.ui-inputConsole-history {
+  border-color:#999999;
+  background:#DDDDDD;
+  color:#666666;
+}
+
+.ui-error, input[type='text'].ui-error {
+  background:#ff8080;
+  border-color:#800000;
+  color:#800000;
+}
Index: /extensions/GrumPluginClasses/css/inputConsole_roma.css
===================================================================
--- /extensions/GrumPluginClasses/css/inputConsole_roma.css	(revision 8961)
+++ /extensions/GrumPluginClasses/css/inputConsole_roma.css	(revision 8961)
@@ -0,0 +1,17 @@
+/* roma css */
+.ui-inputConsole {
+  background:#444444;
+  border:1px solid #666666;
+  color:#999999;
+}
+.ui-inputConsole-history {
+  border-color:#666666;
+  background:#444444;
+  color:#999999;
+}
+
+.ui-error, input[type='text'].ui-error {
+  background:#ff8080;
+  border-color:#800000;
+  color:#800000;
+}
Index: /extensions/GrumPluginClasses/css/inputDotArea.css
===================================================================
--- /extensions/GrumPluginClasses/css/inputDotArea.css	(revision 8961)
+++ /extensions/GrumPluginClasses/css/inputDotArea.css	(revision 8961)
@@ -0,0 +1,15 @@
+/* for inputDotArea plugin */
+.ui-inputDotArea {
+  cursor:default;
+  padding:0px;
+  border:1px solid;
+  overflow:hidden;
+}
+.ui-inputDotArea-dot {
+  cursor:default;
+  background:url(./../icons/color_pointer.png) no-repeat 0 0  transparent ;
+  position:relative;
+  margin:0px;
+  width:12px;
+  height:12px;
+}
Index: /extensions/GrumPluginClasses/css/inputDotArea_clear.css
===================================================================
--- /extensions/GrumPluginClasses/css/inputDotArea_clear.css	(revision 8961)
+++ /extensions/GrumPluginClasses/css/inputDotArea_clear.css	(revision 8961)
@@ -0,0 +1,7 @@
+/* roma css */
+
+.ui-inputDotArea {
+  background:#DDDDDD;
+  border:1px solid #999999;
+  color:#666666;
+}
Index: /extensions/GrumPluginClasses/css/inputDotArea_roma.css
===================================================================
--- /extensions/GrumPluginClasses/css/inputDotArea_roma.css	(revision 8961)
+++ /extensions/GrumPluginClasses/css/inputDotArea_roma.css	(revision 8961)
@@ -0,0 +1,7 @@
+/* roma css */
+
+.ui-inputDotArea {
+  background:#444444;
+  border-color:#666666;
+  color:#999999;
+}
Index: /extensions/GrumPluginClasses/css/inputList.css
===================================================================
--- /extensions/GrumPluginClasses/css/inputList.css	(revision 8961)
+++ /extensions/GrumPluginClasses/css/inputList.css	(revision 8961)
@@ -0,0 +1,73 @@
+/* for inputList plugin */
+.ui-inputList {
+  cursor:default;
+  padding:0px;
+  min-height:17px;
+  outline:none;
+}
+.ui-inputList-arrow {
+  border-style:solid;
+  border-width:1px;
+  cursor:pointer;
+  font-weight:bold;
+  width:14px;
+  margin-top:1px;
+  height:14px;
+  text-align:center;
+  display:inline-block;
+}
+
+.ui-inputList-list {
+  margin-top:-1px;
+  cursor:default;
+  font-family:sans-serif;
+  z-index:9999;
+}
+
+.ui-inputList-item {
+  min-height:15px;
+}
+
+.ui-inputList-value span {
+  display:inline-block;
+  overflow:hidden;
+}
+
+div.ui-inputList-multiple div.ui-inputList-check,
+div.ui-inputList-multiple div.ui-inputList-name {
+   display:inline-block;
+}
+.ui-inputList-expandable-item,
+.ui-inputList-collapsable-item {
+  background: none no-repeat scroll 0px 0px;
+}
+
+.ui-inputList-check {
+  background:none no-repeat scroll 0 0 transparent;
+  display:inline-block;
+  height:13px;
+  width:17px;
+}
+
+.ui-inputList-value { margin:0px; }
+.ui-inputList-value span { padding-top:2px; min-height:15px; }
+.ui-inputList-value ul { list-style:none; margin:1px 0 0 1px; padding:0; }
+.ui-inputList-value li.ui-inputList-selected-item {
+  -moz-border-radius:3px;
+  -webkit-border-radius:3px;
+  -khtml-border-radius:3px;
+  border-radius:3px;
+  margin-bottom:1px;
+  margin-right:1px;
+  padding:0 4px;
+  cursor:default;
+}
+.ui-inputList-value ul li.ui-inputList-selected-item span.ui-inputList-delete-item { cursor:pointer; }
+.ui-inputList-value li span.ui-inputList-delete-item {
+  font-family:sans;
+  font-size:80%;
+  font-weight:bold;
+  padding:0 3px;
+  position:relative;
+  top:-1px;
+}
Index: /extensions/GrumPluginClasses/css/inputList_clear.css
===================================================================
--- /extensions/GrumPluginClasses/css/inputList_clear.css	(revision 8961)
+++ /extensions/GrumPluginClasses/css/inputList_clear.css	(revision 8961)
@@ -0,0 +1,41 @@
+/* clear css */
+
+.ui-inputList,
+.ui-inputList-list {
+  background:#DDDDDD;
+  border:1px solid #999999;
+  color:#666666;
+}
+
+.ui-inputList-arrow {
+  background:none repeat scroll 0 0 #999999;
+  border-color:#DDDDDD #666666 #666666 #DDDDDD;
+  color:#005E89;
+}
+
+.ui-inputList-arrow-active {
+  border-color:#666666 #DDDDDD #DDDDDD #666666;
+}
+
+li.ui-inputList-item:hover {
+  background-color:#AAAAAA;
+  color:#DDDDDD;
+}
+
+.ui-inputList-selected-item {
+  background-color:#999999;
+  color:#DDDDDD;
+}
+
+li.ui-inputList-item div.ui-inputList-check {
+  background-image:url(./../icons/check_notchecked_clear.png);
+}
+li.ui-inputList-selected-item div.ui-inputList-check {
+  background-image:url(./../icons/check_checked_clear.png);
+}
+
+.ui-error, input[type='text'].ui-error {
+  background:#ff8080;
+  border-color:#800000;
+  color:#800000;
+}
Index: /extensions/GrumPluginClasses/css/inputList_roma.css
===================================================================
--- /extensions/GrumPluginClasses/css/inputList_roma.css	(revision 8961)
+++ /extensions/GrumPluginClasses/css/inputList_roma.css	(revision 8961)
@@ -0,0 +1,39 @@
+/* roma css */
+
+.ui-inputList,
+.ui-inputList-list {
+  background:#444444;
+  border:1px solid #666666;
+  color:#999999;
+}
+
+.ui-inputList-arrow {
+  background:none repeat scroll 0 0 #666666;
+  border-color:#999999 #444444 #444444 #999999;
+  color:#FF3363;
+}
+
+.ui-inputList-arrow-active {
+  border-color:#444444 #999999 #999999 #444444;
+}
+
+li.ui-inputList-item:hover {
+  background-color:#666666;
+}
+
+.ui-inputList-selected-item {
+  background-color:#777777;
+}
+
+li.ui-inputList-item div.ui-inputList-check {
+  background-image:url(./../icons/check_notchecked_roma.png);
+}
+li.ui-inputList-selected-item div.ui-inputList-check {
+  background-image:url(./../icons/check_checked_roma.png);
+}
+
+.ui-error, input[type='text'].ui-error {
+  background:#ff8080;
+  border-color:#800000;
+  color:#800000;
+}
Index: /extensions/GrumPluginClasses/css/inputNum.css
===================================================================
--- /extensions/GrumPluginClasses/css/inputNum.css	(revision 8961)
+++ /extensions/GrumPluginClasses/css/inputNum.css	(revision 8961)
@@ -0,0 +1,51 @@
+/* for inputNum plugin */
+.ui-inputNum {
+  cursor:text;
+  padding:0px;
+}
+.ui-inputNum-extra {
+  display:inline-block;
+  float:right;
+}
+.ui-inputNum input[type='text'] {
+  border:none;
+  background:transparent;
+  display:inline-block;
+  padding-right:2px;
+}
+.ui-inputNum-btDec, .ui-inputNum-btInc {
+  border-style:solid;
+  border-width:1px;
+  cursor:pointer;
+  font-weight:bold;
+  width:14px;
+  margin-top:1px;
+  height:14px;
+  text-align:center;
+  display:inline-block;
+}
+.ui-inputNum-unit {
+  margin-right:4px;
+  display:inline-block;
+}
+
+div.ui-inputNum div.ui-slider {
+  cursor:pointer;
+}
+
+div.ui-inputNum div.ui-slider-horizontal {
+  height:13px;
+  margin:0px;
+  padding-right:13px;
+}
+
+div.ui-inputNum a.ui-slider-handle {
+  border-style:solid;
+  border-width:1px;
+  display:inline-block;
+  height:10px;
+  margin-top:1px;
+  outline:medium none;
+  position:relative;
+  width:10px;
+}
Index: /extensions/GrumPluginClasses/css/inputNum_clear.css
===================================================================
--- /extensions/GrumPluginClasses/css/inputNum_clear.css	(revision 8961)
+++ /extensions/GrumPluginClasses/css/inputNum_clear.css	(revision 8961)
@@ -0,0 +1,30 @@
+/* clear css */
+.ui-inputNum {
+  background:#DDDDDD;
+  border:1px solid #999999;
+  color:#666666;
+}
+
+.ui-inputNum-btDec, .ui-inputNum-btInc ,
+div.ui-inputNum a.ui-slider-handle {
+  background:none repeat scroll 0 0 #999999;
+  border-color:#DDDDDD #666666 #666666 #DDDDDD;
+  color:#005E89;
+}
+
+.ui-inputNum-btDec-active, .ui-inputNum-btInc-active {
+  border-color:#666666 #DDDDDD #DDDDDD #666666;
+}
+
+.ui-error, input[type='text'].ui-error {
+  background:#ff8080;
+  border-color:#800000;
+  color:#800000;
+}
+
+div.ui-inputNum div.ui-slider-horizontal {
+  background:none repeat scroll 0 0 #999999;
+}
+
+
+
Index: /extensions/GrumPluginClasses/css/inputNum_roma.css
===================================================================
--- /extensions/GrumPluginClasses/css/inputNum_roma.css	(revision 8961)
+++ /extensions/GrumPluginClasses/css/inputNum_roma.css	(revision 8961)
@@ -0,0 +1,29 @@
+
+/* roma css */
+
+.ui-inputNum {
+  background:#444444;
+  border:1px solid #666666;
+  color:#999999;
+}
+
+.ui-inputNum-btDec, .ui-inputNum-btInc ,
+div.ui-inputNum a.ui-slider-handle {
+  background:none repeat scroll 0 0 #666666;
+  border-color:#999999 #444444 #444444 #999999;
+  color:#ff3363;
+}
+
+.ui-inputNum-btDec-active, .ui-inputNum-btInc-active {
+  border-color:#444444 #999999 #999999 #444444;
+}
+
+.ui-error, input[type='text'].ui-error {
+  background:#ff8080;
+  border-color:#800000;
+  color:#800000;
+}
+
+div.ui-inputNum div.ui-slider-horizontal {
+  background:none repeat scroll 0 0 #666666;
+}
Index: /extensions/GrumPluginClasses/css/inputPosition.css
===================================================================
--- /extensions/GrumPluginClasses/css/inputPosition.css	(revision 8961)
+++ /extensions/GrumPluginClasses/css/inputPosition.css	(revision 8961)
@@ -0,0 +1,13 @@
+/* for inputPosition plugin */
+.ui-inputPosition {
+  cursor:default;
+}
+.ui-inputPosition div {
+  width:100%;
+  height:100%;
+}
+.ui-inputPosition input[type='radio'] {
+  border:none;
+  background:transparent;
+  position:absolute;
+}
Index: /extensions/GrumPluginClasses/css/inputPosition_clear.css
===================================================================
--- /extensions/GrumPluginClasses/css/inputPosition_clear.css	(revision 8961)
+++ /extensions/GrumPluginClasses/css/inputPosition_clear.css	(revision 8961)
@@ -0,0 +1,11 @@
+/* roma css */
+
+.ui-inputPosition {
+  border:1px dotted #666666;
+}
+
+.ui-error, input[type='text'].ui-error, textarea.ui-error {
+  background:#ff8080;
+  border-color:#800000;
+  color:#800000;
+}
Index: /extensions/GrumPluginClasses/css/inputPosition_roma.css
===================================================================
--- /extensions/GrumPluginClasses/css/inputPosition_roma.css	(revision 8961)
+++ /extensions/GrumPluginClasses/css/inputPosition_roma.css	(revision 8961)
@@ -0,0 +1,11 @@
+/* roma css */
+
+.ui-inputPosition {
+  border:1px dotted #444444;
+}
+
+.ui-error, input[type='text'].ui-error, textarea.ui-error {
+  background:#ff8080;
+  border-color:#800000;
+  color:#800000;
+}
Index: /extensions/GrumPluginClasses/css/inputStatusBar.css
===================================================================
--- /extensions/GrumPluginClasses/css/inputStatusBar.css	(revision 8961)
+++ /extensions/GrumPluginClasses/css/inputStatusBar.css	(revision 8961)
@@ -0,0 +1,14 @@
+/* for inputStatusBar plugin */
+.ui-inputStatusBar {
+  cursor:default;
+  padding:0px;
+  margin:0px;
+  border-collapse:collapse;
+  border-spacing:0;
+  width:100%;
+}
+
+.ui-inputStatusBar td {
+  border-right:1px solid;
+  overflow:hidden;
+}
Index: /extensions/GrumPluginClasses/css/inputStatusBar_clear.css
===================================================================
--- /extensions/GrumPluginClasses/css/inputStatusBar_clear.css	(revision 8961)
+++ /extensions/GrumPluginClasses/css/inputStatusBar_clear.css	(revision 8961)
@@ -0,0 +1,10 @@
+/* clear css */
+.ui-inputStatusBar {
+  border:1px solid #999999;
+  color:#666666;
+}
+
+.ui-inputStatusBar td {
+  border-color:#999999;
+  padding:2px;
+}
Index: /extensions/GrumPluginClasses/css/inputStatusBar_roma.css
===================================================================
--- /extensions/GrumPluginClasses/css/inputStatusBar_roma.css	(revision 8961)
+++ /extensions/GrumPluginClasses/css/inputStatusBar_roma.css	(revision 8961)
@@ -0,0 +1,10 @@
+/* roma css */
+.ui-inputStatusBar {
+  border:1px solid #666666;
+  color:#999999;
+}
+
+.ui-inputStatusBar td {
+  border-color:#666666;
+  padding:2px;
+}
Index: /extensions/GrumPluginClasses/css/inputText.css
===================================================================
--- /extensions/GrumPluginClasses/css/inputText.css	(revision 8961)
+++ /extensions/GrumPluginClasses/css/inputText.css	(revision 8961)
@@ -0,0 +1,12 @@
+/* for inputText plugin */
+.ui-inputText {
+  cursor:text;
+  padding:0px;
+}
+.ui-inputText input[type='text'], .ui-inputText textarea  {
+  border:none;
+  background:transparent;
+  display:inline-block;
+  padding-right:2px;
+}
+
Index: /extensions/GrumPluginClasses/css/inputText_clear.css
===================================================================
--- /extensions/GrumPluginClasses/css/inputText_clear.css	(revision 8961)
+++ /extensions/GrumPluginClasses/css/inputText_clear.css	(revision 8961)
@@ -0,0 +1,11 @@
+/* clear css */
+.ui-inputText {
+  background:#DDDDDD;
+  border:1px solid #999999;
+  color:#666666;
+}
+.ui-error, input[type='text'].ui-error, textarea.ui-error {
+  background:#ff8080;
+  border-color:#800000;
+  color:#800000;
+}
Index: /extensions/GrumPluginClasses/css/inputText_roma.css
===================================================================
--- /extensions/GrumPluginClasses/css/inputText_roma.css	(revision 8961)
+++ /extensions/GrumPluginClasses/css/inputText_roma.css	(revision 8961)
@@ -0,0 +1,11 @@
+/* roma css */
+.ui-inputText {
+  background:#444444;
+  border:1px solid #666666;
+  color:#999999;
+}
+.ui-error, input[type='text'].ui-error, textarea.ui-error {
+  background:#ff8080;
+  border-color:#800000;
+  color:#800000;
+}
Index: /extensions/GrumPluginClasses/css/tagSelector_roma.css
===================================================================
--- /extensions/GrumPluginClasses/css/tagSelector_roma.css	(revision 8960)
+++ /extensions/GrumPluginClasses/css/tagSelector_roma.css	(revision 8961)
@@ -59,2 +59,8 @@
   background:#666666;
 }
+
+.ui-error, input[type='text'].ui-error {
+  background:#ff8080;
+  border-color:#800000;
+  color:#800000;
+}
Index: /extensions/GrumPluginClasses/gpc_version.inc.php
===================================================================
--- /extensions/GrumPluginClasses/gpc_version.inc.php	(revision 8960)
+++ /extensions/GrumPluginClasses/gpc_version.inc.php	(revision 8961)
@@ -15,5 +15,5 @@
   if(!defined('PHPWG_ROOT_PATH')) die('Hacking attempt!');
 
-  if(!defined('GPC_VERSION')) define('GPC_VERSION',  '3.3.4');
-  if(!defined('GPC_VERSION2')) define('GPC_VERSION2', '03.03.04');
+  if(!defined('GPC_VERSION')) define('GPC_VERSION',  '3.4.0');
+  if(!defined('GPC_VERSION2')) define('GPC_VERSION2', '03.04.00');
 ?>
Index: tensions/GrumPluginClasses/js/genericjs.js
===================================================================
--- /extensions/GrumPluginClasses/js/genericjs.js	(revision 8960)
+++ 	(revision )
@@ -1,49 +1,0 @@
-/* -----------------------------------------------------------------------------
-  file: genericjs.js
-  file version: 1.0
-  date: 2008-01-02
-  ------------------------------------------------------------------------------
-  author: grum at grum.dnsalias.com
-  << May the Little SpaceFrog be with you >>
-  ------------------------------------------------------------------------------
-
-  this classes provides base functions to make easiest a compliant code with
-  FF2.0 & IE7.0 & IE8.0 !??
-
-
-  ------------------------------------------------------------------------------
-  HISTORY VERSION
-
-   -------------------------------------------------------------------------- */
-
-
-
-/*
-  this is an implementation of the function <indexOf> to the Array class, as
-  defined in the ECMA-262 standard
-  for more information, see at http://developer.mozilla.org/fr/docs/R%C3%A9f%C3%A9rence_de_JavaScript_1.5_Core:Objets_globaux:Array:indexOf
-
-  not implemented in IE 7.0
-*/
-if (!Array.prototype.indexOf)
-{
-  Array.prototype.indexOf = function(elt /*, from*/)
-  {
-    var len = this.length;
-
-    var from = Number(arguments[1]) || 0;
-    from = (from < 0)
-         ? Math.ceil(from)
-         : Math.floor(from);
-    if (from < 0)
-      from += len;
-
-    for (; from < len; from++)
-    {
-      if (from in this &&
-          this[from] === elt)
-        return from;
-    }
-    return -1;
-  };
-}
Index: /extensions/GrumPluginClasses/js/google_translate.js
===================================================================
--- /extensions/GrumPluginClasses/js/google_translate.js	(revision 8960)
+++ /extensions/GrumPluginClasses/js/google_translate.js	(revision 8961)
@@ -1,6 +1,6 @@
 /* -----------------------------------------------------------------------------
   file: google_translate.js
-  file version: 2.0.0
-  date: 2008-05-25
+  file version: 2.1.0
+  date: 2011-01-09
   ------------------------------------------------------------------------------
   author: grum at piwigo.org
@@ -12,4 +12,5 @@
   HISTORY VERSION
   v2.0.0  +
+  v2.1.0  + add googleTranslate function with callback parameter
   --------------------------------------------------------------------------- */
 
@@ -17,4 +18,5 @@
 
   var global_google_translate_plugin_objdest;
+  var global_google_translate_plugin_callback;
   var global_google_translate_plugin_objproperty;
 
@@ -40,2 +42,17 @@
     }
   }
+
+  function googleTranslate(text, pfrom, pto, callback)
+  {
+    global_google_translate_plugin_callback=callback;
+    google.language.translate(text, pfrom, pto, googleTranslateDo);
+  }
+
+  function googleTranslateDo(result)
+  {
+    if (!result.error)
+    {
+      global_google_translate_plugin_callback(result.translation);
+    }
+  }
+
Index: /extensions/GrumPluginClasses/js/google_translate.min.js
===================================================================
--- /extensions/GrumPluginClasses/js/google_translate.min.js	(revision 8961)
+++ /extensions/GrumPluginClasses/js/google_translate.min.js	(revision 8961)
@@ -0,0 +1,14 @@
+/* file: google_translate.js - v2.1.0 | minified on 2011/01/27 with http://jscompress.com/ */
+google.load("language","1");var global_google_translate_plugin_objdest;var global_google_translate_plugin_callback;var global_google_translate_plugin_objproperty;function google_translate(text,pfrom,pto,objdest,objproperty)
+{global_google_translate_plugin_objdest=objdest;global_google_translate_plugin_objproperty=objproperty;google.language.translate(text,pfrom,pto,google_translate_do);}
+function google_translate_do(result)
+{if(!result.error)
+{if(global_google_translate_plugin_objproperty=='value')
+{global_google_translate_plugin_objdest.value=result.translation;}
+else if(global_google_translate_plugin_objproperty=='innerHTML')
+{global_google_translate_plugin_objdest.innerHTML=result.translation;}}}
+function googleTranslate(text,pfrom,pto,callback)
+{global_google_translate_plugin_callback=callback;google.language.translate(text,pfrom,pto,googleTranslateDo);}
+function googleTranslateDo(result)
+{if(!result.error)
+{global_google_translate_plugin_callback(result.translation);}}
Index: /extensions/GrumPluginClasses/js/pagesNavigator.min.js
===================================================================
--- /extensions/GrumPluginClasses/js/pagesNavigator.min.js	(revision 8961)
+++ /extensions/GrumPluginClasses/js/pagesNavigator.min.js	(revision 8961)
@@ -0,0 +1,57 @@
+/* file: pageNavigator.js - v1.0.0 | minified on 2011/01/27 with http://jscompress.com/ */
+function pagesNavigator(container)
+{var itemsId={first:'iNavFirst',last:'iNavLast',previous:'iNavPrevious',next:'iNavNext',pageNumber:'iNavPage',morePrevious:'iNavPrevMore',moreNext:'iNavNextMore',container:container,},pages={num:0,current:1,},options={numberItem:0,itemPerPage:25,defaultPage:0,displayNumPage:7,displayFirst:true,displayLast:true,displayPrevious:true,displayNext:true,hideMode:'1,<',textFirst:'<<',textLast:'>>',textPrevious:'<',textNext:'>',textMore:'...',onPageChange:null,classActive:'',classInactive:'',classDisabled:'',};this.doAction=function(fct)
+{switch(fct)
+{case'setOptions':if(arguments.length==2)
+{setOptions(arguments[1]);}
+break;}};var calcNumPages=function(numItems,numPerPage)
+{return(Math.ceil(numItems/numPerPage));};var setOptions=function(optionsToSet)
+{if(typeof optionsToSet=='object')
+{options=jQuery.extend(options,optionsToSet);if(options.numberItem<=0)options.numberItem=0;if(options.itemPerPage<=0)options.itemPerPage=25;if(options.displayNumPage<=2)options.displayNumPage=8;pages.num=calcNumPages(options.numberItem,options.itemPerPage);if(options.defaultPage>0&&options.defaultPage<=pages.num)pages.current=options.defaultPage;build();}};var build=function()
+{re=/1/;if((re.exec(options.hideMode)==null)==false&&pages.num==1)
+{$('#'+itemsId.container).html('');return('');}
+var content="<ul id='"+container+"PageNavigator'>";styleLI=" list-style:none;float:left; ";re=/</;if((re.exec(options.hideMode)==null)==false&&pages.num<=options.displayNumPage)
+{hideFPNL='display:none;';}
+else
+{hideFPNL='';}
+pnClass="class='cPnInactive "+options.classInactive+"'";if(options.displayFirst)content+="<li style='"+styleLI+hideFPNL+"' id='"+itemsId.first+"' "+pnClass+">"+options.textFirst+"</li>";if(options.displayPrevious)content+="<li style='"+styleLI+hideFPNL+"' id='"+itemsId.previous+"' "+pnClass+">"+options.textPrevious+"</li>";content+="<li style='"+styleLI+"display:none;' id='"+itemsId.morePrevious+"' class='cPnDisabled "+options.classDisabled+"'>"+options.textMore+"</li>";for(i=1;i<=pages.num;i++)
+{content+="<li style='"+styleLI+"display:none;' id='"+itemsId.pageNumber+i+"' "+pnClass+">"+i+"</li>";}
+content+="<li style='"+styleLI+";display:none;' id='"+itemsId.moreNext+"' class='cPnDisabled "+options.classDisabled+"'>"+options.textMore+"</li>";if(options.displayNext)content+="<li style='"+styleLI+hideFPNL+"' id='"+itemsId.next+"' "+pnClass+">"+options.textNext+"</li>";if(options.displayLast)content+="<li style='"+styleLI+hideFPNL+"' id='"+itemsId.last+"' "+pnClass+">"+options.textLast+"</li>";content+="</ul>";$('#'+itemsId.container).css('visibility','hidden').html(content);$('.cPnInactive').bind('click',onChangePage);displayNav();$('#'+itemsId.container).css('visibility','visible');};var displayNav=function()
+{prev=Math.ceil((options.displayNumPage-1)/2);if(pages.current-prev<=0)
+{prev=pages.current-1;}
+next=options.displayNumPage-1-prev;if(pages.current+next>=pages.num)
+{prev+=(pages.current+next-pages.num);next=pages.num-pages.current;}
+prev=pages.current-prev;next=pages.current+next;if(prev>1)
+{$('#'+itemsId.morePrevious).css('display','block');}
+else
+{$('#'+itemsId.morePrevious).css('display','none');}
+if(next<pages.num)
+{$('#'+itemsId.moreNext).css('display','block');}
+else
+{$('#'+itemsId.moreNext).css('display','none');}
+$('#'+itemsId.container+' ul li').each(function()
+{id=-1;if(!(this.id==itemsId.first||this.id==itemsId.previous||this.id==itemsId.next||this.id==itemsId.last||this.id==itemsId.morePrevious||this.id==itemsId.moreNext))
+{re=/[0-9]*$/i;id=re.exec(this.id)[0];if(id>=prev&&id<=next)
+{$(this).css('display','block');}
+else
+{$(this).css('display','none');}
+if(id==pages.current)
+{$(this).addClass('cPnActive '+options.classActive).removeClass('cPnInactive '+options.classInactive);}
+else
+{$(this).addClass('cPnInactive '+options.classInactive).removeClass('cPnActive '+options.classActive);}}
+if(((this.id==itemsId.first||this.id==itemsId.previous)&&pages.current==1)||((this.id==itemsId.last||this.id==itemsId.next)&&pages.current==pages.num)||(this.id==itemsId.morePrevious||this.id==itemsId.moreNext))
+{$(this).addClass('cPnDisabled '+options.classDisabled).removeClass('cPnInactive '+options.classInactive);}
+else
+{$(this).addClass('cPnInactive '+options.classInactive).removeClass('cPnDisabled '+options.classDisabled);}});};var onChangePage=function(event)
+{if(event.target.id==itemsId.first)
+{pages.current=1;}
+else if(event.target.id==itemsId.previous)
+{pages.current--;}
+else if(event.target.id==itemsId.next)
+{pages.current++;}
+else if(event.target.id==itemsId.last)
+{pages.current=pages.num;}
+else
+{re=/[0-9]*$/i;page=re.exec(event.target.id)[0];if(page==pages.current)return(false);pages.current=eval(page);}
+if(pages.current<=0)pages.current=1;if(pages.current>=pages.num)pages.current=pages.num;displayNav();if(options.onPageChange!=null&&jQuery.isFunction(options.onPageChange))options.onPageChange(pages.current);};if(arguments.length==2)
+{setOptions(arguments[1]);}}
Index: tensions/GrumPluginClasses/js/pagesNavigator.packed.js
===================================================================
--- /extensions/GrumPluginClasses/js/pagesNavigator.packed.js	(revision 8960)
+++ 	(revision )
@@ -1,2 +1,0 @@
-/* file: pagesNavigator.js - v1.0.0 | packed on 2010/10/13 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}('q 1L(n){s 5={C:\'1P\',F:\'1N\',D:\'1u\',f:\'1A\',16:\'1y\',y:\'1Q\',v:\'1z\',n:n,},4={e:0,b:1,},3={N:0,K:17,M:0,u:7,1f:L,1p:L,1g:L,1a:L,V:\'1,<\',1e:\'&T;&T;\',1q:\'&13;&13;\',15:\'&T;\',1k:\'&13;\',Z:\'...\',J:I,X:\'\',z:\'\',B:\'\',};c.1C=q(1b){1x(1b){1s\'G\':a(H.1m==2){G(H[1])}1t}};s 19=q(1c,18){U(1h.1j(1c/18))};s G=q(11){a(1v 11==\'1D\'){3=1l.1S(3,11);a(3.N<=0)3.N=0;a(3.K<=0)3.K=17;a(3.u<=2)3.u=8;4.e=19(3.N,3.K);a(3.M>0&&3.M<=4.e)4.b=3.M;1d()}};s 1d=q(){o=/1/;a((o.Q(3.V)==I)==14&&4.e==1){$(\'#\'+5.n).1r(\'\');U(\'\')}s j="<Y 6=\'"+n+"1G\'>";l=" 1F-m:r;1H:1I; ";o=/</;a((o.Q(3.V)==I)==14&&4.e<=3.u){x=\'g:r;\'}h{x=\'\'}w="W=\'A "+3.z+"\'";a(3.1f)j+="<d m=\'"+l+x+"\' 6=\'"+5.C+"\' "+w+">"+3.1e+"</d>";a(3.1g)j+="<d m=\'"+l+x+"\' 6=\'"+5.D+"\' "+w+">"+3.15+"</d>";j+="<d m=\'"+l+"g:r;\' 6=\'"+5.y+"\' W=\'O "+3.B+"\'>"+3.Z+"</d>";1R(i=1;i<=4.e;i++){j+="<d m=\'"+l+"g:r;\' 6=\'"+5.16+i+"\' "+w+">"+i+"</d>"}j+="<d m=\'"+l+";g:r;\' 6=\'"+5.v+"\' W=\'O "+3.B+"\'>"+3.Z+"</d>";a(3.1a)j+="<d m=\'"+l+x+"\' 6=\'"+5.f+"\' "+w+">"+3.1k+"</d>";a(3.1p)j+="<d m=\'"+l+x+"\' 6=\'"+5.F+"\' "+w+">"+3.1q+"</d>";j+="</Y>";$(\'#\'+5.n).p(\'1n\',\'1E\').1r(j);$(\'.A\').1J(\'1O\',1o);10();$(\'#\'+5.n).p(\'1n\',\'1K\')};s 10=q(){k=1h.1j((3.u-1)/2);a(4.b-k<=0){k=4.b-1}f=3.u-1-k;a(4.b+f>=4.e){k+=(4.b+f-4.e);f=4.e-4.b}k=4.b-k;f=4.b+f;a(k>1){$(\'#\'+5.y).p(\'g\',\'12\')}h{$(\'#\'+5.y).p(\'g\',\'r\')}a(f<4.e){$(\'#\'+5.v).p(\'g\',\'12\')}h{$(\'#\'+5.v).p(\'g\',\'r\')}$(\'#\'+5.n+\' Y d\').1M(q(){6=-1;a(!(c.6==5.C||c.6==5.D||c.6==5.f||c.6==5.F||c.6==5.y||c.6==5.v)){o=/[0-9]*$/i;6=o.Q(c.6)[0];a(6>=k&&6<=f){$(c).p(\'g\',\'12\')}h{$(c).p(\'g\',\'r\')}a(6==4.b){$(c).R(\'1i \'+3.X).P(\'A \'+3.z)}h{$(c).R(\'A \'+3.z).P(\'1i \'+3.X)}}a(((c.6==5.C||c.6==5.D)&&4.b==1)||((c.6==5.F||c.6==5.f)&&4.b==4.e)||(c.6==5.y||c.6==5.v)){$(c).R(\'O \'+3.B).P(\'A \'+3.z)}h{$(c).R(\'A \'+3.z).P(\'O \'+3.B)}})};s 1o=q(t){a(t.E.6==5.C){4.b=1}h a(t.E.6==5.D){4.b--}h a(t.E.6==5.f){4.b++}h a(t.E.6==5.F){4.b=4.e}h{o=/[0-9]*$/i;S=o.Q(t.E.6)[0];a(S==4.b)U(14);4.b=1w(S)}a(4.b<=0)4.b=1;a(4.b>=4.e)4.b=4.e;10();a(3.J!=I&&1l.1B(3.J))3.J(4.b)};a(H.1m==2){G(H[1])}}',62,117,'|||options|pages|itemsId|id||||if|current|this|li|num|next|display|else||content|prev|styleLI|style|container|re|css|function|none|var|event|displayNumPage|moreNext|pnClass|hideFPNL|morePrevious|classInactive|cPnInactive|classDisabled|first|previous|target|last|setOptions|arguments|null|onPageChange|itemPerPage|true|defaultPage|numberItem|cPnDisabled|removeClass|exec|addClass|page|lt|return|hideMode|class|classActive|ul|textMore|displayNav|optionsToSet|block|gt|false|textPrevious|pageNumber|25|numPerPage|calcNumPages|displayNext|fct|numItems|build|textFirst|displayFirst|displayPrevious|Math|cPnActive|ceil|textNext|jQuery|length|visibility|onChangePage|displayLast|textLast|html|case|break|iNavPrevious|typeof|eval|switch|iNavPage|iNavNextMore|iNavNext|isFunction|doAction|object|hidden|list|PageNavigator|float|left|bind|visible|pagesNavigator|each|iNavLast|click|iNavFirst|iNavPrevMore|for|extend'.split('|'),0,{}))
Index: /extensions/GrumPluginClasses/js/rbCriteriaBuilder.js
===================================================================
--- /extensions/GrumPluginClasses/js/rbCriteriaBuilder.js	(revision 8960)
+++ /extensions/GrumPluginClasses/js/rbCriteriaBuilder.js	(revision 8961)
@@ -2,6 +2,6 @@
  * -----------------------------------------------------------------------------
  * file: criteriaBuilder.js
- * file version: 1.1.0
- * date: 2010-10-21
+ * file version: 1.1.1
+ * date: 2010-01-13
  *
  * JS file provided by the piwigo's plugin "GrumPluginClasses"
@@ -58,6 +58,6 @@
  * |         |            |   request
  * |         |            |
- * |         |            |
- * |         |            |
+ * | 1.1.1   | 2011/01/13 | * fix bug:2109
+ * |         |            |   . Incompatibility with IE8
  * |         |            |
  * |         |            |
@@ -354,5 +354,5 @@
   var serializeData=function(prefix, value)
   {
-    returned='';
+    var returned='';
     if(typeof value =='object')
     {
@@ -363,5 +363,5 @@
           returned+=serializeData(prefix+'['+key+']', value[key]);
         }
-        else
+        else if(typeof value[key] =='string' || typeof value[key] =='number' || typeof value[key] =='boolean')
         {
           returned+='&'+prefix+'['+key+']='+value[key];
@@ -369,5 +369,5 @@
       }
     }
-    else
+    else if(typeof value =='string' || typeof value =='number' || typeof value =='boolean')
     {
       returned+='&'+prefix+'='+value;
Index: /extensions/GrumPluginClasses/js/rbCriteriaBuilder.min.js
===================================================================
--- /extensions/GrumPluginClasses/js/rbCriteriaBuilder.min.js	(revision 8961)
+++ /extensions/GrumPluginClasses/js/rbCriteriaBuilder.min.js	(revision 8961)
@@ -0,0 +1,91 @@
+/* file: rbCriteriaBuilder.js - v1.1.1 | minified on 2011/01/27 with http://jscompress.com/ */
+function criteriaBuilder(container)
+{var itemsId={group:'iCbGroup',item:'iCbItem',container:container,},counters={group:0,item:0,},options={textAND:'AND',textOR:'OR',textNoCriteria:'There is no criteria ! At least, one criteria is required to do search...',textHint:'',textSomethingWrong:'An error has occured on the server-side',textCaddieUpdated:'Caddie was updated',classGroup:'',classItem:'',classOperator:'',classHelper:'helper',opacity:0.8,onEdit:null,onDelete:null,onRequestSuccess:null,onRequestError:null,onGetPageSuccess:null,onGetPageError:null,helpEditUrl:'',helpDeleteUrl:'',helpMove:'',helpSwitchCondition:'',ajaxUrl:'',},extraData=new Array();if(arguments.length==2)
+{if(typeof arguments[1]=='object')
+{options=jQuery.extend(options,arguments[1]);}}
+this.doAction=function(fct)
+{switch(fct)
+{case'add':if(arguments.length==3)
+{if(typeof arguments[1]=='string')
+{addItem(arguments[1],arguments[2]);}}
+break;case'delete':if(arguments.length==2)
+{if(typeof arguments[1]=='string')
+{deleteItem(arguments[1]);}}
+break;case'edit':if(arguments.length==4)
+{if(typeof arguments[1]=='string'&&typeof arguments[2]=='string')
+{editItem(arguments[1],arguments[2],arguments[3]);}}
+break;case'get':return(getItems());break;case'getExtraData':if(arguments.length==2)
+{return(getExtraData(arguments[1]));}
+else
+{return(null);}
+break;case'clear':clearItems();break;case'send':sendRequest();break;case'getPage':if(arguments.length==4)
+{getPage(arguments[1],arguments[2],arguments[3]);}
+break;case'setOptions':if(arguments.length==2)
+{return(setOptions(arguments[1]));}
+break;}};var addGroup=function(itemId)
+{counters.group++;var content="<li id='"+itemsId.group+counters.group+"' class='cbGroup cbSortable cbOpAND "+options.classGroup+" cbItemUnique'>";content+="<ul></ul></li>";$('#'+itemId).wrap(content);content="<div class='cbSortHandle' style='display:none;'>";content+="<div class='cbItemButtons' style='float:left;'>";content+="<div class='iconMove' id='iImgMoveItem"+counters.item+"' title=\""+options.helpMove+"\"></div>";content+="<div class='iconSwitchCondition' id='iImgSwitchCItem"+counters.item+"' title=\""+options.helpSwitchCondition+"\"></div>";content+="</div>";content+="<div id='"+itemsId.group+counters.group+"OpAND' class='"+options.classOperator+"' style='display:none;'>"+options.textAND+"</div>";content+="<div id='"+itemsId.group+counters.group+"OpOR' class='"+options.classOperator+"' style='display:none;'>"+options.textOR+"</div>";content+="</div>";$("#"+itemsId.group+counters.group).prepend(content);$('#'+itemsId.group+counters.group+'OpOR, #'+itemsId.group+counters.group+'OpAND, #'+itemsId.group+counters.group+' div.iconSwitchCondition ').bind('click',itemsId.group+counters.group,onSwitchOperator);applyNested();};var removeGroup=function(groupId)
+{$('#'+groupId).remove();};var addItem=function(itemContent,data)
+{counters.item++;var content="<li id='"+itemsId.item+counters.item+"' class='cbItem cbSortable "+options.classItem+"'>";content+="<div class='cbItemButtons' style='float:right;'>";if(options.onEdit!=null&&jQuery.isFunction(options.onEdit))content+="<div class='iconEdit' id='iImgEdit"+counters.item+"' title=\""+options.helpEdit+"\"></div>";if(options.onDelete!=null&&jQuery.isFunction(options.onDelete))content+="<div class='iconDelete' id='iImgDelete"+counters.item+"' title=\""+options.helpDelete+"\"></div>";content+="</div><div class='cbSortHandle'>";content+="<div class='cbItemButtons' style='float:left;'> <div class='iconMove' id='iImgMoveItem"+counters.item+"' title=\""+options.helpMove+"\"></div></div>";content+="<div class='itemContent'>"+itemContent+"</div></div></li>";$('#'+itemsId.container).append(content);addGroup(itemsId.item+counters.item);if(options.onEdit!=null)$('#iImgEdit'+counters.item).bind('click',itemsId.item+counters.item,options.onEdit);if(options.onDelete!=null)$('#iImgDelete'+counters.item).bind('click',itemsId.item+counters.item,options.onDelete);extraData[counters.item]=data;};var deleteItem=function(itemId)
+{if($('#'+itemId).length!=0)
+{$('#'+itemId).remove();re=/[0-9]*$/;extraData[eval(re.exec(itemId)[0])]=null;manage();}};var editItem=function(itemId,content,data)
+{if($('#'+itemId).length!=0)
+{$('#'+itemId+' .itemContent').html(content);re=/[0-9]*$/;extraData[eval(re.exec(itemId)[0])]=data;}};var clearItems=function()
+{$('#'+itemsId.container).NestedSortableDestroy();$('#'+itemsId.container).html("");counters.item=0;counters.group=0;extraData=new Array();};var serializeData=function(prefix,value)
+{var returned='';if(typeof value=='object')
+{for(var key in value)
+{if(typeof value[key]=='object')
+{returned+=serializeData(prefix+'['+key+']',value[key]);}
+else if(typeof value[key]=='string'||typeof value[key]=='number'||typeof value[key]=='boolean')
+{returned+='&'+prefix+'['+key+']='+value[key];}}}
+else if(typeof value=='string'||typeof value=='number'||typeof value=='boolean')
+{returned+='&'+prefix+'='+value;}
+return(returned);};var getItems=function()
+{serialized=jQuery.iNestedSortable.serialize(itemsId.container)['hash'];tmp=Array();for(i=0;i<extraData.length;i++)
+{if(extraData[i]!=null)
+{serialized+=serializeData('extraData['+i+']',extraData[i]);}}
+$('#'+itemsId.container+' .cbGroup').each(function()
+{re=/[0-9]*$/;serialized+='&operator['+re.exec(this.id)[0]+']=';if($(this).hasClass('cbOpOR'))
+{serialized+='OR';}
+else
+{serialized+='AND';}});return(serialized);};var getExtraData=function(itemId)
+{re=/[0-9]*$/;extraDataNumber=re.exec(itemId)[0];return(extraData[extraDataNumber]);};var setOptions=function(optionsToSet)
+{options=jQuery.extend(options,optionsToSet);};var displayOperator=function(groupId,visible)
+{if($('#'+groupId).hasClass('cbOpAND'))
+{if(visible)
+{$('#'+groupId+'OpAND').css('display','block');}
+else
+{$('#'+groupId+'OpAND').css('display','none');}}
+else
+{if(visible)
+{$('#'+groupId+'OpOR').css('display','block');}
+else
+{$('#'+groupId+'OpOR').css('display','none');}}
+if(visible)
+{$('#'+groupId).children('div.cbSortHandle').css('display','block');}
+else
+{$('#'+groupId).children('div.cbSortHandle').css('display','none');}};var manage=function()
+{$('#'+itemsId.container+' li').each(function()
+{if($(this).hasClass('cbGroup'))
+{if($('#'+this.id+' li.cbItem').length==0)
+{removeGroup(this.id);}
+else if($('#'+this.id+' li.cbItem').length==1)
+{$('#'+this.id).addClass('cbItemUnique').removeClass('cbItemMultiple');displayOperator(this.id,false);}
+else
+{$('#'+this.id).removeClass('cbItemUnique').addClass('cbItemMultiple');displayOperator(this.id,true);}}
+else if($(this).hasClass('cbItem'))
+{if($(this).parent().get(0).id==itemsId.container)
+{addGroup(this.id);}}});};var applyNested=function()
+{$('#'+itemsId.container).NestedSortableDestroy();$('#'+itemsId.container).NestedSortable({accept:'cbSortable',noNestingClass:'cbItem',opacity:options.opacity,helperclass:options.classHelper,serializeRegExp:/.*/i,autoScroll:true,handle:'.cbSortHandle',ghosting:false,nestingPxSpace:15,currentNestingClass:'cbItemOverGroup',onChange:function(serialized){manage();},});};onSwitchOperator=function(event)
+{groupId=event.data;if($('#'+groupId).hasClass('cbOpAND'))
+{$('#'+groupId).removeClass('cbOpAND').addClass('cbOpOR');$('#'+groupId+'OpAND').css('display','none');$('#'+groupId+'OpOR').css('display','block');}
+else
+{$('#'+groupId).removeClass('cbOpOR').addClass('cbOpAND');$('#'+groupId+'OpAND').css('display','block');$('#'+groupId+'OpOR').css('display','none');}};var sendRequest=function()
+{if(extraData.length==0)
+{alert(options.textNoCriteria);return(false);}
+datas=encodeURI('ajaxfct=public.rbuilder.searchExecute&requestName='+itemsId.container+'&'+getItems());$.ajax({type:"POST",url:options.ajaxUrl,async:true,data:datas,success:function(msg)
+{if(options.onRequestSuccess!=null&&jQuery.isFunction(options.onRequestSuccess))options.onRequestSuccess(msg);},error:function(msg)
+{if(options.onRequestError!=null&&jQuery.isFunction(options.onRequestError))options.onRequestError(msg);},});};var getPage=function(requestNumber,pageNumber,numberPerPage)
+{$.ajax({type:"POST",url:options.ajaxUrl,async:true,data:{ajaxfct:'public.rbuilder.searchGetPage',page:pageNumber,requestNumber:requestNumber,numPerPage:numberPerPage},success:function(msg)
+{if(options.onGetPageSuccess!=null&&jQuery.isFunction(options.onGetPageSuccess))options.onGetPageSuccess(msg);},error:function(msg)
+{if(options.onGetPageError!=null&&jQuery.isFunction(options.onGetPageError))options.onGetPageError(msg);},});};applyNested();};criteriaBuilder.makeExtendedData=function(owner,data)
+{return({owner:owner,param:data,});}
Index: tensions/GrumPluginClasses/js/rbCriteriaBuilder.packed.js
===================================================================
--- /extensions/GrumPluginClasses/js/rbCriteriaBuilder.packed.js	(revision 8960)
+++ 	(revision )
@@ -1,2 +1,0 @@
-/* file: rbCriteriaBuilder.packed.js - v1.1.0 | packed on 2010/10/21 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}('a 26(o){h d={f:\'2H\',g:\'2G\',o:o,},b={f:0,g:0,},5={23:\'1E\',1W:\'1D\',27:\'2I 1X 2J 1Y ! 2K 2F, 2E 1Y 1X 2z 2y 2A 2B...\',2D:\'\',2C:\'2L 1l 2M 2V 2U 2W 2X-2Y\',2x:\'2S 2O 2N\',25:\'\',21:\'\',1y:\'\',2c:\'2P\',1p:0.8,Q:l,T:l,16:l,13:l,17:l,14:l,2Q:\'\',2R:\'\',1a:\'\',24:\'\',1d:\'\',},t=1T 1n();6(c.q==2){6(D c[1]==\'1b\'){5=v.2j(5,c[1])}}n.2Z=a(2p){2w(2p){x\'2s\':6(c.q==3){6(D c[1]==\'V\'){22(c[1],c[2])}}y;x\'2q\':6(c.q==2){6(D c[1]==\'V\'){1J(c[1])}}y;x\'2r\':6(c.q==4){6(D c[1]==\'V\'&&D c[2]==\'V\'){1O(c[1],c[2],c[3])}}y;x\'2n\':z(1v());y;x\'1g\':6(c.q==2){z(1g(c[1]))}r{z(l)}y;x\'2u\':1A();y;x\'2t\':1L();y;x\'18\':6(c.q==4){18(c[1],c[2],c[3])}y;x\'1h\':6(c.q==2){z(1h(c[1]))}y}};h 19=a(s){b.f++;h e="<F j=\'"+d.f+b.f+"\' m=\'1k 1c N "+5.25+" 1e\'>";e+="<28></28></F>";$(\'#\'+s).3o(e);e="<7 m=\'S\' I=\'p:B;\'>";e+="<7 m=\'1m\' I=\'1f:1U;\'>";e+="<7 m=\'1S\' j=\'1P"+b.g+"\' U=\\""+5.1a+"\\"></7>";e+="<7 m=\'20\' j=\'3n"+b.g+"\' U=\\""+5.24+"\\"></7>";e+="</7>";e+="<7 j=\'"+d.f+b.f+"H\' m=\'"+5.1y+"\' I=\'p:B;\'>"+5.23+"</7>";e+="<7 j=\'"+d.f+b.f+"K\' m=\'"+5.1y+"\' I=\'p:B;\'>"+5.1W+"</7>";e+="</7>";$("#"+d.f+b.f).3m(e);$(\'#\'+d.f+b.f+\'K, #\'+d.f+b.f+\'H, #\'+d.f+b.f+\' 7.20 \').1u(\'1q\',d.f+b.f,29);1i()};h 2f=a(k){$(\'#\'+k).1R()};h 22=a(10,w){b.g++;h e="<F j=\'"+d.g+b.g+"\' m=\'R 1c "+5.21+"\'>";e+="<7 m=\'1m\' I=\'1f:3j;\'>";6(5.Q!=l&&v.L(5.Q))e+="<7 m=\'3k\' j=\'2e"+b.g+"\' U=\\""+5.3l+"\\"></7>";6(5.T!=l&&v.L(5.T))e+="<7 m=\'3r\' j=\'1G"+b.g+"\' U=\\""+5.3y+"\\"></7>";e+="</7><7 m=\'S\'>";e+="<7 m=\'1m\' I=\'1f:1U;\'> <7 m=\'1S\' j=\'1P"+b.g+"\' U=\\""+5.1a+"\\"></7></7>";e+="<7 m=\'10\'>"+10+"</7></7></F>";$(\'#\'+d.o).3w(e);19(d.g+b.g);6(5.Q!=l)$(\'#2e\'+b.g).1u(\'1q\',d.g+b.g,5.Q);6(5.T!=l)$(\'#1G\'+b.g).1u(\'1q\',d.g+b.g,5.T);t[b.g]=w};h 1J=a(s){6($(\'#\'+s).q!=0){$(\'#\'+s).1R();C=/[0-9]*$/;t[1M(C.11(s)[0])]=l;1w()}};h 1O=a(s,e,w){6($(\'#\'+s).q!=0){$(\'#\'+s+\' .10\').1z(e);C=/[0-9]*$/;t[1M(C.11(s)[0])]=w}};h 1A=a(){$(\'#\'+d.o).2o();$(\'#\'+d.o).1z("");b.g=0;b.f=0;t=1T 1n()};h 1j=a(Z,G){O=\'\';6(D G==\'1b\'){1C(h J 3v G){6(D G[J]==\'1b\'){O+=1j(Z+\'[\'+J+\']\',G[J])}r{O+=\'&\'+Z+\'[\'+J+\']=\'+G[J]}}}r{O+=\'&\'+Z+\'=\'+G}z(O)};h 1v=a(){E=v.3t.3i(d.o)[\'3h\'];36=1n();1C(i=0;i<t.q;i++){6(t[i]!=l){E+=1j(\'t[\'+i+\']\',t[i])}}$(\'#\'+d.o+\' .1k\').1V(a(){C=/[0-9]*$/;E+=\'&37[\'+C.11(n.j)[0]+\']=\';6($(n).P(\'1s\')){E+=\'1D\'}r{E+=\'1E\'}});z(E)};h 1g=a(s){C=/[0-9]*$/;2i=C.11(s)[0];z(t[2i])};h 1h=a(2k){5=v.2j(5,2k)};h 1o=a(k,W){6($(\'#\'+k).P(\'N\')){6(W){$(\'#\'+k+\'H\').u(\'p\',\'M\')}r{$(\'#\'+k+\'H\').u(\'p\',\'B\')}}r{6(W){$(\'#\'+k+\'K\').u(\'p\',\'M\')}r{$(\'#\'+k+\'K\').u(\'p\',\'B\')}}6(W){$(\'#\'+k).2g(\'7.S\').u(\'p\',\'M\')}r{$(\'#\'+k).2g(\'7.S\').u(\'p\',\'B\')}};h 1w=a(){$(\'#\'+d.o+\' F\').1V(a(){6($(n).P(\'1k\')){6($(\'#\'+n.j+\' F.R\').q==0){2f(n.j)}r 6($(\'#\'+n.j+\' F.R\').q==1){$(\'#\'+n.j).Y(\'1e\').X(\'2m\');1o(n.j,1t)}r{$(\'#\'+n.j).X(\'1e\').Y(\'2m\');1o(n.j,12)}}r 6($(n).P(\'R\')){6($(n).31().2n(0).j==d.o){19(n.j)}}})};h 1i=a(){$(\'#\'+d.o).2o();$(\'#\'+d.o).32({33:\'1c\',38:\'R\',1p:5.1p,39:5.2c,3f:/.*/i,3e:12,3d:\'.S\',3a:1t,3b:15,3q:\'3c\',3g:a(E){1w()},})};29=a(2a){k=2a.w;6($(\'#\'+k).P(\'N\')){$(\'#\'+k).X(\'N\').Y(\'1s\');$(\'#\'+k+\'H\').u(\'p\',\'B\');$(\'#\'+k+\'K\').u(\'p\',\'M\')}r{$(\'#\'+k).X(\'1s\').Y(\'N\');$(\'#\'+k+\'H\').u(\'p\',\'M\');$(\'#\'+k+\'K\').u(\'p\',\'B\')}};h 1L=a(){6(t.q==0){3p(5.27);z(1t)}1Z=3s(\'1N=1Q.1B.35&34=\'+d.o+\'&\'+1v());$.2l({2d:"2h",2b:5.1d,1F:12,w:1Z,1I:a(A){6(5.16!=l&&v.L(5.16))5.16(A)},1l:a(A){6(5.13!=l&&v.L(5.13))5.13(A)},})};h 18=a(1x,1H,1K){$.2l({2d:"2h",2b:5.1d,1F:12,w:{1N:\'1Q.1B.3u\',3x:1H,1x:1x,30:1K},1I:a(A){6(5.17!=l&&v.L(5.17))5.17(A)},1l:a(A){6(5.14!=l&&v.L(5.14))5.14(A)},})};1i()};26.2T=a(1r,w){z({1r:1r,2v:w,})}',62,221,'|||||options|if|div|||function|counters|arguments|itemsId|content|group|item|var||id|groupId|null|class|this|container|display|length|else|itemId|extraData|css|jQuery|data|case|break|return|msg|none|re|typeof|serialized|li|value|OpAND|style|key|OpOR|isFunction|block|cbOpAND|returned|hasClass|onEdit|cbItem|cbSortHandle|onDelete|title|string|visible|removeClass|addClass|prefix|itemContent|exec|true|onRequestError|onGetPageError||onRequestSuccess|onGetPageSuccess|getPage|addGroup|helpMove|object|cbSortable|ajaxUrl|cbItemUnique|float|getExtraData|setOptions|applyNested|serializeData|cbGroup|error|cbItemButtons|Array|displayOperator|opacity|click|owner|cbOpOR|false|bind|getItems|manage|requestNumber|classOperator|html|clearItems|rbuilder|for|OR|AND|async|iImgDelete|pageNumber|success|deleteItem|numberPerPage|sendRequest|eval|ajaxfct|editItem|iImgMoveItem|public|remove|iconMove|new|left|each|textOR|is|criteria|datas|iconSwitchCondition|classItem|addItem|textAND|helpSwitchCondition|classGroup|criteriaBuilder|textNoCriteria|ul|onSwitchOperator|event|url|classHelper|type|iImgEdit|removeGroup|children|POST|extraDataNumber|extend|optionsToSet|ajax|cbItemMultiple|get|NestedSortableDestroy|fct|delete|edit|add|send|clear|param|switch|textCaddieUpdated|to|required|do|search|textSomethingWrong|textHint|one|least|iCbItem|iCbGroup|There|no|At|An|has|updated|was|helper|helpEditUrl|helpDeleteUrl|Caddie|makeExtendedData|on|occured|the|server|side|doAction|numPerPage|parent|NestedSortable|accept|requestName|searchExecute|tmp|operator|noNestingClass|helperclass|ghosting|nestingPxSpace|cbItemOverGroup|handle|autoScroll|serializeRegExp|onChange|hash|serialize|right|iconEdit|helpEdit|prepend|iImgSwitchCItem|wrap|alert|currentNestingClass|iconDelete|encodeURI|iNestedSortable|searchGetPage|in|append|page|helpDelete'.split('|'),0,{}))
Index: /extensions/GrumPluginClasses/js/rbSearch.min.js
===================================================================
--- /extensions/GrumPluginClasses/js/rbSearch.min.js	(revision 8961)
+++ /extensions/GrumPluginClasses/js/rbSearch.min.js	(revision 8961)
@@ -0,0 +1,37 @@
+/* file: rbSearch.js - v1.0.0 | minified on 2011/01/27 with http://jscompress.com/ */
+var cb=null;var interfaceManager=function(optionsToSet)
+{var pn=null,requestNumber=0,options={requestCriterionsVisible:'',requestCriterionsHidden:'',requestResult:'',requestResultContent:'',requestResultNfo:'',requestResultPagesNavigator:'',requestResultRequestNumber:0,onPageChange:null,numberPerPage:30,};this.doAction=function(fct)
+{switch(fct)
+{case'queryResult':if(arguments.length==3)
+{displayQueryResult(arguments[1],arguments[2]);}
+break;case'queryPage':if(arguments.length==3)
+{displayQueryPage(arguments[1],arguments[2]);}
+break;case'show':if(arguments.length==2)
+{show(arguments[1]);}
+break;case'setOptions':if(arguments.length==2)
+{setOptions(arguments[1]);}
+break;case'fillCaddie':if(arguments.length==2)
+{fillCaddie(arguments[1],this.getRequestNumber());}
+break;}};this.getRequestNumber=function()
+{return(requestNumber);};this.getNumberPerPage=function()
+{return(options.numberPerPage);};var show=function(mode)
+{switch(mode)
+{case'buildQuery':$('.'+options.requestCriterionsVisible).css('display','block');$('.'+options.requestCriterionsHidden).css('display','none');$('.'+options.requestResult).css('display','none');break;case'resultQuery':$('#iResultQueryContent').html("<br><img class='waitingResult' src='./plugins/GrumPluginClasses/icons/processing.gif'>");$('.'+options.requestCriterionsVisible).css('display','none');$('.'+options.requestCriterionsHidden).css('display','block');$('.'+options.requestResult).css('display','block');break;}},displayQueryResult=function(isSuccess,nfo)
+{if(isSuccess)
+{nfo=nfo.split(';');requestNumber=nfo[0];$('#iResultQueryNfo').html(nfo[1]);pn.doAction('setOptions',{numberItem:nfo[1],defaultPage:1});show('resultQuery');}
+else
+{show('buildQuery');alert(requestBuilderOptions.textSomethingWrong);}},displayQueryPage=function(isSuccess,nfo)
+{if(isSuccess)
+{$('#iResultQueryContent').html(nfo);}
+else
+{alert(requestBuilderOptions.textSomethingWrong);}},setOptions=function(optionsToSet)
+{if(typeof optionsToSet=='object')
+{options=jQuery.extend(options,optionsToSet);}},init=function(optionsToSet)
+{setOptions(optionsToSet);pn=new pagesNavigator(options.requestResultPagesNavigator,{itemPerPage:options.numberPerPage,displayNumPage:9,classActive:'pnActive',classInactive:'pnInactive',onPageChange:function(page)
+{if(options.onPageChange!=null&&jQuery.isFunction(options.onPageChange))
+{options.onPageChange(requestNumber,page,options.numberPerPage);}},});requestNumber=options.requestResultRequestNumber;},fillCaddie=function(mode,requestNumber)
+{$('#iMenuCaddieImg').css('display','inline-block');$('#iMenuCaddieItems ul').css('display','none');$.ajax({type:"POST",url:"plugins/GrumPluginClasses/gpc_ajax.php",async:true,data:{ajaxfct:"admin.rbuilder.fillCaddie",fillMode:mode,requestNumber:requestNumber},success:function(msg)
+{$('#iMenuCaddieImg').css('display','none');$('#iMenuCaddieItems ul').css('display','block');alert(requestBuilderOptions.textCaddieUpdated);},error:function(msg)
+{$('#iMenuCaddieImg').css('display','none');$('#iMenuCaddieItems ul').css('display','block');alert(requestBuilderOptions.textSomethingWrong);},});};init(optionsToSet);};function init()
+{im=new interfaceManager({requestCriterionsVisible:'cRequestCriterions',requestCriterionsHidden:'cModifyRequest',requestResult:'cResultQuery',requestResultContent:'iResultQueryContent',requestResultNfo:'iResultQueryNfo',requestResultPagesNavigator:'iPagesNavigator',});requestBuilderOptions.classGroup='gcBorderInput gcTextInput';requestBuilderOptions.classItem='gcBgInput gcTextInput';requestBuilderOptions.classOperator='cbOperator cbOperatorBg gcLinkHover';requestBuilderOptions.onRequestSuccess=function(msg){im.doAction('queryResult',true,msg);cb.doAction('getPage',im.getRequestNumber(),1,im.getNumberPerPage());};requestBuilderOptions.onRequestError=function(msg){im.doAction('queryResult',false,msg);};requestBuilderOptions.onGetPageSuccess=function(msg){im.doAction('queryPage',true,msg);};requestBuilderOptions.onGetPageError=function(msg){im.doAction('queryPage',false,msg);};cb=new criteriaBuilder('iListSelectedCriterions',requestBuilderOptions);im.doAction('setOptions',{onPageChange:function(requestNumber,page,numberPerPage)
+{$('#iResultQueryContent').html("<br><img class='waitingResult' src='./plugins/GrumPluginClasses/icons/processing.gif'>");cb.doAction('getPage',requestNumber,page,numberPerPage);}});}
Index: tensions/GrumPluginClasses/js/rbSearch.packed.js
===================================================================
--- /extensions/GrumPluginClasses/js/rbSearch.packed.js	(revision 8960)
+++ 	(revision )
@@ -1,2 +1,0 @@
-/* file: rbSearch.packed.js - v1.0.0 | packed on 2010/10/23 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}('E B=C;E 1e=4(h){E G=C,b=0,5={u:\'\',v:\'\',D:\'\',1d:\'\',17:\'\',H:\'\',U:0,m:C,o:1m,};w.d=4(1b){1f(1b){j\'O\':e(8.q==3){1h(8[1],8[2])}i;j\'S\':e(8.q==3){11(8[1],8[2])}i;j\'p\':e(8.q==2){p(8[1])}i;j\'l\':e(8.q==2){l(8[1])}i;j\'s\':e(8.q==2){s(8[1],w.P())}i}};w.P=4(){1c(b)};w.12=4(){1c(5.o)};E p=4(r){1f(r){j\'13\':$(\'.\'+5.u).7(\'a\',\'n\');$(\'.\'+5.v).7(\'a\',\'k\');$(\'.\'+5.D).7(\'a\',\'k\');i;j\'T\':$(\'#x\').y("<14><10 Z=\'1g\' 1i=\'./Q/R/19/1a.15\'>");$(\'.\'+5.u).7(\'a\',\'k\');$(\'.\'+5.v).7(\'a\',\'n\');$(\'.\'+5.D).7(\'a\',\'n\');i}},1h=4(z,f){e(z){f=f.1s(\';\');b=f[0];$(\'#16\').y(f[1]);G.d(\'l\',{1r:f[1],1t:1});p(\'T\')}Y{p(\'13\');t(6.K)}},11=4(z,f){e(z){$(\'#x\').y(f)}Y{t(6.K)}},l=4(h){e(1q h==\'1u\'){5=W.1v(5,h)}},F=4(h){l(h);G=N 1w(5.H,{1y:5.o,1n:9,1k:\'1j\',1l:\'1p\',m:4(A){e(5.m!=C&&W.1F(5.m)){5.m(b,A,5.o)}},});b=5.U},s=4(r,b){$(\'#I\').7(\'a\',\'1W-n\');$(\'#L J\').7(\'a\',\'k\');$.1z({1V:"1U",1R:"Q/R/1S.1T",1Z:M,21:{25:"24.22.s",20:r,b:b},1Y:4(c){$(\'#I\').7(\'a\',\'k\');$(\'#L J\').7(\'a\',\'n\');t(6.1P)},1Q:4(c){$(\'#I\').7(\'a\',\'k\');$(\'#L J\').7(\'a\',\'n\');t(6.K)},})};F(h)};4 F(){g=N 1e({u:\'1C\',v:\'1I\',D:\'1O\',1d:\'x\',17:\'16\',H:\'1M\',});6.1L=\'1J 18\';6.1K=\'1X 18\';6.1N=\'1H 1B 1A\';6.1D=4(c){g.d(\'O\',M,c);B.d(\'X\',g.P(),1,g.12())};6.1E=4(c){g.d(\'O\',V,c)};6.1G=4(c){g.d(\'S\',M,c)};6.23=4(c){g.d(\'S\',V,c)};B=N 1o(\'1x\',6);g.d(\'l\',{m:4(b,A,o){$(\'#x\').y("<14><10 Z=\'1g\' 1i=\'./Q/R/19/1a.15\'>");B.d(\'X\',b,A,o)}})}',62,130,'||||function|options|requestBuilderOptions|css|arguments||display|requestNumber|msg|doAction|if|nfo|im|optionsToSet|break|case|none|setOptions|onPageChange|block|numberPerPage|show|length|mode|fillCaddie|alert|requestCriterionsVisible|requestCriterionsHidden|this|iResultQueryContent|html|isSuccess|page|cb|null|requestResult|var|init|pn|requestResultPagesNavigator|iMenuCaddieImg|ul|textSomethingWrong|iMenuCaddieItems|true|new|queryResult|getRequestNumber|plugins|GrumPluginClasses|queryPage|resultQuery|requestResultRequestNumber|false|jQuery|getPage|else|class|img|displayQueryPage|getNumberPerPage|buildQuery|br|gif|iResultQueryNfo|requestResultNfo|gcTextInput|icons|processing|fct|return|requestResultContent|interfaceManager|switch|waitingResult|displayQueryResult|src|pnActive|classActive|classInactive|30|displayNumPage|criteriaBuilder|pnInactive|typeof|numberItem|split|defaultPage|object|extend|pagesNavigator|iListSelectedCriterions|itemPerPage|ajax|gcLinkHover|cbOperatorBg|cRequestCriterions|onRequestSuccess|onRequestError|isFunction|onGetPageSuccess|cbOperator|cModifyRequest|gcBorderInput|classItem|classGroup|iPagesNavigator|classOperator|cResultQuery|textCaddieUpdated|error|url|gpc_ajax|php|POST|type|inline|gcBgInput|success|async|fillMode|data|rbuilder|onGetPageError|admin|ajaxfct'.split('|'),0,{}))
Index: /extensions/GrumPluginClasses/js/simpleTip.js
===================================================================
--- /extensions/GrumPluginClasses/js/simpleTip.js	(revision 8960)
+++ /extensions/GrumPluginClasses/js/simpleTip.js	(revision 8961)
@@ -2,6 +2,6 @@
  * -----------------------------------------------------------------------------
  * file: simpleTip.js
- * file version: 1.0.0
- * date: 2010-07-10
+ * file version: 1.0.1
+ * date: 2010-12-23
  *
  * JS file provided by the piwigo's plugin "GrumPluginClasses"
@@ -30,7 +30,7 @@
  *
  * | release | date       |
- * | 1.0.0   | 2010/07/10 | start to coding
+ * | 1.0.0   | 2010-07-10 | start to coding
  * |         |            |
- * |         |            |
+ * | 1.0.1   | 2010-12-23 | fix minor bugs
  * |         |            |
  * |         |            |
@@ -70,7 +70,7 @@
       offsetY:0,
       classes:'',
-      arrowImgDir: './plugins/GrumPluginClasses/icons/',
+      arrowImgDir: '',
       arrowWidth: 12,
-      arrowHeight: 12,
+      arrowHeight: 12
     },
     options
@@ -84,5 +84,5 @@
       itemIndexInc = 0,
       options={
-          name:'',
+          name:''
         };
 
@@ -150,5 +150,5 @@
           {
            title: '',
-           simpleTip: tip.index,
+           simpleTip: tip.index
           }
         )
@@ -253,5 +253,5 @@
           left: '-1500px',
           top:  '-1500px',
-          display: 'block',
+          display: 'block'
         }
       );
@@ -306,8 +306,8 @@
 
 
-    stWidth=$('#iSimpleTip').outerWidth();
-    stHeight=$('#iSimpleTip').outerHeight();
-    stWidthI=$('#iSimpleTip').innerWidth();
-    stHeightI=$('#iSimpleTip').innerHeight();
+    stWidth=$('#iSimpleTipContent'+options.name).outerWidth();
+    stHeight=$('#iSimpleTipContent'+options.name).outerHeight();
+    stWidthI=$('#iSimpleTipContent'+options.name).innerWidth();
+    stHeightI=$('#iSimpleTipContent'+options.name).innerHeight();
     bwX=(stWidth-stWidthI)/2;
     bwY=(stHeight-stHeightI)/2;
@@ -321,5 +321,5 @@
         y+=items[itemIndex].options.offsetY;
         arrowX=-bwX;
-        arrowY=-10-bwY;
+        arrowY=-items[itemIndex].options.arrowHeight+bwY;
         arrowModel='up';
         break;
@@ -328,6 +328,6 @@
         x-=stWidth/2;
         y+=items[itemIndex].options.offsetY;
-        arrowX=(stWidthI-10)/2;
-        arrowY=-10-bwY;
+        arrowX=(stWidthI-items[itemIndex].options.arrowWidth)/2;
+        arrowY=-items[itemIndex].options.arrowHeight+bwY;
         arrowModel='up';
         break;
@@ -336,13 +336,14 @@
         x-=stWidth+items[itemIndex].options.offsetX;
         y+=items[itemIndex].options.offsetY;
-        arrowX=stWidthI-10+bwX;
-        arrowY=-10-bwY;
+        arrowX=stWidthI-items[itemIndex].options.arrowWidth+bwX;
+        arrowY=-items[itemIndex].options.arrowHeight+bwY;
         arrowModel='up';
         break;
 
       case 'middle-left':
+        x+=items[itemIndex].options.offsetX;
         y-=stHeight/2;
-        arrowX=-10-bwX;
-        arrowY=(stHeightI-10)/2;
+        arrowX=-items[itemIndex].options.arrowWidth+bwX;
+        arrowY=(stHeightI-items[itemIndex].options.arrowHeight)/2+bwY;
         arrowModel='left';
         break;
@@ -357,9 +358,10 @@
         y-=stHeight/2;
         arrowX=stWidthI+bwX;
-        arrowY=(stHeightI-10)/2;
+        arrowY=(stHeightI-items[itemIndex].options.arrowHeight)/2+bwY;
         arrowModel='right';
         break;
 
       case 'bottom-left':
+        x+=items[itemIndex].options.offsetX;
         y-=stHeight+items[itemIndex].options.offsetY;
         arrowX=-bwX;
@@ -371,5 +373,5 @@
         x-=stWidth/2;
         y-=stHeight+items[itemIndex].options.offsetY;
-        arrowX=(stWidthI-10)/2;
+        arrowX=(stWidthI-items[itemIndex].options.arrowWidth)/2+bwX;
         arrowY=stHeightI+bwY;
         arrowModel='down';
@@ -379,5 +381,5 @@
         x-=stWidth+items[itemIndex].options.offsetX;
         y-=stHeight+items[itemIndex].options.offsetY;
-        arrowX=stWidthI-10+bwX;
+        arrowX=stWidthI-items[itemIndex].options.arrowWidth+bwX;
         arrowY=stHeightI+bwY;
         arrowModel='down';
@@ -394,5 +396,5 @@
           marginTop: arrowY+'px',
           width: items[itemIndex].options.arrowWidth+'px',
-          height: items[itemIndex].options.arrowHeight+'px',
+          height: items[itemIndex].options.arrowHeight+'px'
         }
       );
@@ -409,5 +411,5 @@
           left: x+'px',
           top:  y+'px',
-          display: 'none',
+          display: 'none'
         }
       )
Index: /extensions/GrumPluginClasses/js/simpleTip.min.js
===================================================================
--- /extensions/GrumPluginClasses/js/simpleTip.min.js	(revision 8961)
+++ /extensions/GrumPluginClasses/js/simpleTip.min.js	(revision 8961)
@@ -0,0 +1,44 @@
+/* file: simpleTip.js - v1.0.1 | minified on 2011/01/27 with http://jscompress.com/ */
+function tipItem(item,index,options)
+{this.item=item;this.content=item.title;this.index=index;this.options=jQuery.extend({targetPos:'bottom-middle',tipPos:'top-middle',drawArrow:false,offsetX:0,offsetY:0,classes:'',arrowImgDir:'',arrowWidth:12,arrowHeight:12},options);}
+function simpleTip()
+{var items=new Array(),itemIndexInc=0,options={name:''};if(arguments.length>=1)
+{options.name=arguments[0];}
+this.doAction=function(fct)
+{switch(fct)
+{case'add':if(arguments.length==2)
+{add(arguments[1],{});}
+else
+{add(arguments[1],arguments[2]);}
+break;case'remove':if(arguments.length==2)
+{remove(arguments[1]);}
+break;case'clear':clear();break;case'hide':hide();break;case'show':show();break;case'prepare':if(arguments.length==4)
+{prepare(arguments[1],arguments[2],arguments[3]);}
+break;}};var add=function(item,options)
+{index=getIndex(item);if(index==-1&item.title!='')
+{tip=new tipItem(item,itemIndexInc,options);$(item).attr({title:'',simpleTip:tip.index}).bind('mouseover',{index:tip.index},function(event)
+{prepare($(this).offset().left,$(this).offset().top,$(this).innerWidth(),$(this).innerHeight(),event.data.index);show();}).bind('mouseout',function(event)
+{hide();});items.push(tip);itemIndexInc++;}};var remove=function(item)
+{index=getIndex(item);if(index!=-1)
+{$(item).attr({title:items[index].content,simpleTip:''}).unbind('mouseover').unbind('mouseout');items[index].item=null;items.splice(index,1);}};var clear=function()
+{hide();while(items.length>0)
+{if(items[0].item!=null)
+{$(items[0].item).attr({title:items[0].content,simpleTip:''}).unbind('mouseover').unbind('mouseout');items[0].item=null;}
+items.shift();}
+itemIndexInc=0;};var getIndex=function(item)
+{searched=$(item).attr('simpleTip');for(i=0;i<items.length;i++)
+{if(items[i].index==searched)return(i);}
+return(-1);};var prepare=function(posX,posY,width,height,index)
+{itemIndex=index;arrowX=0;arrowY=0;$('#iSimpleTipContent'+options.name).html(items[itemIndex].content);$('#iSimpleTip'+options.name).css({left:'-1500px',top:'-1500px',display:'block'});switch(items[itemIndex].options.targetPos)
+{case'top-left':x=posX;y=posY;break;case'top-middle':x=posX+width/2;y=posY;break;case'top-right':x=posX+width;y=posY;break;case'middle-left':x=posX;y=posY+height/2;break;case'middle-middle':x=posX+width/2;y=posY+height/2;break;case'middle-right':x=posX+width;y=posY+height/2;break;case'bottom-left':x=posX;y=posY+height;break;case'bottom-middle':x=posX+width/2;y=posY+height;break;case'bottom-right':x=posX+width;y=posY+height;break;}
+stWidth=$('#iSimpleTipContent'+options.name).outerWidth();stHeight=$('#iSimpleTipContent'+options.name).outerHeight();stWidthI=$('#iSimpleTipContent'+options.name).innerWidth();stHeightI=$('#iSimpleTipContent'+options.name).innerHeight();bwX=(stWidth-stWidthI)/2;bwY=(stHeight-stHeightI)/2;arrowModel='';switch(items[itemIndex].options.tipPos)
+{case'top-left':x+=items[itemIndex].options.offsetX;y+=items[itemIndex].options.offsetY;arrowX=-bwX;arrowY=-items[itemIndex].options.arrowHeight+bwY;arrowModel='up';break;case'top-middle':x-=stWidth/2;y+=items[itemIndex].options.offsetY;arrowX=(stWidthI-items[itemIndex].options.arrowWidth)/2;arrowY=-items[itemIndex].options.arrowHeight+bwY;arrowModel='up';break;case'top-right':x-=stWidth+items[itemIndex].options.offsetX;y+=items[itemIndex].options.offsetY;arrowX=stWidthI-items[itemIndex].options.arrowWidth+bwX;arrowY=-items[itemIndex].options.arrowHeight+bwY;arrowModel='up';break;case'middle-left':x+=items[itemIndex].options.offsetX;y-=stHeight/2;arrowX=-items[itemIndex].options.arrowWidth+bwX;arrowY=(stHeightI-items[itemIndex].options.arrowHeight)/2+bwY;arrowModel='left';break;case'middle-middle':x-=stWidth/2;y-=stHeight/2;break;case'middle-right':x-=stWidth+items[itemIndex].options.offsetX;y-=stHeight/2;arrowX=stWidthI+bwX;arrowY=(stHeightI-items[itemIndex].options.arrowHeight)/2+bwY;arrowModel='right';break;case'bottom-left':x+=items[itemIndex].options.offsetX;y-=stHeight+items[itemIndex].options.offsetY;arrowX=-bwX;arrowY=stHeightI+bwY;arrowModel='down';break;case'bottom-middle':x-=stWidth/2;y-=stHeight+items[itemIndex].options.offsetY;arrowX=(stWidthI-items[itemIndex].options.arrowWidth)/2+bwX;arrowY=stHeightI+bwY;arrowModel='down';break;case'bottom-right':x-=stWidth+items[itemIndex].options.offsetX;y-=stHeight+items[itemIndex].options.offsetY;arrowX=stWidthI-items[itemIndex].options.arrowWidth+bwX;arrowY=stHeightI+bwY;arrowModel='down';break;}
+if(items[itemIndex].options.drawArrow&arrowModel!='')
+{$('#iSimpleTipArrow'+options.name).css({display:'block',background:'url("'+items[itemIndex].options.arrowImgDir+'/arrow_'+arrowModel+'.png") no-repeat scroll 0 0 transparent',marginLeft:arrowX+'px',marginTop:arrowY+'px',width:items[itemIndex].options.arrowWidth+'px',height:items[itemIndex].options.arrowHeight+'px'});}
+else
+{$('#iSimpleTipArrow'+options.name).css('display','none');}
+$('#iSimpleTip'+options.name).css({left:x+'px',top:y+'px',display:'none'}).removeClass().addClass(items[itemIndex].options.classes);};var show=function()
+{$('#iSimpleTip'+options.name).css('display','block');};var hide=function()
+{$('#iSimpleTip'+options.name).css('display','none');};var init=function()
+{if($('#iSimpleTip'+options.name).length==0)
+{text="<div id='iSimpleTip"+options.name+"' style='z-index:15000;display:none;position:absolute;left:0px;top:0px;'><div id='iSimpleTipShadow"+options.name+"' style='position:absolute;width:100%;height:100%;background:#000000;opacity:0.4;filter:alpha(opacity:40);display:block;z-index:-1;margin-left:2px;margin-top:2px;'></div><div id='iSimpleTipArrow"+options.name+"' style='position:absolute;'></div><div id='iSimpleTipContent"+options.name+"'></div></div>";$('body').append(text);}};init();}
Index: tensions/GrumPluginClasses/js/simpleTip.packed.js
===================================================================
--- /extensions/GrumPluginClasses/js/simpleTip.packed.js	(revision 8960)
+++ 	(revision )
@@ -1,2 +1,0 @@
-/* file: simpleTip.js - v1.0.0 | packed on 2010/10/13 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}('e 1l(b,9,5){q.b=b;q.T=b.N;q.9=9;q.5=1M.1J({1h:\'D-c\',1m:\'f-c\',1z:1I,L:0,C:0,1t:\'\',1u:\'./1X/1U/1O/\',1q:12,1r:12,},5)}e O(){t 6=1x 1W(),R=0,5={d:\'\',};o(h.B>=1){5.d=h[0]}q.1T=e(1E){1f(1E){7\'S\':o(h.B==2){S(h[1],{})}1s{S(h[1],h[2])}8;7\'18\':o(h.B==2){18(h[1])}8;7\'1a\':1a();8;7\'M\':M();8;7\'Y\':Y();8;7\'U\':o(h.B==4){U(h[1],h[2],h[3])}8}};t S=e(b,5){9=1e(b);o(9==-1&b.N!=\'\'){W=1x 1l(b,R,5);$(b).Q({N:\'\',O:W.9,}).1g(\'1b\',{9:W.9},e(19){U($(q).1y().g,$(q).1y().f,$(q).1k(),$(q).1n(),19.1P.9);Y()}).1g(\'1d\',e(19){M()});6.1V(W);R++}};t 18=e(b){9=1e(b);o(9!=-1){$(b).Q({N:6[9].T,O:\'\'}).P(\'1b\').P(\'1d\');6[9].b=17;6.1L(9,1)}};t 1a=e(){M();1N(6.B>0){o(6[0].b!=17){$(6[0].b).Q({N:6[0].T,O:\'\'}).P(\'1b\').P(\'1d\');6[0].b=17}6.2b()}R=0};t 1e=e(b){1w=$(b).Q(\'O\');1Y(i=0;i<6.B;i++){o(6[i].9==1w)1v(i)}1v(-1)};t U=e(k,p,s,r,9){a=9;m=0;n=0;$(\'#1j\'+5.d).2g(6[a].T);$(\'#l\'+5.d).J({g:\'-1i\',f:\'-1i\',v:\'V\',});1f(6[a].5.1h){7\'f-g\':x=k;y=p;8;7\'f-c\':x=k+s/2;y=p;8;7\'f-E\':x=k+s;y=p;8;7\'c-g\':x=k;y=p+r/2;8;7\'c-c\':x=k+s/2;y=p+r/2;8;7\'c-E\':x=k+s;y=p+r/2;8;7\'D-g\':x=k;y=p+r;8;7\'D-c\':x=k+s/2;y=p+r;8;7\'D-E\':x=k+s;y=p+r;8}A=$(\'#l\').2d();u=$(\'#l\').29();F=$(\'#l\').1k();H=$(\'#l\').1n();G=(A-F)/2;I=(u-H)/2;j=\'\';1f(6[a].5.1m){7\'f-g\':x+=6[a].5.L;y+=6[a].5.C;m=-G;n=-10-I;j=\'14\';8;7\'f-c\':x-=A/2;y+=6[a].5.C;m=(F-10)/2;n=-10-I;j=\'14\';8;7\'f-E\':x-=A+6[a].5.L;y+=6[a].5.C;m=F-10+G;n=-10-I;j=\'14\';8;7\'c-g\':y-=u/2;m=-10-G;n=(H-10)/2;j=\'g\';8;7\'c-c\':x-=A/2;y-=u/2;8;7\'c-E\':x-=A+6[a].5.L;y-=u/2;m=F+G;n=(H-10)/2;j=\'E\';8;7\'D-g\':y-=u+6[a].5.C;m=-G;n=H+I;j=\'1c\';8;7\'D-c\':x-=A/2;y-=u+6[a].5.C;m=(F-10)/2;n=H+I;j=\'1c\';8;7\'D-E\':x-=A+6[a].5.L;y-=u+6[a].5.C;m=F-10+G;n=H+I;j=\'1c\';8}o(6[a].5.1z&j!=\'\'){$(\'#13\'+5.d).J({v:\'V\',1p:\'25("\'+6[a].5.1u+\'/26\'+j+\'.23") 1Z-20 2a 0 0 2f\',2e:m+\'K\',2c:n+\'K\',s:6[a].5.1q+\'K\',r:6[a].5.1r+\'K\',})}1s{$(\'#13\'+5.d).J(\'v\',\'X\')}$(\'#l\'+5.d).J({g:x+\'K\',f:y+\'K\',v:\'X\',}).21().1R(6[a].5.1t)};t Y=e(){$(\'#l\'+5.d).J(\'v\',\'V\')};t M=e(){$(\'#l\'+5.d).J(\'v\',\'X\')};t 1A=e(){o($(\'#l\'+5.d).B==0){1G="<w Z=\'l"+5.d+"\' 11=\'z-9:22;v:X;15:16;g:1B;f:1B;\'><w Z=\'1S"+5.d+"\' 11=\'15:16;s:1o%;r:1o%;1p:#1K;1C:0.4;24:27(1C:28);v:V;z-9:-1;1D-g:1F;1D-f:1F;\'></w><w Z=\'13"+5.d+"\' 11=\'15:16;\'></w><w Z=\'1j"+5.d+"\'></w></w>";$(\'1Q\').1H(1G)}};1A()}',62,141,'|||||options|items|case|break|index|itemIndex|item|middle|name|function|top|left|arguments||arrowModel|posX|iSimpleTip|arrowX|arrowY|if|posY|this|height|width|var|stHeight|display|div||||stWidth|length|offsetY|bottom|right|stWidthI|bwX|stHeightI|bwY|css|px|offsetX|hide|title|simpleTip|unbind|attr|itemIndexInc|add|content|prepare|block|tip|none|show|id||style||iSimpleTipArrow|up|position|absolute|null|remove|event|clear|mouseover|down|mouseout|getIndex|switch|bind|targetPos|1500px|iSimpleTipContent|innerWidth|tipItem|tipPos|innerHeight|100|background|arrowWidth|arrowHeight|else|classes|arrowImgDir|return|searched|new|offset|drawArrow|init|0px|opacity|margin|fct|2px|text|append|false|extend|000000|splice|jQuery|while|icons|data|body|addClass|iSimpleTipShadow|doAction|GrumPluginClasses|push|Array|plugins|for|no|repeat|removeClass|15000|png|filter|url|arrow_|alpha|40|outerHeight|scroll|shift|marginTop|outerWidth|marginLeft|transparent|html'.split('|'),0,{}))
Index: /extensions/GrumPluginClasses/js/ui.categorySelector.js
===================================================================
--- /extensions/GrumPluginClasses/js/ui.categorySelector.js	(revision 8960)
+++ /extensions/GrumPluginClasses/js/ui.categorySelector.js	(revision 8961)
@@ -2,6 +2,6 @@
  * -----------------------------------------------------------------------------
  * file: ui.categorySelector.js
- * file version: 1.0.1
- * date: 2010-10-10
+ * file version: 1.1.0
+ * date: 2011-01-12
  *
  * A jQuery plugin provided by the piwigo's plugin "GrumPluginClasses"
@@ -28,4 +28,16 @@
  * |         |            | * add 'name' property
  * |         |            |
+ * | 1.1.0   | 2011/01/12 | * checkbox moved between +/- button and text
+ * |         |            |
+ * |         |            | * dropdown list is managed like dropdown list on
+ * |         |            |   <select> object (hidden only when object loose
+ * |         |            |   focus )
+ * |         |            |
+ * |         |            | * selected values are dislayed like tags
+ * |         |            |
+ * |         |            | * add 'isValid' method
+ * |         |            |
+ * |         |            | * add 'displayPath' property
+ * |         |            |
  * |         |            |
  *
@@ -61,5 +73,4 @@
                       levelIndent:16,
                       iconWidthEC:15,
-                      iconWidthCheck:18,
                       serverUrl:'plugins/GrumPluginClasses/gpc_ajax.php',
                       filter:'accessible',
@@ -68,5 +79,8 @@
                       load:null,
                       multiple:false,
-                      userMode:'public'
+                      userMode:'public',
+                      popupMode:'click',
+                      displayPath:false,
+                      downArrow:'&dArr;'
                     };
 
@@ -86,4 +100,6 @@
                     categories:[],
                     labelStatus:['', ''],
+                    mouseOver:false,
+                    isValid:true
                   }
                 );
@@ -98,4 +114,5 @@
                         {
                           'class':'ui-category-selector',
+                          tabindex:0,
                           css:{
                             width:'100%'
@@ -106,4 +123,5 @@
                         {
                           privateMethods.displaySelector($this, !$this.data('properties').selectorVisible);
+                          $(this).focus();
                         }
                       ),
@@ -111,7 +129,8 @@
                       {
                         html: '&nbsp;',
-                        'class':'ui-category-selector-name',
+                        'class':'ui-category-selector-name'
                       }
                     ),
+                    containerList:null,
                     containerStatus:$('<div/>',
                       {
@@ -132,6 +151,15 @@
                         }
                       }
+                    ).bind('mousedown',
+                        function ()
+                        {
+                          $(this).addClass('ui-category-selector-arrow-active');
+                        }
+                    ).bind('mouseup',
+                        function ()
+                        {
+                          $(this).removeClass('ui-category-selector-arrow-active');
+                        }
                     ),
-
                     listContainer:$('<div/>',
                         {
@@ -144,10 +172,5 @@
                           }
                         }
-                    ).bind('mouseleave.categorySelector',
-                        function ()
-                        {
-                          privateMethods.displaySelector($this, false);
-                        }
-                      ),
+                    ),
                     list:$('<ul/>',
                       {
@@ -160,14 +183,18 @@
                     )
                   };
-
-                $this
-                  .html('')
-                  .append(objects.container.append(objects.containerArrow).append(objects.containerStatus).append(objects.containerName))
-                  .append(objects.listContainer.append(objects.list));
-
-                $this.data('objects', objects);
-              }
+              }
+
+              $this.data('objects', objects);
 
               privateMethods.setOptions($this, opt);
+
+
+              if($this.html()!='') privateMethods.setItems($this, $this.html());
+
+              $this
+                .html('')
+                .append(objects.container.append(objects.containerArrow).append(objects.containerStatus).append(objects.containerName))
+                .append(objects.listContainer.append(objects.list));
+
             }
           );
@@ -258,5 +285,5 @@
       listMaxWidth: function (value)
         {
-          if(value)
+          if(value!=null)
           {
             return this.each(function()
@@ -283,5 +310,5 @@
       listMaxHeight: function (value)
         {
-          if(value)
+          if(value!=null)
           {
             return this.each(function()
@@ -333,5 +360,5 @@
       levelIndent: function (value)
         {
-          if(value)
+          if(value!=null)
           {
             return this.each(function()
@@ -358,5 +385,5 @@
       serverUrl: function (value)
         {
-          if(value)
+          if(value!=null)
           {
             return this.each(function()
@@ -383,5 +410,5 @@
       filter: function (value)
         {
-          if(value)
+          if(value!=null)
           {
             return this.each(function()
@@ -428,5 +455,5 @@
       iconWidthEC: function (value)
         {
-          if(value)
+          if(value!=null)
           {
             return this.each(function()
@@ -451,11 +478,11 @@
         }, // iconWidthEC
 
-      iconWidthCheck: function (value)
-        {
-          if(value)
+      userMode: function (value)
+        {
+          if(value!=null)
           {
             return this.each(function()
               {
-                privateMethods.setIconWidthCheck($(this), value);
+                privateMethods.setUserMode($(this), value);
               }
             );
@@ -467,5 +494,5 @@
             if(options)
             {
-              return(options.iconWidthCheck);
+              return(options.userMode);
             }
             else
@@ -474,29 +501,4 @@
             }
           }
-        }, // iconWidthCheck
-
-      userMode: function (value)
-        {
-          if(value)
-          {
-            return this.each(function()
-              {
-                privateMethods.setUserMode($(this), value);
-              }
-            );
-          }
-          else
-          {
-            var options = this.data('options');
-
-            if(options)
-            {
-              return(options.userMode);
-            }
-            else
-            {
-              return(0);
-            }
-          }
         }, // userMode
 
@@ -504,6 +506,5 @@
         {
           var options=this.data('options'),
-              properties=this.data('properties'),
-              objects=this.data('objects');
+              properties=this.data('properties');
 
           if(!options.multiple)
@@ -522,7 +523,82 @@
         }, // userMode
 
+      popupMode: function (value)
+        {
+          if(value!=null)
+          {
+            return this.each(function()
+              {
+                privateMethods.setPopupMode($(this), value);
+              }
+            );
+          }
+          else
+          {
+            var options = this.data('options');
+
+            if(options)
+            {
+              return(options.popupMode);
+            }
+            else
+            {
+              return(0);
+            }
+          }
+        }, // popupMode
+
+      displayPath: function (value)
+        {
+          if(value!=null)
+          {
+            return this.each(function()
+              {
+                privateMethods.setDisplayPath($(this), value);
+              }
+            );
+          }
+          else
+          {
+            var options = this.data('options');
+
+            if(options)
+            {
+              return(options.displayPath);
+            }
+            else
+            {
+              return(0);
+            }
+          }
+        }, // displayPath
+
+      downArrow: function (value)
+        {
+          if(value!=null)
+          {
+            return this.each(function()
+              {
+                privateMethods.setDownArrow($(this), value);
+              }
+            );
+          }
+          else
+          {
+            var options = this.data('options');
+
+            if(options)
+            {
+              return(options.downArrow);
+            }
+            else
+            {
+              return('');
+            }
+          }
+        }, // downArrow
+
       value: function (value)
         {
-          if(value)
+          if(value!=null)
           {
             // set selected value
@@ -559,4 +635,22 @@
           }
         }, // value
+
+      isValid: function (value)
+        {
+          if(value!=null)
+          {
+            return this.each(function()
+              {
+                privateMethods.setIsValid($(this), value);
+              }
+            );
+          }
+          else
+          {
+            var properties=this.data('properties');
+            return(properties.isValid);
+          }
+        }, // isValid
+
       load: function (value)
         {
@@ -634,4 +728,5 @@
           }
         }, // popup
+
       numberOfCategories: function ()
         {
@@ -647,7 +742,9 @@
           }
         }, // numberOfCategories
+
       properties: function (value)
         {
-          var properties=this.data('properties');
+          var properties=this.data('properties'),
+              options=this.data('options');
 
           if(properties && value==':first' && properties.categories.length>0)
@@ -657,9 +754,9 @@
           else if(properties && properties.index!=null && (value==':selected' || value==null) && properties.categories.length>0)
           {
-            if(!option.multiple && properties.index>-1 && properties.index<properties.categories.length)
+            if(!options.multiple && properties.index>-1 && properties.index<properties.categories.length)
             {
               return(properties.categories[properties.index]);
             }
-            else if(option.multiple)
+            else if(options.multiple)
             {
               var returned=[];
@@ -686,5 +783,5 @@
             return(null);
           }
-        }, // numberOfCategories
+        } // numberOfCategories
     }; // methods
 
@@ -711,8 +808,10 @@
           privateMethods.setLevelIndent(object, (value.levelIndent!=null)?value.levelIndent:options.levelIndent);
           privateMethods.setIconWidthEC(object, (value.iconWidthEC!=null)?value.iconWidthEC:options.iconWidthEC);
-          privateMethods.setIconWidthCheck(object, (value.iconWidthCheck!=null)?value.iconWidthCheck:options.iconWidthCheck);
           privateMethods.setServerUrl(object, (value.serverUrl!=null)?value.serverUrl:options.serverUrl);
           privateMethods.setFilter(object, (value.filter!=null)?value.filter:options.filter);
           privateMethods.setUserMode(object, (value.userMode!=null)?value.userMode:options.userMode);
+          privateMethods.setPopupMode(object, (value.popupMode!=null)?value.popupMode:options.popupMode);
+          privateMethods.setDisplayPath(object, (value.displayPath!=null)?value.displayPath:options.displayPath);
+          privateMethods.setDownArrow(object, (value.downArrow!=null)?value.downArrow:options.downArrow);
           privateMethods.setEventPopup(object, (value.popup!=null)?value.popup:options.popup);
           privateMethods.setEventChange(object, (value.change!=null)?value.change:options.change);
@@ -725,8 +824,29 @@
         },
 
+      setIsValid : function (object, value)
+        {
+          var objects=object.data('objects'),
+              properties=object.data('properties');
+
+          if(properties.isValid!=value)
+          {
+            properties.isValid=value;
+            if(properties.isValid)
+            {
+              objects.container.removeClass('ui-error');
+            }
+            else
+            {
+              objects.container.addClass('ui-error');
+            }
+          }
+          return(properties.isValid);
+        },
+
       setAutoLoad : function (object, value)
         {
           var options=object.data('options'),
               properties=object.data('properties');
+
           if((!properties.initialized || options.autoLoad!=value) && (value==true || value==false))
           {
@@ -740,4 +860,5 @@
           var options=object.data('options'),
               properties=object.data('properties');
+
           if((!properties.initialized || options.galleryRoot!=value) && (value==true || value==false))
           {
@@ -753,4 +874,5 @@
               properties=object.data('properties'),
               objects=object.data('objects');
+
           if((!properties.initialized || options.listMaxWidth!=value) && value>=0)
           {
@@ -773,4 +895,5 @@
               properties=object.data('properties'),
               objects=object.data('objects');
+
           if((!properties.initialized || options.listMaxHeight!=value) && value>=0)
           {
@@ -793,4 +916,5 @@
               properties=object.data('properties'),
               objects=object.data('objects');
+
           if((!properties.initialized || options.displayStatus!=value) && (value==true || value==false))
           {
@@ -813,4 +937,5 @@
               properties=object.data('properties'),
               objects=object.data('objects');
+
           if((!properties.initialized || options.levelIndent!=value) && value>=0)
           {
@@ -819,5 +944,5 @@
               function ()
               {
-                $(this).css('padding-left', (options.iconWidthEC+options.iconWidthCheck+$(this).attr('level')*options.levelIndent)+'px');
+                $(this).css('padding-left', (options.iconWidthEC+$(this).attr('level')*options.levelIndent)+'px');
               }
             );
@@ -830,4 +955,5 @@
           var options=object.data('options'),
               properties=object.data('properties');
+
           if(!properties.initialized || options.serverUrl!=value)
           {
@@ -838,9 +964,9 @@
         },
 
-
       setFilter : function (object, value)
         {
           var options=object.data('options'),
               properties=object.data('properties');
+
           if((!properties.initialized || options.filter!=value) && (value=='none' || value=='accessible' || value=='public'))
           {
@@ -856,4 +982,5 @@
               properties=object.data('properties'),
               objects=object.data('objects');
+
           if((!properties.initialized || options.iconWidthEC!=value) && value>=0)
           {
@@ -862,63 +989,194 @@
               function ()
               {
-                $(this).css('padding-left', (options.iconWidthEC+options.iconWidthCheck+$(this).attr('level')*options.levelIndent)+'px');
-              }
-            );
-          }
-          return(options.filter);
-        },
-
-      setIconWidthCheck : function (object, value)
+                $(this).css('padding-left', (options.iconWidthEC+$(this).attr('level')*options.levelIndent)+'px');
+              }
+            );
+          }
+          return(options.iconWidthEC);
+        },
+
+      setMultiple : function (object, value)
         {
           var options=object.data('options'),
               properties=object.data('properties'),
               objects=object.data('objects');
-          if((!properties.initialized || options.iconWidthCheck!=value) && (value>=0 && options.multiple || !options.multiple && value==0))
-          {
-            options.iconWidthCheck=value;
-            objects.list.find('.ui-category-selector-item').each(
-              function ()
-              {
-                $(this).css('padding-left', (options.iconWidthEC+options.iconWidthCheck+$(this).attr('level')*options.levelIndent)+'px');
-              }
-            );
-          }
-          return(options.filter);
-        },
-
-      setMultiple : function (object, value)
+
+          if((!properties.initialized || options.multiple!=value) && (value==true || value==false))
+          {
+            if(!value)
+            {
+              properties.index=-1;
+              if(objects.containerList!=null)
+              {
+                objects.containerList.remove();
+                objects.containerList=null;
+              }
+            }
+            else
+            {
+              properties.index=[];
+              objects.listContainer.addClass('ui-category-selector-multiple');
+              if(objects.containerList==null)
+              {
+                objects.containerList=$('<ul/>',
+                  {
+                    css: {
+                      listStyle:'none',
+                      padding:'0px',
+                      margin:'0px',
+                      overflow:"auto"
+                    },
+                    html:'<li>&nbsp;</li>'
+                  }
+                );
+                objects.containerName.html('').append(objects.containerList);
+              }
+            }
+            options.multiple=value;
+          }
+          return(options.multiple);
+        }, //setMultiple
+
+      setUserMode : function (object, value)
+        {
+          var options=object.data('options'),
+              properties=object.data('properties');
+
+          if((!properties.initialized || options.userMode!=value) && (value=='admin' || value=='public'))
+          {
+            options.userMode=value;
+            if(options.autoLoad && properties.initialized) privateMethods.load(object);
+          }
+          return(options.userMode);
+        }, //setUserMode
+
+      setPopupMode : function (object, value)
         {
           var options=object.data('options'),
               properties=object.data('properties'),
               objects=object.data('objects');
-          if((!properties.initialized || options.multiple!=value) && (value==true || value==false))
-          {
-            if(!value)
-            {
-              privateMethods.setIconWidthCheck(object, 0);
-              properties.index=-1;
-            }
-            else
-            {
-              properties.index=[];
-              objects.listContainer.addClass('ui-category-selector-multiple');
-            }
-            options.multiple=value;
-          }
-          return(options.filter);
-        }, //setMultiple
-
-      setUserMode : function (object, value)
+
+          if((!properties.initialized || options.popupMode!=value) && (value=='click' || value=='mouseout'))
+          {
+            options.popupMode=value;
+
+            if(value=='mouseout')
+            {
+              objects.listContainer
+                .unbind('mouseleave.categorySelector')
+                .unbind('mouseenter.categorySelector')
+                .bind('mouseleave.categorySelector',
+                  function ()
+                  {
+                    privateMethods.displaySelector(object, false);
+                  }
+                );
+            }
+            else
+            {
+              objects.listContainer
+                .unbind('mouseleave.categorySelector')
+                .bind('mouseleave.categorySelector',
+                  function ()
+                  {
+                    properties.mouseOver=false;
+                  }
+                )
+                .bind('mouseenter.categorySelector',
+                  function ()
+                  {
+                    properties.mouseOver=true;
+                  }
+                );
+              $(document).bind('focusout focusin',
+                function (event)
+                {
+                  if(!properties.mouseOver) privateMethods.displaySelector(object, false);
+                }
+              );
+            }
+          }
+          return(options.popupMode);
+        }, //setUserMode
+
+
+      setDisplayPath : function (object, value)
         {
           var options=object.data('options'),
               properties=object.data('properties'),
               objects=object.data('objects');
-          if((!properties.initialized || options.userMode!=value) && (value=='admin' || value=='public'))
-          {
-            options.userMode=value;
-            if(options.autoLoad && properties.initialized) privateMethods.load(object);
-          }
-          return(options.filter);
-        }, //setUserMode
+
+          if((!properties.initialized || options.displayPath!=value) && (value==true || value==false))
+          {
+            options.displayPath=value;
+
+          }
+          return(options.userMode);
+        }, //setDisplayPath
+
+      setDownArrow : function (object, value)
+        {
+          var options=object.data('options'),
+              properties=object.data('properties'),
+              objects=object.data('objects');
+
+          if(!properties.initialized || options.downArrow!=value)
+          {
+            options.downArrow=value;
+            objects.containerArrow.html(options.downArrow);
+          }
+          return(options.downArrow);
+        }, //setDownArrow
+
+
+      setItems : function (object, value)
+        {
+          var properties=object.data('properties'),
+              options=object.data('options'),
+              objects=object.data('objects');
+
+          if(value=='' || value==null)
+          {
+            value={
+              status:['',''],
+              categories:[]
+            }
+          }
+          else if($.isArray(value))
+          {
+            value={
+              status:'public',
+              categories:value
+            }
+          }
+          else
+          {
+            try
+            {
+              value=$.parseJSON($.trim(value));
+            }
+            catch (e)
+            {
+              return(false);
+            }
+          }
+
+          properties.labelStatus=value.status;
+          privateMethods.listClear(object);
+          if(value.categories.length>0) privateMethods.listAddItems(object, value.categories, objects.list);
+
+          properties.initialized=false;
+          if(options.multiple)
+          {
+            privateMethods.setValue(object, ':none');
+          }
+          else
+          {
+            privateMethods.setValue(object, ':first');
+          }
+          properties.initialized=true;
+
+          if(options.load) object.trigger('categorySelectorLoad');
+        },
 
       /**
@@ -1198,8 +1456,10 @@
           if(!options.multiple && (!properties.initialized || properties.index!=index) && index>-1)
           {
+
             objects.list.find('.ui-category-selector-selected-item').removeClass('ui-category-selector-selected-item');
             objects.list.find('[catId="'+value+'"]').addClass('ui-category-selector-selected-item');
+            title=privateMethods.getParentName(object, objects.list.find('[catId="'+value+'"] div.ui-category-selector-name')).replace('&amp;', '&').replace('&gt;', '>').replace('&lt;', '<');
             properties.index=index;
-            objects.containerName.html(properties.categories[properties.index].name);
+            objects.containerName.html(properties.categories[properties.index].name).attr('title', title);
             objects.containerStatus.html(properties.labelStatus[properties.categories[properties.index].status]);
             if(trigger && options.change) object.trigger('categorySelectorChange', [properties.categories[properties.index].id]);
@@ -1232,13 +1492,47 @@
               tmp.push(properties.categories[index[i]].id);
             }
-            containerHtml='';
+            objects.containerList.html('');
             objects.list.find('.ui-category-selector-selected-item div.ui-category-selector-name').each(
               function ()
               {
-                containerHtml+=((containerHtml=='')?'':'&nbsp;; ')+$(this).html();
-              }
-            );
-            if(containerHtml=='') containerHtml="&nbsp;";
-            objects.containerName.html(containerHtml);
+                var path='';
+
+                title=privateMethods.getParentName(object, $(this)).replace('&amp;', '&').replace('&gt;', '>').replace('&lt;', '<');
+                if(!options.displayPath)
+                {
+                  path=$(this).html();
+                }
+                else
+                {
+                  path=title;
+                }
+
+                objects.containerList.append(
+                  $('<li/>',
+                    {
+                      html:path,
+                      title:title,
+                      'class':'ui-category-selector-selected-cat'
+                    }
+                  ).prepend(
+                      $('<span/>',
+                        {
+                          html:'x'
+                        }
+                       ).bind('click.categorySelector',
+                          {object:object, value:$(this).parent().parent().attr('catid')},
+                          function (event)
+                          {
+                            event.stopPropagation();
+                            privateMethods.setValue(event.data.object, event.data.value);
+                          }
+                        )
+                      )
+                )
+              }
+            );
+
+            if(objects.containerList.children().length==0) objects.containerList.append('<li>&nbsp;</li>');
+
             if(trigger && options.change) object.trigger('categorySelectorChange', [tmp]);
             return(tmp);
@@ -1246,4 +1540,14 @@
           return(null);
         },
+
+      getParentName : function (object, item)
+      {
+        if(item==null || item.length==0) return('');
+        foundItem=item.parent().parent().parent().prev().find('div.ui-category-selector-name');
+
+        if(foundItem.length==0) return(item.html());
+
+        return(privateMethods.getParentName(object, foundItem)+' / '+item.html());
+      },
 
       displaySelector : function (object, value)
@@ -1252,4 +1556,5 @@
               properties=object.data('properties'),
               objects=object.data('objects');
+
           if(properties.selectorVisible!=value)
           {
@@ -1266,4 +1571,5 @@
                   }
                 );
+
               if($.isArray(properties.index))
               {
@@ -1289,6 +1595,7 @@
           // load datas from server through an asynchronous ajax call
           var options=object.data('options'),
-              properties=object.data('properties'),
               objects=object.data('objects');
+
+          if(options.serverUrl=='') return(false);
 
           $.ajax(
@@ -1306,20 +1613,10 @@
               success: function(msg)
                 {
-                  list=$.parseJSON(msg);
-
-                  properties.labelStatus=list.status;
-                  privateMethods.listClear(object);
-                  privateMethods.listAddItems(object, list.categories, objects.list);
-
-                  properties.initialized=false;
-                  privateMethods.setValue(object, ':first');
-                  properties.initialized=true;
-
-                  if(options.load) object.trigger('categorySelectorLoad');
+                  privateMethods.setItems(object, msg);
                 },
               error: function(msg)
                 {
                   objects.listContainer.html('Error ! '+msg);
-                },
+                }
             }
          );
@@ -1345,4 +1642,5 @@
           properties.categories=[];
         },
+
       listAddItems : function (object, listItems, parent)
         {
@@ -1374,5 +1672,5 @@
             }
 
-            var spaceWidth = (options.iconWidthEC+options.iconWidthCheck+listItems[i].level*options.levelIndent),
+            var spaceWidth = (options.iconWidthEC+listItems[i].level*options.levelIndent),
                 li=$('<li/>',
                       {
@@ -1389,10 +1687,6 @@
                         function (event)
                         {
-                          if(!event.layerX && event.offsetX)
-                          {
-                            // trick for IE..
-                            event.layerX=event.offsetX;
-                            event.layerY=event.offsetY;
-                          }
+                          event.layerX=event.pageX-$(event.currentTarget).offset().left;
+                          event.layerY=event.pageY-$(event.currentTarget).offset().top;
 
                           if(event.layerX<event.data.expandArea && event.data.nbchilds>0 )
@@ -1424,14 +1718,16 @@
                             }
                           }
+
+                          if(options.multiple) objects.container.focus();
                         }
                       );
             if(listItems[i].childs.length>0)
             {
-              li.addClass('ui-category-selector-collapsable-item').css('background-position', (options.iconWidthCheck+options.levelIndent*listItems[i].level)+'px 0px');
+              li.addClass('ui-category-selector-collapsable-item').css('background-position', (options.levelIndent*listItems[i].level)+'px 0px');
             }
 
             if(options.multiple)
             {
-              li.prepend('<div class="ui-category-selector-check"></div>');
+              li.children().prepend('<div class="ui-category-selector-check"></div>');
             }
 
@@ -1465,4 +1761,5 @@
            */
           var properties=object.data('properties');
+
           for(var i=0;i<properties.categories.length;i++)
           {
@@ -1471,7 +1768,9 @@
           return(-1);
         },
+
       setEventPopup : function (object, value)
         {
           var options=object.data('options');
+
           options.popup=value;
           object.unbind('categorySelectorPopup');
@@ -1479,7 +1778,9 @@
           return(options.popup);
         },
+
       setEventChange : function (object, value)
         {
           var options=object.data('options');
+
           options.change=value;
           object.unbind('categorySelectorChange');
@@ -1487,7 +1788,9 @@
           return(options.change);
         },
+
       setEventLoad : function (object, value)
         {
           var options=object.data('options');
+
           options.load=value;
           object.unbind('categorySelectorLoad');
Index: /extensions/GrumPluginClasses/js/ui.categorySelector.min.js
===================================================================
--- /extensions/GrumPluginClasses/js/ui.categorySelector.min.js	(revision 8961)
+++ /extensions/GrumPluginClasses/js/ui.categorySelector.min.js	(revision 8961)
@@ -0,0 +1,393 @@
+/* file: ui.categorySelector.js - v1.1.0 | minified on 2011/01/28 with http://jscompress.com/ */
+(function($)
+{var publicMethods={init:function(opt)
+{return this.each(function()
+{var $this=$(this),data=$this.data('options'),objects=$this.data('objects'),properties=$this.data('properties'),options={autoLoad:true,galleryRoot:true,displayStatus:true,listMaxWidth:0,listMaxHeight:0,levelIndent:16,iconWidthEC:15,serverUrl:'plugins/GrumPluginClasses/gpc_ajax.php',filter:'accessible',popup:null,change:null,load:null,multiple:false,userMode:'public',popupMode:'click',displayPath:false,downArrow:'⇓'};$this.data('options',options);if(!properties)
+{$this.data('properties',{index:-1,initialized:false,selectorVisible:false,categories:[],labelStatus:['',''],mouseOver:false,isValid:true});properties=$this.data('properties');}
+if(!objects)
+{objects={container:$('<div/>',{'class':'ui-category-selector',tabindex:0,css:{width:'100%'}}).bind('click.categorySelector',function()
+{privateMethods.displaySelector($this,!$this.data('properties').selectorVisible);$(this).focus();}),containerName:$('<div/>',{html:' ','class':'ui-category-selector-name'}),containerList:null,containerStatus:$('<div/>',{'class':'ui-category-selector-status',css:{float:'right',display:(options.displayStatus)?'block':'none'}}),containerArrow:$('<div/>',{html:'⇓','class':'ui-category-selector-arrow',css:{'float':'right',cursor:'pointer'}}).bind('mousedown',function()
+{$(this).addClass('ui-category-selector-arrow-active');}).bind('mouseup',function()
+{$(this).removeClass('ui-category-selector-arrow-active');}),listContainer:$('<div/>',{html:"",'class':'ui-category-selector-list',css:{overflow:"auto",display:'none',position:'absolute'}}),list:$('<ul/>',{css:{listStyle:'none',padding:'0px',margin:'0px'}})};}
+$this.data('objects',objects);privateMethods.setOptions($this,opt);if($this.html()!='')privateMethods.setItems($this,$this.html());$this.html('').append(objects.container.append(objects.containerArrow).append(objects.containerStatus).append(objects.containerName)).append(objects.listContainer.append(objects.list));});},destroy:function()
+{return this.each(function()
+{var $this=$(this),objects=$this.data('objects');objects.container.unbind().remove();objects.list.children().unbind();objects.listContainer.remove();$this.unbind('.categorySelector').css({width:'',height:''});});},options:function(value)
+{return this.each(function()
+{privateMethods.setOptions($(this),value);});},autoLoad:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setAutoLoad($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.autoLoad);}
+else
+{return(true);}}},galleryRoot:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setGalleryRoot($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.galleryRoot);}
+else
+{return(true);}}},listMaxWidth:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setListMaxWidth($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.listMaxWidth);}
+else
+{return(0);}}},listMaxHeight:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setListMaxHeight($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.listMaxHeight);}
+else
+{return(0);}}},displayStatus:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setDisplayStatus($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.displayStatus);}
+else
+{return(true);}}},levelIndent:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setLevelIndent($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.levelIndent);}
+else
+{return(0);}}},serverUrl:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setServerUrl($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.serverUrl);}
+else
+{return('');}}},filter:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setFilter($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.filter);}
+else
+{return('');}}},collapse:function(value)
+{return this.each(function()
+{if(!value)value=':all';privateMethods.setExpandCollapse($(this),value,'C');});},expand:function(value)
+{return this.each(function()
+{if(!value)value=':all';privateMethods.setExpandCollapse($(this),value,'E');});},iconWidthEC:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setIconWidthEC($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.iconWidthEC);}
+else
+{return(0);}}},userMode:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setUserMode($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.userMode);}
+else
+{return(0);}}},name:function()
+{var options=this.data('options'),properties=this.data('properties');if(!options.multiple)
+{return(properties.categories[properties.index].name);}
+else
+{var listNames=[];for(var i=0;i<properties.index.length;i++)
+{listNames.push(properties.categories[properties.index[i]].name);}
+return(listNames);}},popupMode:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setPopupMode($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.popupMode);}
+else
+{return(0);}}},displayPath:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setDisplayPath($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.displayPath);}
+else
+{return(0);}}},downArrow:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setDownArrow($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.downArrow);}
+else
+{return('');}}},value:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setValue($(this),value);});}
+else
+{var properties=this.data('properties'),options=this.data('options');if(properties&&properties.index!=null&&!options.multiple&&properties.index>-1&&properties.index<properties.categories.length)
+{return(properties.categories[properties.index].id);}
+else if(properties&&properties.index!=null&&options.multiple)
+{var returned=[];for(var i=0;i<properties.index.length;i++)
+{if(properties.index[i]>-1&&properties.index[i]<properties.categories.length)
+returned.push(properties.categories[properties.index[i]].id);}
+return(returned);}
+else
+{return(null);}}},isValid:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setIsValid($(this),value);});}
+else
+{var properties=this.data('properties');return(properties.isValid);}},load:function(value)
+{if(value&&$.isFunction(value))
+{return this.each(function()
+{privateMethods.setEventLoad($(this),value);});}
+else
+{privateMethods.load(this);}},popup:function(value)
+{if(value&&$.isFunction(value))
+{return this.each(function()
+{privateMethods.setEventPopup($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.popup);}
+else
+{return(null);}}},change:function(value)
+{if(value&&$.isFunction(value))
+{return this.each(function()
+{privateMethods.setEventChange($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.change);}
+else
+{return(null);}}},numberOfCategories:function()
+{var properties=this.data('properties');if(properties)
+{return(properties.categories.length);}
+else
+{return(null);}},properties:function(value)
+{var properties=this.data('properties'),options=this.data('options');if(properties&&value==':first'&&properties.categories.length>0)
+{return(properties.categories[0]);}
+else if(properties&&properties.index!=null&&(value==':selected'||value==null)&&properties.categories.length>0)
+{if(!options.multiple&&properties.index>-1&&properties.index<properties.categories.length)
+{return(properties.categories[properties.index]);}
+else if(options.multiple)
+{var returned=[];for(var i=0;i<properties.index.length;i++)
+{if(properties.index[i]>-1&&properties.index<properties.categories.length)
+returned.push(properties.categories[properties.index[i]]);}
+return(returned);}
+return(null);}
+else if(properties&&value>-1)
+{var index=privateMethods.findIndexByValue(this,value);if(index>-1)
+{return(properties.categories[index]);}
+return(null);}
+else
+{return(null);}}};var privateMethods={setOptions:function(object,value)
+{var properties=object.data('properties'),options=object.data('options');if(!$.isPlainObject(value))return(false);properties.initialized=false;privateMethods.setAutoLoad(object,(value.autoLoad!=null)?value.autoLoad:options.autoLoad);privateMethods.setGalleryRoot(object,(value.galleryRoot!=null)?value.galleryRoot:options.galleryRoot);privateMethods.setDisplayStatus(object,(value.displayStatus!=null)?value.displayStatus:options.displayStatus);privateMethods.setListMaxWidth(object,(value.listMaxWidth!=null)?value.listMaxWidth:options.listMaxWidth);privateMethods.setListMaxHeight(object,(value.listMaxHeight!=null)?value.listMaxHeight:options.listMaxHeight);privateMethods.setLevelIndent(object,(value.levelIndent!=null)?value.levelIndent:options.levelIndent);privateMethods.setIconWidthEC(object,(value.iconWidthEC!=null)?value.iconWidthEC:options.iconWidthEC);privateMethods.setServerUrl(object,(value.serverUrl!=null)?value.serverUrl:options.serverUrl);privateMethods.setFilter(object,(value.filter!=null)?value.filter:options.filter);privateMethods.setUserMode(object,(value.userMode!=null)?value.userMode:options.userMode);privateMethods.setPopupMode(object,(value.popupMode!=null)?value.popupMode:options.popupMode);privateMethods.setDisplayPath(object,(value.displayPath!=null)?value.displayPath:options.displayPath);privateMethods.setDownArrow(object,(value.downArrow!=null)?value.downArrow:options.downArrow);privateMethods.setEventPopup(object,(value.popup!=null)?value.popup:options.popup);privateMethods.setEventChange(object,(value.change!=null)?value.change:options.change);privateMethods.setEventLoad(object,(value.load!=null)?value.load:options.load);privateMethods.setMultiple(object,(value.multiple!=null)?value.multiple:options.multiple);if(options.autoLoad)privateMethods.load(object);properties.initialized=true;},setIsValid:function(object,value)
+{var objects=object.data('objects'),properties=object.data('properties');if(properties.isValid!=value)
+{properties.isValid=value;if(properties.isValid)
+{objects.container.removeClass('ui-error');}
+else
+{objects.container.addClass('ui-error');}}
+return(properties.isValid);},setAutoLoad:function(object,value)
+{var options=object.data('options'),properties=object.data('properties');if((!properties.initialized||options.autoLoad!=value)&&(value==true||value==false))
+{options.autoLoad=value;}
+return(options.autoLoad);},setGalleryRoot:function(object,value)
+{var options=object.data('options'),properties=object.data('properties');if((!properties.initialized||options.galleryRoot!=value)&&(value==true||value==false))
+{options.galleryRoot=value;if(options.autoLoad&&properties.initialized)privateMethods.load(object);}
+return(options.galleryRoot);},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.listContainer.css('max-width',options.listMaxWidth+'px');}
+else
+{objects.listContainer.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.listContainer.css('max-height',options.listMaxHeight+'px');}
+else
+{objects.listContainer.css('max-height','');}}
+return(options.listMaxHeight);},setDisplayStatus:function(object,value)
+{var options=object.data('options'),properties=object.data('properties'),objects=object.data('objects');if((!properties.initialized||options.displayStatus!=value)&&(value==true||value==false))
+{options.displayStatus=value;if(options.displayStatus)
+{object.find('.ui-category-selector-status').show();}
+else
+{object.find('.ui-category-selector-status').hide();}}
+return(options.displayStatus);},setLevelIndent:function(object,value)
+{var options=object.data('options'),properties=object.data('properties'),objects=object.data('objects');if((!properties.initialized||options.levelIndent!=value)&&value>=0)
+{options.levelIndent=value;objects.list.find('.ui-category-selector-item').each(function()
+{$(this).css('padding-left',(options.iconWidthEC+$(this).attr('level')*options.levelIndent)+'px');});}
+return(options.levelIndent);},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);},setFilter:function(object,value)
+{var options=object.data('options'),properties=object.data('properties');if((!properties.initialized||options.filter!=value)&&(value=='none'||value=='accessible'||value=='public'))
+{options.filter=value;if(options.autoLoad&&properties.initialized)privateMethods.load(object);}
+return(options.filter);},setIconWidthEC:function(object,value)
+{var options=object.data('options'),properties=object.data('properties'),objects=object.data('objects');if((!properties.initialized||options.iconWidthEC!=value)&&value>=0)
+{options.iconWidthEC=value;objects.list.find('.ui-category-selector-item').each(function()
+{$(this).css('padding-left',(options.iconWidthEC+$(this).attr('level')*options.levelIndent)+'px');});}
+return(options.iconWidthEC);},setMultiple:function(object,value)
+{var options=object.data('options'),properties=object.data('properties'),objects=object.data('objects');if((!properties.initialized||options.multiple!=value)&&(value==true||value==false))
+{if(!value)
+{properties.index=-1;if(objects.containerList!=null)
+{objects.containerList.remove();objects.containerList=null;}}
+else
+{properties.index=[];objects.listContainer.addClass('ui-category-selector-multiple');if(objects.containerList==null)
+{objects.containerList=$('<ul/>',{css:{listStyle:'none',padding:'0px',margin:'0px',overflow:"auto"},html:'<li> </li>'});objects.containerName.html('').append(objects.containerList);}}
+options.multiple=value;}
+return(options.multiple);},setUserMode:function(object,value)
+{var options=object.data('options'),properties=object.data('properties');if((!properties.initialized||options.userMode!=value)&&(value=='admin'||value=='public'))
+{options.userMode=value;if(options.autoLoad&&properties.initialized)privateMethods.load(object);}
+return(options.userMode);},setPopupMode:function(object,value)
+{var options=object.data('options'),properties=object.data('properties'),objects=object.data('objects');if((!properties.initialized||options.popupMode!=value)&&(value=='click'||value=='mouseout'))
+{options.popupMode=value;if(value=='mouseout')
+{objects.listContainer.unbind('mouseleave.categorySelector').unbind('mouseenter.categorySelector').bind('mouseleave.categorySelector',function()
+{privateMethods.displaySelector(object,false);});}
+else
+{objects.listContainer.unbind('mouseleave.categorySelector').bind('mouseleave.categorySelector',function()
+{properties.mouseOver=false;}).bind('mouseenter.categorySelector',function()
+{properties.mouseOver=true;});$(document).bind('focusout focusin',function(event)
+{if(!properties.mouseOver)privateMethods.displaySelector(object,false);});}}
+return(options.popupMode);},setDisplayPath:function(object,value)
+{var options=object.data('options'),properties=object.data('properties'),objects=object.data('objects');if((!properties.initialized||options.displayPath!=value)&&(value==true||value==false))
+{options.displayPath=value;}
+return(options.userMode);},setDownArrow:function(object,value)
+{var options=object.data('options'),properties=object.data('properties'),objects=object.data('objects');if(!properties.initialized||options.downArrow!=value)
+{options.downArrow=value;objects.containerArrow.html(options.downArrow);}
+return(options.downArrow);},setItems:function(object,value)
+{var properties=object.data('properties'),options=object.data('options'),objects=object.data('objects');if(value==''||value==null)
+{value={status:['',''],categories:[]}}
+else if($.isArray(value))
+{value={status:'public',categories:value}}
+else
+{try
+{value=$.parseJSON($.trim(value));}
+catch(e)
+{return(false);}}
+properties.labelStatus=value.status;privateMethods.listClear(object);if(value.categories.length>0)privateMethods.listAddItems(object,value.categories,objects.list);properties.initialized=false;if(options.multiple)
+{privateMethods.setValue(object,':none');}
+else
+{privateMethods.setValue(object,':first');}
+properties.initialized=true;if(options.load)object.trigger('categorySelectorLoad');},setExpandCollapse:function(object,value,mode)
+{var objects=object.data('objects');re=/^(?:(:all)(?:(=|<|>|\+)(\d+))?)|(?:(\d+)(<|>|\+))?$/i;target=re.exec(value);if(target!=null)
+{switch(mode)
+{case'C':applyExpandCollapse=privateMethods.applyCollapse;break;case'E':applyExpandCollapse=privateMethods.applyExpand;break;}
+if(target[1]==':all')
+{objects.list.find('.ui-category-selector-expandable-item, .ui-category-selector-collapsable-item').each(applyExpandCollapse);}
+else if(target[4]!=null)
+{switch(target[5])
+{case'+':objects.list.find('.ui-category-selector-expandable-item, .ui-category-selector-collapsable-item').each(privateMethods.applyCollapse);objects.list.find(':has([catId='+target[4]+'])').prev().each(privateMethods.applyExpand);objects.list.find('[catId='+target[4]+']').each(applyExpandCollapse);break;case'>':objects.list.find('[catId='+target[4]+'] + ul').find('.ui-category-selector-expandable-item, .ui-category-selector-collapsable-item').each(applyExpandCollapse);objects.list.find('[catId='+target[4]+']').each(applyExpandCollapse);break;case'<':objects.list.find(':has([catId='+target[4]+'])').prev().each(applyExpandCollapse);objects.list.find('[catId='+target[4]+']').each(applyExpandCollapse);break;default:objects.list.find('[catId='+target[4]+']').each(applyExpandCollapse);break;}}}},applyExpand:function(index,domElt)
+{privateMethods.applyExpandCollapse(index,domElt,'E');},applyCollapse:function(index,domElt)
+{privateMethods.applyExpandCollapse(index,domElt,'C');},applyExpandCollapse:function(index,domElt,mode)
+{action='';var $domElt=$(domElt);if(target.length>2&&target[2]!=null&&target[3]!=null)
+{switch(target[2])
+{case'=':if($domElt.attr('level')==target[3])action=mode;break;case'>':if($domElt.attr('level')>=target[3])action=mode;break;case'<':if($domElt.attr('level')<=target[3])action=mode;break;case'+':if((mode=='E'&&$domElt.attr('level')<=target[3])||(mode=='C'&&$domElt.attr('level')>=target[3]))
+{action=mode;}
+else
+{action=(mode=='C')?'E':'C';}
+break;}}
+else action=mode;switch(action)
+{case'C':$domElt.removeClass('ui-category-selector-expandable-item ui-category-selector-collapsable-item').addClass('ui-category-selector-expandable-item').next().hide();break;case'E':$domElt.removeClass('ui-category-selector-expandable-item ui-category-selector-collapsable-item').addClass('ui-category-selector-collapsable-item').next().show();break;}},setValue:function(object,value,trigger)
+{var options=object.data('options'),properties=object.data('properties'),objects=object.data('objects'),index=-1;re=/^(:invert|:all|:none)(?:(=|<|>)(\d+))$/i;target=re.exec(value);if(target!=null)value=target[1];switch(value)
+{case':first':if(properties.categories.length>0)index=0;break;case':last':index=properties.categories.length-1;break;case':invert':if(!options.multiple)return(false);properties.index=[];objects.list.find('.ui-category-selector-item').each(function()
+{var $this=$(this),apply=true;if(target!=null)
+{switch(target[2])
+{case'=':apply=($this.attr('level')==target[3]);break;case'>':apply=($this.attr('level')>=target[3]);break;case'<':apply=($this.attr('level')<=target[3]);break;}}
+if(apply)
+{if($this.hasClass('ui-category-selector-selected-item'))
+{$this.removeClass('ui-category-selector-selected-item');}
+else
+{$this.addClass('ui-category-selector-selected-item');tmp=privateMethods.findIndexByValue(object,$this.attr('catId'));if(tmp>-1)properties.index.push(tmp);}}});privateMethods.setValue(object,[],false);return(false);break;case':none':if(!options.multiple)return(false);properties.index=[];objects.list.find('.ui-category-selector-selected-item').each(function()
+{var $this=$(this),apply=true;if(target!=null)
+{switch(target[2])
+{case'=':apply=($this.attr('level')==target[3]);break;case'>':apply=($this.attr('level')>=target[3]);break;case'<':apply=($this.attr('level')<=target[3]);break;}}
+if(apply)$this.removeClass('ui-category-selector-selected-item');});privateMethods.setValue(object,[],false);return(false);break;case':all':if(!options.multiple)return(false);properties.index=[];objects.list.find('.ui-category-selector-item').each(function()
+{var $this=$(this),apply=true;if(target!=null)
+{switch(target[2])
+{case'=':apply=($this.attr('level')==target[3]);break;case'>':apply=($this.attr('level')>=target[3]);break;case'<':apply=($this.attr('level')<=target[3]);break;}}
+if(apply)
+{tmp=privateMethods.findIndexByValue(object,$this.attr('catId'));if(tmp>-1)properties.index.push(tmp);$this.addClass('ui-category-selector-selected-item');}});privateMethods.setValue(object,[],false);return(false);break;default:if($.isArray(value)&&options.multiple)
+{index=[];for(var i=0;i<value.length;i++)
+{tmp=privateMethods.findIndexByValue(object,value[i]);if(tmp>-1)index.push(tmp);}}
+else
+{index=privateMethods.findIndexByValue(object,value);}
+break;}
+if(!options.multiple&&(!properties.initialized||properties.index!=index)&&index>-1)
+{objects.list.find('.ui-category-selector-selected-item').removeClass('ui-category-selector-selected-item');objects.list.find('[catId="'+value+'"]').addClass('ui-category-selector-selected-item');title=privateMethods.getParentName(object,objects.list.find('[catId="'+value+'"] div.ui-category-selector-name')).replace('&','&').replace('>','>').replace('<','<');properties.index=index;objects.containerName.html(properties.categories[properties.index].name).attr('title',title);objects.containerStatus.html(properties.labelStatus[properties.categories[properties.index].status]);if(trigger&&options.change)object.trigger('categorySelectorChange',[properties.categories[properties.index].id]);if(properties.index>-1)return(properties.categories[properties.index].id);}
+else if(options.multiple)
+{if(!$.isArray(index))
+{if(index<0||index==null)return(-1);index=[index];}
+tmp=[];for(var i=0;i<index.length;i++)
+{var item=objects.list.find('[catId="'+properties.categories[index[i]].id+'"]');if(item.hasClass('ui-category-selector-selected-item'))
+{item.removeClass('ui-category-selector-selected-item');tmpIndex=$.inArray(index[i],properties.index);if(tmpIndex>-1)properties.index.splice(tmpIndex,1);}
+else
+{item.addClass('ui-category-selector-selected-item');properties.index.push(index[i]);}
+tmp.push(properties.categories[index[i]].id);}
+objects.containerList.html('');objects.list.find('.ui-category-selector-selected-item div.ui-category-selector-name').each(function()
+{var path='';title=privateMethods.getParentName(object,$(this)).replace('&','&').replace('>','>').replace('<','<');if(!options.displayPath)
+{path=$(this).html();}
+else
+{path=title;}
+objects.containerList.append($('<li/>',{html:path,title:title,'class':'ui-category-selector-selected-cat'}).prepend($('<span/>',{html:'x'}).bind('click.categorySelector',{object:object,value:$(this).parent().parent().attr('catid')},function(event)
+{event.stopPropagation();privateMethods.setValue(event.data.object,event.data.value);})))});if(objects.containerList.children().length==0)objects.containerList.append('<li> </li>');if(trigger&&options.change)object.trigger('categorySelectorChange',[tmp]);return(tmp);}
+return(null);},getParentName:function(object,item)
+{if(item==null||item.length==0)return('');foundItem=item.parent().parent().parent().prev().find('div.ui-category-selector-name');if(foundItem.length==0)return(item.html());return(privateMethods.getParentName(object,foundItem)+' / '+item.html());},displaySelector:function(object,value)
+{var options=object.data('options'),properties=object.data('properties'),objects=object.data('objects');if(properties.selectorVisible!=value)
+{properties.selectorVisible=value;if(properties.selectorVisible&&properties.categories.length>0)
+{var index=0;objects.listContainer.css({display:'block','min-width':objects.listContainer.parent().css('width')});if($.isArray(properties.index))
+{if(properties.index.length>0)index=properties.index[0];}
+else if(properties.index>-1)
+{index=properties.index;}
+objects.listContainer.scrollTop(objects.listContainer.scrollTop()+objects.list.find('[catId="'+properties.categories[index].id+'"]').position().top);}
+else
+{objects.listContainer.css('display','none');}
+if(options.popup)object.trigger('categorySelectorPopup',[properties.selectorVisible]);}
+return(properties.selectorVisible);},load:function(object)
+{var options=object.data('options'),objects=object.data('objects');if(options.serverUrl=='')return(false);$.ajax({type:"POST",url:options.serverUrl,async:true,data:{ajaxfct:options.userMode+'.categorySelector.getList',filter:options.filter,galleryRoot:options.galleryRoot?'y':'n',tree:'y'},success:function(msg)
+{privateMethods.setItems(object,msg);},error:function(msg)
+{objects.listContainer.html('Error ! '+msg);}});},listClear:function(object)
+{var objects=object.data('objects'),options=object.data('options'),properties=object.data('properties');objects.list.children().unbind();objects.list.html('');if(options.multiple)
+{properties.index=[];}
+else
+{properties.index=-1;}
+properties.categories=[];},listAddItems:function(object,listItems,parent)
+{var options=object.data('options'),properties=object.data('properties'),objects=object.data('objects');var previousLevel=-1;for(var i=0;i<listItems.length;i++)
+{properties.categories.push({id:listItems[i].id,level:listItems[i].level,name:listItems[i].name,status:listItems[i].status,childs:listItems[i].childs.length});if(options.displayStatus)
+{status="<div class='ui-category-selector-status'>"+properties.labelStatus[listItems[i].status]+"</div>";}
+else
+{status="";}
+var spaceWidth=(options.iconWidthEC+listItems[i].level*options.levelIndent),li=$('<li/>',{'class':'ui-category-selector-item',html:"<div>"+status+"<div class='ui-category-selector-name'>"+listItems[i].name+"</div></div>",catId:listItems[i].id,level:listItems[i].level,css:{'padding-left':spaceWidth+'px'}}).bind('click.categorySelector',{object:object,expandArea:spaceWidth,nbchilds:listItems[i].childs.length},function(event)
+{event.layerX=event.pageX-$(event.currentTarget).offset().left;event.layerY=event.pageY-$(event.currentTarget).offset().top;if(event.layerX<event.data.expandArea&&event.data.nbchilds>0)
+{if($(this).hasClass('ui-category-selector-expandable-item'))
+{$(this).removeClass('ui-category-selector-expandable-item').addClass('ui-category-selector-collapsable-item').next().show();}
+else
+{$(this).removeClass('ui-category-selector-collapsable-item').addClass('ui-category-selector-expandable-item').next().hide();}}
+else
+{privateMethods.setValue(event.data.object,$(this).attr('catId'),true);if(options.multiple)
+{}
+else
+{privateMethods.displaySelector(event.data.object,false);}}
+if(options.multiple)objects.container.focus();});if(listItems[i].childs.length>0)
+{li.addClass('ui-category-selector-collapsable-item').css('background-position',(options.levelIndent*listItems[i].level)+'px 0px');}
+if(options.multiple)
+{li.children().prepend('<div class="ui-category-selector-check"></div>');}
+parent.append(li);if(listItems[i].childs.length>0)
+{var ul=$('<ul/>',{'class':'ui-category-selector-group',css:{listStyle:'none',padding:'0px',margin:'0px','font-size':(100-listItems[i].level*2)+'%'}});li.after(ul);privateMethods.listAddItems(object,listItems[i].childs,ul);}}},findIndexByValue:function(object,value)
+{var properties=object.data('properties');for(var i=0;i<properties.categories.length;i++)
+{if(properties.categories[i].id==value)return(i);}
+return(-1);},setEventPopup:function(object,value)
+{var options=object.data('options');options.popup=value;object.unbind('categorySelectorPopup');if(value)object.bind('categorySelectorPopup',options.popup);return(options.popup);},setEventChange:function(object,value)
+{var options=object.data('options');options.change=value;object.unbind('categorySelectorChange');if(value)object.bind('categorySelectorChange',options.change);return(options.change);},setEventLoad:function(object,value)
+{var options=object.data('options');options.load=value;object.unbind('categorySelectorLoad');if(value)object.bind('categorySelectorLoad',options.load);return(options.load);}};$.fn.categorySelector=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.categorySelector');}}})(jQuery);
Index: /extensions/GrumPluginClasses/js/ui.categorySelector.packed.js
===================================================================
--- /extensions/GrumPluginClasses/js/ui.categorySelector.packed.js	(revision 8960)
+++ /extensions/GrumPluginClasses/js/ui.categorySelector.packed.js	(revision 8961)
@@ -1,2 +1,2 @@
-/* file: ui.categorySelector.js - v1.0.1 | packed on 2010/10/14 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}('(g($){k 1T={2T:g(2w){c b.t(g(){k $b=$(b),e=$b.e(\'6\'),f=$b.e(\'f\'),8=$b.e(\'8\'),6={R:K,1b:K,11:K,17:0,12:0,T:16,10:15,V:18,1d:\'3C/3x/3u.3E\',N:\'2D\',1e:q,13:q,M:q,D:G,1h:\'22\'};$b.e(\'6\',6);a(!8){$b.e(\'8\',{h:-1,F:G,1v:G,u:[],1N:[\'\',\'\'],});8=$b.e(\'8\')}a(!f){f={28:$(\'<O/>\',{\'1f\':\'p-o-m\',I:{1C:\'2U%\'}}).1A(\'2N.1p\',g(){j.1U($b,!$b.e(\'8\').1v)}),1K:$(\'<O/>\',{1a:\'&20;\',\'1f\':\'p-o-m-1c\',}),25:$(\'<O/>\',{\'1f\':\'p-o-m-Z\',I:{2y:\'2z\',1O:(6.11)?\'2Q\':\'1n\'}}),2x:$(\'<O/>\',{1a:\'&3N;\',\'1f\':\'p-o-m-35\',I:{\'2y\':\'2z\',3v:\'3h\'}}),Q:$(\'<O/>\',{1a:"",\'1f\':\'p-o-m-v\',I:{3g:"3f",1O:\'1n\',2i:\'3d\'}}).1A(\'3e.1p\',g(){j.1U($b,G)}),v:$(\'<1z/>\',{I:{2P:\'1n\',1H:\'1I\',2W:\'1I\'}})};$b.1a(\'\').1w(f.28.1w(f.2x).1w(f.25).1w(f.1K)).1w(f.Q.1w(f.v));$b.e(\'f\',f)}j.29($b,2w)})},3o:g(){c b.t(g(){k $b=$(b),f=$b.e(\'f\');f.28.1s().2A();f.v.2J().1s();f.Q.2A();$b.1s(\'.1p\').I({1C:\'\',2g:\'\'})})},6:g(7){c b.t(g(){j.29($(b),7)})},R:g(7){a(7!=q){c b.t(g(){j.2b($(b),7)})}l{k 6=b.e(\'6\');a(6){c(6.R)}l{c(K)}}},1b:g(7){a(7!=q){c b.t(g(){j.2a($(b),7)})}l{k 6=b.e(\'6\');a(6){c(6.1b)}l{c(K)}}},17:g(7){a(7){c b.t(g(){j.24($(b),7)})}l{k 6=b.e(\'6\');a(6){c(6.17)}l{c(0)}}},12:g(7){a(7){c b.t(g(){j.21($(b),7)})}l{k 6=b.e(\'6\');a(6){c(6.12)}l{c(0)}}},11:g(7){a(7!=q){c b.t(g(){j.2r($(b),7)})}l{k 6=b.e(\'6\');a(6){c(6.11)}l{c(K)}}},T:g(7){a(7){c b.t(g(){j.2s($(b),7)})}l{k 6=b.e(\'6\');a(6){c(6.T)}l{c(0)}}},1d:g(7){a(7){c b.t(g(){j.2t($(b),7)})}l{k 6=b.e(\'6\');a(6){c(6.1d)}l{c(\'\')}}},N:g(7){a(7){c b.t(g(){j.2q($(b),7)})}l{k 6=b.e(\'6\');a(6){c(6.N)}l{c(\'\')}}},3k:g(7){c b.t(g(){a(!7)7=\':1y\';j.2n($(b),7,\'C\')})},3l:g(7){c b.t(g(){a(!7)7=\':1y\';j.2n($(b),7,\'E\')})},10:g(7){a(7){c b.t(g(){j.2v($(b),7)})}l{k 6=b.e(\'6\');a(6){c(6.10)}l{c(0)}}},V:g(7){a(7){c b.t(g(){j.1P($(b),7)})}l{k 6=b.e(\'6\');a(6){c(6.V)}l{c(0)}}},1h:g(7){a(7){c b.t(g(){j.2h($(b),7)})}l{k 6=b.e(\'6\');a(6){c(6.1h)}l{c(0)}}},1c:g(){k 6=b.e(\'6\'),8=b.e(\'8\'),f=b.e(\'f\');a(!6.D){c(8.u[8.h].1c)}l{k 27=[];1u(k i=0;i<8.h.A;i++){27.1i(8.u[8.h[i]].1c)}c(27)}},7:g(7){a(7){c b.t(g(){j.1r($(b),7)})}l{k 8=b.e(\'8\'),6=b.e(\'6\');a(8&&8.h!=q&&!6.D&&8.h>-1&&8.h<8.u.A){c(8.u[8.h].19)}l a(8&&8.h!=q&&6.D){k 1B=[];1u(k i=0;i<8.h.A;i++){a(8.h[i]>-1&&8.h[i]<8.u.A)1B.1i(8.u[8.h[i]].19)}c(1B)}l{c(q)}}},M:g(7){a(7&&$.2d(7)){c b.t(g(){j.1X($(b),7)})}l{j.M(b)}},1e:g(7){a(7&&$.2d(7)){c b.t(g(){j.1Z($(b),7)})}l{k 6=b.e(\'6\');a(6){c(6.1e)}l{c(q)}}},13:g(7){a(7&&$.2d(7)){c b.t(g(){j.1V($(b),7)})}l{k 6=b.e(\'6\');a(6){c(6.13)}l{c(q)}}},3b:g(){k 8=b.e(\'8\');a(8){c(8.u.A)}l{c(q)}},8:g(7){k 8=b.e(\'8\');a(8&&7==\':2e\'&&8.u.A>0){c(8.u[0])}l a(8&&8.h!=q&&(7==\':P\'||7==q)&&8.u.A>0){a(!2E.D&&8.h>-1&&8.h<8.u.A){c(8.u[8.h])}l a(2E.D){k 1B=[];1u(k i=0;i<8.h.A;i++){a(8.h[i]>-1&&8.h<8.u.A)1B.1i(8.u[8.h[i]])}c(1B)}c(q)}l a(8&&7>-1){k h=j.1x(b,7);a(h>-1){c(8.u[h])}c(q)}l{c(q)}},};k j={29:g(9,7){k 8=9.e(\'8\'),6=9.e(\'6\');a(!$.2Y(7))c(G);8.F=G;j.2b(9,(7.R!=q)?7.R:6.R);j.2a(9,(7.1b!=q)?7.1b:6.1b);j.2r(9,(7.11!=q)?7.11:6.11);j.24(9,(7.17!=q)?7.17:6.17);j.21(9,(7.12!=q)?7.12:6.12);j.2s(9,(7.T!=q)?7.T:6.T);j.2v(9,(7.10!=q)?7.10:6.10);j.1P(9,(7.V!=q)?7.V:6.V);j.2t(9,(7.1d!=q)?7.1d:6.1d);j.2q(9,(7.N!=q)?7.N:6.N);j.2h(9,(7.1h!=q)?7.1h:6.1h);j.1Z(9,(7.1e!=q)?7.1e:6.1e);j.1V(9,(7.13!=q)?7.13:6.13);j.1X(9,(7.M!=q)?7.M:6.M);j.2G(9,(7.D!=q)?7.D:6.D);a(6.R)j.M(9);8.F=K},2b:g(9,7){k 6=9.e(\'6\'),8=9.e(\'8\');a((!8.F||6.R!=7)&&(7==K||7==G)){6.R=7}c(6.R)},2a:g(9,7){k 6=9.e(\'6\'),8=9.e(\'8\');a((!8.F||6.1b!=7)&&(7==K||7==G)){6.1b=7;a(6.R&&8.F)j.M(9)}c(6.1b)},24:g(9,7){k 6=9.e(\'6\'),8=9.e(\'8\'),f=9.e(\'f\');a((!8.F||6.17!=7)&&7>=0){6.17=7;a(6.17>0){f.Q.I(\'1S-1C\',6.17+\'1q\')}l{f.Q.I(\'1S-1C\',\'\')}}c(6.17)},21:g(9,7){k 6=9.e(\'6\'),8=9.e(\'8\'),f=9.e(\'f\');a((!8.F||6.12!=7)&&7>=0){6.12=7;a(6.12>0){f.Q.I(\'1S-2g\',6.12+\'1q\')}l{f.Q.I(\'1S-2g\',\'\')}}c(6.12)},2r:g(9,7){k 6=9.e(\'6\'),8=9.e(\'8\'),f=9.e(\'f\');a((!8.F||6.11!=7)&&(7==K||7==G)){6.11=7;a(6.11){9.B(\'.p-o-m-Z\').2f()}l{9.B(\'.p-o-m-Z\').2p()}}c(6.11)},2s:g(9,7){k 6=9.e(\'6\'),8=9.e(\'8\'),f=9.e(\'f\');a((!8.F||6.T!=7)&&7>=0){6.T=7;f.v.B(\'.p-o-m-r\').t(g(){$(b).I(\'1H-1J\',(6.10+6.V+$(b).H(\'z\')*6.T)+\'1q\')})}c(6.T)},2t:g(9,7){k 6=9.e(\'6\'),8=9.e(\'8\');a(!8.F||6.1d!=7){6.1d=7;a(6.R&&8.F)j.M(9)}c(6.1d)},2q:g(9,7){k 6=9.e(\'6\'),8=9.e(\'8\');a((!8.F||6.N!=7)&&(7==\'1n\'||7==\'2D\'||7==\'22\')){6.N=7;a(6.R&&8.F)j.M(9)}c(6.N)},2v:g(9,7){k 6=9.e(\'6\'),8=9.e(\'8\'),f=9.e(\'f\');a((!8.F||6.10!=7)&&7>=0){6.10=7;f.v.B(\'.p-o-m-r\').t(g(){$(b).I(\'1H-1J\',(6.10+6.V+$(b).H(\'z\')*6.T)+\'1q\')})}c(6.N)},1P:g(9,7){k 6=9.e(\'6\'),8=9.e(\'8\'),f=9.e(\'f\');a((!8.F||6.V!=7)&&(7>=0&&6.D||!6.D&&7==0)){6.V=7;f.v.B(\'.p-o-m-r\').t(g(){$(b).I(\'1H-1J\',(6.10+6.V+$(b).H(\'z\')*6.T)+\'1q\')})}c(6.N)},2G:g(9,7){k 6=9.e(\'6\'),8=9.e(\'8\'),f=9.e(\'f\');a((!8.F||6.D!=7)&&(7==K||7==G)){a(!7){j.1P(9,0);8.h=-1}l{8.h=[];f.Q.1g(\'p-o-m-D\')}6.D=7}c(6.N)},2h:g(9,7){k 6=9.e(\'6\'),8=9.e(\'8\'),f=9.e(\'f\');a((!8.F||6.1h!=7)&&(7==\'3O\'||7==\'22\')){6.1h=7;a(6.R&&8.F)j.M(9)}c(6.N)},2n:g(9,7,14){k f=9.e(\'f\');1L=/^(?:(:1y)(?:(=|<|>|\\+)(\\d+))?)|(?:(\\d+)(<|>|\\+))?$/i;s=1L.2H(7);a(s!=q){1o(14){x\'C\':X=j.2u;w;x\'E\':X=j.2j;w}a(s[1]==\':1y\'){f.v.B(\'.p-o-m-1k-r, .p-o-m-1j-r\').t(X)}l a(s[4]!=q){1o(s[5]){x\'+\':f.v.B(\'.p-o-m-1k-r, .p-o-m-1j-r\').t(j.2u);f.v.B(\':2I([S=\'+s[4]+\'])\').2B().t(j.2j);f.v.B(\'[S=\'+s[4]+\']\').t(X);w;x\'>\':f.v.B(\'[S=\'+s[4]+\'] + 1z\').B(\'.p-o-m-1k-r, .p-o-m-1j-r\').t(X);f.v.B(\'[S=\'+s[4]+\']\').t(X);w;x\'<\':f.v.B(\':2I([S=\'+s[4]+\'])\').2B().t(X);f.v.B(\'[S=\'+s[4]+\']\').t(X);w;2C:f.v.B(\'[S=\'+s[4]+\']\').t(X);w}}}},2j:g(h,U){j.X(h,U,\'E\')},2u:g(h,U){j.X(h,U,\'C\')},X:g(h,U,14){1m=\'\';k $U=$(U);a(s.A>2&&s[2]!=q&&s[3]!=q){1o(s[2]){x\'=\':a($U.H(\'z\')==s[3])1m=14;w;x\'>\':a($U.H(\'z\')>=s[3])1m=14;w;x\'<\':a($U.H(\'z\')<=s[3])1m=14;w;x\'+\':a((14==\'E\'&&$U.H(\'z\')<=s[3])||(14==\'C\'&&$U.H(\'z\')>=s[3])){1m=14}l{1m=(14==\'C\')?\'E\':\'C\'}w}}l 1m=14;1o(1m){x\'C\':$U.1l(\'p-o-m-1k-r p-o-m-1j-r\').1g(\'p-o-m-1k-r\').1Q().2p();w;x\'E\':$U.1l(\'p-o-m-1k-r p-o-m-1j-r\').1g(\'p-o-m-1j-r\').1Q().2f();w}},1r:g(9,7,1t){k 6=9.e(\'6\'),8=9.e(\'8\'),f=9.e(\'f\'),h=-1;1L=/^(:2F|:1y|:1n)(?:(=|<|>)(\\d+))$/i;s=1L.2H(7);a(s!=q)7=s[1];1o(7){x\':2e\':a(8.u.A>0)h=0;w;x\':3y\':h=8.u.A-1;w;x\':2F\':a(!6.D)c(G);8.h=[];f.v.B(\'.p-o-m-r\').t(g(){k $b=$(b),L=K;a(s!=q){1o(s[2]){x\'=\':L=($b.H(\'z\')==s[3]);w;x\'>\':L=($b.H(\'z\')>=s[3]);w;x\'<\':L=($b.H(\'z\')<=s[3]);w}}a(L){a($b.2l(\'p-o-m-P-r\')){$b.1l(\'p-o-m-P-r\')}l{$b.1g(\'p-o-m-P-r\');W=j.1x(9,$b.H(\'S\'));a(W>-1)8.h.1i(W)}}});j.1r(9,[],G);c(G);w;x\':1n\':a(!6.D)c(G);8.h=[];f.v.B(\'.p-o-m-P-r\').t(g(){k $b=$(b),L=K;a(s!=q){1o(s[2]){x\'=\':L=($b.H(\'z\')==s[3]);w;x\'>\':L=($b.H(\'z\')>=s[3]);w;x\'<\':L=($b.H(\'z\')<=s[3]);w}}a(L)$b.1l(\'p-o-m-P-r\')});j.1r(9,[],G);c(G);w;x\':1y\':a(!6.D)c(G);8.h=[];f.v.B(\'.p-o-m-r\').t(g(){k $b=$(b),L=K;a(s!=q){1o(s[2]){x\'=\':L=($b.H(\'z\')==s[3]);w;x\'>\':L=($b.H(\'z\')>=s[3]);w;x\'<\':L=($b.H(\'z\')<=s[3]);w}}a(L){W=j.1x(9,$b.H(\'S\'));a(W>-1)8.h.1i(W);$b.1g(\'p-o-m-P-r\')}});j.1r(9,[],G);c(G);w;2C:a($.1W(7)&&6.D){h=[];1u(k i=0;i<7.A;i++){W=j.1x(9,7[i]);a(W>-1)h.1i(W)}}l{h=j.1x(9,7)}w}a(!6.D&&(!8.F||8.h!=h)&&h>-1){f.v.B(\'.p-o-m-P-r\').1l(\'p-o-m-P-r\');f.v.B(\'[S="\'+7+\'"]\').1g(\'p-o-m-P-r\');8.h=h;f.1K.1a(8.u[8.h].1c);f.25.1a(8.1N[8.u[8.h].Z]);a(1t&&6.13)9.1t(\'1R\',[8.u[8.h].19]);a(8.h>-1)c(8.u[8.h].19)}l a(6.D){a(!$.1W(h)){a(h<0||h==q)c(-1);h=[h]}W=[];1u(k i=0;i<h.A;i++){k r=f.v.B(\'[S="\'+8.u[h[i]].19+\'"]\');a(r.2l(\'p-o-m-P-r\')){r.1l(\'p-o-m-P-r\');26=$.3I(h[i],8.h);a(26>-1)8.h.3J(26,1)}l{r.1g(\'p-o-m-P-r\');8.h.1i(h[i])}W.1i(8.u[h[i]].19)}1G=\'\';f.v.B(\'.p-o-m-P-r O.p-o-m-1c\').t(g(){1G+=((1G==\'\')?\'\':\'&20;; \')+$(b).1a()});a(1G==\'\')1G="&20;";f.1K.1a(1G);a(1t&&6.13)9.1t(\'1R\',[W]);c(W)}c(q)},1U:g(9,7){k 6=9.e(\'6\'),8=9.e(\'8\'),f=9.e(\'f\');a(8.1v!=7){8.1v=7;a(8.1v&&8.u.A>0){k h=0;f.Q.I({1O:\'2Q\',\'3m-1C\':f.Q.2o().I(\'1C\')});a($.1W(8.h)){a(8.h.A>0)h=8.h[0]}l a(8.h>-1){h=8.h}f.Q.2X(f.Q.2X()+f.v.B(\'[S="\'+8.u[h].19+\'"]\').2i().3c)}l{f.Q.I(\'1O\',\'1n\')}a(6.1e)9.1t(\'1Y\',[8.1v])}c(8.1v)},M:g(9){k 6=9.e(\'6\'),8=9.e(\'8\'),f=9.e(\'f\');$.36({3Q:"3P",3D:6.1d,3r:K,e:{3s:6.1h+\'.1p.3a\',N:6.N,1b:6.1b?\'y\':\'n\',3z:\'y\'},3A:g(1M){v=$.3B(1M);8.1N=v.Z;j.2V(9);j.2c(9,v.u,f.v);8.F=G;j.1r(9,\':2e\');8.F=K;a(6.M)9.1t(\'23\')},2R:g(1M){f.Q.1a(\'3w ! \'+1M)},})},2V:g(9){k f=9.e(\'f\'),6=9.e(\'6\'),8=9.e(\'8\');f.v.2J().1s();f.v.1a(\'\');a(6.D){8.h=[]}l{8.h=-1}8.u=[]},2c:g(9,J,2o){k 6=9.e(\'6\'),8=9.e(\'8\'),f=9.e(\'f\');k 3t=-1;1u(k i=0;i<J.A;i++){8.u.1i({19:J[i].19,z:J[i].z,1c:J[i].1c,Z:J[i].Z,1E:J[i].1E.A});a(6.11){Z="<O 1f=\'p-o-m-Z\'>"+8.1N[J[i].Z]+"</O>"}l{Z=""}k 2k=(6.10+6.V+J[i].z*6.T),1F=$(\'<1F/>\',{\'1f\':\'p-o-m-r\',1a:"<O>"+Z+"<O 1f=\'p-o-m-1c\'>"+J[i].1c+"</O></O>",S:J[i].19,z:J[i].z,I:{\'1H-1J\':2k+\'1q\'}}).1A(\'2N.1p\',{9:9,2K:2k,2L:J[i].1E.A},g(Y){a(!Y.2m&&Y.2M){Y.2m=Y.2M;Y.3G=Y.3M}a(Y.2m<Y.e.2K&&Y.e.2L>0){a($(b).2l(\'p-o-m-1k-r\')){$(b).1l(\'p-o-m-1k-r\').1g(\'p-o-m-1j-r\').1Q().2f()}l{$(b).1l(\'p-o-m-1j-r\').1g(\'p-o-m-1k-r\').1Q().2p()}}l{j.1r(Y.e.9,$(b).H(\'S\'),K);a(6.D){}l{j.1U(Y.e.9,G)}}});a(J[i].1E.A>0){1F.1g(\'p-o-m-1j-r\').I(\'3K-2i\',(6.V+6.T*J[i].z)+\'1q 1I\')}a(6.D){1F.3L(\'<O 1f="p-o-m-3F"></O>\')}2o.1w(1F);a(J[i].1E.A>0){k 1z=$(\'<1z/>\',{\'1f\':\'p-o-m-3H\',I:{2P:\'1n\',1H:\'1I\',2W:\'1I\',\'3q-3p\':(2U-J[i].z*2)+\'%\'}});1F.37(1z);j.2c(9,J[i].1E,1z)}}},1x:g(9,7){k 8=9.e(\'8\');1u(k i=0;i<8.u.A;i++){a(8.u[i].19==7)c(i)}c(-1)},1Z:g(9,7){k 6=9.e(\'6\');6.1e=7;9.1s(\'1Y\');a(7)9.1A(\'1Y\',6.1e);c(6.1e)},1V:g(9,7){k 6=9.e(\'6\');6.13=7;9.1s(\'1R\');a(7)9.1A(\'1R\',6.13);c(6.13)},1X:g(9,7){k 6=9.e(\'6\');6.M=7;9.1s(\'23\');a(7)9.1A(\'23\',6.M);c(6.M)}};$.39.1p=g(1D){a(1T[1D]){c 1T[1D].L(b,34.33.2Z.30(2S,1))}l a(32 1D===\'9\'||!1D){c 1T.2T.L(b,2S)}l{$.2R(\'3n \'+1D+\' 3j 3i 31 38 2O.1p\')}}})(2O);',62,239,'||||||options|value|properties|object|if|this|return||data|objects|function|index||privateMethods|var|else|selector||category|ui|null|item|target|each|categories|list|break|case||level|length|find||multiple||initialized|false|attr|css|listItems|true|apply|load|filter|div|selected|listContainer|autoLoad|catId|levelIndent|domElt|iconWidthCheck|tmp|applyExpandCollapse|event|status|iconWidthEC|displayStatus|listMaxHeight|change|mode|||listMaxWidth||id|html|galleryRoot|name|serverUrl|popup|class|addClass|userMode|push|collapsable|expandable|removeClass|action|none|switch|categorySelector|px|setValue|unbind|trigger|for|selectorVisible|append|findIndexByValue|all|ul|bind|returned|width|method|childs|li|containerHtml|padding|0px|left|containerName|re|msg|labelStatus|display|setIconWidthCheck|next|categorySelectorChange|max|publicMethods|displaySelector|setEventChange|isArray|setEventLoad|categorySelectorPopup|setEventPopup|nbsp|setListMaxHeight|public|categorySelectorLoad|setListMaxWidth|containerStatus|tmpIndex|listNames|container|setOptions|setGalleryRoot|setAutoLoad|listAddItems|isFunction|first|show|height|setUserMode|position|applyExpand|spaceWidth|hasClass|layerX|setExpandCollapse|parent|hide|setFilter|setDisplayStatus|setLevelIndent|setServerUrl|applyCollapse|setIconWidthEC|opt|containerArrow|float|right|remove|prev|default|accessible|option|invert|setMultiple|exec|has|children|expandArea|nbchilds|offsetX|click|jQuery|listStyle|block|error|arguments|init|100|listClear|margin|scrollTop|isPlainObject|slice|call|exist|typeof|prototype|Array|arrow|ajax|after|on|fn|getList|numberOfCategories|top|absolute|mouseleave|auto|overflow|pointer|not|does|collapse|expand|min|Method|destroy|size|font|async|ajaxfct|previousLevel|gpc_ajax|cursor|Error|GrumPluginClasses|last|tree|success|parseJSON|plugins|url|php|check|layerY|group|inArray|splice|background|prepend|offsetY|dArr|admin|POST|type'.split('|'),0,{}))
+/* file: ui.categorySelector.js - v1.1.0 | packed on 2011/01/27 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}('(h($){l 22={2X:h(36){c b.u(h(){l $b=$(b),g=$b.g(\'6\'),f=$b.g(\'f\'),8=$b.g(\'8\'),6={X:L,1a:L,14:L,1c:0,1b:0,Y:16,18:15,1f:\'3s/3r/3t.3u\',1g:\'32\',1n:o,1k:o,R:o,H:w,1h:\'27\',1u:\'1S\',1w:w,1o:\'&3m;\'};$b.g(\'6\',6);a(!8){$b.g(\'8\',{j:-1,G:w,1A:w,v:[],1V:[\'\',\'\'],2a:w,1G:L});8=$b.g(\'8\')}a(!f){f={1L:$(\'<Q/>\',{\'19\':\'p-r-q\',3v:0,M:{1H:\'35%\'}}).12(\'1S.10\',h(){k.1R($b,!$b.g(\'8\').1A);$(b).3n()}),23:$(\'<Q/>\',{K:\'&2k;\',\'19\':\'p-r-q-17\'}),1e:o,2d:$(\'<Q/>\',{\'19\':\'p-r-q-W\',M:{38:\'37\',1Z:(6.14)?\'3k\':\'1q\'}}),2F:$(\'<Q/>\',{K:\'&3m;\',\'19\':\'p-r-q-2r\',M:{\'38\':\'37\',3G:\'3x\'}}).12(\'3F\',h(){$(b).13(\'p-r-q-2r-39\')}).12(\'3H\',h(){$(b).1m(\'p-r-q-2r-39\')}),S:$(\'<Q/>\',{K:"",\'19\':\'p-r-q-B\',M:{2W:"33",1Z:\'1q\',2C:\'3I\'}}),B:$(\'<1F/>\',{M:{2B:\'1q\',1K:\'1D\',2Q:\'1D\'}})}}$b.g(\'f\',f);k.2f($b,36);a($b.K()!=\'\')k.2K($b,$b.K());$b.K(\'\').1l(f.1L.1l(f.2F).1l(f.2d).1l(f.23)).1l(f.S.1l(f.B))})},3J:h(){c b.u(h(){l $b=$(b),f=$b.g(\'f\');f.1L.1p().2N();f.B.28().1p();f.S.2N();$b.1p(\'.10\').M({1H:\'\',2o:\'\'})})},6:h(7){c b.u(h(){k.2f($(b),7)})},X:h(7){a(7!=o){c b.u(h(){k.2l($(b),7)})}m{l 6=b.g(\'6\');a(6){c(6.X)}m{c(L)}}},1a:h(7){a(7!=o){c b.u(h(){k.2q($(b),7)})}m{l 6=b.g(\'6\');a(6){c(6.1a)}m{c(L)}}},1c:h(7){a(7!=o){c b.u(h(){k.2j($(b),7)})}m{l 6=b.g(\'6\');a(6){c(6.1c)}m{c(0)}}},1b:h(7){a(7!=o){c b.u(h(){k.2n($(b),7)})}m{l 6=b.g(\'6\');a(6){c(6.1b)}m{c(0)}}},14:h(7){a(7!=o){c b.u(h(){k.2i($(b),7)})}m{l 6=b.g(\'6\');a(6){c(6.14)}m{c(L)}}},Y:h(7){a(7!=o){c b.u(h(){k.2h($(b),7)})}m{l 6=b.g(\'6\');a(6){c(6.Y)}m{c(0)}}},1f:h(7){a(7!=o){c b.u(h(){k.2e($(b),7)})}m{l 6=b.g(\'6\');a(6){c(6.1f)}m{c(\'\')}}},1g:h(7){a(7!=o){c b.u(h(){k.2g($(b),7)})}m{l 6=b.g(\'6\');a(6){c(6.1g)}m{c(\'\')}}},3E:h(7){c b.u(h(){a(!7)7=\':1J\';k.2s($(b),7,\'C\')})},3D:h(7){c b.u(h(){a(!7)7=\':1J\';k.2s($(b),7,\'E\')})},18:h(7){a(7!=o){c b.u(h(){k.2P($(b),7)})}m{l 6=b.g(\'6\');a(6){c(6.18)}m{c(0)}}},1h:h(7){a(7!=o){c b.u(h(){k.2y($(b),7)})}m{l 6=b.g(\'6\');a(6){c(6.1h)}m{c(0)}}},17:h(){l 6=b.g(\'6\'),8=b.g(\'8\');a(!6.H){c(8.v[8.j].17)}m{l 2c=[];1C(l i=0;i<8.j.A;i++){2c.1t(8.v[8.j[i]].17)}c(2c)}},1u:h(7){a(7!=o){c b.u(h(){k.2t($(b),7)})}m{l 6=b.g(\'6\');a(6){c(6.1u)}m{c(0)}}},1w:h(7){a(7!=o){c b.u(h(){k.2D($(b),7)})}m{l 6=b.g(\'6\');a(6){c(6.1w)}m{c(0)}}},1o:h(7){a(7!=o){c b.u(h(){k.2G($(b),7)})}m{l 6=b.g(\'6\');a(6){c(6.1o)}m{c(\'\')}}},7:h(7){a(7!=o){c b.u(h(){k.1s($(b),7)})}m{l 8=b.g(\'8\'),6=b.g(\'6\');a(8&&8.j!=o&&!6.H&&8.j>-1&&8.j<8.v.A){c(8.v[8.j].1i)}m a(8&&8.j!=o&&6.H){l 1Q=[];1C(l i=0;i<8.j.A;i++){a(8.j[i]>-1&&8.j[i]<8.v.A)1Q.1t(8.v[8.j[i]].1i)}c(1Q)}m{c(o)}}},1G:h(7){a(7!=o){c b.u(h(){k.34($(b),7)})}m{l 8=b.g(\'8\');c(8.1G)}},R:h(7){a(7&&$.2b(7)){c b.u(h(){k.2M($(b),7)})}m{k.R(b)}},1n:h(7){a(7&&$.2b(7)){c b.u(h(){k.2H($(b),7)})}m{l 6=b.g(\'6\');a(6){c(6.1n)}m{c(o)}}},1k:h(7){a(7&&$.2b(7)){c b.u(h(){k.2R($(b),7)})}m{l 6=b.g(\'6\');a(6){c(6.1k)}m{c(o)}}},3z:h(){l 8=b.g(\'8\');a(8){c(8.v.A)}m{c(o)}},8:h(7){l 8=b.g(\'8\'),6=b.g(\'6\');a(8&&7==\':2J\'&&8.v.A>0){c(8.v[0])}m a(8&&8.j!=o&&(7==\':U\'||7==o)&&8.v.A>0){a(!6.H&&8.j>-1&&8.j<8.v.A){c(8.v[8.j])}m a(6.H){l 1Q=[];1C(l i=0;i<8.j.A;i++){a(8.j[i]>-1&&8.j<8.v.A)1Q.1t(8.v[8.j[i]])}c(1Q)}c(o)}m a(8&&7>-1){l j=k.1O(b,7);a(j>-1){c(8.v[j])}c(o)}m{c(o)}},};l k={2f:h(9,7){l 8=9.g(\'8\'),6=9.g(\'6\');a(!$.3y(7))c(w);8.G=w;k.2l(9,(7.X!=o)?7.X:6.X);k.2q(9,(7.1a!=o)?7.1a:6.1a);k.2i(9,(7.14!=o)?7.14:6.14);k.2j(9,(7.1c!=o)?7.1c:6.1c);k.2n(9,(7.1b!=o)?7.1b:6.1b);k.2h(9,(7.Y!=o)?7.Y:6.Y);k.2P(9,(7.18!=o)?7.18:6.18);k.2e(9,(7.1f!=o)?7.1f:6.1f);k.2g(9,(7.1g!=o)?7.1g:6.1g);k.2y(9,(7.1h!=o)?7.1h:6.1h);k.2t(9,(7.1u!=o)?7.1u:6.1u);k.2D(9,(7.1w!=o)?7.1w:6.1w);k.2G(9,(7.1o!=o)?7.1o:6.1o);k.2H(9,(7.1n!=o)?7.1n:6.1n);k.2R(9,(7.1k!=o)?7.1k:6.1k);k.2M(9,(7.R!=o)?7.R:6.R);k.31(9,(7.H!=o)?7.H:6.H);a(6.X)k.R(9);8.G=L},34:h(9,7){l f=9.g(\'f\'),8=9.g(\'8\');a(8.1G!=7){8.1G=7;a(8.1G){f.1L.1m(\'p-1U\')}m{f.1L.13(\'p-1U\')}}c(8.1G)},2l:h(9,7){l 6=9.g(\'6\'),8=9.g(\'8\');a((!8.G||6.X!=7)&&(7==L||7==w)){6.X=7}c(6.X)},2q:h(9,7){l 6=9.g(\'6\'),8=9.g(\'8\');a((!8.G||6.1a!=7)&&(7==L||7==w)){6.1a=7;a(6.X&&8.G)k.R(9)}c(6.1a)},2j:h(9,7){l 6=9.g(\'6\'),8=9.g(\'8\'),f=9.g(\'f\');a((!8.G||6.1c!=7)&&7>=0){6.1c=7;a(6.1c>0){f.S.M(\'29-1H\',6.1c+\'1M\')}m{f.S.M(\'29-1H\',\'\')}}c(6.1c)},2n:h(9,7){l 6=9.g(\'6\'),8=9.g(\'8\'),f=9.g(\'f\');a((!8.G||6.1b!=7)&&7>=0){6.1b=7;a(6.1b>0){f.S.M(\'29-2o\',6.1b+\'1M\')}m{f.S.M(\'29-2o\',\'\')}}c(6.1b)},2i:h(9,7){l 6=9.g(\'6\'),8=9.g(\'8\'),f=9.g(\'f\');a((!8.G||6.14!=7)&&(7==L||7==w)){6.14=7;a(6.14){9.F(\'.p-r-q-W\').2z()}m{9.F(\'.p-r-q-W\').2A()}}c(6.14)},2h:h(9,7){l 6=9.g(\'6\'),8=9.g(\'8\'),f=9.g(\'f\');a((!8.G||6.Y!=7)&&7>=0){6.Y=7;f.B.F(\'.p-r-q-s\').u(h(){$(b).M(\'1K-1X\',(6.18+$(b).J(\'I\')*6.Y)+\'1M\')})}c(6.Y)},2e:h(9,7){l 6=9.g(\'6\'),8=9.g(\'8\');a(!8.G||6.1f!=7){6.1f=7;a(6.X&&8.G)k.R(9)}c(6.1f)},2g:h(9,7){l 6=9.g(\'6\'),8=9.g(\'8\');a((!8.G||6.1g!=7)&&(7==\'1q\'||7==\'32\'||7==\'27\')){6.1g=7;a(6.X&&8.G)k.R(9)}c(6.1g)},2P:h(9,7){l 6=9.g(\'6\'),8=9.g(\'8\'),f=9.g(\'f\');a((!8.G||6.18!=7)&&7>=0){6.18=7;f.B.F(\'.p-r-q-s\').u(h(){$(b).M(\'1K-1X\',(6.18+$(b).J(\'I\')*6.Y)+\'1M\')})}c(6.18)},31:h(9,7){l 6=9.g(\'6\'),8=9.g(\'8\'),f=9.g(\'f\');a((!8.G||6.H!=7)&&(7==L||7==w)){a(!7){8.j=-1;a(f.1e!=o){f.1e.2N();f.1e=o}}m{8.j=[];f.S.13(\'p-r-q-H\');a(f.1e==o){f.1e=$(\'<1F/>\',{M:{2B:\'1q\',1K:\'1D\',2Q:\'1D\',2W:"33"},K:\'<1j>&2k;</1j>\'});f.23.K(\'\').1l(f.1e)}}6.H=7}c(6.H)},2y:h(9,7){l 6=9.g(\'6\'),8=9.g(\'8\');a((!8.G||6.1h!=7)&&(7==\'3K\'||7==\'27\')){6.1h=7;a(6.X&&8.G)k.R(9)}c(6.1h)},2t:h(9,7){l 6=9.g(\'6\'),8=9.g(\'8\'),f=9.g(\'f\');a((!8.G||6.1u!=7)&&(7==\'1S\'||7==\'2V\')){6.1u=7;a(7==\'2V\'){f.S.1p(\'24.10\').1p(\'2S.10\').12(\'24.10\',h(){k.1R(9,w)})}m{f.S.1p(\'24.10\').12(\'24.10\',h(){8.2a=w}).12(\'2S.10\',h(){8.2a=L});$(3q).12(\'3A 3U\',h(O){a(!8.2a)k.1R(9,w)})}}c(6.1u)},2D:h(9,7){l 6=9.g(\'6\'),8=9.g(\'8\'),f=9.g(\'f\');a((!8.G||6.1w!=7)&&(7==L||7==w)){6.1w=7}c(6.1h)},2G:h(9,7){l 6=9.g(\'6\'),8=9.g(\'8\'),f=9.g(\'f\');a(!8.G||6.1o!=7){6.1o=7;f.2F.K(6.1o)}c(6.1o)},2K:h(9,7){l 8=9.g(\'8\'),6=9.g(\'6\'),f=9.g(\'f\');a(7==\'\'||7==o){7={W:[\'\',\'\'],v:[]}}m a($.1W(7)){7={W:\'27\',v:7}}m{4g{7=$.4h($.4f(7))}4e(e){c(w)}}8.1V=7.W;k.3a(9);a(7.v.A>0)k.2E(9,7.v,f.B);8.G=w;a(6.H){k.1s(9,\':1q\')}m{k.1s(9,\':2J\')}8.G=L;a(6.R)9.1E(\'2O\')},2s:h(9,7,1d){l f=9.g(\'f\');21=/^(?:(:1J)(?:(=|<|>|\\+)(\\d+))?)|(?:(\\d+)(<|>|\\+))?$/i;t=21.2U(7);a(t!=o){1y(1d){D\'C\':11=k.2w;z;D\'E\':11=k.2v;z}a(t[1]==\':1J\'){f.B.F(\'.p-r-q-1v-s, .p-r-q-1r-s\').u(11)}m a(t[4]!=o){1y(t[5]){D\'+\':f.B.F(\'.p-r-q-1v-s, .p-r-q-1r-s\').u(k.2w);f.B.F(\':30([T=\'+t[4]+\'])\').2m().u(k.2v);f.B.F(\'[T=\'+t[4]+\']\').u(11);z;D\'>\':f.B.F(\'[T=\'+t[4]+\'] + 1F\').F(\'.p-r-q-1v-s, .p-r-q-1r-s\').u(11);f.B.F(\'[T=\'+t[4]+\']\').u(11);z;D\'<\':f.B.F(\':30([T=\'+t[4]+\'])\').2m().u(11);f.B.F(\'[T=\'+t[4]+\']\').u(11);z;2Z:f.B.F(\'[T=\'+t[4]+\']\').u(11);z}}}},2v:h(j,V){k.11(j,V,\'E\')},2w:h(j,V){k.11(j,V,\'C\')},11:h(j,V,1d){1x=\'\';l $V=$(V);a(t.A>2&&t[2]!=o&&t[3]!=o){1y(t[2]){D\'=\':a($V.J(\'I\')==t[3])1x=1d;z;D\'>\':a($V.J(\'I\')>=t[3])1x=1d;z;D\'<\':a($V.J(\'I\')<=t[3])1x=1d;z;D\'+\':a((1d==\'E\'&&$V.J(\'I\')<=t[3])||(1d==\'C\'&&$V.J(\'I\')>=t[3])){1x=1d}m{1x=(1d==\'C\')?\'E\':\'C\'}z}}m 1x=1d;1y(1x){D\'C\':$V.1m(\'p-r-q-1v-s p-r-q-1r-s\').13(\'p-r-q-1v-s\').25().2A();z;D\'E\':$V.1m(\'p-r-q-1v-s p-r-q-1r-s\').13(\'p-r-q-1r-s\').25().2z();z}},1s:h(9,7,1E){l 6=9.g(\'6\'),8=9.g(\'8\'),f=9.g(\'f\'),j=-1;21=/^(:2Y|:1J|:1q)(?:(=|<|>)(\\d+))$/i;t=21.2U(7);a(t!=o)7=t[1];1y(7){D\':2J\':a(8.v.A>0)j=0;z;D\':4d\':j=8.v.A-1;z;D\':2Y\':a(!6.H)c(w);8.j=[];f.B.F(\'.p-r-q-s\').u(h(){l $b=$(b),P=L;a(t!=o){1y(t[2]){D\'=\':P=($b.J(\'I\')==t[3]);z;D\'>\':P=($b.J(\'I\')>=t[3]);z;D\'<\':P=($b.J(\'I\')<=t[3]);z}}a(P){a($b.2u(\'p-r-q-U-s\')){$b.1m(\'p-r-q-U-s\')}m{$b.13(\'p-r-q-U-s\');Z=k.1O(9,$b.J(\'T\'));a(Z>-1)8.j.1t(Z)}}});k.1s(9,[],w);c(w);z;D\':1q\':a(!6.H)c(w);8.j=[];f.B.F(\'.p-r-q-U-s\').u(h(){l $b=$(b),P=L;a(t!=o){1y(t[2]){D\'=\':P=($b.J(\'I\')==t[3]);z;D\'>\':P=($b.J(\'I\')>=t[3]);z;D\'<\':P=($b.J(\'I\')<=t[3]);z}}a(P)$b.1m(\'p-r-q-U-s\')});k.1s(9,[],w);c(w);z;D\':1J\':a(!6.H)c(w);8.j=[];f.B.F(\'.p-r-q-s\').u(h(){l $b=$(b),P=L;a(t!=o){1y(t[2]){D\'=\':P=($b.J(\'I\')==t[3]);z;D\'>\':P=($b.J(\'I\')>=t[3]);z;D\'<\':P=($b.J(\'I\')<=t[3]);z}}a(P){Z=k.1O(9,$b.J(\'T\'));a(Z>-1)8.j.1t(Z);$b.13(\'p-r-q-U-s\')}});k.1s(9,[],w);c(w);z;2Z:a($.1W(7)&&6.H){j=[];1C(l i=0;i<7.A;i++){Z=k.1O(9,7[i]);a(Z>-1)j.1t(Z)}}m{j=k.1O(9,7)}z}a(!6.H&&(!8.G||8.j!=j)&&j>-1){f.B.F(\'.p-r-q-U-s\').1m(\'p-r-q-U-s\');f.B.F(\'[T="\'+7+\'"]\').13(\'p-r-q-U-s\');1B=k.1T(9,f.B.F(\'[T="\'+7+\'"] Q.p-r-q-17\')).1N(\'&3b;\',\'&\').1N(\'&3j;\',\'>\').1N(\'&3i;\',\'<\');8.j=j;f.23.K(8.v[8.j].17).J(\'1B\',1B);f.2d.K(8.1V[8.v[8.j].W]);a(1E&&6.1k)9.1E(\'20\',[8.v[8.j].1i]);a(8.j>-1)c(8.v[8.j].1i)}m a(6.H){a(!$.1W(j)){a(j<0||j==o)c(-1);j=[j]}Z=[];1C(l i=0;i<j.A;i++){l s=f.B.F(\'[T="\'+8.v[j[i]].1i+\'"]\');a(s.2u(\'p-r-q-U-s\')){s.1m(\'p-r-q-U-s\');2L=$.3L(j[i],8.j);a(2L>-1)8.j.4i(2L,1)}m{s.13(\'p-r-q-U-s\');8.j.1t(j[i])}Z.1t(8.v[j[i]].1i)}f.1e.K(\'\');f.B.F(\'.p-r-q-U-s Q.p-r-q-17\').u(h(){l 26=\'\';1B=k.1T(9,$(b)).1N(\'&3b;\',\'&\').1N(\'&3j;\',\'>\').1N(\'&3i;\',\'<\');a(!6.1w){26=$(b).K()}m{26=1B}f.1e.1l($(\'<1j/>\',{K:26,1B:1B,\'19\':\'p-r-q-U-4k\'}).3f($(\'<4m/>\',{K:\'x\'}).12(\'1S.10\',{9:9,7:$(b).1z().1z().J(\'4n\')},h(O){O.4o();k.1s(O.g.9,O.g.7)})))});a(f.1e.28().A==0)f.1e.1l(\'<1j>&2k;</1j>\');a(1E&&6.1k)9.1E(\'20\',[Z]);c(Z)}c(o)},1T:h(9,s){a(s==o||s.A==0)c(\'\');2p=s.1z().1z().1z().2m().F(\'Q.p-r-q-17\');a(2p.A==0)c(s.K());c(k.1T(9,2p)+\' / \'+s.K())},1R:h(9,7){l 6=9.g(\'6\'),8=9.g(\'8\'),f=9.g(\'f\');a(8.1A!=7){8.1A=7;a(8.1A&&8.v.A>0){l j=0;f.S.M({1Z:\'3k\',\'4a-1H\':f.S.1z().M(\'1H\')});a($.1W(8.j)){a(8.j.A>0)j=8.j[0]}m a(8.j>-1){j=8.j}f.S.3l(f.S.3l()+f.B.F(\'[T="\'+8.v[j].1i+\'"]\').2C().3g)}m{f.S.M(\'1Z\',\'1q\')}a(6.1n)9.1E(\'2I\',[8.1A])}c(8.1A)},R:h(9){l 6=9.g(\'6\'),f=9.g(\'f\');a(6.1f==\'\')c(w);$.3W({3S:"3R",3N:6.1f,3O:L,g:{3P:6.1h+\'.10.3Q\',1g:6.1g,1a:6.1a?\'y\':\'n\',3X:\'y\'},3Y:h(1Y){k.2K(9,1Y)},1U:h(1Y){f.S.K(\'45 ! \'+1Y)},})},3a:h(9){l f=9.g(\'f\'),6=9.g(\'6\'),8=9.g(\'8\');f.B.28().1p();f.B.K(\'\');a(6.H){8.j=[]}m{8.j=-1}8.v=[]},2E:h(9,N,1z){l 6=9.g(\'6\'),8=9.g(\'8\'),f=9.g(\'f\');l 46=-1;1C(l i=0;i<N.A;i++){8.v.1t({1i:N[i].1i,I:N[i].I,17:N[i].17,W:N[i].W,1P:N[i].1P.A});a(6.14){W="<Q 19=\'p-r-q-W\'>"+8.1V[N[i].W]+"</Q>"}m{W=""}l 2x=(6.18+N[i].I*6.Y),1j=$(\'<1j/>\',{\'19\':\'p-r-q-s\',K:"<Q>"+W+"<Q 19=\'p-r-q-17\'>"+N[i].17+"</Q></Q>",T:N[i].1i,I:N[i].I,M:{\'1K-1X\':2x+\'1M\'}}).12(\'1S.10\',{9:9,3c:2x,3d:N[i].1P.A},h(O){O.3p=O.44-$(O.3o).3h().1X;O.43=O.3Z-$(O.3o).3h().3g;a(O.3p<O.g.3c&&O.g.3d>0){a($(b).2u(\'p-r-q-1v-s\')){$(b).1m(\'p-r-q-1v-s\').13(\'p-r-q-1r-s\').25().2z()}m{$(b).1m(\'p-r-q-1r-s\').13(\'p-r-q-1v-s\').25().2A()}}m{k.1s(O.g.9,$(b).J(\'T\'),L);a(6.H){}m{k.1R(O.g.9,w)}}a(6.H)f.1L.3n()});a(N[i].1P.A>0){1j.13(\'p-r-q-1r-s\').M(\'42-2C\',(6.Y*N[i].I)+\'1M 1D\')}a(6.H){1j.28().3f(\'<Q 19="p-r-q-40"></Q>\')}1z.1l(1j);a(N[i].1P.A>0){l 1F=$(\'<1F/>\',{\'19\':\'p-r-q-4p\',M:{2B:\'1q\',1K:\'1D\',2Q:\'1D\',\'47-48\':(35-N[i].I*2)+\'%\'}});1j.41(1F);k.2E(9,N[i].1P,1F)}}},1O:h(9,7){l 8=9.g(\'8\');1C(l i=0;i<8.v.A;i++){a(8.v[i].1i==7)c(i)}c(-1)},2H:h(9,7){l 6=9.g(\'6\');6.1n=7;9.1p(\'2I\');a(7)9.12(\'2I\',6.1n);c(6.1n)},2R:h(9,7){l 6=9.g(\'6\');6.1k=7;9.1p(\'20\');a(7)9.12(\'20\',6.1k);c(6.1k)},2M:h(9,7){l 6=9.g(\'6\');6.R=7;9.1p(\'2O\');a(7)9.12(\'2O\',6.R);c(6.R)}};$.3M.10=h(1I){a(22[1I]){c 22[1I].P(b,3V.3T.49.4c(2T,1))}m a(4l 1I===\'9\'||!1I){c 22.2X.P(b,2T)}m{$.1U(\'4j \'+1I+\' 4b 3w 3C 3B 3e.10\')}}})(3e);',62,274,'||||||options|value|properties|object|if|this|return|||objects|data|function||index|privateMethods|var|else||null|ui|selector|category|item|target|each|categories|false|||break|length|list||case||find|initialized|multiple|level|attr|html|true|css|listItems|event|apply|div|load|listContainer|catId|selected|domElt|status|autoLoad|levelIndent|tmp|categorySelector|applyExpandCollapse|bind|addClass|displayStatus|||name|iconWidthEC|class|galleryRoot|listMaxHeight|listMaxWidth|mode|containerList|serverUrl|filter|userMode|id|li|change|append|removeClass|popup|downArrow|unbind|none|collapsable|setValue|push|popupMode|expandable|displayPath|action|switch|parent|selectorVisible|title|for|0px|trigger|ul|isValid|width|method|all|padding|container|px|replace|findIndexByValue|childs|returned|displaySelector|click|getParentName|error|labelStatus|isArray|left|msg|display|categorySelectorChange|re|publicMethods|containerName|mouseleave|next|path|public|children|max|mouseOver|isFunction|listNames|containerStatus|setServerUrl|setOptions|setFilter|setLevelIndent|setDisplayStatus|setListMaxWidth|nbsp|setAutoLoad|prev|setListMaxHeight|height|foundItem|setGalleryRoot|arrow|setExpandCollapse|setPopupMode|hasClass|applyExpand|applyCollapse|spaceWidth|setUserMode|show|hide|listStyle|position|setDisplayPath|listAddItems|containerArrow|setDownArrow|setEventPopup|categorySelectorPopup|first|setItems|tmpIndex|setEventLoad|remove|categorySelectorLoad|setIconWidthEC|margin|setEventChange|mouseenter|arguments|exec|mouseout|overflow|init|invert|default|has|setMultiple|accessible|auto|setIsValid|100|opt|right|float|active|listClear|amp|expandArea|nbchilds|jQuery|prepend|top|offset|lt|gt|block|scrollTop|dArr|focus|currentTarget|layerX|document|GrumPluginClasses|plugins|gpc_ajax|php|tabindex|not|pointer|isPlainObject|numberOfCategories|focusout|on|exist|expand|collapse|mousedown|cursor|mouseup|absolute|destroy|admin|inArray|fn|url|async|ajaxfct|getList|POST|type|prototype|focusin|Array|ajax|tree|success|pageY|check|after|background|layerY|pageX|Error|previousLevel|font|size|slice|min|does|call|last|catch|trim|try|parseJSON|splice|Method|cat|typeof|span|catid|stopPropagation|group'.split('|'),0,{}))
Index: /extensions/GrumPluginClasses/js/ui.iconSelector.js
===================================================================
--- /extensions/GrumPluginClasses/js/ui.iconSelector.js	(revision 8960)
+++ /extensions/GrumPluginClasses/js/ui.iconSelector.js	(revision 8961)
@@ -148,5 +148,5 @@
                     container:$('<div/>',
                         {
-                          'class':' ui-icon-selector ',
+                          'class':' ui-icon-selector '
                         }
                     ).bind('click.iconSelector',
Index: /extensions/GrumPluginClasses/js/ui.iconSelector.min.js
===================================================================
--- /extensions/GrumPluginClasses/js/ui.iconSelector.min.js	(revision 8961)
+++ /extensions/GrumPluginClasses/js/ui.iconSelector.min.js	(revision 8961)
@@ -0,0 +1,120 @@
+/* file: ui.iconSelector.js - v1.0.0 | minified on 2011/01/27 with http://jscompress.com/ */
+(function($)
+{var publicMethods={init:function(opt)
+{return this.each(function()
+{var $this=$(this),data=$this.data('options'),objects=$this.data('objects'),properties=$this.data('properties'),options={images:[],numCols:1,numRows:8,cellWidth:32,cellHeight:32,popup:null,change:null};if(opt)$.extend(options,opt);$this.data('options',options);if(!properties)
+{$this.data('properties',{index:-1,initialized:false,selectorVisible:false});properties=$this.data('properties');}
+if(!objects)
+{objects={container:$('<div/>',{'class':' ui-icon-selector '}).bind('click.iconSelector',function()
+{privateMethods.displaySelector($this,!$this.data('properties').selectorVisible);}),listContainer:$('<div/>',{html:"",'class':' ui-icon-selector-list ',css:{overflow:"auto",width:'0px',height:'0px',display:'none',position:'absolute'}}).bind('mouseleave.iconSelector',function()
+{privateMethods.displaySelector($this,false);}),list:$('<ul/>',{css:{listStyle:'none',padding:'0px',margin:'0px'}})};$this.html('').append(objects.container).append(objects.listContainer.append(objects.list));$this.data('objects',objects);}
+privateMethods.setImages($this,options.images);privateMethods.setCellWidth($this,options.cellWidth);privateMethods.setCellHeight($this,options.cellHeight);privateMethods.setNumCols($this,options.numCols);privateMethods.setNumRows($this,options.numRows);privateMethods.setEventPopup($this,options.popup);privateMethods.setEventChange($this,options.change);if(options.images.length>0)privateMethods.setValue($this,options.images[0]);properties.initialized=true;});},destroy:function()
+{return this.each(function()
+{var $this=$(this),objects=$this.data('objects');objects.container.unbind().remove();objects.list.children().unbind();objects.listContainer.remove();$this.unbind('.iconSelector').css({width:'',height:'',backgroundImage:''});});},images:function(list)
+{if(list)
+{return this.each(function()
+{privateMethods.setImages($(this),list);});}
+else
+{var options=this.data('options');if(options)
+{return(options.images);}
+else
+{return([]);}}},numCols:function(value)
+{if(value)
+{return this.each(function()
+{privateMethods.setCols($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.numCols);}
+else
+{return(0);}}},numRows:function(value)
+{if(value)
+{return this.each(function()
+{privateMethods.setRows($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.numRows);}
+else
+{return(0);}}},cellWidth:function(value)
+{if(value)
+{return this.each(function()
+{privateMethods.setCellWidth($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.cellWidth);}
+else
+{return(0);}}},cellHeight:function(value)
+{if(value)
+{return this.each(function()
+{privateMethods.setCellHeight($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.cellHeight);}
+else
+{return(0);}}},value:function(value)
+{if(value)
+{return this.each(function()
+{privateMethods.setValue($(this),value);});}
+else
+{var options=this.data('options'),properties=this.data('properties');if(options&&properties&&properties.index>-1&&properties.index<options.images.length)
+{return(options.images[properties.index]);}
+else
+{return('');}}},popup:function(value)
+{if(value&&$.isFunction(value))
+{return this.each(function()
+{privateMethods.setEventPopup($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.popup);}
+else
+{return(null);}}},change:function(value)
+{if(value&&$.isFunction(value))
+{return this.each(function()
+{privateMethods.setEventChange($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.change);}
+else
+{return(null);}}}};var privateMethods={updateListArea:function(object)
+{var options=object.data('options'),objects=object.data('objects'),icon=objects.list.children().first(),width=icon.outerWidth()*options.numCols,height=icon.outerHeight()*options.numRows;objects.listContainer.css({width:width+'px',height:height+'px'});delta=width-objects.listContainer.get(0).clientWidth;if(delta>0)
+{objects.listContainer.css('width',(width+delta)+'px');}},setImages:function(object,value)
+{var options=object.data('options'),objects=object.data('objects'),properties=object.data('properties');options.images=value;objects.list.children().unbind();objects.list.html('');for(var i=0;i<options.images.length;i++)
+{liClass=' ui-icon-selector-icon ';if(i==properties.index)
+{liClass+=' ui-icon-selector-selected-icon ';}
+objects.list.append($('<li indexValue="'+i+'" class="'+liClass+'" style="display:inline-block;width:'+options.cellWidth+'px;height:'+options.cellHeight+'px;background-image:url('+options.images[i]+');"></li>').bind('click',{object:object},function(event)
+{privateMethods.setValueByIndex(event.data.object,$(this).attr('indexValue'),true);privateMethods.displaySelector(event.data.object,false);}));}
+return(options.images);},setNumCols:function(object,value)
+{var options=object.data('options'),properties=object.data('properties');if((!properties.initialized||options.numCols!=value)&&value>0)
+{options.numCols=value;}
+return(options.numCols);},setNumRows:function(object,value)
+{var options=object.data('options'),properties=object.data('properties');if((!properties.initialized||options.numRows!=value)&&value>0)
+{options.numRows=value;}
+return(options.numRows);},setCellWidth:function(object,value)
+{var options=object.data('options'),properties=object.data('properties'),objects=object.data('objects');if((!properties.initialized||options.cellWidth!=value)&&value>=0)
+{options.cellWidth=value;objects.container.css('width',value+'px');}
+return(options.cellWidth);},setCellHeight:function(object,value)
+{var options=object.data('options'),properties=object.data('properties'),objects=object.data('objects');if((!properties.initialized||options.cellHeight!=value)&&value>=0)
+{options.cellHeight=value;objects.container.css('height',value+'px');}
+return(options.cellHeight);},setValue:function(object,value)
+{var options=object.data('options'),properties=object.data('properties'),index=-1;switch(value)
+{case':first':if(options.images.length>0)index=0;break;case':last':index=options.images.length-1;break;default:index=$.inArray(value,options.images);break;}
+if((!properties.initialized||properties.index!=index)&&index>-1)
+{privateMethods.setValueByIndex(object,index,false);}
+return(options.images[properties.index]);},setValueByIndex:function(object,value,trigger)
+{var options=object.data('options'),properties=object.data('properties'),objects=object.data('objects');if((!properties.initialized||properties.index!=value)&&value>-1&&value<options.images.length)
+{objects.list.children('.ui-icon-selector-selected-icon').removeClass('ui-icon-selector-selected-icon');objects.list.children('[indexValue="'+value+'"]').addClass('ui-icon-selector-selected-icon');properties.index=value;objects.container.css('background-image','url('+options.images[properties.index]+')');if(trigger&&options.change)object.trigger('iconSelectorChange',[properties.index]);}
+return(options.images[properties.index]);},displaySelector:function(object,value)
+{var options=object.data('options'),properties=object.data('properties'),objects=object.data('objects');if(properties.selectorVisible!=value)
+{properties.selectorVisible=value;if(properties.selectorVisible)
+{objects.listContainer.css('display','block').scrollTop(objects.listContainer.scrollTop()+objects.list.children('[indexValue="'+properties.index+'"]').position().top);privateMethods.updateListArea(object);}
+else
+{objects.listContainer.css('display','none');}
+if(options.popup)object.trigger('iconSelectorPopup',[properties.selectorVisible]);}
+return(properties.selectorVisible);},setEventPopup:function(object,value)
+{var options=object.data('options');options.popup=value;object.unbind('iconSelectorPopup');if(value)object.bind('iconSelectorPopup',options.popup);return(options.popup);},setEventChange:function(object,value)
+{var options=object.data('options');options.change=value;object.unbind('iconSelectorChange');if(value)object.bind('iconSelectorChange',options.change);return(options.change);}};$.fn.iconSelector=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.iconSelector');}}})(jQuery);
Index: /extensions/GrumPluginClasses/js/ui.inputCheckbox.js
===================================================================
--- /extensions/GrumPluginClasses/js/ui.inputCheckbox.js	(revision 8961)
+++ /extensions/GrumPluginClasses/js/ui.inputCheckbox.js	(revision 8961)
@@ -0,0 +1,521 @@
+/**
+ * -----------------------------------------------------------------------------
+ * file: ui.inputCheckbox.js
+ * file version: 1.0.0
+ * date: 2010-11-04
+ *
+ * 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/11/04 | 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 =
+                    {                      
+                      values:
+                        {
+                          forced:false,
+                          checked:'yes',
+                          unchecked:'no'
+                        },
+                      returnMode:'selected',
+                      change:null
+                    };
+
+              // if options given, merge it
+              // if(opt) $.extend(options, opt); ==> options are set by setters
+
+              $this
+                .data('options', options)
+                .addClass('ui-inputCheckbox');
+
+              if(!properties)
+              {
+                $this.data('properties',
+                  {
+                    initialized:false,
+                    isValid:true,
+                    checkboxList:null,
+                    isCB:true
+                  }
+                );
+                properties=$this.data('properties');
+              }
+
+              if($this.get(0).tagName=='INPUT' && $this.get(0).type=='checkbox')
+              {
+                properties.checkboxList=$this;
+              }
+              else
+              {
+                properties.checkboxList=$this.find('input[type=checkbox]');
+                properties.isCB=false;
+              }
+
+              properties.checkboxList.bind('click.inputCheckbox',
+                function (event)
+                {
+                  privateMethods.setValue($this, $(this).attr('id'), $(this).attr('checked')?options.values.checked:options.values.unchecked,false);
+                }
+              );
+
+              privateMethods.setOptions($this, opt);
+            }
+          );
+        }, // init
+      destroy : function ()
+        {
+          return this.each(
+            function()
+            {
+              // default values for the plugin
+              var properties=this.data('properties');
+              properties.checkboxList.unbind('.inputCheckbox');
+              this.removeClass('ui-inputCheckbox');
+            }
+          );
+        }, // destroy
+
+      options: function (value)
+        {
+          return(
+            this.each(
+              function()
+              {
+                privateMethods.setOptions($(this), value);
+              }
+            )
+          );
+        }, // options
+
+      disabled: function (value)
+        {
+          if(value!=null)
+          {
+            return(
+              this.each(
+                function()
+                {
+                  privateMethods.setDisabled($(this), value);
+                }
+              )
+            );
+          }
+          else
+          {
+            return(privateMethods.getDisabled($(this)));
+          }
+        }, // disabled
+
+      values: function (value)
+        {
+          if(value!=null)
+          {
+            // set selected value
+            return(
+              this.each(
+                function()
+                {
+                  privateMethods.setValues($(this), value);
+                }
+              )
+            );
+          }
+          else
+          {
+            var options=this.data('options');
+            // return the selected tags
+            return(options.values);
+          }
+        }, // value
+
+      value: function (id, value)
+        {
+          var properties=this.data('properties');
+
+          if(properties.isCB)
+          {
+            value=id;
+            id=$(this).get(0).id;
+          }
+
+          if(value!=null || id==':all' || id==':invert' || id==':none')
+          {
+            // set selected value
+            return(
+              this.each(
+                function()
+                {
+                  privateMethods.setValue($(this), id, value, true);
+                }
+              )
+            );
+          }
+          else if(id!=null && id!='')
+          {
+            var options=this.data('options');
+            // return the selected tags
+            return($(this).find('#'+id).attr('checked')?options.values.checked:options.values.unchecked);
+          }
+          else
+          {
+            var options=this.data('options'),
+                returned=[];
+
+            if(options.values.forced)
+            {
+              $(this).find('input').each(
+                function ()
+                {
+                  returned.push( {id:$(this).attr('id'), value:$(this).attr('checked')?options.values.checked:options.values.unchecked } );
+                }
+              );
+            }
+            else
+            {
+              var filter=(options.returnMode=='selected'?':checked':':not(:checked)');
+              $(this).find('input'+filter).each(
+                function ()
+                {
+                  returned.push($(this).attr('value'));
+                }
+              );
+            }
+
+            return(returned);
+          }
+
+        }, // value
+
+      returnMode: function (value)
+        {
+          if(value!=null)
+          {
+            return this.each(function()
+              {
+                privateMethods.setReturnMode($(this), value);
+              }
+            );
+          }
+          else
+          {
+            var options = this.data('options');
+
+            if(options)
+            {
+              return(options.returnMode);
+            }
+            else
+            {
+              return('selected');
+            }
+          }
+        }, // returnMode
+
+      isValid: function (value)
+        {
+          if(value!=null)
+          {
+            // set selected value
+            return(
+              this.each(
+                function()
+                {
+                  privateMethods.setIsValid($(this), value);
+                }
+              )
+            );
+          }
+          else
+          {
+            // return the selected tags
+            var properties=this.data('properties');
+
+            return(properties.isValid);
+          }
+        }, // isValid
+
+      change: function (value)
+        {
+          if(value!=null && $.isFunction(value))
+          {
+            // set selected value
+            return(
+              this.each(
+                function()
+                {
+                  privateMethods.setEventChange($(this), value);
+                }
+              )
+            );
+          }
+          else
+          {
+            // return the selected value
+            var options=this.data('options');
+
+            if(options)
+            {
+              return(options.change);
+            }
+            else
+            {
+              return(null);
+            }
+          }
+        } // change
+
+    }; // 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.setReturnMode(object, (value.returnMode!=null)?value.returnMode:options.returnMode);
+          privateMethods.setValues(object, (value.values!=null)?value.values:options.values);
+          //privateMethods.setValue(object, (value.value!=null)?value.value:options.value, true);
+
+          privateMethods.setEventChange(object, (value.change!=null)?value.change:options.change);
+
+          properties.initialized=true;
+        },
+
+      setIsValid : function (object, value)
+        {
+          var properties=object.data('properties');
+
+          if(properties.isValid!=value && properties.initialized)
+          {
+            properties.isValid=value;
+            if(properties.isValid)
+            {
+              if(properties.isCB)
+              {
+                object.parent().removeClass('ui-inputCheckbox ui-error');
+              }
+              else
+              {
+                object.removeClass('ui-error');
+              }
+            }
+            else
+            {
+              if(properties.isCB)
+              {
+                object.parent().addClass('ui-inputCheckbox ui-error');
+              }
+              else
+              {
+                object.addClass('ui-error');
+              }
+            }
+          }
+          return(properties.isValid);
+        },
+
+      setReturnMode : function (object, value)
+        {
+          var options=object.data('options'),
+              properties=object.data('properties');
+
+          if((!properties.initialized || options.returnMode!=value) && (value=='selected' || value=='notSelected'))
+          {
+            options.returnMode=value;
+          }
+          return(options.returnMode);
+        },
+
+      setValues : function (object, value)
+        {
+          var options=object.data('options');
+
+          if(value.forced!=null) options.values.forced=value.forced;
+          if(value.checked!=null) options.values.checked=value.checked;
+          if(value.unchecked!=null) options.values.unchecked=value.unchecked;
+
+          return(options.values);
+        }, //setValue
+
+      setValue : function (object, id, value, apply)
+        {
+          var options=object.data('options'),
+              properties=object.data('properties');
+
+          if(apply)
+          {
+            if(id==':all' || id==':none' || id==':invert')
+            {
+              //generic command
+              switch(id)
+              {
+                case ':all':
+                  properties.checkboxList.attr('checked', true);
+                  break;
+                case ':none':
+                  properties.checkboxList.attr('checked', false);
+                  break;
+                case ':invert':
+                  properties.checkboxList.each(
+                    function ()
+                    {
+                      $(this).attr('checked', !$(this).attr('checked'));
+                    }
+                  );
+                  break;
+              }
+            } 
+            else if($.isArray(value) && !properties.isCB)
+            {
+              /* array of values :
+               *  ['value1', 'value2', ..., 'valueN']
+               * or array of object
+               *  [{id:'id1', value:'value1'}, {id:'idN', value:'valueN'}, ..., {id:'idN', value:'valueN'}]
+               */
+              properties.checkboxList.attr('checked', false);
+              
+              for(var i=0;i<value.length;i++)
+              {
+                if(value[i].id!=null && value[i].value!=null)
+                {
+                  if($('#'+value[i].id).attr('value')==value[i].value) $('#'+value[i].id).attr('checked', true);
+                }
+                else
+                {
+                  properties.checkboxList.filter('[value='+value[i]+']').attr('checked', true);
+                }
+              }
+              
+            }
+            else 
+            {
+              // a single value
+              
+              if(options.values.checked==value)
+              {
+                if(properties.isCB)
+                {
+                  properties.checkboxList.attr('checked', true);
+                }
+                else
+                {
+                  if(id=='')
+                  {
+                    properties.checkboxList.attr('checked', true); 
+                  }
+                  else
+                  {
+                    properties.checkboxList.filter('#'+id).attr('checked', true);
+                  }
+                }
+              }
+              else
+              {
+                if(properties.isCB)
+                {
+                  properties.checkboxList.attr('checked', false);
+                }
+                else
+                {
+                  if(id=='')
+                  {
+                    properties.checkboxList.attr('checked', false); 
+                  }
+                  else
+                  {
+                    properties.checkboxList.filter('#'+id).attr('checked', false);
+                  }
+                }
+              }
+            }
+          }
+
+          if(options.change) object.trigger('inputCheckboxChange', {id:id, state:value});
+
+          return(true);
+        }, //setValue
+
+      setEventChange : function (object, value)
+        {
+          var options=object.data('options');
+
+          options.change=value;
+          object.unbind('inputCheckboxChange');
+          if(value) object.bind('inputCheckboxChange', options.change);
+          return(options.change);
+        }
+
+    };
+
+
+    $.fn.inputCheckbox = 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.inputCheckbox' );
+      }
+    } // $.fn.inputCheckbox
+
+  }
+)(jQuery);
+
+
Index: /extensions/GrumPluginClasses/js/ui.inputCheckbox.min.js
===================================================================
--- /extensions/GrumPluginClasses/js/ui.inputCheckbox.min.js	(revision 8961)
+++ /extensions/GrumPluginClasses/js/ui.inputCheckbox.min.js	(revision 8961)
@@ -0,0 +1,115 @@
+/* file: ui.inputCheckbox.js - v1.0.0 | minified on 2011/01/27 with http://jscompress.com/ */
+(function($)
+{var publicMethods={init:function(opt)
+{return this.each(function()
+{var $this=$(this),data=$this.data('options'),objects=$this.data('objects'),properties=$this.data('properties'),options={values:{forced:false,checked:'yes',unchecked:'no'},returnMode:'selected',change:null};$this.data('options',options).addClass('ui-inputCheckbox');if(!properties)
+{$this.data('properties',{initialized:false,isValid:true,checkboxList:null,isCB:true});properties=$this.data('properties');}
+if($this.get(0).tagName=='INPUT'&&$this.get(0).type=='checkbox')
+{properties.checkboxList=$this;}
+else
+{properties.checkboxList=$this.find('input[type=checkbox]');properties.isCB=false;}
+properties.checkboxList.bind('click.inputCheckbox',function(event)
+{privateMethods.setValue($this,$(this).attr('id'),$(this).attr('checked')?options.values.checked:options.values.unchecked,false);});privateMethods.setOptions($this,opt);});},destroy:function()
+{return this.each(function()
+{var properties=this.data('properties');properties.checkboxList.unbind('.inputCheckbox');this.removeClass('ui-inputCheckbox');});},options:function(value)
+{return(this.each(function()
+{privateMethods.setOptions($(this),value);}));},disabled:function(value)
+{if(value!=null)
+{return(this.each(function()
+{privateMethods.setDisabled($(this),value);}));}
+else
+{return(privateMethods.getDisabled($(this)));}},values:function(value)
+{if(value!=null)
+{return(this.each(function()
+{privateMethods.setValues($(this),value);}));}
+else
+{var options=this.data('options');return(options.values);}},value:function(id,value)
+{var properties=this.data('properties');if(properties.isCB)
+{value=id;id=$(this).get(0).id;}
+if(value!=null||id==':all'||id==':invert'||id==':none')
+{return(this.each(function()
+{privateMethods.setValue($(this),id,value,true);}));}
+else if(id!=null&&id!='')
+{var options=this.data('options');return($(this).find('#'+id).attr('checked')?options.values.checked:options.values.unchecked);}
+else
+{var options=this.data('options'),returned=[];if(options.values.forced)
+{$(this).find('input').each(function()
+{returned.push({id:$(this).attr('id'),value:$(this).attr('checked')?options.values.checked:options.values.unchecked});});}
+else
+{var filter=(options.returnMode=='selected'?':checked':':not(:checked)');$(this).find('input'+filter).each(function()
+{returned.push($(this).attr('value'));});}
+return(returned);}},returnMode:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setReturnMode($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.returnMode);}
+else
+{return('selected');}}},isValid:function(value)
+{if(value!=null)
+{return(this.each(function()
+{privateMethods.setIsValid($(this),value);}));}
+else
+{var properties=this.data('properties');return(properties.isValid);}},change:function(value)
+{if(value!=null&&$.isFunction(value))
+{return(this.each(function()
+{privateMethods.setEventChange($(this),value);}));}
+else
+{var options=this.data('options');if(options)
+{return(options.change);}
+else
+{return(null);}}}};var privateMethods={setOptions:function(object,value)
+{var properties=object.data('properties'),options=object.data('options');if(!$.isPlainObject(value))return(false);properties.initialized=false;privateMethods.setReturnMode(object,(value.returnMode!=null)?value.returnMode:options.returnMode);privateMethods.setValues(object,(value.values!=null)?value.values:options.values);privateMethods.setEventChange(object,(value.change!=null)?value.change:options.change);properties.initialized=true;},setIsValid:function(object,value)
+{var properties=object.data('properties');if(properties.isValid!=value&&properties.initialized)
+{properties.isValid=value;if(properties.isValid)
+{if(properties.isCB)
+{object.parent().removeClass('ui-inputCheckbox ui-error');}
+else
+{object.removeClass('ui-error');}}
+else
+{if(properties.isCB)
+{object.parent().addClass('ui-inputCheckbox ui-error');}
+else
+{object.addClass('ui-error');}}}
+return(properties.isValid);},setReturnMode:function(object,value)
+{var options=object.data('options'),properties=object.data('properties');if((!properties.initialized||options.returnMode!=value)&&(value=='selected'||value=='notSelected'))
+{options.returnMode=value;}
+return(options.returnMode);},setValues:function(object,value)
+{var options=object.data('options');if(value.forced!=null)options.values.forced=value.forced;if(value.checked!=null)options.values.checked=value.checked;if(value.unchecked!=null)options.values.unchecked=value.unchecked;return(options.values);},setValue:function(object,id,value,apply)
+{var options=object.data('options'),properties=object.data('properties');if(apply)
+{if(id==':all'||id==':none'||id==':invert')
+{switch(id)
+{case':all':properties.checkboxList.attr('checked',true);break;case':none':properties.checkboxList.attr('checked',false);break;case':invert':properties.checkboxList.each(function()
+{$(this).attr('checked',!$(this).attr('checked'));});break;}}
+else if($.isArray(value)&&!properties.isCB)
+{properties.checkboxList.attr('checked',false);for(var i=0;i<value.length;i++)
+{if(value[i].id!=null&&value[i].value!=null)
+{if($('#'+value[i].id).attr('value')==value[i].value)$('#'+value[i].id).attr('checked',true);}
+else
+{properties.checkboxList.filter('[value='+value[i]+']').attr('checked',true);}}}
+else
+{if(options.values.checked==value)
+{if(properties.isCB)
+{properties.checkboxList.attr('checked',true);}
+else
+{if(id=='')
+{properties.checkboxList.attr('checked',true);}
+else
+{properties.checkboxList.filter('#'+id).attr('checked',true);}}}
+else
+{if(properties.isCB)
+{properties.checkboxList.attr('checked',false);}
+else
+{if(id=='')
+{properties.checkboxList.attr('checked',false);}
+else
+{properties.checkboxList.filter('#'+id).attr('checked',false);}}}}}
+if(options.change)object.trigger('inputCheckboxChange',{id:id,state:value});return(true);},setEventChange:function(object,value)
+{var options=object.data('options');options.change=value;object.unbind('inputCheckboxChange');if(value)object.bind('inputCheckboxChange',options.change);return(options.change);}};$.fn.inputCheckbox=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.inputCheckbox');}}})(jQuery);
Index: /extensions/GrumPluginClasses/js/ui.inputColorPicker.js
===================================================================
--- /extensions/GrumPluginClasses/js/ui.inputColorPicker.js	(revision 8961)
+++ /extensions/GrumPluginClasses/js/ui.inputColorPicker.js	(revision 8961)
@@ -0,0 +1,1187 @@
+/**
+ * -----------------------------------------------------------------------------
+ * file: ui.inputColorPicker.js
+ * file version: 1.0.0
+ * date: 2010-11-04
+ *
+ * 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/11/04 | 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 =
+                    {
+                      colors:
+                        {
+                          fg:
+                            {
+                              color:'#ffffff',
+                              opacity:1
+                            },
+                          bg:
+                            {
+                              color:'#000000',
+                              opacity:1
+                            }
+                        },
+                      alpha:true,
+                      texts:
+                        {
+                          r:'R',
+                          g:'G',
+                          b:'B',
+                          a:'A',
+                          color:'#',
+                          h:'H',
+                          s:'S',
+                          v:'V'
+                        },
+                      mode:2, // 1 (fg) - 2  (fg+bg)
+                      selected:'fg',
+                      change: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,
+                    refreshing:false
+                  }
+                );
+                properties=$this.data('properties');
+              }
+
+              if(!objects)
+              {
+                objects =
+                  {
+                    container:$('<div/>',
+                        {
+                          'class':'ui-inputColorPicker'
+                        }
+                    ),
+                    dotAreaSV:$('<div/>',
+                      {
+                        'class':'ui-inputColorPicker-dotAreaSV'
+                      }
+                    ),
+                    dotAreaH:$('<div/>',
+                      {
+                        'class':'ui-inputColorPicker-dotAreaH'
+                      }
+                    ),
+                    inputContainer:$('<table>',
+                      {
+                        'class':'ui-inputColorPicker-inputContainer'
+                      }
+                    ),
+                    inputCRL:$('<td/>', {'class':'label'} ), // red label
+                    inputCRI:$('<td/>', {'class':'input'} ), // red input
+                    inputCGL:$('<td/>', {'class':'label'} ),
+                    inputCGI:$('<td/>', {'class':'input'} ),
+                    inputCBL:$('<td/>', {'class':'label'} ),
+                    inputCBI:$('<td/>', {'class':'input'} ),
+                    inputCHL:$('<td/>', {'class':'label'} ),
+                    inputCHI:$('<td/>', {'class':'input'} ),
+                    inputCSL:$('<td/>', {'class':'label'} ),
+                    inputCSI:$('<td/>', {'class':'input'} ),
+                    inputCVL:$('<td/>', {'class':'label'} ),
+                    inputCVI:$('<td/>', {'class':'input'} ),
+                    inputCAL:$('<td/>', {'class':'label'} ),
+                    inputCAI:$('<td/>', {'class':'input'} ),
+                    inputCcolorL:$('<td/>', {'class':'label'} ),
+                    inputCcolorI:$('<td/>', {'class':'input'} ),
+                    inputCFB:$('<td/>',
+                      {
+                        colspan:2,
+                        rowspan:2
+                      }
+                    )
+
+                  };
+
+                $this
+                  .html('')
+                  .append(
+                      objects.container
+                        .append(objects.dotAreaSV)
+                        .append(objects.dotAreaH)
+                        .append(objects.inputContainer
+                                  .append($('<tr/>').append(objects.inputCRL).append(objects.inputCRI).append(objects.inputCHL).append(objects.inputCHI))
+                                  .append($('<tr/>').append(objects.inputCGL).append(objects.inputCGI).append(objects.inputCSL).append(objects.inputCSI))
+                                  .append($('<tr/>').append(objects.inputCBL).append(objects.inputCBI).append(objects.inputCVL).append(objects.inputCVI))
+                                  .append($('<tr/>').append(objects.inputCAL).append(objects.inputCAI).append(objects.inputCFB))
+                                  .append($('<tr/>').append(objects.inputCcolorL).append(objects.inputCcolorI))
+                        )
+                  );
+
+                objects.dotAreaSV.inputDotArea(
+                  {
+                    range:
+                      {
+                        x:[0,100],
+                        y:[0,100]
+                      },
+                    width:132,
+                    height:132,
+                    change: function (event, value)
+                      {
+                        privateMethods.computeCurrentColor($this, 'dotAreaSV');
+                      }
+                  }
+                );
+                objects.dotAreaH.inputDotArea(
+                  {
+                    range:
+                      {
+                        x:false,
+                        y:[0,359]
+                      },
+                    width:20,
+                    height:132,
+                    change: function (event, value)
+                      {
+                        privateMethods.computeCurrentColor($this, 'dotAreaH');
+                      }
+                  }
+                );
+                objects.inputCRI.inputNum(
+                  {
+                    minValue:0,
+                    maxValue:255,
+                    stepValue:1,
+                    numDec:0,
+                    unitValue:'',
+                    btInc:'+',
+                    btDec:'-',
+                    value:0,
+                    showSlider:'auto',
+                    change: function (event, value)
+                      {
+                        privateMethods.computeCurrentColor($this, 'rgbR');
+                      }
+                  }
+                );
+                objects.inputCGI.inputNum(
+                  {
+                    minValue:0,
+                    maxValue:255,
+                    stepValue:1,
+                    numDec:0,
+                    unitValue:'',
+                    btInc:'+',
+                    btDec:'-',
+                    value:0,
+                    showSlider:'auto',
+                    change: function (event, value)
+                      {
+                        privateMethods.computeCurrentColor($this, 'rgbG');
+                      }
+                  }
+                );
+                objects.inputCBI.inputNum(
+                  {
+                    minValue:0,
+                    maxValue:255,
+                    stepValue:1,
+                    numDec:0,
+                    unitValue:'',
+                    btInc:'+',
+                    btDec:'-',
+                    value:0,
+                    showSlider:'auto',
+                    change: function (event, value)
+                      {
+                        privateMethods.computeCurrentColor($this, 'rgbB');
+                      }
+                  }
+                );
+                objects.inputCAI.inputNum(
+                  {
+                    minValue:0,
+                    maxValue:100,
+                    stepValue:1,
+                    numDec:0,
+                    unitValue:'',
+                    btInc:'+',
+                    btDec:'-',
+                    value:0,
+                    showSlider:'auto',
+                    change: function (event, value)
+                      {
+                        privateMethods.computeCurrentColor($this, 'alpha');
+                      }
+                  }
+                );
+                objects.inputCHI.inputNum(
+                  {
+                    minValue:0,
+                    maxValue:359,
+                    stepValue:1,
+                    numDec:0,
+                    unitValue:'',
+                    btInc:'+',
+                    btDec:'-',
+                    value:0,
+                    showSlider:'auto',
+                    change: function (event, value)
+                      {
+                        privateMethods.computeCurrentColor($this, 'hsvH');
+                      }
+                  }
+                );
+                objects.inputCSI.inputNum(
+                  {
+                    minValue:0,
+                    maxValue:100,
+                    stepValue:1,
+                    numDec:0,
+                    unitValue:'',
+                    btInc:'+',
+                    btDec:'-',
+                    value:0,
+                    showSlider:'auto',
+                    change: function (event, value)
+                      {
+                        privateMethods.computeCurrentColor($this, 'hsvS');
+                      }
+                  }
+                );
+                objects.inputCVI.inputNum(
+                  {
+                    minValue:0,
+                    maxValue:100,
+                    stepValue:1,
+                    numDec:0,
+                    unitValue:'',
+                    btInc:'+',
+                    btDec:'-',
+                    value:0,
+                    showSlider:'auto',
+                    change: function (event, value)
+                      {
+                        privateMethods.computeCurrentColor($this, 'hsvV');
+                      }
+                  }
+                );
+                objects.inputCcolorI.inputText(
+                  {
+                    value:'',
+                    displayChar:6,
+                    maxChar:6,
+                    regExp:'/^(?:[a-f0-9]{2}){3}$/i',
+                    change: function (event, value)
+                      {
+                        privateMethods.computeCurrentColor($this, 'color');
+                      }
+                  }
+                );
+                objects.inputCFB.inputColorsFB(
+                  {
+                    width:40,
+                    height:40,
+                    change: function (event, value)
+                      {
+                        privateMethods.computeCurrentColor($this, 'fb');
+                      }
+                  }
+                );
+
+
+                $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.dotAreaSV.remove();
+              objects.dotAreaH.remove();
+              objects.inputCRL.remove();
+              objects.inputCRI.remove();
+              objects.inputCHL.remove();
+              objects.inputCHI.remove();
+              objects.inputCGL.remove();
+              objects.inputCGI.remove();
+              objects.inputCSL.remove();
+              objects.inputCSI.remove();
+              objects.inputCBL.remove();
+              objects.inputCBI.remove();
+              objects.inputCVL.remove();
+              objects.inputCVI.remove();
+              objects.inputCAL.remove();
+              objects.inputCAI.remove();
+              objects.inputCFB.remove();
+              objects.inputCcolorL.remove();
+              objects.inputCcolorI.remove();
+              objects.inputContainer.remove();
+              objects.container.remove();
+            }
+          );
+        }, // destroy
+
+      options: function (value)
+        {
+          return(
+            this.each(
+              function()
+              {
+                privateMethods.setOptions($(this), value);
+              }
+            )
+          );
+        }, // options
+
+      colors: function (value)
+        {
+          if(value!=null)
+          {
+            // set selected value
+            return(
+              this.each(
+                function()
+                {
+                  privateMethods.setColors($(this), value);
+                }
+              )
+            );
+          }
+          else
+          {
+            // return the selected tags
+            var options=this.data('options');
+            return(options.colors);
+          }
+        }, // colors
+
+      texts: function (value)
+        {
+          if(value!=null)
+          {
+            // set selected value
+            return(
+              this.each(
+                function()
+                {
+                  privateMethods.setTexts($(this), value, true);
+                }
+              )
+            );
+          }
+          else
+          {
+            // return the selected tags
+            var options=this.data('options');
+            return(options.texts);
+          }
+        }, // texts
+
+      alpha: function (value)
+        {
+          if(value!=null)
+          {
+            // set selected value
+            return(
+              this.each(
+                function()
+                {
+                  privateMethods.setAlpha($(this), value);
+                }
+              )
+            );
+          }
+          else
+          {
+            // return the selected tags
+            var options=this.data('options');
+            return(options.alpha);
+          }
+        }, // alpha
+
+      selected: function (value)
+        {
+          if(value!=null)
+          {
+            // set selected value
+            return(
+              this.each(
+                function()
+                {
+                  privateMethods.setSelected($(this), value);
+                }
+              )
+            );
+          }
+          else
+          {
+            // return the selected tags
+            var options=this.data('options');
+            return(options.selected);
+          }
+        }, // selected
+
+      mode: function (value)
+        {
+          if(value!=null)
+          {
+            // set selected value
+            return(
+              this.each(
+                function()
+                {
+                  privateMethods.setMode($(this), value);
+                }
+              )
+            );
+          }
+          else
+          {
+            // return the selected tags
+            var options=this.data('options');
+            return(options.mode);
+          }
+        }, // mode
+
+      change: function (value)
+        {
+          if(value!=null && $.isFunction(value))
+          {
+            // set selected value
+            return(
+              this.each(
+                function()
+                {
+                  privateMethods.setEventChange($(this), value);
+                }
+              )
+            );
+          }
+          else
+          {
+            // return the selected value
+            var options=this.data('options');
+
+            if(options)
+            {
+              return(options.change);
+            }
+            else
+            {
+              return(null);
+            }
+          }
+        } // change
+
+    }; // 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.setMode(object, (value.mode!=null)?value.mode:options.mode);
+          privateMethods.setSelected(object, (value.selected!=null)?value.selected:options.selected);
+          privateMethods.setColors(object, (value.colors!=null)?value.colors:options.colors);
+          privateMethods.setAlpha(object, (value.alpha!=null)?value.alpha:options.alpha);
+          privateMethods.setTexts(object, (value.texts!=null)?value.texts:options.texts);
+
+          privateMethods.setEventChange(object, (value.change!=null)?value.change:options.change);
+
+          properties.initialized=true;
+        },
+
+      setAlpha : function (object, value)
+        {
+          var options=object.data('options'),
+              objects=object.data('objects');
+
+          if((!properties.initialized || options.alpha!=value) && (value==true || value==false))
+          {
+            options.alpha=value;
+
+            if(options.alpha)
+            {
+              objects.inputCAI.css('visibility', 'visible');
+              objects.inputCAL.css('visibility', 'visible');
+            }
+            else
+            {
+              objects.inputCAI.css('visibility', 'hidden');
+              objects.inputCAL.css('visibility', 'hidden');
+            }
+          }
+          return(options.alpha);
+        }, //setAlpha
+
+      setMode : function (object, value)
+        {
+          var options=object.data('options'),
+              objects=object.data('objects');
+
+          if((!properties.initialized || options.mode!=value) && (value==1 || value==2))
+          {
+            options.mode=value;
+
+            objects.inputCFB.inputColorsFB('mode', options.mode);
+          }
+          return(options.mode);
+        }, //setMode
+
+
+      setSelected : function (object, value)
+        {
+          var options=object.data('options'),
+              objects=object.data('objects');
+
+          if((!properties.initialized || options.selected!=value) && (value=='fg' || value=='bg'))
+          {
+            options.selected=value;
+
+            objects.inputCFB.inputColorsFB('selected', options.selected);
+          }
+          return(options.selected);
+        }, //setSelected
+
+
+      setTexts : function (object, value)
+        {
+          var options=object.data('options'),
+              objects=object.data('objects');
+
+          if(value.r!=null)
+          {
+            options.texts.r=value.r;
+            objects.inputCRL.html(options.texts.r);
+          }
+          if(value.g!=null)
+          {
+            options.texts.g=value.g;
+            objects.inputCGL.html(options.texts.g);
+          }
+          if(value.b!=null)
+          {
+            options.texts.b=value.b;
+            objects.inputCBL.html(options.texts.b);
+          }
+          if(value.h!=null)
+          {
+            options.texts.h=value.h;
+            objects.inputCHL.html(options.texts.h);
+          }
+          if(value.s!=null)
+          {
+            options.texts.s=value.s;
+            objects.inputCSL.html(options.texts.s);
+          }
+          if(value.v!=null)
+          {
+            options.texts.v=value.v;
+            objects.inputCVL.html(options.texts.v);
+          }
+          if(value.a!=null)
+          {
+            options.texts.a=value.a;
+            objects.inputCAL.html(options.texts.a);
+          }
+          if(value.color!=null)
+          {
+            options.texts.color=value.color;
+            objects.inputCcolorL.html(options.texts.color);
+          }
+
+          return(options.texts);
+        }, //setColors
+
+      /**
+       * @param String color : a '#rrggbb' string
+       * @param Integer opacity : [0..100] value
+       * @param String target : 'fg' or 'bg'
+       * @param String from : '' for refreshing all items
+       */
+      setColor : function (object, color, opacity, target, from)
+        {
+          var objects=object.data('objects'),
+              properties=object.data('properties'),
+              options=object.data('options'),
+              rgbColor={r:0, g:0, b:0},
+              hsvColor={h:0, s:0, v:0},
+              svColorHue=0;
+
+          if(properties.refreshing || !(target=='fg' || target=='bg')) return(false);
+
+          properties.refreshing=true;
+
+          rgbColor=privateMethods.strToRGB(color);
+          hsvColor=privateMethods.RGBtoHSV(rgbColor);
+
+          if(from=='hsvH') hsvColor.h=objects.inputCHI.inputNum('value');
+          if(from=='hsvS') hsvColor.s=objects.inputCSI.inputNum('value');
+          if(from=='hsvV') hsvColor.v=objects.inputCVI.inputNum('value');
+          if(from=='dotAreaSV')
+          {
+            sv=objects.dotAreaSV.inputDotArea('values');
+            hsvColor.s=100-Math.round(sv.y);
+            hsvColor.v=Math.round(sv.x);
+          }
+          if(from=='dotAreaH') hsvColor.h=360-Math.round(objects.dotAreaH.inputDotArea('values').y);
+          svColorHue=hsvColor.h;
+
+          if(from=='' || from=='fb') objects.inputCAI.inputNum('value', opacity);
+
+          if(from!='hsvH' && from!='dotAreaSV' && from!='alpha') objects.dotAreaSV.inputDotArea('values', { x:hsvColor.v, y:100-hsvColor.s } );
+          if(from!='dotAreaH' && from!='alpha' && from!='hsvS' && from!='hsvV' && color!='#000000') objects.dotAreaH.inputDotArea('values', { y:360-hsvColor.h } );
+          if(from!='rgbR' && from!='rgbG' && from!='rgbB' && from!='alpha')
+          {
+            objects.inputCRI.inputNum('value', rgbColor.r);
+            objects.inputCGI.inputNum('value', rgbColor.g);
+            objects.inputCBI.inputNum('value', rgbColor.b);
+          }
+          if(from!='hsvH' && from!='hsvS' && from!='hsvV' && from!='alpha')
+          {
+            if(color!='#000000')
+            {
+              objects.inputCHI.inputNum('value', hsvColor.h);
+            }
+            else
+            {
+              svColorHue=objects.inputCHI.inputNum('value');
+            }
+            objects.inputCSI.inputNum('value', hsvColor.s);
+            objects.inputCVI.inputNum('value', hsvColor.v);
+          }
+          if(from!='color' && from!='alpha') objects.inputCcolorI.inputText('value', color.substr(1));
+
+          if(from!='alpha') objects.dotAreaSV
+                              .find('div.ui-inputDotArea')
+                              .css('background-color',
+                                privateMethods.RGBToStr(privateMethods.HSVtoRGB({h:svColorHue,s:100,v:100}))
+                              );
+
+          if(from!='fb') objects.inputCFB.inputColorsFB(target, {color:color, opacity:opacity/100} );
+
+          if(from!='')
+          {
+            if(target=='fg')
+            {
+              options.colors.fg.color=color;
+              options.colors.fg.opacity=opacity/100;
+            }
+            else
+            {
+              options.colors.bg.color=color;
+              options.colors.bg.opacity=opacity/100;
+            }
+          }
+
+          properties.refreshing=false;
+
+          if(options.change) object.trigger('inputColorPickerChange', {target:target, color:{color:color, opacity:opacity/100} } );
+        },
+
+      setColors : function (object, value)
+        {
+          var objects=object.data('objects'),
+              options=object.data('options');
+
+          if(value.fg!=null)
+          {
+            if(value.fg.color!=null) options.colors.fg.color=value.fg.color;
+            if(value.fg.opacity!=null) options.colors.fg.opacity=value.fg.opacity;
+            if(objects.inputCFB.inputColorsFB('selected')=='fg')
+            {
+              privateMethods.setColor(object, options.colors.fg.color, Math.round(options.colors.fg.opacity*100), 'fg', '');
+            }
+            else
+            {
+              objects.inputCFB.inputColorsFB('fg', options.colors.fg);
+            }
+          }
+
+          if(value.bg!=null)
+          {
+            if(value.bg.color!=null) options.colors.bg.color=value.bg.color;
+            if(value.bg.opacity!=null) options.colors.bg.opacity=value.bg.opacity;
+            if(objects.inputCFB.inputColorsFB('selected')=='bg')
+            {
+              privateMethods.setColor(object, options.colors.bg.color, Math.round(options.colors.bg.opacity*100), 'bg', '');
+            }
+            else
+            {
+              objects.inputCFB.inputColorsFB('bg', options.colors.bg);
+            }
+          }
+
+          return(options.colors);
+        }, //setFG
+
+      setEventChange : function (object, value)
+        {
+          var options=object.data('options');
+
+          options.change=value;
+          object.unbind('inputColorPickerChange');
+          if(value) object.bind('inputColorPickerChange', options.change);
+          return(options.change);
+        },
+
+      computeCurrentColor : function (object, from)
+        {
+          var options=object.data('options'),
+              objects=object.data('objects'),
+              properties=object.data('properties'),
+              colors={},
+              target=objects.inputCFB.inputColorsFB('selected');
+
+          if(properties.refreshing) return(false);
+
+          switch(from)
+          {
+            case 'dotAreaSV':
+            case 'dotAreaH':
+              var sv=objects.dotAreaSV.inputDotArea('values');
+              colors.color=privateMethods.RGBToStr(
+                privateMethods.HSVtoRGB(
+                  {
+                    h:360-objects.dotAreaH.inputDotArea('values').y,
+                    s:100-sv.y,
+                    v:sv.x
+                  }
+                )
+              );
+              if(target=='fg')
+              {
+                colors.opacity=Math.round(options.colors.fg.opacity*100);
+              }
+              else
+              {
+                colors.opacity=Math.round(options.colors.bg.opacity*100);
+              }
+              break;
+            case 'hsvH':
+            case 'hsvS':
+            case 'hsvV':
+              colors.color=privateMethods.RGBToStr(
+                privateMethods.HSVtoRGB(
+                  {
+                    h:objects.inputCHI.inputNum('value'),
+                    s:objects.inputCSI.inputNum('value'),
+                    v:objects.inputCVI.inputNum('value')
+                  }
+                )
+              );
+              if(target=='fg')
+              {
+                colors.opacity=Math.round(options.colors.fg.opacity*100);
+              }
+              else
+              {
+                colors.opacity=Math.round(options.colors.bg.opacity*100);
+              }
+              break;
+            case 'rgbR':
+            case 'rgbG':
+            case 'rgbB':
+              colors.color=privateMethods.RGBToStr(
+                {
+                  r:objects.inputCRI.inputNum('value'),
+                  g:objects.inputCGI.inputNum('value'),
+                  b:objects.inputCBI.inputNum('value')
+                }
+              );
+              if(target=='fg')
+              {
+                colors.opacity=Math.round(options.colors.fg.opacity*100);
+              }
+              else
+              {
+                colors.opacity=Math.round(options.colors.bg.opacity*100);
+              }
+              break;
+            case 'alpha':
+              if(target=='fg')
+              {
+                colors.color=options.colors.fg.color;
+              }
+              else
+              {
+                colors.color=options.colors.bg.color;
+              }
+              colors.opacity=objects.inputCAI.inputNum('value');
+              break;
+            case 'fb':
+              if(target=='fg')
+              {
+                colors.color=options.colors.fg.color;
+                colors.opacity=Math.round(options.colors.fg.opacity*100);
+              }
+              else
+              {
+                colors.color=options.colors.bg.color;
+                colors.opacity=Math.round(options.colors.bg.opacity*100);
+              }
+              break;
+            case 'color':
+              colors.color='#'+objects.inputCcolorI.inputText('value');
+              if(target=='fg')
+              {
+                colors.opacity=Math.round(options.colors.fg.opacity*100);
+              }
+              else
+              {
+                colors.opacity=Math.round(options.colors.bg.opacity*100);
+              }
+              break;
+          }
+
+          privateMethods.setColor(object, colors.color, colors.opacity, target, from);
+        },
+
+      /**
+       * convert a RGB object {r,g,b} to String '#rrggbb'
+       * @param Object color : {r,g,b} object
+       * @return String
+       */
+      RGBToStr : function (color)
+        {
+          var r=color.r.toString(16),
+              g=color.g.toString(16),
+              b=color.b.toString(16);
+          if(r.length<2) r='0'+r;
+          if(g.length<2) g='0'+g;
+          if(b.length<2) b='0'+b;
+          return('#'+r+g+b);
+        },
+
+      /**
+       * convert a string to RGB object {r,g,b}
+       * string can be '#rrggbb' or 'rgb(r,g,b)'
+       * @param String color
+       * @return Object
+       */
+      strToRGB : function (color)
+        {
+          var returned={
+                r:0,
+                g:0,
+                b:0
+              },
+              re1=/^rgb\((\d){1,3},(\d){1,3},(\d){1,3}\)$/i,
+              re2=/^#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})$/i,
+              colors=re1.exec(color);
+
+          if(colors!=null)
+          {
+            returned.r=parseInt(colors[1]);
+            returned.g=parseInt(colors[2]);
+            returned.b=parseInt(colors[3]);
+          }
+          else
+          {
+            colors=re2.exec(color);
+
+            if(colors!=null)
+            {
+              returned.r=parseInt('0x'+colors[1]);
+              returned.g=parseInt('0x'+colors[2]);
+              returned.b=parseInt('0x'+colors[3]);
+            }
+          }
+          return(returned);
+        },
+
+      /**
+       * convert an RGB object {r,g,b} to HSV object {h,s,v}
+       * @param Object color : {r,g,b}
+       * @return Object
+       */
+      RGBtoHSV : function (color)
+        {
+          var returned={
+                h:0,
+                s:0,
+                v:0
+          },
+          color={
+            r:color.r/255,
+            g:color.g/255,
+            b:color.b/255
+          },
+          max=Math.max(color.r, color.g, color.b),
+          min=Math.min(color.r, color.g, color.b);
+
+          if(max==min)
+          {
+            returned.h=0;
+          }
+          else if(max==color.r)
+          {
+            returned.h=Math.round((60*(color.g-color.b)/(max-min)+360)%360);
+          }
+          else if(max==color.g)
+          {
+            returned.h=Math.round((60*(color.b-color.r)/(max-min)+120));
+          }
+          else if(max==color.b)
+          {
+            returned.h=Math.round((60*(color.r-color.g)/(max-min)+240));
+          }
+
+          returned.s=Math.round(100*(max==0?0:1-min/max));
+          returned.v=Math.round(100*max);
+
+          return(returned);
+        },
+
+      /**
+       * convert an HSV object {h,s,v} to RGB object {r,g,b}
+       * @param Object color : {h,s,v}
+       * @return Object : {r,g,b}
+       */
+      HSVtoRGB : function (color)
+        {
+          var h=Math.floor(Math.abs(color.h/60))%6,
+              f=color.h/60-h,
+              l=Math.round(2.55*color.v*(1-color.s/100)),
+              m=Math.round(2.55*color.v*(1-f*color.s/100)),
+              n=Math.round(2.55*color.v*(1-(1-f)*color.s/100)),
+              v=Math.round(2.55*color.v);
+
+          switch(h)
+          {
+            case 0:
+              return({r:v, g:n, b:l});
+              break;
+            case 1:
+              return({r:m, g:v, b:l});
+              break;
+            case 2:
+              return({r:l, g:v, b:n});
+              break;
+            case 3:
+              return({r:l, g:m, b:v});
+              break;
+            case 4:
+              return({r:n, g:l, b:v});
+              break;
+            case 5:
+              return({r:v, g:l, b:m});
+              break;
+          }
+          return({r:0, g:0, b:0});
+        }
+    };
+
+
+    $.fn.inputColorPicker = 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.inputColorPicker' );
+      }
+    } // $.fn.inputColorPicker
+
+  }
+)(jQuery);
+
+$.inputDialogColor = function(opt)
+{
+  var options=
+        {
+          modal:true,
+          mode:2,
+          alpha:true,
+          colors:
+            {
+              fg:{ color:'#ffffff', opacity:1 },
+              bg:{ color:'#000000', opacity:1 }
+            },
+          title:'Colors selector',
+          texts:null,
+          buttons:
+            {
+              ok:'Ok',
+              cancel:'Cancel'
+            },
+          selected:'fg',
+          change:null
+        },
+      objects=
+        {
+          dialogBox:$('<div/>'),
+          colorPicker:$('<div/>', {'class':'dialogColor'} )
+        },
+
+  setOptions = function (opt)
+    {
+      if(opt.modal==true || opt.modal==false) options.modal=opt.modal;
+      if(opt.mode==1 || opt.mode==2) options.mode=opt.mode;
+      if(opt.alpha==true || opt.alpha==false) options.alpha=opt.alpha;
+      if(opt.colors!=null) options.colors=opt.colors;
+      options.texts=opt.texts;
+      if(opt.selected=='fg' || opt.selected=='bg') options.selected=opt.selected;
+      if(opt.title) options.title=opt.title;
+      if(opt.buttons && opt.buttons.ok) options.buttons.ok=opt.buttons.ok;
+      if(opt.buttons && opt.buttons.cancel) options.buttons.cancel=opt.buttons.cancel;
+      if(opt.change && $.isFunction(opt.change)) options.change=opt.change;
+    },
+
+  initDialog = function ()
+    {
+      var dialogOpt=
+          {
+            buttons:{},
+            width:354,
+            closeText:'x',
+            dialogClass:'ui-inputDialogColor',
+            modal:options.modal,
+            resizable:false,
+            title:options.title,
+            open: null,
+            close: function ()
+                    {
+                      objects.colorPicker.inputColorPicker('destroy').remove();
+                      $(this).dialog('destroy');
+                    }
+          };
+
+      if(options.modal)
+      {
+        dialogOpt.buttons=
+          {
+            'ok' : function (event)
+                      {
+                        if(options.change)
+                        {
+                          if(options.mode==1)
+                          {
+                            options.change(event, objects.colorPicker.inputColorPicker('colors').fg );
+                          }
+                          else
+                          {
+                            options.change(event, objects.colorPicker.inputColorPicker('colors') );
+                          }
+                        }
+                        $(this).dialog('close');
+                      },
+            'cancel' : function (event)
+                      {
+                        $(this).dialog('close');
+                      }
+          };
+        dialogOpt.open= function ()
+          {
+            objects.colorPicker
+              .inputColorPicker(
+                {
+                  mode:options.mode,
+                  alpha:options.alpha,
+                  texts:options.texts,
+                  colors:options.colors,
+                  selected:options.selected
+                }
+              );
+          };
+      }
+      else
+      {
+        dialogOpt.open= function ()
+          {
+            objects.colorPicker
+              .inputColorPicker(
+                {
+                  mode:options.mode,
+                  alpha:options.alpha,
+                  texts:options.texts,
+                  colors:options.colors,
+                  change:options.change,
+                  selected:options.selected
+                }
+              );
+          };
+      }
+
+      objects.dialogBox
+        .append(objects.colorPicker)
+        .dialog(dialogOpt);
+    };
+
+  setOptions(opt);
+  initDialog();
+
+} // $.fn.inputDialogColor
+
+
Index: /extensions/GrumPluginClasses/js/ui.inputColorPicker.min.js
===================================================================
--- /extensions/GrumPluginClasses/js/ui.inputColorPicker.min.js	(revision 8961)
+++ /extensions/GrumPluginClasses/js/ui.inputColorPicker.min.js	(revision 8961)
@@ -0,0 +1,184 @@
+/* file: ui.inputColorPicker.js - v1.0.0 | minified on 2011/01/27 with http://jscompress.com/ */
+(function($)
+{var publicMethods={init:function(opt)
+{return this.each(function()
+{var $this=$(this),data=$this.data('options'),objects=$this.data('objects'),properties=$this.data('properties'),options={colors:{fg:{color:'#ffffff',opacity:1},bg:{color:'#000000',opacity:1}},alpha:true,texts:{r:'R',g:'G',b:'B',a:'A',color:'#',h:'H',s:'S',v:'V'},mode:2,selected:'fg',change:null};$this.data('options',options);if(!properties)
+{$this.data('properties',{initialized:false,refreshing:false});properties=$this.data('properties');}
+if(!objects)
+{objects={container:$('<div/>',{'class':'ui-inputColorPicker'}),dotAreaSV:$('<div/>',{'class':'ui-inputColorPicker-dotAreaSV'}),dotAreaH:$('<div/>',{'class':'ui-inputColorPicker-dotAreaH'}),inputContainer:$('<table>',{'class':'ui-inputColorPicker-inputContainer'}),inputCRL:$('<td/>',{'class':'label'}),inputCRI:$('<td/>',{'class':'input'}),inputCGL:$('<td/>',{'class':'label'}),inputCGI:$('<td/>',{'class':'input'}),inputCBL:$('<td/>',{'class':'label'}),inputCBI:$('<td/>',{'class':'input'}),inputCHL:$('<td/>',{'class':'label'}),inputCHI:$('<td/>',{'class':'input'}),inputCSL:$('<td/>',{'class':'label'}),inputCSI:$('<td/>',{'class':'input'}),inputCVL:$('<td/>',{'class':'label'}),inputCVI:$('<td/>',{'class':'input'}),inputCAL:$('<td/>',{'class':'label'}),inputCAI:$('<td/>',{'class':'input'}),inputCcolorL:$('<td/>',{'class':'label'}),inputCcolorI:$('<td/>',{'class':'input'}),inputCFB:$('<td/>',{colspan:2,rowspan:2})};$this.html('').append(objects.container.append(objects.dotAreaSV).append(objects.dotAreaH).append(objects.inputContainer.append($('<tr/>').append(objects.inputCRL).append(objects.inputCRI).append(objects.inputCHL).append(objects.inputCHI)).append($('<tr/>').append(objects.inputCGL).append(objects.inputCGI).append(objects.inputCSL).append(objects.inputCSI)).append($('<tr/>').append(objects.inputCBL).append(objects.inputCBI).append(objects.inputCVL).append(objects.inputCVI)).append($('<tr/>').append(objects.inputCAL).append(objects.inputCAI).append(objects.inputCFB)).append($('<tr/>').append(objects.inputCcolorL).append(objects.inputCcolorI))));objects.dotAreaSV.inputDotArea({range:{x:[0,100],y:[0,100]},width:132,height:132,change:function(event,value)
+{privateMethods.computeCurrentColor($this,'dotAreaSV');}});objects.dotAreaH.inputDotArea({range:{x:false,y:[0,359]},width:20,height:132,change:function(event,value)
+{privateMethods.computeCurrentColor($this,'dotAreaH');}});objects.inputCRI.inputNum({minValue:0,maxValue:255,stepValue:1,numDec:0,unitValue:'',btInc:'+',btDec:'-',value:0,showSlider:'auto',change:function(event,value)
+{privateMethods.computeCurrentColor($this,'rgbR');}});objects.inputCGI.inputNum({minValue:0,maxValue:255,stepValue:1,numDec:0,unitValue:'',btInc:'+',btDec:'-',value:0,showSlider:'auto',change:function(event,value)
+{privateMethods.computeCurrentColor($this,'rgbG');}});objects.inputCBI.inputNum({minValue:0,maxValue:255,stepValue:1,numDec:0,unitValue:'',btInc:'+',btDec:'-',value:0,showSlider:'auto',change:function(event,value)
+{privateMethods.computeCurrentColor($this,'rgbB');}});objects.inputCAI.inputNum({minValue:0,maxValue:100,stepValue:1,numDec:0,unitValue:'',btInc:'+',btDec:'-',value:0,showSlider:'auto',change:function(event,value)
+{privateMethods.computeCurrentColor($this,'alpha');}});objects.inputCHI.inputNum({minValue:0,maxValue:359,stepValue:1,numDec:0,unitValue:'',btInc:'+',btDec:'-',value:0,showSlider:'auto',change:function(event,value)
+{privateMethods.computeCurrentColor($this,'hsvH');}});objects.inputCSI.inputNum({minValue:0,maxValue:100,stepValue:1,numDec:0,unitValue:'',btInc:'+',btDec:'-',value:0,showSlider:'auto',change:function(event,value)
+{privateMethods.computeCurrentColor($this,'hsvS');}});objects.inputCVI.inputNum({minValue:0,maxValue:100,stepValue:1,numDec:0,unitValue:'',btInc:'+',btDec:'-',value:0,showSlider:'auto',change:function(event,value)
+{privateMethods.computeCurrentColor($this,'hsvV');}});objects.inputCcolorI.inputText({value:'',displayChar:6,maxChar:6,regExp:'/^(?:[a-f0-9]{2}){3}$/i',change:function(event,value)
+{privateMethods.computeCurrentColor($this,'color');}});objects.inputCFB.inputColorsFB({width:40,height:40,change:function(event,value)
+{privateMethods.computeCurrentColor($this,'fb');}});$this.data('objects',objects);}
+privateMethods.setOptions($this,opt);});},destroy:function()
+{return this.each(function()
+{var $this=$(this),objects=$this.data('objects');objects.dotAreaSV.remove();objects.dotAreaH.remove();objects.inputCRL.remove();objects.inputCRI.remove();objects.inputCHL.remove();objects.inputCHI.remove();objects.inputCGL.remove();objects.inputCGI.remove();objects.inputCSL.remove();objects.inputCSI.remove();objects.inputCBL.remove();objects.inputCBI.remove();objects.inputCVL.remove();objects.inputCVI.remove();objects.inputCAL.remove();objects.inputCAI.remove();objects.inputCFB.remove();objects.inputCcolorL.remove();objects.inputCcolorI.remove();objects.inputContainer.remove();objects.container.remove();});},options:function(value)
+{return(this.each(function()
+{privateMethods.setOptions($(this),value);}));},colors:function(value)
+{if(value!=null)
+{return(this.each(function()
+{privateMethods.setColors($(this),value);}));}
+else
+{var options=this.data('options');return(options.colors);}},texts:function(value)
+{if(value!=null)
+{return(this.each(function()
+{privateMethods.setTexts($(this),value,true);}));}
+else
+{var options=this.data('options');return(options.texts);}},alpha:function(value)
+{if(value!=null)
+{return(this.each(function()
+{privateMethods.setAlpha($(this),value);}));}
+else
+{var options=this.data('options');return(options.alpha);}},selected:function(value)
+{if(value!=null)
+{return(this.each(function()
+{privateMethods.setSelected($(this),value);}));}
+else
+{var options=this.data('options');return(options.selected);}},mode:function(value)
+{if(value!=null)
+{return(this.each(function()
+{privateMethods.setMode($(this),value);}));}
+else
+{var options=this.data('options');return(options.mode);}},change:function(value)
+{if(value!=null&&$.isFunction(value))
+{return(this.each(function()
+{privateMethods.setEventChange($(this),value);}));}
+else
+{var options=this.data('options');if(options)
+{return(options.change);}
+else
+{return(null);}}}};var privateMethods={setOptions:function(object,value)
+{var properties=object.data('properties'),options=object.data('options');if(!$.isPlainObject(value))return(false);properties.initialized=false;privateMethods.setMode(object,(value.mode!=null)?value.mode:options.mode);privateMethods.setSelected(object,(value.selected!=null)?value.selected:options.selected);privateMethods.setColors(object,(value.colors!=null)?value.colors:options.colors);privateMethods.setAlpha(object,(value.alpha!=null)?value.alpha:options.alpha);privateMethods.setTexts(object,(value.texts!=null)?value.texts:options.texts);privateMethods.setEventChange(object,(value.change!=null)?value.change:options.change);properties.initialized=true;},setAlpha:function(object,value)
+{var options=object.data('options'),objects=object.data('objects');if((!properties.initialized||options.alpha!=value)&&(value==true||value==false))
+{options.alpha=value;if(options.alpha)
+{objects.inputCAI.css('visibility','visible');objects.inputCAL.css('visibility','visible');}
+else
+{objects.inputCAI.css('visibility','hidden');objects.inputCAL.css('visibility','hidden');}}
+return(options.alpha);},setMode:function(object,value)
+{var options=object.data('options'),objects=object.data('objects');if((!properties.initialized||options.mode!=value)&&(value==1||value==2))
+{options.mode=value;objects.inputCFB.inputColorsFB('mode',options.mode);}
+return(options.mode);},setSelected:function(object,value)
+{var options=object.data('options'),objects=object.data('objects');if((!properties.initialized||options.selected!=value)&&(value=='fg'||value=='bg'))
+{options.selected=value;objects.inputCFB.inputColorsFB('selected',options.selected);}
+return(options.selected);},setTexts:function(object,value)
+{var options=object.data('options'),objects=object.data('objects');if(value.r!=null)
+{options.texts.r=value.r;objects.inputCRL.html(options.texts.r);}
+if(value.g!=null)
+{options.texts.g=value.g;objects.inputCGL.html(options.texts.g);}
+if(value.b!=null)
+{options.texts.b=value.b;objects.inputCBL.html(options.texts.b);}
+if(value.h!=null)
+{options.texts.h=value.h;objects.inputCHL.html(options.texts.h);}
+if(value.s!=null)
+{options.texts.s=value.s;objects.inputCSL.html(options.texts.s);}
+if(value.v!=null)
+{options.texts.v=value.v;objects.inputCVL.html(options.texts.v);}
+if(value.a!=null)
+{options.texts.a=value.a;objects.inputCAL.html(options.texts.a);}
+if(value.color!=null)
+{options.texts.color=value.color;objects.inputCcolorL.html(options.texts.color);}
+return(options.texts);},setColor:function(object,color,opacity,target,from)
+{var objects=object.data('objects'),properties=object.data('properties'),options=object.data('options'),rgbColor={r:0,g:0,b:0},hsvColor={h:0,s:0,v:0},svColorHue=0;if(properties.refreshing||!(target=='fg'||target=='bg'))return(false);properties.refreshing=true;rgbColor=privateMethods.strToRGB(color);hsvColor=privateMethods.RGBtoHSV(rgbColor);if(from=='hsvH')hsvColor.h=objects.inputCHI.inputNum('value');if(from=='hsvS')hsvColor.s=objects.inputCSI.inputNum('value');if(from=='hsvV')hsvColor.v=objects.inputCVI.inputNum('value');if(from=='dotAreaSV')
+{sv=objects.dotAreaSV.inputDotArea('values');hsvColor.s=100-Math.round(sv.y);hsvColor.v=Math.round(sv.x);}
+if(from=='dotAreaH')hsvColor.h=360-Math.round(objects.dotAreaH.inputDotArea('values').y);svColorHue=hsvColor.h;if(from==''||from=='fb')objects.inputCAI.inputNum('value',opacity);if(from!='hsvH'&&from!='dotAreaSV'&&from!='alpha')objects.dotAreaSV.inputDotArea('values',{x:hsvColor.v,y:100-hsvColor.s});if(from!='dotAreaH'&&from!='alpha'&&from!='hsvS'&&from!='hsvV'&&color!='#000000')objects.dotAreaH.inputDotArea('values',{y:360-hsvColor.h});if(from!='rgbR'&&from!='rgbG'&&from!='rgbB'&&from!='alpha')
+{objects.inputCRI.inputNum('value',rgbColor.r);objects.inputCGI.inputNum('value',rgbColor.g);objects.inputCBI.inputNum('value',rgbColor.b);}
+if(from!='hsvH'&&from!='hsvS'&&from!='hsvV'&&from!='alpha')
+{if(color!='#000000')
+{objects.inputCHI.inputNum('value',hsvColor.h);}
+else
+{svColorHue=objects.inputCHI.inputNum('value');}
+objects.inputCSI.inputNum('value',hsvColor.s);objects.inputCVI.inputNum('value',hsvColor.v);}
+if(from!='color'&&from!='alpha')objects.inputCcolorI.inputText('value',color.substr(1));if(from!='alpha')objects.dotAreaSV.find('div.ui-inputDotArea').css('background-color',privateMethods.RGBToStr(privateMethods.HSVtoRGB({h:svColorHue,s:100,v:100})));if(from!='fb')objects.inputCFB.inputColorsFB(target,{color:color,opacity:opacity/100});if(from!='')
+{if(target=='fg')
+{options.colors.fg.color=color;options.colors.fg.opacity=opacity/100;}
+else
+{options.colors.bg.color=color;options.colors.bg.opacity=opacity/100;}}
+properties.refreshing=false;if(options.change)object.trigger('inputColorPickerChange',{target:target,color:{color:color,opacity:opacity/100}});},setColors:function(object,value)
+{var objects=object.data('objects'),options=object.data('options');if(value.fg!=null)
+{if(value.fg.color!=null)options.colors.fg.color=value.fg.color;if(value.fg.opacity!=null)options.colors.fg.opacity=value.fg.opacity;if(objects.inputCFB.inputColorsFB('selected')=='fg')
+{privateMethods.setColor(object,options.colors.fg.color,Math.round(options.colors.fg.opacity*100),'fg','');}
+else
+{objects.inputCFB.inputColorsFB('fg',options.colors.fg);}}
+if(value.bg!=null)
+{if(value.bg.color!=null)options.colors.bg.color=value.bg.color;if(value.bg.opacity!=null)options.colors.bg.opacity=value.bg.opacity;if(objects.inputCFB.inputColorsFB('selected')=='bg')
+{privateMethods.setColor(object,options.colors.bg.color,Math.round(options.colors.bg.opacity*100),'bg','');}
+else
+{objects.inputCFB.inputColorsFB('bg',options.colors.bg);}}
+return(options.colors);},setEventChange:function(object,value)
+{var options=object.data('options');options.change=value;object.unbind('inputColorPickerChange');if(value)object.bind('inputColorPickerChange',options.change);return(options.change);},computeCurrentColor:function(object,from)
+{var options=object.data('options'),objects=object.data('objects'),properties=object.data('properties'),colors={},target=objects.inputCFB.inputColorsFB('selected');if(properties.refreshing)return(false);switch(from)
+{case'dotAreaSV':case'dotAreaH':var sv=objects.dotAreaSV.inputDotArea('values');colors.color=privateMethods.RGBToStr(privateMethods.HSVtoRGB({h:360-objects.dotAreaH.inputDotArea('values').y,s:100-sv.y,v:sv.x}));if(target=='fg')
+{colors.opacity=Math.round(options.colors.fg.opacity*100);}
+else
+{colors.opacity=Math.round(options.colors.bg.opacity*100);}
+break;case'hsvH':case'hsvS':case'hsvV':colors.color=privateMethods.RGBToStr(privateMethods.HSVtoRGB({h:objects.inputCHI.inputNum('value'),s:objects.inputCSI.inputNum('value'),v:objects.inputCVI.inputNum('value')}));if(target=='fg')
+{colors.opacity=Math.round(options.colors.fg.opacity*100);}
+else
+{colors.opacity=Math.round(options.colors.bg.opacity*100);}
+break;case'rgbR':case'rgbG':case'rgbB':colors.color=privateMethods.RGBToStr({r:objects.inputCRI.inputNum('value'),g:objects.inputCGI.inputNum('value'),b:objects.inputCBI.inputNum('value')});if(target=='fg')
+{colors.opacity=Math.round(options.colors.fg.opacity*100);}
+else
+{colors.opacity=Math.round(options.colors.bg.opacity*100);}
+break;case'alpha':if(target=='fg')
+{colors.color=options.colors.fg.color;}
+else
+{colors.color=options.colors.bg.color;}
+colors.opacity=objects.inputCAI.inputNum('value');break;case'fb':if(target=='fg')
+{colors.color=options.colors.fg.color;colors.opacity=Math.round(options.colors.fg.opacity*100);}
+else
+{colors.color=options.colors.bg.color;colors.opacity=Math.round(options.colors.bg.opacity*100);}
+break;case'color':colors.color='#'+objects.inputCcolorI.inputText('value');if(target=='fg')
+{colors.opacity=Math.round(options.colors.fg.opacity*100);}
+else
+{colors.opacity=Math.round(options.colors.bg.opacity*100);}
+break;}
+privateMethods.setColor(object,colors.color,colors.opacity,target,from);},RGBToStr:function(color)
+{var r=color.r.toString(16),g=color.g.toString(16),b=color.b.toString(16);if(r.length<2)r='0'+r;if(g.length<2)g='0'+g;if(b.length<2)b='0'+b;return('#'+r+g+b);},strToRGB:function(color)
+{var returned={r:0,g:0,b:0},re1=/^rgb\((\d){1,3},(\d){1,3},(\d){1,3}\)$/i,re2=/^#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})$/i,colors=re1.exec(color);if(colors!=null)
+{returned.r=parseInt(colors[1]);returned.g=parseInt(colors[2]);returned.b=parseInt(colors[3]);}
+else
+{colors=re2.exec(color);if(colors!=null)
+{returned.r=parseInt('0x'+colors[1]);returned.g=parseInt('0x'+colors[2]);returned.b=parseInt('0x'+colors[3]);}}
+return(returned);},RGBtoHSV:function(color)
+{var returned={h:0,s:0,v:0},color={r:color.r/255,g:color.g/255,b:color.b/255},max=Math.max(color.r,color.g,color.b),min=Math.min(color.r,color.g,color.b);if(max==min)
+{returned.h=0;}
+else if(max==color.r)
+{returned.h=Math.round((60*(color.g-color.b)/(max-min)+360)%360);}
+else if(max==color.g)
+{returned.h=Math.round((60*(color.b-color.r)/(max-min)+120));}
+else if(max==color.b)
+{returned.h=Math.round((60*(color.r-color.g)/(max-min)+240));}
+returned.s=Math.round(100*(max==0?0:1-min/max));returned.v=Math.round(100*max);return(returned);},HSVtoRGB:function(color)
+{var h=Math.floor(Math.abs(color.h/60))%6,f=color.h/60-h,l=Math.round(2.55*color.v*(1-color.s/100)),m=Math.round(2.55*color.v*(1-f*color.s/100)),n=Math.round(2.55*color.v*(1-(1-f)*color.s/100)),v=Math.round(2.55*color.v);switch(h)
+{case 0:return({r:v,g:n,b:l});break;case 1:return({r:m,g:v,b:l});break;case 2:return({r:l,g:v,b:n});break;case 3:return({r:l,g:m,b:v});break;case 4:return({r:n,g:l,b:v});break;case 5:return({r:v,g:l,b:m});break;}
+return({r:0,g:0,b:0});}};$.fn.inputColorPicker=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.inputColorPicker');}}})(jQuery);$.inputDialogColor=function(opt)
+{var options={modal:true,mode:2,alpha:true,colors:{fg:{color:'#ffffff',opacity:1},bg:{color:'#000000',opacity:1}},title:'Colors selector',texts:null,buttons:{ok:'Ok',cancel:'Cancel'},selected:'fg',change:null},objects={dialogBox:$('<div/>'),colorPicker:$('<div/>',{'class':'dialogColor'})},setOptions=function(opt)
+{if(opt.modal==true||opt.modal==false)options.modal=opt.modal;if(opt.mode==1||opt.mode==2)options.mode=opt.mode;if(opt.alpha==true||opt.alpha==false)options.alpha=opt.alpha;if(opt.colors!=null)options.colors=opt.colors;options.texts=opt.texts;if(opt.selected=='fg'||opt.selected=='bg')options.selected=opt.selected;if(opt.title)options.title=opt.title;if(opt.buttons&&opt.buttons.ok)options.buttons.ok=opt.buttons.ok;if(opt.buttons&&opt.buttons.cancel)options.buttons.cancel=opt.buttons.cancel;if(opt.change&&$.isFunction(opt.change))options.change=opt.change;},initDialog=function()
+{var dialogOpt={buttons:{},width:354,closeText:'x',dialogClass:'ui-inputDialogColor',modal:options.modal,resizable:false,title:options.title,open:null,close:function()
+{objects.colorPicker.inputColorPicker('destroy').remove();$(this).dialog('destroy');}};if(options.modal)
+{dialogOpt.buttons={'ok':function(event)
+{if(options.change)
+{if(options.mode==1)
+{options.change(event,objects.colorPicker.inputColorPicker('colors').fg);}
+else
+{options.change(event,objects.colorPicker.inputColorPicker('colors'));}}
+$(this).dialog('close');},'cancel':function(event)
+{$(this).dialog('close');}};dialogOpt.open=function()
+{objects.colorPicker.inputColorPicker({mode:options.mode,alpha:options.alpha,texts:options.texts,colors:options.colors,selected:options.selected});};}
+else
+{dialogOpt.open=function()
+{objects.colorPicker.inputColorPicker({mode:options.mode,alpha:options.alpha,texts:options.texts,colors:options.colors,change:options.change,selected:options.selected});};}
+objects.dialogBox.append(objects.colorPicker).dialog(dialogOpt);};setOptions(opt);initDialog();}
Index: /extensions/GrumPluginClasses/js/ui.inputColorsFB.js
===================================================================
--- /extensions/GrumPluginClasses/js/ui.inputColorsFB.js	(revision 8961)
+++ /extensions/GrumPluginClasses/js/ui.inputColorsFB.js	(revision 8961)
@@ -0,0 +1,738 @@
+/**
+ * -----------------------------------------------------------------------------
+ * file: ui.inputColorsFB.js
+ * file version: 1.0.0
+ * date: 2010-11-04
+ *
+ * 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/11/04 | 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 =
+                    {
+                      width:0,
+                      height:0,
+                      disabled:false,
+                      fg:
+                        {
+                          color:'#ffffff',
+                          opacity:1
+                        },
+                      bg:
+                        {
+                          color:'#000000',
+                          opacity:1
+                        },
+                      selected:'fg',
+                      mode:2, //1 - 2
+                      boxSize:0.6,
+                      change:null,
+                      click: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
+                  }
+                );
+                properties=$this.data('properties');
+              }
+
+              if(!objects)
+              {
+                objects =
+                  {
+                    container:$('<div/>',
+                        {
+                          'class':'ui-inputColorsFB',
+                          css:{
+                            width:'100%',
+                            height:'100%'
+                          }
+                        }
+                    ),
+                    fg:$('<div/>',
+                      {
+                        'class':'ui-inputColorsFB-fg'
+                      }
+                    ).bind('click.inputColorsFB',
+                        function (event)
+                        {
+                          if(options.mode==2) privateMethods.setSelected($this, 'fg' );
+                          if(options.click) $this.trigger('inputColorsFBClick', {target:'fg', color: options.fg} );
+                        }
+                      ),
+                    bg:$('<div/>',
+                      {
+                        'class':'ui-inputColorsFB-bg'
+                      }
+                    ).bind('click.inputColorsFB',
+                        function (event)
+                        {
+                          if(options.mode==2) privateMethods.setSelected($this, 'bg' );
+                          if(options.click) $this.trigger('inputColorsFBClick', {target:'bg', color: options.bg} );
+                        }
+                      ),
+                    fgopacity:$('<div/>',
+                        {
+                          'class':'ui-inputColorsFB-fgopacity'
+                        }
+                    ),
+                    bgopacity:$('<div/>',
+                        {
+                          'class':'ui-inputColorsFB-bgopacity'
+                        }
+                    )
+                  };
+
+                $this
+                  .html('')
+                  .append(objects.container.append(objects.fgopacity.append(objects.fg)).append(objects.bgopacity.append(objects.bg)));
+
+                $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.dot.remove();
+              objects.container.unbind().remove();
+              $this
+                .unbind('.inputColorsFB')
+                .css(
+                  {
+                    width:'',
+                    height:''
+                  }
+                );
+            }
+          );
+        }, // destroy
+
+      options: function (value)
+        {
+          return(
+            this.each(
+              function()
+              {
+                privateMethods.setOptions($(this), value);
+              }
+            )
+          );
+        }, // options
+
+      disabled: function (value)
+        {
+          if(value!=null)
+          {
+            return(
+              this.each(
+                function()
+                {
+                  privateMethods.setDisabled($(this), value);
+                }
+              )
+            );
+          }
+          else
+          {
+            var options = this.data('options');
+
+            if(options)
+            {
+              return(options.disabled);
+            }
+            else
+            {
+              return('');
+            }
+          }
+        }, // disabled
+
+      mode: function (value)
+        {
+          if(value!=null)
+          {
+            return(
+              this.each(
+                function()
+                {
+                  privateMethods.setMode($(this), value, true);
+                }
+              )
+            );
+          }
+          else
+          {
+            var options=this.data('options');
+            return(options.mode);
+          }
+        }, // mode
+
+      boxSize: function (value)
+        {
+          if(value!=null)
+          {
+            return(
+              this.each(
+                function()
+                {
+                  privateMethods.setBoxSize($(this), value, true);
+                }
+              )
+            );
+          }
+          else
+          {
+            var options=this.data('options');
+            return(options.boxSize);
+          }
+        }, // boxSize
+
+      width: function (value)
+        {
+          if(value!=null)
+          {
+            return(
+              this.each(
+                function()
+                {
+                  privateMethods.setWidth($(this), value, true);
+                }
+              )
+            );
+          }
+          else
+          {
+            var options=this.data('options');
+            return(options.width);
+          }
+        }, // width
+
+      height: function (value)
+        {
+          if(value!=null)
+          {
+            return(
+              this.each(
+                function()
+                {
+                  privateMethods.setHeight($(this), value, true);
+                }
+              )
+            );
+          }
+          else
+          {
+            var options=this.data('options');
+            return(options.height);
+          }
+        }, // height
+
+      fg: function (value)
+        {
+          if(value!=null)
+          {
+            // set selected value
+            return(
+              this.each(
+                function()
+                {
+                  privateMethods.setFG($(this), value, true);
+                }
+              )
+            );
+          }
+          else
+          {
+            // return the selected tags
+            var options=this.data('options');
+            return(options.fg);
+          }
+        }, // fg
+
+      bg: function (value)
+        {
+          if(value!=null)
+          {
+            // set selected value
+            return(
+              this.each(
+                function()
+                {
+                  privateMethods.setBG($(this), value, true);
+                }
+              )
+            );
+          }
+          else
+          {
+            // return the selected tags
+            var options=this.data('options');
+            return(options.bg);
+          }
+        }, // bg
+
+      selected: function (value)
+        {
+          if(value!=null)
+          {
+            // set selected value
+            return(
+              this.each(
+                function()
+                {
+                  privateMethods.setSelected($(this), value);
+                }
+              )
+            );
+          }
+          else
+          {
+            // return the selected tags
+            var options=this.data('options');
+            return(options.selected);
+          }
+        }, // selected
+
+      isValid: function (value)
+        {
+          if(value!=null)
+          {
+            // set selected value
+            return(
+              this.each(
+                function()
+                {
+                  privateMethods.setIsValid($(this), value);
+                }
+              )
+            );
+          }
+          else
+          {
+            // return the selected tags
+            var properties=this.data('properties');
+            return(properties.isValid);
+          }
+        }, // isValid
+
+      change: function (value)
+        {
+          if(value!=null && $.isFunction(value))
+          {
+            // set selected value
+            return(
+              this.each(
+                function()
+                {
+                  privateMethods.setEventChange($(this), value);
+                }
+              )
+            );
+          }
+          else
+          {
+            // return the selected value
+            var options=this.data('options');
+
+            if(options)
+            {
+              return(options.change);
+            }
+            else
+            {
+              return(null);
+            }
+          }
+        }, // change
+
+      click: function (value)
+        {
+          if(value!=null && $.isFunction(value))
+          {
+            // set selected value
+            return(
+              this.each(
+                function()
+                {
+                  privateMethods.setEventClick($(this), value);
+                }
+              )
+            );
+          }
+          else
+          {
+            // return the selected value
+            var options=this.data('options');
+
+            if(options)
+            {
+              return(options.click);
+            }
+            else
+            {
+              return(null);
+            }
+          }
+        } // click
+
+    }; // 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.setMode(object, (value.mode!=null)?value.mode:options.mode);
+          privateMethods.setBoxSize(object, (value.boxSize!=null)?value.boxSize:options.boxSize);
+          privateMethods.setWidth(object, (value.width!=null)?value.width:options.width);
+          privateMethods.setHeight(object, (value.height!=null)?value.height:options.height);
+          privateMethods.setFG(object, (value.fg!=null)?value.fg:options.fg);
+          privateMethods.setBG(object, (value.bg!=null)?value.bg:options.bg);
+          privateMethods.setSelected(object, (value.selected!=null)?value.selected:options.selected, true);
+
+          privateMethods.setEventChange(object, (value.change!=null)?value.change:options.change);
+          privateMethods.setEventClick(object, (value.click!=null)?value.click:options.click);
+
+          properties.initialized=true;
+        },
+
+      setIsValid : function (object, value)
+        {
+          var objects=object.data('objects'),
+              properties=object.data('properties');
+/*
+          if(properties.isValid!=value && properties.initialized)
+          {
+            properties.isValid=value;
+            if(properties.isValid)
+            {
+              objects.container.removeClass('ui-error');
+              objects.input.removeClass('ui-error');
+            }
+            else
+            {
+              objects.container.addClass('ui-error');
+              objects.input.addClass('ui-error');
+            }
+          }
+*/
+          return(properties.isValid);
+        },
+
+
+      setMode : function (object, value)
+        {
+          var options=object.data('options'),
+              objects=object.data('objects'),
+              properties=object.data('properties');
+
+          if((!properties.initialized || options.mode!=value) && (value==1 || value==2))
+          {
+            options.mode=value;
+            privateMethods.setSelected(object, 'fg');
+            if(options.mode==1)
+            {
+              objects.bg.css('display', 'none');
+              objects.bgopacity.css('display', 'none');
+              objects.fgopacity.removeClass('ui-inputColorsFB-selected');
+              if(options.click==null) objects.fgopacity.removeClass('ui-inputColorsFB-clickable');
+            }
+            else
+            {
+              objects.bg.css('display', 'block');
+              objects.bgopacity.css('display', 'block').addClass('ui-inputColorsFB-clickable');
+              objects.fgopacity.addClass('ui-inputColorsFB-clickable');
+            }
+            privateMethods.updateSizes(object);
+          }
+          return(options.mode);
+        },
+
+      setBoxSize : function (object, value)
+        {
+          var options=object.data('options'),
+              objects=object.data('objects'),
+              properties=object.data('properties');
+
+          if((!properties.initialized || options.boxSize!=value) && (value>0 && value<=1))
+          {
+            options.boxSize=value;
+            privateMethods.updateSizes(object);
+          }
+          return(options.boxSize);
+        },
+
+      setWidth : function (object, value)
+        {
+          var options=object.data('options'),
+              objects=object.data('objects'),
+              properties=object.data('properties');
+
+          if((!properties.initialized || options.width!=value) && value>0)
+          {
+            options.width=value;
+            privateMethods.updateSizes(object);
+          }
+          return(options.width);
+        },
+
+      setHeight : function (object, value)
+        {
+          var options=object.data('options'),
+              objects=object.data('objects'),
+              properties=object.data('properties');
+
+          if((!properties.initialized || options.height!=value) && value>0)
+          {
+            options.height=value;
+            privateMethods.updateSizes(object);
+          }
+          return(options.height);
+        },
+
+      setDisabled : function (object, value)
+        {
+          var options=object.data('options'),
+              objects=object.data('objects'),
+              properties=object.data('properties');
+
+          if((!properties.initialized || options.disabled!=value) && (value==true || value==false))
+          {
+            options.disabled=value;
+            objects.input.attr('disabled', options.disabled);
+          }
+          return(options.disabled);
+        },
+
+      setSelected : function (object, value)
+        {
+          var options=object.data('options'),
+              objects=object.data('objects'),
+              properties=object.data('properties');
+
+          if((!properties.initialized || options.selected!=value) && (value=='fg' || value=='bg') && options.mode==2)
+          {
+            options.selected=value;
+
+            if(options.selected=='fg')
+            {
+              objects.fgopacity.addClass('ui-inputColorsFB-selected');
+              objects.bgopacity.removeClass('ui-inputColorsFB-selected');
+            }
+            else
+            {
+              objects.fgopacity.removeClass('ui-inputColorsFB-selected');
+              objects.bgopacity.addClass('ui-inputColorsFB-selected');
+            }
+            if(options.change) object.trigger('inputColorsFBChange', options.selected);
+          }
+
+          return(options.selected);
+        }, //setFG
+
+      setFG : function (object, value)
+        {
+          var options=object.data('options'),
+              objects=object.data('objects');
+
+          if(value.color==null || value.opacity==null)
+          {
+            return(false);
+          }
+
+          options.fg.color=value.color;
+          options.fg.opacity=value.opacity;
+
+          objects.fg.css(
+            {
+              'background':options.fg.color,
+              'opacity':options.fg.opacity
+            }
+          );
+
+          return(true);
+        }, //setFG
+
+      setBG : function (object, value, apply)
+        {
+          var options=object.data('options'),
+              objects=object.data('objects');
+
+          if(value.color==null || value.opacity==null)
+          {
+            return(false);
+          }
+
+          options.bg.color=value.color;
+          options.bg.opacity=value.opacity;
+
+          objects.bg.css(
+            {
+              'background':options.bg.color,
+              'opacity':options.bg.opacity
+            }
+          );
+
+          return(true);
+        }, //setBG
+
+
+      setEventChange : function (object, value)
+        {
+          var options=object.data('options');
+
+          options.change=value;
+          object.unbind('inputColorsFBChange');
+          if(value) object.bind('inputColorsFBChange', options.change);
+          return(options.change);
+        },
+
+      setEventClick : function (object, value)
+        {
+          var options=object.data('options'),
+              objects=object.data('objects');
+
+          options.click=value;
+          object.unbind('inputColorsFBClick');
+          if(value)
+          {
+            object.bind('inputColorsFBClick', options.click);
+            objects.fgopacity.addClass('ui-inputColorsFB-clickable');
+          }
+          else if(options.mode==1)
+          {
+            objects.fgopacity.removeClass('ui-inputColorsFB-clickable');
+          }
+          return(options.click);
+        },
+
+      updateSizes : function (object)
+        {
+          var options=object.data('options'),
+              objects=object.data('objects'),
+              tmpSize=1;
+
+          if(options.mode==2) tmpSize=options.boxSize;
+
+
+
+          objects.container.css(
+            {
+              'width': options.width+'px',
+              'height': options.height+'px'
+            }
+          );
+          objects.fgopacity.css(
+            {
+              'width': (options.width*tmpSize)+'px',
+              'height': (options.height*tmpSize)+'px'
+            }
+          );
+
+          if(options.mode==2)
+          {
+            objects.bgopacity.css(
+              {
+                'width': (options.width*options.boxSize)+'px',
+                'height': (options.height*options.boxSize)+'px',
+                'margin-left': (options.width*(1-options.boxSize))+'px',
+                'margin-top': (options.height*(1-options.boxSize))+'px'
+              }
+            );
+          }
+        }
+
+    };
+
+
+    $.fn.inputColorsFB = 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.inputColorsFB' );
+      }
+    } // $.fn.inputColorsFB
+
+  }
+)(jQuery);
+
+
Index: /extensions/GrumPluginClasses/js/ui.inputColorsFB.min.js
===================================================================
--- /extensions/GrumPluginClasses/js/ui.inputColorsFB.min.js	(revision 8961)
+++ /extensions/GrumPluginClasses/js/ui.inputColorsFB.min.js	(revision 8961)
@@ -0,0 +1,127 @@
+/* file: ui.inputColorsFB.js - v1.0.0 | minified on 2011/01/27 with http://jscompress.com/ */
+(function($)
+{var publicMethods={init:function(opt)
+{return this.each(function()
+{var $this=$(this),data=$this.data('options'),objects=$this.data('objects'),properties=$this.data('properties'),options={width:0,height:0,disabled:false,fg:{color:'#ffffff',opacity:1},bg:{color:'#000000',opacity:1},selected:'fg',mode:2,boxSize:0.6,change:null,click:null};$this.data('options',options);if(!properties)
+{$this.data('properties',{initialized:false});properties=$this.data('properties');}
+if(!objects)
+{objects={container:$('<div/>',{'class':'ui-inputColorsFB',css:{width:'100%',height:'100%'}}),fg:$('<div/>',{'class':'ui-inputColorsFB-fg'}).bind('click.inputColorsFB',function(event)
+{if(options.mode==2)privateMethods.setSelected($this,'fg');if(options.click)$this.trigger('inputColorsFBClick',{target:'fg',color:options.fg});}),bg:$('<div/>',{'class':'ui-inputColorsFB-bg'}).bind('click.inputColorsFB',function(event)
+{if(options.mode==2)privateMethods.setSelected($this,'bg');if(options.click)$this.trigger('inputColorsFBClick',{target:'bg',color:options.bg});}),fgopacity:$('<div/>',{'class':'ui-inputColorsFB-fgopacity'}),bgopacity:$('<div/>',{'class':'ui-inputColorsFB-bgopacity'})};$this.html('').append(objects.container.append(objects.fgopacity.append(objects.fg)).append(objects.bgopacity.append(objects.bg)));$this.data('objects',objects);}
+privateMethods.setOptions($this,opt);});},destroy:function()
+{return this.each(function()
+{var $this=$(this),objects=$this.data('objects');objects.dot.remove();objects.container.unbind().remove();$this.unbind('.inputColorsFB').css({width:'',height:''});});},options:function(value)
+{return(this.each(function()
+{privateMethods.setOptions($(this),value);}));},disabled:function(value)
+{if(value!=null)
+{return(this.each(function()
+{privateMethods.setDisabled($(this),value);}));}
+else
+{var options=this.data('options');if(options)
+{return(options.disabled);}
+else
+{return('');}}},mode:function(value)
+{if(value!=null)
+{return(this.each(function()
+{privateMethods.setMode($(this),value,true);}));}
+else
+{var options=this.data('options');return(options.mode);}},boxSize:function(value)
+{if(value!=null)
+{return(this.each(function()
+{privateMethods.setBoxSize($(this),value,true);}));}
+else
+{var options=this.data('options');return(options.boxSize);}},width:function(value)
+{if(value!=null)
+{return(this.each(function()
+{privateMethods.setWidth($(this),value,true);}));}
+else
+{var options=this.data('options');return(options.width);}},height:function(value)
+{if(value!=null)
+{return(this.each(function()
+{privateMethods.setHeight($(this),value,true);}));}
+else
+{var options=this.data('options');return(options.height);}},fg:function(value)
+{if(value!=null)
+{return(this.each(function()
+{privateMethods.setFG($(this),value,true);}));}
+else
+{var options=this.data('options');return(options.fg);}},bg:function(value)
+{if(value!=null)
+{return(this.each(function()
+{privateMethods.setBG($(this),value,true);}));}
+else
+{var options=this.data('options');return(options.bg);}},selected:function(value)
+{if(value!=null)
+{return(this.each(function()
+{privateMethods.setSelected($(this),value);}));}
+else
+{var options=this.data('options');return(options.selected);}},isValid:function(value)
+{if(value!=null)
+{return(this.each(function()
+{privateMethods.setIsValid($(this),value);}));}
+else
+{var properties=this.data('properties');return(properties.isValid);}},change:function(value)
+{if(value!=null&&$.isFunction(value))
+{return(this.each(function()
+{privateMethods.setEventChange($(this),value);}));}
+else
+{var options=this.data('options');if(options)
+{return(options.change);}
+else
+{return(null);}}},click:function(value)
+{if(value!=null&&$.isFunction(value))
+{return(this.each(function()
+{privateMethods.setEventClick($(this),value);}));}
+else
+{var options=this.data('options');if(options)
+{return(options.click);}
+else
+{return(null);}}}};var privateMethods={setOptions:function(object,value)
+{var properties=object.data('properties'),options=object.data('options');if(!$.isPlainObject(value))return(false);properties.initialized=false;privateMethods.setMode(object,(value.mode!=null)?value.mode:options.mode);privateMethods.setBoxSize(object,(value.boxSize!=null)?value.boxSize:options.boxSize);privateMethods.setWidth(object,(value.width!=null)?value.width:options.width);privateMethods.setHeight(object,(value.height!=null)?value.height:options.height);privateMethods.setFG(object,(value.fg!=null)?value.fg:options.fg);privateMethods.setBG(object,(value.bg!=null)?value.bg:options.bg);privateMethods.setSelected(object,(value.selected!=null)?value.selected:options.selected,true);privateMethods.setEventChange(object,(value.change!=null)?value.change:options.change);privateMethods.setEventClick(object,(value.click!=null)?value.click:options.click);properties.initialized=true;},setIsValid:function(object,value)
+{var objects=object.data('objects'),properties=object.data('properties');return(properties.isValid);},setMode:function(object,value)
+{var options=object.data('options'),objects=object.data('objects'),properties=object.data('properties');if((!properties.initialized||options.mode!=value)&&(value==1||value==2))
+{options.mode=value;privateMethods.setSelected(object,'fg');if(options.mode==1)
+{objects.bg.css('display','none');objects.bgopacity.css('display','none');objects.fgopacity.removeClass('ui-inputColorsFB-selected');if(options.click==null)objects.fgopacity.removeClass('ui-inputColorsFB-clickable');}
+else
+{objects.bg.css('display','block');objects.bgopacity.css('display','block').addClass('ui-inputColorsFB-clickable');objects.fgopacity.addClass('ui-inputColorsFB-clickable');}
+privateMethods.updateSizes(object);}
+return(options.mode);},setBoxSize:function(object,value)
+{var options=object.data('options'),objects=object.data('objects'),properties=object.data('properties');if((!properties.initialized||options.boxSize!=value)&&(value>0&&value<=1))
+{options.boxSize=value;privateMethods.updateSizes(object);}
+return(options.boxSize);},setWidth:function(object,value)
+{var options=object.data('options'),objects=object.data('objects'),properties=object.data('properties');if((!properties.initialized||options.width!=value)&&value>0)
+{options.width=value;privateMethods.updateSizes(object);}
+return(options.width);},setHeight:function(object,value)
+{var options=object.data('options'),objects=object.data('objects'),properties=object.data('properties');if((!properties.initialized||options.height!=value)&&value>0)
+{options.height=value;privateMethods.updateSizes(object);}
+return(options.height);},setDisabled:function(object,value)
+{var options=object.data('options'),objects=object.data('objects'),properties=object.data('properties');if((!properties.initialized||options.disabled!=value)&&(value==true||value==false))
+{options.disabled=value;objects.input.attr('disabled',options.disabled);}
+return(options.disabled);},setSelected:function(object,value)
+{var options=object.data('options'),objects=object.data('objects'),properties=object.data('properties');if((!properties.initialized||options.selected!=value)&&(value=='fg'||value=='bg')&&options.mode==2)
+{options.selected=value;if(options.selected=='fg')
+{objects.fgopacity.addClass('ui-inputColorsFB-selected');objects.bgopacity.removeClass('ui-inputColorsFB-selected');}
+else
+{objects.fgopacity.removeClass('ui-inputColorsFB-selected');objects.bgopacity.addClass('ui-inputColorsFB-selected');}
+if(options.change)object.trigger('inputColorsFBChange',options.selected);}
+return(options.selected);},setFG:function(object,value)
+{var options=object.data('options'),objects=object.data('objects');if(value.color==null||value.opacity==null)
+{return(false);}
+options.fg.color=value.color;options.fg.opacity=value.opacity;objects.fg.css({'background':options.fg.color,'opacity':options.fg.opacity});return(true);},setBG:function(object,value,apply)
+{var options=object.data('options'),objects=object.data('objects');if(value.color==null||value.opacity==null)
+{return(false);}
+options.bg.color=value.color;options.bg.opacity=value.opacity;objects.bg.css({'background':options.bg.color,'opacity':options.bg.opacity});return(true);},setEventChange:function(object,value)
+{var options=object.data('options');options.change=value;object.unbind('inputColorsFBChange');if(value)object.bind('inputColorsFBChange',options.change);return(options.change);},setEventClick:function(object,value)
+{var options=object.data('options'),objects=object.data('objects');options.click=value;object.unbind('inputColorsFBClick');if(value)
+{object.bind('inputColorsFBClick',options.click);objects.fgopacity.addClass('ui-inputColorsFB-clickable');}
+else if(options.mode==1)
+{objects.fgopacity.removeClass('ui-inputColorsFB-clickable');}
+return(options.click);},updateSizes:function(object)
+{var options=object.data('options'),objects=object.data('objects'),tmpSize=1;if(options.mode==2)tmpSize=options.boxSize;objects.container.css({'width':options.width+'px','height':options.height+'px'});objects.fgopacity.css({'width':(options.width*tmpSize)+'px','height':(options.height*tmpSize)+'px'});if(options.mode==2)
+{objects.bgopacity.css({'width':(options.width*options.boxSize)+'px','height':(options.height*options.boxSize)+'px','margin-left':(options.width*(1-options.boxSize))+'px','margin-top':(options.height*(1-options.boxSize))+'px'});}}};$.fn.inputColorsFB=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.inputColorsFB');}}})(jQuery);
Index: /extensions/GrumPluginClasses/js/ui.inputConsole.js
===================================================================
--- /extensions/GrumPluginClasses/js/ui.inputConsole.js	(revision 8961)
+++ /extensions/GrumPluginClasses/js/ui.inputConsole.js	(revision 8961)
@@ -0,0 +1,677 @@
+/**
+ * -----------------------------------------------------------------------------
+ * file: ui.inputConsole.js
+ * file version: 1.0.0
+ * date: 2010-11-05
+ *
+ * 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 =
+                    {
+                      disabled:false,
+                      prompt:'>',
+                      historySize:8,
+                      historyHeight:60,
+                      change:null,
+                      submit: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,
+                    value:'',
+                    isValid:true,
+                    mouseIsOver:false,
+                    historyIsVisible:false,
+                    inputMargins:0
+                  }
+                );
+                properties=$this.data('properties');
+              }
+
+              if(!objects)
+              {
+                objects =
+                  {
+                    container:$('<div/>',
+                        {
+                          'class':'ui-inputConsole',
+                          css:{
+                            width:'100%'
+                          }
+                        }
+                    ).bind('click.inputConsole',
+                        function ()
+                        {
+                          objects.input.focus();
+                        }
+                      )
+                    .bind('mouseenter',
+                        function ()
+                        {
+                          properties.mouseIsOver=true;
+                        }
+                      )
+                    .bind('mouseleave',
+                        function ()
+                        {
+                          properties.mouseIsOver=false;
+                        }
+                      ),
+                    inputContainer:$('<div/>',
+                      {
+                        'class':'ui-inputConsole-input'
+                      }
+                    ),
+                    input:$('<input>',
+                      {
+                        type:"text",
+                        value:''
+                      }
+                    ).bind('focusout.inputConsole',
+                        function ()
+                        {
+                          privateMethods.lostFocus($this);
+                        }
+                      )
+                      .bind('focus.inputConsole',
+                          function ()
+                          {
+                            privateMethods.getFocus($this);
+                          }
+                        )
+                      .bind('keyup.inputConsole',
+                          function (event)
+                          {
+                            privateMethods.keyUp($this, event);
+                          }
+                        ),
+                    prompt:$('<div/>',
+                      {
+                        html:options.prompt,
+                        'class':'ui-inputConsole-prompt'
+                      }
+                    ),
+                    historyContainer:$('<div/>',
+                      {
+                        'class':'ui-inputConsole-history',
+                        css:{
+                          display:'none'
+                        }
+                      }
+                    ),
+                    historyList:$('<ul/>')
+
+                  };
+
+                $this
+                  .html('')
+                  .append(
+                    objects.container
+                    .append(
+                      objects.historyContainer.append(objects.historyList)
+                    )
+                    .append(
+                      objects.inputContainer.append(objects.prompt).append(objects.input)
+                    )
+                  ).bind('resize.inputConsole',
+                        function ()
+                        {
+                          privateMethods.setObjectsWidth($this);
+                        }
+                      );
+
+                properties.inputMargins=objects.input.outerWidth(true)-objects.input.width();
+
+                $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.input.unbind().remove();
+              objects.container.unbind().remove();
+              $this
+                .unbind('.inputConsole')
+                .css(
+                  {
+                    width:'',
+                    height:''
+                  }
+                );
+            }
+          );
+        }, // destroy
+
+      options: function (value)
+        {
+          return this.each(function()
+            {
+              privateMethods.setOptions($(this), value);
+            }
+          );
+        }, // options
+
+      disabled: function (value)
+        {
+          if(value!=null)
+          {
+            return this.each(function()
+              {
+                privateMethods.setDisabled($(this), value);
+              }
+            );
+          }
+          else
+          {
+            var options = this.data('options');
+
+            if(options)
+            {
+              return(options.disabled);
+            }
+            else
+            {
+              return('');
+            }
+          }
+        }, // disabled
+
+
+      prompt: function (value)
+        {
+          if(value!=null)
+          {
+            return this.each(function()
+              {
+                privateMethods.setPrompt($(this), value);
+              }
+            );
+          }
+          else
+          {
+            var options = this.data('options');
+
+            if(options)
+            {
+              return(options.prompt);
+            }
+            else
+            {
+              return('');
+            }
+          }
+        }, // prompt
+
+      historySize: function (value)
+        {
+          if(value!=null)
+          {
+            return this.each(function()
+              {
+                privateMethods.setHistorySize($(this), value);
+              }
+            );
+          }
+          else
+          {
+            var options = this.data('options');
+
+            if(options)
+            {
+              return(options.historySize);
+            }
+            else
+            {
+              return('');
+            }
+          }
+        }, // historySize
+
+      historyHeight: function (value)
+        {
+          if(value!=null)
+          {
+            return this.each(function()
+              {
+                privateMethods.setHistoryHeight($(this), value);
+              }
+            );
+          }
+          else
+          {
+            var options = this.data('options');
+
+            if(options)
+            {
+              return(options.historyHeight);
+            }
+            else
+            {
+              return('');
+            }
+          }
+        }, // historyHeight
+
+      value: function (value)
+        {
+          if(value!=null)
+          {
+            // set selected value
+            return this.each(function()
+              {
+                privateMethods.setValue($(this), value, true);
+              }
+            );
+          }
+          else
+          {
+            // return the selected tags
+            var properties=this.data('properties');
+            return(properties.value);
+          }
+        }, // value
+
+      history: function (value)
+        {
+          var objects=this.data('objects');
+
+          if(value!=null)
+          {
+            // set selected value
+            return this.each(function()
+              {
+                if(value=='clear')
+                {
+                  objects.historyList.html('');
+                }
+              }
+            );
+          }
+          else
+          {
+            // return the selected tags
+            var returned=[];
+            objects.historyList.children().each(
+              function (index, item)
+              {
+                returned.push($(item).text());
+              }
+            );
+            return(returned);
+          }
+        }, // value
+
+      isValid: function (value)
+        {
+          if(value!=null)
+          {
+            // set selected value
+            return this.each(function()
+              {
+                privateMethods.setIsValid($(this), value);
+              }
+            );
+          }
+          else
+          {
+            // return the selected tags
+            var properties=this.data('properties');
+            return(properties.isValid);
+          }
+        }, // isValid
+
+      change: function (value)
+        {
+          if(value!=null && $.isFunction(value))
+          {
+            // set selected value
+            return this.each(function()
+              {
+                privateMethods.setEventChange($(this), value);
+              }
+            );
+          }
+          else
+          {
+            // return the selected value
+            var options=this.data('options');
+
+            if(options)
+            {
+              return(options.change);
+            }
+            else
+            {
+              return(null);
+            }
+          }
+        }, // change
+
+
+      submit: function (value)
+        {
+          if(value!=null && $.isFunction(value))
+          {
+            // set selected value
+            return this.each(function()
+              {
+                privateMethods.setEventSubmit($(this), value);
+              }
+            );
+          }
+          else
+          {
+            // return the selected value
+            var options=this.data('options');
+
+            if(options)
+            {
+              return(options.submit);
+            }
+            else
+            {
+              return(null);
+            }
+          }
+        } // submit
+
+
+    }; // 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.setHistoryHeight(object, (value.historyHeight!=null)?value.historyHeight:options.historyHeight);
+          privateMethods.setHistorySize(object, (value.historySize!=null)?value.historySize:options.historySize);
+          privateMethods.setPrompt(object, (value.prompt!=null)?value.prompt:options.prompt);
+          privateMethods.setValue(object, (value.value!=null)?value.value:options.value, true);
+          privateMethods.setDisabled(object, (value.disabled!=null)?value.disabled:options.disabled);
+
+          privateMethods.setEventChange(object, (value.change!=null)?value.change:options.change);
+          privateMethods.setEventSubmit(object, (value.submit!=null)?value.submit:options.submit);
+
+          properties.initialized=true;
+        },
+
+      setPrompt: function (object, value)
+        {
+          var objects=object.data('objects'),
+              options=object.data('options'),
+              properties=object.data('properties');
+
+          if(!properties.initialized || options.prompt!=value)
+          {
+            options.prompt=value;
+            objects.prompt.html(options.prompt);
+            privateMethods.setObjectsWidth(object);
+          }
+          return(options.prompt);
+        },
+
+      setHistorySize: function (object, value)
+        {
+          var options=object.data('options'),
+              properties=object.data('properties');
+
+          if(!properties.initialized || options.historySize!=value)
+          {
+            options.historySize=value;
+            privateMethods.updateHistory(object, null);
+          }
+          return(options.historySize);
+        },
+
+      setHistoryHeight: function (object, value)
+        {
+          var objects=object.data('objects'),
+              options=object.data('options'),
+              properties=object.data('properties');
+
+          if(!properties.initialized || options.historyHeight!=value)
+          {
+            options.historyHeight=value;
+            objects.historyContainer.css(
+              {
+                height:options.historyHeight+'px',
+                'margin-top':(-options.historyHeight)+'px'
+              }
+            );
+          }
+          return(options.historyHeight);
+        },
+
+      setIsValid : function (object, value)
+        {
+          var objects=object.data('objects'),
+              properties=object.data('properties');
+
+          if(properties.isValid!=value)
+          {
+            properties.isValid=value;
+            if(properties.isValid)
+            {
+              objects.container.removeClass('ui-error');
+              objects.input.removeClass('ui-error');
+            }
+            else
+            {
+              objects.container.addClass('ui-error');
+              objects.input.addClass('ui-error');
+            }
+          }
+          return(properties.isValid);
+        },
+
+      setDisabled : function (object, value)
+        {
+          var options=object.data('options'),
+              properties=object.data('properties');
+
+          if((!properties.initialized || options.disabled!=value) && (value==true || value==false))
+          {
+            options.disabled=value;
+
+          }
+          return(options.disabled);
+        },
+
+      setValue : function (object, value, apply)
+        {
+          var options=object.data('options'),
+              properties=object.data('properties'),
+              objects=object.data('objects');
+
+          properties.value=value;
+
+          if(apply) objects.input.val(properties.value);
+
+          if(options.change) object.trigger('inputConsoleChange', properties.value);
+
+          return(true);
+        }, //setValue
+
+
+      getFocus : function (object)
+        {
+          var objects=object.data('objects');
+
+          objects.historyContainer.css('display', 'block');
+          privateMethods.setObjectsWidth(object);
+        },
+
+      lostFocus : function (object)
+        {
+          var objects=object.data('objects');
+
+          objects.historyContainer.css('display', 'none');
+        },
+
+      setEventChange : function (object, value)
+        {
+          var options=object.data('options');
+
+          options.change=value;
+          object.unbind('inputConsoleChange');
+          if(value) object.bind('inputConsoleChange', options.change);
+          return(options.change);
+        },
+
+      setEventSubmit : function (object, value)
+        {
+          var options=object.data('options');
+
+          options.submit=value;
+          object.unbind('inputConsoleSubmit');
+          if(value) object.bind('inputConsoleSubmit', options.submit);
+          return(options.submit);
+        },
+
+      keyUp : function (object, event)
+        {
+          var properties=object.data('properties'),
+              options=object.data('options'),
+              objects=object.data('objects');
+
+          if(event.keyCode==13 && // DOM_VK_ENTER
+             properties.isValid)
+          {
+            if(options.submit) object.trigger('inputConsoleSubmit', properties.value);
+            privateMethods.updateHistory(object, properties.value);
+            privateMethods.setValue(object, '', true);
+          }
+          else
+          {
+            privateMethods.setValue(object, objects.input.val(), false);
+          }
+        },
+
+      updateHistory : function (object, item)
+        {
+          var options=object.data('options'),
+              objects=object.data('objects');
+
+          if(item!='' && item!=null) objects.historyList.append($('<li/>', { html: item }));
+
+          while(objects.historyList.children().length>options.historySize)
+          {
+            objects.historyList.children(':first').remove();
+          }
+          objects.historyContainer.scrollTop(objects.historyList.height());
+        },
+
+      setObjectsWidth : function (object)
+        {
+          var objects=object.data('objects')
+              properties=object.data('properties');
+
+          if(objects.inputContainer.width()>0)
+          {
+            objects.input.css('width',
+              (objects.inputContainer.innerWidth()-objects.prompt.outerWidth(true)-properties.inputMargins)+'px'
+            );
+            objects.historyContainer.css(
+              {
+                width:objects.inputContainer.innerWidth()+'px',
+                'margin-left':((objects.historyContainer.width()-objects.historyContainer.outerWidth())/2)+'px'
+              }
+            );
+          }
+        }
+
+    };
+
+
+    $.fn.inputConsole = 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.inputConsole' );
+      }
+    } // $.fn.inputConsole
+
+  }
+)(jQuery);
+
+
Index: /extensions/GrumPluginClasses/js/ui.inputConsole.min.js
===================================================================
--- /extensions/GrumPluginClasses/js/ui.inputConsole.min.js	(revision 8961)
+++ /extensions/GrumPluginClasses/js/ui.inputConsole.min.js	(revision 8961)
@@ -0,0 +1,125 @@
+/* file: ui.inputColorsFB.js - v1.0.0 | minified on 2011/01/27 with http://jscompress.com/ */
+(function($)
+{var publicMethods={init:function(opt)
+{return this.each(function()
+{var $this=$(this),data=$this.data('options'),objects=$this.data('objects'),properties=$this.data('properties'),options={disabled:false,prompt:'>',historySize:8,historyHeight:60,change:null,submit:null};$this.data('options',options);if(!properties)
+{$this.data('properties',{initialized:false,value:'',isValid:true,mouseIsOver:false,historyIsVisible:false,inputMargins:0});properties=$this.data('properties');}
+if(!objects)
+{objects={container:$('<div/>',{'class':'ui-inputConsole',css:{width:'100%'}}).bind('click.inputConsole',function()
+{objects.input.focus();}).bind('mouseenter',function()
+{properties.mouseIsOver=true;}).bind('mouseleave',function()
+{properties.mouseIsOver=false;}),inputContainer:$('<div/>',{'class':'ui-inputConsole-input'}),input:$('<input>',{type:"text",value:''}).bind('focusout.inputConsole',function()
+{privateMethods.lostFocus($this);}).bind('focus.inputConsole',function()
+{privateMethods.getFocus($this);}).bind('keyup.inputConsole',function(event)
+{privateMethods.keyUp($this,event);}),prompt:$('<div/>',{html:options.prompt,'class':'ui-inputConsole-prompt'}),historyContainer:$('<div/>',{'class':'ui-inputConsole-history',css:{display:'none'}}),historyList:$('<ul/>')};$this.html('').append(objects.container.append(objects.historyContainer.append(objects.historyList)).append(objects.inputContainer.append(objects.prompt).append(objects.input))).bind('resize.inputConsole',function()
+{privateMethods.setObjectsWidth($this);});properties.inputMargins=objects.input.outerWidth(true)-objects.input.width();$this.data('objects',objects);}
+privateMethods.setOptions($this,opt);});},destroy:function()
+{return this.each(function()
+{var $this=$(this),objects=$this.data('objects');objects.input.unbind().remove();objects.container.unbind().remove();$this.unbind('.inputConsole').css({width:'',height:''});});},options:function(value)
+{return this.each(function()
+{privateMethods.setOptions($(this),value);});},disabled:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setDisabled($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.disabled);}
+else
+{return('');}}},prompt:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setPrompt($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.prompt);}
+else
+{return('');}}},historySize:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setHistorySize($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.historySize);}
+else
+{return('');}}},historyHeight:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setHistoryHeight($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.historyHeight);}
+else
+{return('');}}},value:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setValue($(this),value,true);});}
+else
+{var properties=this.data('properties');return(properties.value);}},history:function(value)
+{var objects=this.data('objects');if(value!=null)
+{return this.each(function()
+{if(value=='clear')
+{objects.historyList.html('');}});}
+else
+{var returned=[];objects.historyList.children().each(function(index,item)
+{returned.push($(item).text());});return(returned);}},isValid:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setIsValid($(this),value);});}
+else
+{var properties=this.data('properties');return(properties.isValid);}},change:function(value)
+{if(value!=null&&$.isFunction(value))
+{return this.each(function()
+{privateMethods.setEventChange($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.change);}
+else
+{return(null);}}},submit:function(value)
+{if(value!=null&&$.isFunction(value))
+{return this.each(function()
+{privateMethods.setEventSubmit($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.submit);}
+else
+{return(null);}}}};var privateMethods={setOptions:function(object,value)
+{var properties=object.data('properties'),options=object.data('options');if(!$.isPlainObject(value))return(false);properties.initialized=false;privateMethods.setHistoryHeight(object,(value.historyHeight!=null)?value.historyHeight:options.historyHeight);privateMethods.setHistorySize(object,(value.historySize!=null)?value.historySize:options.historySize);privateMethods.setPrompt(object,(value.prompt!=null)?value.prompt:options.prompt);privateMethods.setValue(object,(value.value!=null)?value.value:options.value,true);privateMethods.setDisabled(object,(value.disabled!=null)?value.disabled:options.disabled);privateMethods.setEventChange(object,(value.change!=null)?value.change:options.change);privateMethods.setEventSubmit(object,(value.submit!=null)?value.submit:options.submit);properties.initialized=true;},setPrompt:function(object,value)
+{var objects=object.data('objects'),options=object.data('options'),properties=object.data('properties');if(!properties.initialized||options.prompt!=value)
+{options.prompt=value;objects.prompt.html(options.prompt);privateMethods.setObjectsWidth(object);}
+return(options.prompt);},setHistorySize:function(object,value)
+{var options=object.data('options'),properties=object.data('properties');if(!properties.initialized||options.historySize!=value)
+{options.historySize=value;privateMethods.updateHistory(object,null);}
+return(options.historySize);},setHistoryHeight:function(object,value)
+{var objects=object.data('objects'),options=object.data('options'),properties=object.data('properties');if(!properties.initialized||options.historyHeight!=value)
+{options.historyHeight=value;objects.historyContainer.css({height:options.historyHeight+'px','margin-top':(-options.historyHeight)+'px'});}
+return(options.historyHeight);},setIsValid:function(object,value)
+{var objects=object.data('objects'),properties=object.data('properties');if(properties.isValid!=value)
+{properties.isValid=value;if(properties.isValid)
+{objects.container.removeClass('ui-error');objects.input.removeClass('ui-error');}
+else
+{objects.container.addClass('ui-error');objects.input.addClass('ui-error');}}
+return(properties.isValid);},setDisabled:function(object,value)
+{var options=object.data('options'),properties=object.data('properties');if((!properties.initialized||options.disabled!=value)&&(value==true||value==false))
+{options.disabled=value;}
+return(options.disabled);},setValue:function(object,value,apply)
+{var options=object.data('options'),properties=object.data('properties'),objects=object.data('objects');properties.value=value;if(apply)objects.input.val(properties.value);if(options.change)object.trigger('inputConsoleChange',properties.value);return(true);},getFocus:function(object)
+{var objects=object.data('objects');objects.historyContainer.css('display','block');privateMethods.setObjectsWidth(object);},lostFocus:function(object)
+{var objects=object.data('objects');objects.historyContainer.css('display','none');},setEventChange:function(object,value)
+{var options=object.data('options');options.change=value;object.unbind('inputConsoleChange');if(value)object.bind('inputConsoleChange',options.change);return(options.change);},setEventSubmit:function(object,value)
+{var options=object.data('options');options.submit=value;object.unbind('inputConsoleSubmit');if(value)object.bind('inputConsoleSubmit',options.submit);return(options.submit);},keyUp:function(object,event)
+{var properties=object.data('properties'),options=object.data('options'),objects=object.data('objects');if(event.keyCode==13&&properties.isValid)
+{if(options.submit)object.trigger('inputConsoleSubmit',properties.value);privateMethods.updateHistory(object,properties.value);privateMethods.setValue(object,'',true);}
+else
+{privateMethods.setValue(object,objects.input.val(),false);}},updateHistory:function(object,item)
+{var options=object.data('options'),objects=object.data('objects');if(item!=''&&item!=null)objects.historyList.append($('<li/>',{html:item}));while(objects.historyList.children().length>options.historySize)
+{objects.historyList.children(':first').remove();}
+objects.historyContainer.scrollTop(objects.historyList.height());},setObjectsWidth:function(object)
+{var objects=object.data('objects')
+properties=object.data('properties');if(objects.inputContainer.width()>0)
+{objects.input.css('width',(objects.inputContainer.innerWidth()-objects.prompt.outerWidth(true)-properties.inputMargins)+'px');objects.historyContainer.css({width:objects.inputContainer.innerWidth()+'px','margin-left':((objects.historyContainer.width()-objects.historyContainer.outerWidth())/2)+'px'});}}};$.fn.inputConsole=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.inputConsole');}}})(jQuery);
Index: /extensions/GrumPluginClasses/js/ui.inputDotArea.js
===================================================================
--- /extensions/GrumPluginClasses/js/ui.inputDotArea.js	(revision 8961)
+++ /extensions/GrumPluginClasses/js/ui.inputDotArea.js	(revision 8961)
@@ -0,0 +1,577 @@
+/**
+ * -----------------------------------------------------------------------------
+ * file: ui.inputDotArea.js
+ * file version: 1.0.0
+ * date: 2010-11-04
+ *
+ * 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/11/04 | 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 =
+                    {
+                      range:
+                        {
+                          x:[0,100],
+                          y:[0,100]
+                        },
+                      width:0,
+                      height:0,
+                      disabled:false,
+                      change: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,
+                    values:
+                      {
+                        x:50,
+                        y:50
+                      },
+                    isValid:true,
+                    mouseIsDown:false
+                  }
+                );
+                properties=$this.data('properties');
+              }
+
+              if(!objects)
+              {
+                objects =
+                  {
+                    container:$('<div/>',
+                        {
+                          'class':'ui-inputDotArea',
+                          css:{
+                            width:'100%',
+                            height:'100%'
+                          }
+                        }
+                    )
+                    .bind('mousedown.inputDotArea',
+                        function (event)
+                        {
+                          privateMethods.mouseDown($this, event);
+                        }
+                      )
+                     .bind('mouseup.inputDotArea',
+                       function (event)
+                       {
+                         privateMethods.mouseUp($this, event);
+                       }
+                     )
+                     .bind('mousemove.inputDotArea',
+                        function (event)
+                        {
+                          privateMethods.mouseMove($this, event);
+                        }
+                      ),
+                    dot:$('<div/>',
+                      {
+                        'class':'ui-inputDotArea-dot'
+                      }
+                    )
+
+                  };
+
+                $this
+                  .html('')
+                  .append(objects.container.append(objects.dot));
+
+                $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.dot.remove();
+              objects.container.unbind().remove();
+              $this
+                .unbind('.inputDotArea')
+                .css(
+                  {
+                    width:'',
+                    height:''
+                  }
+                );
+            }
+          );
+        }, // destroy
+
+      options: function (value)
+        {
+          return(
+            this.each(
+              function()
+              {
+                privateMethods.setOptions($(this), value);
+              }
+            )
+          );
+        }, // options
+
+      disabled: function (value)
+        {
+          if(value!=null)
+          {
+            return(
+              this.each(
+                function()
+                {
+                  privateMethods.setDisabled($(this), value);
+                }
+              )
+            );
+          }
+          else
+          {
+            var options = this.data('options');
+
+            if(options)
+            {
+              return(options.disabled);
+            }
+            else
+            {
+              return('');
+            }
+          }
+        }, // disabled
+
+      width: function (value)
+        {
+          if(value!=null)
+          {
+            return(
+              this.each(
+                function()
+                {
+                  privateMethods.setWidth($(this), value, true);
+                }
+              )
+            );
+          }
+          else
+          {
+            var options=this.data('options');
+            return(options.width);
+          }
+        }, // width
+
+      height: function (value)
+        {
+          if(value!=null)
+          {
+            return(
+              this.each(
+                function()
+                {
+                  privateMethods.setHeight($(this), value, true);
+                }
+              )
+            );
+          }
+          else
+          {
+            var options=this.data('options');
+            return(options.height);
+          }
+        }, // height
+
+      range: function (value)
+        {
+          if(value!=null)
+          {
+            return(
+              this.each(
+                function()
+                {
+                  privateMethods.setRange($(this), value, true);
+                }
+              )
+            );
+          }
+          else
+          {
+            var options=this.data('options');
+            return(options.range);
+          }
+        }, // value
+
+      values: function (value)
+        {
+          if(value!=null)
+          {
+            // set selected value
+            return(
+              this.each(
+                function()
+                {
+                  privateMethods.setValues($(this), value, true);
+                }
+              )
+            );
+          }
+          else
+          {
+            // return the selected tags
+            var properties=this.data('properties');
+            return(properties.values);
+          }
+        }, // value
+
+      isValid: function (value)
+        {
+          if(value!=null)
+          {
+            // set selected value
+            return(
+              this.each(
+                function()
+                {
+                  privateMethods.setIsValid($(this), value);
+                }
+              )
+            );
+          }
+          else
+          {
+            // return the selected tags
+            var properties=this.data('properties');
+            return(properties.isValid);
+          }
+        }, // isValid
+
+      change: function (value)
+        {
+          if(value!=null && $.isFunction(value))
+          {
+            // set selected value
+            return(
+              this.each(
+                function()
+                {
+                  privateMethods.setEventChange($(this), value);
+                }
+              )
+            );
+          }
+          else
+          {
+            // return the selected value
+            var options=this.data('options');
+
+            if(options)
+            {
+              return(options.change);
+            }
+            else
+            {
+              return(null);
+            }
+          }
+        } // change
+
+    }; // 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.setWidth(object, (value.width!=null)?value.width:options.width);
+          privateMethods.setHeight(object, (value.height!=null)?value.height:options.height);
+          privateMethods.setRange(object, (value.range!=null)?value.range:options.range);
+          privateMethods.setValues(object, (value.values!=null)?value.values:properties.values, true);
+
+          privateMethods.setEventChange(object, (value.change!=null)?value.change:options.change);
+
+          properties.initialized=true;
+        },
+
+      setIsValid : function (object, value)
+        {
+          var objects=object.data('objects'),
+              properties=object.data('properties');
+/*
+          if(properties.isValid!=value && properties.initialized)
+          {
+            properties.isValid=value;
+            if(properties.isValid)
+            {
+              objects.container.removeClass('ui-error');
+              objects.input.removeClass('ui-error');
+            }
+            else
+            {
+              objects.container.addClass('ui-error');
+              objects.input.addClass('ui-error');
+            }
+          }
+*/
+          return(properties.isValid);
+        },
+
+
+      setWidth : function (object, value)
+        {
+          var options=object.data('options'),
+              objects=object.data('objects'),
+              properties=object.data('properties');
+
+          if((!properties.initialized || options.width!=value) && value>0)
+          {
+            options.width=value;
+            objects.container.css('width', options.width+'px');
+          }
+          return(options.width);
+        },
+
+      setHeight : function (object, value)
+        {
+          var options=object.data('options'),
+              objects=object.data('objects'),
+              properties=object.data('properties');
+
+          if((!properties.initialized || options.height!=value) && value>0)
+          {
+            options.height=value;
+            objects.container.css('height', options.height+'px');
+          }
+          return(options.height);
+        },
+
+      setDisabled : function (object, value)
+        {
+          var options=object.data('options'),
+              objects=object.data('objects'),
+              properties=object.data('properties');
+
+          if((!properties.initialized || options.disabled!=value) && (value==true || value==false))
+          {
+            options.disabled=value;
+            objects.input.attr('disabled', options.disabled);
+          }
+          return(options.disabled);
+        },
+
+
+      setRange : function (object, value)
+        {
+          var options=object.data('options'),
+              properties=object.data('properties'),
+              objects=object.data('objects');
+
+          if(value.x==false || ($.isArray(value.x) && value.x[0]<=value.x[1]))
+          {
+            options.range.x=value.x;
+          }
+
+          if(value.y==false || ($.isArray(value.y) && value.y[0]<=value.y[1]))
+          {
+            options.range.y=value.y;
+          }
+
+          return(options.range);
+        }, //setValue
+
+
+      setValues : function (object, value, apply)
+        {
+          var options=object.data('options'),
+              properties=object.data('properties'),
+              objects=object.data('objects'),
+              tmp={x:'', y:''};
+
+          if(!(
+               (value.x==null || (value.x!=null && options.range.x[0]<=value.x && value.x<=options.range.x[1])) &&
+               (value.y==null || (value.y!=null && options.range.y[0]<=value.y && value.y<=options.range.y[1])) &&
+               !(value.x==null && value.y==null)
+              )
+            )
+          {
+            return(false);
+          }
+
+          if(value.x!=null) properties.values.x=value.x;
+          if(value.y!=null) properties.values.y=value.y;
+
+          if(apply)
+          {
+            if(options.range.x==false)
+            {
+              tmp.x=options.width/2;
+            }
+            else
+            {
+              tmp.x=properties.values.x*options.width/(options.range.x[1]-options.range.x[0])+options.range.x[0];
+            }
+            tmp.x-=6;
+
+            if(options.range.y==false)
+            {
+              tmp.y=options.height/2;
+            }
+            else
+            {
+              tmp.y=properties.values.y*options.height/(options.range.y[1]-options.range.y[0])+options.range.y[0];
+            }
+            tmp.y-=6;
+
+            objects.dot.css(
+              {
+                top:tmp.y+'px',
+                left:tmp.x+'px'
+              }
+            );
+          }
+
+          if(options.change) object.trigger('inputDotAreaChange', properties.values);
+
+          return(true);
+        }, //setValue
+
+      setEventChange : function (object, value)
+        {
+          var options=object.data('options');
+
+          options.change=value;
+          object.unbind('inputDotAreaChange');
+          if(value) object.bind('inputDotAreaChange', options.change);
+          return(options.change);
+        },
+
+      mouseDown : function (object, event)
+        {
+          var properties=object.data('properties');
+
+          properties.mouseIsDown=true;
+          privateMethods.mouseMove(object, event);
+        },
+
+      mouseUp : function (object, event)
+        {
+          var properties=object.data('properties');
+
+          properties.mouseIsDown=false;
+        },
+
+      mouseMove : function (object, event)
+        {
+          var properties=object.data('properties'),
+              objects=object.data('objects'),
+              options=object.data('options'),
+              values={};
+
+          if(properties.mouseIsDown)
+          {
+            event.layerX=event.pageX-objects.container.offset().left;
+            event.layerY=event.pageY-objects.container.offset().top;
+
+            if(options.range.x!=false)
+            {
+              values.x=options.range.x[0]+event.layerX*(options.range.x[1]-options.range.x[0])/options.width;
+            }
+            if(options.range.y!=false)
+            {
+              values.y=options.range.y[0]+event.layerY*(options.range.y[1]-options.range.y[0])/options.height;
+            }
+
+            privateMethods.setValues(object, values, true);
+          }
+        }
+
+
+    };
+
+
+    $.fn.inputDotArea = 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.inputDotArea' );
+      }
+    } // $.fn.inputDotArea
+
+  }
+)(jQuery);
+
+
Index: /extensions/GrumPluginClasses/js/ui.inputDotArea.min.js
===================================================================
--- /extensions/GrumPluginClasses/js/ui.inputDotArea.min.js	(revision 8961)
+++ /extensions/GrumPluginClasses/js/ui.inputDotArea.min.js	(revision 8961)
@@ -0,0 +1,101 @@
+/* file: ui.inputDotArea.js - v1.0.0 | minified on 2011/01/27 with http://jscompress.com/ */
+(function($)
+{var publicMethods={init:function(opt)
+{return this.each(function()
+{var $this=$(this),data=$this.data('options'),objects=$this.data('objects'),properties=$this.data('properties'),options={range:{x:[0,100],y:[0,100]},width:0,height:0,disabled:false,change:null};$this.data('options',options);if(!properties)
+{$this.data('properties',{initialized:false,values:{x:50,y:50},isValid:true,mouseIsDown:false});properties=$this.data('properties');}
+if(!objects)
+{objects={container:$('<div/>',{'class':'ui-inputDotArea',css:{width:'100%',height:'100%'}}).bind('mousedown.inputDotArea',function(event)
+{privateMethods.mouseDown($this,event);}).bind('mouseup.inputDotArea',function(event)
+{privateMethods.mouseUp($this,event);}).bind('mousemove.inputDotArea',function(event)
+{privateMethods.mouseMove($this,event);}),dot:$('<div/>',{'class':'ui-inputDotArea-dot'})};$this.html('').append(objects.container.append(objects.dot));$this.data('objects',objects);}
+privateMethods.setOptions($this,opt);});},destroy:function()
+{return this.each(function()
+{var $this=$(this),objects=$this.data('objects');objects.dot.remove();objects.container.unbind().remove();$this.unbind('.inputDotArea').css({width:'',height:''});});},options:function(value)
+{return(this.each(function()
+{privateMethods.setOptions($(this),value);}));},disabled:function(value)
+{if(value!=null)
+{return(this.each(function()
+{privateMethods.setDisabled($(this),value);}));}
+else
+{var options=this.data('options');if(options)
+{return(options.disabled);}
+else
+{return('');}}},width:function(value)
+{if(value!=null)
+{return(this.each(function()
+{privateMethods.setWidth($(this),value,true);}));}
+else
+{var options=this.data('options');return(options.width);}},height:function(value)
+{if(value!=null)
+{return(this.each(function()
+{privateMethods.setHeight($(this),value,true);}));}
+else
+{var options=this.data('options');return(options.height);}},range:function(value)
+{if(value!=null)
+{return(this.each(function()
+{privateMethods.setRange($(this),value,true);}));}
+else
+{var options=this.data('options');return(options.range);}},values:function(value)
+{if(value!=null)
+{return(this.each(function()
+{privateMethods.setValues($(this),value,true);}));}
+else
+{var properties=this.data('properties');return(properties.values);}},isValid:function(value)
+{if(value!=null)
+{return(this.each(function()
+{privateMethods.setIsValid($(this),value);}));}
+else
+{var properties=this.data('properties');return(properties.isValid);}},change:function(value)
+{if(value!=null&&$.isFunction(value))
+{return(this.each(function()
+{privateMethods.setEventChange($(this),value);}));}
+else
+{var options=this.data('options');if(options)
+{return(options.change);}
+else
+{return(null);}}}};var privateMethods={setOptions:function(object,value)
+{var properties=object.data('properties'),options=object.data('options');if(!$.isPlainObject(value))return(false);properties.initialized=false;privateMethods.setWidth(object,(value.width!=null)?value.width:options.width);privateMethods.setHeight(object,(value.height!=null)?value.height:options.height);privateMethods.setRange(object,(value.range!=null)?value.range:options.range);privateMethods.setValues(object,(value.values!=null)?value.values:properties.values,true);privateMethods.setEventChange(object,(value.change!=null)?value.change:options.change);properties.initialized=true;},setIsValid:function(object,value)
+{var objects=object.data('objects'),properties=object.data('properties');return(properties.isValid);},setWidth:function(object,value)
+{var options=object.data('options'),objects=object.data('objects'),properties=object.data('properties');if((!properties.initialized||options.width!=value)&&value>0)
+{options.width=value;objects.container.css('width',options.width+'px');}
+return(options.width);},setHeight:function(object,value)
+{var options=object.data('options'),objects=object.data('objects'),properties=object.data('properties');if((!properties.initialized||options.height!=value)&&value>0)
+{options.height=value;objects.container.css('height',options.height+'px');}
+return(options.height);},setDisabled:function(object,value)
+{var options=object.data('options'),objects=object.data('objects'),properties=object.data('properties');if((!properties.initialized||options.disabled!=value)&&(value==true||value==false))
+{options.disabled=value;objects.input.attr('disabled',options.disabled);}
+return(options.disabled);},setRange:function(object,value)
+{var options=object.data('options'),properties=object.data('properties'),objects=object.data('objects');if(value.x==false||($.isArray(value.x)&&value.x[0]<=value.x[1]))
+{options.range.x=value.x;}
+if(value.y==false||($.isArray(value.y)&&value.y[0]<=value.y[1]))
+{options.range.y=value.y;}
+return(options.range);},setValues:function(object,value,apply)
+{var options=object.data('options'),properties=object.data('properties'),objects=object.data('objects'),tmp={x:'',y:''};if(!((value.x==null||(value.x!=null&&options.range.x[0]<=value.x&&value.x<=options.range.x[1]))&&(value.y==null||(value.y!=null&&options.range.y[0]<=value.y&&value.y<=options.range.y[1]))&&!(value.x==null&&value.y==null)))
+{return(false);}
+if(value.x!=null)properties.values.x=value.x;if(value.y!=null)properties.values.y=value.y;if(apply)
+{if(options.range.x==false)
+{tmp.x=options.width/2;}
+else
+{tmp.x=properties.values.x*options.width/(options.range.x[1]-options.range.x[0])+options.range.x[0];}
+tmp.x-=6;if(options.range.y==false)
+{tmp.y=options.height/2;}
+else
+{tmp.y=properties.values.y*options.height/(options.range.y[1]-options.range.y[0])+options.range.y[0];}
+tmp.y-=6;objects.dot.css({top:tmp.y+'px',left:tmp.x+'px'});}
+if(options.change)object.trigger('inputDotAreaChange',properties.values);return(true);},setEventChange:function(object,value)
+{var options=object.data('options');options.change=value;object.unbind('inputDotAreaChange');if(value)object.bind('inputDotAreaChange',options.change);return(options.change);},mouseDown:function(object,event)
+{var properties=object.data('properties');properties.mouseIsDown=true;privateMethods.mouseMove(object,event);},mouseUp:function(object,event)
+{var properties=object.data('properties');properties.mouseIsDown=false;},mouseMove:function(object,event)
+{var properties=object.data('properties'),objects=object.data('objects'),options=object.data('options'),values={};if(properties.mouseIsDown)
+{event.layerX=event.pageX-objects.container.offset().left;event.layerY=event.pageY-objects.container.offset().top;if(options.range.x!=false)
+{values.x=options.range.x[0]+event.layerX*(options.range.x[1]-options.range.x[0])/options.width;}
+if(options.range.y!=false)
+{values.y=options.range.y[0]+event.layerY*(options.range.y[1]-options.range.y[0])/options.height;}
+privateMethods.setValues(object,values,true);}}};$.fn.inputDotArea=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.inputDotArea');}}})(jQuery);
Index: /extensions/GrumPluginClasses/js/ui.inputList.js
===================================================================
--- /extensions/GrumPluginClasses/js/ui.inputList.js	(revision 8961)
+++ /extensions/GrumPluginClasses/js/ui.inputList.js	(revision 8961)
@@ -0,0 +1,1567 @@
+/**
+ * -----------------------------------------------------------------------------
+ * file: ui.inputList.js
+ * file version: 1.0.0
+ * date: 2010-11-02
+ *
+ * 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 =
+                    {
+                      serverUrl:'',
+                      autoLoad:true,
+                      listMaxWidth:0,
+                      listMaxHeight:0,
+                      multiple:false,
+                      downArrow:'&dArr;',
+                      popupMode:'click',
+                      colsWidth:[],
+                      colsDisplayed:[],
+                      colsCss:[],
+                      disabled:false,
+                      popup:null,
+                      change:null,
+                      load:null,
+                      returnMode:'selected'
+                    };
+
+              // if options given, merge it
+              // if(opt) $.extend(options, opt); ==> options are set by setters
+
+              $this.data('options', options);
+
+              if(!properties)
+              {
+                $this.data('properties',
+                  {
+                    index:-1,
+                    initialized:false,
+                    selectorVisible:false,
+                    items:[],
+                    mouseOver:false,
+                    isValid:true,
+                    firstPopup:true
+                  }
+                );
+                properties=$this.data('properties');
+              }
+
+              if(!objects)
+              {
+                objects =
+                  {
+                    container:$('<div/>',
+                        {
+                          'class':'ui-inputList',
+                          tabindex:0,
+                          css:{
+                            width:'100%'
+                          }
+                        }
+                    ).bind('click.inputList',
+                        function ()
+                        {
+                          privateMethods.displaySelector($this, !$this.data('properties').selectorVisible);
+                          $(this).focus();
+                        }
+                      ),
+                    containerValue:$('<div/>',
+                      {
+                        html: '&nbsp;',
+                        'class':'ui-inputList-value',
+                        css:{
+                          overflow:'hidden'
+                        }
+                      }
+                    ),
+                    containerList:null,
+                    containerArrow:$('<div/>',
+                      {
+                        html: '&dArr;',
+                        'class':'ui-inputList-arrow',
+                        css: {
+                          'float':'right',
+                          cursor:'pointer'
+                        }
+                      }
+                    ).bind('mousedown',
+                        function ()
+                        {
+                          $(this).addClass('ui-inputList-arrow-active');
+                        }
+                    ).bind('mouseup',
+                        function ()
+                        {
+                          $(this).removeClass('ui-inputList-arrow-active');
+                        }
+                    ),
+                    listContainer:$('<div/>',
+                        {
+                          html: "",
+                          'class':'ui-inputList-list',
+                          css: {
+                            overflow:"auto",
+                            display:'none',
+                            position:'absolute'
+                          }
+                        }
+                    ),
+                    list:$('<ul/>',
+                      {
+                        css: {
+                          listStyle:'none',
+                          padding:'0px',
+                          margin:'0px'
+                        }
+                      }
+                    )
+                  };
+              }
+
+              $this.data('objects', objects);
+              privateMethods.setOptions($this, opt);
+
+              if($this.text()!='') 
+              {
+                var tmp=$.parseJSON($.trim($this.text())),
+                    selectedValues=[],
+                    values=[];
+
+                if($.isArray(tmp))
+                {
+                  values=tmp;
+                }
+                else if(tmp.values!=null)
+                {
+                  values=tmp.values;
+                }
+                
+                if(tmp.selected!=null) selectedValues=tmp.selected;
+                
+                privateMethods.setItems($this, values); 
+                privateMethods.setValue($this, selectedValues); 
+                
+              }
+
+              $this
+                .html('')
+                .append(objects.container.append(objects.containerArrow).append(objects.containerValue))
+                .append(objects.listContainer.append(objects.list));
+
+            }
+          );
+        }, // init
+      destroy : function ()
+        {
+          return this.each(
+            function()
+            {
+              // default values for the plugin
+              var $this=$(this),
+                  objects = $this.data('objects');
+              objects.container.unbind().remove();
+              objects.list.children().unbind();
+              objects.listContainer.remove();
+              $this
+                .unbind('.inputList')
+                .css(
+                  {
+                    width:'',
+                    height:''
+                  }
+                );
+            }
+          );
+        }, // destroy
+
+      options: function (value)
+        {
+          return this.each(function()
+            {
+              privateMethods.setOptions($(this), value);
+            }
+          );
+        }, // autoLoad
+
+      autoLoad: function (value)
+        {
+          if(value!=null)
+          {
+            return this.each(function()
+              {
+                privateMethods.setAutoLoad($(this), value);
+              }
+            );
+          }
+          else
+          {
+            var options = this.data('options');
+
+            if(options)
+            {
+              return(options.autoLoad);
+            }
+            else
+            {
+              return(true);
+            }
+          }
+        }, // autoLoad
+
+      listMaxWidth: function (value)
+        {
+          if(value!=null)
+          {
+            return this.each(function()
+              {
+                privateMethods.setListMaxWidth($(this), value);
+              }
+            );
+          }
+          else
+          {
+            var options = this.data('options');
+
+            if(options)
+            {
+              return(options.listMaxWidth);
+            }
+            else
+            {
+              return(0);
+            }
+          }
+        }, // listMaxWidth
+
+      listMaxHeight: function (value)
+        {
+          if(value!=null)
+          {
+            return this.each(function()
+              {
+                privateMethods.setListMaxHeight($(this), value);
+              }
+            );
+          }
+          else
+          {
+            var options = this.data('options');
+
+            if(options)
+            {
+              return(options.listMaxHeight);
+            }
+            else
+            {
+              return(0);
+            }
+          }
+        }, // listMaxHeight
+
+      serverUrl: function (value)
+        {
+          if(value!=null)
+          {
+            return this.each(function()
+              {
+                privateMethods.setServerUrl($(this), value);
+              }
+            );
+          }
+          else
+          {
+            var options = this.data('options');
+
+            if(options)
+            {
+              return(options.serverUrl);
+            }
+            else
+            {
+              return('');
+            }
+          }
+        }, // serverUrl
+
+      cols: function ()
+        {
+          var options=this.data('options'),
+              properties=this.data('properties');
+
+          if(!options.multiple)
+          {
+            return(properties.items[properties.index].cols);
+          }
+          else
+          {
+            var listCols=[];
+            for(var i=0;i<properties.index.length;i++)
+            {
+              listCols.push(properties.items[properties.index[i]].cols);
+            }
+            return(listCols);
+          }
+        }, // name
+
+      popupMode: function (value)
+        {
+          if(value!=null)
+          {
+            return this.each(function()
+              {
+                privateMethods.setPopupMode($(this), value);
+              }
+            );
+          }
+          else
+          {
+            var options = this.data('options');
+
+            if(options)
+            {
+              return(options.popupMode);
+            }
+            else
+            {
+              return(0);
+            }
+          }
+        }, // popupMode
+
+      downArrow: function (value)
+        {
+          if(value!=null)
+          {
+            return this.each(function()
+              {
+                privateMethods.setDownArrow($(this), value);
+              }
+            );
+          }
+          else
+          {
+            var options = this.data('options');
+
+            if(options)
+            {
+              return(options.downArrow);
+            }
+            else
+            {
+              return('');
+            }
+          }
+        }, // downArrow
+
+
+      returnMode: function (value)
+        {
+          if(value!=null)
+          {
+            return this.each(function()
+              {
+                privateMethods.setReturnMode($(this), value);
+              }
+            );
+          }
+          else
+          {
+            var options = this.data('options');
+
+            if(options)
+            {
+              return(options.returnMode);
+            }
+            else
+            {
+              return('selected');
+            }
+          }
+        }, // returnMode
+
+      colsWidth: function (value)
+        {
+          if(value!=null)
+          {
+            return this.each(function()
+              {
+                privateMethods.setColsWidth($(this), value);
+              }
+            );
+          }
+          else
+          {
+            var options = this.data('options');
+
+            if(options)
+            {
+              return(options.colsWidth);
+            }
+            else
+            {
+              return('');
+            }
+          }
+        }, // colsWidth
+
+      colsDisplayed: function (value)
+        {
+          if(value!=null)
+          {
+            return this.each(function()
+              {
+                privateMethods.setColsDisplayed($(this), value);
+              }
+            );
+          }
+          else
+          {
+            var options = this.data('options');
+
+            if(options)
+            {
+              return(options.colsDisplayed);
+            }
+            else
+            {
+              return('');
+            }
+          }
+        }, // colsDisplayed
+
+      colsCss: function (value)
+        {
+          if(value!=null)
+          {
+            return this.each(function()
+              {
+                privateMethods.setColsCss($(this), value);
+              }
+            );
+          }
+          else
+          {
+            var options = this.data('options');
+
+            if(options)
+            {
+              return(options.colsCss);
+            }
+            else
+            {
+              return('');
+            }
+          }
+        }, // colsCss
+
+
+      items: function (value)
+        {
+          if(value!=null)
+          {
+            return this.each(function()
+              {
+                privateMethods.setItems($(this), value);
+              }
+            );
+          }
+          else
+          {
+            var properties = this.data('properties');
+
+            if(properties)
+            {
+              return(properties.items);
+            }
+            else
+            {
+              return('');
+            }
+          }
+        }, //items
+
+      value: function (value)
+        {
+          if(value!=null)
+          {
+            // set selected value
+            return this.each(function()
+              {
+                privateMethods.setValue($(this), value);
+              }
+            );
+          }
+          else
+          {
+            // return the selected value
+            var properties=this.data('properties'),
+                options = this.data('options');
+
+            if(properties && properties.index!=null && !options.multiple && properties.index>-1 && properties.index<properties.items.length)
+            {
+              return(properties.items[properties.index].value);
+            }
+            else if(properties && properties.index!=null && options.multiple)
+            {
+              var returned=[];
+              if(options.returnMode=='selected')
+              {
+                for(var i=0;i<properties.index.length;i++)
+                {
+                  if(properties.index[i]>-1 && properties.index[i]<properties.items.length)
+                    returned.push(properties.items[properties.index[i]].value);
+                }
+              }
+              else
+              {
+                for(var i=0;i<properties.items.length;i++)
+                {    
+                  if($.inArray(i, properties.index)==-1)
+                    returned.push(properties.items[i].value);
+                }
+              }
+              return(returned);
+            }
+            else
+            {
+              return(null);
+            }
+          }
+        }, // value
+
+      isValid: function (value)
+        {
+          if(value!=null)
+          {
+            // set selected value
+            return this.each(function()
+              {
+                privateMethods.setIsValid($(this), value);
+              }
+            );
+          }
+          else
+          {
+            // return the selected tags
+            var properties=this.data('properties');
+            return(properties.isValid);
+          }
+        }, // isValid
+
+      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
+            return this.each(function()
+              {
+                privateMethods.setEventLoad($(this), value);
+              }
+            );
+          }
+          else
+          {
+            // loads data from server
+            privateMethods.load(this);
+          }
+        },
+
+      popup: function (value)
+        {
+          if(value && $.isFunction(value))
+          {
+            // set selected value
+            return this.each(function()
+              {
+                privateMethods.setEventPopup($(this), value);
+              }
+            );
+          }
+          else
+          {
+            // return the selected value
+            var options=this.data('options');
+
+            if(options)
+            {
+              return(options.popup);
+            }
+            else
+            {
+              return(null);
+            }
+          }
+        }, // popup
+
+      change: function (value)
+        {
+          if(value && $.isFunction(value))
+          {
+            // set selected value
+            return this.each(function()
+              {
+                privateMethods.setEventChange($(this), value);
+              }
+            );
+          }
+          else
+          {
+            // return the selected value
+            var options=this.data('options');
+
+            if(options)
+            {
+              return(options.change);
+            }
+            else
+            {
+              return(null);
+            }
+          }
+        }, // popup
+
+      numberOfItems: function ()
+        {
+          var properties=this.data('properties');
+
+          if(properties)
+          {
+            return(properties.items.length);
+          }
+          else
+          {
+            return(null);
+          }
+        }, // numberOfItems
+
+      properties: function (value)
+        {
+          var properties=this.data('properties'),
+              options=this.data('options');
+
+          if(properties && value==':first' && properties.items.length>0)
+          {
+            return(properties.items[0]);
+          }
+          else if(properties && properties.index!=null && (value==':selected' || value==null) && properties.items.length>0)
+          {
+            if(!options.multiple && properties.index>-1 && properties.index<properties.items.length)
+            {
+              return(properties.items[properties.index]);
+            }
+            else if(options.multiple)
+            {
+              var returned=[];
+              for(var i=0;i<properties.index.length;i++)
+              {
+                if(properties.index[i]>-1 && properties.index<properties.items.length)
+                  returned.push(properties.items[properties.index[i]]);
+              }
+              return(returned);
+            }
+            return(null);
+          }
+          else if(properties && value!=null)
+          {
+            var index=privateMethods.findIndexByValue(this, value);
+            if(index>-1)
+            {
+              return(properties.items[index]);
+            }
+            return(null);
+          }
+          else
+          {
+            return(null);
+          }
+        } // properties
+    }; // 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.setReturnMode(object, (value.returnMode!=null)?value.returnMode:options.returnMode);
+          privateMethods.setAutoLoad(object, (value.autoLoad!=null)?value.autoLoad:options.autoLoad);
+          privateMethods.setListMaxWidth(object, (value.listMaxWidth!=null)?value.listMaxWidth:options.listMaxWidth);
+          privateMethods.setListMaxHeight(object, (value.listMaxHeight!=null)?value.listMaxHeight:options.listMaxHeight);
+          privateMethods.setServerUrl(object, (value.serverUrl!=null)?value.serverUrl:options.serverUrl);
+          privateMethods.setPopupMode(object, (value.popupMode!=null)?value.popupMode:options.popupMode);
+          privateMethods.setDownArrow(object, (value.downArrow!=null)?value.downArrow:options.downArrow);
+          privateMethods.setEventPopup(object, (value.popup!=null)?value.popup:options.popup);
+          privateMethods.setEventChange(object, (value.change!=null)?value.change:options.change);
+          privateMethods.setEventLoad(object, (value.load!=null)?value.load:options.load);
+          privateMethods.setColsWidth(object, (value.colsWidth!=null)?value.colsWidth:options.colsWidth);
+          privateMethods.setColsDisplayed(object, (value.colsDisplayed!=null)?value.colsDisplayed:options.colsDisplayed);
+          privateMethods.setColsCss(object, (value.colsCss!=null)?value.colsCss:options.colsCss);
+          privateMethods.setItems(object, (value.items!=null)?value.items:options.items);
+          privateMethods.setMultiple(object, (value.multiple!=null)?value.multiple:options.multiple); // can be set only at the initialization
+
+          if(options.autoLoad) privateMethods.load(object);
+
+          properties.initialized=true;
+        },
+
+      setIsValid : function (object, value)
+        {
+          var objects=object.data('objects'),
+              properties=object.data('properties');
+
+          if(properties.isValid!=value)
+          {
+            properties.isValid=value;
+            if(properties.isValid)
+            {
+              objects.container.removeClass('ui-error');
+            }
+            else
+            {
+              objects.container.addClass('ui-error');
+            }
+          }
+          return(properties.isValid);
+        },
+
+      setAutoLoad : function (object, value)
+        {
+          var options=object.data('options'),
+              properties=object.data('properties');
+
+          if((!properties.initialized || options.autoLoad!=value) && (value==true || value==false))
+          {
+            options.autoLoad=value;
+          }
+          return(options.autoLoad);
+        },
+
+      setReturnMode : function (object, value)
+        {
+          var options=object.data('options'),
+              properties=object.data('properties');
+
+          if((!properties.initialized || options.returnMode!=value) && (value=='selected' || value=='notSelected'))
+          {
+            options.returnMode=value;
+          }
+          return(options.returnMode);
+        },
+
+      setColsWidth : function (object, value)
+        {
+          var options=object.data('options'),
+              properties=object.data('properties'),
+              width=0;
+
+          if((!properties.initialized || options.colsWidth!=value) && $.isArray(value))
+          {
+            options.colsWidth=value;
+          }
+          return(options.colsWidth);
+        },
+
+      setColsDisplayed : function (object, value)
+        {
+          var options=object.data('options'),
+              properties=object.data('properties');
+
+          if((!properties.initialized || options.colsDisplayed!=value) && $.isArray(value))
+          {
+            options.colsDisplayed=value;
+          }
+          return(options.colsDisplayed);
+        },
+
+      setColsCss : function (object, value)
+        {
+          var options=object.data('options'),
+              properties=object.data('properties');
+
+          if((!properties.initialized || options.colsCss!=value) && $.isArray(value))
+          {
+            options.colsCss=value;
+          }
+          return(options.colsCss);
+        },
+
+      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.listContainer.css('max-width', options.listMaxWidth+'px');
+            }
+            else
+            {
+              objects.listContainer.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.listContainer.css('max-height', options.listMaxHeight+'px');
+            }
+            else
+            {
+              objects.listContainer.css('max-height', '');
+            }
+          }
+          return(options.listMaxHeight);
+        },
+
+      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);
+        },
+
+      setMultiple : function (object, value)
+        {
+          var options=object.data('options'),
+              properties=object.data('properties'),
+              objects=object.data('objects');
+
+          if((!properties.initialized || options.multiple!=value) && (value==true || value==false))
+          {
+            if(!value)
+            {
+              properties.index=-1;
+              if(objects.containerList!=null)
+              {
+                objects.containerList.remove();
+                objects.containerList=null;
+              }
+            }
+            else
+            {
+              properties.index=[];
+              objects.listContainer.addClass('ui-inputList-multiple');
+              if(objects.containerList==null)
+              {
+                objects.containerList=$('<ul/>',
+                  {
+                    html:'<li>&nbsp;</li>'
+                  }
+                );
+                objects.containerValue.html('').append(objects.containerList);
+              }
+            }
+            options.multiple=value;
+          }
+          return(options.multiple);
+        }, //setMultiple
+
+      setPopupMode : function (object, value)
+        {
+          var options=object.data('options'),
+              properties=object.data('properties'),
+              objects=object.data('objects');
+
+          if((!properties.initialized || options.popupMode!=value) && (value=='click' || value=='mouseout'))
+          {
+            options.popupMode=value;
+
+            if(value=='mouseout')
+            {
+              objects.listContainer
+                .unbind('mouseleave.inputList')
+                .unbind('mouseenter.inputList')
+                .bind('mouseleave.inputList',
+                  function ()
+                  {
+                    privateMethods.displaySelector(object, false);
+                  }
+                );
+            }
+            else
+            {
+              objects.listContainer
+                .unbind('mouseleave.inputList')
+                .bind('mouseleave.inputList',
+                  function ()
+                  {
+                    properties.mouseOver=false;
+                  }
+                )
+                .bind('mouseenter.inputList',
+                  function ()
+                  {
+                    properties.mouseOver=true;
+                  }
+                );
+              $(document).bind('focusout focusin',
+                function (event)
+                {
+                  if(!properties.mouseOver) privateMethods.displaySelector(object, false);
+                  event.stopPropagation();
+                }
+              );
+            }
+          }
+          return(options.popupMode);
+        }, //setPopupMode
+
+      setDownArrow : function (object, value)
+        {
+          var options=object.data('options'),
+              properties=object.data('properties'),
+              objects=object.data('objects');
+
+          if(!properties.initialized || options.downArrow!=value)
+          {
+            options.downArrow=value;
+            objects.containerArrow.html(options.downArrow);
+          }
+          return(options.downArrow);
+        }, //setDownArrow
+
+      setItems : function (object, value)
+        {
+          var properties=object.data('properties');
+
+          if(value=='' || value==null)
+          {
+            value=[];
+          }
+          else if(!$.isArray(value))
+          {
+            try
+            {
+              value=$.parseJSON($.trim(value));
+            }
+            catch (e)
+            {
+              return(false);
+            }
+          }
+
+          privateMethods.listClear(object);
+          if(value.length>0) privateMethods.listAddItems(object, value);
+        },
+
+
+      setValue : function (object, value, trigger)
+        {
+          var options=object.data('options'),
+              properties=object.data('properties'),
+              objects=object.data('objects'),
+              index=-1;
+
+          re=/^(:invert|:all|:none)(?:(=|<|>)(\d+))$/i;
+          target=re.exec(value);
+          if(target!=null) value=target[1];
+
+          switch(value)
+          {
+            case ':first':
+              if(properties.items.length>0) index=0;
+              break;
+            case ':last':
+              index=properties.items.length-1;
+              break;
+            case ':invert':
+              if(!options.multiple) return(false);
+              properties.index=[];
+              objects.list.find('.ui-inputList-item').each(
+                function ()
+                {
+                  var $this=$(this),
+                      apply=true;
+
+                  if(target!=null)
+                  {
+                    switch(target[2])
+                    {
+                      case '=':
+                        apply=($this.attr('level')==target[3]);
+                        break;
+                      case '>':
+                        apply=($this.attr('level')>=target[3]);
+                        break;
+                      case '<':
+                        apply=($this.attr('level')<=target[3]);
+                        break;
+                    }
+                  }
+
+                  if(apply)
+                  {
+                    if($this.hasClass('ui-inputList-selected-item'))
+                    {
+                      $this.removeClass('ui-inputList-selected-item');
+                    }
+                    else
+                    {
+                      $this.addClass('ui-inputList-selected-item');
+                      tmp=privateMethods.findIndexByValue(object, $this.attr('idvalue'));
+                      if(tmp>-1) properties.index.push(tmp);
+                    }
+                  }
+                }
+              );
+              privateMethods.setValue(object, [], false);
+              return(false);
+              break;
+            case ':none':
+              if(!options.multiple) return(false);
+
+              properties.index=[];
+              objects.list.find('.ui-inputList-selected-item').each(
+                function ()
+                {
+                  var $this=$(this),
+                      apply=true;
+
+                  if(target!=null)
+                  {
+                    switch(target[2])
+                    {
+                      case '=':
+                        apply=($this.attr('level')==target[3]);
+                        break;
+                      case '>':
+                        apply=($this.attr('level')>=target[3]);
+                        break;
+                      case '<':
+                        apply=($this.attr('level')<=target[3]);
+                        break;
+                    }
+                  }
+
+                  if(apply) $this.removeClass('ui-inputList-selected-item');
+                }
+              );
+              privateMethods.setValue(object, [], false);
+              return(false);
+              break;
+            case ':all':
+              if(!options.multiple) return(false);
+              properties.index=[];
+              objects.list.find('.ui-inputList-item').each(
+                function ()
+                {
+                  var $this=$(this),
+                      apply=true;
+
+                  if(target!=null)
+                  {
+                    switch(target[2])
+                    {
+                      case '=':
+                        apply=($this.attr('level')==target[3]);
+                        break;
+                      case '>':
+                        apply=($this.attr('level')>=target[3]);
+                        break;
+                      case '<':
+                        apply=($this.attr('level')<=target[3]);
+                        break;
+                    }
+                  }
+                  if(apply)
+                  {
+                    tmp=privateMethods.findIndexByValue(object, $this.attr('idvalue'));
+                    if(tmp>-1) properties.index.push(tmp);
+
+                    $this.addClass('ui-inputList-selected-item');
+                  }
+                }
+              );
+              privateMethods.setValue(object, [], false);
+              return(false);
+              break;
+            default:
+              if($.isArray(value) && options.multiple)
+              {
+                index=[];
+                for(var i=0;i<value.length;i++)
+                {
+                  tmp=privateMethods.findIndexByValue(object, value[i]);
+                  if(tmp>-1) index.push(tmp);
+                }
+              }
+              else
+              {
+                index=privateMethods.findIndexByValue(object, value);
+              }
+
+              break;
+          }
+
+          if(!options.multiple && (!properties.initialized || properties.index!=index) && index>-1)
+          {
+            objects.list.find('.ui-inputList-selected-item').removeClass('ui-inputList-selected-item');
+            objects.list.find('[idvalue="'+value+'"]').addClass('ui-inputList-selected-item');
+            properties.index=index;
+
+            privateMethods.setItemContent(object, index, objects.containerValue);
+            if(trigger) object.trigger('inputListChange', [properties.items[properties.index].value]);
+            if(properties.index>-1) return(properties.items[properties.index].value);
+          }
+          else if(options.multiple)
+          {
+            if(!$.isArray(index))
+            {
+              if(index<0 || index==null) return(-1);
+              index=[index];
+            }
+            tmp=[];
+            for(var i=0;i<index.length;i++)
+            {
+              var item=objects.list.find('[idvalue="'+properties.items[index[i]].value+'"]');
+              tmp.push(properties.items[index[i]].value);
+              if(item.hasClass('ui-inputList-selected-item'))
+              {
+                item.removeClass('ui-inputList-selected-item');
+
+                tmpIndex=$.inArray(index[i] ,properties.index);
+                if(tmpIndex>-1) properties.index.splice(tmpIndex, 1);
+              }
+              else
+              {
+                item.addClass('ui-inputList-selected-item');
+                properties.index.push(index[i]);
+              }
+            }
+            objects.containerList.html('');
+            objects.list.children('.ui-inputList-selected-item').each(
+              function ()
+              {
+                var value=$(this).attr('idvalue'),
+                    index=privateMethods.findIndexByValue(object, value),
+                    li=$('<li/>',
+                    {
+                      'class':'ui-inputList-selected-item'
+                    }
+                  );
+                privateMethods.setItemContent(object, index, li);
+                objects.containerList.append(
+                  li.prepend(
+                    $('<span/>',
+                      {
+                        'html':'x',
+                        'class':'ui-inputList-delete-item'
+                      }
+                     ).bind('click.inputList',
+                        {object:object, value:value},
+                        function (event)
+                        {
+                          event.stopPropagation();
+                          privateMethods.setValue(event.data.object, event.data.value, true);
+                        }
+                      )
+                  )
+                );
+              }
+            );
+
+            if(objects.containerList.children().length==0) objects.containerList.append('<li>&nbsp;</li>');
+
+            if(trigger) object.trigger('inputListChange', [tmp]);
+            return(tmp);
+          }
+          return(null);
+        },
+
+      displaySelector : function (object, value)
+        {
+          var options=object.data('options'),
+              properties=object.data('properties'),
+              objects=object.data('objects'),
+              scrollBarWidth=0;
+
+          if(properties.selectorVisible!=value)
+          {
+            properties.selectorVisible=value;
+
+            if(properties.selectorVisible && properties.items.length>0)
+            {
+              var index=0;
+              objects.listContainer
+                .css(
+                  {
+                    display:'block',
+                    'min-width':objects.listContainer.parent().css('width')
+                  }
+                );
+
+              if($.isArray(properties.index))
+              {
+                if (properties.index.length>0) index=properties.index[0];
+              }
+              else if(properties.index>-1)
+              {
+                index=properties.index;
+              }
+
+              scrollBarWidth=objects.listContainer.width()-objects.list.width();
+              if(scrollBarWidth>0 && properties.firstPopup)
+              {
+                objects.listContainer.width(objects.listContainer.width()+scrollBarWidth);
+                properties.firstPopup=false;
+              }
+
+              objects.listContainer.scrollTop(objects.listContainer.scrollTop()+objects.list.find('[idValue="'+properties.items[index].value+'"]').position().top);
+            }
+            else
+            {
+              objects.listContainer.css('display', 'none');
+            }
+            if(options.popup) object.trigger('inputListPopup', [properties.selectorVisible]);
+          }
+          return(properties.selectorVisible);
+        },
+
+      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');
+
+          if(options.serverUrl=='') return(false);
+
+          $.ajax(
+            {
+              type: "POST",
+              url: options.serverUrl,
+              async: true,
+              success: function(msg)
+                {
+                  privateMethods.setItems(object, msg);
+
+                  properties.initialized=false;
+                  if(options.multiple)
+                  {
+                    privateMethods.setValue(object, ':none');
+                  }
+                  else
+                  {
+                    privateMethods.setValue(object, ':first');
+                  }
+                  properties.initialized=true;
+
+                  if(options.load) object.trigger('inputListLoad');
+                },
+              error: function(msg)
+                {
+                  objects.listContainer.html('Error ! '+msg);
+                }
+            }
+         );
+        },
+
+      listClear : function (object)
+        {
+          // clear the items list
+          var objects=object.data('objects'),
+              options=object.data('options'),
+              properties=object.data('properties');
+
+          objects.list.children().unbind();
+          objects.list.html('');
+          if(options.multiple)
+          {
+            properties.index=[];
+          }
+          else
+          {
+            properties.index=-1;
+          }
+          properties.items=[];
+          properties.firstPopup=true;
+        },
+
+      listAddItems : function (object, listItems)
+        {
+          // add the items to the items list
+          var options=object.data('options'),
+              properties=object.data('properties'),
+              objects=object.data('objects'),
+              width=0;
+
+          for(var i=0;i<listItems.length;i++)
+          {
+            properties.items.push(
+              {
+                value:listItems[i].value,
+                cols:listItems[i].cols
+              }
+            );
+
+            var content=$('<div/>',
+                      {
+                        'class':'ui-inputList-value'
+                      }
+                    ),
+                li=$('<li/>',
+                      {
+                        'class':'ui-inputList-item',
+                        'idValue':listItems[i].value
+                      }
+                    ).bind('click.inputList',
+                        {object:object},
+                        function (event)
+                        {
+                          privateMethods.setValue(event.data.object, $(this).attr('idValue'), true);
+                          if(options.multiple)
+                          {
+                          }
+                          else
+                          {
+                            privateMethods.displaySelector(event.data.object, false);
+                          }
+
+                          if(options.multiple) objects.container.focus();
+                        }
+                      );
+
+            for(var j=0;j<listItems[i].cols.length;j++)
+            {
+              content.append($('<span/>',
+                  {
+                    html:listItems[i].cols[j],
+                    css:
+                      {
+                        width:privateMethods.getColWidth(object, j)
+                      },
+                    'class':privateMethods.getColCss(object, j)
+                  }
+                )
+              );
+            }
+
+            li.append(content);
+            if(options.multiple)
+            {
+              li.children().prepend('<div class="ui-inputList-check"></div>');
+            }
+            objects.list.append(li);
+          }
+        },
+
+      findIndexByValue : function (object, value)
+        {
+          /*
+           * search an item inside the item list and return the index
+           * in the array
+           */
+          var properties=object.data('properties');
+
+          for(var i=0;i<properties.items.length;i++)
+          {
+            if(properties.items[i].value==value) return(i);
+          }
+          return(-1);
+        },
+
+      setEventPopup : function (object, value)
+        {
+          var options=object.data('options');
+
+          options.popup=value;
+          object.unbind('inputListPopup');
+          if(value) object.bind('inputListPopup', options.popup);
+          return(options.popup);
+        },
+
+      setEventChange : function (object, value)
+        {
+          var options=object.data('options');
+
+          options.change=value;
+          object.unbind('inputListChange');
+          if(value) object.bind('inputListChange', options.change);
+          return(options.change);
+        },
+
+      setEventLoad : function (object, value)
+        {
+          var options=object.data('options');
+
+          options.load=value;
+          object.unbind('inputListLoad');
+          if(value) object.bind('inputListLoad', options.load);
+          return(options.load);
+        },
+
+      getColWidth : function (object, index)
+        {
+          var options=object.data('options');
+
+          if(index>=0 && index<options.colsWidth.length && options.colsWidth[index]!='' && options.colsWidth[index]!=0)
+          {
+            return(options.colsWidth[index]+'px');
+          }
+          return('');
+        },
+
+      getColCss : function (object, index)
+        {
+          var options=object.data('options');
+
+          if(index>=0 && index<options.colsCss.length)
+          {
+            return(options.colsCss[index]);
+          }
+          return('');
+        },
+
+      getColContent : function (object, itemIndex, index)
+        {
+          var properties=object.data('properties');
+
+          if(index>=0 && index<=properties.items[itemIndex].cols.length)
+          {
+            return(properties.items[itemIndex].cols[index]);
+          }
+          return('');
+        },
+
+      setItemContent : function (object, index, container)
+        {
+          var options=object.data('options'),
+              properties=object.data('properties'),
+              colContent='',
+              colsDisplayed=[];
+
+          container.html('');
+
+          if(options.colsDisplayed.length==0)
+          {
+            for(var j=0;j<properties.items[index].cols.length;j++)
+            {
+              colsDisplayed.push(j);
+            }
+          }
+          else
+          {
+            colsDisplayed=options.colsDisplayed;
+          }
+
+          for(var j=0;j<colsDisplayed.length;j++)
+          {
+            colContent=privateMethods.getColContent(object, index, colsDisplayed[j]);
+
+            if(colContent!=null)
+            {
+              container.append($('<span/>',
+                  {
+                    'html':colContent,
+                    css:
+                      {
+                        width:privateMethods.getColWidth(object, colsDisplayed[j])
+                      },
+                    'class':privateMethods.getColCss(object, colsDisplayed[j])
+                  }
+                )
+              );
+            }
+          }
+        }
+    };
+
+
+    $.fn.inputList = 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.inputList' );
+      }
+    } // $.fn.inputList
+
+  }
+)(jQuery);
+
+
Index: /extensions/GrumPluginClasses/js/ui.inputList.min.js
===================================================================
--- /extensions/GrumPluginClasses/js/ui.inputList.min.js	(revision 8961)
+++ /extensions/GrumPluginClasses/js/ui.inputList.min.js	(revision 8961)
@@ -0,0 +1,351 @@
+/* file: ui.inputList.js - v1.0.0 | minified on 2011/01/27 with http://jscompress.com/ */
+(function($)
+{var publicMethods={init:function(opt)
+{return this.each(function()
+{var $this=$(this),data=$this.data('options'),objects=$this.data('objects'),properties=$this.data('properties'),options={serverUrl:'',autoLoad:true,listMaxWidth:0,listMaxHeight:0,multiple:false,downArrow:'⇓',popupMode:'click',colsWidth:[],colsDisplayed:[],colsCss:[],disabled:false,popup:null,change:null,load:null,returnMode:'selected'};$this.data('options',options);if(!properties)
+{$this.data('properties',{index:-1,initialized:false,selectorVisible:false,items:[],mouseOver:false,isValid:true,firstPopup:true});properties=$this.data('properties');}
+if(!objects)
+{objects={container:$('<div/>',{'class':'ui-inputList',tabindex:0,css:{width:'100%'}}).bind('click.inputList',function()
+{privateMethods.displaySelector($this,!$this.data('properties').selectorVisible);$(this).focus();}),containerValue:$('<div/>',{html:' ','class':'ui-inputList-value',css:{overflow:'hidden'}}),containerList:null,containerArrow:$('<div/>',{html:'⇓','class':'ui-inputList-arrow',css:{'float':'right',cursor:'pointer'}}).bind('mousedown',function()
+{$(this).addClass('ui-inputList-arrow-active');}).bind('mouseup',function()
+{$(this).removeClass('ui-inputList-arrow-active');}),listContainer:$('<div/>',{html:"",'class':'ui-inputList-list',css:{overflow:"auto",display:'none',position:'absolute'}}),list:$('<ul/>',{css:{listStyle:'none',padding:'0px',margin:'0px'}})};}
+$this.data('objects',objects);privateMethods.setOptions($this,opt);if($this.text()!='')
+{var tmp=$.parseJSON($.trim($this.text())),selectedValues=[],values=[];if($.isArray(tmp))
+{values=tmp;}
+else if(tmp.values!=null)
+{values=tmp.values;}
+if(tmp.selected!=null)selectedValues=tmp.selected;privateMethods.setItems($this,values);privateMethods.setValue($this,selectedValues);}
+$this.html('').append(objects.container.append(objects.containerArrow).append(objects.containerValue)).append(objects.listContainer.append(objects.list));});},destroy:function()
+{return this.each(function()
+{var $this=$(this),objects=$this.data('objects');objects.container.unbind().remove();objects.list.children().unbind();objects.listContainer.remove();$this.unbind('.inputList').css({width:'',height:''});});},options:function(value)
+{return this.each(function()
+{privateMethods.setOptions($(this),value);});},autoLoad:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setAutoLoad($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.autoLoad);}
+else
+{return(true);}}},listMaxWidth:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setListMaxWidth($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.listMaxWidth);}
+else
+{return(0);}}},listMaxHeight:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setListMaxHeight($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.listMaxHeight);}
+else
+{return(0);}}},serverUrl:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setServerUrl($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.serverUrl);}
+else
+{return('');}}},cols:function()
+{var options=this.data('options'),properties=this.data('properties');if(!options.multiple)
+{return(properties.items[properties.index].cols);}
+else
+{var listCols=[];for(var i=0;i<properties.index.length;i++)
+{listCols.push(properties.items[properties.index[i]].cols);}
+return(listCols);}},popupMode:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setPopupMode($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.popupMode);}
+else
+{return(0);}}},downArrow:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setDownArrow($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.downArrow);}
+else
+{return('');}}},returnMode:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setReturnMode($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.returnMode);}
+else
+{return('selected');}}},colsWidth:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setColsWidth($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.colsWidth);}
+else
+{return('');}}},colsDisplayed:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setColsDisplayed($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.colsDisplayed);}
+else
+{return('');}}},colsCss:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setColsCss($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.colsCss);}
+else
+{return('');}}},items:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setItems($(this),value);});}
+else
+{var properties=this.data('properties');if(properties)
+{return(properties.items);}
+else
+{return('');}}},value:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setValue($(this),value);});}
+else
+{var properties=this.data('properties'),options=this.data('options');if(properties&&properties.index!=null&&!options.multiple&&properties.index>-1&&properties.index<properties.items.length)
+{return(properties.items[properties.index].value);}
+else if(properties&&properties.index!=null&&options.multiple)
+{var returned=[];if(options.returnMode=='selected')
+{for(var i=0;i<properties.index.length;i++)
+{if(properties.index[i]>-1&&properties.index[i]<properties.items.length)
+returned.push(properties.items[properties.index[i]].value);}}
+else
+{for(var i=0;i<properties.items.length;i++)
+{if($.inArray(i,properties.index)==-1)
+returned.push(properties.items[i].value);}}
+return(returned);}
+else
+{return(null);}}},isValid:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setIsValid($(this),value);});}
+else
+{var properties=this.data('properties');return(properties.isValid);}},load:function(value)
+{if(value&&$.isFunction(value))
+{return this.each(function()
+{privateMethods.setEventLoad($(this),value);});}
+else
+{privateMethods.load(this);}},popup:function(value)
+{if(value&&$.isFunction(value))
+{return this.each(function()
+{privateMethods.setEventPopup($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.popup);}
+else
+{return(null);}}},change:function(value)
+{if(value&&$.isFunction(value))
+{return this.each(function()
+{privateMethods.setEventChange($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.change);}
+else
+{return(null);}}},numberOfItems:function()
+{var properties=this.data('properties');if(properties)
+{return(properties.items.length);}
+else
+{return(null);}},properties:function(value)
+{var properties=this.data('properties'),options=this.data('options');if(properties&&value==':first'&&properties.items.length>0)
+{return(properties.items[0]);}
+else if(properties&&properties.index!=null&&(value==':selected'||value==null)&&properties.items.length>0)
+{if(!options.multiple&&properties.index>-1&&properties.index<properties.items.length)
+{return(properties.items[properties.index]);}
+else if(options.multiple)
+{var returned=[];for(var i=0;i<properties.index.length;i++)
+{if(properties.index[i]>-1&&properties.index<properties.items.length)
+returned.push(properties.items[properties.index[i]]);}
+return(returned);}
+return(null);}
+else if(properties&&value!=null)
+{var index=privateMethods.findIndexByValue(this,value);if(index>-1)
+{return(properties.items[index]);}
+return(null);}
+else
+{return(null);}}};var privateMethods={setOptions:function(object,value)
+{var properties=object.data('properties'),options=object.data('options');if(!$.isPlainObject(value))return(false);properties.initialized=false;privateMethods.setReturnMode(object,(value.returnMode!=null)?value.returnMode:options.returnMode);privateMethods.setAutoLoad(object,(value.autoLoad!=null)?value.autoLoad:options.autoLoad);privateMethods.setListMaxWidth(object,(value.listMaxWidth!=null)?value.listMaxWidth:options.listMaxWidth);privateMethods.setListMaxHeight(object,(value.listMaxHeight!=null)?value.listMaxHeight:options.listMaxHeight);privateMethods.setServerUrl(object,(value.serverUrl!=null)?value.serverUrl:options.serverUrl);privateMethods.setPopupMode(object,(value.popupMode!=null)?value.popupMode:options.popupMode);privateMethods.setDownArrow(object,(value.downArrow!=null)?value.downArrow:options.downArrow);privateMethods.setEventPopup(object,(value.popup!=null)?value.popup:options.popup);privateMethods.setEventChange(object,(value.change!=null)?value.change:options.change);privateMethods.setEventLoad(object,(value.load!=null)?value.load:options.load);privateMethods.setColsWidth(object,(value.colsWidth!=null)?value.colsWidth:options.colsWidth);privateMethods.setColsDisplayed(object,(value.colsDisplayed!=null)?value.colsDisplayed:options.colsDisplayed);privateMethods.setColsCss(object,(value.colsCss!=null)?value.colsCss:options.colsCss);privateMethods.setItems(object,(value.items!=null)?value.items:options.items);privateMethods.setMultiple(object,(value.multiple!=null)?value.multiple:options.multiple);if(options.autoLoad)privateMethods.load(object);properties.initialized=true;},setIsValid:function(object,value)
+{var objects=object.data('objects'),properties=object.data('properties');if(properties.isValid!=value)
+{properties.isValid=value;if(properties.isValid)
+{objects.container.removeClass('ui-error');}
+else
+{objects.container.addClass('ui-error');}}
+return(properties.isValid);},setAutoLoad:function(object,value)
+{var options=object.data('options'),properties=object.data('properties');if((!properties.initialized||options.autoLoad!=value)&&(value==true||value==false))
+{options.autoLoad=value;}
+return(options.autoLoad);},setReturnMode:function(object,value)
+{var options=object.data('options'),properties=object.data('properties');if((!properties.initialized||options.returnMode!=value)&&(value=='selected'||value=='notSelected'))
+{options.returnMode=value;}
+return(options.returnMode);},setColsWidth:function(object,value)
+{var options=object.data('options'),properties=object.data('properties'),width=0;if((!properties.initialized||options.colsWidth!=value)&&$.isArray(value))
+{options.colsWidth=value;}
+return(options.colsWidth);},setColsDisplayed:function(object,value)
+{var options=object.data('options'),properties=object.data('properties');if((!properties.initialized||options.colsDisplayed!=value)&&$.isArray(value))
+{options.colsDisplayed=value;}
+return(options.colsDisplayed);},setColsCss:function(object,value)
+{var options=object.data('options'),properties=object.data('properties');if((!properties.initialized||options.colsCss!=value)&&$.isArray(value))
+{options.colsCss=value;}
+return(options.colsCss);},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.listContainer.css('max-width',options.listMaxWidth+'px');}
+else
+{objects.listContainer.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.listContainer.css('max-height',options.listMaxHeight+'px');}
+else
+{objects.listContainer.css('max-height','');}}
+return(options.listMaxHeight);},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);},setMultiple:function(object,value)
+{var options=object.data('options'),properties=object.data('properties'),objects=object.data('objects');if((!properties.initialized||options.multiple!=value)&&(value==true||value==false))
+{if(!value)
+{properties.index=-1;if(objects.containerList!=null)
+{objects.containerList.remove();objects.containerList=null;}}
+else
+{properties.index=[];objects.listContainer.addClass('ui-inputList-multiple');if(objects.containerList==null)
+{objects.containerList=$('<ul/>',{html:'<li> </li>'});objects.containerValue.html('').append(objects.containerList);}}
+options.multiple=value;}
+return(options.multiple);},setPopupMode:function(object,value)
+{var options=object.data('options'),properties=object.data('properties'),objects=object.data('objects');if((!properties.initialized||options.popupMode!=value)&&(value=='click'||value=='mouseout'))
+{options.popupMode=value;if(value=='mouseout')
+{objects.listContainer.unbind('mouseleave.inputList').unbind('mouseenter.inputList').bind('mouseleave.inputList',function()
+{privateMethods.displaySelector(object,false);});}
+else
+{objects.listContainer.unbind('mouseleave.inputList').bind('mouseleave.inputList',function()
+{properties.mouseOver=false;}).bind('mouseenter.inputList',function()
+{properties.mouseOver=true;});$(document).bind('focusout focusin',function(event)
+{if(!properties.mouseOver)privateMethods.displaySelector(object,false);event.stopPropagation();});}}
+return(options.popupMode);},setDownArrow:function(object,value)
+{var options=object.data('options'),properties=object.data('properties'),objects=object.data('objects');if(!properties.initialized||options.downArrow!=value)
+{options.downArrow=value;objects.containerArrow.html(options.downArrow);}
+return(options.downArrow);},setItems:function(object,value)
+{var properties=object.data('properties');if(value==''||value==null)
+{value=[];}
+else if(!$.isArray(value))
+{try
+{value=$.parseJSON($.trim(value));}
+catch(e)
+{return(false);}}
+privateMethods.listClear(object);if(value.length>0)privateMethods.listAddItems(object,value);},setValue:function(object,value,trigger)
+{var options=object.data('options'),properties=object.data('properties'),objects=object.data('objects'),index=-1;re=/^(:invert|:all|:none)(?:(=|<|>)(\d+))$/i;target=re.exec(value);if(target!=null)value=target[1];switch(value)
+{case':first':if(properties.items.length>0)index=0;break;case':last':index=properties.items.length-1;break;case':invert':if(!options.multiple)return(false);properties.index=[];objects.list.find('.ui-inputList-item').each(function()
+{var $this=$(this),apply=true;if(target!=null)
+{switch(target[2])
+{case'=':apply=($this.attr('level')==target[3]);break;case'>':apply=($this.attr('level')>=target[3]);break;case'<':apply=($this.attr('level')<=target[3]);break;}}
+if(apply)
+{if($this.hasClass('ui-inputList-selected-item'))
+{$this.removeClass('ui-inputList-selected-item');}
+else
+{$this.addClass('ui-inputList-selected-item');tmp=privateMethods.findIndexByValue(object,$this.attr('idvalue'));if(tmp>-1)properties.index.push(tmp);}}});privateMethods.setValue(object,[],false);return(false);break;case':none':if(!options.multiple)return(false);properties.index=[];objects.list.find('.ui-inputList-selected-item').each(function()
+{var $this=$(this),apply=true;if(target!=null)
+{switch(target[2])
+{case'=':apply=($this.attr('level')==target[3]);break;case'>':apply=($this.attr('level')>=target[3]);break;case'<':apply=($this.attr('level')<=target[3]);break;}}
+if(apply)$this.removeClass('ui-inputList-selected-item');});privateMethods.setValue(object,[],false);return(false);break;case':all':if(!options.multiple)return(false);properties.index=[];objects.list.find('.ui-inputList-item').each(function()
+{var $this=$(this),apply=true;if(target!=null)
+{switch(target[2])
+{case'=':apply=($this.attr('level')==target[3]);break;case'>':apply=($this.attr('level')>=target[3]);break;case'<':apply=($this.attr('level')<=target[3]);break;}}
+if(apply)
+{tmp=privateMethods.findIndexByValue(object,$this.attr('idvalue'));if(tmp>-1)properties.index.push(tmp);$this.addClass('ui-inputList-selected-item');}});privateMethods.setValue(object,[],false);return(false);break;default:if($.isArray(value)&&options.multiple)
+{index=[];for(var i=0;i<value.length;i++)
+{tmp=privateMethods.findIndexByValue(object,value[i]);if(tmp>-1)index.push(tmp);}}
+else
+{index=privateMethods.findIndexByValue(object,value);}
+break;}
+if(!options.multiple&&(!properties.initialized||properties.index!=index)&&index>-1)
+{objects.list.find('.ui-inputList-selected-item').removeClass('ui-inputList-selected-item');objects.list.find('[idvalue="'+value+'"]').addClass('ui-inputList-selected-item');properties.index=index;privateMethods.setItemContent(object,index,objects.containerValue);if(trigger)object.trigger('inputListChange',[properties.items[properties.index].value]);if(properties.index>-1)return(properties.items[properties.index].value);}
+else if(options.multiple)
+{if(!$.isArray(index))
+{if(index<0||index==null)return(-1);index=[index];}
+tmp=[];for(var i=0;i<index.length;i++)
+{var item=objects.list.find('[idvalue="'+properties.items[index[i]].value+'"]');tmp.push(properties.items[index[i]].value);if(item.hasClass('ui-inputList-selected-item'))
+{item.removeClass('ui-inputList-selected-item');tmpIndex=$.inArray(index[i],properties.index);if(tmpIndex>-1)properties.index.splice(tmpIndex,1);}
+else
+{item.addClass('ui-inputList-selected-item');properties.index.push(index[i]);}}
+objects.containerList.html('');objects.list.children('.ui-inputList-selected-item').each(function()
+{var value=$(this).attr('idvalue'),index=privateMethods.findIndexByValue(object,value),li=$('<li/>',{'class':'ui-inputList-selected-item'});privateMethods.setItemContent(object,index,li);objects.containerList.append(li.prepend($('<span/>',{'html':'x','class':'ui-inputList-delete-item'}).bind('click.inputList',{object:object,value:value},function(event)
+{event.stopPropagation();privateMethods.setValue(event.data.object,event.data.value,true);})));});if(objects.containerList.children().length==0)objects.containerList.append('<li> </li>');if(trigger)object.trigger('inputListChange',[tmp]);return(tmp);}
+return(null);},displaySelector:function(object,value)
+{var options=object.data('options'),properties=object.data('properties'),objects=object.data('objects'),scrollBarWidth=0;if(properties.selectorVisible!=value)
+{properties.selectorVisible=value;if(properties.selectorVisible&&properties.items.length>0)
+{var index=0;objects.listContainer.css({display:'block','min-width':objects.listContainer.parent().css('width')});if($.isArray(properties.index))
+{if(properties.index.length>0)index=properties.index[0];}
+else if(properties.index>-1)
+{index=properties.index;}
+scrollBarWidth=objects.listContainer.width()-objects.list.width();if(scrollBarWidth>0&&properties.firstPopup)
+{objects.listContainer.width(objects.listContainer.width()+scrollBarWidth);properties.firstPopup=false;}
+objects.listContainer.scrollTop(objects.listContainer.scrollTop()+objects.list.find('[idValue="'+properties.items[index].value+'"]').position().top);}
+else
+{objects.listContainer.css('display','none');}
+if(options.popup)object.trigger('inputListPopup',[properties.selectorVisible]);}
+return(properties.selectorVisible);},load:function(object)
+{var options=object.data('options'),properties=object.data('properties'),objects=object.data('objects');if(options.serverUrl=='')return(false);$.ajax({type:"POST",url:options.serverUrl,async:true,success:function(msg)
+{privateMethods.setItems(object,msg);properties.initialized=false;if(options.multiple)
+{privateMethods.setValue(object,':none');}
+else
+{privateMethods.setValue(object,':first');}
+properties.initialized=true;if(options.load)object.trigger('inputListLoad');},error:function(msg)
+{objects.listContainer.html('Error ! '+msg);}});},listClear:function(object)
+{var objects=object.data('objects'),options=object.data('options'),properties=object.data('properties');objects.list.children().unbind();objects.list.html('');if(options.multiple)
+{properties.index=[];}
+else
+{properties.index=-1;}
+properties.items=[];properties.firstPopup=true;},listAddItems:function(object,listItems)
+{var options=object.data('options'),properties=object.data('properties'),objects=object.data('objects'),width=0;for(var i=0;i<listItems.length;i++)
+{properties.items.push({value:listItems[i].value,cols:listItems[i].cols});var content=$('<div/>',{'class':'ui-inputList-value'}),li=$('<li/>',{'class':'ui-inputList-item','idValue':listItems[i].value}).bind('click.inputList',{object:object},function(event)
+{privateMethods.setValue(event.data.object,$(this).attr('idValue'),true);if(options.multiple)
+{}
+else
+{privateMethods.displaySelector(event.data.object,false);}
+if(options.multiple)objects.container.focus();});for(var j=0;j<listItems[i].cols.length;j++)
+{content.append($('<span/>',{html:listItems[i].cols[j],css:{width:privateMethods.getColWidth(object,j)},'class':privateMethods.getColCss(object,j)}));}
+li.append(content);if(options.multiple)
+{li.children().prepend('<div class="ui-inputList-check"></div>');}
+objects.list.append(li);}},findIndexByValue:function(object,value)
+{var properties=object.data('properties');for(var i=0;i<properties.items.length;i++)
+{if(properties.items[i].value==value)return(i);}
+return(-1);},setEventPopup:function(object,value)
+{var options=object.data('options');options.popup=value;object.unbind('inputListPopup');if(value)object.bind('inputListPopup',options.popup);return(options.popup);},setEventChange:function(object,value)
+{var options=object.data('options');options.change=value;object.unbind('inputListChange');if(value)object.bind('inputListChange',options.change);return(options.change);},setEventLoad:function(object,value)
+{var options=object.data('options');options.load=value;object.unbind('inputListLoad');if(value)object.bind('inputListLoad',options.load);return(options.load);},getColWidth:function(object,index)
+{var options=object.data('options');if(index>=0&&index<options.colsWidth.length&&options.colsWidth[index]!=''&&options.colsWidth[index]!=0)
+{return(options.colsWidth[index]+'px');}
+return('');},getColCss:function(object,index)
+{var options=object.data('options');if(index>=0&&index<options.colsCss.length)
+{return(options.colsCss[index]);}
+return('');},getColContent:function(object,itemIndex,index)
+{var properties=object.data('properties');if(index>=0&&index<=properties.items[itemIndex].cols.length)
+{return(properties.items[itemIndex].cols[index]);}
+return('');},setItemContent:function(object,index,container)
+{var options=object.data('options'),properties=object.data('properties'),colContent='',colsDisplayed=[];container.html('');if(options.colsDisplayed.length==0)
+{for(var j=0;j<properties.items[index].cols.length;j++)
+{colsDisplayed.push(j);}}
+else
+{colsDisplayed=options.colsDisplayed;}
+for(var j=0;j<colsDisplayed.length;j++)
+{colContent=privateMethods.getColContent(object,index,colsDisplayed[j]);if(colContent!=null)
+{container.append($('<span/>',{'html':colContent,css:{width:privateMethods.getColWidth(object,colsDisplayed[j])},'class':privateMethods.getColCss(object,colsDisplayed[j])}));}}}};$.fn.inputList=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.inputList');}}})(jQuery);
Index: /extensions/GrumPluginClasses/js/ui.inputNum.js
===================================================================
--- /extensions/GrumPluginClasses/js/ui.inputNum.js	(revision 8961)
+++ /extensions/GrumPluginClasses/js/ui.inputNum.js	(revision 8961)
@@ -0,0 +1,1072 @@
+/**
+ * -----------------------------------------------------------------------------
+ * file: ui.inputNum.js
+ * file version: 1.0.0
+ * date: 2010-11-02
+ *
+ * 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 =
+                    {
+                      numDec:0,
+                      minValue:'none',
+                      maxValue:'none',
+                      stepValue:1,
+                      showSlider:'no',
+                      disabled:false,
+                      textAlign:'right',
+                      btInc:'+',
+                      btDec:'-',
+                      unitValue:'',
+                      change: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,
+                    re:/^\d+$/,
+                    value:0,
+                    factor:1,
+                    isSlider:false,
+                    isValid:true,
+                    mouseIsOver:false,
+                    isSliderCurrentlyVisible:false,
+                    inputMargins:0
+                  }
+                );
+                properties=$this.data('properties');
+              }
+
+              if(!objects)
+              {
+                objects =
+                  {
+                    container:$('<div/>',
+                        {
+                          'class':'ui-inputNum',
+                          css:{
+                            width:'100%'
+                          }
+                        }
+                    ).bind('click.inputNum',
+                        function ()
+                        {
+                          objects.input.focus();
+                        }
+                      )
+                    .bind('mouseenter',
+                        function ()
+                        {
+                          properties.mouseIsOver=true;
+                        }
+                      )
+                    .bind('mouseleave',
+                        function ()
+                        {
+                          properties.mouseIsOver=false;
+                        }
+                      ),
+                    input:$('<input>',
+                      {
+                        type:"text",
+                        value:''
+                      }
+                    ).bind('focusout.inputNum',
+                        function ()
+                        {
+                          privateMethods.lostFocus($this);
+                        }
+                      )
+                      .bind('focus.inputNum',
+                          function ()
+                          {
+                            privateMethods.getFocus($this);
+                          }
+                        )
+                      .bind('keydown.inputNum',
+                          function (event)
+                          {
+                            return(privateMethods.keyDown($this, event));
+                          }
+                        )
+                      .bind('keyup.inputNum',
+                          function (event)
+                          {
+                            privateMethods.keyUp($this, event);
+                          }
+                        ),
+                    slider:$('<div/>',
+                      {
+                        css:{
+                          display:'none'
+                        }
+                      }
+                    ),
+                    extraContainer:$('<div/>',
+                      {
+                        'class':'ui-inputNum-extra'
+                      }
+                    ),
+                    unit:$('<div/>',
+                        {
+                          html: "",
+                          'class':'ui-inputNum-unit',
+                          css: {
+                            display:'none'
+                          }
+                        }
+                    ),
+                    btInc:$('<div/>',
+                      {
+                        'class':'ui-inputNum-btInc',
+                        tabindex:0
+                      }
+                    ).bind('click',
+                        function (event)
+                        {
+                          privateMethods.incValue($this);
+                        }
+                      )
+                     .bind('mousedown', function () { $(this).addClass('ui-inputNum-btInc-active'); } )
+                     .bind('mouseup', function () { $(this).removeClass('ui-inputNum-btInc-active'); } ),
+                    btDec:$('<div/>',
+                      {
+                        'class':'ui-inputNum-btDec',
+                        tabindex:0
+                      }
+                    ).bind('click',
+                        function (event)
+                        {
+                          privateMethods.decValue($this);
+                        }
+                      )
+                     .bind('mousedown', function () { $(this).addClass('ui-inputNum-btDec-active'); } )
+                     .bind('mouseup', function () { $(this).removeClass('ui-inputNum-btDec-active'); } )
+                  };
+
+                $this
+                  .html('')
+                  .append(objects.container.append(objects.input).append(objects.extraContainer.append(objects.unit).append(objects.btInc).append(objects.btDec)).append(objects.slider));
+
+                properties.inputMargins=objects.input.outerWidth(true)-objects.input.width();
+
+
+                $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.input.unbind().remove();
+              objects.btInc.unbind().remove();
+              objects.btDec.unbind().remove();
+              objects.container.unbind().remove();
+              $this
+                .unbind('.inputNum')
+                .css(
+                  {
+                    width:'',
+                    height:''
+                  }
+                );
+            }
+          );
+        }, // destroy
+
+      options: function (value)
+        {
+          return this.each(function()
+            {
+              privateMethods.setOptions($(this), value);
+            }
+          );
+        }, // options
+
+      showSlider: function (value)
+        {
+          if(value!=null)
+          {
+            this.each(function()
+              {
+                privateMethods.setShowSlider($(this), value);
+              }
+            );
+          }
+          else
+          {
+            var options = this.data('options');
+
+            if(options)
+            {
+              return(options.showSlider);
+            }
+            else
+            {
+              return('');
+            }
+          }
+        }, // showSlider
+
+      minValue: function (value)
+        {
+          if(value!=null)
+          {
+            return this.each(function()
+              {
+                privateMethods.setMinValue($(this), value);
+              }
+            );
+          }
+          else
+          {
+            var options = this.data('options');
+
+            if(options)
+            {
+              return(options.minValue);
+            }
+            else
+            {
+              return('');
+            }
+          }
+        }, // minValue
+
+      maxValue: function (value)
+        {
+          if(value!=null)
+          {
+            return this.each(function()
+              {
+                privateMethods.setMaxValue($(this), value);
+              }
+            );
+          }
+          else
+          {
+            var options = this.data('options');
+
+            if(options)
+            {
+              return(options.maxValue);
+            }
+            else
+            {
+              return('');
+            }
+          }
+        }, // maxValue
+
+      stepValue: function (value)
+        {
+          if(value!=null)
+          {
+            return this.each(function()
+              {
+                privateMethods.setStepValue($(this), value);
+              }
+            );
+          }
+          else
+          {
+            var options = this.data('options');
+
+            if(options)
+            {
+              return(options.stepValue);
+            }
+            else
+            {
+              return('');
+            }
+          }
+        }, // stepValue
+
+      numDec: function (value)
+        {
+          if(value!=null)
+          {
+            return this.each(function()
+              {
+                privateMethods.setNumDec($(this), value);
+              }
+            );
+          }
+          else
+          {
+            var options = this.data('options');
+
+            if(options)
+            {
+              return(options.numDec);
+            }
+            else
+            {
+              return('');
+            }
+          }
+        }, // numDec
+
+      unitValue: function (value)
+        {
+          if(value!=null)
+          {
+            return this.each(function()
+              {
+                privateMethods.setUnitValue($(this), value);
+              }
+            );
+          }
+          else
+          {
+            var options = this.data('options');
+
+            if(options)
+            {
+              return(options.unitValue);
+            }
+            else
+            {
+              return('');
+            }
+          }
+        }, // unitValue
+
+      disabled: function (value)
+        {
+          if(value!=null)
+          {
+            return this.each(function()
+              {
+                privateMethods.setDisabled($(this), value);
+              }
+            );
+          }
+          else
+          {
+            var options = this.data('options');
+
+            if(options)
+            {
+              return(options.disabled);
+            }
+            else
+            {
+              return('');
+            }
+          }
+        }, // disabled
+
+      textAlign: function (value)
+        {
+          if(value!=null)
+          {
+            return this.each(function()
+              {
+                privateMethods.setTextAlign($(this), value);
+              }
+            );
+          }
+          else
+          {
+            var options = this.data('options');
+
+            if(options)
+            {
+              return(options.textAlign);
+            }
+            else
+            {
+              return('');
+            }
+          }
+        }, // textAlign
+
+      btInc: function (value)
+        {
+          if(value!=null)
+          {
+            return this.each(function()
+              {
+                privateMethods.setBtInc($(this), value);
+              }
+            );
+          }
+          else
+          {
+            var options = this.data('options');
+
+            if(options)
+            {
+              return(options.btInc);
+            }
+            else
+            {
+              return('');
+            }
+          }
+        }, // btInc
+
+      btDec: function (value)
+        {
+          if(value!=null)
+          {
+            return this.each(function()
+              {
+                privateMethods.setBtDec($(this), value);
+              }
+            );
+          }
+          else
+          {
+            var options = this.data('options');
+
+            if(options)
+            {
+              return(options.btDec);
+            }
+            else
+            {
+              return('');
+            }
+          }
+        }, // btDec
+
+
+      value: function (value)
+        {
+          if(value!=null)
+          {
+            // set selected value
+            return this.each(function()
+              {
+                privateMethods.setValue($(this), value, true);
+              }
+            );
+          }
+          else
+          {
+            // return the selected tags
+            var properties=this.data('properties');
+            return(properties.value);
+          }
+        }, // value
+
+      isValid: function (value)
+        {
+          if(value!=null)
+          {
+            // set selected value
+            return this.each(function()
+              {
+                privateMethods.setIsValid($(this), value);
+              }
+            );
+          }
+          else
+          {
+            // return the selected tags
+            var properties=this.data('properties');
+            return(properties.isValid);
+          }
+        }, // isValid
+
+      change: function (value)
+        {
+          if(value!=null && $.isFunction(value))
+          {
+            // set selected value
+            return this.each(function()
+              {
+                privateMethods.setEventChange($(this), value);
+              }
+            );
+          }
+          else
+          {
+            // return the selected value
+            var options=this.data('options');
+
+            if(options)
+            {
+              return(options.change);
+            }
+            else
+            {
+              return(null);
+            }
+          }
+        } // change
+
+    }; // methods
+
+
+    /*
+     * plugin 'private' methods
+     */
+    var privateMethods =
+    {
+      /**
+       * return true is given value is a valid numeric value, according to the
+       * rules defined by the object
+       * @param Object object
+       * @param value
+       * @return Bool
+       */
+      isValid : function (object, value)
+        {
+          var properties=object.data('properties');
+
+          return(properties.re.exec(value))
+        },
+
+      /**
+       * define the regular expression used to check validity of a numeric value
+       * @param Object object
+       */
+      setRE : function (object)
+        {
+          var properties=object.data('properties'),
+              options=object.data('options'),
+              tmpRe="\\d+";
+
+          if(options.numDec>0)
+          {
+            tmpRe+="(\\.\\d{0,"+options.numDec+"})?";
+          }
+          tmpRe+="$";
+
+          if(options.minValue=='none' || options.minValue!='none' && options.minValue<0 )
+          {
+            if(options.maxValue!='none' && options.maxValue<0)
+            {
+              tmpRe="\\-"+tmpRe;
+            }
+            else
+            {
+              tmpRe="(\\-)?"+tmpRe;
+            }
+          }
+          tmpRe="^"+tmpRe;
+          properties.re = new RegExp(tmpRe);
+        },
+
+      setOptions : function (object, value)
+        {
+          var properties=object.data('properties'),
+              options=object.data('options');
+
+          if(!$.isPlainObject(value)) return(false);
+
+          properties.initialized=false;
+
+          privateMethods.setNumDec(object, (value.numDec!=null)?value.numDec:options.numDec);
+          privateMethods.setStepValue(object, (value.stepValue!=null)?value.stepValue:options.stepValue);
+          privateMethods.setMinValue(object, (value.minValue!=null)?value.minValue:options.minValue);
+          privateMethods.setMaxValue(object, (value.maxValue!=null)?value.maxValue:options.maxValue);
+          privateMethods.setValue(object, (value.value!=null)?value.value:options.value, true);
+
+          privateMethods.setUnitValue(object, (value.unitValue!=null)?value.unitValue:options.unitValue);
+          privateMethods.setShowSlider(object, (value.showSlider!=null)?value.showSlider:options.showSlider);
+          privateMethods.setDisabled(object, (value.disabled!=null)?value.disabled:options.disabled);
+          privateMethods.setBtInc(object, (value.btInc!=null)?value.btInc:options.btInc);
+          privateMethods.setBtDec(object, (value.btDec!=null)?value.btDec:options.btDec);
+          privateMethods.setTextAlign(object, (value.textAlign!=null)?value.textAlign:options.textAlign);
+
+          privateMethods.setEventChange(object, (value.change!=null)?value.change:options.change);
+
+          privateMethods.calculateInputWidth(object);
+
+          properties.initialized=true;
+        },
+
+      setIsValid : function (object, value)
+        {
+          var objects=object.data('objects'),
+              properties=object.data('properties');
+
+          if(properties.isValid!=value)
+          {
+            properties.isValid=value;
+            if(properties.isValid)
+            {
+              objects.container.removeClass('ui-error');
+              objects.input.removeClass('ui-error');
+            }
+            else
+            {
+              objects.container.addClass('ui-error');
+              objects.input.addClass('ui-error');
+            }
+          }
+          return(properties.isValid);
+        },
+
+      setNumDec : function (object, value)
+        {
+          var options=object.data('options'),
+              properties=object.data('properties');
+
+          if((!properties.initialized || options.numDec!=value) && value>=0 && value<=15)
+          {
+            options.numDec=value;
+            privateMethods.setRE(object);
+            properties.factor=Math.pow(10,options.numDec);
+          }
+          return(options.numDec);
+        },
+
+      setStepValue : function (object, value)
+        {
+          var options=object.data('options'),
+              properties=object.data('properties');
+
+          if((!properties.initialized || options.stepValue!=value) && value>0 && privateMethods.isValid(object, value))
+          {
+            options.stepValue=value;
+          }
+          return(options.stepValue);
+        },
+
+      setShowSlider : function (object, value)
+        {
+          var options=object.data('options'),
+              objects=object.data('objects'),
+              properties=object.data('properties');
+
+          if((!properties.initialized || options.showSlider!=value) && (value=='no' || value=='yes' || value=='auto'))
+          {
+            options.showSlider=value;
+            privateMethods.manageSlider(object);
+          }
+          return(options.showSlider);
+        },
+
+      setMinValue : function (object, value)
+        {
+          var options=object.data('options'),
+              properties=object.data('properties');
+
+          if((!properties.initialized || options.minValue!=value) && (value=='none' || privateMethods.isValid(object, value)))
+          {
+            options.minValue=value;
+            if(options.minValue>options.maxValue) options.maxValue=options.minValue;
+            privateMethods.setRE(object);
+            privateMethods.manageSlider(object);
+          }
+          return(options.minValue);
+        },
+
+      setMaxValue : function (object, value)
+        {
+          var options=object.data('options'),
+              properties=object.data('properties');
+
+          if(
+              (!properties.initialized || options.maxValue!=value) &&
+              (value=='none' || privateMethods.isValid(object, value) &&
+                (options.minValue<=value && options.minValue!='none' || options.minValue=='none')
+              )
+            )
+          {
+            options.maxValue=value;
+            privateMethods.setRE(object);
+            privateMethods.manageSlider(object);
+          }
+          return(options.maxValue);
+        },
+
+      setUnitValue : function (object, value)
+        {
+          var options=object.data('options'),
+              objects=object.data('objects'),
+              properties=object.data('properties');
+
+          if(!properties.initialized || options.unitValue!=value)
+          {
+            options.unitValue=value;
+            objects.unit.html(options.unitValue).css('display', ($.trim(value)=='')?'none':'');
+
+            privateMethods.calculateInputWidth(object);
+          }
+          return(options.unitValue);
+        },
+
+      setBtInc : function (object, value)
+        {
+          var options=object.data('options'),
+              objects=object.data('objects'),
+              properties=object.data('properties');
+
+          if(!properties.initialized || options.btInc!=value)
+          {
+            options.btInc=value;
+            objects.btInc.html(options.btInc);
+          }
+          return(options.btInc);
+        },
+
+      setBtDec : function (object, value)
+        {
+          var options=object.data('options'),
+              objects=object.data('objects'),
+              properties=object.data('properties');
+
+          if(!properties.initialized || options.btDec!=value)
+          {
+            options.btDec=value;
+            objects.btDec.html(options.btDec);
+          }
+          return(options.btDec);
+        },
+
+      setDisabled : function (object, value)
+        {
+          var options=object.data('options'),
+              objects=object.data('objects'),
+              properties=object.data('properties');
+
+          if((!properties.initialized || options.disabled!=value) && (value==true || value==false))
+          {
+            options.disabled=value;
+            if(options.disabled)
+            {
+              objects.btDec.attr('disabled', true);
+              objects.btInc.attr('disabled', true);
+              objects.input.attr('disabled', true);
+            }
+            else
+            {
+              objects.input.attr('disabled', false);
+              privateMethods.setButtonsState(object);
+            }
+          }
+          return(options.disabled);
+        },
+
+      setTextAlign : function (object, value)
+        {
+          var options=object.data('options'),
+              objects=object.data('objects'),
+              properties=object.data('properties');
+
+          if((!properties.initialized || options.textAlign!=value) && (value=='left' || value=='right'))
+          {
+            options.textAlign=value;
+            objects.input.css('text-align', options.textAlign);
+          }
+          return(options.textAlign);
+        },
+
+      setButtonsState : function (object)
+        {
+          var options=object.data('options'),
+              objects=object.data('objects'),
+              properties=object.data('properties');
+
+          if(options.minValue!='none' && properties.value - options.stepValue < options.minValue)
+          {
+            objects.btDec.attr('disabled', true);
+          }
+          else
+          {
+            objects.btDec.attr('disabled', false);
+          }
+
+          if(options.maxValue!='none' && properties.value + options.stepValue > options.maxValue)
+          {
+            objects.btInc.attr('disabled', true);
+          }
+          else
+          {
+            objects.btInc.attr('disabled', false);
+          }
+        },
+
+      setValue : function (object, value, apply)
+        {
+          var options=object.data('options'),
+              properties=object.data('properties'),
+              objects=object.data('objects');
+
+          if(!privateMethods.isValid(object, value) ||
+              (!apply &&
+                (options.minValue!='none' && value < options.minValue ||
+                 options.maxValue!='none' && value > options.maxValue)
+              )
+            )
+          {
+            return(privateMethods.setIsValid(object, false));
+          }
+          else if(apply)
+          {
+            if(options.minValue!='none' && value < options.minValue) value=options.minValue;
+            if(options.maxValue!='none' && value > options.maxValue) value=options.maxValue;
+          }
+
+          privateMethods.setIsValid(object, true);
+
+          properties.value=value;
+          privateMethods.setButtonsState(object);
+
+          if(apply) objects.input.val(properties.value.toFixed(options.numDec));
+
+          if(properties.isSlider && properties.isSliderCurrentlyVisible) objects.slider.slider('value', properties.value);
+
+          if(options.change) object.trigger('inputNumChange', properties.value);
+
+          return(true);
+        }, //setValue
+
+      getFocus : function (object)
+        {
+          var objects=object.data('objects'),
+              options=object.data('options'),
+              properties=object.data('properties');
+
+          if(properties.isSlider && options.showSlider=='auto')
+          {
+            objects.slider
+              .css('display', 'block')
+              .css('width', (objects.container.width()-objects.slider.children('.ui-slider-handle').outerWidth(true))+'px')
+              .slider('value', properties.value);
+            properties.isSliderCurrentlyVisible=true;
+          }
+        },
+
+      lostFocus : function (object)
+        {
+          var objects=object.data('objects'),
+              options=object.data('options'),
+              properties=object.data('properties');
+
+          if(properties.mouseIsOver)
+          {
+            objects.input.focus();
+          }
+          else if(properties.isSlider && options.showSlider=='auto')
+          {
+            objects.slider.css('display', 'none');
+            properties.isSliderCurrentlyVisible=false;
+          }
+        },
+
+      setEventChange : function (object, value)
+        {
+          var options=object.data('options');
+
+          options.change=value;
+          object.unbind('inputNumChange');
+          if(value) object.bind('inputNumChange', options.change);
+          return(options.change);
+        },
+
+      keyUp : function (object, event)
+        {
+          var properties=object.data('properties'),
+              objects=object.data('objects');
+
+          if(!((event.keyCode>=48 && event.keyCode<=57) || //DOM_VK_0 - DOM_VK_9
+               (event.keyCode>=96 && event.keyCode<=105) || //DOM_VK_NUMPAD0 - DOM_VK_NUMPAD9
+                event.keyCode==190 || //DOT
+                event.keyCode==109 || //DOM_VK_SUBTRACT
+                event.keyCode==110 || //DOM_VK_DECIMAL
+                event.keyCode==8 || //DOM_VK_BACK_SPACE
+                event.keyCode==9 || //DOM_VK_TAB
+                event.keyCode==12 || //DOM_VK_CLEAR
+                event.keyCode==46 //DOM_VK_DELETE
+              )
+            ) return(false);
+
+          privateMethods.setValue(object, parseFloat(objects.input.val()), false);
+        },
+
+      keyDown : function (object, event)
+        {
+          var properties=object.data('properties'),
+              objects=object.data('objects');
+
+          if(!((event.keyCode>=48 && event.keyCode<=57) || //DOM_VK_0 - DOM_VK_9
+               (event.keyCode>=96 && event.keyCode<=105) || //DOM_VK_NUMPAD0 - DOM_VK_NUMPAD9
+                event.keyCode==190 || //DOT
+                event.keyCode==109 || //DOM_VK_SUBTRACT
+                event.keyCode==110 || //DOM_VK_DECIMAL
+                event.keyCode==8 || //DOM_VK_BACK_SPACE
+                event.keyCode==9 || //DOM_VK_TAB
+                event.keyCode==12 || //DOM_VK_CLEAR
+                event.keyCode==16 || //DOM_VK_SHIFT
+                event.keyCode==17 || //DOM_VK_CONTROL
+                event.keyCode==18 || //DOM_VK_ALT
+                event.keyCode==33 || //DOM_VK_PAGE_UP
+                event.keyCode==34 || //DOM_VK_PAGE_DOWN
+                event.keyCode==35 || //DOM_VK_END
+                event.keyCode==36 || //DOM_VK_HOME
+                event.keyCode==37 || //DOM_VK_LEFT
+                event.keyCode==38 || //DOM_VK_UP
+                event.keyCode==39 || //DOM_VK_RIGHT
+                event.keyCode==40 || //DOM_VK_DOWN
+                event.keyCode==45 || //DOM_VK_INSERT
+                event.keyCode==46 || //DOM_VK_DELETE
+                event.keyCode==93  //DOM_VK_CONTEXT_MENU
+              )
+            ) return(false);
+          return(true);
+        },
+
+      incValue : function (object)
+        {
+          var options=object.data('options'),
+              properties=object.data('properties');
+
+          nextValue=Math.round(properties.value*properties.factor+options.stepValue*properties.factor)/properties.factor;
+
+          if(options.maxValue=='none' || nextValue <= options.maxValue)
+          {
+            privateMethods.setValue(object, nextValue, true);
+          }
+        },
+
+      decValue : function (object)
+        {
+          var options=object.data('options'),
+              properties=object.data('properties');
+
+          nextValue=Math.round(properties.value*properties.factor-options.stepValue*properties.factor)/properties.factor;
+
+          if(options.minValue=='none' || nextValue >= options.minValue)
+          {
+            privateMethods.setValue(object, nextValue, true);
+          }
+        },
+
+      manageSlider : function (object)
+        {
+          var options=object.data('options'),
+              objects=object.data('objects'),
+              properties=object.data('properties');
+
+          if(!properties.isSlider && options.minValue!='none' && options.maxValue!='none' && (options.showSlider=='yes' || options.showSlider=='auto'))
+          {
+            properties.isSlider=true;
+            objects.slider.slider(
+              {
+                max:options.maxValue,
+                min:options.minValue,
+                step:options.stepValue,
+                value:properties.value,
+                slide:function (event, ui)
+                  {
+                    privateMethods.setValue(object, ui.value, true);
+                  }
+              }
+            );
+            objects.slider.children('.ui-slider-handle').bind('focusout', function () { privateMethods.lostFocus(object); } );
+            if(options.showSlider=='yes')
+            {
+              objects.slider
+                .css('display', 'block')
+                .css('width', (objects.container.width()-objects.slider.children('.ui-slider-handle').outerWidth(true))+'px');
+              properties.isSliderCurrentlyVisible=true;
+            }
+          }
+          else if(properties.isSlider && (options.minValue=='none' || options.maxValue=='none' || options.showSlider=='no'))
+          {
+            properties.isSlider=false;
+            properties.isSliderCurrentlyVisible=false;
+            objects.slider.slider('destroy');
+          }
+        },
+
+      calculateInputWidth : function (object)
+        {
+          var objects=object.data('objects'),
+              properties=object.data('properties');          
+          
+          objects.input.css('width', (objects.container.width()-objects.extraContainer.outerWidth()-properties.inputMargins)+'px');
+        }
+
+    };
+
+
+    $.fn.inputNum = 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.inputNum' );
+      }
+    } // $.fn.inputNum
+
+  }
+)(jQuery);
+
+
Index: /extensions/GrumPluginClasses/js/ui.inputNum.min.js
===================================================================
--- /extensions/GrumPluginClasses/js/ui.inputNum.min.js	(revision 8961)
+++ /extensions/GrumPluginClasses/js/ui.inputNum.min.js	(revision 8961)
@@ -0,0 +1,208 @@
+/* file: ui.inputNum.js - v1.0.0 | minified on 2011/01/27 with http://jscompress.com/ */
+(function($)
+{var publicMethods={init:function(opt)
+{return this.each(function()
+{var $this=$(this),data=$this.data('options'),objects=$this.data('objects'),properties=$this.data('properties'),options={numDec:0,minValue:'none',maxValue:'none',stepValue:1,showSlider:'no',disabled:false,textAlign:'right',btInc:'+',btDec:'-',unitValue:'',change:null};$this.data('options',options);if(!properties)
+{$this.data('properties',{initialized:false,re:/^\d+$/,value:0,factor:1,isSlider:false,isValid:true,mouseIsOver:false,isSliderCurrentlyVisible:false,inputMargins:0});properties=$this.data('properties');}
+if(!objects)
+{objects={container:$('<div/>',{'class':'ui-inputNum',css:{width:'100%'}}).bind('click.inputNum',function()
+{objects.input.focus();}).bind('mouseenter',function()
+{properties.mouseIsOver=true;}).bind('mouseleave',function()
+{properties.mouseIsOver=false;}),input:$('<input>',{type:"text",value:''}).bind('focusout.inputNum',function()
+{privateMethods.lostFocus($this);}).bind('focus.inputNum',function()
+{privateMethods.getFocus($this);}).bind('keydown.inputNum',function(event)
+{return(privateMethods.keyDown($this,event));}).bind('keyup.inputNum',function(event)
+{privateMethods.keyUp($this,event);}),slider:$('<div/>',{css:{display:'none'}}),extraContainer:$('<div/>',{'class':'ui-inputNum-extra'}),unit:$('<div/>',{html:"",'class':'ui-inputNum-unit',css:{display:'none'}}),btInc:$('<div/>',{'class':'ui-inputNum-btInc',tabindex:0}).bind('click',function(event)
+{privateMethods.incValue($this);}).bind('mousedown',function(){$(this).addClass('ui-inputNum-btInc-active');}).bind('mouseup',function(){$(this).removeClass('ui-inputNum-btInc-active');}),btDec:$('<div/>',{'class':'ui-inputNum-btDec',tabindex:0}).bind('click',function(event)
+{privateMethods.decValue($this);}).bind('mousedown',function(){$(this).addClass('ui-inputNum-btDec-active');}).bind('mouseup',function(){$(this).removeClass('ui-inputNum-btDec-active');})};$this.html('').append(objects.container.append(objects.input).append(objects.extraContainer.append(objects.unit).append(objects.btInc).append(objects.btDec)).append(objects.slider));properties.inputMargins=objects.input.outerWidth(true)-objects.input.width();$this.data('objects',objects);}
+privateMethods.setOptions($this,opt);});},destroy:function()
+{return this.each(function()
+{var $this=$(this),objects=$this.data('objects');objects.input.unbind().remove();objects.btInc.unbind().remove();objects.btDec.unbind().remove();objects.container.unbind().remove();$this.unbind('.inputNum').css({width:'',height:''});});},options:function(value)
+{return this.each(function()
+{privateMethods.setOptions($(this),value);});},showSlider:function(value)
+{if(value!=null)
+{this.each(function()
+{privateMethods.setShowSlider($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.showSlider);}
+else
+{return('');}}},minValue:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setMinValue($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.minValue);}
+else
+{return('');}}},maxValue:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setMaxValue($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.maxValue);}
+else
+{return('');}}},stepValue:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setStepValue($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.stepValue);}
+else
+{return('');}}},numDec:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setNumDec($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.numDec);}
+else
+{return('');}}},unitValue:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setUnitValue($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.unitValue);}
+else
+{return('');}}},disabled:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setDisabled($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.disabled);}
+else
+{return('');}}},textAlign:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setTextAlign($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.textAlign);}
+else
+{return('');}}},btInc:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setBtInc($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.btInc);}
+else
+{return('');}}},btDec:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setBtDec($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.btDec);}
+else
+{return('');}}},value:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setValue($(this),value,true);});}
+else
+{var properties=this.data('properties');return(properties.value);}},isValid:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setIsValid($(this),value);});}
+else
+{var properties=this.data('properties');return(properties.isValid);}},change:function(value)
+{if(value!=null&&$.isFunction(value))
+{return this.each(function()
+{privateMethods.setEventChange($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.change);}
+else
+{return(null);}}}};var privateMethods={isValid:function(object,value)
+{var properties=object.data('properties');return(properties.re.exec(value))},setRE:function(object)
+{var properties=object.data('properties'),options=object.data('options'),tmpRe="\\d+";if(options.numDec>0)
+{tmpRe+="(\\.\\d{0,"+options.numDec+"})?";}
+tmpRe+="$";if(options.minValue=='none'||options.minValue!='none'&&options.minValue<0)
+{if(options.maxValue!='none'&&options.maxValue<0)
+{tmpRe="\\-"+tmpRe;}
+else
+{tmpRe="(\\-)?"+tmpRe;}}
+tmpRe="^"+tmpRe;properties.re=new RegExp(tmpRe);},setOptions:function(object,value)
+{var properties=object.data('properties'),options=object.data('options');if(!$.isPlainObject(value))return(false);properties.initialized=false;privateMethods.setNumDec(object,(value.numDec!=null)?value.numDec:options.numDec);privateMethods.setStepValue(object,(value.stepValue!=null)?value.stepValue:options.stepValue);privateMethods.setMinValue(object,(value.minValue!=null)?value.minValue:options.minValue);privateMethods.setMaxValue(object,(value.maxValue!=null)?value.maxValue:options.maxValue);privateMethods.setValue(object,(value.value!=null)?value.value:options.value,true);privateMethods.setUnitValue(object,(value.unitValue!=null)?value.unitValue:options.unitValue);privateMethods.setShowSlider(object,(value.showSlider!=null)?value.showSlider:options.showSlider);privateMethods.setDisabled(object,(value.disabled!=null)?value.disabled:options.disabled);privateMethods.setBtInc(object,(value.btInc!=null)?value.btInc:options.btInc);privateMethods.setBtDec(object,(value.btDec!=null)?value.btDec:options.btDec);privateMethods.setTextAlign(object,(value.textAlign!=null)?value.textAlign:options.textAlign);privateMethods.setEventChange(object,(value.change!=null)?value.change:options.change);privateMethods.calculateInputWidth(object);properties.initialized=true;},setIsValid:function(object,value)
+{var objects=object.data('objects'),properties=object.data('properties');if(properties.isValid!=value)
+{properties.isValid=value;if(properties.isValid)
+{objects.container.removeClass('ui-error');objects.input.removeClass('ui-error');}
+else
+{objects.container.addClass('ui-error');objects.input.addClass('ui-error');}}
+return(properties.isValid);},setNumDec:function(object,value)
+{var options=object.data('options'),properties=object.data('properties');if((!properties.initialized||options.numDec!=value)&&value>=0&&value<=15)
+{options.numDec=value;privateMethods.setRE(object);properties.factor=Math.pow(10,options.numDec);}
+return(options.numDec);},setStepValue:function(object,value)
+{var options=object.data('options'),properties=object.data('properties');if((!properties.initialized||options.stepValue!=value)&&value>0&&privateMethods.isValid(object,value))
+{options.stepValue=value;}
+return(options.stepValue);},setShowSlider:function(object,value)
+{var options=object.data('options'),objects=object.data('objects'),properties=object.data('properties');if((!properties.initialized||options.showSlider!=value)&&(value=='no'||value=='yes'||value=='auto'))
+{options.showSlider=value;privateMethods.manageSlider(object);}
+return(options.showSlider);},setMinValue:function(object,value)
+{var options=object.data('options'),properties=object.data('properties');if((!properties.initialized||options.minValue!=value)&&(value=='none'||privateMethods.isValid(object,value)))
+{options.minValue=value;if(options.minValue>options.maxValue)options.maxValue=options.minValue;privateMethods.setRE(object);privateMethods.manageSlider(object);}
+return(options.minValue);},setMaxValue:function(object,value)
+{var options=object.data('options'),properties=object.data('properties');if((!properties.initialized||options.maxValue!=value)&&(value=='none'||privateMethods.isValid(object,value)&&(options.minValue<=value&&options.minValue!='none'||options.minValue=='none')))
+{options.maxValue=value;privateMethods.setRE(object);privateMethods.manageSlider(object);}
+return(options.maxValue);},setUnitValue:function(object,value)
+{var options=object.data('options'),objects=object.data('objects'),properties=object.data('properties');if(!properties.initialized||options.unitValue!=value)
+{options.unitValue=value;objects.unit.html(options.unitValue).css('display',($.trim(value)=='')?'none':'');privateMethods.calculateInputWidth(object);}
+return(options.unitValue);},setBtInc:function(object,value)
+{var options=object.data('options'),objects=object.data('objects'),properties=object.data('properties');if(!properties.initialized||options.btInc!=value)
+{options.btInc=value;objects.btInc.html(options.btInc);}
+return(options.btInc);},setBtDec:function(object,value)
+{var options=object.data('options'),objects=object.data('objects'),properties=object.data('properties');if(!properties.initialized||options.btDec!=value)
+{options.btDec=value;objects.btDec.html(options.btDec);}
+return(options.btDec);},setDisabled:function(object,value)
+{var options=object.data('options'),objects=object.data('objects'),properties=object.data('properties');if((!properties.initialized||options.disabled!=value)&&(value==true||value==false))
+{options.disabled=value;if(options.disabled)
+{objects.btDec.attr('disabled',true);objects.btInc.attr('disabled',true);objects.input.attr('disabled',true);}
+else
+{objects.input.attr('disabled',false);privateMethods.setButtonsState(object);}}
+return(options.disabled);},setTextAlign:function(object,value)
+{var options=object.data('options'),objects=object.data('objects'),properties=object.data('properties');if((!properties.initialized||options.textAlign!=value)&&(value=='left'||value=='right'))
+{options.textAlign=value;objects.input.css('text-align',options.textAlign);}
+return(options.textAlign);},setButtonsState:function(object)
+{var options=object.data('options'),objects=object.data('objects'),properties=object.data('properties');if(options.minValue!='none'&&properties.value-options.stepValue<options.minValue)
+{objects.btDec.attr('disabled',true);}
+else
+{objects.btDec.attr('disabled',false);}
+if(options.maxValue!='none'&&properties.value+options.stepValue>options.maxValue)
+{objects.btInc.attr('disabled',true);}
+else
+{objects.btInc.attr('disabled',false);}},setValue:function(object,value,apply)
+{var options=object.data('options'),properties=object.data('properties'),objects=object.data('objects');if(!privateMethods.isValid(object,value)||(!apply&&(options.minValue!='none'&&value<options.minValue||options.maxValue!='none'&&value>options.maxValue)))
+{return(privateMethods.setIsValid(object,false));}
+else if(apply)
+{if(options.minValue!='none'&&value<options.minValue)value=options.minValue;if(options.maxValue!='none'&&value>options.maxValue)value=options.maxValue;}
+privateMethods.setIsValid(object,true);properties.value=value;privateMethods.setButtonsState(object);if(apply)objects.input.val(properties.value.toFixed(options.numDec));if(properties.isSlider&&properties.isSliderCurrentlyVisible)objects.slider.slider('value',properties.value);if(options.change)object.trigger('inputNumChange',properties.value);return(true);},getFocus:function(object)
+{var objects=object.data('objects'),options=object.data('options'),properties=object.data('properties');if(properties.isSlider&&options.showSlider=='auto')
+{objects.slider.css('display','block').css('width',(objects.container.width()-objects.slider.children('.ui-slider-handle').outerWidth(true))+'px').slider('value',properties.value);properties.isSliderCurrentlyVisible=true;}},lostFocus:function(object)
+{var objects=object.data('objects'),options=object.data('options'),properties=object.data('properties');if(properties.mouseIsOver)
+{objects.input.focus();}
+else if(properties.isSlider&&options.showSlider=='auto')
+{objects.slider.css('display','none');properties.isSliderCurrentlyVisible=false;}},setEventChange:function(object,value)
+{var options=object.data('options');options.change=value;object.unbind('inputNumChange');if(value)object.bind('inputNumChange',options.change);return(options.change);},keyUp:function(object,event)
+{var properties=object.data('properties'),objects=object.data('objects');if(!((event.keyCode>=48&&event.keyCode<=57)||(event.keyCode>=96&&event.keyCode<=105)||event.keyCode==190||event.keyCode==109||event.keyCode==110||event.keyCode==8||event.keyCode==9||event.keyCode==12||event.keyCode==46))return(false);privateMethods.setValue(object,parseFloat(objects.input.val()),false);},keyDown:function(object,event)
+{var properties=object.data('properties'),objects=object.data('objects');if(!((event.keyCode>=48&&event.keyCode<=57)||(event.keyCode>=96&&event.keyCode<=105)||event.keyCode==190||event.keyCode==109||event.keyCode==110||event.keyCode==8||event.keyCode==9||event.keyCode==12||event.keyCode==16||event.keyCode==17||event.keyCode==18||event.keyCode==33||event.keyCode==34||event.keyCode==35||event.keyCode==36||event.keyCode==37||event.keyCode==38||event.keyCode==39||event.keyCode==40||event.keyCode==45||event.keyCode==46||event.keyCode==93))return(false);return(true);},incValue:function(object)
+{var options=object.data('options'),properties=object.data('properties');nextValue=Math.round(properties.value*properties.factor+options.stepValue*properties.factor)/properties.factor;if(options.maxValue=='none'||nextValue<=options.maxValue)
+{privateMethods.setValue(object,nextValue,true);}},decValue:function(object)
+{var options=object.data('options'),properties=object.data('properties');nextValue=Math.round(properties.value*properties.factor-options.stepValue*properties.factor)/properties.factor;if(options.minValue=='none'||nextValue>=options.minValue)
+{privateMethods.setValue(object,nextValue,true);}},manageSlider:function(object)
+{var options=object.data('options'),objects=object.data('objects'),properties=object.data('properties');if(!properties.isSlider&&options.minValue!='none'&&options.maxValue!='none'&&(options.showSlider=='yes'||options.showSlider=='auto'))
+{properties.isSlider=true;objects.slider.slider({max:options.maxValue,min:options.minValue,step:options.stepValue,value:properties.value,slide:function(event,ui)
+{privateMethods.setValue(object,ui.value,true);}});objects.slider.children('.ui-slider-handle').bind('focusout',function(){privateMethods.lostFocus(object);});if(options.showSlider=='yes')
+{objects.slider.css('display','block').css('width',(objects.container.width()-objects.slider.children('.ui-slider-handle').outerWidth(true))+'px');properties.isSliderCurrentlyVisible=true;}}
+else if(properties.isSlider&&(options.minValue=='none'||options.maxValue=='none'||options.showSlider=='no'))
+{properties.isSlider=false;properties.isSliderCurrentlyVisible=false;objects.slider.slider('destroy');}},calculateInputWidth:function(object)
+{var objects=object.data('objects'),properties=object.data('properties');objects.input.css('width',(objects.container.width()-objects.extraContainer.outerWidth()-properties.inputMargins)+'px');}};$.fn.inputNum=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.inputNum');}}})(jQuery);
Index: /extensions/GrumPluginClasses/js/ui.inputPosition.js
===================================================================
--- /extensions/GrumPluginClasses/js/ui.inputPosition.js	(revision 8961)
+++ /extensions/GrumPluginClasses/js/ui.inputPosition.js	(revision 8961)
@@ -0,0 +1,689 @@
+/**
+ * -----------------------------------------------------------------------------
+ * file: ui.inputPosition.js
+ * file version: 1.0.0
+ * date: 2010-11-05
+ *
+ * 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 =
+                    {
+                      disabled:false,
+                      width:0,
+                      height:0,
+                      values:['center', 'corners', 'sides'],
+                      change: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,
+                    value:'',
+                    isValid:true,
+                    radioH:0,
+                    radioW:0
+                  }
+                );
+                properties=$this.data('properties');
+              }
+
+              if(!objects)
+              {
+                objects =
+                  {
+                    container:$('<div/>',
+                        {
+                          'class':'ui-inputPosition',
+                          css:{
+                            width:'100%'
+                          }
+                        }
+                    ),
+                    radios:
+                      {
+                        corners:[],
+                        sides:[],
+                        center:[]
+                      }
+                  };
+
+                var name=$this.get(0).id,
+                    values=['TL', 'TR', 'BR', 'BL'];
+
+                for(var i=0;i<values.length;i++)
+                {
+                  objects.radios.corners.push(
+                    $('<input>',
+                        {
+                          type:'radio',
+                          id:name+values[i],
+                          name:'ip_'+name,
+                          value:values[i],
+                          group:'corners'
+                        }
+                    ).appendTo(objects.container)
+                  );
+                }
+
+                values=['T', 'L', 'B', 'R'];
+                for(var i=0;i<values.length;i++)
+                {
+                  objects.radios.sides.push(
+                    $('<input>',
+                        {
+                          type:'radio',
+                          id:name+values[i],
+                          name:'ip_'+name,
+                          value:values[i],
+                          group:'sides'
+                        }
+                    ).appendTo(objects.container)
+                  )
+                }
+
+                values=['C'];
+                for(var i=0;i<values.length;i++)
+                {
+                  objects.radios.center.push(
+                    $('<input>',
+                        {
+                          type:'radio',
+                          id:name+values[i],
+                          name:'ip_'+name,
+                          value:values[i],
+                          group:'center'
+                        }
+                    ).appendTo(objects.container)
+                  )
+                }
+
+                objects.container.find('input').bind('click',
+                  function (event)
+                  {
+                    privateMethods.setValue($this, $(this).attr('value'), false);
+                  }
+                );
+
+                $this
+                  .html('')
+                  .append(objects.container);
+
+                properties.radioW=objects.container.find('input').first().outerWidth()/2;
+                properties.radioH=objects.container.find('input').first().outerHeight()/2;
+                $this.css('padding', properties.radioH+'px '+properties.radioW+'px');
+
+                $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.input.unbind().remove();
+              objects.container.unbind().remove();
+              $this
+                .unbind('.inputPosition')
+                .css(
+                  {
+                    width:'',
+                    height:''
+                  }
+                );
+            }
+          );
+        }, // destroy
+
+      options: function (value)
+        {
+          return this.each(function()
+            {
+              privateMethods.setOptions($(this), value);
+            }
+          );
+        }, // options
+
+      disabled: function (value)
+        {
+          if(value!=null)
+          {
+            return this.each(function()
+              {
+                privateMethods.setDisabled($(this), value);
+              }
+            );
+          }
+          else
+          {
+            var options = this.data('options');
+
+            if(options)
+            {
+              return(options.disabled);
+            }
+            else
+            {
+              return('');
+            }
+          }
+        }, // disabled
+
+      width: function (value)
+        {
+          if(value!=null)
+          {
+            return this.each(function()
+              {
+                privateMethods.setWidth($(this), value);
+              }
+            );
+          }
+          else
+          {
+            var options = this.data('options');
+
+            if(options)
+            {
+              return(options.width);
+            }
+            else
+            {
+              return('');
+            }
+          }
+        }, // width
+
+      height: function (value)
+        {
+          if(value!=null)
+          {
+            return this.each(function()
+              {
+                privateMethods.setHeight($(this), value);
+              }
+            );
+          }
+          else
+          {
+            var options = this.data('options');
+
+            if(options)
+            {
+              return(options.height);
+            }
+            else
+            {
+              return('');
+            }
+          }
+        }, // width
+
+      values: function (value)
+        {
+          if(value!=null)
+          {
+            return this.each(function()
+              {
+                privateMethods.setValues($(this), value);
+              }
+            );
+          }
+          else
+          {
+            var options = this.data('options');
+
+            if(options)
+            {
+              return(options.values);
+            }
+            else
+            {
+              return('');
+            }
+          }
+        }, // values
+
+      value: function (value)
+        {
+          if(value!=null)
+          {
+            // set selected value
+            return this.each(function()
+              {
+                privateMethods.setValue($(this), value, true);
+              }
+            );
+          }
+          else
+          {
+            // return the selected tags
+            var properties=this.data('properties');
+            return(properties.value);
+          }
+        }, // value
+
+      isValid: function (value)
+        {
+          if(value!=null)
+          {
+            // set selected value
+            return this.each(function()
+              {
+                privateMethods.setIsValid($(this), value);
+              }
+            );
+          }
+          else
+          {
+            // return the selected tags
+            var properties=this.data('properties');
+            return(properties.isValid);
+          }
+        }, // isValid
+
+      change: function (value)
+        {
+          if(value!=null && $.isFunction(value))
+          {
+            // set selected value
+            return this.each(function()
+              {
+                privateMethods.setEventChange($(this), value);
+              }
+            );
+          }
+          else
+          {
+            // return the selected value
+            var options=this.data('options');
+
+            if(options)
+            {
+              return(options.change);
+            }
+            else
+            {
+              return(null);
+            }
+          }
+        } // change
+
+
+    }; // 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.setValues(object, (value.values!=null)?value.values:options.values);
+          privateMethods.setHeight(object, (value.height!=null)?value.height:options.height, true);
+          privateMethods.setWidth(object, (value.width!=null)?value.width:options.width, true);
+          privateMethods.setValue(object, (value.value!=null)?value.value:options.value, true);
+          privateMethods.setDisabled(object, (value.disabled!=null)?value.disabled:options.disabled);
+
+          privateMethods.setEventChange(object, (value.change!=null)?value.change:options.change);
+
+          properties.initialized=true;
+        },
+
+      setIsValid : function (object, value)
+        {
+          var objects=object.data('objects'),
+              properties=object.data('properties');
+
+          if(properties.isValid!=value)
+          {
+            properties.isValid=value;
+            if(properties.isValid)
+            {
+              objects.container.removeClass('ui-error');
+              objects.input.removeClass('ui-error');
+            }
+            else
+            {
+              objects.container.addClass('ui-error');
+              objects.input.addClass('ui-error');
+            }
+          }
+          return(properties.isValid);
+        },
+
+      setDisabled : function (object, value)
+        {
+          var options=object.data('options'),
+              properties=object.data('properties');
+
+          if((!properties.initialized || options.disabled!=value) && (value==true || value==false))
+          {
+            options.disabled=value;
+
+          }
+          return(options.disabled);
+        },
+
+      setHeight : function (object, value)
+        {
+          var options=object.data('options'),
+              objects=object.data('objects'),
+              properties=object.data('properties');
+
+          if((!properties.initialized || options.height!=value) && value>=0)
+          {
+            if(value==0)
+            {
+              options.height=value;
+              objects.container.css('height', '100%');
+            }
+            else
+            {
+              options.height=value;
+              objects.container.css('height', options.height+'px');
+            }
+          }
+          privateMethods.setRadioPosition(object);
+          return(options.height);
+        }, //setHeight
+
+      setWidth : function (object, value)
+        {
+          var options=object.data('options'),
+              objects=object.data('objects'),
+              properties=object.data('properties');
+
+          if((!properties.initialized || options.width!=value) && value>=0)
+          {
+            if(value==0)
+            {
+              options.width=value;
+              objects.container.css('width', '100%');
+            }
+            else
+            {
+              options.width=value;
+              objects.container.css('width', options.width+'px');
+            }
+            privateMethods.setRadioPosition(object);
+          }
+          return(options.width);
+        }, //setWidth
+
+      setValues : function (object, value)
+        {
+          var options=object.data('options'),
+              objects=object.data('objects');
+
+          if(!$.isArray(value)) value=[value];
+
+          options.values=[];
+
+          object.find('input').hide();
+
+          for(var i=0;i<value.length;i++)
+          {
+            if(value[i]=='center' || value[i]=='corners' || value[i]=='sides')
+            {
+              options.values.push(value[i]);
+              object.find('input[group='+value[i]+']').show();
+            }
+          }
+
+          return(true);
+        }, //setValue
+
+
+      setValue : function (object, value, apply)
+        {
+          var options=object.data('options'),
+              properties=object.data('properties'),
+              objects=object.data('objects');
+
+          if(!(($.inArray('center', options.values)>-1 && value=='C') ||
+               ($.inArray('corners', options.values)>-1 && (value=='TL' || value=='TR' || value=='BR' || value=='BL')) ||
+               ($.inArray('sides', options.values)>-1 && (value=='L' || value=='R' || value=='B' || value=='T'))
+              )
+            ) return(false);
+
+          properties.value=value;
+
+          if(apply)
+          {
+            switch(properties.value)
+            {
+              case 'TL':
+                objects.radios.corners[0].attr('checked', true);
+                break;
+              case 'TR':
+                objects.radios.corners[1].attr('checked', true);
+                break;
+              case 'BR':
+                objects.radios.corners[2].attr('checked', true);
+                break;
+              case 'BL':
+                objects.radios.corners[3].attr('checked', true);
+                break;
+              case 'T':
+                objects.radios.sides[0].attr('checked', true);
+                break;
+              case 'L':
+                objects.radios.sides[1].attr('checked', true);
+                break;
+              case 'B':
+                objects.radios.sides[2].attr('checked', true);
+                break;
+              case 'R':
+                objects.radios.sides[3].attr('checked', true);
+                break;
+              case 'C':
+                objects.radios.center[0].attr('checked', true);
+                break;
+            }
+          }
+
+          if(options.change) object.trigger('inputPositionChange', properties.value);
+
+          return(true);
+        }, //setValue
+
+      setEventChange : function (object, value)
+        {
+          var options=object.data('options');
+
+          options.change=value;
+          object.unbind('inputPositionChange');
+          if(value) object.bind('inputPositionChange', options.change);
+          return(options.change);
+        },
+
+      setRadioPosition : function (object)
+        {
+          var options=object.data('options'),
+              objects=object.data('objects'),
+              properties=object.data('properties');
+
+          if($.inArray('center', options.values)>-1)
+          {
+            objects.radios.center[0].css(
+              {
+                'margin-left':(options.width/2-properties.radioW)+'px',
+                'margin-top':(options.height/2-properties.radioH)+'px'
+              }
+            );
+          }
+          if($.inArray('corners', options.values)>-1)
+          {
+            for(var i=0;i<objects.radios.corners.length;i++)
+            {
+              switch(objects.radios.corners[i].attr('value'))
+              {
+                case 'TL':
+                  objects.radios.corners[i].css(
+                    {
+                      'margin-left':'-'+properties.radioW+'px',
+                      'margin-top':'-'+properties.radioH+'px'
+                    }
+                  );
+                  break;
+                case 'TR':
+                  objects.radios.corners[i].css(
+                    {
+                      'margin-left':(options.width-properties.radioW)+'px',
+                      'margin-top':'-'+properties.radioH+'px'
+                    }
+                  );
+                  break;
+                case 'BR':
+                  objects.radios.corners[i].css(
+                    {
+                      'margin-left':(options.width-properties.radioW)+'px',
+                      'margin-top':(options.height-properties.radioH)+'px'
+                    }
+                  );
+                  break;
+                case 'BL':
+                  objects.radios.corners[i].css(
+                    {
+                      'margin-left':'-'+properties.radioW+'px',
+                      'margin-top':(options.height-properties.radioH)+'px'
+                    }
+                  );
+                  break;
+              }
+            }
+          }
+          if($.inArray('sides', options.values)>-1)
+          {
+            w=objects.radios.sides[0].width();
+            h=objects.radios.sides[0].height();
+
+            for(var i=0;i<objects.radios.sides.length;i++)
+            {
+              switch(objects.radios.sides[i].attr('value'))
+              {
+                case 'L':
+                  objects.radios.sides[i].css(
+                    {
+                      'margin-left':'-'+properties.radioW+'px',
+                      'margin-top':(options.height/2-properties.radioH)+'px'
+                    }
+                  );
+                  break;
+                case 'T':
+                  objects.radios.sides[i].css(
+                    {
+                      'margin-left':(options.width/2-properties.radioW)+'px',
+                      'margin-top':'-'+properties.radioH+'px'
+                    }
+                  );
+                  break;
+                case 'R':
+                  objects.radios.sides[i].css(
+                    {
+                      'margin-left':(options.width-properties.radioW)+'px',
+                      'margin-top':(options.height/2-properties.radioH)+'px'
+                    }
+                  );
+                  break;
+                case 'B':
+                  objects.radios.sides[i].css(
+                    {
+                      'margin-left':(options.width/2-properties.radioW)+'px',
+                      'margin-top':(options.height-properties.radioH)+'px'
+                    }
+                  );
+                  break;
+              }
+            }
+          }
+        }
+
+    };
+
+    $.fn.inputPosition = 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.inputPosition' );
+      }
+    } // $.fn.inputPosition
+
+  }
+)(jQuery);
+
+
Index: /extensions/GrumPluginClasses/js/ui.inputPosition.min.js
===================================================================
--- /extensions/GrumPluginClasses/js/ui.inputPosition.min.js	(revision 8961)
+++ /extensions/GrumPluginClasses/js/ui.inputPosition.min.js	(revision 8961)
@@ -0,0 +1,118 @@
+/* file: ui.inputPosition.js - v1.0.0 | minified on 2011/01/27 with http://jscompress.com/ */
+(function($)
+{var publicMethods={init:function(opt)
+{return this.each(function()
+{var $this=$(this),data=$this.data('options'),objects=$this.data('objects'),properties=$this.data('properties'),options={disabled:false,width:0,height:0,values:['center','corners','sides'],change:null};$this.data('options',options);if(!properties)
+{$this.data('properties',{initialized:false,value:'',isValid:true,radioH:0,radioW:0});properties=$this.data('properties');}
+if(!objects)
+{objects={container:$('<div/>',{'class':'ui-inputPosition',css:{width:'100%'}}),radios:{corners:[],sides:[],center:[]}};var name=$this.get(0).id,values=['TL','TR','BR','BL'];for(var i=0;i<values.length;i++)
+{objects.radios.corners.push($('<input>',{type:'radio',id:name+values[i],name:'ip_'+name,value:values[i],group:'corners'}).appendTo(objects.container));}
+values=['T','L','B','R'];for(var i=0;i<values.length;i++)
+{objects.radios.sides.push($('<input>',{type:'radio',id:name+values[i],name:'ip_'+name,value:values[i],group:'sides'}).appendTo(objects.container))}
+values=['C'];for(var i=0;i<values.length;i++)
+{objects.radios.center.push($('<input>',{type:'radio',id:name+values[i],name:'ip_'+name,value:values[i],group:'center'}).appendTo(objects.container))}
+objects.container.find('input').bind('click',function(event)
+{privateMethods.setValue($this,$(this).attr('value'),false);});$this.html('').append(objects.container);properties.radioW=objects.container.find('input').first().outerWidth()/2;properties.radioH=objects.container.find('input').first().outerHeight()/2;$this.css('padding',properties.radioH+'px '+properties.radioW+'px');$this.data('objects',objects);}
+privateMethods.setOptions($this,opt);});},destroy:function()
+{return this.each(function()
+{var $this=$(this),objects=$this.data('objects');objects.input.unbind().remove();objects.container.unbind().remove();$this.unbind('.inputPosition').css({width:'',height:''});});},options:function(value)
+{return this.each(function()
+{privateMethods.setOptions($(this),value);});},disabled:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setDisabled($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.disabled);}
+else
+{return('');}}},width:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setWidth($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.width);}
+else
+{return('');}}},height:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setHeight($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.height);}
+else
+{return('');}}},values:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setValues($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.values);}
+else
+{return('');}}},value:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setValue($(this),value,true);});}
+else
+{var properties=this.data('properties');return(properties.value);}},isValid:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setIsValid($(this),value);});}
+else
+{var properties=this.data('properties');return(properties.isValid);}},change:function(value)
+{if(value!=null&&$.isFunction(value))
+{return this.each(function()
+{privateMethods.setEventChange($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.change);}
+else
+{return(null);}}}};var privateMethods={setOptions:function(object,value)
+{var properties=object.data('properties'),options=object.data('options');if(!$.isPlainObject(value))return(false);properties.initialized=false;privateMethods.setValues(object,(value.values!=null)?value.values:options.values);privateMethods.setHeight(object,(value.height!=null)?value.height:options.height,true);privateMethods.setWidth(object,(value.width!=null)?value.width:options.width,true);privateMethods.setValue(object,(value.value!=null)?value.value:options.value,true);privateMethods.setDisabled(object,(value.disabled!=null)?value.disabled:options.disabled);privateMethods.setEventChange(object,(value.change!=null)?value.change:options.change);properties.initialized=true;},setIsValid:function(object,value)
+{var objects=object.data('objects'),properties=object.data('properties');if(properties.isValid!=value)
+{properties.isValid=value;if(properties.isValid)
+{objects.container.removeClass('ui-error');objects.input.removeClass('ui-error');}
+else
+{objects.container.addClass('ui-error');objects.input.addClass('ui-error');}}
+return(properties.isValid);},setDisabled:function(object,value)
+{var options=object.data('options'),properties=object.data('properties');if((!properties.initialized||options.disabled!=value)&&(value==true||value==false))
+{options.disabled=value;}
+return(options.disabled);},setHeight:function(object,value)
+{var options=object.data('options'),objects=object.data('objects'),properties=object.data('properties');if((!properties.initialized||options.height!=value)&&value>=0)
+{if(value==0)
+{options.height=value;objects.container.css('height','100%');}
+else
+{options.height=value;objects.container.css('height',options.height+'px');}}
+privateMethods.setRadioPosition(object);return(options.height);},setWidth:function(object,value)
+{var options=object.data('options'),objects=object.data('objects'),properties=object.data('properties');if((!properties.initialized||options.width!=value)&&value>=0)
+{if(value==0)
+{options.width=value;objects.container.css('width','100%');}
+else
+{options.width=value;objects.container.css('width',options.width+'px');}
+privateMethods.setRadioPosition(object);}
+return(options.width);},setValues:function(object,value)
+{var options=object.data('options'),objects=object.data('objects');if(!$.isArray(value))value=[value];options.values=[];object.find('input').hide();for(var i=0;i<value.length;i++)
+{if(value[i]=='center'||value[i]=='corners'||value[i]=='sides')
+{options.values.push(value[i]);object.find('input[group='+value[i]+']').show();}}
+return(true);},setValue:function(object,value,apply)
+{var options=object.data('options'),properties=object.data('properties'),objects=object.data('objects');if(!(($.inArray('center',options.values)>-1&&value=='C')||($.inArray('corners',options.values)>-1&&(value=='TL'||value=='TR'||value=='BR'||value=='BL'))||($.inArray('sides',options.values)>-1&&(value=='L'||value=='R'||value=='B'||value=='T'))))return(false);properties.value=value;if(apply)
+{switch(properties.value)
+{case'TL':objects.radios.corners[0].attr('checked',true);break;case'TR':objects.radios.corners[1].attr('checked',true);break;case'BR':objects.radios.corners[2].attr('checked',true);break;case'BL':objects.radios.corners[3].attr('checked',true);break;case'T':objects.radios.sides[0].attr('checked',true);break;case'L':objects.radios.sides[1].attr('checked',true);break;case'B':objects.radios.sides[2].attr('checked',true);break;case'R':objects.radios.sides[3].attr('checked',true);break;case'C':objects.radios.center[0].attr('checked',true);break;}}
+if(options.change)object.trigger('inputPositionChange',properties.value);return(true);},setEventChange:function(object,value)
+{var options=object.data('options');options.change=value;object.unbind('inputPositionChange');if(value)object.bind('inputPositionChange',options.change);return(options.change);},setRadioPosition:function(object)
+{var options=object.data('options'),objects=object.data('objects'),properties=object.data('properties');if($.inArray('center',options.values)>-1)
+{objects.radios.center[0].css({'margin-left':(options.width/2-properties.radioW)+'px','margin-top':(options.height/2-properties.radioH)+'px'});}
+if($.inArray('corners',options.values)>-1)
+{for(var i=0;i<objects.radios.corners.length;i++)
+{switch(objects.radios.corners[i].attr('value'))
+{case'TL':objects.radios.corners[i].css({'margin-left':'-'+properties.radioW+'px','margin-top':'-'+properties.radioH+'px'});break;case'TR':objects.radios.corners[i].css({'margin-left':(options.width-properties.radioW)+'px','margin-top':'-'+properties.radioH+'px'});break;case'BR':objects.radios.corners[i].css({'margin-left':(options.width-properties.radioW)+'px','margin-top':(options.height-properties.radioH)+'px'});break;case'BL':objects.radios.corners[i].css({'margin-left':'-'+properties.radioW+'px','margin-top':(options.height-properties.radioH)+'px'});break;}}}
+if($.inArray('sides',options.values)>-1)
+{w=objects.radios.sides[0].width();h=objects.radios.sides[0].height();for(var i=0;i<objects.radios.sides.length;i++)
+{switch(objects.radios.sides[i].attr('value'))
+{case'L':objects.radios.sides[i].css({'margin-left':'-'+properties.radioW+'px','margin-top':(options.height/2-properties.radioH)+'px'});break;case'T':objects.radios.sides[i].css({'margin-left':(options.width/2-properties.radioW)+'px','margin-top':'-'+properties.radioH+'px'});break;case'R':objects.radios.sides[i].css({'margin-left':(options.width-properties.radioW)+'px','margin-top':(options.height/2-properties.radioH)+'px'});break;case'B':objects.radios.sides[i].css({'margin-left':(options.width/2-properties.radioW)+'px','margin-top':(options.height-properties.radioH)+'px'});break;}}}}};$.fn.inputPosition=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.inputPosition');}}})(jQuery);
Index: /extensions/GrumPluginClasses/js/ui.inputRadio.js
===================================================================
--- /extensions/GrumPluginClasses/js/ui.inputRadio.js	(revision 8961)
+++ /extensions/GrumPluginClasses/js/ui.inputRadio.js	(revision 8961)
@@ -0,0 +1,442 @@
+/**
+ * -----------------------------------------------------------------------------
+ * file: ui.inputRadio.js
+ * file version: 1.0.0
+ * date: 2010-11-04
+ *
+ * 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/11/04 | 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 =
+                    {
+                      disabled:[],
+                      hidden:[],
+                      value:'',
+                      change: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,
+                    value:'',
+                    isValid:true
+                  }
+                );
+                properties=$this.data('properties');
+              }
+
+              if(!objects)
+              {
+                objects =
+                  {
+                    radio:[]
+                  };
+
+                $this.data('objects', objects);
+              }
+
+              $this.find('input[type=radio]').each(
+                function (index, item)
+                {
+                  objects.radio.push($(item));
+                  $(item).attr('name', 'ir_'+$this.get(0).id).bind('click',
+                    function (event)
+                    {
+                      privateMethods.setValue($this, $(this).attr('value'), false);
+                    }
+                  );
+                }
+              );
+
+              privateMethods.setOptions($this, opt);
+            }
+          );
+        }, // init
+      destroy : function ()
+        {
+          return this.each(
+            function()
+            {
+              // default values for the plugin
+              var $this=$(this),
+                  objects = $this.data('objects');
+              for(var i=0;i<objects.radio.length;i++)
+              {
+                objects.radio.unbind();
+              }
+              objects.container.unbind().remove();
+              $this
+                .unbind('.inputRadio')
+                .css(
+                  {
+                    width:'',
+                    height:''
+                  }
+                );
+            }
+          );
+        }, // destroy
+
+      options: function (value)
+        {
+          return(
+            this.each(
+              function()
+              {
+                privateMethods.setOptions($(this), value);
+              }
+            )
+          );
+        }, // options
+
+      disabled: function (value)
+        {
+          if(value!=null)
+          {
+            return(
+              this.each(
+                function()
+                {
+                  privateMethods.setDisabled($(this), value);
+                }
+              )
+            );
+          }
+          else
+          {
+            return(privateMethods.getDisabled($(this)));
+          }
+        }, // disabled
+
+      hidden: function (value)
+        {
+          if(value!=null)
+          {
+            return(
+              this.each(
+                function()
+                {
+                  privateMethods.setHidden($(this), value);
+                }
+              )
+            );
+          }
+          else
+          {
+            return(privateMethods.getHidden($(this)));
+          }
+        }, // disabled
+
+      value: function (value)
+        {
+          if(value!=null)
+          {
+            // set selected value
+            return(
+              this.each(
+                function()
+                {
+                  privateMethods.setValue($(this), value, true);
+                }
+              )
+            );
+          }
+          else
+          {
+            // return the selected tags
+            var properties=this.data('properties');
+            return(properties.value);
+          }
+        }, // value
+
+      isValid: function (value)
+        {
+          if(value!=null)
+          {
+            // set selected value
+            return(
+              this.each(
+                function()
+                {
+                  privateMethods.setIsValid($(this), value);
+                }
+              )
+            );
+          }
+          else
+          {
+            // return the selected tags
+            var properties=this.data('properties');
+
+            return(properties.isValid);
+          }
+        }, // isValid
+
+      change: function (value)
+        {
+          if(value!=null && $.isFunction(value))
+          {
+            // set selected value
+            return(
+              this.each(
+                function()
+                {
+                  privateMethods.setEventChange($(this), value);
+                }
+              )
+            );
+          }
+          else
+          {
+            // return the selected value
+            var options=this.data('options');
+
+            if(options)
+            {
+              return(options.change);
+            }
+            else
+            {
+              return(null);
+            }
+          }
+        } // change
+
+    }; // 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.setDisabled(object, (value.disabled!=null)?value.disabled:options.disabled);
+          privateMethods.setHidden(object, (value.hidden!=null)?value.hidden:options.hidden);
+          privateMethods.setValue(object, (value.value!=null)?value.value:options.value, true);
+
+          privateMethods.setEventChange(object, (value.change!=null)?value.change:options.change);
+
+          properties.initialized=true;
+        },
+
+      setIsValid : function (object, value)
+        {
+          var objects=object.data('objects'),
+              properties=object.data('properties');
+
+          if(properties.isValid!=value && properties.initialized)
+          {
+            properties.isValid=value;
+            if(properties.isValid)
+            {
+              objects.container.removeClass('ui-error');
+              objects.input.removeClass('ui-error');
+            }
+            else
+            {
+              objects.container.addClass('ui-error');
+              objects.input.addClass('ui-error');
+            }
+          }
+          return(properties.isValid);
+        },
+
+      setDisabled : function (object, value)
+        {
+          var objects=object.data('objects'),
+              index=-1;
+
+          if(!$.isArray(value)) value=[value];
+
+          for(var i=0;i<objects.radio.length;i++)
+          {
+            index=$.inArray(objects.radio[i].attr('value'), value);
+            objects.radio[i].attr('disabled', (index>-1));
+          }
+          return(privateMethods.getDisabled(object));
+        },
+
+      getDisabled : function (object)
+        {
+          var objects=object.data('objects'),
+              returned=[];
+
+          for(var i=0;i<objects.radio.length;i++)
+          {
+            if(objects.radio[i].attr('disabled')) returned.push(objects.radio[i].attr('value'));
+          }
+          return(returned);
+        },
+
+
+      setHidden : function (object, value)
+        {
+          var objects=object.data('objects');
+
+          if(!$.isArray(value)) value=[value];
+
+          for(var i=0;i<objects.radio.length;i++)
+          {
+            if($.inArray(objects.radio[i].attr('value'), value)>-1)
+            {
+              if(objects.radio[i].parent().attr('nodeName')=='LABEL')
+              {
+                objects.radio[i].parent().hide();
+              }
+              else
+              {
+                objects.radio[i].hide();
+              }
+            }
+            else
+            {
+              if(objects.radio[i].parent().attr('nodeName')=='LABEL')
+              {
+                objects.radio[i].parent().show();
+              }
+              else
+              {
+                objects.radio[i].show();
+              }
+            }
+          }
+          return(privateMethods.getHidden(object));
+        },
+
+      getHidden : function (object)
+        {
+          var objects=object.data('objects'),
+              returned=[];
+
+          for(var i=0;i<objects.radio.length;i++)
+          {
+            if(objects.radio[i].css('display')=='none') returned.push(objects.radio[i].attr('value'));
+          }
+          return(returned);
+        },
+
+      setValue : function (object, value, apply)
+        {
+          var options=object.data('options'),
+              properties=object.data('properties'),
+              objects=object.data('objects'),
+              index=privateMethods.findRadioByVal(object, value);
+
+          if(index==-1) return(false);
+
+          properties.value=value;
+
+          if(apply)
+          {
+            objects.radio[index].attr('checked', true);
+          }
+
+          if(options.change) object.trigger('inputRadioChange', properties.value);
+
+          return(true);
+        }, //setValue
+
+      setEventChange : function (object, value)
+        {
+          var options=object.data('options');
+
+          options.change=value;
+          object.unbind('inputRadioChange');
+          if(value) object.bind('inputRadioChange', options.change);
+          return(options.change);
+        },
+
+      findRadioByVal : function (object, value)
+        {
+          var objects=object.data('objects');
+
+          for(var i=0;i<objects.radio.length;i++)
+          {
+            if(objects.radio[i].attr('value')==value) return(i);
+          }
+          return(-1);
+        }
+
+    };
+
+
+    $.fn.inputRadio = 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.inputRadio' );
+      }
+    } // $.fn.inputRadio
+
+  }
+)(jQuery);
+
+
Index: /extensions/GrumPluginClasses/js/ui.inputRadio.min.js
===================================================================
--- /extensions/GrumPluginClasses/js/ui.inputRadio.min.js	(revision 8961)
+++ /extensions/GrumPluginClasses/js/ui.inputRadio.min.js	(revision 8961)
@@ -0,0 +1,86 @@
+/* file: ui.inputRadio.js - v1.0.0 | minified on 2011/01/27 with http://jscompress.com/ */
+(function($)
+{var publicMethods={init:function(opt)
+{return this.each(function()
+{var $this=$(this),data=$this.data('options'),objects=$this.data('objects'),properties=$this.data('properties'),options={disabled:[],hidden:[],value:'',change:null};$this.data('options',options);if(!properties)
+{$this.data('properties',{initialized:false,value:'',isValid:true});properties=$this.data('properties');}
+if(!objects)
+{objects={radio:[]};$this.data('objects',objects);}
+$this.find('input[type=radio]').each(function(index,item)
+{objects.radio.push($(item));$(item).attr('name','ir_'+$this.get(0).id).bind('click',function(event)
+{privateMethods.setValue($this,$(this).attr('value'),false);});});privateMethods.setOptions($this,opt);});},destroy:function()
+{return this.each(function()
+{var $this=$(this),objects=$this.data('objects');for(var i=0;i<objects.radio.length;i++)
+{objects.radio.unbind();}
+objects.container.unbind().remove();$this.unbind('.inputRadio').css({width:'',height:''});});},options:function(value)
+{return(this.each(function()
+{privateMethods.setOptions($(this),value);}));},disabled:function(value)
+{if(value!=null)
+{return(this.each(function()
+{privateMethods.setDisabled($(this),value);}));}
+else
+{return(privateMethods.getDisabled($(this)));}},hidden:function(value)
+{if(value!=null)
+{return(this.each(function()
+{privateMethods.setHidden($(this),value);}));}
+else
+{return(privateMethods.getHidden($(this)));}},value:function(value)
+{if(value!=null)
+{return(this.each(function()
+{privateMethods.setValue($(this),value,true);}));}
+else
+{var properties=this.data('properties');return(properties.value);}},isValid:function(value)
+{if(value!=null)
+{return(this.each(function()
+{privateMethods.setIsValid($(this),value);}));}
+else
+{var properties=this.data('properties');return(properties.isValid);}},change:function(value)
+{if(value!=null&&$.isFunction(value))
+{return(this.each(function()
+{privateMethods.setEventChange($(this),value);}));}
+else
+{var options=this.data('options');if(options)
+{return(options.change);}
+else
+{return(null);}}}};var privateMethods={setOptions:function(object,value)
+{var properties=object.data('properties'),options=object.data('options');if(!$.isPlainObject(value))return(false);properties.initialized=false;privateMethods.setDisabled(object,(value.disabled!=null)?value.disabled:options.disabled);privateMethods.setHidden(object,(value.hidden!=null)?value.hidden:options.hidden);privateMethods.setValue(object,(value.value!=null)?value.value:options.value,true);privateMethods.setEventChange(object,(value.change!=null)?value.change:options.change);properties.initialized=true;},setIsValid:function(object,value)
+{var objects=object.data('objects'),properties=object.data('properties');if(properties.isValid!=value&&properties.initialized)
+{properties.isValid=value;if(properties.isValid)
+{objects.container.removeClass('ui-error');objects.input.removeClass('ui-error');}
+else
+{objects.container.addClass('ui-error');objects.input.addClass('ui-error');}}
+return(properties.isValid);},setDisabled:function(object,value)
+{var objects=object.data('objects'),index=-1;if(!$.isArray(value))value=[value];for(var i=0;i<objects.radio.length;i++)
+{index=$.inArray(objects.radio[i].attr('value'),value);objects.radio[i].attr('disabled',(index>-1));}
+return(privateMethods.getDisabled(object));},getDisabled:function(object)
+{var objects=object.data('objects'),returned=[];for(var i=0;i<objects.radio.length;i++)
+{if(objects.radio[i].attr('disabled'))returned.push(objects.radio[i].attr('value'));}
+return(returned);},setHidden:function(object,value)
+{var objects=object.data('objects');if(!$.isArray(value))value=[value];for(var i=0;i<objects.radio.length;i++)
+{if($.inArray(objects.radio[i].attr('value'),value)>-1)
+{if(objects.radio[i].parent().attr('nodeName')=='LABEL')
+{objects.radio[i].parent().hide();}
+else
+{objects.radio[i].hide();}}
+else
+{if(objects.radio[i].parent().attr('nodeName')=='LABEL')
+{objects.radio[i].parent().show();}
+else
+{objects.radio[i].show();}}}
+return(privateMethods.getHidden(object));},getHidden:function(object)
+{var objects=object.data('objects'),returned=[];for(var i=0;i<objects.radio.length;i++)
+{if(objects.radio[i].css('display')=='none')returned.push(objects.radio[i].attr('value'));}
+return(returned);},setValue:function(object,value,apply)
+{var options=object.data('options'),properties=object.data('properties'),objects=object.data('objects'),index=privateMethods.findRadioByVal(object,value);if(index==-1)return(false);properties.value=value;if(apply)
+{objects.radio[index].attr('checked',true);}
+if(options.change)object.trigger('inputRadioChange',properties.value);return(true);},setEventChange:function(object,value)
+{var options=object.data('options');options.change=value;object.unbind('inputRadioChange');if(value)object.bind('inputRadioChange',options.change);return(options.change);},findRadioByVal:function(object,value)
+{var objects=object.data('objects');for(var i=0;i<objects.radio.length;i++)
+{if(objects.radio[i].attr('value')==value)return(i);}
+return(-1);}};$.fn.inputRadio=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.inputRadio');}}})(jQuery);
Index: /extensions/GrumPluginClasses/js/ui.inputStatusBar.js
===================================================================
--- /extensions/GrumPluginClasses/js/ui.inputStatusBar.js	(revision 8961)
+++ /extensions/GrumPluginClasses/js/ui.inputStatusBar.js	(revision 8961)
@@ -0,0 +1,289 @@
+/**
+ * -----------------------------------------------------------------------------
+ * file: ui.inputStatusBar.js
+ * file version: 1.0.0
+ * date: 2010-11-04
+ *
+ * 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/11/04 | 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 =
+                    {
+                      items:[]
+                    };
+
+              // 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,
+                    id:$this.get(0).id
+                  }
+                );
+                properties=$this.data('properties');
+              }
+
+              if(!objects)
+              {
+                objects =
+                  {
+                    table:$('<table/>',
+                            {
+                              'class':'ui-inputStatusBar',
+                              css:{
+                                width:'100%'
+                              }
+                            }
+                          ),
+                    tr:$('<tr/>'),
+                    td:[]
+                  };
+
+                $this
+                  .html('')
+                  .append(objects.table.append(objects.tr));
+                  /*
+                  .bind('resize.inputStatusBar',
+                          function ()
+                          {
+                            privateMethods.setObjectsWidth($this);
+                          }
+                        );
+                  */
+                $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.tr.remove();
+              objects.table.remove();
+              $this
+                .unbind('.inputStatusBar')
+                .css(
+                  {
+                    width:'',
+                    height:''
+                  }
+                );
+            }
+          );
+        }, // destroy
+
+      options: function (value)
+        {
+          return(
+            this.each(
+              function()
+              {
+                privateMethods.setOptions($(this), value);
+              }
+            )
+          );
+        }, // options
+
+      items: function (fct, value)
+        {
+          if((fct=='add' || fct=='remove' || fct=='set') && value!=null)
+          {
+            return(
+              this.each(
+                function()
+                {
+                  privateMethods.setItems($(this), fct, value);
+                }
+              )
+            );
+          }
+          else if(fct=='get' && value!=null)
+          {
+            var options=this.data('options');
+            return(options.items[value]);
+          }
+          else
+          {
+            var options=this.data('options');
+            return(options.items);
+          }
+        } // items
+
+
+    }; // 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.setItems(object, 'init', (value.items!=null)?value.items:options.items);
+
+          properties.initialized=true;
+        },
+
+
+      setItems : function (object, fct, value)
+        {
+          var options=object.data('options'),
+              properties=object.data('properties'),
+              objects=object.data('objects'),
+              index=-1;
+
+          if(value.id==null && !$.isArray(value)) return(false);
+
+          if(value.id!=null) index=privateMethods.findItemById(object, value.id);
+
+
+          if(fct=='add' && value.id!=null && index==-1)
+          {
+            if(value.content==null) value.content='&nbsp;';
+            if(value.width==null) value.width='';
+            if(value.title==null) value.title='';
+
+            var td=$('<td/>',
+                      {
+                        id:properties.id+value.id,
+                        html:value.content,
+                        title:value.title,
+                        css:{
+                          width:value.width
+                        }
+                      }
+                    );
+            objects.td.push(
+              {
+                id:value.id,
+                td:td
+              }
+            );
+            objects.tr.append(td);
+            options.items.push(value);
+          }
+          else if(fct=='remove' && value.id!=null && index>-1)
+          {
+            if(index>-1)
+            {
+              objects.td[index].td.remove();
+              objects.td.splice(index,1);
+              options.items.splice(index, 1);
+              delete options.items[value.id];
+            }
+          }
+          else if(fct=='set' && value.id!=null && index>-1 && value.content!=null)
+          {
+            if(value.title==null) value.title='';
+
+            objects.td[index].td.html(value.content).attr('title', value.title);
+          }
+          else if(fct=='init')
+          {
+            for(var i in value)
+            {
+              privateMethods.setItems(object, 'add', value[i]);
+            }
+          }
+
+          return(true);
+        }, //setValue
+
+
+      findItemById : function (object, id)
+        {
+          var objects=object.data('objects');
+
+          for(var i=0;i<objects.td.length;i++)
+          {
+            if(objects.td[i].id==id) return(i);
+          }
+          return(-1);
+        }
+    };
+
+
+    $.fn.inputStatusBar = 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.inputStatusBar' );
+      }
+    } // $.fn.inputStatusBar
+
+  }
+)(jQuery);
+
+
Index: /extensions/GrumPluginClasses/js/ui.inputStatusBar.min.js
===================================================================
--- /extensions/GrumPluginClasses/js/ui.inputStatusBar.min.js	(revision 8961)
+++ /extensions/GrumPluginClasses/js/ui.inputStatusBar.min.js	(revision 8961)
@@ -0,0 +1,41 @@
+/* file: ui.inputStatusBar.js - v1.0.0 | minified on 2011/01/27 with http://jscompress.com/ */
+(function($)
+{var publicMethods={init:function(opt)
+{return this.each(function()
+{var $this=$(this),data=$this.data('options'),objects=$this.data('objects'),properties=$this.data('properties'),options={items:[]};$this.data('options',options);if(!properties)
+{$this.data('properties',{initialized:false,id:$this.get(0).id});properties=$this.data('properties');}
+if(!objects)
+{objects={table:$('<table/>',{'class':'ui-inputStatusBar',css:{width:'100%'}}),tr:$('<tr/>'),td:[]};$this.html('').append(objects.table.append(objects.tr));$this.data('objects',objects);}
+privateMethods.setOptions($this,opt);});},destroy:function()
+{return this.each(function()
+{var $this=$(this),objects=$this.data('objects');objects.tr.remove();objects.table.remove();$this.unbind('.inputStatusBar').css({width:'',height:''});});},options:function(value)
+{return(this.each(function()
+{privateMethods.setOptions($(this),value);}));},items:function(fct,value)
+{if((fct=='add'||fct=='remove'||fct=='set')&&value!=null)
+{return(this.each(function()
+{privateMethods.setItems($(this),fct,value);}));}
+else if(fct=='get'&&value!=null)
+{var options=this.data('options');return(options.items[value]);}
+else
+{var options=this.data('options');return(options.items);}}};var privateMethods={setOptions:function(object,value)
+{var properties=object.data('properties'),options=object.data('options');if(!$.isPlainObject(value))return(false);properties.initialized=false;privateMethods.setItems(object,'init',(value.items!=null)?value.items:options.items);properties.initialized=true;},setItems:function(object,fct,value)
+{var options=object.data('options'),properties=object.data('properties'),objects=object.data('objects'),index=-1;if(value.id==null&&!$.isArray(value))return(false);if(value.id!=null)index=privateMethods.findItemById(object,value.id);if(fct=='add'&&value.id!=null&&index==-1)
+{if(value.content==null)value.content=' ';if(value.width==null)value.width='';if(value.title==null)value.title='';var td=$('<td/>',{id:properties.id+value.id,html:value.content,title:value.title,css:{width:value.width}});objects.td.push({id:value.id,td:td});objects.tr.append(td);options.items.push(value);}
+else if(fct=='remove'&&value.id!=null&&index>-1)
+{if(index>-1)
+{objects.td[index].td.remove();objects.td.splice(index,1);options.items.splice(index,1);delete options.items[value.id];}}
+else if(fct=='set'&&value.id!=null&&index>-1&&value.content!=null)
+{if(value.title==null)value.title='';objects.td[index].td.html(value.content).attr('title',value.title);}
+else if(fct=='init')
+{for(var i in value)
+{privateMethods.setItems(object,'add',value[i]);}}
+return(true);},findItemById:function(object,id)
+{var objects=object.data('objects');for(var i=0;i<objects.td.length;i++)
+{if(objects.td[i].id==id)return(i);}
+return(-1);}};$.fn.inputStatusBar=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.inputStatusBar');}}})(jQuery);
Index: /extensions/GrumPluginClasses/js/ui.inputText.js
===================================================================
--- /extensions/GrumPluginClasses/js/ui.inputText.js	(revision 8961)
+++ /extensions/GrumPluginClasses/js/ui.inputText.js	(revision 8961)
@@ -0,0 +1,1008 @@
+/**
+ * -----------------------------------------------------------------------------
+ * file: ui.inputText.js
+ * file version: 1.1.0
+ * date: 2011-01-09
+ *
+ * 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/11/04 | * first release
+ * |         |            |
+ * | 1.1.0   | 2011/01/09 | * if div content is not empty and text value not
+ * |         |            |   defined, use of div content to define text value
+ * |         |            |
+ * |         |            | * add multilanguage managment
+ * |         |            |
+ * |         |            |
+ * |         |            |
+ *
+ */
+
+
+
+(
+  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 =
+                    {
+                      languages:[],
+                      currentLanguage:'',
+                      languagesValues:{},
+                      languageSelector:'',
+                      multilines:false,
+                      disabled:false,
+                      textAlign:'left',
+                      displayChar:0,
+                      maxChar:0,
+                      numRows:1,
+                      regExp:'',
+                      value:'',
+                      change:null
+                    };
+
+              // if options given, merge it
+              // if(opt) $.extend(options, opt); ==> options are set by setters
+              if(options.value=='' && $.trim($this.html())!='') options.value=$.trim($this.html());
+
+              $this.data('options', options);
+
+              if(!properties)
+              {
+                $this.data('properties',
+                  {
+                    initialized:false,
+                    re:/.*/,
+                    value:0,
+                    isValid:true,
+                    languagesValues:{}
+                  }
+                );
+                properties=$this.data('properties');
+              }
+
+              if(!objects)
+              {
+                objects =
+                  {
+                    container:$('<div/>',
+                        {
+                          'class':'ui-inputText',
+                          css:{
+                            width:'100%'
+                          }
+                        }
+                    ).bind('click.inputText',
+                        function ()
+                        {
+                          objects.input.focus();
+                        }
+                      ),
+                    input:null
+                  };
+
+                $this
+                  .html('')
+                  .append(objects.container);
+
+                $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.input.unbind().remove();
+              objects.container.unbind().remove();
+              $this
+                .unbind('.inputText')
+                .css(
+                  {
+                    width:'',
+                    height:''
+                  }
+                );
+            }
+          );
+        }, // destroy
+
+      options: function (value)
+        {
+          return(
+            this.each(
+              function()
+              {
+                privateMethods.setOptions($(this), value);
+              }
+            )
+          );
+        }, // options
+
+      disabled: function (value)
+        {
+          if(value!=null)
+          {
+            return(
+              this.each(
+                function()
+                {
+                  privateMethods.setDisabled($(this), value);
+                }
+              )
+            );
+          }
+          else
+          {
+            var options = this.data('options');
+
+            if(options)
+            {
+              return(options.disabled);
+            }
+            else
+            {
+              return('');
+            }
+          }
+        }, // disabled
+
+      textAlign: function (value)
+        {
+          if(value!=null)
+          {
+            return(
+              this.each(
+                function()
+                {
+                  privateMethods.setTextAlign($(this), value);
+                }
+              )
+            );
+          }
+          else
+          {
+            var options = this.data('options');
+
+            if(options)
+            {
+              return(options.textAlign);
+            }
+            else
+            {
+              return('');
+            }
+          }
+        }, // textAlign
+
+      displayChar: function (value)
+        {
+          if(value!=null)
+          {
+            return(
+              this.each(
+                function()
+                {
+                  privateMethods.setDisplayChar($(this), value);
+                }
+              )
+            );
+          }
+          else
+          {
+            var options = this.data('options');
+
+            if(options)
+            {
+              return(options.displayChar);
+            }
+            else
+            {
+              return('');
+            }
+          }
+        }, // displayChar
+
+      maxChar: function (value)
+        {
+          if(value!=null)
+          {
+            return(
+              this.each(
+                function()
+                {
+                  privateMethods.setMaxChar($(this), value);
+                }
+              )
+            );
+          }
+          else
+          {
+            var options = this.data('options');
+
+            if(options)
+            {
+              return(options.maxChar);
+            }
+            else
+            {
+              return('');
+            }
+          }
+        }, // maxChar
+
+      numRows: function (value)
+        {
+          if(value!=null)
+          {
+            return(
+              this.each(
+                function()
+                {
+                  privateMethods.setNumRows($(this), value);
+                }
+              )
+            );
+          }
+          else
+          {
+            var options = this.data('options');
+
+            if(options)
+            {
+              return(options.numRows);
+            }
+            else
+            {
+              return('');
+            }
+          }
+        }, // numRows
+
+      regExp: function (value)
+        {
+          if(value!=null)
+          {
+            return(
+              this.each(
+                function()
+                {
+                  privateMethods.setRegExp($(this), value);
+                }
+              )
+            );
+          }
+          else
+          {
+            var options = this.data('options');
+
+            if(options)
+            {
+              return(options.regExp);
+            }
+            else
+            {
+              return('');
+            }
+          }
+        }, // regExp
+
+      multilines: function ()
+        {
+          // return the selected tags
+          var properties=this.data('properties');
+          return(properties.multilines);
+        }, // multilines
+
+      languages: function (value)
+        {
+          if(value!=null)
+          {
+            // set the known languages
+            return(
+              this.each(
+                function()
+                {
+                  privateMethods.setLanguages($(this), value);
+                }
+              )
+            );
+          }
+          else
+          {
+            // return the known languages
+            var options = this.data('options');
+            return(options.languages);
+          }
+        },
+
+      currentLanguage: function (value)
+        {
+          if(value!=null)
+          {
+            // set the current language
+            return(
+              this.each(
+                function()
+                {
+                  privateMethods.setCurrentLanguage($(this), value);
+                }
+              )
+            );
+          }
+          else
+          {
+            // return the current language
+            var options = this.data('options');
+            return(options.currentLanguage);
+          }
+        },
+
+      languageSelector: function (value)
+        {
+          if(value!=null)
+          {
+            // set the language selector id (inputList object)
+            return(
+              this.each(
+                function()
+                {
+                  privateMethods.setLanguageSelector($(this), value);
+                }
+              )
+            );
+          }
+          else
+          {
+            // return the language selector id
+            var options = this.data('options');
+            return(options.languageSelector);
+          }
+        }, //languageSelector
+
+      languagesValues: function (value)
+        {
+          if(value!=null)
+          {
+            // set the languages values
+            return(
+              this.each(
+                function()
+                {
+                  privateMethods.setLanguagesValues($(this), value);
+                }
+              )
+            );
+          }
+          else
+          {
+            // return the languages values
+            var properties=this.data('properties');
+            return(properties.languagesValues);
+          }
+        },
+
+      value: function (value, language)
+        {
+          if(value!=null)
+          {
+            var options=this.data('options');
+
+            // set selected value
+            return(
+              this.each(
+                function()
+                {
+                  if(language!=null)
+                  {
+                    privateMethods.setLanguageValue($(this), language, value, options.currentLanguage==language);
+                  }
+                  else
+                  {
+                    privateMethods.setValue($(this), value, true);
+                  }
+                }
+              )
+            );
+          }
+          else
+          {
+            // return the selected tags
+            var properties=this.data('properties');
+            return(properties.value);
+          }
+        }, // value
+
+      isValid: function (value)
+        {
+          if(value!=null)
+          {
+            // set selected value
+            return(
+              this.each(
+                function()
+                {
+                  privateMethods.setIsValid($(this), value);
+                }
+              )
+            );
+          }
+          else
+          {
+            // return the selected tags
+            var properties=this.data('properties');
+            return(properties.isValid);
+          }
+        }, // isValid
+
+      change: function (value)
+        {
+          if(value!=null && $.isFunction(value))
+          {
+            // set selected value
+            return(
+              this.each(
+                function()
+                {
+                  privateMethods.setEventChange($(this), value);
+                }
+              )
+            );
+          }
+          else
+          {
+            // return the selected value
+            var options=this.data('options');
+
+            if(options)
+            {
+              return(options.change);
+            }
+            else
+            {
+              return(null);
+            }
+          }
+        }, // change
+
+      doTranslation: function ()
+        {
+          // set selected value
+          return(
+            this.each(
+              function()
+              {
+                privateMethods.doTranslation($(this));
+              }
+            )
+          );
+        } // doTranslation
+
+    }; // methods
+
+
+    /*
+     * plugin 'private' methods
+     */
+    var privateMethods =
+    {
+      /**
+       * return true is given value is a valid numeric value, according to the
+       * rules defined by the object
+       * @param Object object
+       * @param value
+       * @return Bool
+       */
+      isValid : function (object, value)
+        {
+          var properties=object.data('properties');
+
+          return(properties.re.exec(value))
+        },
+
+      setOptions : function (object, value)
+        {
+          var properties=object.data('properties'),
+              options=object.data('options');
+
+          if(!$.isPlainObject(value)) return(false);
+
+          properties.initialized=false;
+
+          privateMethods.setMultilines(object, (value.multilines!=null)?value.multilines:options.multilines);
+          privateMethods.setDisplayChar(object, (value.displayChar!=null)?value.displayChar:options.displayChar);
+          privateMethods.setMaxChar(object, (value.maxChar!=null)?value.maxChar:options.maxChar);
+          privateMethods.setNumRows(object, (value.numRows!=null)?value.numRows:options.numRows);
+          privateMethods.setRegExp(object, (value.regExp!=null)?value.regExp:options.regExp);
+
+          privateMethods.setLanguages(object, (value.languages!=null)?value.languages:options.languages);
+          privateMethods.setLanguagesValues(object, (value.languagesValues!=null)?value.languagesValues:options.languagesValues);
+          privateMethods.setCurrentLanguage(object, (value.currentLanguage!=null)?value.currentLanguage:options.currentLanguage);
+          privateMethods.setLanguageSelector(object, (value.languageSelector!=null)?value.languageSelector:options.languageSelector);
+
+          if((properties.languagesValues[options.currentLanguage]!=null &&
+              properties.languagesValues[options.currentLanguage]!='' ||
+              properties.languagesValues[options.currentLanguage]==null) &&
+             (value.value!=null && value.value!='' || options.value!='')
+            ) privateMethods.setValue(object, (value.value!=null)?value.value:options.value, true);
+
+          privateMethods.setTextAlign(object, (value.textAlign!=null)?value.textAlign:options.textAlign);
+
+          privateMethods.setEventChange(object, (value.change!=null)?value.change:options.change);
+
+          properties.initialized=true;
+        },
+
+      /**
+       * define the regular expression used to check validity of a numeric value
+       * @param Object object
+       */
+      setRegExp : function (object, value)
+        {
+          var properties=object.data('properties'),
+              flagRE=/^\/(.*)\/(.*)$/,
+              flags=flagRE.exec(value);
+
+          if(flags==null)
+          {
+            flags=['.*', ''];
+          }
+
+          delete properties.re;
+          properties.re = new RegExp(flags[1],flags[2]);
+        },
+
+      setIsValid : function (object, value)
+        {
+          var objects=object.data('objects'),
+              properties=object.data('properties');
+
+          if(properties.isValid!=value && properties.initialized)
+          {
+            properties.isValid=value;
+            if(properties.isValid)
+            {
+              objects.container.removeClass('ui-error');
+              objects.input.removeClass('ui-error');
+            }
+            else
+            {
+              objects.container.addClass('ui-error');
+              objects.input.addClass('ui-error');
+            }
+          }
+          return(properties.isValid);
+        },
+
+      setDisplayChar : function (object, value)
+        {
+          var options=object.data('options'),
+              objects=object.data('objects');
+              properties=object.data('properties');
+
+          if((!properties.initialized || options.displayChar!=value) && value>=0)
+          {
+            options.displayChar=value;
+            if(options.displayChar>0)
+            {
+              if(options.multilines)
+              {
+                objects.input.attr('cols', options.displayChar);
+              }
+              else
+              {
+                objects.input.attr('size', options.displayChar);
+              }
+            }
+            else
+            {
+              if(options.multilines)
+              {
+                objects.input.removeAttr('size');
+              }
+              else
+              {
+                objects.input.removeAttr('cols');
+              }
+            }
+          }
+          if(object.width()>0)
+          {
+            objects.input.css(
+              {
+                'width': object.width()+'px',
+                'max-width': object.width()+'px'
+              }
+            );
+          }
+          return(options.displayChar);
+        },
+
+      setMaxChar : function (object, value)
+        {
+          var options=object.data('options'),
+              objects=object.data('objects'),
+              properties=object.data('properties');
+
+          if((!properties.initialized || options.maxChar!=value) && value>=0)
+          {
+            options.maxChar=value;
+            if(!options.multilines)
+            {
+              if(options.maxChar>0)
+              {
+                objects.input.attr('maxlength', options.maxChar);
+              }
+              else
+              {
+                objects.input.removeAttr('maxlength');
+              }
+            }
+          }
+          return(options.maxChar);
+        },
+
+      setNumRows : function (object, value)
+        {
+          var options=object.data('options'),
+              objects=object.data('objects'),
+              properties=object.data('properties');
+
+          if((!properties.initialized || options.numRows!=value) && value>0)
+          {
+            options.numRows=value;
+            if(options.multilines)
+            {
+              objects.input.attr('rows', options.numRows);
+            }
+          }
+          return(options.numRows);
+        },
+
+      setDisabled : function (object, value)
+        {
+          var options=object.data('options'),
+              objects=object.data('objects'),
+              properties=object.data('properties');
+
+          if((!properties.initialized || options.disabled!=value) && (value==true || value==false))
+          {
+            options.disabled=value;
+            objects.input.attr('disabled', options.disabled);
+          }
+          return(options.disabled);
+        },
+
+      setTextAlign : function (object, value)
+        {
+          var options=object.data('options'),
+              objects=object.data('objects'),
+              properties=object.data('properties');
+
+          if((!properties.initialized || options.textAlign!=value) && (value=='left' || value=='right'))
+          {
+            options.textAlign=value;
+            objects.input.css('text-align', options.textAlign);
+          }
+          return(options.textAlign);
+        },
+
+
+      setMultilines : function (object, value)
+        {
+          var options=object.data('options'),
+              objects=object.data('objects'),
+              properties=object.data('properties');
+
+          if((!properties.initialized || options.multilines!=value) && (value==true || value==false))
+          {
+            options.multilines=value;
+
+            if(options.multilines)
+            {
+              objects.input=$('<textarea/>');
+            }
+            else
+            {
+              objects.input=$('<input>',
+                      {
+                        type:"text",
+                        value:''
+                      }
+                    );
+            }
+
+            objects.container.append(
+                objects.input.bind('keyup.inputText',
+                                      function (event)
+                                      {
+                                        return(privateMethods.keyUp(object, event));
+                                      }
+                                    )
+                                  .bind('change.inputText',
+                                      function (event)
+                                      {
+                                        return(privateMethods.change(object, event));
+                                      }
+                                    )
+                                  .bind('keydown.inputText',
+                                      function (event)
+                                      {
+                                        return(privateMethods.keyDown(object, event));
+                                      }
+                                    )
+            );
+
+          }
+          return(options.textAlign);
+        }, //setMultilines
+
+      setLanguages : function (object, value)
+        {
+          var properties=object.data('properties'),
+              options=object.data('options');
+
+          options.languages=value;
+          options.languagesValues={};
+
+          if(options.languages.length>0)
+          {
+            if($.inArray(options.currentLanguage, options.languages)<0 ||
+               options.currentLanguage=='') options.currentLanguage=options.languages[0];
+
+            for(var i=0;i<options.languages.length;i++)
+            {
+              properties.languagesValues[options.languages[i]]='';
+            }
+          }
+          else
+          {
+            options.currentLanguage='';
+          }
+
+          return(options.languages);
+        }, //setLanguages
+
+      setLanguagesValues : function (object, value)
+        {
+          var options=object.data('options'),
+              properties=object.data('properties');
+
+          for(var langValue in value)
+          {
+            if(properties.languagesValues[langValue]!=null)
+                privateMethods.setLanguageValue(object, langValue, value[langValue], langValue==options.currentLanguage);
+          }
+
+          return(properties.languagesValues);
+        }, //setLanguagesValues
+
+      setLanguageValue : function (object, language, value, updateInput)
+        {
+          var options=object.data('options'),
+              properties=object.data('properties');
+
+          if(properties.languagesValues[language]!=null)
+          {
+            properties.languagesValues[language]=value;
+
+            if(updateInput) privateMethods.setValue(object, properties.languagesValues[options.currentLanguage], true);
+          }
+
+          return(options.languagesValues);
+        }, //setLanguageValue
+
+      setCurrentLanguage : function (object, value)
+        {
+          var options=object.data('options'),
+              properties=object.data('properties');
+
+          if((!properties.initialized || options.currentLanguage!=value) && $.inArray(value, options.languages)>=0)
+          {
+            options.currentLanguage=value;
+
+            privateMethods.setValue(object, properties.languagesValues[options.currentLanguage], true);
+          }
+
+          return(options.currentLanguage);
+        }, //setCurrentLanguage
+
+      setLanguageSelector : function (object, value)
+        {
+          var options=object.data('options'),
+              properties=object.data('properties');
+
+          if((!properties.initialized || options.languageSelector!=value) && value!='' && $('#'+value).length>0)
+          {
+            if(options.languageSelector!='') $('#'+options.languageSelector).unbind('inputListChange');
+            options.languageSelector=value;
+
+            if(options.languageSelector!='')
+              $('#'+options.languageSelector).bind('inputListChange',
+                function (event, lang)
+                {
+                  privateMethods.setCurrentLanguage(object, lang);
+                }
+              );
+          }
+
+          return(options.currentLanguage);
+        }, //setCurrentLanguage
+
+      setValue : function (object, value, apply)
+        {
+          var options=object.data('options'),
+              properties=object.data('properties'),
+              objects=object.data('objects');
+
+          if(properties.initialized && properties.value==value)
+          {
+            return(properties.value);
+          }
+
+          privateMethods.setIsValid(object, true);
+
+          properties.value=value;
+
+          if(apply)
+          {
+            objects.input.val(properties.value);
+          }
+
+          if(options.currentLanguage!='') privateMethods.setLanguageValue(object, options.currentLanguage, value, false);
+
+          if(options.change) object.trigger('inputTextChange', properties.value);
+
+          return(properties.value);
+        }, //setValue
+
+      setEventChange : function (object, value)
+        {
+          var options=object.data('options');
+
+          options.change=value;
+          object.unbind('inputTextChange');
+          if(value) object.bind('inputTextChange', options.change);
+          return(options.change);
+        },
+
+      keyUp : function (object, event)
+        {
+          var objects=object.data('objects');
+
+          if(event.keyCode==9 || //DOM_VK_TAB
+             event.keyCode==12 || //DOM_VK_CLEAR
+             event.keyCode==16 || //DOM_VK_SHIFT
+             event.keyCode==17 || //DOM_VK_CONTROL
+             event.keyCode==18 || //DOM_VK_ALT
+             event.keyCode==33 || //DOM_VK_PAGE_UP
+             event.keyCode==34 || //DOM_VK_PAGE_DOWN
+             event.keyCode==35 || //DOM_VK_END
+             event.keyCode==36 || //DOM_VK_HOME
+             event.keyCode==37 || //DOM_VK_LEFT
+             event.keyCode==38 || //DOM_VK_UP
+             event.keyCode==39 || //DOM_VK_RIGHT
+             event.keyCode==40 || //DOM_VK_DOWN
+             event.keyCode==45 || //DOM_VK_INSERT
+             event.keyCode==93  //DOM_VK_CONTEXT_MENU
+            ) return(false);
+
+          return(privateMethods.setValue(object, objects.input.val(), false));
+        },
+
+      change : function (object, event)
+        {
+          var objects=object.data('objects');
+
+          return(privateMethods.setValue(object, objects.input.val(), false))
+        },
+
+      keyDown : function (object, event)
+        {
+          var objects=object.data('objects'),
+              options=object.data('options');
+
+          if(options.maxChar>0 &&
+             objects.input.val().length>=options.maxChar &&
+             !(event.keyCode==8 || //DOM_VK_BACK_SPACE
+               event.keyCode==9 || //DOM_VK_TAB
+               event.keyCode==12 || //DOM_VK_CLEAR
+               event.keyCode==16 || //DOM_VK_SHIFT
+               event.keyCode==17 || //DOM_VK_CONTROL
+               event.keyCode==18 || //DOM_VK_ALT
+               event.keyCode==33 || //DOM_VK_PAGE_UP
+               event.keyCode==34 || //DOM_VK_PAGE_DOWN
+               event.keyCode==35 || //DOM_VK_END
+               event.keyCode==36 || //DOM_VK_HOME
+               event.keyCode==37 || //DOM_VK_LEFT
+               event.keyCode==38 || //DOM_VK_UP
+               event.keyCode==39 || //DOM_VK_RIGHT
+               event.keyCode==40 || //DOM_VK_DOWN
+               event.keyCode==45 || //DOM_VK_INSERT
+               event.keyCode==46 || //DOM_VK_DELETE
+               event.keyCode==93 || //DOM_VK_CONTEXT_MENU
+               objects.input.get(0).selectionStart!=objects.input.get(0).selectionEnd
+              )
+          ) return(false);
+        },
+
+        /**
+         * do translation through a google translate API call (need the GPC google_translate.js file is loaded)
+         *
+         * @param String input : id of input field ; if empty, translate all localized fields
+         */
+      doTranslation : function(object)
+        {
+          var objects=object.data('objects'),
+              properties=object.data('properties'),
+              options=object.data('options');
+
+          if(googleTranslate!=null)
+          {
+            googleTranslate(properties.value, '', options.currentLanguage.substr(0,2),
+              function (result)
+              {
+                privateMethods.setValue(object, result, true);
+              }
+            );
+          }
+        }
+
+    };
+
+
+    $.fn.inputText = 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.inputText' );
+      }
+    } // $.fn.inputText
+
+  }
+)(jQuery);
+
+
Index: /extensions/GrumPluginClasses/js/ui.inputText.min.js
===================================================================
--- /extensions/GrumPluginClasses/js/ui.inputText.min.js	(revision 8961)
+++ /extensions/GrumPluginClasses/js/ui.inputText.min.js	(revision 8961)
@@ -0,0 +1,197 @@
+/* file: ui.inputText.js - v1.0.0 | minified on 2011/01/27 with http://jscompress.com/ */
+(function($)
+{var publicMethods={init:function(opt)
+{return this.each(function()
+{var $this=$(this),data=$this.data('options'),objects=$this.data('objects'),properties=$this.data('properties'),options={languages:[],currentLanguage:'',languagesValues:{},languageSelector:'',multilines:false,disabled:false,textAlign:'left',displayChar:0,maxChar:0,numRows:1,regExp:'',value:'',change:null};if(options.value==''&&$.trim($this.html())!='')options.value=$.trim($this.html());$this.data('options',options);if(!properties)
+{$this.data('properties',{initialized:false,re:/.*/,value:0,isValid:true,languagesValues:{}});properties=$this.data('properties');}
+if(!objects)
+{objects={container:$('<div/>',{'class':'ui-inputText',css:{width:'100%'}}).bind('click.inputText',function()
+{objects.input.focus();}),input:null};$this.html('').append(objects.container);$this.data('objects',objects);}
+privateMethods.setOptions($this,opt);});},destroy:function()
+{return this.each(function()
+{var $this=$(this),objects=$this.data('objects');objects.input.unbind().remove();objects.container.unbind().remove();$this.unbind('.inputText').css({width:'',height:''});});},options:function(value)
+{return(this.each(function()
+{privateMethods.setOptions($(this),value);}));},disabled:function(value)
+{if(value!=null)
+{return(this.each(function()
+{privateMethods.setDisabled($(this),value);}));}
+else
+{var options=this.data('options');if(options)
+{return(options.disabled);}
+else
+{return('');}}},textAlign:function(value)
+{if(value!=null)
+{return(this.each(function()
+{privateMethods.setTextAlign($(this),value);}));}
+else
+{var options=this.data('options');if(options)
+{return(options.textAlign);}
+else
+{return('');}}},displayChar:function(value)
+{if(value!=null)
+{return(this.each(function()
+{privateMethods.setDisplayChar($(this),value);}));}
+else
+{var options=this.data('options');if(options)
+{return(options.displayChar);}
+else
+{return('');}}},maxChar:function(value)
+{if(value!=null)
+{return(this.each(function()
+{privateMethods.setMaxChar($(this),value);}));}
+else
+{var options=this.data('options');if(options)
+{return(options.maxChar);}
+else
+{return('');}}},numRows:function(value)
+{if(value!=null)
+{return(this.each(function()
+{privateMethods.setNumRows($(this),value);}));}
+else
+{var options=this.data('options');if(options)
+{return(options.numRows);}
+else
+{return('');}}},regExp:function(value)
+{if(value!=null)
+{return(this.each(function()
+{privateMethods.setRegExp($(this),value);}));}
+else
+{var options=this.data('options');if(options)
+{return(options.regExp);}
+else
+{return('');}}},multilines:function()
+{var properties=this.data('properties');return(properties.multilines);},languages:function(value)
+{if(value!=null)
+{return(this.each(function()
+{privateMethods.setLanguages($(this),value);}));}
+else
+{var options=this.data('options');return(options.languages);}},currentLanguage:function(value)
+{if(value!=null)
+{return(this.each(function()
+{privateMethods.setCurrentLanguage($(this),value);}));}
+else
+{var options=this.data('options');return(options.currentLanguage);}},languageSelector:function(value)
+{if(value!=null)
+{return(this.each(function()
+{privateMethods.setLanguageSelector($(this),value);}));}
+else
+{var options=this.data('options');return(options.languageSelector);}},languagesValues:function(value)
+{if(value!=null)
+{return(this.each(function()
+{privateMethods.setLanguagesValues($(this),value);}));}
+else
+{var properties=this.data('properties');return(properties.languagesValues);}},value:function(value,language)
+{if(value!=null)
+{var options=this.data('options');return(this.each(function()
+{if(language!=null)
+{privateMethods.setLanguageValue($(this),language,value,options.currentLanguage==language);}
+else
+{privateMethods.setValue($(this),value,true);}}));}
+else
+{var properties=this.data('properties');return(properties.value);}},isValid:function(value)
+{if(value!=null)
+{return(this.each(function()
+{privateMethods.setIsValid($(this),value);}));}
+else
+{var properties=this.data('properties');return(properties.isValid);}},change:function(value)
+{if(value!=null&&$.isFunction(value))
+{return(this.each(function()
+{privateMethods.setEventChange($(this),value);}));}
+else
+{var options=this.data('options');if(options)
+{return(options.change);}
+else
+{return(null);}}},doTranslation:function()
+{return(this.each(function()
+{privateMethods.doTranslation($(this));}));}};var privateMethods={isValid:function(object,value)
+{var properties=object.data('properties');return(properties.re.exec(value))},setOptions:function(object,value)
+{var properties=object.data('properties'),options=object.data('options');if(!$.isPlainObject(value))return(false);properties.initialized=false;privateMethods.setMultilines(object,(value.multilines!=null)?value.multilines:options.multilines);privateMethods.setDisplayChar(object,(value.displayChar!=null)?value.displayChar:options.displayChar);privateMethods.setMaxChar(object,(value.maxChar!=null)?value.maxChar:options.maxChar);privateMethods.setNumRows(object,(value.numRows!=null)?value.numRows:options.numRows);privateMethods.setRegExp(object,(value.regExp!=null)?value.regExp:options.regExp);privateMethods.setLanguages(object,(value.languages!=null)?value.languages:options.languages);privateMethods.setLanguagesValues(object,(value.languagesValues!=null)?value.languagesValues:options.languagesValues);privateMethods.setCurrentLanguage(object,(value.currentLanguage!=null)?value.currentLanguage:options.currentLanguage);privateMethods.setLanguageSelector(object,(value.languageSelector!=null)?value.languageSelector:options.languageSelector);if((properties.languagesValues[options.currentLanguage]!=null&&properties.languagesValues[options.currentLanguage]!=''||properties.languagesValues[options.currentLanguage]==null)&&(value.value!=null&&value.value!=''||options.value!=''))privateMethods.setValue(object,(value.value!=null)?value.value:options.value,true);privateMethods.setTextAlign(object,(value.textAlign!=null)?value.textAlign:options.textAlign);privateMethods.setEventChange(object,(value.change!=null)?value.change:options.change);properties.initialized=true;},setRegExp:function(object,value)
+{var properties=object.data('properties'),flagRE=/^\/(.*)\/(.*)$/,flags=flagRE.exec(value);if(flags==null)
+{flags=['.*',''];}
+delete properties.re;properties.re=new RegExp(flags[1],flags[2]);},setIsValid:function(object,value)
+{var objects=object.data('objects'),properties=object.data('properties');if(properties.isValid!=value&&properties.initialized)
+{properties.isValid=value;if(properties.isValid)
+{objects.container.removeClass('ui-error');objects.input.removeClass('ui-error');}
+else
+{objects.container.addClass('ui-error');objects.input.addClass('ui-error');}}
+return(properties.isValid);},setDisplayChar:function(object,value)
+{var options=object.data('options'),objects=object.data('objects');properties=object.data('properties');if((!properties.initialized||options.displayChar!=value)&&value>=0)
+{options.displayChar=value;if(options.displayChar>0)
+{if(options.multilines)
+{objects.input.attr('cols',options.displayChar);}
+else
+{objects.input.attr('size',options.displayChar);}}
+else
+{if(options.multilines)
+{objects.input.removeAttr('size');}
+else
+{objects.input.removeAttr('cols');}}}
+if(object.width()>0)
+{objects.input.css({'width':object.width()+'px','max-width':object.width()+'px'});}
+return(options.displayChar);},setMaxChar:function(object,value)
+{var options=object.data('options'),objects=object.data('objects'),properties=object.data('properties');if((!properties.initialized||options.maxChar!=value)&&value>=0)
+{options.maxChar=value;if(!options.multilines)
+{if(options.maxChar>0)
+{objects.input.attr('maxlength',options.maxChar);}
+else
+{objects.input.removeAttr('maxlength');}}}
+return(options.maxChar);},setNumRows:function(object,value)
+{var options=object.data('options'),objects=object.data('objects'),properties=object.data('properties');if((!properties.initialized||options.numRows!=value)&&value>0)
+{options.numRows=value;if(options.multilines)
+{objects.input.attr('rows',options.numRows);}}
+return(options.numRows);},setDisabled:function(object,value)
+{var options=object.data('options'),objects=object.data('objects'),properties=object.data('properties');if((!properties.initialized||options.disabled!=value)&&(value==true||value==false))
+{options.disabled=value;objects.input.attr('disabled',options.disabled);}
+return(options.disabled);},setTextAlign:function(object,value)
+{var options=object.data('options'),objects=object.data('objects'),properties=object.data('properties');if((!properties.initialized||options.textAlign!=value)&&(value=='left'||value=='right'))
+{options.textAlign=value;objects.input.css('text-align',options.textAlign);}
+return(options.textAlign);},setMultilines:function(object,value)
+{var options=object.data('options'),objects=object.data('objects'),properties=object.data('properties');if((!properties.initialized||options.multilines!=value)&&(value==true||value==false))
+{options.multilines=value;if(options.multilines)
+{objects.input=$('<textarea/>');}
+else
+{objects.input=$('<input>',{type:"text",value:''});}
+objects.container.append(objects.input.bind('keyup.inputText',function(event)
+{return(privateMethods.keyUp(object,event));}).bind('change.inputText',function(event)
+{return(privateMethods.change(object,event));}).bind('keydown.inputText',function(event)
+{return(privateMethods.keyDown(object,event));}));}
+return(options.textAlign);},setLanguages:function(object,value)
+{var properties=object.data('properties'),options=object.data('options');options.languages=value;options.languagesValues={};if(options.languages.length>0)
+{if($.inArray(options.currentLanguage,options.languages)<0||options.currentLanguage=='')options.currentLanguage=options.languages[0];for(var i=0;i<options.languages.length;i++)
+{properties.languagesValues[options.languages[i]]='';}}
+else
+{options.currentLanguage='';}
+return(options.languages);},setLanguagesValues:function(object,value)
+{var options=object.data('options'),properties=object.data('properties');for(var langValue in value)
+{if(properties.languagesValues[langValue]!=null)
+privateMethods.setLanguageValue(object,langValue,value[langValue],langValue==options.currentLanguage);}
+return(properties.languagesValues);},setLanguageValue:function(object,language,value,updateInput)
+{var options=object.data('options'),properties=object.data('properties');if(properties.languagesValues[language]!=null)
+{properties.languagesValues[language]=value;if(updateInput)privateMethods.setValue(object,properties.languagesValues[options.currentLanguage],true);}
+return(options.languagesValues);},setCurrentLanguage:function(object,value)
+{var options=object.data('options'),properties=object.data('properties');if((!properties.initialized||options.currentLanguage!=value)&&$.inArray(value,options.languages)>=0)
+{options.currentLanguage=value;privateMethods.setValue(object,properties.languagesValues[options.currentLanguage],true);}
+return(options.currentLanguage);},setLanguageSelector:function(object,value)
+{var options=object.data('options'),properties=object.data('properties');if((!properties.initialized||options.languageSelector!=value)&&value!=''&&$('#'+value).length>0)
+{if(options.languageSelector!='')$('#'+options.languageSelector).unbind('inputListChange');options.languageSelector=value;if(options.languageSelector!='')
+$('#'+options.languageSelector).bind('inputListChange',function(event,lang)
+{privateMethods.setCurrentLanguage(object,lang);});}
+return(options.currentLanguage);},setValue:function(object,value,apply)
+{var options=object.data('options'),properties=object.data('properties'),objects=object.data('objects');if(properties.initialized&&properties.value==value)
+{return(properties.value);}
+privateMethods.setIsValid(object,true);properties.value=value;if(apply)
+{objects.input.val(properties.value);}
+if(options.currentLanguage!='')privateMethods.setLanguageValue(object,options.currentLanguage,value,false);if(options.change)object.trigger('inputTextChange',properties.value);return(properties.value);},setEventChange:function(object,value)
+{var options=object.data('options');options.change=value;object.unbind('inputTextChange');if(value)object.bind('inputTextChange',options.change);return(options.change);},keyUp:function(object,event)
+{var objects=object.data('objects');if(event.keyCode==9||event.keyCode==12||event.keyCode==16||event.keyCode==17||event.keyCode==18||event.keyCode==33||event.keyCode==34||event.keyCode==35||event.keyCode==36||event.keyCode==37||event.keyCode==38||event.keyCode==39||event.keyCode==40||event.keyCode==45||event.keyCode==93)return(false);return(privateMethods.setValue(object,objects.input.val(),false));},change:function(object,event)
+{var objects=object.data('objects');return(privateMethods.setValue(object,objects.input.val(),false))},keyDown:function(object,event)
+{var objects=object.data('objects'),options=object.data('options');if(options.maxChar>0&&objects.input.val().length>=options.maxChar&&!(event.keyCode==8||event.keyCode==9||event.keyCode==12||event.keyCode==16||event.keyCode==17||event.keyCode==18||event.keyCode==33||event.keyCode==34||event.keyCode==35||event.keyCode==36||event.keyCode==37||event.keyCode==38||event.keyCode==39||event.keyCode==40||event.keyCode==45||event.keyCode==46||event.keyCode==93||objects.input.get(0).selectionStart!=objects.input.get(0).selectionEnd))return(false);},doTranslation:function(object)
+{var objects=object.data('objects'),properties=object.data('properties'),options=object.data('options');if(googleTranslate!=null)
+{googleTranslate(properties.value,'',options.currentLanguage.substr(0,2),function(result)
+{privateMethods.setValue(object,result,true);});}}};$.fn.inputText=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.inputText');}}})(jQuery);
Index: /extensions/GrumPluginClasses/js/ui.tagSelector.js
===================================================================
--- /extensions/GrumPluginClasses/js/ui.tagSelector.js	(revision 8960)
+++ /extensions/GrumPluginClasses/js/ui.tagSelector.js	(revision 8961)
@@ -22,6 +22,7 @@
  *
  * | release | date       |
- * | 1.0.0   | 2010/10/10 | first release
+ * | 1.0.0   | 2010/10/10 | * first release
  * |         |            |
+ * | 1.1.0   | 2010/11/03 | * add 'isValid' method
  * |         |            |
  * |         |            |
@@ -93,4 +94,5 @@
                     cache:[],
                     timerHandle:null,
+                    isValid:true
                   }
                 );
@@ -118,5 +120,5 @@
                       {
                         html: '',
-                        'class':'ui-tag-selector-selected-tag-list',
+                        'class':'ui-tag-selector-selected-tag-list'
                       }
                     ),
@@ -151,5 +153,5 @@
                             display:'none',
                             position:'absolute',
-                            zIndex:9999,
+                            zIndex:9999
                           }
                         }
@@ -166,5 +168,5 @@
                           padding:'0px',
                           margin:'0px',
-                          overflow:"auto",
+                          overflow:"auto"
                         }
                       }
@@ -217,9 +219,7 @@
       options: function (value)
         {
-          this.each(function()
-            {
-              var $this=$(this);
-              privateMethods.setOptions($this, value);
-              return($this);
+          return this.each(function()
+            {
+              privateMethods.setOptions($(this), value);
             }
           );
@@ -229,11 +229,9 @@
       ignoreCase: function (value)
         {
-          if(value)
-          {
-            this.each(function()
-              {
-                var $this=$(this);
-                privateMethods.setIgnoreCase($this, value);
-                return($this);
+          if(value!=null)
+          {
+            return this.each(function()
+              {
+                privateMethods.setIgnoreCase($(this), value);
               }
             );
@@ -256,11 +254,9 @@
       inputNumCar: function (value)
         {
-          if(value)
-          {
-            this.each(function()
-              {
-                var $this=$(this);
-                privateMethods.setInputNumCar($this, value);
-                return($this);
+          if(value!=null)
+          {
+            return this.each(function()
+              {
+                privateMethods.setInputNumCar($(this), value);
               }
             );
@@ -311,11 +307,9 @@
       maximumTagLoaded: function (value)
         {
-          if(value)
-          {
-            this.each(function()
-              {
-                var $this=$(this);
-                privateMethods.setMaximumTagLoaded($this, value);
-                return($this);
+          if(value!=null)
+          {
+            return this.each(function()
+              {
+                privateMethods.setMaximumTagLoaded($(this), value);
               }
             );
@@ -338,11 +332,9 @@
       listMaxWidth: function (value)
         {
-          if(value)
-          {
-            this.each(function()
-              {
-                var $this=$(this);
-                privateMethods.setListMaxWidth($this, value);
-                return($this);
+          if(value!=null)
+          {
+            return this.each(function()
+              {
+                privateMethods.setListMaxWidth($(this), value);
               }
             );
@@ -365,11 +357,9 @@
       listMaxHeight: function (value)
         {
-          if(value)
-          {
-            this.each(function()
-              {
-                var $this=$(this);
-                privateMethods.setListMaxHeight($this, value);
-                return($this);
+          if(value!=null)
+          {
+            return this.each(function()
+              {
+                privateMethods.setListMaxHeight($(this), value);
               }
             );
@@ -393,11 +383,9 @@
       serverCallDelay: function (value)
         {
-          if(value)
-          {
-            this.each(function()
-              {
-                var $this=$(this);
-                privateMethods.setServerCallDelay($this, value);
-                return($this);
+          if(value!=null)
+          {
+            return this.each(function()
+              {
+                privateMethods.setServerCallDelay($(this), value);
               }
             );
@@ -421,11 +409,9 @@
       serverUrl: function (value)
         {
-          if(value)
-          {
-            this.each(function()
-              {
-                var $this=$(this);
-                privateMethods.setServerUrl($this, value);
-                return($this);
+          if(value!=null)
+          {
+            return this.each(function()
+              {
+                privateMethods.setServerUrl($(this), value);
               }
             );
@@ -448,11 +434,9 @@
       textStart: function (value)
         {
-          if(value)
-          {
-            this.each(function()
-              {
-                var $this=$(this);
-                privateMethods.setTextStart($this, value);
-                return($this);
+          if(value!=null)
+          {
+            return this.each(function()
+              {
+                privateMethods.setTextStart($(this), value);
               }
             );
@@ -475,11 +459,9 @@
       textFound: function (value)
         {
-          if(value)
-          {
-            this.each(function()
-              {
-                var $this=$(this);
-                privateMethods.setTextFound($this, value);
-                return($this);
+          if(value!=null)
+          {
+            return this.each(function()
+              {
+                privateMethods.setTextFound($(this), value);
               }
             );
@@ -502,11 +484,9 @@
       textDisplay: function (value)
         {
-          if(value)
-          {
-            this.each(function()
-              {
-                var $this=$(this);
-                privateMethods.setTextDisplay($this, value);
-                return($this);
+          if(value!=null)
+          {
+            return this.each(function()
+              {
+                privateMethods.setTextDisplay($(this), value);
               }
             );
@@ -529,11 +509,9 @@
       filter: function (value)
         {
-          if(value)
-          {
-            this.each(function()
-              {
-                var $this=$(this);
-                privateMethods.setFilter($this, value);
-                return($this);
+          if(value!=null)
+          {
+            return this.each(function()
+              {
+                privateMethods.setFilter($(this), value);
               }
             );
@@ -556,11 +534,9 @@
       mode: function (value)
         {
-          if(value)
-          {
-            this.each(function()
-              {
-                var $this=$(this);
-                privateMethods.setMode($this, value);
-                return($this);
+          if(value!=null)
+          {
+            return this.each(function()
+              {
+                privateMethods.setMode($(this), value);
               }
             );
@@ -583,5 +559,5 @@
       value: function (value)
         {
-          if(value)
+          if(value!=null)
           {
             // set selected value
@@ -596,7 +572,28 @@
             // return the selected tags
             var properties=this.data('properties');
+
             return(properties.tags);
           }
         }, // value
+
+      isValid: function (value)
+        {
+          if(value!=null)
+          {
+            // set selected value
+            return this.each(function()
+              {
+                privateMethods.setIsValid($(this), value);
+              }
+            );
+          }
+          else
+          {
+            // return the selected tags
+            var properties=this.data('properties');
+
+            return(properties.isValid);
+          }
+        }, // isValid
 
       load: function (value)
@@ -610,9 +607,7 @@
           {
             // set selected value
-            this.each(function()
-              {
-                var $this=$(this);
-                privateMethods.setEventLoad($this, value);
-                return($this);
+            return this.each(function()
+              {
+                privateMethods.setEventLoad($(this), value);
               }
             );
@@ -630,9 +625,7 @@
           {
             // set selected value
-            this.each(function()
-              {
-                var $this=$(this);
-                privateMethods.setEventPopup($this, value);
-                return($this);
+            return this.each(function()
+              {
+                privateMethods.setEventPopup($(this), value);
               }
             );
@@ -658,9 +651,7 @@
           {
             // set selected value
-            this.each(function()
-              {
-                var $this=$(this);
-                privateMethods.setEventAdd($this, value);
-                return($this);
+            return this.each(function()
+              {
+                privateMethods.setEventAdd($(this), value);
               }
             );
@@ -686,9 +677,7 @@
           {
             // set selected value
-            this.each(function()
-              {
-                var $this=$(this);
-                privateMethods.setEventRemove($this, value);
-                return($this);
+            return this.each(function()
+              {
+                privateMethods.setEventRemove($(this), value);
               }
             );
@@ -764,8 +753,31 @@
         },
 
+      setIsValid : function (object, value)
+        {
+          var objects=object.data('objects'),
+              properties=object.data('properties');
+
+          if(properties.isValid!=value)
+          {
+            properties.isValid=value;
+            if(properties.isValid)
+            {
+              objects.container.removeClass('ui-error');
+              objects.input.removeClass('ui-error');
+            }
+            else
+            {
+              objects.container.addClass('ui-error');
+              objects.input.addClass('ui-error');
+            }
+          }
+          return(properties.isValid);
+        },
+
       setIgnoreCase : function (object, value)
         {
           var options=object.data('options'),
               properties=object.data('properties');
+
           if((!properties.initialized || options.ignoreCase!=value) && (value==true || value==false))
           {
@@ -780,4 +792,5 @@
               objects=object.data('objects'),
               properties=object.data('properties');
+
           if((!properties.initialized || options.inputNumCar!=value) && value>0)
           {
@@ -805,4 +818,5 @@
           var options=object.data('options'),
               properties=object.data('properties');
+
           if((!properties.initialized || options.setMaximumTagLoaded!=value) && value>=0)
           {
@@ -817,4 +831,5 @@
           var options=object.data('options'),
               properties=object.data('properties');
+
           if(!properties.initialized || options.textStart!=value)
           {
@@ -828,4 +843,5 @@
           var options=object.data('options'),
               properties=object.data('properties');
+
           if(!properties.initialized || options.textFound!=value)
           {
@@ -839,4 +855,5 @@
           var options=object.data('options'),
               properties=object.data('properties');
+
           if(!properties.initialized || options.textDisplay!=value)
           {
@@ -851,4 +868,5 @@
               properties=object.data('properties'),
               objects=object.data('objects');
+
           if((!properties.initialized || options.listMaxWidth!=value) && value>=0)
           {
@@ -871,4 +889,5 @@
               properties=object.data('properties'),
               objects=object.data('objects');
+
           if((!properties.initialized || options.listMaxHeight!=value) && value>=0)
           {
@@ -890,4 +909,5 @@
           var options=object.data('options'),
               properties=object.data('properties');
+
           if((!properties.initialized || options.serverCallDelay!=value) && value>0 )
           {
@@ -901,4 +921,5 @@
           var options=object.data('options'),
               properties=object.data('properties');
+
           if(!properties.initialized || options.serverUrl!=value)
           {
@@ -914,4 +935,5 @@
           var options=object.data('options'),
               properties=object.data('properties');
+
           if((!properties.initialized || options.mode!=value) && (value=='admin' || value=='public'))
           {
@@ -925,4 +947,5 @@
           var options=object.data('options'),
               properties=object.data('properties');
+
           if((!properties.initialized || options.filter!=value) && (value=='all' || value=='affected'))
           {
@@ -935,6 +958,5 @@
       setValue : function (object, value)
         {
-          var options=object.data('options'),
-              properties=object.data('properties'),
+          var properties=object.data('properties'),
               objects=object.data('objects');
 
@@ -1071,5 +1093,5 @@
                 {
                   objects.selectorList.html('Error ! '+msg);
-                },
+                }
             }
          );
@@ -1080,5 +1102,4 @@
           // clear the cache tag list
           var objects=object.data('objects'),
-              options=object.data('options'),
               properties=object.data('properties');
 
@@ -1086,4 +1107,5 @@
           properties.cache=[];
         },
+
       cacheAddItems : function (object, listItems)
         {
@@ -1098,5 +1120,5 @@
               {
                 id:listItems[i].id,
-                name:listItems[i].name,
+                name:listItems[i].name
               }
             );
@@ -1213,4 +1235,5 @@
         {
           var options=object.data('options');
+
           options.popup=value;
           object.unbind('tagSelectorPopup');
@@ -1218,7 +1241,9 @@
           return(options.popup);
         },
+
       setEventAdd : function (object, value)
         {
           var options=object.data('options');
+
           options.add=value;
           object.unbind('tagSelectorAdd');
@@ -1226,7 +1251,9 @@
           return(options.add);
         },
+
       setEventRemove : function (object, value)
         {
           var options=object.data('options');
+
           options.remove=value;
           object.unbind('tagSelectorRemove');
@@ -1234,4 +1261,5 @@
           return(options.remove);
         },
+
       setEventLoad : function (object, value)
         {
@@ -1253,4 +1281,5 @@
           }
         },
+
       setTimerHandle : function(object)
         {
Index: /extensions/GrumPluginClasses/js/ui.tagSelector.min.js
===================================================================
--- /extensions/GrumPluginClasses/js/ui.tagSelector.min.js	(revision 8961)
+++ /extensions/GrumPluginClasses/js/ui.tagSelector.min.js	(revision 8961)
@@ -0,0 +1,273 @@
+/* file: ui.tagSelector.js - v1.0.0 | minified on 2011/01/27 with http://jscompress.com/ */
+(function($)
+{var publicMethods={init:function(opt)
+{return this.each(function()
+{var $this=$(this),data=$this.data('options'),objects=$this.data('objects'),properties=$this.data('properties'),options={ignoreCase:true,serverUrl:'plugins/GrumPluginClasses/gpc_ajax.php',serverCallDelay:250,listMaxWidth:0,listMaxHeight:0,maximumTagLoaded:0,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};$this.data('options',options);if(!properties)
+{$this.data('properties',{initialized:false,selectorVisible:false,totalTags:0,tags:[],cache:[],timerHandle:null,isValid:true});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);});},destroy:function()
+{return this.each(function()
+{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:''});});},options:function(value)
+{return this.each(function()
+{privateMethods.setOptions($(this),value);});},ignoreCase:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setIgnoreCase($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.ignoreCase);}
+else
+{return(true);}}},inputNumCar:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setInputNumCar($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.inputNumCar);}
+else
+{return(true);}}},maximumTagLoaded:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setMaximumTagLoaded($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.maximumTagLoaded);}
+else
+{return(0);}}},listMaxWidth:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setListMaxWidth($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.listMaxWidth);}
+else
+{return(0);}}},listMaxHeight:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setListMaxHeight($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.listMaxHeight);}
+else
+{return(0);}}},serverCallDelay:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setServerCallDelay($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.serverCallDelay);}
+else
+{return(0);}}},serverUrl:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setServerUrl($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.serverUrl);}
+else
+{return('');}}},textStart:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setTextStart($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.textStart);}
+else
+{return('');}}},textFound:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setTextFound($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.textFound);}
+else
+{return('');}}},textDisplay:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setTextDisplay($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.textDisplay);}
+else
+{return('');}}},filter:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setFilter($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.filter);}
+else
+{return(true);}}},mode:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setMode($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.mode);}
+else
+{return(true);}}},value:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setValue($(this),value);});}
+else
+{var properties=this.data('properties');return(properties.tags);}},isValid:function(value)
+{if(value!=null)
+{return this.each(function()
+{privateMethods.setIsValid($(this),value);});}
+else
+{var properties=this.data('properties');return(properties.isValid);}},load:function(value)
+{if(value&&$.isFunction(value))
+{return this.each(function()
+{privateMethods.setEventLoad($(this),value);});}
+else
+{privateMethods.load(this);}},popup:function(value)
+{if(value&&$.isFunction(value))
+{return this.each(function()
+{privateMethods.setEventPopup($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.popup);}
+else
+{return(null);}}},add:function(value)
+{if(value&&$.isFunction(value))
+{return this.each(function()
+{privateMethods.setEventAdd($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.add);}
+else
+{return(null);}}},remove:function(value)
+{if(value&&$.isFunction(value))
+{return this.each(function()
+{privateMethods.setEventRemove($(this),value);});}
+else
+{var options=this.data('options');if(options)
+{return(options.remove);}
+else
+{return(null);}}},numberOfTags:function()
+{var properties=this.data('properties');if(properties)
+{return(properties.tags.length);}
+else
+{return(null);}}};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.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;},setIsValid:function(object,value)
+{var objects=object.data('objects'),properties=object.data('properties');if(properties.isValid!=value)
+{properties.isValid=value;if(properties.isValid)
+{objects.container.removeClass('ui-error');objects.input.removeClass('ui-error');}
+else
+{objects.container.addClass('ui-error');objects.input.addClass('ui-error');}}
+return(properties.isValid);},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);},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 properties=object.data('properties'),objects=object.data('objects');if(value=='clear')
+{properties.tags=[];objects.selectedTagList.children('.ui-tag-selector-selected-tag').remove();privateMethods.cacheClear(object);objects.input.val('');}
+else
+{if(!$.isArray(value))
+{value=[value];}
+for(var i=0;i<value.length;i++)
+{if(value[i].id!=null&&value[i].name!=null)
+{if(privateMethods.removeTag(object,value[i].id)==-1)privateMethods.addTag(object,value[i].id,value[i].name);}
+else
+{privateMethods.removeTag(object,value[i]);}}}
+return(null);},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);},load:function(object)
+{var options=object.data('options'),properties=object.data('properties'),objects=object.data('objects');privateMethods.clearTimerHandle(object);if(objects.input.val()=='')
+{privateMethods.cacheClear(object);privateMethods.displaySelector(object,true);return(false);}
+$.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)
+{var objects=object.data('objects'),properties=object.data('properties');objects.tagList.children().unbind().remove();properties.cache=[];},cacheAddItems:function(object,listItems)
+{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)
+{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);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');}}})(jQuery);
Index: /extensions/GrumPluginClasses/main.inc.php
===================================================================
--- /extensions/GrumPluginClasses/main.inc.php	(revision 8960)
+++ /extensions/GrumPluginClasses/main.inc.php	(revision 8961)
@@ -2,5 +2,5 @@
 /*
 Plugin Name: Grum Plugins Classes.3
-Version: 3.3.4
+Version: 3.4.0
 Description: Collection de classes partagées entre mes plugins (existants, ou à venir) / Partaged classes between my plugins (actuals or futures)
 Plugin URI: http://piwigo.org/ext/extension_view.php?eid=199
@@ -104,6 +104,32 @@
 |         |            |   . optimization for RBuilder loading language management
 |         |            |
-| 3.3.4   | 2011/01/20 | * Add languages
-|         |            |
+| 3.4.0   | 2011/01/28 | * mantis bug:1984
+|         |            |   . RBuilder returns an error message when one picture
+|         |            |     have multiple categories
+|         |            |
+|         |            | * fix bug:2109
+|         |            |   . Incompatibility with IE8 (rbuilder)
+|         |            |
+|         |            | * Fix bug on simpleTip.js (script release 1.0.1)
+|         |            |
+|         |            | * GPCCore, GPCTranslate, GPCUsersGroups classes updated
+|         |            |
+|         |            | * add jQuery plugin pack & associated css files
+|         |            |   . inputText
+|         |            |   . inputList
+|         |            |   . inputRadio
+|         |            |   . inputCheckbox
+|         |            |   . inputColorPicker
+|         |            |   . inputColorsFB
+|         |            |   . inputConsole
+|         |            |   . inputDotArea
+|         |            |   . inputNum
+|         |            |   . inputPosition
+|         |            |   . inputStatusBar
+|         |            |
+|         |            | * update categorySelector jQuery plugin
+|         |            |
+|         |            | * minify js scripts (larger size than packed files but
+|         |            |   better performance)
 |         |            |
 |         |            |
@@ -137,5 +163,4 @@
     GPCUsersGroups.class.inc.php
 
-    genericjs.class.inc.php  + genericjs.js
 
 See each file to know more about them
Index: /extensions/GrumPluginClasses/templates/GPCRequestBuilder_search.tpl
===================================================================
--- /extensions/GrumPluginClasses/templates/GPCRequestBuilder_search.tpl	(revision 8960)
+++ /extensions/GrumPluginClasses/templates/GPCRequestBuilder_search.tpl	(revision 8961)
@@ -1,6 +1,2 @@
-{known_script id="jquery.ui" src=$ROOT_URL|@cat:"themes/default/js/ui/packed/ui.core.packed.js"}
-{known_script id="jquery.ui.dialog" src=$ROOT_URL|@cat:"themes/default/js/ui/packed/ui.dialog.packed.js"}
-{known_script id="gpc.pagesNavigator" src=$ROOT_URL|@cat:"plugins/GrumPluginClasses/js/pagesNavigator.packed.js"}
-{known_script id="gpc.rbSearch" src=$ROOT_URL|@cat:"plugins/GrumPluginClasses/js/rbSearch.packed.js"}
 
 {foreach from=$datas.dialogBox item=dialogBox}
