Dotclear

Changeset 2313:ef1db3d7c388 for inc


Ignore:
Timestamp:
10/08/13 15:27:39 (12 years ago)
Author:
Dsls
Branch:
twig
Parents:
1524:913f5a36bbb0 (diff), 2312:d01c85eaa37d (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Twig merge - lots of things to adapt yet

Location:
inc
Files:
15 edited

Legend:

Unmodified
Added
Removed
  • inc/admin/default-templates/auth.html.twig

    r1517 r2313  
    11{% import "js_helpers.html.twig" as js %} 
    22<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
    3 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<?php echo $dlang; ?>" lang="en"> 
     3<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="{{dlang}}" lang="{{dlang}}"> 
    44<head> 
    55  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
    66  <meta http-equiv="Content-Script-Type" content="text/javascript" /> 
    77  <meta http-equiv="Content-Style-Type" content="text/css" /> 
    8   <meta http-equiv="Content-Language" content="en" /> 
     8  <meta http-equiv="Content-Language" content="{{dlang}}" /> 
    99  <meta name="ROBOTS" content="NOARCHIVE,NOINDEX,NOFOLLOW" /> 
    1010  <meta name="GOOGLEBOT" content="NOSNIPPET" /> 
    1111  <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 
    1212  <title>{{vendor_name}}</title> 
    13   <link rel="stylesheet" href="{{theme_url}}style/default.css" type="text/css" media="screen" /> 
     13  <link rel="icon" type="image/png" href="images/favicon96-logout.png" /> 
     14  <link rel="shortcut icon" href="favicon.ico" type="image/x-icon" />  
    1415  {{ js.load_IE7 }} 
    1516  {{ js.common }} 
    16   <script type="text/javascript" src="{{theme_url}}js/_auth.js"></script> 
     17  <link rel="stylesheet" href="{{theme_url}}style/default.css" type="text/css" media="screen" /> 
     18   <script type="text/javascript"> 
     19  //<![CDATA[ 
     20  $(window).load(function() { 
     21    var uid = $('input[name=user_id]'); 
     22    var upw = $('input[name=user_pwd]'); 
     23    uid.focus(); 
     24     
     25    if (upw.length == 0) { return; } 
     26     
     27    uid.keypress(processKey); 
     28 
     29    function processKey(evt) { 
     30      if (evt.which == 13 && upw.val() == '') { 
     31         upw.focus(); 
     32         return false; 
     33      } 
     34      return true; 
     35    }; 
     36    $.cookie('dc_admin_test_cookie',true); 
     37    if ($.cookie('dc_admin_test_cookie')) { 
     38      $('#cookie_help').hide(); 
     39      $.cookie('dc_admin_test_cookie', '', {'expires': -1}); 
     40    } else { 
     41      $('#cookie_help').show(); 
     42    } 
     43    $('#issue #more').toggleWithLegend($('#issue').children().not('#more')); 
     44  }); 
     45  //]]> 
     46  </script> 
    1747</head> 
    1848 
    1949<body id="dotclear-admin" class="auth"> 
    2050 
    21 {% form 'auth' %} 
    22 <div id="login-screen"> 
     51{% form 'auth' with {'id':'login-screen'} %} 
     52 
    2353<h1>{{vendor_name}}</h1> 
    2454{% if messages.alert is not empty %} 
     
    6494               <p>{{ form_field('user_id') }}</p> 
    6595               <p>{{ form_field('user_pwd') }}</p> 
    66                <p>{{ form_field('user_remember',{},{'nestedlabel':true, 'labelclass':'classic'}) }}</p> 
    67                <p>{{ form_field('auth_login',{"class":"add button"}) }}</p> 
     96               <p>{{ form_field('user_remember',{},{'nestedlabel':false}) }}</p> 
     97               <p>{{ form_field('auth_login',{"class":"login"}) }}{{ form_hidden() }}</p> 
    6898     {% if safe_mode %} 
    6999          </fieldset> 
     
    84114          </div> 
    85115{% endif %} 
    86 </div> 
    87116{% endform %} 
    88117</body> 
  • inc/admin/default-templates/forms/form_layout.html.twig

    r1517 r2313  
    3838{% endblock field_hidden %} 
    3939 
    40 {% block field_input %} 
     40{% block field_input -%} 
    4141{% autoescape "html" %} 
    4242{% spaceless %} 
    4343    {% set type = type|default('text') %} 
    44     {{ block('startlabel') }} 
    45      <input type="{{ type }}" {{ block('field_attr') }} {% if value is not empty %}value="{{ value }}" {% endif %} /> 
    46     {{ block('endlabel') }} 
     44    {{- block('startlabel') -}} 
     45     <input type="{{ type }}" {{ block('field_attr') }} {% if value is not empty %}value="{{ value }}" {%- endif -%} /> 
     46    {{- block('endlabel') -}} 
    4747{% endspaceless %} 
    4848{% endautoescape %} 
    49 {% endblock field_input %} 
     49{%- endblock field_input %} 
    5050 
    51 {% block field_checkbox %} 
    52 {% spaceless %} 
     51{% block field_checkbox -%} 
    5352{% set type = type|default('checkbox') %} 
    5453{% set nestedlabel = true %} 
    5554{% set labelclass = "classic" %} 
    56 {% set descafter = true %} 
     55{% set descafter = true -%} 
    5756    {{ block('field_input') }} 
    58 {% endspaceless %} 
    59 {% endblock field_checkbox %} 
     57{%- endblock field_checkbox %} 
    6058 
    6159{% block field_attr %} 
    6260{% spaceless %} 
    63  {% if id %}id="{{id}}"{% endif %} name="{{name}}" {% if read_only %} disabled="disabled"{% endif %}{#{% if required %} required="required"{% endif %}#}{% if maxlength %} maxlength="{{ maxlength }}"{% endif %}{% if checked %} checked="{{ checked }}"{% endif %}{% if pattern %} pattern="{{ pattern }}"{% endif %} 
    64     {% for attrname,attrvalue in attr %}{{attrname}}="{{attrvalue}}" {% endfor %} 
     61 {% if id %}id="{{id}}"{% endif %} name="{{name}}" {% if read_only %} disabled="disabled"{% endif %}{#{% if required %} required="required"{% endif %}#}{% if maxlength %} maxlength="{{ maxlength }}"{% endif %}{% if checked %} checked="{{ checked }}"{% endif %}{% if pattern %} pattern="{{ pattern }}"{% endif -%} 
     62    {%- for attrname,attrvalue in attr -%}{{attrname}}="{{attrvalue}}" {%- endfor -%} 
    6563{% endspaceless %} 
    6664{% endblock field_attr %} 
     
    9290{% endblock field_combo %} 
    9391 
    94 {% block startlabel %} 
     92{% block startlabel -%} 
    9593{% spaceless %} 
    96     {% if label is not empty %} 
    97         {% if required is not empty %} 
    98             {% set labelclass = labelclass ~ " required" %} 
    99         {% endif %} 
    100         <label for="{{name}}" {% if labelclass is not empty %}class="{{labelclass}}"{% endif %}>{% if required is not empty %}<abbr title="{{__('Required field')}}">*</abbr>{% endif %}  
    101  
    102           {% if descafter is empty %} {{label}} {% endif %} 
    103         {% if nestedlabel is empty %}</label> {% endif %} 
    104     {% endif %} 
     94    {%- if label is not empty -%} 
     95        {%- if required is not empty -%} 
     96            {%- set labelclass = labelclass ~ " required" -%} 
     97        {%- endif -%} 
     98        <label for="{{name}}" {% if labelclass is not empty %}class="{{labelclass}}"{% endif %}>{% if required is not empty %}<abbr title="{{__('Required field')}}">*</abbr>{% endif -%} 
     99          {%- if descafter is empty -%} {{label}} {%- endif -%} 
     100        {%- if nestedlabel is empty -%}</label> {%- endif -%} 
     101    {%- endif -%} 
    105102{% endspaceless %} 
    106 {% endblock startlabel %} 
     103{%- endblock startlabel %} 
    107104 
    108105{% block endlabel %} 
    109106{% spaceless %} 
    110     {% if label is not empty %} 
    111           {% if descafter %} {{label}} {% endif %} 
    112         {% if nestedlabel is not empty %}</label>{% endif %} 
    113     {% endif %} 
     107    {%- if label is not empty -%} 
     108          {%- if descafter -%} {{label}} {%- endif -%} 
     109        {%- if nestedlabel is not empty -%}</label>{%- endif -%} 
     110    {%- endif %} 
    114111{% endspaceless %} 
    115112{% endblock endlabel %} 
  • inc/admin/default-templates/js_helpers.html.twig

    r1507 r2313  
    1010 
    1111{% macro common() %} 
    12      <!-- jsCommon --> 
    13      {{ _self.load('js/jquery/jquery.js') }} 
    14      {{ _self.load('js/jquery/jquery.biscuit.js') }} 
    15      {{ _self.load('js/jquery/jquery.bgFade.js') }} 
    16      {{ _self.load('js/common.js') }} 
    17      {{ _self.load('js/prelude.js') }} 
    18      <script type="text/javascript"> 
    19      {% autoescape 'js' %} 
    20      //<![CDATA[ 
    21           dotclear.nonce = '{{session.nonce}}'; 
    22           dotclear.img_plus_src = '{{theme_url}}images/expand.png'; 
    23           dotclear.img_plus_alt = '{{__('uncover')}}'; 
    24           dotclear.img_minus_src = '{{theme_url}}images/hide.png'; 
    25           dotclear.img_minus_alt = '{{__('hide')}}'; 
    26           dotclear.img_menu_on = '{{theme_url}}images/menu_on.png'; 
    27           dotclear.img_menu_off = '{{theme_url}}images/menu_off.png'; 
    28           dotclear.msg.help = '{{__('help')}}'; 
    29           dotclear.msg.no_selection = '{{__('no selection')}}'; 
    30           dotclear.msg.select_all = '{{__('select all')}}'; 
    31           dotclear.msg.invert_sel = '{{__('invert selection')}}'; 
    32           dotclear.msg.website = '{{__('Web site:')}}'; 
    33           dotclear.msg.email = '{{__('Email:')}}'; 
    34           dotclear.msg.ip_address = '{{__('IP address:')}}'; 
    35           dotclear.msg.error = '{{__('Error:')}}'; 
    36           dotclear.msg.entry_created = '{{__('Entry has been successfully created.')}}'; 
    37           dotclear.msg.edit_entry = '{{__('Edit entry')}}'; 
    38           dotclear.msg.view_entry = '{{__('view entry')}}'; 
    39           dotclear.msg.confirm_delete_posts = '{{__("Are you sure you want to delete selected entries (%s)?")}}'; 
    40           dotclear.msg.confirm_delete_post = '{{__("Are you sure you want to delete this entry?")}}'; 
    41           dotclear.msg.confirm_spam_delete = '{{__('Are you sure you want to delete all spams?')}}'; 
    42           dotclear.msg.confirm_delete_comments = '{{__('Are you sure you want to delete selected comments (%s)?')}}'; 
    43           dotclear.msg.confirm_delete_comment = '{{__('Are you sure you want to delete this comment?')}}'; 
    44           dotclear.msg.cannot_delete_users = '{{__('Users with posts cannot be deleted.')}}'; 
    45           dotclear.msg.confirm_delete_user = '{{__('Are you sure you want to delete selected users (%s)?')}}'; 
    46           dotclear.msg.confirm_delete_category = '{{__('Are you sure you want to delete category "%s"?')}}'; 
    47           dotclear.msg.confirm_reorder_categories = '{{__('Are you sure you want to reorder all categories?')}}'; 
    48           dotclear.msg.confirm_delete_media = '{{__('Are you sure you want to remove media "%s"?')}}'; 
    49           dotclear.msg.confirm_extract_current = '{{__('Are you sure you want to extract archive in current directory?')}}'; 
    50           dotclear.msg.confirm_remove_attachment = '{{__('Are you sure you want to remove attachment "%s"?')}}'; 
    51           dotclear.msg.confirm_delete_lang = '{{__('Are you sure you want to delete "%s" language?')}}'; 
    52           dotclear.msg.confirm_delete_plugin = '{{__('Are you sure you want to delete "%s" plugin?')}}'; 
    53           dotclear.msg.use_this_theme = '{{__('Use this theme')}}'; 
    54           dotclear.msg.remove_this_theme = '{{__('Remove this theme')}}'; 
    55           dotclear.msg.confirm_delete_theme = '{{__('Are you sure you want to delete "%s" theme?')}}'; 
    56           dotclear.msg.zip_file_content = '{{__('Zip file content')}}'; 
    57           dotclear.msg.xhtml_validator = '{{__('XHTML markup validator')}}'; 
    58           dotclear.msg.xhtml_valid = '{{__('XHTML content is valid.')}}'; 
    59           dotclear.msg.xhtml_not_valid = '{{__('There are XHTML markup errors.')}}'; 
    60           dotclear.msg.confirm_change_post_format = '{{__('You have unsaved changes. Switch post format will loose these changes. Proceed anyway?')}}'; 
    61           dotclear.msg.load_enhanced_uploader = '{{__('Loading enhanced uploader =>please wait.')}}'; 
    62      //]]> 
    63      </script> 
    64      {% endautoescape %} 
     12<!-- jsCommon --> 
     13{{ _self.load('js/jquery/jquery.js') }} 
     14{% if current_blog is defined and jquery_migrate_mute -%} 
     15     <script type="text/javascript"> 
     16     //<![CDATA[ 
     17     jQuery.migrateMute = true 
     18     //]]> 
     19     </script> 
     20{%- endif %} 
     21{{ _self.load('js/jquery/jquery-migrate-1.2.1.js') }} 
     22{{ _self.load('js/jquery/jquery.biscuit.js') }} 
     23{{ _self.load('js/jquery/jquery.bgFade.js') }} 
     24{{ _self.load('js/common.js') }} 
     25{{ _self.load('js/prelude.js') }} 
     26<script type="text/javascript"> 
     27{% autoescape 'js' %} 
     28//<![CDATA[ 
     29dotclear.nonce = '{{session.nonce}}'; 
     30dotclear.img_plus_src = 'images/expand.png'; 
     31dotclear.img_plus_alt = '{{ __('uncover') }}'; 
     32dotclear.img_minus_src = 'images/hide.png'; 
     33dotclear.img_minus_alt = '{{ __('hide') }}'; 
     34dotclear.img_menu_on = 'images/menu_on.png'; 
     35dotclear.img_menu_off = 'images/menu_off.png'; 
     36dotclear.img_plus_theme_src = 'images/plus-theme.png'; 
     37dotclear.img_plus_theme_alt = '{{ __('uncover') }}'; 
     38dotclear.img_minus_theme_src = 'images/minus-theme.png'; 
     39dotclear.img_minus_theme_alt = '{{ __('hide') }}'; 
     40dotclear.msg.help  = '{{ __('Need help?') }}'; 
     41dotclear.msg.new_window  =  '{{ __('new window') }}'; 
     42dotclear.msg.help_hide  =  '{{ __('Hide') }}'; 
     43dotclear.msg.to_select  =  '{{ __('Select:') }}'; 
     44dotclear.msg.no_selection  =  '{{ __('no selection') }}'; 
     45dotclear.msg.select_all  =  '{{ __('select all') }}'; 
     46dotclear.msg.invert_sel  =  '{{ __('Invert selection') }}'; 
     47dotclear.msg.website  =  '{{ __('Web site:') }}'; 
     48dotclear.msg.email  =  '{{ __('Email:') }}'; 
     49dotclear.msg.ip_address  =  '{{ __('IP address:') }}'; 
     50dotclear.msg.error  =  '{{ __('Error:') }}'; 
     51dotclear.msg.entry_created  =  '{{ __('Entry has been successfully created.') }}'; 
     52dotclear.msg.edit_entry  =  '{{ __('Edit entry') }}'; 
     53dotclear.msg.view_entry  =  '{{ __('view entry') }}'; 
     54dotclear.msg.confirm_delete_posts  =  '{{ __("Are you sure you want to delete selected entries (%s)?") }}'; 
     55dotclear.msg.confirm_delete_medias  =  '{{ __("Are you sure you want to delete selected medias (%d)?") }}'; 
     56dotclear.msg.confirm_delete_categories  =  '{{ __("Are you sure you want to delete selected categories (%s)?") }}'; 
     57dotclear.msg.confirm_delete_post  =  '{{ __("Are you sure you want to delete this entry?") }}'; 
     58dotclear.msg.click_to_unlock  =  '{{ __("Click here to unlock the field") }}'; 
     59dotclear.msg.confirm_spam_delete  =  '{{ __('Are you sure you want to delete all spams?') }}'; 
     60dotclear.msg.confirm_delete_comments  =  '{{ __('Are you sure you want to delete selected comments (%s)?') }}'; 
     61dotclear.msg.confirm_delete_comment  =  '{{ __('Are you sure you want to delete this comment?') }}'; 
     62dotclear.msg.cannot_delete_users  =  '{{ __('Users with posts cannot be deleted.') }}'; 
     63dotclear.msg.confirm_delete_user  =  '{{ __('Are you sure you want to delete selected users (%s)?') }}'; 
     64dotclear.msg.confirm_delete_category  =  '{{ __('Are you sure you want to delete category "%s"?') }}'; 
     65dotclear.msg.confirm_reorder_categories  =  '{{ __('Are you sure you want to reorder all categories?') }}'; 
     66dotclear.msg.confirm_delete_media  =  '{{ __('Are you sure you want to remove media "%s"?') }}'; 
     67dotclear.msg.confirm_extract_current  =  '{{ __('Are you sure you want to extract archive in current directory?') }}'; 
     68dotclear.msg.confirm_remove_attachment  =  '{{ __('Are you sure you want to remove attachment "%s"?') }}'; 
     69dotclear.msg.confirm_delete_lang  =  '{{ __('Are you sure you want to delete "%s" language?') }}'; 
     70dotclear.msg.confirm_delete_plugin  =  '{{ __('Are you sure you want to delete "%s" plugin?') }}'; 
     71dotclear.msg.use_this_theme  =  '{{ __('Use this theme') }}'; 
     72dotclear.msg.remove_this_theme  =  '{{ __('Remove this theme') }}'; 
     73dotclear.msg.confirm_delete_theme  =  '{{ __('Are you sure you want to delete "%s" theme?') }}'; 
     74dotclear.msg.confirm_delete_backup  =  '{{ __('Are you sure you want to delete this backup?') }}'; 
     75dotclear.msg.zip_file_content  =  '{{ __('Zip file content') }}'; 
     76dotclear.msg.xhtml_validator  =  '{{ __('XHTML markup validator') }}'; 
     77dotclear.msg.xhtml_valid  =  '{{ __('XHTML content is valid.') }}'; 
     78dotclear.msg.xhtml_not_valid  =  '{{ __('There are XHTML markup errors.') }}'; 
     79dotclear.msg.warning_validate_no_save_content  =  '{{ __('Attention: an audit of a content not yet registered.') }}'; 
     80dotclear.msg.confirm_change_post_format  =  '{{ __('You have unsaved changes. Switch post format will loose these changes. Proceed anyway?') }}'; 
     81dotclear.msg.confirm_change_post_format_noconvert  =  '{{ __("Warning: post format change will not convert existing content. You will need to apply new format by yourself. Proceed anyway?") }}'; 
     82dotclear.msg.load_enhanced_uploader  =  '{{ __('Loading enhanced uploader, please wait.') }}'; 
     83dotclear.msg.module_author  =  '{{ __('Author:') }}'; 
     84dotclear.msg.module_details  =  '{{ __('Details') }}'; 
     85dotclear.msg.module_support  =  '{{ __('Support') }}'; 
     86dotclear.msg.module_help  =  '{{ __('Help:') }}'; 
     87dotclear.msg.module_section  =  '{{ __('Section:') }}'; 
     88dotclear.msg.module_tags  =  '{{ __('Tags:') }}'; 
     89//]]> 
     90</script> 
     91{% endautoescape %} 
    6592{% endmacro %} 
    6693 
    6794{% macro load_IE7() %} 
    68      <!--[if lt IE 8]> 
    69      {{ _self.load('ie7/IE8.js') }} 
    70      <link rel="stylesheet" type="text/css" href="{{theme_url}}style/iesucks.css" /> 
    71      <![endif]--> 
     95<!--[if lt IE 9]> 
     96{{ _self.load('js/ie7/IE9.js') }} 
     97<link rel="stylesheet" type="text/css" href="style/iesucks.css" /> 
     98<![endif]--> 
    7299{% endmacro %} 
    73100 
  • inc/admin/lib.dc.page.php

    r1492 r2313  
    4949 
    5050     # Top of admin page 
    51      public static function open($title='', $head='') 
     51     public static function open($title='',$head='',$breadcrumb='') 
    5252     { 
    5353          global $core; 
    5454 
    5555          # List of user's blogs 
    56           if ($core->auth->blog_count == 1 || $core->auth->blog_count > 20) 
     56          if ($core->auth->getBlogCount() == 1 || $core->auth->getBlogCount() > 20) 
    5757          { 
    5858               $blog_box = 
     
    6060               html::escapeHTML($core->blog->name).'</strong>'; 
    6161 
    62                if ($core->auth->blog_count > 20) { 
     62               if ($core->auth->getBlogCount() > 20) { 
    6363                    $blog_box .= ' - <a href="blogs.php">'.__('Change blog').'</a>'; 
    6464               } 
     
    7373               } 
    7474               $blog_box = 
    75                '<p><label for="switchblog" class="classic nomobile">'. 
     75               '<p><label for="switchblog" class="classic">'. 
    7676               __('Blogs:').'</label> '. 
    7777               $core->formNonce(). 
    7878               form::combo('switchblog',$blogs,$core->blog->id). 
    79                '</p>'. 
    80                '<noscript><p><input type="submit" value="'.__('ok').'" /></p></noscript>'; 
     79               '<input type="submit" value="'.__('ok').'" class="hidden-if-js" /></p>'; 
    8180          } 
    8281 
     
    109108          $user_ui_hide_std_favicon = $core->auth->user_prefs->interface->hide_std_favicon; 
    110109          if (!$user_ui_hide_std_favicon) { 
    111                echo '<link rel="icon" type="image/png" href="images/favicon.png" />'; 
     110               echo  
     111               '<link rel="icon" type="image/png" href="images/favicon96-login.png" />'. 
     112               '<link rel="shortcut icon" href="images/favicon.ico" type="image/x-icon" />'; 
    112113          } 
    113114 
    114115          echo 
    115116          self::jsCommon(). 
     117          self::jsToggles(). 
    116118          $head; 
    117119 
     
    122124          "</head>\n". 
    123125          '<body id="dotclear-admin'. 
    124           ($safe_mode ? ' safe-mode' : ''). 
    125           '">'."\n". 
    126  
     126          ($safe_mode ? ' safe-mode' : '').'" class="no-js">'."\n". 
     127 
     128          '<ul id="prelude">'. 
     129          '<li><a href="#content">'.__('Go to the content').'</a></li>'. 
     130          '<li><a href="#main-menu">'.__('Go to the menu').'</a></li>'. 
     131          '<li><a href="#qx">'.__('Go to search').'</a></li>'. 
     132          '<li><a href="#help">'.__('Go to help').'</a></li>'. 
     133          '</ul>'."\n". 
    127134          '<div id="header">'. 
    128           '<ul id="prelude"><li><a href="#content">'.__('Go to the content').'</a></li><li><a href="#main-menu">'.__('Go to the menu').'</a></li></ul>'."\n". 
    129           '<div id="top"><h1><a href="index.php">'.DC_VENDOR_NAME.'</a></h1></div>'."\n"; 
    130  
    131           echo 
    132           '<div id="info-boxes">'. 
    133           '<div id="info-box1">'. 
    134           '<form action="index.php" method="post">'. 
     135          '<h1><a href="index.php"><span class="hidden">'.DC_VENDOR_NAME.'</span></a></h1>'."\n"; 
     136 
     137          echo 
     138          '<form action="index.php" method="post" id="top-info-blog">'. 
    135139          $blog_box. 
    136           '<p class="nomobile"><a href="'.$core->blog->url.'" onclick="window.open(this.href);return false;" title="'.__('Go to site').' ('.__('new window').')'.'">'.__('Go to site').' <img src="images/outgoing.png" alt="" /></a>'. 
     140          '<p><a href="'.$core->blog->url.'" class="outgoing" title="'.__('Go to site'). 
     141          '">'.__('Go to site').'<img src="images/outgoing.png" alt="" /></a>'. 
    137142          '</p></form>'. 
    138           '</div>'. 
    139           '<div id="info-box2">'. 
    140           '<a class="smallscreen'.(preg_match('/index.php$/',$_SERVER['REQUEST_URI']) ? ' active' : '').'" href="index.php">'.__('My dashboard').'</a>'. 
    141           '<span class="smallscreen"> | </span><a class="smallscreen'.(preg_match('/preferences.php(\?.*)?$/',$_SERVER['REQUEST_URI']) ? ' active' : '').'" href="preferences.php">'.__('My preferences').'</a>'. 
    142           '<span class="smallscreen"> | </span><a href="index.php?logout=1" class="logout">'.sprintf(__('Logout %s'),$core->auth->userID()).' <img src="images/logout.png" alt="" /></a>'. 
    143           '</div>'. 
    144           '</div>'. 
    145           '</div>'; 
    146  
    147           echo 
    148           '<div id="wrapper">'."\n". 
     143          '<ul id="top-info-user">'. 
     144          '<li><a class="'.(preg_match('/index.php$/',$_SERVER['REQUEST_URI']) ? ' active' : '').'" href="index.php">'.__('My dashboard').'</a></li>'. 
     145          '<li><a class="smallscreen'.(preg_match('/preferences.php(\?.*)?$/',$_SERVER['REQUEST_URI']) ? ' active' : ''). 
     146          '" href="preferences.php">'.__('My preferences').'</a></li>'. 
     147          '<li><a href="index.php?logout=1" class="logout"><span class="nomobile">'.sprintf(__('Logout %s'),$core->auth->userID()). 
     148          '</span><img src="images/logout.png" alt="" /></a></li>'. 
     149          '</ul>'. 
     150          '</div>'; // end header 
     151 
     152          echo 
     153          '<div id="wrapper" class="clearfix">'."\n". 
     154          '<div class="hidden-if-no-js collapser-box"><a href="#" id="collapser">'. 
     155          '<img class="collapse-mm" src="images/collapser-hide.png" alt="'.__('Hide main menu').'" />'. 
     156          '<img class="expand-mm" src="images/collapser-show.png" alt="'.__('Show main menu').'" />'. 
     157          '</a></div>'. 
    149158          '<div id="main">'."\n". 
    150           '<div id="content">'."\n"; 
     159          '<div id="content" class="clearfix">'."\n"; 
    151160 
    152161          # Safe mode 
     
    154163          { 
    155164               echo 
    156                '<div class="error"><h3>'.__('Safe mode').'</h3>'. 
     165               '<div class="warning"><h3>'.__('Safe mode').'</h3>'. 
    157166               '<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>'. 
    158167               '</div>'; 
    159168          } 
    160169 
     170          // Display breadcrumb (if given) before any error message 
     171          echo $breadcrumb; 
     172 
    161173          if ($core->error->flag()) { 
    162174               echo 
    163                '<div class="error"><p><strong>'.(count($core->error->getErrors()) > 1 ? __('Errors:') : __('Error:')).'</p></strong>'. 
     175               '<div class="error"><p><strong>'.(count($core->error->getErrors()) > 1 ? __('Errors:') : __('Error:')).'</strong></p>'. 
    164176               $core->error->toHTML(). 
    165177               '</div>'; 
    166178          } 
     179 
     180          // Display notices 
     181          echo self::notices(); 
     182     } 
     183 
     184     public static function notices() 
     185     { 
     186          // return notices if any 
     187          $res = ''; 
     188          if (isset($_SESSION['notifications'])) { 
     189               $types = array("success" => "success", "warning" => "warning-msg", "error" => "error"); 
     190               $notifications = $_SESSION['notifications']; 
     191               foreach ($types as $type => $class) { 
     192                    if (isset($notifications[$type])) { 
     193                         foreach ($notifications[$type] as $n) { 
     194                              $res .= self::getNotification($n,$class); 
     195                         } 
     196                    } 
     197               } 
     198               unset($_SESSION['notifications']); 
     199          } 
     200          return $res; 
     201     } 
     202 
     203     public static function addNotice($type,$message) 
     204     { 
     205          $notification = isset($_SESSION['notifications']) ? $_SESSION['notifications'] : array(); 
     206          $notification[$type][] = array('ts' => time(), 'text' => $message); 
     207          $_SESSION['notifications'] = $notification; 
     208     } 
     209 
     210     public static function addSuccessNotice($message) 
     211     { 
     212          self::addNotice("success",$message); 
     213     } 
     214 
     215     public static function addWarningNotice($message) 
     216     { 
     217          self::addNotice("warning",$message); 
     218     } 
     219 
     220     public static function addErrorNotice($message) 
     221     { 
     222          self::addNotice("error",$message); 
     223     } 
     224 
     225     protected static function getNotification($msg,$class) 
     226     { 
     227          global $core; 
     228 
     229          $res = '<p class="'.$class.'">'.dt::str(__('[%H:%M:%S]'),$msg['ts'],$core->auth->getInfo('user_tz')).' '.$msg['text'].'</p>'; 
     230          return $res; 
    167231     } 
    168232 
     
    170234     { 
    171235          global $core; 
     236 
     237          if (!$GLOBALS['__resources']['ctxhelp']) { 
     238               echo 
     239               '<p id="help-button"><a href="help.php" class="outgoing" title="'. 
     240               __('Global help').'">'.__('Global help').'</a></p>'; 
     241          } 
    172242 
    173243          $menu =& $GLOBALS['_menu']; 
     
    180250 
    181251          '<form id="search-menu" action="search.php" method="get">'. 
    182           '<p><label for="q" class="hidden">'.__('Search:').' </label>'.form::field('q',30,255,''). 
     252          '<p><label for="qx" class="hidden">'.__('Search:').' </label>'.form::field('qx',30,255,''). 
    183253          '<input type="submit" value="'.__('OK').'" /></p>'. 
    184254          '</form>'; 
     
    199269          echo 
    200270          '</div>'."\n".      // End of #main-menu 
    201           '<div id="footer"><a href="http://dotclear.org/" title="'.$text.'"><img src="style/dc_logos/w-dotclear90.png" alt="'.$text.'" /></a></div>'."\n". 
    202271          "</div>\n";         // End of #wrapper 
     272 
     273          echo 
     274          '<div id="footer">'. 
     275          '<a href="http://dotclear.org/" title="'.$text.'">'. 
     276          '<img src="style/dc_logos/w-dotclear90.png" alt="'.$text.'" /></a></div>'."\n". 
     277        "<!-- \n                  \n               ,;:'`'::\n". 
     278          "            __||\n      _____/LLLL\_\n      \__________\"|\n". 
     279        "    ~^~^~^~^~^~^~^~^~^~\n -->\n"; 
    203280 
    204281          if (defined('DC_DEV') && DC_DEV === true) { 
     
    210287     } 
    211288 
    212      public static function openPopup($title='', $head='') 
     289     public static function openPopup($title='',$head='',$breadcrumb='') 
    213290     { 
    214291          global $core; 
     
    239316          echo 
    240317          self::jsCommon(). 
     318          self::jsToggles(). 
    241319          $head; 
    242320 
     
    248326          '<body id="dotclear-admin" class="popup">'."\n". 
    249327 
    250           '<div id="top hidden"><h1>'.DC_VENDOR_NAME.'</h1></div>'."\n"; 
     328          '<h1>'.DC_VENDOR_NAME.'</h1>'."\n"; 
    251329 
    252330          echo 
     
    254332          '<div id="main">'."\n". 
    255333          '<div id="content">'."\n"; 
     334 
     335          // display breadcrumb if given 
     336          echo $breadcrumb; 
    256337 
    257338          if ($core->error->flag()) { 
     
    268349          "</div>\n".         // End of #content 
    269350          "</div>\n".         // End of #main 
     351          "</div>\n".         // End of #wrapper 
    270352          '<div id="footer"><p>&nbsp;</p></div>'."\n". 
    271           "</div>\n".         // End of #wrapper 
    272353          '</body></html>'; 
    273354     } 
    274355 
    275      public static function breadcrumb($elements=null,$no_home_link=false) 
    276      { 
     356     public static function breadcrumb($elements=null,$options=array()) 
     357     { 
     358          $with_home_link = isset($options['home_link'])?$options['home_link']:true; 
     359          $hl = isset($options['hl'])?$options['hl']:true; 
     360          $hl_pos = isset($options['hl_pos'])?$options['hl_pos']:-1; 
    277361          // First item of array elements should be blog's name, System or Plugins 
    278           $res = '<h2>'.($no_home_link ? 
    279                '<img src="style/dashboard-alt.png" alt="" />' : 
    280                '<a class="go_home" href="index.php"><img src="style/dashboard.png" alt="'.__('Go to dashboard').'" /></a>'); 
     362          $res = '<h2>'.($with_home_link ? 
     363               '<a class="go_home" href="index.php"><img src="style/dashboard.png" alt="'.__('Go to dashboard').'" /></a>' : 
     364               '<img src="style/dashboard-alt.png" alt="" />'); 
    281365          $index = 0; 
     366          if ($hl_pos < 0) { 
     367               $hl_pos = count($elements)+$hl_pos; 
     368          } 
    282369          foreach ($elements as $element => $url) { 
    283                $res .= ($no_home_link ? ' ' : ($index == 1 ? ' : ' : ' &rsaquo; ')).($url ? '<a href="'.$url.'">' : '').$element.($url ? '</a>' : ''); 
     370               if ($hl && $index == $hl_pos) { 
     371                    $element = sprintf('<span class="page-title">%s</span>',$element); 
     372               } 
     373               $res .= ($with_home_link ? ($index == 1 ? ' : ' : ' &rsaquo; ') : ($index == 0 ? ' ' : ' &rsaquo; ')). 
     374                    ($url ? '<a href="'.$url.'">' : '').$element.($url ? '</a>' : ''); 
    284375               $index++; 
    285376          } 
     
    288379     } 
    289380 
    290      public static function message($msg,$timestamp=true,$div=false,$echo=true) 
     381     public static function message($msg,$timestamp=true,$div=false,$echo=true,$class='message') 
    291382     { 
    292383          global $core; 
     
    294385          $res = ''; 
    295386          if ($msg != '') { 
    296                $res = ($div ? '<div class="message">' : '').'<p'.($div ? '' : ' class="message"').'>'. 
    297                ($timestamp ? dt::str(__('%H:%M:%S:'),null,$core->auth->getInfo('user_tz')).' ' : '').$msg. 
     387               $res = ($div ? '<div class="'.$class.'">' : '').'<p'.($div ? '' : ' class="'.$class.'"').'>'. 
     388               ($timestamp ? dt::str(__('[%H:%M:%S]'),null,$core->auth->getInfo('user_tz')).' ' : '').$msg. 
    298389               '</p>'.($div ? '</div>' : ''); 
    299390               if ($echo) { 
     
    302393          } 
    303394          return $res; 
     395     } 
     396 
     397     public static function success($msg,$timestamp=true,$div=false,$echo=true) 
     398     { 
     399          return self::message($msg,$timestamp,$div,$echo,"success"); 
     400     } 
     401 
     402     public static function warning($msg,$timestamp=true,$div=false,$echo=true) 
     403     { 
     404          return self::message($msg,$timestamp,$div,$echo,"warning-msg"); 
    304405     } 
    305406 
     
    355456     { 
    356457          $args = func_get_args(); 
     458 
     459          $args = new ArrayObject($args); 
     460 
     461          # --BEHAVIOR-- adminPageHelpBlock 
     462          $GLOBALS['core']->callBehavior('adminPageHelpBlock',$args); 
     463 
    357464          if (empty($args)) { 
    358465               return; 
     
    392499          } 
    393500 
    394           echo 
    395           '<div id="help"><hr /><div class="help-content clear"><h2>'.__('Help').'</h2>'. 
     501          // Set contextual help global flag 
     502          $GLOBALS['__resources']['ctxhelp'] = true; 
     503 
     504          echo 
     505          '<div id="help"><hr /><div class="help-content clear"><h3>'.__('Help about this page').'</h3>'. 
    396506          $content. 
     507          '</div>'. 
     508          '<div id="helplink"><hr />'. 
     509          '<p>'. 
     510          sprintf(__('See also %s'),sprintf('<a href="help.php">%s</a>',__('the global help'))). 
     511          '.</p>'. 
    397512          '</div></div>'; 
    398513     } 
     
    412527     } 
    413528 
     529     public static function jsToggles() 
     530     { 
     531          if($GLOBALS['core']->auth->user_prefs->toggles) { 
     532               $unfolded_sections = explode(',',$GLOBALS['core']->auth->user_prefs->toggles->unfolded_sections); 
     533               foreach ($unfolded_sections as $k=>&$v) { 
     534                    if ($v == '') { 
     535                         unset($unfolded_sections[$k]); 
     536                    } else { 
     537                         $v = "'".html::escapeJS($v)."':true"; 
     538                    } 
     539               } 
     540          } else { 
     541               $unfolded_sections=array(); 
     542          } 
     543          return '<script type="text/javascript">'."\n". 
     544                         "//<![CDATA[\n". 
     545                         'dotclear.unfolded_sections = {'.join(",",$unfolded_sections)."};\n". 
     546                         "\n//]]>\n". 
     547                    "</script>\n"; 
     548     } 
     549      
    414550     public static function jsCommon() 
    415551     { 
     552          $mute_or_no = ''; 
     553          if (empty($GLOBALS['core']->blog) || $GLOBALS['core']->blog->settings->system->jquery_migrate_mute) { 
     554               $mute_or_no .= 
     555                    '<script type="text/javascript">'."\n". 
     556                    "//<![CDATA[\n". 
     557                    'jQuery.migrateMute = true;'. 
     558                    "\n//]]>\n". 
     559                    "</script>\n"; 
     560          } 
     561 
    416562          return 
    417563          self::jsLoad('js/jquery/jquery.js'). 
     564          $mute_or_no. 
     565          self::jsLoad('js/jquery/jquery-migrate-1.2.1.js'). 
    418566          self::jsLoad('js/jquery/jquery.biscuit.js'). 
    419567          self::jsLoad('js/jquery/jquery.bgFade.js'). 
     
    432580          self::jsVar('dotclear.img_menu_off','images/menu_off.png'). 
    433581 
     582          self::jsVar('dotclear.img_plus_theme_src','images/plus-theme.png'). 
     583          self::jsVar('dotclear.img_plus_theme_alt',__('uncover')). 
     584          self::jsVar('dotclear.img_minus_theme_src','images/minus-theme.png'). 
     585          self::jsVar('dotclear.img_minus_theme_alt',__('hide')). 
     586 
    434587          self::jsVar('dotclear.msg.help', 
    435                __('Help about this page')). 
     588               __('Need help?')). 
     589          self::jsVar('dotclear.msg.new_window', 
     590               __('new window')). 
    436591          self::jsVar('dotclear.msg.help_hide', 
    437592               __('Hide')). 
     593          self::jsVar('dotclear.msg.to_select', 
     594               __('Select:')). 
    438595          self::jsVar('dotclear.msg.no_selection', 
    439596               __('no selection')). 
     
    441598               __('select all')). 
    442599          self::jsVar('dotclear.msg.invert_sel', 
    443                __('invert selection')). 
     600               __('Invert selection')). 
    444601          self::jsVar('dotclear.msg.website', 
    445602               __('Web site:')). 
     
    458615          self::jsVar('dotclear.msg.confirm_delete_posts', 
    459616               __("Are you sure you want to delete selected entries (%s)?")). 
     617          self::jsVar('dotclear.msg.confirm_delete_medias', 
     618               __("Are you sure you want to delete selected medias (%d)?")). 
     619          self::jsVar('dotclear.msg.confirm_delete_categories', 
     620               __("Are you sure you want to delete selected categories (%s)?")). 
    460621          self::jsVar('dotclear.msg.confirm_delete_post', 
    461622               __("Are you sure you want to delete this entry?")). 
     623          self::jsVar('dotclear.msg.click_to_unlock', 
     624               __("Click here to unlock the field")). 
    462625          self::jsVar('dotclear.msg.confirm_spam_delete', 
    463626               __('Are you sure you want to delete all spams?')). 
     
    490653          self::jsVar('dotclear.msg.confirm_delete_theme', 
    491654               __('Are you sure you want to delete "%s" theme?')). 
     655          self::jsVar('dotclear.msg.confirm_delete_backup', 
     656               __('Are you sure you want to delete this backup?')). 
    492657          self::jsVar('dotclear.msg.zip_file_content', 
    493658               __('Zip file content')). 
     
    498663          self::jsVar('dotclear.msg.xhtml_not_valid', 
    499664               __('There are XHTML markup errors.')). 
     665          self::jsVar('dotclear.msg.warning_validate_no_save_content', 
     666               __('Attention: an audit of a content not yet registered.')). 
    500667          self::jsVar('dotclear.msg.confirm_change_post_format', 
    501668               __('You have unsaved changes. Switch post format will loose these changes. Proceed anyway?')). 
     669          self::jsVar('dotclear.msg.confirm_change_post_format_noconvert', 
     670               __("Warning: post format change will not convert existing content. You will need to apply new format by yourself. Proceed anyway?")). 
    502671          self::jsVar('dotclear.msg.load_enhanced_uploader', 
    503672               __('Loading enhanced uploader, please wait.')). 
     673 
     674          self::jsVar('dotclear.msg.module_author', 
     675               __('Author:')). 
     676          self::jsVar('dotclear.msg.module_details', 
     677               __('Details')). 
     678          self::jsVar('dotclear.msg.module_support', 
     679               __('Support')). 
     680          self::jsVar('dotclear.msg.module_help', 
     681               __('Help:')). 
     682          self::jsVar('dotclear.msg.module_section', 
     683               __('Section:')). 
     684          self::jsVar('dotclear.msg.module_tags', 
     685               __('Tags:')). 
    504686          "\n//]]>\n". 
    505687          "</script>\n"; 
     
    509691     { 
    510692          return 
    511           '<!--[if lt IE 8]>'."\n". 
    512           self::jsLoad('js/ie7/IE8.js'). 
     693          '<!--[if lt IE 9]>'."\n". 
     694          self::jsLoad('js/ie7/IE9.js'). 
    513695          '<link rel="stylesheet" type="text/css" href="style/iesucks.css" />'."\n". 
    514696          '<![endif]-->'."\n"; 
     
    547729          '<script type="text/javascript">'."\n". 
    548730          "//<![CDATA[\n". 
    549           "\$(function() {\n". 
    550                "    \$.pageTabs(".$default.");\n". 
    551                "});\n". 
    552 "\n//]]>\n". 
    553 "</script>\n"; 
    554 } 
    555  
    556 public static function jsModal() 
    557 { 
     731          '$(function() {'."\n". 
     732          '$.pageTabs('.$default.');'."\n". 
     733          '});'. 
     734          "\n//]]>\n". 
     735          "</script>\n". 
     736          '<!--[if lt IE 8]>'."\n". 
     737          self::jsLoad('js/ie7/ie7-hashchange.js'). 
     738          '<script type="text/javascript">'."\n". 
     739          "//<![CDATA[\n". 
     740          '$(window).hashchange();'. 
     741          "\n//]]>\n". 
     742          "</script>\n". 
     743          '<![endif]-->'."\n"; 
     744     } 
     745 
     746     public static function jsModal() 
     747     { 
    558748     return 
    559749     '<link rel="stylesheet" type="text/css" href="style/modal/modal.css" />'."\n". 
     
    565755     "\n//]]>\n". 
    566756     "</script>\n"; 
    567 } 
    568  
    569 public static function jsColorPicker() 
    570 { 
     757     } 
     758 
     759     public static function jsColorPicker() 
     760     { 
    571761     return 
    572762     '<link rel="stylesheet" type="text/css" href="style/farbtastic/farbtastic.css" />'."\n". 
    573763     self::jsLoad('js/jquery/jquery.farbtastic.js'). 
    574764     self::jsLoad('js/color-picker.js'); 
    575 } 
    576  
    577 public static function jsDatePicker() 
    578 { 
     765     } 
     766 
     767     public static function jsDatePicker() 
     768     { 
    579769     return 
    580770     '<link rel="stylesheet" type="text/css" href="style/date-picker.css" />'."\n". 
     
    611801     "\n//]]>\n". 
    612802     "</script>\n"; 
    613 } 
    614  
    615 public static function jsToolBar() 
    616 { 
     803     } 
     804 
     805     public static function jsToolBar() 
     806     { 
    617807     $res = 
    618808     '<link rel="stylesheet" type="text/css" href="style/jsToolBar/jsToolBar.css" />'. 
     
    695885 
    696886     return $res; 
    697 } 
    698  
    699 public static function jsUpload($params=array(),$base_url=null) 
    700 { 
     887     } 
     888 
     889     public static function jsUpload($params=array(),$base_url=null) 
     890     { 
    701891     if (!$base_url) { 
    702892          $base_url = path::clean(dirname(preg_replace('/(\?.*$)?/','',$_SERVER['REQUEST_URI']))).'/'; 
     
    710900 
    711901     return 
    712      '<link rel="stylesheet" type="text/css" href="style/jsUpload/style.css" />'."\n". 
    713  
    714      '<script id="template-upload" type="text/x-tmpl"> 
    715      {% for (var i=0, file; file=o.files[i]; i++) { %} 
    716      <div class="template-upload fade"> 
    717      <div class="upload-file"> 
    718      <div class="upload-fileinfo"> 
    719           <span class="upload-filename">{%=file.name%}</span> 
    720           <span class="upload-filesize">({%=o.formatFileSize(file.size)%})</span> 
    721           <span class="upload-filecancel cancel">'.__('Cancel').'</span> 
    722           {% if (!o.files.error && !i && !o.options.autoUpload) { %} 
    723           <input type="submit" class="button start"  value="'.__('Send').'"/> 
    724           {% } %} 
    725           <span class="upload-filemsg"></span> 
    726      </div> 
    727      {% if (!o.files.error) { %} 
    728      <div class="upload-progress progress progress-success progress-striped active"><div class="bar" style="width:0%;"></div></div> 
    729      {% } %} 
    730      </div> 
    731      {% } %} 
    732      </script> 
    733      <!-- The template to display files available for download --> 
    734      <script id="template-download" type="text/x-tmpl"> 
    735      {% for (var i=0, file; file=o.files[i]; i++) { %} 
    736      <div class="template-download fade"> 
    737      <div class="upload-file"> 
    738      <div class="upload-fileinfo"> 
    739           <span class="upload-filename">{%=file.name%}</span> 
    740           <span class="upload-filesize">({%=o.formatFileSize(file.size)%})</span> 
    741           <span class="upload-filemsg{% if (file.error) { %} upload-error{% } %}"> 
    742           {% if (file.error) { %} 
    743           '.__('Error:').' {%=file.error%} 
    744           {% } else { %} 
    745           '.__('File successfully uploaded.').' 
    746           {% } %} 
    747           </span> 
    748      </div> 
    749      <div class="upload-progress"> 
    750           {% if (!file.error) { %} 
    751           <div class="bar" style="width:100%;">100%</div> 
    752           {% } %} 
    753      </div> 
    754      </div> 
    755      {% } %} 
    756      </script>'. 
    757  
    758      self::jsLoad('js/jsUpload/vendor/jquery.ui.widget.js'). 
    759      self::jsLoad('js/jsUpload/tmpl.js'). 
    760      self::jsLoad('js/jsUpload/load-image.js'). 
    761      self::jsLoad('js/jsUpload/jquery.iframe-transport.js'). 
    762      self::jsLoad('js/jsUpload/jquery.fileupload.js'). 
    763      self::jsLoad('js/jsUpload/jquery.fileupload-process.js'). 
    764      self::jsLoad('js/jsUpload/jquery.fileupload-resize.js'). 
    765      self::jsLoad('js/jsUpload/jquery.fileupload-ui.js'). 
    766  
    767902     '<script type="text/javascript">'."\n". 
    768903     "//<![CDATA[\n". 
     
    781916     self::jsVar('dotclear.jsUpload.msg.clean',__('Clean')). 
    782917     self::jsVar('dotclear.jsUpload.msg.upload',__('Upload')). 
     918          self::jsVar('dotclear.jsUpload.msg.send',__('Send')). 
     919          self::jsVar('dotclear.jsUpload.msg.file_successfully_uploaded',__('File successfully uploaded.')). 
    783920     self::jsVar('dotclear.jsUpload.msg.no_file_in_queue',__('No file in queue.')). 
    784921     self::jsVar('dotclear.jsUpload.msg.file_in_queue',__('1 file in queue.')). 
     
    787924     self::jsVar('dotclear.jsUpload.base_url',$base_url). 
    788925     "\n//]]>\n". 
    789      "</script>\n"; 
    790 } 
    791  
    792 public static function jsToolMan() 
    793 { 
     926          "</script>\n". 
     927 
     928          self::jsLoad('js/jsUpload/vendor/jquery.ui.widget.js'). 
     929          self::jsLoad('js/jsUpload/tmpl.js'). 
     930          self::jsLoad('js/jsUpload/template-upload.js'). 
     931          self::jsLoad('js/jsUpload/template-download.js'). 
     932          self::jsLoad('js/jsUpload/load-image.js'). 
     933          self::jsLoad('js/jsUpload/jquery.iframe-transport.js'). 
     934          self::jsLoad('js/jsUpload/jquery.fileupload.js'). 
     935          self::jsLoad('js/jsUpload/jquery.fileupload-process.js'). 
     936          self::jsLoad('js/jsUpload/jquery.fileupload-resize.js'). 
     937          self::jsLoad('js/jsUpload/jquery.fileupload-ui.js'); 
     938     } 
     939 
     940     public static function jsToolMan() 
     941     { 
    794942     return 
    795943     '<script type="text/javascript" src="js/tool-man/core.js"></script>'. 
     
    800948     '<script type="text/javascript" src="js/tool-man/dragsort.js"></script>'. 
    801949     '<script type="text/javascript" src="js/dragsort-tablerows.js"></script>'; 
    802 } 
    803  
    804 public static function jsMetaEditor() 
    805 { 
     950     } 
     951 
     952     public static function jsMetaEditor() 
     953     { 
    806954     return 
    807955     '<script type="text/javascript" src="js/meta-editor.js"></script>'; 
     956     } 
    808957} 
    809 } 
    810 ?> 
  • inc/admin/lib.dc.page.php

    r2306 r2313  
    9999 
    100100          self::jsLoadIE7(). 
    101           '  <link rel="stylesheet" href="style/default.css" type="text/css" media="screen" />'."\n"; 
     101          '    <link rel="stylesheet" href="style/default.css" type="text/css" media="screen" />'."\n"; 
    102102          if (l10n::getTextDirection($GLOBALS['_lang']) == 'rtl') { 
    103103               echo 
    104                '  <link rel="stylesheet" href="style/default-rtl.css" type="text/css" media="screen" />'."\n"; 
     104               '    <link rel="stylesheet" href="style/default-rtl.css" type="text/css" media="screen" />'."\n"; 
    105105          } 
    106106 
     
    112112               '<link rel="shortcut icon" href="images/favicon.ico" type="image/x-icon" />'; 
    113113          } 
     114 
    114115          echo 
    115116          self::jsCommon(). 
     
    307308 
    308309          self::jsLoadIE7(). 
    309           '    <link rel="stylesheet" href="style/default.css" type="text/css" media="screen" />'."\n"; 
     310          '    <link rel="stylesheet" href="style/default.css" type="text/css" media="screen" />'."\n"; 
    310311          if (l10n::getTextDirection($GLOBALS['_lang']) == 'rtl') { 
    311312               echo 
    312                '    <link rel="stylesheet" href="style/default-rtl.css" type="text/css" media="screen" />'."\n"; 
     313               '    <link rel="stylesheet" href="style/default-rtl.css" type="text/css" media="screen" />'."\n"; 
    313314          } 
    314315 
     
    571572          "//<![CDATA[\n". 
    572573          self::jsVar('dotclear.nonce',$GLOBALS['core']->getNonce()). 
     574 
    573575          self::jsVar('dotclear.img_plus_src','images/expand.png'). 
    574576          self::jsVar('dotclear.img_plus_alt',__('uncover')). 
     
    577579          self::jsVar('dotclear.img_menu_on','images/menu_on.png'). 
    578580          self::jsVar('dotclear.img_menu_off','images/menu_off.png'). 
    579            
     581 
    580582          self::jsVar('dotclear.img_plus_theme_src','images/plus-theme.png'). 
    581583          self::jsVar('dotclear.img_plus_theme_alt',__('uncover')). 
     
    682684          self::jsVar('dotclear.msg.module_tags', 
    683685               __('Tags:')). 
    684                "\n//]]>\n". 
     686          "\n//]]>\n". 
    685687          "</script>\n"; 
    686688     } 
     
    722724               $default = "'".html::escapeJS($default)."'"; 
    723725          } 
    724            
     726 
    725727          return 
    726728          self::jsLoad('js/jquery/jquery.pageTabs.js'). 
     
    744746     public static function jsModal() 
    745747     { 
    746           return 
    747           '<link rel="stylesheet" type="text/css" href="style/modal/modal.css" />'."\n". 
    748           self::jsLoad('js/jquery/jquery.modal.js'). 
    749           '<script type="text/javascript">'."\n". 
    750           "//<![CDATA[\n". 
    751           self::jsVar('$.modal.prototype.params.loader_img','style/modal/loader.gif'). 
    752           self::jsVar('$.modal.prototype.params.close_img','style/modal/close.png'). 
    753           "\n//]]>\n". 
    754           "</script>\n"; 
     748     return 
     749     '<link rel="stylesheet" type="text/css" href="style/modal/modal.css" />'."\n". 
     750     self::jsLoad('js/jquery/jquery.modal.js'). 
     751     '<script type="text/javascript">'."\n". 
     752     "//<![CDATA[\n". 
     753     self::jsVar('$.modal.prototype.params.loader_img','style/modal/loader.gif'). 
     754     self::jsVar('$.modal.prototype.params.close_img','style/modal/close.png'). 
     755     "\n//]]>\n". 
     756     "</script>\n"; 
    755757     } 
    756758 
    757759     public static function jsColorPicker() 
    758760     { 
    759           return 
    760           '<link rel="stylesheet" type="text/css" href="style/farbtastic/farbtastic.css" />'."\n". 
    761           self::jsLoad('js/jquery/jquery.farbtastic.js'). 
    762           self::jsLoad('js/color-picker.js'); 
     761     return 
     762     '<link rel="stylesheet" type="text/css" href="style/farbtastic/farbtastic.css" />'."\n". 
     763     self::jsLoad('js/jquery/jquery.farbtastic.js'). 
     764     self::jsLoad('js/color-picker.js'); 
    763765     } 
    764766 
    765767     public static function jsDatePicker() 
    766768     { 
    767           return 
    768           '<link rel="stylesheet" type="text/css" href="style/date-picker.css" />'."\n". 
    769           self::jsLoad('js/date-picker.js'). 
    770           '<script type="text/javascript">'."\n". 
    771           "//<![CDATA[\n". 
    772  
    773           "datePicker.prototype.months[0] = '".html::escapeJS(__('January'))."'; ". 
    774           "datePicker.prototype.months[1] = '".html::escapeJS(__('February'))."'; ". 
    775           "datePicker.prototype.months[2] = '".html::escapeJS(__('March'))."'; ". 
    776           "datePicker.prototype.months[3] = '".html::escapeJS(__('April'))."'; ". 
    777           "datePicker.prototype.months[4] = '".html::escapeJS(__('May'))."'; ". 
    778           "datePicker.prototype.months[5] = '".html::escapeJS(__('June'))."'; ". 
    779           "datePicker.prototype.months[6] = '".html::escapeJS(__('July'))."'; ". 
    780           "datePicker.prototype.months[7] = '".html::escapeJS(__('August'))."'; ". 
    781           "datePicker.prototype.months[8] = '".html::escapeJS(__('September'))."'; ". 
    782           "datePicker.prototype.months[9] = '".html::escapeJS(__('October'))."'; ". 
    783           "datePicker.prototype.months[10] = '".html::escapeJS(__('November'))."'; ". 
    784           "datePicker.prototype.months[11] = '".html::escapeJS(__('December'))."'; ". 
    785  
    786           "datePicker.prototype.days[0] = '".html::escapeJS(__('Monday'))."'; ". 
    787           "datePicker.prototype.days[1] = '".html::escapeJS(__('Tuesday'))."'; ". 
    788           "datePicker.prototype.days[2] = '".html::escapeJS(__('Wednesday'))."'; ". 
    789           "datePicker.prototype.days[3] = '".html::escapeJS(__('Thursday'))."'; ". 
    790           "datePicker.prototype.days[4] = '".html::escapeJS(__('Friday'))."'; ". 
    791           "datePicker.prototype.days[5] = '".html::escapeJS(__('Saturday'))."'; ". 
    792           "datePicker.prototype.days[6] = '".html::escapeJS(__('Sunday'))."'; ". 
    793  
    794           "datePicker.prototype.img_src = 'images/date-picker.png'; ". 
    795  
    796           "datePicker.prototype.close_msg = '".html::escapeJS(__('close'))."'; ". 
    797           "datePicker.prototype.now_msg = '".html::escapeJS(__('now'))."'; ". 
    798  
    799           "\n//]]>\n". 
    800           "</script>\n"; 
     769     return 
     770     '<link rel="stylesheet" type="text/css" href="style/date-picker.css" />'."\n". 
     771     self::jsLoad('js/date-picker.js'). 
     772     '<script type="text/javascript">'."\n". 
     773     "//<![CDATA[\n". 
     774 
     775     "datePicker.prototype.months[0] = '".html::escapeJS(__('January'))."'; ". 
     776     "datePicker.prototype.months[1] = '".html::escapeJS(__('February'))."'; ". 
     777     "datePicker.prototype.months[2] = '".html::escapeJS(__('March'))."'; ". 
     778     "datePicker.prototype.months[3] = '".html::escapeJS(__('April'))."'; ". 
     779     "datePicker.prototype.months[4] = '".html::escapeJS(__('May'))."'; ". 
     780     "datePicker.prototype.months[5] = '".html::escapeJS(__('June'))."'; ". 
     781     "datePicker.prototype.months[6] = '".html::escapeJS(__('July'))."'; ". 
     782     "datePicker.prototype.months[7] = '".html::escapeJS(__('August'))."'; ". 
     783     "datePicker.prototype.months[8] = '".html::escapeJS(__('September'))."'; ". 
     784     "datePicker.prototype.months[9] = '".html::escapeJS(__('October'))."'; ". 
     785     "datePicker.prototype.months[10] = '".html::escapeJS(__('November'))."'; ". 
     786     "datePicker.prototype.months[11] = '".html::escapeJS(__('December'))."'; ". 
     787 
     788     "datePicker.prototype.days[0] = '".html::escapeJS(__('Monday'))."'; ". 
     789     "datePicker.prototype.days[1] = '".html::escapeJS(__('Tuesday'))."'; ". 
     790     "datePicker.prototype.days[2] = '".html::escapeJS(__('Wednesday'))."'; ". 
     791     "datePicker.prototype.days[3] = '".html::escapeJS(__('Thursday'))."'; ". 
     792     "datePicker.prototype.days[4] = '".html::escapeJS(__('Friday'))."'; ". 
     793     "datePicker.prototype.days[5] = '".html::escapeJS(__('Saturday'))."'; ". 
     794     "datePicker.prototype.days[6] = '".html::escapeJS(__('Sunday'))."'; ". 
     795 
     796     "datePicker.prototype.img_src = 'images/date-picker.png'; ". 
     797 
     798     "datePicker.prototype.close_msg = '".html::escapeJS(__('close'))."'; ". 
     799     "datePicker.prototype.now_msg = '".html::escapeJS(__('now'))."'; ". 
     800 
     801     "\n//]]>\n". 
     802     "</script>\n"; 
    801803     } 
    802804 
    803805     public static function jsToolBar() 
    804806     { 
    805           $res = 
    806           '<link rel="stylesheet" type="text/css" href="style/jsToolBar/jsToolBar.css" />'. 
    807           '<script type="text/javascript" src="js/jsToolBar/jsToolBar.js"></script>'; 
    808  
    809           if (isset($GLOBALS['core']->auth) && $GLOBALS['core']->auth->getOption('enable_wysiwyg')) { 
    810                $res .= '<script type="text/javascript" src="js/jsToolBar/jsToolBar.wysiwyg.js"></script>'; 
    811           } 
    812  
    813           $res .= 
    814           '<script type="text/javascript" src="js/jsToolBar/jsToolBar.dotclear.js"></script>'. 
    815           '<script type="text/javascript">'."\n". 
    816           "//<![CDATA[\n". 
    817           "jsToolBar.prototype.dialog_url = 'popup.php'; ". 
    818           "jsToolBar.prototype.iframe_css = '". 
    819           'body{'. 
    820           'font: 12px "DejaVu Sans","Lucida Grande","Lucida Sans Unicode",Arial,sans-serif;'. 
    821           'color : #000;'. 
    822           'background: #f9f9f9;'. 
    823           'margin: 0;'. 
    824           'padding : 2px;'. 
    825           'border: none;'. 
    826           (l10n::getTextDirection($GLOBALS['_lang']) == 'rtl' ? 'direction:rtl;' : ''). 
    827           '}'. 
    828           'pre, code, kbd, samp {'. 
    829           'font-family:"Courier New",Courier,monospace;'. 
    830           'font-size : 1.1em;'. 
    831           '}'. 
    832           'code {'. 
    833           'color : #666;'. 
    834           'font-weight : bold;'. 
    835           '}'. 
    836           'body > p:first-child {'. 
    837           'margin-top: 0;'. 
    838           '}'. 
    839           "'; ". 
    840           "jsToolBar.prototype.base_url = '".html::escapeJS($GLOBALS['core']->blog->host)."'; ". 
    841           "jsToolBar.prototype.switcher_visual_title = '".html::escapeJS(__('visual'))."'; ". 
    842           "jsToolBar.prototype.switcher_source_title = '".html::escapeJS(__('source'))."'; ". 
    843           "jsToolBar.prototype.legend_msg = '". 
    844           html::escapeJS(__('You can use the following shortcuts to format your text.'))."'; ". 
    845           "jsToolBar.prototype.elements.blocks.options.none = '".html::escapeJS(__('-- none --'))."'; ". 
    846           "jsToolBar.prototype.elements.blocks.options.nonebis = '".html::escapeJS(__('-- block format --'))."'; ". 
    847           "jsToolBar.prototype.elements.blocks.options.p = '".html::escapeJS(__('Paragraph'))."'; ". 
    848           "jsToolBar.prototype.elements.blocks.options.h1 = '".html::escapeJS(__('Level 1 header'))."'; ". 
    849           "jsToolBar.prototype.elements.blocks.options.h2 = '".html::escapeJS(__('Level 2 header'))."'; ". 
    850           "jsToolBar.prototype.elements.blocks.options.h3 = '".html::escapeJS(__('Level 3 header'))."'; ". 
    851           "jsToolBar.prototype.elements.blocks.options.h4 = '".html::escapeJS(__('Level 4 header'))."'; ". 
    852           "jsToolBar.prototype.elements.blocks.options.h5 = '".html::escapeJS(__('Level 5 header'))."'; ". 
    853           "jsToolBar.prototype.elements.blocks.options.h6 = '".html::escapeJS(__('Level 6 header'))."'; ". 
    854           "jsToolBar.prototype.elements.strong.title = '".html::escapeJS(__('Strong emphasis'))."'; ". 
    855           "jsToolBar.prototype.elements.em.title = '".html::escapeJS(__('Emphasis'))."'; ". 
    856           "jsToolBar.prototype.elements.ins.title = '".html::escapeJS(__('Inserted'))."'; ". 
    857           "jsToolBar.prototype.elements.del.title = '".html::escapeJS(__('Deleted'))."'; ". 
    858           "jsToolBar.prototype.elements.quote.title = '".html::escapeJS(__('Inline quote'))."'; ". 
    859           "jsToolBar.prototype.elements.code.title = '".html::escapeJS(__('Code'))."'; ". 
    860           "jsToolBar.prototype.elements.br.title = '".html::escapeJS(__('Line break'))."'; ". 
    861           "jsToolBar.prototype.elements.blockquote.title = '".html::escapeJS(__('Blockquote'))."'; ". 
    862           "jsToolBar.prototype.elements.pre.title = '".html::escapeJS(__('Preformated text'))."'; ". 
    863           "jsToolBar.prototype.elements.ul.title = '".html::escapeJS(__('Unordered list'))."'; ". 
    864           "jsToolBar.prototype.elements.ol.title = '".html::escapeJS(__('Ordered list'))."'; ". 
    865  
    866           "jsToolBar.prototype.elements.link.title = '".html::escapeJS(__('Link'))."'; ". 
    867           "jsToolBar.prototype.elements.link.href_prompt = '".html::escapeJS(__('URL?'))."'; ". 
    868           "jsToolBar.prototype.elements.link.hreflang_prompt = '".html::escapeJS(__('Language?'))."'; ". 
    869  
    870           "jsToolBar.prototype.elements.img.title = '".html::escapeJS(__('External image'))."'; ". 
    871           "jsToolBar.prototype.elements.img.src_prompt = '".html::escapeJS(__('URL?'))."'; ". 
    872  
    873           "jsToolBar.prototype.elements.img_select.title = '".html::escapeJS(__('Media chooser'))."'; ". 
    874           "jsToolBar.prototype.elements.post_link.title = '".html::escapeJS(__('Link to an entry'))."'; "; 
    875  
    876           if (!$GLOBALS['core']->auth->check('media,media_admin',$GLOBALS['core']->blog->id)) { 
    877                $res .= "jsToolBar.prototype.elements.img_select.disabled = true;\n"; 
    878           } 
    879  
    880           $res .= 
    881           "\n//]]>\n". 
    882           "</script>\n"; 
    883  
    884           return $res; 
     807     $res = 
     808     '<link rel="stylesheet" type="text/css" href="style/jsToolBar/jsToolBar.css" />'. 
     809     '<script type="text/javascript" src="js/jsToolBar/jsToolBar.js"></script>'; 
     810 
     811     if (isset($GLOBALS['core']->auth) && $GLOBALS['core']->auth->getOption('enable_wysiwyg')) { 
     812          $res .= '<script type="text/javascript" src="js/jsToolBar/jsToolBar.wysiwyg.js"></script>'; 
     813     } 
     814 
     815     $res .= 
     816     '<script type="text/javascript" src="js/jsToolBar/jsToolBar.dotclear.js"></script>'. 
     817     '<script type="text/javascript">'."\n". 
     818     "//<![CDATA[\n". 
     819     "jsToolBar.prototype.dialog_url = 'popup.php'; ". 
     820     "jsToolBar.prototype.iframe_css = '". 
     821     'body{'. 
     822     'font: 12px "DejaVu Sans","Lucida Grande","Lucida Sans Unicode",Arial,sans-serif;'. 
     823     'color : #000;'. 
     824     'background: #f9f9f9;'. 
     825     'margin: 0;'. 
     826     'padding : 2px;'. 
     827     'border: none;'. 
     828     (l10n::getTextDirection($GLOBALS['_lang']) == 'rtl' ? 'direction:rtl;' : ''). 
     829     '}'. 
     830     'pre, code, kbd, samp {'. 
     831     'font-family:"Courier New",Courier,monospace;'. 
     832     'font-size : 1.1em;'. 
     833     '}'. 
     834     'code {'. 
     835     'color : #666;'. 
     836     'font-weight : bold;'. 
     837     '}'. 
     838     'body > p:first-child {'. 
     839     'margin-top: 0;'. 
     840     '}'. 
     841     "'; ". 
     842     "jsToolBar.prototype.base_url = '".html::escapeJS($GLOBALS['core']->blog->host)."'; ". 
     843     "jsToolBar.prototype.switcher_visual_title = '".html::escapeJS(__('visual'))."'; ". 
     844     "jsToolBar.prototype.switcher_source_title = '".html::escapeJS(__('source'))."'; ". 
     845     "jsToolBar.prototype.legend_msg = '". 
     846     html::escapeJS(__('You can use the following shortcuts to format your text.'))."'; ". 
     847     "jsToolBar.prototype.elements.blocks.options.none = '".html::escapeJS(__('-- none --'))."'; ". 
     848     "jsToolBar.prototype.elements.blocks.options.nonebis = '".html::escapeJS(__('-- block format --'))."'; ". 
     849     "jsToolBar.prototype.elements.blocks.options.p = '".html::escapeJS(__('Paragraph'))."'; ". 
     850     "jsToolBar.prototype.elements.blocks.options.h1 = '".html::escapeJS(__('Level 1 header'))."'; ". 
     851     "jsToolBar.prototype.elements.blocks.options.h2 = '".html::escapeJS(__('Level 2 header'))."'; ". 
     852     "jsToolBar.prototype.elements.blocks.options.h3 = '".html::escapeJS(__('Level 3 header'))."'; ". 
     853     "jsToolBar.prototype.elements.blocks.options.h4 = '".html::escapeJS(__('Level 4 header'))."'; ". 
     854     "jsToolBar.prototype.elements.blocks.options.h5 = '".html::escapeJS(__('Level 5 header'))."'; ". 
     855     "jsToolBar.prototype.elements.blocks.options.h6 = '".html::escapeJS(__('Level 6 header'))."'; ". 
     856     "jsToolBar.prototype.elements.strong.title = '".html::escapeJS(__('Strong emphasis'))."'; ". 
     857     "jsToolBar.prototype.elements.em.title = '".html::escapeJS(__('Emphasis'))."'; ". 
     858     "jsToolBar.prototype.elements.ins.title = '".html::escapeJS(__('Inserted'))."'; ". 
     859     "jsToolBar.prototype.elements.del.title = '".html::escapeJS(__('Deleted'))."'; ". 
     860     "jsToolBar.prototype.elements.quote.title = '".html::escapeJS(__('Inline quote'))."'; ". 
     861     "jsToolBar.prototype.elements.code.title = '".html::escapeJS(__('Code'))."'; ". 
     862     "jsToolBar.prototype.elements.br.title = '".html::escapeJS(__('Line break'))."'; ". 
     863     "jsToolBar.prototype.elements.blockquote.title = '".html::escapeJS(__('Blockquote'))."'; ". 
     864     "jsToolBar.prototype.elements.pre.title = '".html::escapeJS(__('Preformated text'))."'; ". 
     865     "jsToolBar.prototype.elements.ul.title = '".html::escapeJS(__('Unordered list'))."'; ". 
     866     "jsToolBar.prototype.elements.ol.title = '".html::escapeJS(__('Ordered list'))."'; ". 
     867 
     868     "jsToolBar.prototype.elements.link.title = '".html::escapeJS(__('Link'))."'; ". 
     869     "jsToolBar.prototype.elements.link.href_prompt = '".html::escapeJS(__('URL?'))."'; ". 
     870     "jsToolBar.prototype.elements.link.hreflang_prompt = '".html::escapeJS(__('Language?'))."'; ". 
     871 
     872     "jsToolBar.prototype.elements.img.title = '".html::escapeJS(__('External image'))."'; ". 
     873     "jsToolBar.prototype.elements.img.src_prompt = '".html::escapeJS(__('URL?'))."'; ". 
     874 
     875     "jsToolBar.prototype.elements.img_select.title = '".html::escapeJS(__('Media chooser'))."'; ". 
     876     "jsToolBar.prototype.elements.post_link.title = '".html::escapeJS(__('Link to an entry'))."'; "; 
     877 
     878     if (!$GLOBALS['core']->auth->check('media,media_admin',$GLOBALS['core']->blog->id)) { 
     879          $res .= "jsToolBar.prototype.elements.img_select.disabled = true;\n"; 
     880     } 
     881 
     882     $res .= 
     883     "\n//]]>\n". 
     884     "</script>\n"; 
     885 
     886     return $res; 
    885887     } 
    886888 
    887889     public static function jsUpload($params=array(),$base_url=null) 
    888890     { 
    889           if (!$base_url) { 
    890                $base_url = path::clean(dirname(preg_replace('/(\?.*$)?/','',$_SERVER['REQUEST_URI']))).'/'; 
    891           } 
    892  
    893           $params = array_merge($params,array( 
    894                'sess_id='.session_id(), 
    895                'sess_uid='.$_SESSION['sess_browser_uid'], 
    896                'xd_check='.$GLOBALS['core']->getNonce() 
     891     if (!$base_url) { 
     892          $base_url = path::clean(dirname(preg_replace('/(\?.*$)?/','',$_SERVER['REQUEST_URI']))).'/'; 
     893     } 
     894 
     895     $params = array_merge($params,array( 
     896          'sess_id='.session_id(), 
     897          'sess_uid='.$_SESSION['sess_browser_uid'], 
     898          'xd_check='.$GLOBALS['core']->getNonce() 
    897899          )); 
    898900 
    899           return 
    900           '<script type="text/javascript">'."\n". 
    901           "//<![CDATA[\n". 
    902           "dotclear.jsUpload = {};\n". 
    903           "dotclear.jsUpload.msg = {};\n". 
    904           self::jsVar('dotclear.msg.enhanced_uploader_activate',__('Temporarily activate enhanced uploader')). 
    905           self::jsVar('dotclear.msg.enhanced_uploader_disable',__('Temporarily disable enhanced uploader')). 
    906           self::jsVar('dotclear.jsUpload.msg.limit_exceeded',__('Limit exceeded.')). 
    907           self::jsVar('dotclear.jsUpload.msg.size_limit_exceeded',__('File size exceeds allowed limit.')). 
    908           self::jsVar('dotclear.jsUpload.msg.canceled',__('Canceled.')). 
    909           self::jsVar('dotclear.jsUpload.msg.http_error',__('HTTP Error:')). 
    910           self::jsVar('dotclear.jsUpload.msg.error',__('Error:')). 
    911           self::jsVar('dotclear.jsUpload.msg.choose_file',__('Choose file')). 
    912           self::jsVar('dotclear.jsUpload.msg.choose_files',__('Choose files')). 
    913           self::jsVar('dotclear.jsUpload.msg.cancel',__('Cancel')). 
    914           self::jsVar('dotclear.jsUpload.msg.clean',__('Clean')). 
    915           self::jsVar('dotclear.jsUpload.msg.upload',__('Upload')). 
     901     return 
     902     '<script type="text/javascript">'."\n". 
     903     "//<![CDATA[\n". 
     904     "dotclear.jsUpload = {};\n". 
     905     "dotclear.jsUpload.msg = {};\n". 
     906     self::jsVar('dotclear.msg.enhanced_uploader_activate',__('Temporarily activate enhanced uploader')). 
     907     self::jsVar('dotclear.msg.enhanced_uploader_disable',__('Temporarily disable enhanced uploader')). 
     908     self::jsVar('dotclear.jsUpload.msg.limit_exceeded',__('Limit exceeded.')). 
     909     self::jsVar('dotclear.jsUpload.msg.size_limit_exceeded',__('File size exceeds allowed limit.')). 
     910     self::jsVar('dotclear.jsUpload.msg.canceled',__('Canceled.')). 
     911     self::jsVar('dotclear.jsUpload.msg.http_error',__('HTTP Error:')). 
     912     self::jsVar('dotclear.jsUpload.msg.error',__('Error:')). 
     913     self::jsVar('dotclear.jsUpload.msg.choose_file',__('Choose file')). 
     914     self::jsVar('dotclear.jsUpload.msg.choose_files',__('Choose files')). 
     915     self::jsVar('dotclear.jsUpload.msg.cancel',__('Cancel')). 
     916     self::jsVar('dotclear.jsUpload.msg.clean',__('Clean')). 
     917     self::jsVar('dotclear.jsUpload.msg.upload',__('Upload')). 
    916918          self::jsVar('dotclear.jsUpload.msg.send',__('Send')). 
    917919          self::jsVar('dotclear.jsUpload.msg.file_successfully_uploaded',__('File successfully uploaded.')). 
    918           self::jsVar('dotclear.jsUpload.msg.no_file_in_queue',__('No file in queue.')). 
    919           self::jsVar('dotclear.jsUpload.msg.file_in_queue',__('1 file in queue.')). 
    920           self::jsVar('dotclear.jsUpload.msg.files_in_queue',__('%d files in queue.')). 
    921           self::jsVar('dotclear.jsUpload.msg.queue_error',__('Queue error:')). 
    922           self::jsVar('dotclear.jsUpload.base_url',$base_url). 
    923           "\n//]]>\n". 
     920     self::jsVar('dotclear.jsUpload.msg.no_file_in_queue',__('No file in queue.')). 
     921     self::jsVar('dotclear.jsUpload.msg.file_in_queue',__('1 file in queue.')). 
     922     self::jsVar('dotclear.jsUpload.msg.files_in_queue',__('%d files in queue.')). 
     923     self::jsVar('dotclear.jsUpload.msg.queue_error',__('Queue error:')). 
     924     self::jsVar('dotclear.jsUpload.base_url',$base_url). 
     925     "\n//]]>\n". 
    924926          "</script>\n". 
    925927 
     
    938940     public static function jsToolMan() 
    939941     { 
    940           return 
    941           '<script type="text/javascript" src="js/tool-man/core.js"></script>'. 
    942           '<script type="text/javascript" src="js/tool-man/events.js"></script>'. 
    943           '<script type="text/javascript" src="js/tool-man/css.js"></script>'. 
    944           '<script type="text/javascript" src="js/tool-man/coordinates.js"></script>'. 
    945           '<script type="text/javascript" src="js/tool-man/drag.js"></script>'. 
    946           '<script type="text/javascript" src="js/tool-man/dragsort.js"></script>'. 
    947           '<script type="text/javascript" src="js/dragsort-tablerows.js"></script>'; 
     942     return 
     943     '<script type="text/javascript" src="js/tool-man/core.js"></script>'. 
     944     '<script type="text/javascript" src="js/tool-man/events.js"></script>'. 
     945     '<script type="text/javascript" src="js/tool-man/css.js"></script>'. 
     946     '<script type="text/javascript" src="js/tool-man/coordinates.js"></script>'. 
     947     '<script type="text/javascript" src="js/tool-man/drag.js"></script>'. 
     948     '<script type="text/javascript" src="js/tool-man/dragsort.js"></script>'. 
     949     '<script type="text/javascript" src="js/dragsort-tablerows.js"></script>'; 
    948950     } 
    949951 
    950952     public static function jsMetaEditor() 
    951953     { 
    952           return 
    953           '<script type="text/javascript" src="js/meta-editor.js"></script>'; 
     954     return 
     955     '<script type="text/javascript" src="js/meta-editor.js"></script>'; 
    954956     } 
    955957} 
  • inc/admin/prepend.php

    r1490 r2313  
    2222header("Pragma: no-cache"); 
    2323 
    24 function dc_valid_fav($url) { 
    25      global $core; 
    26  
    27      if (preg_match('#plugin\.php\?p=([^&]+)#',$url,$matches)) { 
    28           if (isset($matches[1])) { 
    29                if (!$core->plugins->moduleExists($matches[1])) { 
    30                     return false; 
    31                } 
    32           } 
    33      } 
    34      return true; 
    35 } 
    36  
    37 function dc_prepare_url($url) { 
    38  
    39      $u = str_replace(array('?','&amp;','/'),array('\?','&','\\/'),$url); 
    40      return (!strpos($u,'\?') ?  
    41           '/'.$u.'$/' : 
    42           (!strpos($u,'&') ?  
    43           '/'.$u.'(\?.*)?$/' : 
    44           '/'.$u.'(&.*)?$/')); 
    45 } 
    46  
    4724function dc_load_locales() { 
    4825     global $_lang, $core; 
     
    5128     $_lang = preg_match('/^[a-z]{2}(-[a-z]{2})?$/',$_lang) ? $_lang : 'en'; 
    5229      
     30     l10n::lang($_lang); 
    5331     if (l10n::set(dirname(__FILE__).'/../../locales/'.$_lang.'/date') === false && $_lang != 'en') { 
    5432          l10n::set(dirname(__FILE__).'/../../locales/en/date'); 
     
    216194     } 
    217195     unset($hfiles,$locales_root); 
     196     // Contextual help flag 
     197     $GLOBALS['__resources']['ctxhelp'] = false; 
    218198 
    219199     $core->auth->user_prefs->addWorkspace('interface'); 
    220200     $user_ui_nofavmenu = $core->auth->user_prefs->interface->nofavmenu; 
    221201 
    222      # Standard favorites 
    223      $_fav = new ArrayObject(); 
     202     $core->favs = new dcFavorites($core); 
     203 
    224204 
    225205     # [] : Title, URL, small icon, large icon, permissions, id, class 
    226206     # NB : '*' in permissions means any, null means super admin only 
    227207      
    228      $_fav['prefs'] = new ArrayObject(array('prefs','My preferences','preferences.php', 
    229           'images/menu/user-pref.png','images/menu/user-pref-b.png', 
    230           '*',null,null)); 
    231  
    232      $_fav['new_post'] = new ArrayObject(array('new_post','New entry','post.php', 
    233           'images/menu/edit.png','images/menu/edit-b.png', 
    234           'usage,contentadmin',null,'menu-new-post')); 
    235      $_fav['posts'] = new ArrayObject(array('posts','Entries','posts.php', 
    236           'images/menu/entries.png','images/menu/entries-b.png', 
    237           'usage,contentadmin',null,null)); 
    238      $_fav['comments'] = new ArrayObject(array('comments','Comments','comments.php', 
    239           'images/menu/comments.png','images/menu/comments-b.png', 
    240           'usage,contentadmin',null,null)); 
    241      $_fav['search'] = new ArrayObject(array('search','Search','search.php', 
    242           'images/menu/search.png','images/menu/search-b.png', 
    243           'usage,contentadmin',null,null)); 
    244      $_fav['categories'] = new ArrayObject(array('categories','Categories','categories.php', 
    245           'images/menu/categories.png','images/menu/categories-b.png', 
    246           'categories',null,null)); 
    247      $_fav['media'] = new ArrayObject(array('media','Media manager','media.php', 
    248           'images/menu/media.png','images/menu/media-b.png', 
    249           'media,media_admin',null,null)); 
    250      $_fav['blog_pref'] = new ArrayObject(array('blog_pref','Blog settings','blog_pref.php', 
    251           'images/menu/blog-pref.png','images/menu/blog-pref-b.png', 
    252           'admin',null,null)); 
    253      $_fav['blog_theme'] = new ArrayObject(array('blog_theme','Blog appearance','blog_theme.php', 
    254           'images/menu/themes.png','images/menu/blog-theme-b.png', 
    255           'admin',null,null)); 
    256  
    257      $_fav['blogs'] = new ArrayObject(array('blogs','Blogs','blogs.php', 
    258           'images/menu/blogs.png','images/menu/blogs-b.png', 
    259           'usage,contentadmin',null,null)); 
    260      $_fav['users'] = new ArrayObject(array('users','Users','users.php', 
    261           'images/menu/users.png','images/menu/users-b.png', 
    262           null,null,null)); 
    263      $_fav['plugins'] = new ArrayObject(array('plugins','Plugins','plugins.php', 
    264           'images/menu/plugins.png','images/menu/plugins-b.png', 
    265           null,null,null)); 
    266      $_fav['langs'] = new ArrayObject(array('langs','Languages','langs.php', 
    267           'images/menu/langs.png','images/menu/langs-b.png', 
    268           null,null,null)); 
    269208      
    270209     # Menus creation 
     210     $_menu = new ArrayObject(); 
    271211     $_menu['Dashboard'] = new dcMenu('dashboard-menu',null); 
    272      if (!$user_ui_nofavmenu) 
    273           $_menu['Favorites'] = new dcMenu('favorites-menu','My favorites'); 
     212     if (!$user_ui_nofavmenu) { 
     213          $core->favs->appendMenuTitle($_menu); 
     214     } 
    274215     $_menu['Blog'] = new dcMenu('blog-menu','Blog'); 
    275216     $_menu['System'] = new dcMenu('system-menu','System'); 
    276217     $_menu['Plugins'] = new dcMenu('plugins-menu','Plugins'); 
    277       
    278218     # Loading plugins 
    279219     $core->plugins->loadModules(DC_PLUGINS_ROOT,'admin',$_lang); 
    280  
    281      # Loading favorites info from plugins 
    282      $core->callBehavior('adminDashboardFavs', $core, $_fav); 
     220     $core->favs->setup(); 
     221 
     222     if (!$user_ui_nofavmenu) { 
     223          $core->favs->appendMenu($_menu); 
     224     } 
     225 
    283226      
    284227     # Set menu titles 
     
    286229     $_menu['System']->title = __('System settings'); 
    287230     $_menu['Blog']->title = __('Blog'); 
    288      $_menu['Plugins']->title = __('Additional plugins'); 
    289      if (!$user_ui_nofavmenu) 
    290           $_menu['Favorites']->title = __('My favorites'); 
    291  
    292 /*    
    293      if (!preg_match('/index.php$/',$_SERVER['REQUEST_URI'])) { 
    294           # Admin index can't be add in fav's 
    295           $_menu['Dashboard']->prependItem(__('Add this page to my favorites'),'#','images/menu/add_to_favorites.png', 
    296                false,$core->auth->check('usage,contentadmin',$core->blog->id),'fav-add'); 
    297      } 
    298 */ 
     231     $_menu['Plugins']->title = __('Plugins'); 
     232 
     233 
    299234     $_menu['Blog']->prependItem(__('Blog appearance'),'blog_theme.php','images/menu/themes.png', 
    300235          preg_match('/blog_theme.php(\?.*)?$/',$_SERVER['REQUEST_URI']), 
     
    320255     $_menu['Blog']->prependItem(__('New entry'),'post.php','images/menu/edit.png', 
    321256          preg_match('/post.php$/',$_SERVER['REQUEST_URI']), 
    322           $core->auth->check('usage,contentadmin',$core->blog->id),'menu-new-post'); 
    323       
    324      $_menu['System']->prependItem(__('Updates'),'update.php','images/menu/update.png', 
     257          $core->auth->check('usage,contentadmin',$core->blog->id)); 
     258      
     259     $_menu['System']->prependItem(__('Update'),'update.php','images/menu/update.png', 
    325260          preg_match('/update.php(\?.*)?$/',$_SERVER['REQUEST_URI']), 
    326261          $core->auth->isSuperAdmin() && is_readable(DC_DIGESTS)); 
     
    328263          preg_match('/langs.php(\?.*)?$/',$_SERVER['REQUEST_URI']), 
    329264          $core->auth->isSuperAdmin()); 
    330      $_menu['System']->prependItem(__('Plugins'),'plugins.php','images/menu/plugins.png', 
     265     $_menu['System']->prependItem(__('Plugins management'),'plugins.php','images/menu/plugins.png', 
    331266          preg_match('/plugins.php(\?.*)?$/',$_SERVER['REQUEST_URI']), 
    332267          $core->auth->isSuperAdmin()); 
     
    337272          preg_match('/blogs.php$/',$_SERVER['REQUEST_URI']), 
    338273          $core->auth->isSuperAdmin() || 
    339           $core->auth->check('usage,contentadmin',$core->blog->id) && $core->auth->blog_count > 1); 
    340  
    341      if (!$user_ui_nofavmenu) { 
    342           // Set favorites menu 
    343           $ws = $core->auth->user_prefs->addWorkspace('favorites'); 
    344           $count = 0; 
    345           foreach ($ws->dumpPrefs() as $k => $v) { 
    346                // User favorites only 
    347                if (!$v['global']) { 
    348                     $fav = unserialize($v['value']); 
    349                     if (dc_valid_fav($fav['url'])) { 
    350                          $count++; 
    351                          $_menu['Favorites']->addItem(__($fav['title']),$fav['url'],$fav['small-icon'], 
    352                               preg_match(dc_prepare_url($fav['url']),$_SERVER['REQUEST_URI']), 
    353                               (($fav['permissions'] == '*') || $core->auth->check($fav['permissions'],$core->blog->id)),$fav['id'],$fav['class']); 
    354                     } 
    355                } 
    356           }     
    357           if (!$count) { 
    358                // Global favorites if any 
    359                foreach ($ws->dumpPrefs() as $k => $v) { 
    360                     $fav = unserialize($v['value']); 
    361                     if (dc_valid_fav($fav['url'])) { 
    362                          $count++; 
    363                          $_menu['Favorites']->addItem(__($fav['title']),$fav['url'],$fav['small-icon'], 
    364                               preg_match(dc_prepare_url($fav['url']),$_SERVER['REQUEST_URI']), 
    365                               (($fav['permissions'] == '*') || $core->auth->check($fav['permissions'],$core->blog->id)),$fav['id'],$fav['class']); 
    366                     } 
    367                } 
    368           } 
    369           if (!$count) { 
    370                // No user or global favorites, add "new entry" fav 
    371                $_menu['Favorites']->addItem(__('New entry'),'post.php','images/menu/edit.png', 
    372                     preg_match('/post.php$/',$_SERVER['REQUEST_URI']), 
    373                     $core->auth->check('usage,contentadmin',$core->blog->id),'menu-new-post',null); 
    374           } 
     274          $core->auth->check('usage,contentadmin',$core->blog->id) && $core->auth->getBlogCount() > 1); 
     275 
     276     if (empty($core->blog->settings->system->jquery_migrate_mute)) { 
     277          $core->blog->settings->system->put('jquery_migrate_mute', true, 'boolean', 'Mute warnings for jquery migrate plugin ?', false); 
    375278     } 
    376279} 
  • inc/admin/prepend.php

    r2277 r2313  
    44# This file is part of Dotclear 2. 
    55# 
    6 # Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear 
     6# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear 
    77# Licensed under the GPL version 2.0 license. 
    88# See LICENSE file or 
     
    219219     $core->plugins->loadModules(DC_PLUGINS_ROOT,'admin',$_lang); 
    220220     $core->favs->setup(); 
    221       
     221 
    222222     if (!$user_ui_nofavmenu) { 
    223223          $core->favs->appendMenu($_menu); 
     
    273273          $core->auth->isSuperAdmin() || 
    274274          $core->auth->check('usage,contentadmin',$core->blog->id) && $core->auth->getBlogCount() > 1); 
    275       
     275 
    276276     if (empty($core->blog->settings->system->jquery_migrate_mute)) { 
    277277          $core->blog->settings->system->put('jquery_migrate_mute', true, 'boolean', 'Mute warnings for jquery migrate plugin ?', false); 
    278278     } 
    279279} 
     280 
     281# Add admin default templates path 
     282$core->tpl->getLoader()->addPath(dirname(__FILE__).'/default-templates'); 
     283# Set admin context 
     284$_ctx = new dcAdminContext($core); 
     285$core->tpl->addExtension($_ctx); 
     286 
     287# --BEHAVIOR-- adminPrepend 
     288$core->callBehavior('adminPrepend',$core,$_ctx); 
    280289?> 
  • inc/core/class.dc.blog.php

    r1492 r2313  
    199199     /** 
    200200     Updates comments and trackbacks counters in post table. Should be called 
    201      every time comments or trackbacks are added, removed or changed there status. 
     201     every time comments or trackbacks are added, removed or changed their status. 
    202202      
    203203     @param    ids       <b>mixed</b>        Comment(s) ID(s) 
    204204     @param    del       <b>boolean</b>      If comment is delete, set this to true 
    205      */ 
    206      public function triggerComments($ids,$del=false) 
    207      { 
    208           $co_ids = dcUtils::cleanIds($ids); 
    209            
    210           # a) Retrieve posts affected by comments edition 
     205     @param    affected_posts      <b>mixed</b>        Posts(s) ID(s) 
     206     */ 
     207     public function triggerComments($ids, $del=false, $affected_posts=null) 
     208     { 
     209          $comments_ids = dcUtils::cleanIds($ids); 
     210           
     211          # Get posts affected by comments edition 
     212          if (empty($affected_posts)) { 
     213               $strReq =  
     214                    'SELECT post_id '. 
     215                    'FROM '.$this->prefix.'comment '. 
     216                    'WHERE comment_id'.$this->con->in($comments_ids). 
     217                    'GROUP BY post_id'; 
     218                
     219               $rs = $this->con->select($strReq); 
     220                
     221               $affected_posts = array(); 
     222               while ($rs->fetch()) { 
     223                    $affected_posts[] = (integer) $rs->post_id; 
     224               } 
     225          } 
     226           
     227          if (!is_array($affected_posts) || empty($affected_posts)) { 
     228               return; 
     229          } 
     230           
     231          # Count number of comments if exists for affected posts 
    211232          $strReq =  
    212                'SELECT post_id, comment_trackback '. 
    213                'FROM '.$this->prefix.'comment '. 
    214                'WHERE comment_id'.$this->con->in($co_ids). 
    215                'GROUP BY post_id,comment_trackback'; 
    216            
    217           $rs = $this->con->select($strReq); 
    218            
    219           $a_ids = $a_tbs = array(); 
    220           while ($rs->fetch()) { 
    221                $a_ids[] = (integer) $rs->post_id; 
    222                $a_tbs[] = (integer) $rs->comment_trackback; 
    223           } 
    224            
    225           # b) Count comments of each posts previously retrieved 
    226           # Note that this does not return posts without comment 
    227           $strReq =  
    228                'SELECT post_id, COUNT(post_id) AS nb_comment,comment_trackback '. 
     233               'SELECT post_id, COUNT(post_id) AS nb_comment, comment_trackback '. 
    229234               'FROM '.$this->prefix.'comment '. 
    230235               'WHERE comment_status = 1 '. 
    231                (count($a_ids) > 0 ? 'AND post_id'.$this->con->in($a_ids) : ' '); 
    232            
    233           if ($del) { 
    234                $strReq .=  
    235                     'AND comment_id NOT'.$this->con->in($co_ids); 
    236           } 
    237            
    238           $strReq .=  
     236               'AND post_id'.$this->con->in($affected_posts). 
    239237               'GROUP BY post_id,comment_trackback'; 
    240238           
    241239          $rs = $this->con->select($strReq); 
    242240           
    243           $b_ids = $b_tbs = $b_nbs = array(); 
     241          $posts = array(); 
    244242          while ($rs->fetch()) { 
    245                $b_ids[] = (integer) $rs->post_id; 
    246                $b_tbs[] = (integer) $rs->comment_trackback; 
    247                $b_nbs[] = (integer) $rs->nb_comment; 
    248           } 
    249            
    250           # c) Update comments numbers on posts 
    251           # This compare previous requests to update also posts without comment 
     243               if ($rs->comment_trackback) { 
     244                    $posts[$rs->post_id]['trackback'] = $rs->nb_comment; 
     245               } else { 
     246                    $posts[$rs->post_id]['comment'] = $rs->nb_comment; 
     247               } 
     248          } 
     249           
     250          # Update number of comments on affected posts 
    252251          $cur = $this->con->openCursor($this->prefix.'post'); 
    253            
    254           foreach($a_ids as $a_key => $a_id) 
    255           { 
    256                $nb_comment = $nb_trackback = 0; 
    257                foreach($b_ids as $b_key => $b_id) 
    258                { 
    259                     if ($a_id != $b_id || $a_tbs[$a_key] != $b_tbs[$b_key]) { 
    260                          continue; 
    261                     } 
    262                      
    263                     if ($b_tbs[$b_key]) { 
    264                          $nb_trackback = $b_nbs[$b_key]; 
    265                     } else { 
    266                          $nb_comment = $b_nbs[$b_key]; 
    267                     } 
    268                } 
    269                 
    270                if ($a_tbs[$a_key]) { 
    271                     $cur->nb_trackback = $nb_trackback; 
     252          foreach($affected_posts as $post_id) 
     253          { 
     254               $cur->clean(); 
     255                
     256               if (!array_key_exists($post_id,$posts)) { 
     257                    $cur->nb_trackback = 0; 
     258                    $cur->nb_comment = 0; 
    272259               } else { 
    273                     $cur->nb_comment = $nb_comment; 
    274                } 
    275                $cur->update('WHERE post_id = '.$a_id); 
     260                    $cur->nb_trackback = empty($posts[$post_id]['trackback']) ? 0 : $posts[$post_id]['trackback']; 
     261                    $cur->nb_comment = empty($posts[$post_id]['comment']) ? 0 : $posts[$post_id]['comment']; 
     262               } 
     263                
     264               $cur->update('WHERE post_id = '.$post_id); 
    276265          } 
    277266     } 
     
    311300          $counter = $this->getCategoriesCounter($c_params); 
    312301           
    313           $without_empty = $this->core->auth->userID() == false; # For public display 
     302          if (isset($params['without_empty']) && ($params['without_empty'] == false)) { 
     303               $without_empty = false; 
     304          } else { 
     305               $without_empty = $this->core->auth->userID() == false; # Get all categories if in admin display 
     306          } 
    314307           
    315308          $start = isset($params['start']) ? (integer) $params['start'] : 0; 
     
    505498          $this->core->callBehavior('coreBeforeCategoryCreate',$this,$cur); 
    506499           
    507           $this->categories()->addNode($cur,$parent); 
     500          $id = $this->categories()->addNode($cur,$parent); 
     501          # Update category's cursor 
     502          $rs = $this->getCategory($id); 
     503          if (!$rs->isEmpty()) { 
     504               $cur->cat_lft = $rs->cat_lft; 
     505               $cur->cat_rgt = $rs->cat_rgt; 
     506          } 
    508507           
    509508          # --BEHAVIOR-- coreAfterCategoryCreate 
     
    555554          $this->triggerBlog(); 
    556555     } 
     556 
     557        /** 
     558        Set category position 
     559 
     560        @param  id              <b>integer</b>          Category ID 
     561        @param  left            <b>integer</b>          Category ID before 
     562        @param  right           <b>integer</b>          Category ID after 
     563        */ 
     564        public function updCategoryPosition($id,$left,$right) 
     565        { 
     566                $this->categories()->updatePosition($id,$left,$right); 
     567                $this->triggerBlog(); 
     568        } 
    557569      
    558570     /** 
     
    646658          if (!$rs->isEmpty()) 
    647659          { 
    648                if ($this->con->driver() == 'mysql') { 
     660               if ($this->con->driver() == 'mysql' || $this->con->driver() == 'mysqli') { 
    649661                    $clause = "REGEXP '^".$this->con->escape($url)."[0-9]+$'"; 
    650662               } elseif ($this->con->driver() == 'pgsql') { 
     
    722734     - no_content: Don't retrieve entry content (excerpt and content) 
    723735     - post_type: Get only entries with given type (default "post", array for many types and '' for no type) 
    724      - post_id: (integer) Get entry with given post_id 
     736     - post_id: (integer or array) Get entry with given post_id 
    725737     - post_url: Get entry with given post_url field 
    726738     - user_id: (integer) Get entries belonging to given user ID 
     
    742754     - limit: Limit parameter 
    743755     - sql_only : return the sql request instead of results. Only ids are selected 
     756     - exclude_post_id : (integer or array) Exclude entries with given post_id 
    744757      
    745758     Please note that on every cat_id or cat_url, you can add ?not to exclude 
     
    793806          'INNER JOIN '.$this->prefix.'user U ON U.user_id = P.user_id '. 
    794807          'LEFT OUTER JOIN '.$this->prefix.'category C ON P.cat_id = C.cat_id '; 
     808 
     809          if (isset($params['media'])) { 
     810               if ($params['media'] == '0') { 
     811                    $strReq .= 'LEFT OUTER JOIN '.$this->prefix.'post_media M on P.post_id = M.post_id '; 
     812               } else { 
     813                    $strReq .= 'INNER JOIN '.$this->prefix.'post_media M on P.post_id = M.post_id '; 
     814               } 
     815               if (isset($params['link_type'])) { 
     816                    $strReq .= " and M.link_type ".$this->con->in($params['link_type'])." "; 
     817               } 
     818          } 
    795819           
    796820          if (!empty($params['from'])) { 
     
    835859               } 
    836860               $strReq .= 'AND P.post_id '.$this->con->in($params['post_id']); 
     861          } 
     862           
     863          if (isset($params['exclude_post_id']) && $params['exclude_post_id'] !== '') { 
     864               if (is_array($params['exclude_post_id'])) { 
     865                    array_walk($params['exclude_post_id'],create_function('&$v,$k','if($v!==null){$v=(integer)$v;}')); 
     866               } else { 
     867                    $params['exclude_post_id'] = array((integer) $params['exclude_post_id']); 
     868               } 
     869               $strReq .= 'AND P.post_id NOT '.$this->con->in($params['exclude_post_id']); 
    837870          } 
    838871           
     
    915948          } 
    916949           
     950          if (isset($params['media'])) { 
     951               if ($params['media'] == '0') { 
     952                    $strReq .= ' AND M.post_id IS NULL '; 
     953               } 
     954          } 
     955 
    917956          if (!empty($params['sql'])) { 
    918957               $strReq .= $params['sql'].' '; 
    919958          } 
    920959           
     960          if (!$count_only && isset($params['media'])) { 
     961               $strReq .= ' GROUP BY P.post_id '; 
     962          } 
     963 
    921964          if (!$count_only) 
    922965          { 
     
    934977               return $strReq; 
    935978          } 
    936            
     979 
    937980          $rs = $this->con->select($strReq); 
    938981          $rs->core = $this->core; 
     
    18051848          if (!$rs->isEmpty()) 
    18061849          { 
    1807                if ($this->con->driver() == 'mysql') { 
     1850               if ($this->con->driver() == 'mysql' || $this->con->driver() == 'mysqli') { 
    18081851                    $clause = "REGEXP '^".$this->con->escape($url)."[0-9]+$'"; 
    18091852               } elseif ($this->con->driver() == 'pgsql') { 
     
    18571900     - cat_id: (integer or array) Get comments belonging to entries of given category ID 
    18581901     - comment_id: (integer) Get comment with given ID 
     1902     - comment_site: (string) Get comments with given comment_site 
    18591903     - comment_status: (integer) Get comments with given comment_status 
    18601904     - comment_trackback: (integer) Get only comments (0) or trackbacks (1) 
     
    19461990          if (isset($params['comment_id']) && $params['comment_id'] !== '') { 
    19471991               $strReq .= 'AND comment_id = '.(integer) $params['comment_id'].' '; 
     1992          } 
     1993           
     1994          if (isset($params['comment_site'])) { 
     1995               $comment_site = $this->con->escape(str_replace('*','%',$params['comment_site'])); 
     1996               $strReq .= "AND comment_site LIKE '".$comment_site."' "; 
    19481997          } 
    19491998           
     
    21582207           
    21592208          # mySQL uses "JOIN" synthax 
    2160           if ($this->con->driver() == 'mysql') { 
     2209          if ($this->con->driver() == 'mysql' || $this->con->driver() == 'mysqli') { 
    21612210               $strReq .=  
    21622211                    'JOIN '.$this->prefix.'post tp ON tc.post_id = tp.post_id '; 
     
    21672216           
    21682217          # pgSQL uses "FROM" synthax 
    2169           if ($this->con->driver() != 'mysql') { 
     2218          if ($this->con->driver() != 'mysql' && $this->con->driver() != 'mysqli') { 
    21702219               $strReq .=  
    21712220                    'FROM '.$this->prefix.'post tp '; 
     
    21772226           
    21782227          # add pgSQL "WHERE" clause 
    2179           if ($this->con->driver() != 'mysql') { 
     2228          if ($this->con->driver() != 'mysql' && $this->con->driver() != 'mysqli') { 
    21802229               $strReq .=  
    21812230                    'AND tc.post_id = tp.post_id '; 
     
    22172266          $co_ids = dcUtils::cleanIds($ids); 
    22182267           
    2219           if (empty($ids)) { 
     2268          if (empty($co_ids)) { 
    22202269               throw new Exception(__('No such comment ID')); 
    22212270          } 
    22222271           
     2272          # Retrieve posts affected by comments edition 
     2273          $affected_posts = array(); 
     2274          $strReq = 
     2275               'SELECT post_id '. 
     2276               'FROM '.$this->prefix.'comment '. 
     2277               'WHERE comment_id'.$this->con->in($co_ids). 
     2278               'GROUP BY post_id'; 
     2279           
     2280          $rs = $this->con->select($strReq); 
     2281           
     2282          while ($rs->fetch()) { 
     2283               $affected_posts[] = (integer) $rs->post_id; 
     2284          } 
     2285           
    22232286          # mySQL uses "INNER JOIN" synthax 
    2224           if ($this->con->driver() == 'mysql') { 
     2287          if ($this->con->driver() == 'mysql' || $this->con->driver() == 'mysqli') { 
    22252288               $strReq =  
    22262289                    'DELETE FROM tc '. 
     
    22482311           
    22492312          $this->con->execute($strReq); 
    2250           $this->triggerComments($co_ids,true); 
     2313          $this->triggerComments($co_ids, true, $affected_posts); 
    22512314          $this->triggerBlog(); 
    22522315     } 
     
    22592322           
    22602323          # mySQL uses "INNER JOIN" synthax 
    2261           if ($this->con->driver() == 'mysql') { 
     2324          if ($this->con->driver() == 'mysql' || $this->con->driver() == 'mysqli') { 
    22622325               $strReq =  
    22632326                    'DELETE FROM tc '. 
     
    23032366           
    23042367          if ($cur->comment_site !== null && $cur->comment_site != '') { 
    2305                if (!preg_match('|^http(s?)://|',$cur->comment_site)) { 
     2368               if (!preg_match('|^http(s?)://|i',$cur->comment_site, $matches)) { 
    23062369                    $cur->comment_site = 'http://'.$cur->comment_site; 
     2370               }else{ 
     2371                    $cur->comment_site = strtolower($matches[0]).substr($cur->comment_site, strlen($matches[0])); 
    23072372               } 
    23082373          } 
  • inc/core/class.dc.blog.php

    r2312 r2313  
    44# This file is part of Dotclear 2. 
    55# 
    6 # Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear 
     6# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear 
    77# Licensed under the GPL version 2.0 license. 
    88# See LICENSE file or 
     
    8181               $this->desc = $b->blog_desc; 
    8282               $this->url = $b->blog_url; 
    83                $this->host = http::getHostFromURL($this->url); 
     83               $this->host = preg_replace('|^([a-z]{3,}://)(.*?)/.*$|','$1$2',$this->url); 
    8484               $this->creadt = strtotime($b->blog_creadt); 
    8585               $this->upddt = strtotime($b->blog_upddt); 
     
    875875           
    876876          if (!empty($params['user_id'])) { 
    877                $strReq .= "AND U.user_id = '".$this->con->escape($params['user_id'])."' "; 
     877               $strReq .= "AND U.user_id ".$this->con->in($params['user_id'])." "; 
    878878          } 
    879879           
     
    969969                    $strReq .= 'ORDER BY post_dt DESC '; 
    970970               } 
    971           } 
    972            
    973           if (!$count_only && !empty($params['limit'])) { 
    974                $strReq .= $this->con->limit($params['limit']); 
     971               if (!empty($params['limit'])) { 
     972                    $strReq .= $this->con->limit($params['limit']); 
     973               } 
    975974          } 
    976975           
  • inc/core/class.dc.core.php

    r1315 r2313  
    6565          if ($this->con instanceof mysqlConnection) { 
    6666               mysqlConnection::$weak_locks = true; 
     67          } elseif ($this->con instanceof mysqliConnection) { 
     68               mysqliConnection::$weak_locks = true; 
    6769          } 
    6870           
     
    382384     } 
    383385      
    384      public function setPostType($type,$admin_url,$public_url) 
     386     public function setPostType($type,$admin_url,$public_url,$label='') 
    385387     { 
    386388          $this->post_types[$type] = array( 
    387389               'admin_url' => $admin_url, 
    388                'public_url' => $public_url 
     390               'public_url' => $public_url, 
     391               'label' => ($label != '' ? $label : $type) 
    389392          ); 
    390393     } 
     
    854857          $strReq = 
    855858          'SELECT U.user_id AS user_id, user_super, user_name, user_firstname, '. 
    856           'user_displayname, permissions '. 
     859          'user_displayname, user_email, permissions '. 
    857860          'FROM '.$this->prefix.'user U '. 
    858861          'JOIN '.$this->prefix.'permissions P ON U.user_id = P.user_id '. 
     
    863866               'UNION '. 
    864867               'SELECT U.user_id AS user_id, user_super, user_name, user_firstname, '. 
    865                "user_displayname, NULL AS permissions ". 
     868               "user_displayname, user_email, NULL AS permissions ". 
    866869               'FROM '.$this->prefix.'user U '. 
    867870               'WHERE user_super = 1 '; 
     
    878881                    'firstname' => $rs->user_firstname, 
    879882                    'displayname' => $rs->user_displayname, 
     883                    'email' => $rs->user_email, 
    880884                    'super' => (boolean) $rs->user_super, 
    881885                    'p' => $this->auth->parsePermissions($rs->permissions) 
     
    965969           
    966970          if (!empty($params['q'])) { 
    967                $params['q'] = str_replace('*','%',$params['q']); 
     971               $params['q'] = strtolower(str_replace('*','%',$params['q'])); 
    968972               $where .= 
    969973               'AND ('. 
     
    13751379                    array('use_smilies','boolean',false, 
    13761380                    'Show smilies on entries and comments'), 
     1381                    array('inc_subcats','boolean',false, 
     1382                    'Include sub-categories in category page and category posts feed'), 
    13771383                    array('wiki_comments','boolean',false, 
    13781384                    'Allow commenters to use a subset of wiki syntax') 
  • inc/core/class.dc.core.php

    r2198 r2313  
    44# This file is part of Dotclear 2. 
    55# 
    6 # Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear 
     6# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear 
    77# Licensed under the GPL version 2.0 license. 
    88# See LICENSE file or 
     
    3939     public $rest;       ///< <b>dcRestServer</b> dcRestServer object 
    4040     public $log;        ///< <b>dcLog</b>             dcLog object 
     41     public $tpl;        ///< <b>Twig_Environment</b>  Twig_Environment object 
    4142      
    4243     private $versions = null; 
     
    9798          $this->addFormater('xhtml', create_function('$s','return $s;')); 
    9899          $this->addFormater('wiki', array($this,'wikiTransform')); 
     100          $this->loadTemplateEnvironment(); 
    99101     } 
    100102      
     
    120122     } 
    121123      
     124     /** 
     125     Create template environment (Twig_Environment instance) 
     126      
     127     default-templates path must be added from admin|public/prepend.php with: 
     128     $core->tpl->getLoader()->addPath('PATH_TO/default-templates'); 
     129     Selected theme path must be added with: 
     130     $core->tpl->getLoader()->prependPath('PATH_TO/MY_THEME'); 
     131     */ 
     132     public function loadTemplateEnvironment() 
     133     { 
     134          $cache_dir = path::real(DC_TPL_CACHE.'/twtpl',false); 
     135          if (!is_dir($cache_dir)) { 
     136               try { 
     137                    files::makeDir($cache_dir); 
     138               } catch (Exception $e) { 
     139                    $cache_dir = false; 
     140               } 
     141          } 
     142           
     143          $this->tpl = new Twig_Environment( 
     144               new Twig_Loader_Filesystem(dirname(__FILE__).'/../swf'), 
     145               array( 
     146                    'auto_reload' => true, 
     147                    'autoescape' => false, 
     148                    'base_template_class' => 'Twig_Template', 
     149                    'cache' => $cache_dir,  
     150                    'charset' => 'UTF-8', 
     151                    'debug' => DC_DEBUG, 
     152                    'optimizations' => -1, 
     153                    'strict_variables' => 0 //DC_DEBUG // Please fix undefined variables! 
     154               ) 
     155          ); 
     156          $this->tpl->addExtension(new dcFormExtension($this)); 
     157          $this->tpl->addExtension(new dcTabExtension($this)); 
     158     } 
    122159      
    123160     /// @name Blog init methods 
  • inc/prepend.php

    r1492 r2313  
    44# This file is part of Dotclear 2. 
    55# 
    6 # Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear 
     6# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear 
    77# Licensed under the GPL version 2.0 license. 
    88# See LICENSE file or 
     
    4747$__autoload['dcPrefs']                  = dirname(__FILE__).'/core/class.dc.prefs.php'; 
    4848$__autoload['dcTwigPage']               = dirname(__FILE__).'/core/class.dc.twig.page.php'; 
     49$__autoload['dcStore']             = dirname(__FILE__).'/core/class.dc.store.php'; 
     50$__autoload['dcStoreReader']       = dirname(__FILE__).'/core/class.dc.store.reader.php'; 
     51$__autoload['dcStoreParser']       = dirname(__FILE__).'/core/class.dc.store.parser.php'; 
     52$__autoload['dcFavorites']              = dirname(__FILE__).'/admin/class.dc.favorites.php'; 
    4953 
    5054$__autoload['rsExtPost']                = dirname(__FILE__).'/core/class.dc.rs.extensions.php'; 
     
    6165$__autoload['adminCommentList']         = dirname(__FILE__).'/admin/lib.pager.php'; 
    6266$__autoload['adminUserList']            = dirname(__FILE__).'/admin/lib.pager.php'; 
     67$__autoload['dcPager']        = dirname(__FILE__).'/admin/lib.pager.php'; 
     68$__autoload['dcAdminCombos']            = dirname(__FILE__).'/admin/lib.admincombos.php'; 
     69$__autoload['adminModulesList']              = dirname(__FILE__).'/admin/lib.moduleslist.php'; 
     70$__autoload['adminThemesList']               = dirname(__FILE__).'/admin/lib.moduleslist.php'; 
    6371 
    6472$__autoload['dcTemplate']               = dirname(__FILE__).'/public/class.dc.template.php'; 
    6573$__autoload['context']                  = dirname(__FILE__).'/public/lib.tpl.context.php'; 
    6674$__autoload['dcUrlHandlers']            = dirname(__FILE__).'/public/lib.urlhandlers.php'; 
     75$__autoload['dcPostsActionsPage']            = dirname(__FILE__).'/admin/actions/class.dcactionposts.php'; 
     76$__autoload['dcCommentsActionsPage']              = dirname(__FILE__).'/admin/actions/class.dcactioncomments.php'; 
     77$__autoload['dcActionsPage']            = dirname(__FILE__).'/admin/actions/class.dcaction.php'; 
    6778$__autoload['dcForm']              = dirname(__FILE__).'/admin/class.dc.form.php'; 
    6879$__autoload['dcFormExtension']               = dirname(__FILE__).'/admin/class.dc.form.php'; 
     
    153164define('DC_L10N_ROOT',dirname(__FILE__).'/../locales'); 
    154165define('DC_L10N_UPDATE_URL','http://services.dotclear.net/dc2.l10n/?version=%s'); 
     166define('DC_DISTRIB_PLUGINS','aboutConfig,akismet,antispam,attachments,blogroll,blowupConfig,dclegacy,fairTrackbacks,importExport,maintenance,pages,pings,simpleMenu,tags,themeEditor,userPref,widgets'); 
     167define('DC_DISTRIB_THEMES','blueSilence,blowupConfig,customCSS,default,ductile'); 
    155168 
    156169if (!defined('DC_VENDOR_NAME')) { 
     
    246259$core->url->register('xmlrpc','xmlrpc','^xmlrpc/(.+)$',array('dcUrlHandlers','xmlrpc')); 
    247260 
    248 $core->setPostType('post','post.php?id=%d',$core->url->getURLFor('post','%s')); 
     261$core->setPostType('post','post.php?id=%d',$core->url->getURLFor('post','%s'),'Posts'); 
    249262 
    250263# Store upload_max_filesize in bytes 
     
    313326     { 
    314327          if ($l == 'en' || l10n::set(dirname(__FILE__).'/../locales/'.$l.'/main') !== false) { 
     328               l10n::lang($l); 
    315329               break; 
    316330          } 
  • inc/prepend.php

    r2286 r2313  
    1212 
    1313/* ------------------------------------------------------------------------------------------- */ 
    14 #  ClearBricks, DotClear classes auto-loader 
     14#  ClearBricks, Twig, DotClear classes auto-loader 
    1515if (@is_dir('/usr/lib/clearbricks')) { 
    1616     define('CLEARBRICKS_PATH','/usr/lib/clearbricks'); 
     
    4646$__autoload['dcWorkspace']              = dirname(__FILE__).'/core/class.dc.workspace.php'; 
    4747$__autoload['dcPrefs']                  = dirname(__FILE__).'/core/class.dc.prefs.php'; 
     48$__autoload['dcTwigPage']               = dirname(__FILE__).'/core/class.dc.twig.page.php'; 
    4849$__autoload['dcStore']             = dirname(__FILE__).'/core/class.dc.store.php'; 
    4950$__autoload['dcStoreReader']       = dirname(__FILE__).'/core/class.dc.store.reader.php'; 
     
    5657$__autoload['rsExtUser']                = dirname(__FILE__).'/core/class.dc.rs.extensions.php'; 
    5758 
     59$__autoload['dcAdminContext']                = dirname(__FILE__).'/admin/class.dc.admincontext.php'; 
    5860$__autoload['dcMenu']                   = dirname(__FILE__).'/admin/class.dc.menu.php'; 
    5961$__autoload['dcPage']                   = dirname(__FILE__).'/admin/lib.dc.page.php'; 
     
    7476$__autoload['dcCommentsActionsPage']              = dirname(__FILE__).'/admin/actions/class.dcactioncomments.php'; 
    7577$__autoload['dcActionsPage']            = dirname(__FILE__).'/admin/actions/class.dcaction.php'; 
     78$__autoload['dcForm']              = dirname(__FILE__).'/admin/class.dc.form.php'; 
     79$__autoload['dcFormExtension']               = dirname(__FILE__).'/admin/class.dc.form.php'; 
     80$__autoload['dcTabExtension']           = dirname(__FILE__).'/admin/class.dc.tab.php'; 
     81$__autoload['dcItemList']               = dirname(__FILE__).'/admin/class.dc.list.php'; 
     82$__autoload['dcListFetcher']            = dirname(__FILE__).'/admin/class.dc.list.php'; 
     83 
     84foreach (array('dcFilterSet', 'dcFilter','dcFilterCombo','dcFilterText','dcFilterBoolean') as $c) { 
     85     $__autoload[$c] = dirname(__FILE__).'/admin/class.dc.filter.php'; 
     86} 
    7687 
    7788# Clearbricks extensions 
    7889html::$absolute_regs[] = '/(<param\s+name="movie"\s+value=")(.*?)(")/msu'; 
    7990html::$absolute_regs[] = '/(<param\s+name="FlashVars"\s+value=".*?(?:mp3|flv)=)(.*?)(&|")/msu'; 
     91 
     92if (@is_dir('/usr/lib/twig')) { 
     93     define('TWIG_PATH','/usr/lib/Twig'); 
     94} elseif (is_dir(dirname(__FILE__).'/libs/Twig')) { 
     95     define('TWIG_PATH',dirname(__FILE__).'/libs/Twig'); 
     96} elseif (isset($_SERVER['TWIG_PATH']) && is_dir($_SERVER['TWIG_PATH'])) { 
     97     define('TWIG_PATH',$_SERVER['TWIG_PATH']); 
     98} 
     99 
     100if (!defined('TWIG_PATH') || !is_dir(TWIG_PATH)) { 
     101     exit('No Twig path defined'); 
     102} 
     103require TWIG_PATH.'/Autoloader.php'; 
     104Twig_Autoloader::register(); 
     105 
    80106/* ------------------------------------------------------------------------------------------- */ 
    81107 
     
    134160# Constants 
    135161define('DC_ROOT',path::real(dirname(__FILE__).'/..')); 
    136 define('DC_VERSION','2.6-dev'); 
     162define('DC_VERSION','2.99-dev'); 
    137163define('DC_DIGESTS',dirname(__FILE__).'/digests'); 
    138164define('DC_L10N_ROOT',dirname(__FILE__).'/../locales'); 
  • inc/public/lib.urlhandlers.php

    r1315 r2313  
    263263               $params = new ArrayObject(array( 
    264264                    'cat_url' => $args, 
    265                     'post_type' => 'post')); 
     265                    'post_type' => 'post', 
     266                    'without_empty' => false)); 
    266267                
    267268               $core->callBehavior('publicCategoryBeforeGetCategories',$params,$args); 
     
    479480                     
    480481                    # The entry 
     482                    if ($_ctx->posts->trackbacksActive()) { 
     483                         header('X-Pingback: '.$core->blog->url.$core->url->getURLFor("xmlrpc",$core->blog->id)); 
     484                    } 
    481485                    self::serveDocument('post.html'); 
    482486               } 
  • inc/public/prepend.php

    r1315 r2313  
    6969$_lang = preg_match('/^[a-z]{2}(-[a-z]{2})?$/',$_lang) ? $_lang : 'en'; 
    7070 
     71l10n::lang($_lang); 
    7172if (l10n::set(dirname(__FILE__).'/../../locales/'.$_lang.'/date') === false && $_lang != 'en') { 
    7273     l10n::set(dirname(__FILE__).'/../../locales/en/date'); 
Note: See TracChangeset for help on using the changeset viewer.

Sites map