source: extensions/GrumPluginClasses/classes/GPCCore.class.inc.php @ 17562

Last change on this file since 17562 was 17562, checked in by grum, 8 years ago

bug:2723
+ improve some GPC framework functionnalities

File size: 44.9 KB
Line 
1<?php
2
3/* -----------------------------------------------------------------------------
4  class name     : GPCCore
5  class version  : 1.4.2
6  plugin version : 3.5.3
7  date           : 2012-07-27
8  ------------------------------------------------------------------------------
9  author: grum at piwigo.org
10  << May the Little SpaceFrog be with you >>
11  ------------------------------------------------------------------------------
12
13  :: HISTORY
14
15| release | date       |
16| 1.0.0   | 2010/03/30 | * Update class & function names
17|         |            |
18| 1.1.0   | 2010/03/30 | * add the BBtoHTML function
19|         |            |
20| 1.2.0   | 2010/07/28 | * add the loadConfigFromFile function
21|         |            |
22| 1.3.0   | 2010/10/13 | * add the addHeaderCSS, addHeaderJS functions
23|         |            |
24| 1.3.1   | 2010/10/20 | * applyHeaderItems functions implemented with an
25|         |            |   higher priority on the 'loc_begin_page_header' event
26|         |            |
27|         |            | * implement the getUserLanguageDesc() function, using
28|         |            |   extended description function if present
29|         |            |
30|         |            | * implement the getPiwigoSystemPath() function
31|         |            |
32|         |            | * implement the rmDir() function
33|         |            |
34| 1.3.2   | 2011/01/28 | * implement the addUI() function
35|         |            |
36|         |            | * implement getMinified() & setMinifiedState() functions
37|         |            |
38| 1.3.3   | 2011/02/01 | * fix bug on loadConfig() function
39|         |            |
40|         |            | * update deleteConfig() function (allow to be used to
41|         |            |   delete the GPCCore config)
42|         |            |
43|         |            | * mantis bug:2167
44|         |            |
45| 1.3.4   | 2011/02/02 | * mantis bug:2170
46|         |            |   . File path for RBuilder registered plugins is corrupted
47|         |            |
48|         |            | * mantis bug:2178
49|         |            |   . RBuilder register function don't work
50|         |            |
51|         |            | * mantis bug:2179
52|         |            |   . JS file loaded in wrong order made incompatibility
53|         |            |     with Lightbox, GMaps & ASE plugins (and probably other)
54|         |            |
55| 1.4.0   | 2011/04/10 | * Updated for piwigo 2.2
56|         |            |
57| 1.4.1   | 2011/09/19 | * Add [var] and [form_mail] markup interpreter
58|         |            |
59|         | 2012/05/25 | * Add GPCUserAgent class
60|         |            |
61|         |            | * Compatibility with jquery 1.7.2 & jquery-ui 1.8.16
62|         |            |   . remove getMinified() & setMinifiedState() functions
63|         |            |        (let piwigo combined function manage the minified
64|         |            |         state)
65|         |            |   . add manually each component for ui functionnalities
66|         |            |
67|         |            | * Remove google translate connector (google has changed the useage
68|         |            |    and now an API key is needed)
69|         |            |
70|         |            | * Add js objects: inputDate, inputFilterBox, inputPages, inputSortBox, inputTag
71|         |            |                   dynamicTable
72|         |            |
73|         |            | * AddHeaderCSS and AddJS are ignored if called in an ajax session (AJAX_CALL defined)
74|         |            |
75| 1.4.2   | 2012/07/27 | * AddHeaderContent can manage 'raw' content
76|         |            |
77|         |            |
78|         |            |
79
80  ------------------------------------------------------------------------------
81    no constructor, only static function are provided
82    - static function loadConfig
83    - static function loadConfigFromFile
84    - static function saveConfig
85    - static function deleteConfig
86    - static function getRegistered
87    - static function getModulesInfos
88    - static function register
89    - static function unregister
90    - static function BBtoHTML
91    - static function VarToHTML
92    - static function TabsToHTML
93    - static function FormMailToHTML
94    - static function addHeaderCSS
95    - static function addHeaderJS
96    - static function addUI
97    - static function getUserLanguageDesc
98    - static function getPiwigoSystemPath
99    - static function formatOctet
100    - static function rmDir
101    - static function applyMarkups
102    - static function setTemplateToken
103    - static function addHeaderContent
104   ---------------------------------------------------------------------- */
105
106
107
108class GPCCore
109{
110  static private $piwigoSystemPath;
111
112  static public $pluginName = "GPCCore";
113  static protected $headerItems = array(
114    'css' => array(),
115    'js'  => array()
116  );
117
118  static public function init()
119  {
120    global $conf;
121
122    self::$piwigoSystemPath=dirname(dirname(dirname(dirname(__FILE__))));
123
124    if((isset($conf['gpc.markup.bb']) && $conf['gpc.markup.bb']) ||
125       (isset($conf['gpc.markup.var']) && $conf['gpc.markup.var']) ||
126       (isset($conf['gpc.markup.form']) && $conf['gpc.markup.form'])
127      )
128    {
129      add_event_handler('render_category_name', array('GPCCore', 'applyMarkups'), EVENT_HANDLER_PRIORITY_NEUTRAL+5);
130      add_event_handler('render_category_description', array('GPCCore', 'applyMarkups'), EVENT_HANDLER_PRIORITY_NEUTRAL+5, 2);
131      add_event_handler('render_element_description', array('GPCCore', 'applyMarkups'), EVENT_HANDLER_PRIORITY_NEUTRAL+5);
132      add_event_handler('AP_render_content', array('GPCCore', 'applyMarkups'), EVENT_HANDLER_PRIORITY_NEUTRAL+5);
133    }
134  }
135
136  /* ---------------------------------------------------------------------------
137   * grum plugin classes informations functions
138   * -------------------------------------------------------------------------*/
139  static public function getModulesInfos()
140  {
141    return(
142      Array(
143        Array('name' => "CommonPlugin", 'version' => "2.3.0"),
144        Array('name' => "GPCAjax", 'version' => "3.1.0"),
145        Array('name' => "GPCCategorySelector", 'version' => "1.0.1"),
146        Array('name' => "GPCCore", 'version' => "1.4.2"),
147        //Array('name' => "GPCCss", 'version' => "3.1.0"),  removed with v1.4.1
148        Array('name' => "GPCPagesNavigation", 'version' => "2.0.0"),
149        Array('name' => "GPCPublicIntegration", 'version' => "2.0.0"),
150        Array('name' => "GPCRequestBuilder", 'version' => "1.1.7"),
151        Array('name' => "GPCTables", 'version' => "1.5.0"),
152        Array('name' => "GPCTabSheet", 'version' => "1.1.2"),
153        Array('name' => "GPCTranslate", 'version' => "2.1.1"),
154        Array('name' => "GPCUsersGroups", 'version' => "2.1.0"),
155        Array('name' => "GPCUserAgent", 'version' => "1.0.0")
156      )
157    );
158  }
159
160
161  /* ---------------------------------------------------------------------------
162   * register oriented functions
163   * -------------------------------------------------------------------------*/
164
165  /**
166   * register a plugin using GPC
167   *
168   * @param String $pluginName : the plugin name
169   * @param String $release : the plugin version like "2.0.0"
170   * @param String $GPCNeed : the minimal version of GPC needed by the plugin to
171   *                          work
172   * @return Boolean : true if registering is Ok, otherwise false
173   */
174  static public function register($plugin, $release, $GPCneeded)
175  {
176    $config=Array();
177    if(!self::loadConfig(self::$pluginName, $config))
178    {
179      $config['registered']=array();
180    }
181
182    $config['registered'][$plugin]=Array(
183      'name' => $plugin,
184      'release' => $release,
185      'needed' => $GPCneeded,
186      'date' => date("Y-m-d"),
187    );
188    return(self::saveConfig(self::$pluginName, $config));
189  }
190
191  /**
192   * unregister a plugin using GPC
193   *
194   * assume that if the plugin was not registerd before, unregistering returns
195   * a true value
196   *
197   * @param String $pluginName : the plugin name
198   * @return Boolean : true if registering is Ok, otherwise false
199   */
200  static public function unregister($plugin)
201  {
202    $config=Array();
203    if(self::loadConfig(self::$pluginName, $config))
204    {
205      if(array_key_exists('registered', $config))
206      {
207        if(array_key_exists($plugin, $config['registered']))
208        {
209          unset($config['registered'][$plugin]);
210          return(self::saveConfig(self::$pluginName, $config));
211        }
212      }
213    }
214    // assume if the plugin was not registered before, unregistering it is OK
215    return(true);
216  }
217
218  /**
219   * return the list of registered plugins
220   * @return Array : list of registered plugins
221   */
222  static public function getRegistered()
223  {
224    $config=Array();
225    if(self::loadConfig(self::$pluginName, $config))
226    {
227      if(array_key_exists('registered', $config))
228      {
229        return($config['registered']);
230      }
231    }
232    return(Array());
233  }
234
235
236
237  /* ---------------------------------------------------------------------------
238   * config oriented functions
239   * -------------------------------------------------------------------------*/
240
241  /**
242   *  load config from CONFIG_TABLE into an array
243   *
244   * @param String $pluginName : the plugin name, must contain only alphanumerical
245   *                             character
246   * @param Array $config : array, initialized or not with default values ; the
247   *                        config values are loaded in this value
248   * @return Boolean : true if config is loaded, otherwise false
249   */
250  static public function loadConfig($pluginName, &$config=Array())
251  {
252    global $conf;
253
254    if(!isset($conf[$pluginName.'_config']))
255    {
256      return(false);
257    }
258
259    $configValues = unserialize($conf[$pluginName.'_config']);
260    reset($configValues);
261    while (list($key, $val) = each($configValues))
262    {
263      if(is_array($val))
264      {
265        foreach($val as $key2 => $val2)
266        {
267          $config[$key][$key2]=$val2;
268
269          if(isset($conf['plugin.'.$pluginName]) and isset($conf['plugin.'.$pluginName][$key]) and isset($conf['plugin.'.$pluginName][$key][$key2]))
270              $config[$key][$key2]=$conf['plugin.'.$pluginName][$key][$key2];
271        }
272      }
273      else
274      {
275        $config[$key]=$val;
276        if(isset($conf['plugin.'.$pluginName]) and isset($conf['plugin.'.$pluginName][$key]))
277            $config[$key]=$conf['plugin.'.$pluginName][$key];
278      }
279    }
280
281    $conf[$pluginName.'_config']=serialize($config);
282
283    return(true);
284  }
285
286  /**
287   *  load config from a file into an array
288   *
289   *  note : the config file is a PHP file one var $conf used as an array,
290   *  like the piwigo $conf var
291   *
292   * @param String $fileName : the file name
293   * @param Array $config : array, initialized or not with default values ; the
294   *                        config values are loaded in this value
295   * @return Boolean : true if config is loaded, otherwise false
296   */
297  static public function loadConfigFromFile($fileName, &$config=Array())
298  {
299    $conf=array();
300
301    if(!is_array($config) or !file_exists($fileName))
302    {
303      return(false);
304    }
305
306    include_once($fileName);
307
308    foreach($conf as $key=>$val)
309    {
310      $config[$key]=$val;
311    }
312    return(true);
313  }
314
315
316  /**
317   * save var $my_config into CONFIG_TABLE
318   *
319   * @param String $pluginName : the plugin name, must contain only alphanumerical
320   *                             character
321   * @param Array $config : array of configuration values
322   * @return Boolean : true if config is saved, otherwise false
323   */
324  static public function saveConfig($pluginName, $config)
325  {
326    global $conf;
327
328    $sql="REPLACE INTO ".CONFIG_TABLE."
329           VALUES('".$pluginName."_config', '"
330           .pwg_db_real_escape_string(serialize($config))."', '')";
331    $result=pwg_query($sql);
332    if($result)
333    {
334      $conf[$pluginName.'_config']=serialize($config);
335      return true;
336    }
337    else
338    {
339      return false;
340    }
341  }
342
343  /**
344   * delete config from CONFIG_TABLE
345   *
346   * @param String $pluginName : the plugin name, must contain only alphanumerical
347   *                             character ; if empty, assume GPCCore config
348   * @return Boolean : true if config is deleted, otherwise false
349   */
350  static public function deleteConfig($pluginName='')
351  {
352    if($pluginName=='') $pluginName=self::$pluginName;
353    $sql="DELETE FROM ".CONFIG_TABLE."
354          WHERE param='".$pluginName."_config'";
355    $result=pwg_query($sql);
356    if($result)
357    { return true; }
358    else
359    { return false; }
360  }
361
362
363  /**
364   * convert (light) BB tag to HTML tag
365   *
366   * all BB codes are not recognized, only :
367   *  - [ul] [/ul]
368   *  - [li] [/li]
369   *  - [b] [/b]
370   *  - [i] [/i]
371   *  - [url] [/url]
372   *  - carriage return is replaced by a <br>
373   *
374   * @param String $text : text to convert
375   * @return String : BB to HTML text
376   */
377  static public function BBtoHTML($text)
378  {
379    $patterns = Array(
380      '/\[li\](.*?)\[\/li\]\n*/im',
381      '/\[b\](.*?)\[\/b\]/ism',
382      '/\[i\](.*?)\[\/i\]/ism',
383      '/\[p\](.*?)\[\/p\]/ism',
384      '/\[url\]([\w]+?:\/\/[^ \"\n\r\t<]*?)\[\/url\]/ism',
385      '/\[url=([\w]+?:\/\/[^ \"\n\r\t<]*?)\](.*?)\[\/url\]/ism',
386      '/\n{0,1}\[ul\]\n{0,1}/im',
387      '/\n{0,1}\[\/ul\]\n{0,1}/im',
388      '/\n{0,1}\[ol\]\n{0,1}/im',
389      '/\n{0,1}\[\/ol\]\n{0,1}/im',
390      '/\n/im',
391    );
392    $replacements = Array(
393      '<li>\1</li>',
394      '<b>\1</b>',
395      '<i>\1</i>',
396      '<p>\1</p>',
397      '<a href="\1">\1</a>',
398      '<a href="\1">\2</a>',
399      '<ul>',
400      '</ul>',
401      '<ol>',
402      '</ol>',
403      '<br>',
404    );
405
406    return(preg_replace($patterns, $replacements, $text));
407  }
408
409  /**
410   * apply [var] tag
411   *
412   * [var=<name>]
413   * with <name> :
414   *  - USER
415   *  - GALLERY_TITLE
416   *  - NB_PHOTOS
417   *  - CATEGORY
418   *  - TOKEN
419   *  - IP
420   *
421   * @param String $text : text to convert
422   * @return String : processed text
423   */
424  static public function VarToHTML($text)
425  {
426    global $user, $page, $conf;
427
428    $patterns = Array(
429      '/\[var=user\]/im',
430      '/\[var=gallery_title\]/im',
431      '/\[var=nb_photos\]/im',
432      '/\[var=category\]/im',
433      '/\[var=token\]/im',
434      '/\[var=ip\]/im'
435    );
436    $replacements = Array(
437      isset($user['username'])?$user['username']:'',
438      isset($conf['gallery_title'])?$conf['gallery_title']:'',
439      isset($user['nb_total_images'])?$user['nb_total_images']:'',
440      isset($page['category']['name'])?$page['category']['name']:'',
441      get_pwg_token(),
442      $_SERVER['REMOTE_ADDR']
443    );
444
445    return(preg_replace($patterns, $replacements, $text));
446  }
447
448  /**
449   * apply [form_mail] tag
450   *
451   * @param String $text : text to convert
452   * @return String : processed text
453   */
454  static public function FormMailToHTML($text)
455  {
456    global $template;
457
458    $file=GPCCore::getPiwigoSystemPath().'/'.PWG_LOCAL_DIR.'templates/GPCFormMsg.tpl';
459    if(!file_exists($file)) $file=dirname(dirname(__FILE__))."/templates/GPCFormMsg.tpl";
460
461    $template->set_filename('gpc_form', $file);
462
463    $template->assign('token', get_pwg_token() );
464
465    $patterns = Array(
466      '/\[form_mail\]/im'
467    );
468    $replacements = Array(
469      $template->parse('gpc_form', true)
470    );
471
472    if(preg_match($patterns[0], $text)>0)
473    {
474      GPCCore::addHeaderJS('gpc.markup.formMail', GPC_PATH.'js/markup.formMail.js', array('jquery'));
475      return(preg_replace($patterns, $replacements, $text));
476    }
477    return($text);
478  }
479
480  /**
481   * apply [tab], [/tab] and [tabs] tags
482   *
483   * @param String $text : text to convert
484   * @return String : processed text
485   */
486  static public function TabsToHTML($text)
487  {
488    $result=array();
489
490    $tabs='';
491    if(preg_match_all('/\[tab=([^(;\]).]*)(?:;(default))?;([^\].]*)\]/im', $text, $result, PREG_SET_ORDER)>0)
492    {
493      foreach($result as $val)
494      {
495        $tabs.="<li class='gpcTabSeparator'><a id='iGpcTab".$val[1]."' class='".($val[2]=='default'?'gpcTabSelected':'gpcTabNotSelected')."' tabId='#iGpcTabContent".$val[1]."'>".$val[3]."</a></li>";
496      }
497      $tabs="<div id='iGpcTabs'><ul>".$tabs."</ul></div>";
498    }
499    else return($text);
500
501    $patterns = Array(
502      '/\[tabs\]/im',
503      '/\[tab=([^(;\]).]*)(?!;default);.*\]/im',
504      '/\[tab=([^(;\]).]*);default;(.*)\]/im',
505      '/\[\/tab\]/im'
506    );
507    $replacements = Array(
508      $tabs,
509      '<div id="iGpcTabContent\1" class="gpcTabContent" style="display:none;">',
510      '<div id="iGpcTabContent\1" class="gpcTabContent">',
511      '</div>'
512    );
513
514    if(preg_match($patterns[0], $text)>0)
515    {
516      GPCCore::addHeaderJS('gpc.markup.tabs', GPC_PATH.'js/markup.tabs.js', array('jquery'));
517      GPCCore::addHeaderCSS('gpc.markup.tabs', GPC_PATH.'css/gpcTabs.css');
518      return(preg_replace($patterns, $replacements, $text));
519    }
520    return($text);
521  }
522
523  /**
524   * analyze and replace markups by their value, according to $conf parameted
525   * @param String $text: text to analyze
526   * @return String: analyzed text
527   */
528  static public function applyMarkups($text)
529  {
530    global $conf;
531
532    if(isset($conf['gpc.markup.form']) && $conf['gpc.markup.form'])
533    {
534      $text=GPCCore::FormMailToHTML($text);
535    }
536
537    if(isset($conf['gpc.markup.tabs']) && $conf['gpc.markup.tabs'])
538    {
539      $text=GPCCore::TabsToHTML($text);
540    }
541
542    if(isset($conf['gpc.markup.var']) && $conf['gpc.markup.var'])
543    {
544      $text=GPCCore::VarToHTML($text);
545    }
546
547    if(isset($conf['gpc.markup.bb']) && $conf['gpc.markup.bb'])
548    {
549      $text=GPCCore::BBtoHTML($text);
550    }
551
552
553    return($text);
554  }
555
556  /**
557   * used to add a js or css directly in the header
558   * use 'raw' type to add any raw data in the header
559   *
560   * @param String $id : a unique id for the file
561   * @param String $file : the css file
562   * @param String $order: priority
563   */
564  static public function addHeaderContent($type, $content)
565  {
566    global $template;
567    $null=null;
568
569    if(defined('AJAX_CALL')) return(false); // not needed for an ajax call
570
571    switch($type)
572    {
573      case 'css':
574        $template->block_html_style(null, $content, $null, $null);
575        break;
576      case 'js':
577        $template->block_html_head(null, '<script type="text/javascript">'.$content.'</script>', $null, $null);
578        break;
579      case 'raw':
580        $template->block_html_head(null, $content);
581        break;
582    }
583  }
584
585  /**
586   * used to add a css file in the header
587   *
588   * @param String $id : a unique id for the file
589   * @param String $file : the css file
590   * @param String $order: priority
591   */
592  static public function addHeaderCSS($id, $file, $order=0)
593  {
594    global $template;
595
596    if(defined('AJAX_CALL')) return(false); // no CSS needed for an ajax call
597    if(!array_key_exists($id, self::$headerItems['css']) and file_exists($file))
598    {
599      self::$headerItems['css'][$id]=$file;
600      $template->func_combine_css(array('path'=>$file, 'order'=>$order), $template->smarty);
601    }
602  }
603
604  /**
605   * used to add a js file in the header
606   *
607   * @param String $id : a unique id for the file
608   * @param String $file : the js file
609   * @param Array $require : list of required files
610   */
611  static public function addHeaderJS($id, $file, $require=array())
612  {
613    global $template;
614
615    if(defined('AJAX_CALL')) return(false); // no JS needed for an ajax call
616    if(!array_key_exists($id, self::$headerItems['js']) and file_exists($file))
617    {
618      self::$headerItems['js'][$id]=$file;
619      $template->scriptLoader->add($id, 'header', $require, $file, 0);
620    }
621  }
622
623  /**
624   * add a ui component ; css & js dependencies are managed
625   *
626   * @param Array $list : possibles values are
627   *                        - categorySelector
628   *                        - dynamicTable
629   *                        - inputCheckbox
630   *                        - inputColorPicker
631   *                        - inputColorsFB
632   *                        - inputConsole
633   *                        - inputDate
634   *                        - inputDotArea
635   *                        - inputFilterBox
636   *                        - inputList
637   *                        - inputNum
638   *                        - inputPosition
639   *                        - inputRadio
640   *                        - inputSortBox
641   *                        - inputStatusBar
642   *                        - inputTag
643   *                        - inputText
644   */
645  static public function addUI($list)
646  {
647    global $template, $lang_info;
648
649    if(is_string($list)) $list=explode(',', $list);
650    if(!is_array($list)) return(false);
651
652    if(defined('IN_ADMIN'))
653    {
654      $themeFile=GPC_PATH.'css/%s_'.$template->get_themeconf('name').'.css';
655    }
656    else
657    {
658      $themeFile='themes/'.$template->get_themeconf('name').'/css/GPC%s.css';
659    }
660
661    foreach($list as $ui)
662    {
663      switch($ui)
664      {
665        case 'gpcCSS':
666          $fileName='./plugins/'.basename(dirname(dirname(__FILE__))).'/css/gpc';
667          self::addHeaderCSS('gpc.css', $fileName.'.css', 10);
668          self::addHeaderCSS('gpc.cssT', $fileName.'_'.$template->get_themeconf('name').'.css', 15);
669          break;
670        case 'canvasDraw.graph':
671          self::addHeaderCSS('gpc.canvasDrawT', sprintf($themeFile, 'canvasDraw'));
672          self::addHeaderJS('jquery.ui', 'themes/default/js/ui/jquery.ui.core.js', array('jquery'));
673          self::addHeaderJS('jquery.ui.widget', 'themes/default/js/ui/jquery.ui.widget.js', array('jquery.ui'));
674          self::addHeaderJS('jquery.ui.mouse', 'themes/default/js/ui/jquery.ui.mouse.js', array('jquery.ui.widget'));
675          self::addHeaderJS('gpc.canvasDraw.commonClasses', GPC_PATH.'js/CanvasDraw.CommonClasses.js', array('jquery.ui.widget'));
676          self::addHeaderJS('gpc.canvasDraw.graphClasses', GPC_PATH.'js/CanvasDraw.GraphClasses.js', array('gpc.canvasDraw.commonClasses'));
677          self::addHeaderJS('gpc.canvasDraw.drawing', GPC_PATH.'js/CanvasDraw.Drawing.js', array('gpc.canvasDraw.graphClasses'));
678          self::addHeaderJS('gpc.canvasDraw', GPC_PATH.'js/canvasDraw.js', array('gpc.canvasDraw.drawing'));
679          self::addHeaderJS('gpc.canvasDraw.drawingGraph', GPC_PATH.'js/canvasDraw.ui.drawingGraph.js', array('gpc.canvasDraw'));
680          break;
681        case 'categorySelector':
682          self::addHeaderCSS('gpc.categorySelector', GPC_PATH.'css/categorySelector.css');
683          self::addHeaderCSS('gpc.categorySelectorT', sprintf($themeFile, 'categorySelector'));
684          self::addHeaderJS('jquery.ui', 'themes/default/js/ui/jquery.ui.core.js', array('jquery'));
685          self::addHeaderJS('jquery.ui.widget', 'themes/default/js/ui/jquery.ui.widget.js', array('jquery.ui'));
686          self::addHeaderJS('jquery.ui.mouse', 'themes/default/js/ui/jquery.ui.mouse.js', array('jquery.ui.widget'));
687          self::addHeaderJS('gpc.categorySelector', GPC_PATH.'js/ui.categorySelector.js', array('jquery.ui.widget'));
688          break;
689        case 'inputCheckbox':
690          self::addHeaderCSS('gpc.inputCheckbox', GPC_PATH.'css/inputCheckbox.css');
691          self::addHeaderJS('jquery.ui', 'themes/default/js/ui/jquery.ui.core.js', array('jquery'));
692          self::addHeaderJS('gpc.inputCheckbox', GPC_PATH.'js/ui.inputCheckbox.js', array('jquery.ui'));
693          break;
694        case 'inputColorPicker':
695          self::addHeaderCSS('gpc.inputText', GPC_PATH.'css/inputText.css');
696          self::addHeaderCSS('gpc.inputNum', GPC_PATH.'css/inputNum.css');
697          self::addHeaderCSS('gpc.inputColorsFB', GPC_PATH.'css/inputColorsFB.css');
698          self::addHeaderCSS('gpc.inputDotArea', GPC_PATH.'css/inputDotArea.css');
699          self::addHeaderCSS('gpc.inputColorPicker', GPC_PATH.'css/inputColorPicker.css');
700          self::addHeaderCSS('gpc.inputTextT', sprintf($themeFile, 'inputText'));
701          self::addHeaderCSS('gpc.inputNumT', sprintf($themeFile, 'inputNum'));
702          self::addHeaderCSS('gpc.inputColorsFBT', sprintf($themeFile, 'inputColorsFB'));
703          self::addHeaderCSS('gpc.inputDotAreaT', sprintf($themeFile, 'inputDotArea'));
704          self::addHeaderCSS('gpc.inputColorPickerT', sprintf($themeFile, 'inputColorPicker'));
705          self::addHeaderJS('jquery.ui', 'themes/default/js/ui/jquery.ui.core.js', array('jquery'));
706          self::addHeaderJS('jquery.ui.widget', 'themes/default/js/ui/jquery.ui.widget.js', array('jquery.ui'));
707          self::addHeaderJS('jquery.ui.mouse', 'themes/default/js/ui/jquery.ui.mouse.js', array('jquery.ui.widget'));
708          self::addHeaderJS('jquery.ui.position', 'themes/default/js/ui/jquery.ui.position.js', array('jquery.ui.widget'));
709          self::addHeaderJS('jquery.ui.draggable', 'themes/default/js/ui/jquery.ui.draggable.js', array('jquery.ui.widget'));
710          self::addHeaderJS('jquery.ui.dialog', 'themes/default/js/ui/jquery.ui.dialog.js', array('jquery.ui.widget'));
711          self::addHeaderJS('jquery.ui.slider', 'themes/default/js/ui/jquery.ui.slider.js', array('jquery.ui.widget'));
712          self::addHeaderJS('gpc.inputText', GPC_PATH.'js/ui.inputText.js', array('jquery.ui.widget'));
713          self::addHeaderJS('gpc.inputNum', GPC_PATH.'js/ui.inputNum.js', array('jquery.ui.widget'));
714          self::addHeaderJS('gpc.inputColorsFB', GPC_PATH.'js/ui.inputColorsFB.js', array('jquery.ui.widget'));
715          self::addHeaderJS('gpc.inputDotArea', GPC_PATH.'js/ui.inputDotArea.js', array('jquery.ui.widget'));
716          self::addHeaderJS('gpc.inputColorPicker', GPC_PATH.'js/ui.inputColorPicker.js', array('jquery.ui.slider','gpc.inputText','gpc.inputNum','gpc.inputColorsFB','gpc.inputDotArea'));
717          break;
718        case 'inputColorsFB':
719          self::addHeaderCSS('gpc.inputColorsFB', GPC_PATH.'css/inputColorsFB.css');
720          self::addHeaderCSS('gpc.inputColorsFBT', sprintf($themeFile, 'inputColorsFB'));
721          self::addHeaderJS('jquery.ui', 'themes/default/js/ui/jquery.ui.core.js', array('jquery'));
722          self::addHeaderJS('jquery.ui.widget', 'themes/default/js/ui/jquery.ui.widget.js', array('jquery.ui'));
723          self::addHeaderJS('gpc.inputColorsFB', GPC_PATH.'js/ui.inputColorsFB.js', array('jquery.ui.widget'));
724          break;
725        case 'inputConsole':
726          self::addHeaderCSS('gpc.inputConsole', GPC_PATH.'css/inputConsole.css');
727          self::addHeaderCSS('gpc.inputConsoleT', sprintf($themeFile, 'inputConsole'));
728          self::addHeaderJS('jquery.ui', 'themes/default/js/ui/jquery.ui.core.js', array('jquery'));
729          self::addHeaderJS('jquery.ui.widget', 'themes/default/js/ui/jquery.ui.widget.js', array('jquery.ui'));
730          self::addHeaderJS('gpc.inputConsole', GPC_PATH.'js/ui.inputConsole.js', array('jquery.ui.widget'));
731          break;
732        case 'inputDate':
733          self::addHeaderCSS('jquery.ui.datepicker', 'themes/default/js/ui/theme/jquery.ui.datepicker.css');
734          self::addHeaderCSS('gpc.inputDate', GPC_PATH.'css/inputDate.css');
735          self::addHeaderCSS('gpc.inputDateT', sprintf($themeFile, 'inputDate'));
736          self::addHeaderJS('jquery.ui', 'themes/default/js/ui/jquery.ui.core.js', array('jquery'));
737          self::addHeaderJS('jquery.ui.widget',     'themes/default/js/ui/jquery.ui.widget.js', array('jquery.ui'));
738          self::addHeaderJS('jquery.ui.datepicker', 'themes/default/js/ui/jquery.ui.datepicker.js', array('jquery.ui.widget'));
739          self::addHeaderJS('jquery.ui.datepicker-'.$lang_info['code'], self::getPiwigoSystemPath().'themes/default/js/ui/i18n/jquery.ui.datepicker-'.$lang_info['code'].'.js');
740          self::addHeaderJS('gpc.inputDate', GPC_PATH.'js/ui.inputDate.js', array('jquery.ui.widget'));
741          break;
742        case 'inputDotArea':
743          self::addHeaderCSS('gpc.inputDotArea', GPC_PATH.'css/inputDotArea.css');
744          self::addHeaderCSS('gpc.inputDotAreaT', sprintf($themeFile, 'inputDotArea'));
745          self::addHeaderJS('jquery.ui', 'themes/default/js/ui/jquery.ui.core.js', array('jquery'));
746          self::addHeaderJS('jquery.ui.widget', 'themes/default/js/ui/jquery.ui.widget.js', array('jquery.ui'));
747          self::addHeaderJS('gpc.inputDotArea', GPC_PATH.'js/ui.inputDotArea.js', array('jquery.ui.widget'));
748          break;
749        case 'inputFilterBox':
750          self::addHeaderCSS('jquery.ui.datepicker', 'themes/default/js/ui/theme/jquery.ui.datepicker.css');
751          self::addHeaderCSS('gpc.inputNum', GPC_PATH.'css/inputNum.css');
752          self::addHeaderCSS('gpc.inputNumT', sprintf($themeFile, 'inputNum'));
753          self::addHeaderCSS('gpc.inputDate', GPC_PATH.'css/inputDate.css');
754          self::addHeaderCSS('gpc.inputDateT', sprintf($themeFile, 'inputDate'));
755          self::addHeaderCSS('gpc.inputText', GPC_PATH.'css/inputText.css');
756          self::addHeaderCSS('gpc.inputTextT', sprintf($themeFile, 'inputText'));
757          self::addHeaderCSS('gpc.inputList', GPC_PATH.'css/inputList.css');
758          self::addHeaderCSS('gpc.inputListT', sprintf($themeFile, 'inputList'));
759          self::addHeaderCSS('gpc.inputFilterBox', GPC_PATH.'css/inputFilterBox.css');
760          self::addHeaderCSS('gpc.inputFilterBoxT', sprintf($themeFile, 'inputFilterBox'));
761
762          self::addHeaderJS('jquery.ui', 'themes/default/js/ui/jquery.ui.core.js', array('jquery'));
763          self::addHeaderJS('jquery.ui.widget', 'themes/default/js/ui/jquery.ui.widget.js', array('jquery.ui'));
764
765          self::addHeaderJS('jquery.ui.widget', 'themes/default/js/ui/jquery.ui.widget.js', array('jquery.ui'));
766          self::addHeaderJS('jquery.ui.mouse', 'themes/default/js/ui/jquery.ui.mouse.js', array('jquery.ui.widget'));
767          self::addHeaderJS('jquery.ui.position', 'themes/default/js/ui/jquery.ui.position.js', array('jquery.ui.mouse'));
768          self::addHeaderJS('jquery.ui.resizable', 'themes/default/js/ui/jquery.ui.resizable.js', array('jquery.ui.position'));
769          self::addHeaderJS('jquery.ui.draggable', 'themes/default/js/ui/jquery.ui.draggable.js', array('jquery.ui.resizable'));
770          self::addHeaderJS('jquery.ui.sortable', 'themes/default/js/ui/jquery.ui.sortable.js', array('jquery.ui.draggable'));
771          self::addHeaderJS('jquery.ui.dialog', 'themes/default/js/ui/jquery.ui.dialog.js', array('jquery.ui.sortable'));
772          self::addHeaderJS('jquery.ui.datepicker', 'themes/default/js/ui/jquery.ui.datepicker.js', array('jquery.ui.widget'));
773          self::addHeaderJS('jquery.ui.datepicker-'.$lang_info['code'], self::getPiwigoSystemPath().'themes/default/js/ui/i18n/jquery.ui.datepicker-'.$lang_info['code'].'.js');
774
775          self::addHeaderJS('gpc.inputNum', GPC_PATH.'js/ui.inputNum.js', array('jquery.ui.dialog'));
776          self::addHeaderJS('gpc.inputList', GPC_PATH.'js/ui.inputList.js', array('jquery.ui.dialog'));
777          self::addHeaderJS('gpc.inputText', GPC_PATH.'js/ui.inputText.js', array('jquery.ui.dialog'));
778          self::addHeaderJS('gpc.inputDate', GPC_PATH.'js/ui.inputDate.js', array('jquery.ui.dialog'));
779          self::addHeaderJS('gpc.inputFilterBox', GPC_PATH.'js/ui.inputFilterBox.js', array('jquery.ui.dialog'));
780          break;
781        case 'inputList':
782          self::addHeaderCSS('gpc.inputList', GPC_PATH.'css/inputList.css');
783          self::addHeaderCSS('gpc.inputListT', sprintf($themeFile, 'inputList'));
784          self::addHeaderJS('jquery.ui', 'themes/default/js/ui/jquery.ui.core.js', array('jquery'));
785          self::addHeaderJS('jquery.ui.widget', 'themes/default/js/ui/jquery.ui.widget.js', array('jquery.ui'));
786          self::addHeaderJS('gpc.inputList', GPC_PATH.'js/ui.inputList.js', array('jquery.ui.widget'));
787          break;
788        case 'inputNum':
789          self::addHeaderCSS('gpc.inputNum', GPC_PATH.'css/inputNum.css');
790          self::addHeaderCSS('gpc.inputNumT', sprintf($themeFile, 'inputNum'));
791          self::addHeaderJS('jquery.ui', 'themes/default/js/ui/jquery.ui.core.js', array('jquery'));
792          self::addHeaderJS('jquery.ui.widget', 'themes/default/js/ui/jquery.ui.widget.js', array('jquery.ui'));
793          self::addHeaderJS('jquery.ui.mouse', 'themes/default/js/ui/jquery.ui.mouse.js', array('jquery.ui.widget'));
794          self::addHeaderJS('jquery.ui.slider', 'themes/default/js/ui/jquery.ui.slider.js', array('jquery.ui.widget'));
795          self::addHeaderJS('gpc.inputNum', GPC_PATH.'js/ui.inputNum.js', array('jquery','jquery.ui.slider'));
796          break;
797        case 'inputPages':
798          self::addHeaderCSS('gpc.inputPages', GPC_PATH.'css/inputPages.css');
799          self::addHeaderCSS('gpc.inputPagesT', sprintf($themeFile, 'inputPages'));
800          self::addHeaderJS('jquery.ui', 'themes/default/js/ui/jquery.ui.core.js', array('jquery'));
801          self::addHeaderJS('jquery.ui.widget', 'themes/default/js/ui/jquery.ui.widget.js', array('jquery.ui'));
802          self::addHeaderJS('gpc.inputPages', GPC_PATH.'js/ui.inputPages.js', array('jquery','jquery.ui.widget'));
803          break;
804        case 'inputPosition':
805          self::addHeaderCSS('gpc.inputPosition', GPC_PATH.'css/inputPosition.css');
806          self::addHeaderCSS('gpc.inputPositionT', sprintf($themeFile, 'inputPosition'));
807          self::addHeaderJS('jquery.ui', 'themes/default/js/ui/jquery.ui.core.js', array('jquery'));
808          self::addHeaderJS('jquery.ui.widget', 'themes/default/js/ui/jquery.ui.widget.js', array('jquery.ui'));
809          self::addHeaderJS('gpc.inputPosition', GPC_PATH.'js/ui.inputPosition.js', array('jquery.ui.widget'));
810          break;
811        case 'inputRadio':
812          self::addHeaderJS('jquery.ui', 'themes/default/js/ui/jquery.ui.core.js', array('jquery'));
813          self::addHeaderJS('jquery.ui.widget', 'themes/default/js/ui/jquery.ui.widget.js', array('jquery.ui'));
814          self::addHeaderJS('gpc.inputRadio', GPC_PATH.'js/ui.inputRadio.js', array('jquery.ui.widget'));
815          break;
816        case 'inputSortBox':
817          self::addHeaderCSS('gpc.inputSortBox', GPC_PATH.'css/inputSortBox.css');
818          self::addHeaderCSS('gpc.inputSortBoxT', sprintf($themeFile, 'inputSortBox'));
819          self::addHeaderJS('jquery.ui', 'themes/default/js/ui/jquery.ui.core.js', array('jquery'));
820          self::addHeaderJS('jquery.ui.widget', 'themes/default/js/ui/jquery.ui.widget.js', array('jquery.ui'));
821          self::addHeaderJS('jquery.ui.mouse', 'themes/default/js/ui/jquery.ui.mouse.js', array('jquery.ui.widget'));
822          self::addHeaderJS('jquery.ui.position', 'themes/default/js/ui/jquery.ui.position.js', array('jquery.ui.mouse'));
823          self::addHeaderJS('jquery.ui.draggable', 'themes/default/js/ui/jquery.ui.draggable.js', array('jquery.ui.position'));
824          self::addHeaderJS('jquery.ui.sortable', 'themes/default/js/ui/jquery.ui.sortable.js', array('jquery.ui.draggable'));
825          self::addHeaderJS('jquery.ui.dialog', 'themes/default/js/ui/jquery.ui.dialog.js', array('jquery.ui.sortable'));
826          self::addHeaderJS('gpc.inputSortBox', GPC_PATH.'js/ui.inputSortBox.js', array('jquery.ui.dialog'));
827          break;
828        case 'inputStatusBar':
829          self::addHeaderCSS('gpc.inputStatusBar', GPC_PATH.'css/inputStatusBar.css');
830          self::addHeaderCSS('gpc.inputStatusBarT', sprintf($themeFile, 'inputStatusBar'));
831          self::addHeaderJS('jquery.ui', 'themes/default/js/ui/jquery.ui.core.js', array('jquery'));
832          self::addHeaderJS('jquery.ui.widget', 'themes/default/js/ui/jquery.ui.widget.js', array('jquery.ui'));
833          self::addHeaderJS('gpc.inputStatusBar', GPC_PATH.'js/ui.inputStatusBar.js', array('jquery.ui.widget'));
834          break;
835        case 'inputSwitchButton':
836          self::addHeaderCSS('gpc.inputSwitchButton', GPC_PATH.'css/inputSwitchButton.css');
837          self::addHeaderCSS('gpc.inputSwitchButtonT', sprintf($themeFile, 'inputSwitchButton'));
838          self::addHeaderJS('jquery.ui', 'themes/default/js/ui/jquery.ui.core.js', array('jquery'));
839          self::addHeaderJS('jquery.ui.widget', 'themes/default/js/ui/jquery.ui.widget.js', array('jquery.ui'));
840          self::addHeaderJS('gpc.inputSwitchButton', GPC_PATH.'js/ui.inputSwitchButton.js', array('jquery.ui.widget'));
841          break;
842        case 'inputTag':
843          self::addHeaderCSS('gpc.inputTag', GPC_PATH.'css/inputTag.css');
844          self::addHeaderCSS('gpc.inputTagT', sprintf($themeFile, 'inputTag'));
845          self::addHeaderJS('jquery.ui', 'themes/default/js/ui/jquery.ui.core.js', array('jquery'));
846          self::addHeaderJS('jquery.ui.widget', 'themes/default/js/ui/jquery.ui.widget.js', array('jquery.ui'));
847          self::addHeaderJS('gpc.inputTag', GPC_PATH.'js/ui.inputTag.js', array('jquery.ui.widget'));
848          break;
849        case 'inputText':
850          self::addHeaderCSS('gpc.inputText', GPC_PATH.'css/inputText.css');
851          self::addHeaderCSS('gpc.inputTextT', sprintf($themeFile, 'inputText'));
852          self::addHeaderJS('jquery.ui', 'themes/default/js/ui/jquery.ui.core.js', array('jquery'));
853          self::addHeaderJS('jquery.ui.widget', 'themes/default/js/ui/jquery.ui.widget.js', array('jquery.ui'));
854          self::addHeaderJS('gpc.inputText', GPC_PATH.'js/ui.inputText.js', array('jquery.ui.widget'));
855          break;
856        case 'simpleTip':
857          self::addHeaderCSS('gpc.simpleTip', GPC_PATH.'css/simpleTip.css');
858          self::addHeaderCSS('gpc.simpleTipT', sprintf($themeFile, 'simpleTip'));
859          self::addHeaderJS('jquery.ui', 'themes/default/js/ui/jquery.ui.core.js', array('jquery'));
860          self::addHeaderJS('jquery.ui.widget', 'themes/default/js/ui/jquery.ui.widget.js', array('jquery.ui'));
861          self::addHeaderJS('gpc.simpleTip', GPC_PATH.'js/simpleTip.js', array('jquery.ui.widget'));
862          break;
863        case 'dynamicTable':
864          self::addHeaderCSS('jquery.ui.datepicker', 'themes/default/js/ui/theme/jquery.ui.datepicker.css');
865          self::addHeaderCSS('gpc.inputNum', GPC_PATH.'css/inputNum.css');
866          self::addHeaderCSS('gpc.inputNumT', sprintf($themeFile, 'inputNum'));
867          self::addHeaderCSS('gpc.inputDate', GPC_PATH.'css/inputDate.css');
868          self::addHeaderCSS('gpc.inputDateT', sprintf($themeFile, 'inputDate'));
869          self::addHeaderCSS('gpc.inputText', GPC_PATH.'css/inputText.css');
870          self::addHeaderCSS('gpc.inputTextT', sprintf($themeFile, 'inputText'));
871          self::addHeaderCSS('gpc.inputList', GPC_PATH.'css/inputList.css');
872          self::addHeaderCSS('gpc.inputListT', sprintf($themeFile, 'inputList'));
873          self::addHeaderCSS('gpc.inputSortBox', GPC_PATH.'css/inputSortBox.css');
874          self::addHeaderCSS('gpc.inputSortBoxT', sprintf($themeFile, 'inputSortBox'));
875          self::addHeaderCSS('gpc.inputFilterBox', GPC_PATH.'css/inputFilterBox.css');
876          self::addHeaderCSS('gpc.inputFilterBoxT', sprintf($themeFile, 'inputFilterBox'));
877          self::addHeaderCSS('gpc.inputPages', GPC_PATH.'css/inputPages.css');
878          self::addHeaderCSS('gpc.inputPagesT', sprintf($themeFile, 'inputPages'));
879          self::addHeaderCSS('gpc.dynamicTable', GPC_PATH.'css/dynamicTable.css');
880          self::addHeaderCSS('gpc.dynamicTableT', sprintf($themeFile, 'dynamicTable'));
881
882          self::addHeaderJS('jquery.ui', 'themes/default/js/ui/jquery.ui.core.js', array('jquery'));
883          self::addHeaderJS('jquery.ui.widget', 'themes/default/js/ui/jquery.ui.widget.js', array('jquery.ui'));
884
885          self::addHeaderJS('jquery.ui.mouse', 'themes/default/js/ui/jquery.ui.mouse.js', array('jquery.ui.widget'));
886          self::addHeaderJS('jquery.ui.position', 'themes/default/js/ui/jquery.ui.position.js', array('jquery.ui.mouse'));
887          self::addHeaderJS('jquery.ui.resizable', 'themes/default/js/ui/jquery.ui.resizable.js', array('jquery.ui.position'));
888          self::addHeaderJS('jquery.ui.draggable', 'themes/default/js/ui/jquery.ui.draggable.js', array('jquery.ui.resizable'));
889          self::addHeaderJS('jquery.ui.sortable', 'themes/default/js/ui/jquery.ui.sortable.js', array('jquery.ui.draggable'));
890          self::addHeaderJS('jquery.ui.dialog', 'themes/default/js/ui/jquery.ui.dialog.js', array('jquery.ui.sortable'));
891          self::addHeaderJS('jquery.ui.datepicker', 'themes/default/js/ui/jquery.ui.datepicker.js', array('jquery.ui.widget'));
892          self::addHeaderJS('jquery.ui.datepicker-'.$lang_info['code'], self::getPiwigoSystemPath().'themes/default/js/ui/i18n/jquery.ui.datepicker-'.$lang_info['code'].'.js');
893
894          self::addHeaderJS('gpc.inputNum', GPC_PATH.'js/ui.inputNum.js', array('jquery.ui.dialog'));
895          self::addHeaderJS('gpc.inputList', GPC_PATH.'js/ui.inputList.js', array('jquery.ui.dialog'));
896          self::addHeaderJS('gpc.inputText', GPC_PATH.'js/ui.inputText.js', array('jquery.ui.dialog'));
897          self::addHeaderJS('gpc.inputDate', GPC_PATH.'js/ui.inputDate.js', array('jquery.ui.dialog'));
898          self::addHeaderJS('gpc.inputFilterBox', GPC_PATH.'js/ui.inputFilterBox.js', array('jquery.ui.dialog'));
899          self::addHeaderJS('gpc.inputSortBox', GPC_PATH.'js/ui.inputSortBox.js', array('jquery.ui.dialog'));
900          self::addHeaderJS('gpc.inputPages', GPC_PATH.'js/ui.inputPages.js', array('jquery.ui.dialog'));
901          self::addHeaderJS('gpc.dynamicTable', GPC_PATH.'js/ui.dynamicTable.js', array('jquery.ui.dialog'));
902          break;
903        case 'progressArea':
904          self::addHeaderCSS('gpc.progressArea', GPC_PATH.'css/progressArea.css');
905          self::addHeaderCSS('gpc.progressAreaT', sprintf($themeFile, 'progressArea'));
906          self::addHeaderJS('jquery.ui', 'themes/default/js/ui/jquery.ui.core.js', array('jquery'));
907          self::addHeaderJS('jquery.ui.widget', 'themes/default/js/ui/jquery.ui.widget.js', array('jquery.ui'));
908          self::addHeaderJS('jquery.ui.mouse', 'themes/default/js/ui/jquery.ui.mouse.js', array('jquery.ui.widget'));
909          self::addHeaderJS('jquery.ui.position', 'themes/default/js/ui/jquery.ui.position.js', array('jquery.ui.mouse'));
910          self::addHeaderJS('jquery.ui.draggable', 'themes/default/js/ui/jquery.ui.draggable.js', array('jquery.ui.position'));
911          self::addHeaderJS('jquery.ui.sortable', 'themes/default/js/ui/jquery.ui.sortable.js', array('jquery.ui.draggable'));
912          self::addHeaderJS('jquery.ui.dialog', 'themes/default/js/ui/jquery.ui.dialog.js', array('jquery.ui.sortable'));
913          self::addHeaderJS('gpc.progressArea', GPC_PATH.'js/ui.progressArea.js', array('jquery.ui.dialog'));
914          break;
915        case 'timer':
916          self::addHeaderJS('gpc.timer', GPC_PATH.'js/ui.timer.js', array('jquery'));
917          break;
918      }
919    }
920  }
921
922
923  /**
924   * use the extended description get_user_language_desc() function if exist
925   * otherwise returns the value
926   *
927   * @param String $value : value to translate
928   * @return String : translated value
929   */
930  static public function getUserLanguageDesc($value)
931  {
932    if(function_exists('get_user_language_desc'))
933    {
934      return(get_user_language_desc($value));
935    }
936    else
937    {
938      return($value);
939    }
940  }
941
942
943  /**
944   * remove a path recursively
945   *
946   * @param String $directory : directory to remove
947   * @param Bool $removePath : if set to true, remove the path himself, if set
948   *                           to false, remove only file & sub-directories
949   * @return Bool : true if directory was succesfully removed, otherwise false
950   */
951  static public function rmDir($directory, $removePath=true)
952  {
953    $directory=rtrim($directory, '\/').'/';
954    $returned=true;
955    if(file_exists($directory) and is_dir($directory) and $directory!='./' and $directory!='../')
956    {
957      $dhandle=scandir($directory);
958      foreach($dhandle as $file)
959      {
960        if($file!='.' and $file!='..' )
961        {
962          if(is_dir($directory.$file))
963          {
964            $returned=self::rmDir($directory.$file, true) & $returned;
965          }
966          else
967          {
968            $returned=unlink($directory.$file) & $returned;
969          }
970        }
971      }
972      if($returned and $removePath) $returned=rmdir($directory);
973    }
974    return($returned);
975  }
976
977
978  /**
979   * returns the piwigo system path
980   * @return String
981   */
982  static public function getPiwigoSystemPath()
983  {
984    return(self::$piwigoSystemPath);
985  }
986
987
988 /**
989  * formats a file size into a human readable size
990  *
991  * @param String $format : "A"  : auto
992  *                         "Ai" : auto (io)
993  *                         "O"  : o
994  *                         "K"  : Ko
995  *                         "M"  : Mo
996  *                         "G"  : Go
997  *                         "Ki" : Kio
998  *                         "Mi" : Mio
999  *                         "Gi" : Gio
1000  * @param String $thsep : thousand separator
1001  * @param Integer $prec : number of decimals
1002  * @param Bool $visible : display or not the unit
1003  * @return String : a formatted file size
1004  */
1005 static public function formatOctet($octets, $format="Ai", $thsep="", $prec=2, $visible=true)
1006 {
1007  if($format=="Ai")
1008  {
1009   if($octets<1024)
1010   { $format="O"; }
1011   elseif($octets<1024000)
1012   { $format="Ki"; }
1013   elseif($octets<1024000000)
1014   { $format="Mi"; }
1015   else
1016   { $format="Gi"; }
1017  }
1018  elseif($format=="A")
1019  {
1020   if($octets<1000)
1021   { $format="O"; }
1022   elseif($octets<1000000)
1023   { $format="Ki"; }
1024   elseif($octets<1000000000)
1025   { $format="Mi"; }
1026   else
1027   { $format="Gi"; }
1028  }
1029
1030  switch($format)
1031  {
1032   case "O":
1033    $unit="o"; $div=1;
1034    break;
1035   case "K":
1036    $unit="Ko"; $div=1000;
1037    break;
1038   case "M":
1039    $unit="Mo"; $div=1000000;
1040    break;
1041   case "G":
1042    $unit="Go"; $div=1000000000;
1043    break;
1044   case "Ki":
1045    $unit="Kio"; $div=1024;
1046    break;
1047   case "Mi":
1048    $unit="Mio"; $div=1024000;
1049    break;
1050   case "Gi":
1051    $unit="Gio"; $div=1024000000;
1052    break;
1053  }
1054
1055  $returned=number_format($octets/$div, $prec, '.', $thsep);
1056  if($visible) $returned.=' '.$unit;
1057  return($returned);
1058 } //function formatOctet
1059
1060
1061 /**
1062  * affect a valid token in a template var {$token}
1063  */
1064 static public function setTemplateToken()
1065 {
1066   global $template;
1067
1068   $template->assign('token', get_pwg_token());
1069 }
1070
1071
1072} //class
1073
1074GPCCore::init();
1075
1076?>
Note: See TracBrowser for help on using the repository browser.