Dotclear

source: inc/admin/lib.dc.page.php @ 2082:00db985f1d5e

Revision 2082:00db985f1d5e, 29.4 KB checked in by Anne Kozlika <kozlika@…>, 12 years ago (diff)

En attendant qu'on ait des aides contextuelles sur toutes les pages, lorsque l'utilisateur va être redirigé vers l'aide générale l'intitulé change et on ouvre dans une nouvelle fenêtre.
Note : il faudrait externaliser le js et l'ajout de la mention "(nouvelle fenêtre)", pour ce lien comme pour "voir le blog" ou "voir ce billet sur le blog".

RevLine 
[0]1<?php
2# -- BEGIN LICENSE BLOCK ---------------------------------------
3#
4# This file is part of Dotclear 2.
5#
[1179]6# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
[0]7# Licensed under the GPL version 2.0 license.
8# See LICENSE file or
9# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
10#
11# -- END LICENSE BLOCK -----------------------------------------
12if (!defined('DC_RC_PATH')) { return; }
13
14define('DC_AUTH_PAGE','auth.php');
15
16class dcPage
17{
[342]18     private static $loaded_js=array();
19
[0]20     # Auth check
21     public static function check($permissions)
22     {
23          global $core;
[1187]24
[0]25          if ($core->blog && $core->auth->check($permissions,$core->blog->id))
26          {
27               return;
28          }
[1187]29
[0]30          if (session_id()) {
31               $core->session->destroy();
32          }
33          http::redirect(DC_AUTH_PAGE);
34     }
[1187]35
[0]36     # Check super admin
37     public static function checkSuper()
38     {
39          global $core;
[1187]40
[0]41          if (!$core->auth->isSuperAdmin())
42          {
43               if (session_id()) {
44                    $core->session->destroy();
45               }
46               http::redirect(DC_AUTH_PAGE);
47          }
48     }
[1187]49
[0]50     # Top of admin page
[1358]51     public static function open($title='',$head='',$breadcrumb='')
[0]52     {
53          global $core;
[1144]54
[0]55          # List of user's blogs
56          if ($core->auth->blog_count == 1 || $core->auth->blog_count > 20)
57          {
58               $blog_box =
[999]59               '<p>'.__('Blog:').' <strong title="'.html::escapeHTML($core->blog->url).'">'.
[0]60               html::escapeHTML($core->blog->name).'</strong>';
[1187]61
[0]62               if ($core->auth->blog_count > 20) {
63                    $blog_box .= ' - <a href="blogs.php">'.__('Change blog').'</a>';
64               }
[999]65               $blog_box .= '</p>';
[0]66          }
67          else
68          {
69               $rs_blogs = $core->getBlogs(array('order'=>'LOWER(blog_name)','limit'=>20));
70               $blogs = array();
71               while ($rs_blogs->fetch()) {
72                    $blogs[html::escapeHTML($rs_blogs->blog_name.' - '.$rs_blogs->blog_url)] = $rs_blogs->blog_id;
73               }
74               $blog_box =
[2005]75               '<p><label for="switchblog" class="classic">'.
[1309]76               __('Blogs:').'</label> '.
[0]77               $core->formNonce().
[454]78               form::combo('switchblog',$blogs,$core->blog->id).
[2005]79               '<input type="submit" value="'.__('ok').'" class="hidden-if-js" /></p>';
[0]80          }
[1187]81
[36]82          $safe_mode = isset($_SESSION['sess_safe_mode']) && $_SESSION['sess_safe_mode'];
[1187]83
[0]84          # Display
85          header('Content-Type: text/html; charset=UTF-8');
86          echo
87          '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" '.
88          ' "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">'."\n".
89          '<html xmlns="http://www.w3.org/1999/xhtml" '.
90          'xml:lang="'.$core->auth->getInfo('user_lang').'" '.
91          'lang="'.$core->auth->getInfo('user_lang').'">'."\n".
92          "<head>\n".
93          '  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />'."\n".
94          '  <meta name="ROBOTS" content="NOARCHIVE,NOINDEX,NOFOLLOW" />'."\n".
95          '  <meta name="GOOGLEBOT" content="NOSNIPPET" />'."\n".
[1310]96          '  <meta name="viewport" content="width=device-width, initial-scale=1.0" />'."\n".
[489]97          '  <title>'.$title.' - '.html::escapeHTML($core->blog->name).' - '.html::escapeHTML(DC_VENDOR_NAME).' - '.DC_VERSION.'</title>'."\n".
[1187]98
99
[0]100          self::jsLoadIE7().
[1586]101          '  <link rel="stylesheet" href="style/default.css" type="text/css" media="screen" />'."\n";
[0]102          if (l10n::getTextDirection($GLOBALS['_lang']) == 'rtl') {
[473]103               echo
[1586]104               '  <link rel="stylesheet" href="style/default-rtl.css" type="text/css" media="screen" />'."\n";
[0]105          }
[237]106
[244]107          $core->auth->user_prefs->addWorkspace('interface');
108          $user_ui_hide_std_favicon = $core->auth->user_prefs->interface->hide_std_favicon;
109          if (!$user_ui_hide_std_favicon) {
110               echo '<link rel="icon" type="image/png" href="images/favicon.png" />';
111          }
[1187]112
[0]113          echo
114          self::jsCommon().
[1699]115          self::jsToggles().
[0]116          $head;
[1187]117
[0]118          # --BEHAVIOR-- adminPageHTMLHead
119          $core->callBehavior('adminPageHTMLHead');
[1187]120
[0]121          echo
122          "</head>\n".
[36]123          '<body id="dotclear-admin'.
[1586]124          ($safe_mode ? ' safe-mode' : '').'" class="no-js">'."\n".
[1187]125
[1590]126          '<ul id="prelude">'.
127          '<li><a href="#content">'.__('Go to the content').'</a></li>'.
128          '<li><a href="#main-menu">'.__('Go to the menu').'</a></li>'.
129          '<li><a href="#qx">'.__('Go to search').'</a></li>'.
130          '</ul>'."\n".
[2005]131          '<div id="header">'.
132          '<h1><a href="index.php"><span class="hidden">'.DC_VENDOR_NAME.'</span></a></h1>'."\n";
[1187]133
[0]134          echo
[2005]135          '<form action="index.php" method="post" id="top-info-blog">'.
[0]136          $blog_box.
[2005]137          '<p><a href="'.$core->blog->url.'" onclick="window.open(this.href);return false;" title="'.__('Go to site').
[1947]138          ' ('.__('new window').')'.'">'.__('Go to site').'<img src="images/outgoing.png" alt="" /></a>'.
[999]139          '</p></form>'.
[2005]140          '<ul id="top-info-user">'.
141          '<li><a class="'.(preg_match('/index.php$/',$_SERVER['REQUEST_URI']) ? ' active' : '').'" href="index.php">'.__('My dashboard').'</a></li>'.
142          '<li><a class="smallscreen'.(preg_match('/preferences.php(\?.*)?$/',$_SERVER['REQUEST_URI']) ? ' active' : '').
143          '" href="preferences.php">'.__('My preferences').'</a></li>'.
[2034]144          '<li><a href="index.php?logout=1" class="logout"><span class="nomobile">'.sprintf(__('Logout %s'),$core->auth->userID()).
145          '</span><img src="images/logout.png" alt="" /></a></li>'.
[2005]146          '</ul>'.
147          '</div>'; // end header
[1187]148
[0]149          echo
[1741]150          '<div id="wrapper" class="clearfix">'."\n".
[1946]151          '<div class="hidden-if-no-js collapser-box"><a href="#" id="collapser">'.
[1867]152          '<img class="collapse-mm" src="images/collapser-hide.png" alt="'.__('Hide main menu').'" />'.
153          '<img class="expand-mm" src="images/collapser-show.png" alt="'.__('Show main menu').'" />'.
154          '</a></div>'.
[1946]155          '<div id="main">'."\n".
[1741]156          '<div id="content" class="clearfix">'."\n";
[1187]157
[36]158          # Safe mode
159          if ($safe_mode)
[0]160          {
161               echo
[2043]162               '<div class="warning"><h3>'.__('Safe mode').'</h3>'.
[37]163               '<p>'.__('You are in safe mode. All plugins have been temporarily disabled. Remind to log out then log in again normally to get back all functionalities').'</p>'.
[0]164               '</div>';
165          }
[1187]166
[1355]167          // Display breadcrumb (if given) before any error message
[1357]168          echo $breadcrumb;
[1355]169
[0]170          if ($core->error->flag()) {
171               echo
[1384]172               '<div class="error"><p><strong>'.(count($core->error->getErrors()) > 1 ? __('Errors:') : __('Error:')).'</strong></p>'.
[0]173               $core->error->toHTML().
174               '</div>';
175          }
176     }
[1187]177
[0]178     public static function close()
179     {
[942]180          global $core;
181
[1933]182          if (!$GLOBALS['__resources']['ctxhelp']) {
183               echo
[2082]184               '<p id="help-button"><a href="help.php" onclick="window.open(this.href);return false;" title="'.
185               __('Global help').' ('.__('new window').')">'.__('Global help').'</a></p>';
[1933]186          }
187
[0]188          $menu =& $GLOBALS['_menu'];
[1187]189
[0]190          echo
191          "</div>\n".         // End of #content
192          "</div>\n".         // End of #main
[1187]193
[1311]194          '<div id="main-menu">'."\n".
195
196          '<form id="search-menu" action="search.php" method="get">'.
[1589]197          '<p><label for="qx" class="hidden">'.__('Search:').' </label>'.form::field('qx',30,255,'').
[1311]198          '<input type="submit" value="'.__('OK').'" /></p>'.
199          '</form>';
[1187]200
[0]201          foreach ($menu as $k => $v) {
202               echo $menu[$k]->draw();
203          }
[1187]204
[1140]205          $text = sprintf(__('Thank you for using %s.'),'Dotclear '.DC_VERSION);
[942]206
207          # --BEHAVIOR-- adminPageFooter
[946]208          $textAlt = $core->callBehavior('adminPageFooter',$core,$text);
[1140]209          if ($textAlt != '') {
210               $text = $textAlt;
211          }
[1142]212          $text = html::escapeHTML($text);
[942]213
[0]214          echo
215          '</div>'."\n".      // End of #main-menu
[1946]216          "</div>\n";         // End of #wrapper
[1861]217
[1946]218          echo
[1793]219          '<div id="footer">'.
220          '<a href="http://dotclear.org/" title="'.$text.'"><img src="style/dc_logos/w-dotclear90.png" alt="'.$text.'" /></a></div>'."\n".
[1599]221          '<!-- '."\n".
222'                  .'."\n".
223'               ,;:\'`\'::'."\n".
224'            __||'."\n".
225'      _____/LLLL\_'."\n".
226'      \__________"|'."\n".
227'    ~^~^~^~^~^~^~^~^~^~'."\n".
[1946]228' -->'."\n";
[1187]229
[0]230          if (defined('DC_DEV') && DC_DEV === true) {
231               echo self::debugInfo();
232          }
[1187]233
[0]234          echo
235          '</body></html>';
236     }
[1187]237
[1358]238     public static function openPopup($title='',$head='',$breadcrumb='')
[0]239     {
240          global $core;
[1187]241
[0]242          # Display
243          header('Content-Type: text/html; charset=UTF-8');
244          echo
245          '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" '.
246          ' "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">'."\n".
247          '<html xmlns="http://www.w3.org/1999/xhtml" '.
248          'xml:lang="'.$core->auth->getInfo('user_lang').'" '.
249          'lang="'.$core->auth->getInfo('user_lang').'">'."\n".
[1311]250          '<meta name="viewport" content="width=device-width, initial-scale=1.0" />'."\n".
[0]251          "<head>\n".
252          '  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />'."\n".
253          '  <title>'.$title.' - '.html::escapeHTML($core->blog->name).' - '.html::escapeHTML(DC_VENDOR_NAME).' - '.DC_VERSION.'</title>'."\n".
[1187]254
[0]255          '  <meta name="ROBOTS" content="NOARCHIVE,NOINDEX,NOFOLLOW" />'."\n".
256          '  <meta name="GOOGLEBOT" content="NOSNIPPET" />'."\n".
[1187]257
[0]258          self::jsLoadIE7().
[1187]259          '    <link rel="stylesheet" href="style/default.css" type="text/css" media="screen" />'."\n";
[0]260          if (l10n::getTextDirection($GLOBALS['_lang']) == 'rtl') {
[473]261               echo
[1187]262               '    <link rel="stylesheet" href="style/default-rtl.css" type="text/css" media="screen" />'."\n";
[0]263          }
[1187]264
[0]265          echo
266          self::jsCommon().
[1699]267          self::jsToggles().
[0]268          $head;
[1187]269
[0]270          # --BEHAVIOR-- adminPageHTMLHead
271          $core->callBehavior('adminPageHTMLHead');
[1187]272
[0]273          echo
274          "</head>\n".
275          '<body id="dotclear-admin" class="popup">'."\n".
[1187]276
[2046]277          '<h1>'.DC_VENDOR_NAME.'</h1>'."\n";
[1187]278
[0]279          echo
280          '<div id="wrapper">'."\n".
281          '<div id="main">'."\n".
282          '<div id="content">'."\n";
[1187]283
[1358]284          // display breadcrumb if given
285          echo $breadcrumb;
286
[0]287          if ($core->error->flag()) {
288               echo
289               '<div class="error"><strong>'.__('Errors:').'</strong>'.
290               $core->error->toHTML().
291               '</div>';
292          }
293     }
[1187]294
[0]295     public static function closePopup()
296     {
297          echo
298          "</div>\n".         // End of #content
299          "</div>\n".         // End of #main
[2046]300          "</div>\n".         // End of #wrapper
[0]301          '<div id="footer"><p>&nbsp;</p></div>'."\n".
302          '</body></html>';
303     }
[907]304
[1358]305     public static function breadcrumb($elements=null,$with_home_link=true,$echo=false)
[1328]306     {
307          // First item of array elements should be blog's name, System or Plugins
[1340]308          $res = '<h2>'.($with_home_link ?
309               '<a class="go_home" href="index.php"><img src="style/dashboard.png" alt="'.__('Go to dashboard').'" /></a>' :
310               '<img src="style/dashboard-alt.png" alt="" />');
[1328]311          $index = 0;
312          foreach ($elements as $element => $url) {
[1358]313               $res .= ($with_home_link ? ($index == 1 ? ' : ' : ' &rsaquo; ') : ($index == 0 ? ' ' : ' &rsaquo; ')).
314                    ($url ? '<a href="'.$url.'">' : '').$element.($url ? '</a>' : '');
[1328]315               $index++;
316          }
317          $res .= '</h2>';
[1334]318          if ($echo) {
319               echo $res;
320          }
[1328]321          return $res;
322     }
323
[1548]324     public static function message($msg,$timestamp=true,$div=false,$echo=true,$class='message')
[907]325     {
[910]326          global $core;
[1187]327
[907]328          $res = '';
329          if ($msg != '') {
[1548]330               $res = ($div ? '<div class="'.$class.'">' : '').'<p'.($div ? '' : ' class="'.$class.'"').'>'.
[1161]331               ($timestamp ? dt::str(__('%H:%M:%S:'),null,$core->auth->getInfo('user_tz')).' ' : '').$msg.
332               '</p>'.($div ? '</div>' : '');
[907]333               if ($echo) {
334                    echo $res;
335               }
336          }
337          return $res;
338     }
[1187]339
[1548]340     public static function success($msg,$timestamp=true,$div=false,$echo=true)
341     {
[1927]342          return self::message($msg,$timestamp,$div,$echo,"success");
[1548]343     }
344
[1725]345     public static function warning($msg,$timestamp=true,$div=false,$echo=true)
346     {
[1927]347          return self::message($msg,$timestamp,$div,$echo,"warning-msg");
[1725]348     }
349
[0]350     private static function debugInfo()
351     {
352          $global_vars = implode(', ',array_keys($GLOBALS));
[1187]353
[0]354          $res =
355          '<div id="debug"><div>'.
356          '<p>memory usage: '.memory_get_usage().' ('.files::size(memory_get_usage()).')</p>';
[1187]357
[0]358          if (function_exists('xdebug_get_profiler_filename'))
359          {
360               $res .= '<p>Elapsed time: '.xdebug_time_index().' seconds</p>';
[1187]361
[0]362               $prof_file = xdebug_get_profiler_filename();
363               if ($prof_file) {
364                    $res .= '<p>Profiler file : '.xdebug_get_profiler_filename().'</p>';
365               } else {
366                    $prof_url = http::getSelfURI();
[321]367                    $prof_url .= (strpos($prof_url,'?') === false) ? '?' : '&';
[0]368                    $prof_url .= 'XDEBUG_PROFILE';
[321]369                    $res .= '<p><a href="'.html::escapeURL($prof_url).'">Trigger profiler</a></p>';
[0]370               }
[1187]371
[0]372               /* xdebug configuration:
373               zend_extension = /.../xdebug.so
374               xdebug.auto_trace = On
375               xdebug.trace_format = 0
376               xdebug.trace_options = 1
377               xdebug.show_mem_delta = On
378               xdebug.profiler_enable = 0
379               xdebug.profiler_enable_trigger = 1
380               xdebug.profiler_output_dir = /tmp
381               xdebug.profiler_append = 0
382               xdebug.profiler_output_name = timestamp
383               */
384          }
[1187]385
[0]386          $res .=
387          '<p>Global vars: '.$global_vars.'</p>'.
388          '</div></div>';
[1187]389
[0]390          return $res;
391     }
[1187]392
[0]393     public static function help($page,$index='')
394     {
395          # Deprecated but we keep this for plugins.
396     }
[1187]397
[0]398     public static function helpBlock()
399     {
400          $args = func_get_args();
[1458]401
402          $args = new ArrayObject($args);
403
404          # --BEHAVIOR-- adminPageHelpBlock
405          $GLOBALS['core']->callBehavior('adminPageHelpBlock',$args);
406
[0]407          if (empty($args)) {
408               return;
409          };
[1187]410
[0]411          global $__resources;
412          if (empty($__resources['help'])) {
413               return;
414          }
[1187]415
[0]416          $content = '';
417          foreach ($args as $v)
418          {
419               if (is_object($v) && isset($v->content)) {
420                    $content .= $v->content;
421                    continue;
422               }
[1187]423
[0]424               if (!isset($__resources['help'][$v])) {
425                    continue;
426               }
427               $f = $__resources['help'][$v];
428               if (!file_exists($f) || !is_readable($f)) {
429                    continue;
430               }
[1187]431
[0]432               $fc = file_get_contents($f);
433               if (preg_match('|<body[^>]*?>(.*?)</body>|ms',$fc,$matches)) {
434                    $content .= $matches[1];
435               } else {
436                    $content .= $fc;
437               }
438          }
[1187]439
[0]440          if (trim($content) == '') {
441               return;
442          }
[1187]443
[1933]444          // Set contextual help global flag
445          $GLOBALS['__resources']['ctxhelp'] = true;
446
[0]447          echo
[1573]448          '<div id="help"><hr /><div class="help-content clear"><h3>'.__('Help about this page').'</h3>'.
[0]449          $content.
[494]450          '</div>'.
451          '<div id="helplink"><hr />'.
452          '<p>'.
453          sprintf(__('See also %s'),sprintf('<a href="help.php">%s</a>',__('the global help'))).
[2011]454          '.</p>'.
[0]455          '</div></div>';
456     }
[1187]457
[0]458     public static function jsLoad($src)
459     {
[342]460          $escaped_src = html::escapeHTML($src);
461          if (!isset(self::$loaded_js[$escaped_src])) {
462               self::$loaded_js[$escaped_src]=true;
463               return '<script type="text/javascript" src="'.$escaped_src.'"></script>'."\n";
464          }
[0]465     }
[1187]466
[0]467     public static function jsVar($n,$v)
468     {
469          return $n." = '".html::escapeJS($v)."';\n";
470     }
[1187]471
[1699]472     public static function jsToggles()
473     {
474          if($GLOBALS['core']->auth->user_prefs->toggles) {
475               $unfolded_sections = explode(',',$GLOBALS['core']->auth->user_prefs->toggles->unfolded_sections);
476               foreach ($unfolded_sections as $k=>&$v) {
477                    if ($v == '') {
478                         unset($unfolded_sections[$k]);
479                    } else {
480                         $v = "'".html::escapeJS($v)."':true";
481                    }
482               }
483          } else {
484               $unfolded_sections=array();
485          }
486          return '<script type="text/javascript">'."\n".
487                         "//<![CDATA[\n".
488                         'dotclear.unfolded_sections = {'.join(",",$unfolded_sections)."};\n".
489                         "\n//]]>\n".
490                    "</script>\n";
491     }
[0]492     
493     public static function jsCommon()
494     {
[1771]495          $mute_or_no = '';
[1841]496          if (empty($GLOBALS['core']->blog) || $GLOBALS['core']->blog->settings->system->jquery_migrate_mute) {
[1771]497               $mute_or_no .=
498                    '<script type="text/javascript">'."\n".
499                    "//<![CDATA[\n".
500                    'jQuery.migrateMute = true;'.
501                    "\n//]]>\n".
502                    "</script>\n";
503          }
504
[0]505          return
506          self::jsLoad('js/jquery/jquery.js').
[1771]507          $mute_or_no.
508          self::jsLoad('js/jquery/jquery-migrate-1.2.1.js').
[0]509          self::jsLoad('js/jquery/jquery.biscuit.js').
510          self::jsLoad('js/jquery/jquery.bgFade.js').
511          self::jsLoad('js/common.js').
[447]512          self::jsLoad('js/prelude.js').
[1187]513
[0]514          '<script type="text/javascript">'."\n".
515          "//<![CDATA[\n".
516          self::jsVar('dotclear.nonce',$GLOBALS['core']->getNonce()).
[1019]517          self::jsVar('dotclear.img_plus_src','images/expand.png').
[0]518          self::jsVar('dotclear.img_plus_alt',__('uncover')).
[1019]519          self::jsVar('dotclear.img_minus_src','images/hide.png').
[0]520          self::jsVar('dotclear.img_minus_alt',__('hide')).
521          self::jsVar('dotclear.img_menu_on','images/menu_on.png').
522          self::jsVar('dotclear.img_menu_off','images/menu_off.png').
[1187]523
[0]524          self::jsVar('dotclear.msg.help',
[1933]525               __('Need help?')).
[1302]526          self::jsVar('dotclear.msg.help_hide',
527               __('Hide')).
[1556]528          self::jsVar('dotclear.msg.to_select',
529               __('Select:')).
[0]530          self::jsVar('dotclear.msg.no_selection',
531               __('no selection')).
532          self::jsVar('dotclear.msg.select_all',
533               __('select all')).
534          self::jsVar('dotclear.msg.invert_sel',
[1556]535               __('Invert selection')).
[0]536          self::jsVar('dotclear.msg.website',
537               __('Web site:')).
538          self::jsVar('dotclear.msg.email',
539               __('Email:')).
540          self::jsVar('dotclear.msg.ip_address',
541               __('IP address:')).
542          self::jsVar('dotclear.msg.error',
543               __('Error:')).
544          self::jsVar('dotclear.msg.entry_created',
545               __('Entry has been successfully created.')).
546          self::jsVar('dotclear.msg.edit_entry',
547               __('Edit entry')).
548          self::jsVar('dotclear.msg.view_entry',
549               __('view entry')).
550          self::jsVar('dotclear.msg.confirm_delete_posts',
551               __("Are you sure you want to delete selected entries (%s)?")).
[1525]552          self::jsVar('dotclear.msg.confirm_delete_categories',
553               __("Are you sure you want to delete selected categories (%s)?")).
[0]554          self::jsVar('dotclear.msg.confirm_delete_post',
555               __("Are you sure you want to delete this entry?")).
[1395]556          self::jsVar('dotclear.msg.click_to_unlock',
[1450]557               __("Click here to unlock the field")).
[1049]558          self::jsVar('dotclear.msg.confirm_spam_delete',
559               __('Are you sure you want to delete all spams?')).
[0]560          self::jsVar('dotclear.msg.confirm_delete_comments',
561               __('Are you sure you want to delete selected comments (%s)?')).
562          self::jsVar('dotclear.msg.confirm_delete_comment',
563               __('Are you sure you want to delete this comment?')).
564          self::jsVar('dotclear.msg.cannot_delete_users',
565               __('Users with posts cannot be deleted.')).
566          self::jsVar('dotclear.msg.confirm_delete_user',
567               __('Are you sure you want to delete selected users (%s)?')).
568          self::jsVar('dotclear.msg.confirm_delete_category',
569               __('Are you sure you want to delete category "%s"?')).
570          self::jsVar('dotclear.msg.confirm_reorder_categories',
571               __('Are you sure you want to reorder all categories?')).
572          self::jsVar('dotclear.msg.confirm_delete_media',
573               __('Are you sure you want to remove media "%s"?')).
574          self::jsVar('dotclear.msg.confirm_extract_current',
575               __('Are you sure you want to extract archive in current directory?')).
576          self::jsVar('dotclear.msg.confirm_remove_attachment',
577               __('Are you sure you want to remove attachment "%s"?')).
578          self::jsVar('dotclear.msg.confirm_delete_lang',
579               __('Are you sure you want to delete "%s" language?')).
580          self::jsVar('dotclear.msg.confirm_delete_plugin',
581               __('Are you sure you want to delete "%s" plugin?')).
582          self::jsVar('dotclear.msg.use_this_theme',
583               __('Use this theme')).
584          self::jsVar('dotclear.msg.remove_this_theme',
585               __('Remove this theme')).
586          self::jsVar('dotclear.msg.confirm_delete_theme',
587               __('Are you sure you want to delete "%s" theme?')).
[1462]588          self::jsVar('dotclear.msg.confirm_delete_backup',
589               __('Are you sure you want to delete this backup?')).
[0]590          self::jsVar('dotclear.msg.zip_file_content',
591               __('Zip file content')).
592          self::jsVar('dotclear.msg.xhtml_validator',
593               __('XHTML markup validator')).
594          self::jsVar('dotclear.msg.xhtml_valid',
595               __('XHTML content is valid.')).
596          self::jsVar('dotclear.msg.xhtml_not_valid',
597               __('There are XHTML markup errors.')).
[1861]598          self::jsVar('dotclear.msg.warning_validate_no_save_content',
[1832]599               __('Attention: an audit of a content not yet registered.')).
[0]600          self::jsVar('dotclear.msg.confirm_change_post_format',
601               __('You have unsaved changes. Switch post format will loose these changes. Proceed anyway?')).
[1256]602          self::jsVar('dotclear.msg.confirm_change_post_format_noconvert',
603               __("Warning: post format change will not convert existing content. You will need to apply new format by yourself. Proceed anyway?")).
[224]604          self::jsVar('dotclear.msg.load_enhanced_uploader',
605               __('Loading enhanced uploader, please wait.')).
[1699]606               "\n//]]>\n".
[0]607          "</script>\n";
608     }
[1187]609
[0]610     public static function jsLoadIE7()
611     {
612          return
[1456]613          '<!--[if lt IE 9]>'."\n".
614          self::jsLoad('js/ie7/IE9.js').
[0]615          '<link rel="stylesheet" type="text/css" href="style/iesucks.css" />'."\n".
616          '<![endif]-->'."\n";
617     }
[1187]618
[0]619     public static function jsConfirmClose()
620     {
621          $args = func_get_args();
622          if (count($args) > 0) {
623               foreach ($args as $k => $v) {
624                    $args[$k] = "'".html::escapeJS($v)."'";
625               }
626               $args = implode(',',$args);
627          } else {
628               $args = '';
629          }
[1187]630
[0]631          return
632          self::jsLoad('js/confirm-close.js').
633          '<script type="text/javascript">'."\n".
634          "//<![CDATA[\n".
635          "confirmClosePage = new confirmClose(".$args."); ".
636          "confirmClose.prototype.prompt = '".html::escapeJS(__('You have unsaved changes.'))."'; ".
637          "\n//]]>\n".
638          "</script>\n";
639     }
[1187]640
[0]641     public static function jsPageTabs($default=null)
642     {
643          if ($default) {
644               $default = "'".html::escapeJS($default)."'";
645          }
[1187]646
[0]647          return
648          self::jsLoad('js/jquery/jquery.pageTabs.js').
649          '<script type="text/javascript">'."\n".
650          "//<![CDATA[\n".
[2010]651          '$(function() {'."\n".
[2054]652          '$.pageTabs('.$default.');'."\n".
[2010]653          '});'."\n".
[0]654          "\n//]]>\n".
[2010]655          "</script>\n";
656     }
[1161]657
658public static function jsModal()
659{
660     return
661     '<link rel="stylesheet" type="text/css" href="style/modal/modal.css" />'."\n".
662     self::jsLoad('js/jquery/jquery.modal.js').
663     '<script type="text/javascript">'."\n".
664     "//<![CDATA[\n".
665     self::jsVar('$.modal.prototype.params.loader_img','style/modal/loader.gif').
666     self::jsVar('$.modal.prototype.params.close_img','style/modal/close.png').
667     "\n//]]>\n".
668     "</script>\n";
669}
670
671public static function jsColorPicker()
672{
673     return
674     '<link rel="stylesheet" type="text/css" href="style/farbtastic/farbtastic.css" />'."\n".
675     self::jsLoad('js/jquery/jquery.farbtastic.js').
676     self::jsLoad('js/color-picker.js');
677}
678
679public static function jsDatePicker()
680{
681     return
682     '<link rel="stylesheet" type="text/css" href="style/date-picker.css" />'."\n".
683     self::jsLoad('js/date-picker.js').
684     '<script type="text/javascript">'."\n".
685     "//<![CDATA[\n".
[1187]686
[1161]687     "datePicker.prototype.months[0] = '".html::escapeJS(__('January'))."'; ".
688     "datePicker.prototype.months[1] = '".html::escapeJS(__('February'))."'; ".
689     "datePicker.prototype.months[2] = '".html::escapeJS(__('March'))."'; ".
690     "datePicker.prototype.months[3] = '".html::escapeJS(__('April'))."'; ".
691     "datePicker.prototype.months[4] = '".html::escapeJS(__('May'))."'; ".
692     "datePicker.prototype.months[5] = '".html::escapeJS(__('June'))."'; ".
693     "datePicker.prototype.months[6] = '".html::escapeJS(__('July'))."'; ".
694     "datePicker.prototype.months[7] = '".html::escapeJS(__('August'))."'; ".
695     "datePicker.prototype.months[8] = '".html::escapeJS(__('September'))."'; ".
696     "datePicker.prototype.months[9] = '".html::escapeJS(__('October'))."'; ".
697     "datePicker.prototype.months[10] = '".html::escapeJS(__('November'))."'; ".
698     "datePicker.prototype.months[11] = '".html::escapeJS(__('December'))."'; ".
[1187]699
[1161]700     "datePicker.prototype.days[0] = '".html::escapeJS(__('Monday'))."'; ".
701     "datePicker.prototype.days[1] = '".html::escapeJS(__('Tuesday'))."'; ".
702     "datePicker.prototype.days[2] = '".html::escapeJS(__('Wednesday'))."'; ".
703     "datePicker.prototype.days[3] = '".html::escapeJS(__('Thursday'))."'; ".
704     "datePicker.prototype.days[4] = '".html::escapeJS(__('Friday'))."'; ".
705     "datePicker.prototype.days[5] = '".html::escapeJS(__('Saturday'))."'; ".
706     "datePicker.prototype.days[6] = '".html::escapeJS(__('Sunday'))."'; ".
[1187]707
[1161]708     "datePicker.prototype.img_src = 'images/date-picker.png'; ".
[1187]709
[1161]710     "datePicker.prototype.close_msg = '".html::escapeJS(__('close'))."'; ".
711     "datePicker.prototype.now_msg = '".html::escapeJS(__('now'))."'; ".
[1187]712
[1161]713     "\n//]]>\n".
714     "</script>\n";
715}
716
717public static function jsToolBar()
718{
719     $res =
720     '<link rel="stylesheet" type="text/css" href="style/jsToolBar/jsToolBar.css" />'.
721     '<script type="text/javascript" src="js/jsToolBar/jsToolBar.js"></script>';
[1187]722
[1161]723     if (isset($GLOBALS['core']->auth) && $GLOBALS['core']->auth->getOption('enable_wysiwyg')) {
724          $res .= '<script type="text/javascript" src="js/jsToolBar/jsToolBar.wysiwyg.js"></script>';
[0]725     }
[1187]726
[1161]727     $res .=
728     '<script type="text/javascript" src="js/jsToolBar/jsToolBar.dotclear.js"></script>'.
729     '<script type="text/javascript">'."\n".
730     "//<![CDATA[\n".
731     "jsToolBar.prototype.dialog_url = 'popup.php'; ".
732     "jsToolBar.prototype.iframe_css = '".
733     'body{'.
734     'font: 12px "DejaVu Sans","Lucida Grande","Lucida Sans Unicode",Arial,sans-serif;'.
735     'color : #000;'.
736     'background: #f9f9f9;'.
737     'margin: 0;'.
738     'padding : 2px;'.
739     'border: none;'.
740     (l10n::getTextDirection($GLOBALS['_lang']) == 'rtl' ? 'direction:rtl;' : '').
741     '}'.
742     'pre, code, kbd, samp {'.
743     'font-family:"Courier New",Courier,monospace;'.
744     'font-size : 1.1em;'.
745     '}'.
746     'code {'.
747     'color : #666;'.
748     'font-weight : bold;'.
749     '}'.
750     'body > p:first-child {'.
751     'margin-top: 0;'.
752     '}'.
753     "'; ".
754     "jsToolBar.prototype.base_url = '".html::escapeJS($GLOBALS['core']->blog->host)."'; ".
755     "jsToolBar.prototype.switcher_visual_title = '".html::escapeJS(__('visual'))."'; ".
756     "jsToolBar.prototype.switcher_source_title = '".html::escapeJS(__('source'))."'; ".
757     "jsToolBar.prototype.legend_msg = '".
758     html::escapeJS(__('You can use the following shortcuts to format your text.'))."'; ".
759     "jsToolBar.prototype.elements.blocks.options.none = '".html::escapeJS(__('-- none --'))."'; ".
760     "jsToolBar.prototype.elements.blocks.options.nonebis = '".html::escapeJS(__('-- block format --'))."'; ".
761     "jsToolBar.prototype.elements.blocks.options.p = '".html::escapeJS(__('Paragraph'))."'; ".
762     "jsToolBar.prototype.elements.blocks.options.h1 = '".html::escapeJS(__('Level 1 header'))."'; ".
763     "jsToolBar.prototype.elements.blocks.options.h2 = '".html::escapeJS(__('Level 2 header'))."'; ".
764     "jsToolBar.prototype.elements.blocks.options.h3 = '".html::escapeJS(__('Level 3 header'))."'; ".
765     "jsToolBar.prototype.elements.blocks.options.h4 = '".html::escapeJS(__('Level 4 header'))."'; ".
766     "jsToolBar.prototype.elements.blocks.options.h5 = '".html::escapeJS(__('Level 5 header'))."'; ".
767     "jsToolBar.prototype.elements.blocks.options.h6 = '".html::escapeJS(__('Level 6 header'))."'; ".
768     "jsToolBar.prototype.elements.strong.title = '".html::escapeJS(__('Strong emphasis'))."'; ".
769     "jsToolBar.prototype.elements.em.title = '".html::escapeJS(__('Emphasis'))."'; ".
770     "jsToolBar.prototype.elements.ins.title = '".html::escapeJS(__('Inserted'))."'; ".
771     "jsToolBar.prototype.elements.del.title = '".html::escapeJS(__('Deleted'))."'; ".
772     "jsToolBar.prototype.elements.quote.title = '".html::escapeJS(__('Inline quote'))."'; ".
773     "jsToolBar.prototype.elements.code.title = '".html::escapeJS(__('Code'))."'; ".
774     "jsToolBar.prototype.elements.br.title = '".html::escapeJS(__('Line break'))."'; ".
775     "jsToolBar.prototype.elements.blockquote.title = '".html::escapeJS(__('Blockquote'))."'; ".
776     "jsToolBar.prototype.elements.pre.title = '".html::escapeJS(__('Preformated text'))."'; ".
777     "jsToolBar.prototype.elements.ul.title = '".html::escapeJS(__('Unordered list'))."'; ".
778     "jsToolBar.prototype.elements.ol.title = '".html::escapeJS(__('Ordered list'))."'; ".
[1187]779
[1161]780     "jsToolBar.prototype.elements.link.title = '".html::escapeJS(__('Link'))."'; ".
781     "jsToolBar.prototype.elements.link.href_prompt = '".html::escapeJS(__('URL?'))."'; ".
782     "jsToolBar.prototype.elements.link.hreflang_prompt = '".html::escapeJS(__('Language?'))."'; ".
[1187]783
[1161]784     "jsToolBar.prototype.elements.img.title = '".html::escapeJS(__('External image'))."'; ".
785     "jsToolBar.prototype.elements.img.src_prompt = '".html::escapeJS(__('URL?'))."'; ".
[1187]786
[1161]787     "jsToolBar.prototype.elements.img_select.title = '".html::escapeJS(__('Media chooser'))."'; ".
788     "jsToolBar.prototype.elements.post_link.title = '".html::escapeJS(__('Link to an entry'))."'; ";
[1187]789
[1161]790     if (!$GLOBALS['core']->auth->check('media,media_admin',$GLOBALS['core']->blog->id)) {
791          $res .= "jsToolBar.prototype.elements.img_select.disabled = true;\n";
[0]792     }
[1187]793
[1161]794     $res .=
795     "\n//]]>\n".
796     "</script>\n";
[1187]797
[1161]798     return $res;
799}
800
801public static function jsUpload($params=array(),$base_url=null)
802{
803     if (!$base_url) {
804          $base_url = path::clean(dirname(preg_replace('/(\?.*$)?/','',$_SERVER['REQUEST_URI']))).'/';
[0]805     }
[1187]806
[1161]807     $params = array_merge($params,array(
808          'sess_id='.session_id(),
809          'sess_uid='.$_SESSION['sess_browser_uid'],
810          'xd_check='.$GLOBALS['core']->getNonce()
[0]811          ));
[1187]812
[1161]813     return
814     '<script type="text/javascript">'."\n".
815     "//<![CDATA[\n".
816     "dotclear.jsUpload = {};\n".
817     "dotclear.jsUpload.msg = {};\n".
818     self::jsVar('dotclear.msg.enhanced_uploader_activate',__('Temporarily activate enhanced uploader')).
819     self::jsVar('dotclear.msg.enhanced_uploader_disable',__('Temporarily disable enhanced uploader')).
820     self::jsVar('dotclear.jsUpload.msg.limit_exceeded',__('Limit exceeded.')).
821     self::jsVar('dotclear.jsUpload.msg.size_limit_exceeded',__('File size exceeds allowed limit.')).
822     self::jsVar('dotclear.jsUpload.msg.canceled',__('Canceled.')).
823     self::jsVar('dotclear.jsUpload.msg.http_error',__('HTTP Error:')).
824     self::jsVar('dotclear.jsUpload.msg.error',__('Error:')).
825     self::jsVar('dotclear.jsUpload.msg.choose_file',__('Choose file')).
826     self::jsVar('dotclear.jsUpload.msg.choose_files',__('Choose files')).
827     self::jsVar('dotclear.jsUpload.msg.cancel',__('Cancel')).
828     self::jsVar('dotclear.jsUpload.msg.clean',__('Clean')).
829     self::jsVar('dotclear.jsUpload.msg.upload',__('Upload')).
[1461]830     self::jsVar('dotclear.jsUpload.msg.send',__('Send')).
831     self::jsVar('dotclear.jsUpload.msg.file_successfully_uploaded',__('File successfully uploaded.')).
[1161]832     self::jsVar('dotclear.jsUpload.msg.no_file_in_queue',__('No file in queue.')).
833     self::jsVar('dotclear.jsUpload.msg.file_in_queue',__('1 file in queue.')).
834     self::jsVar('dotclear.jsUpload.msg.files_in_queue',__('%d files in queue.')).
835     self::jsVar('dotclear.jsUpload.msg.queue_error',__('Queue error:')).
836     self::jsVar('dotclear.jsUpload.base_url',$base_url).
837     "\n//]]>\n".
[1461]838     "</script>\n".
839
840     self::jsLoad('js/jsUpload/vendor/jquery.ui.widget.js').
841     self::jsLoad('js/jsUpload/tmpl.js').
842     self::jsLoad('js/jsUpload/template-upload.js').
843     self::jsLoad('js/jsUpload/template-download.js').
844     self::jsLoad('js/jsUpload/load-image.js').
845     self::jsLoad('js/jsUpload/jquery.iframe-transport.js').
846     self::jsLoad('js/jsUpload/jquery.fileupload.js').
847     self::jsLoad('js/jsUpload/jquery.fileupload-process.js').
848     self::jsLoad('js/jsUpload/jquery.fileupload-resize.js').
849     self::jsLoad('js/jsUpload/jquery.fileupload-ui.js');
[0]850}
[1144]851
[1161]852public static function jsToolMan()
853{
854     return
855     '<script type="text/javascript" src="js/tool-man/core.js"></script>'.
856     '<script type="text/javascript" src="js/tool-man/events.js"></script>'.
857     '<script type="text/javascript" src="js/tool-man/css.js"></script>'.
858     '<script type="text/javascript" src="js/tool-man/coordinates.js"></script>'.
859     '<script type="text/javascript" src="js/tool-man/drag.js"></script>'.
860     '<script type="text/javascript" src="js/tool-man/dragsort.js"></script>'.
861     '<script type="text/javascript" src="js/dragsort-tablerows.js"></script>';
862}
[1144]863
[1161]864public static function jsMetaEditor()
865{
866     return
867     '<script type="text/javascript" src="js/meta-editor.js"></script>';
868}
[489]869}
[1187]870?>
Note: See TracBrowser for help on using the repository browser.

Sites map