Make WordPress Core

Ticket #7665: patch-jquery-date-and-time-picker3.diff

File patch-jquery-date-and-time-picker3.diff, 29.6 KB (added by chsxf, 13 years ago)

Synced-with-lastest-trunk-revision unified diff of the modified files

  • wp-includes/functions.php

     
    142142}
    143143
    144144/**
     145 * Builds a regular expression allowing to match a date formatted according to the specified format
     146 *
     147 * @param string Format of the date
     148 * @param string Regular expression delimiters
     149 * @return bool|string a string representing the built regular expression, or false in case of an error or if no format element is used
     150 */
     151function build_date_parse_regexp_from_format( $format, $delimiter = '/' ) {
     152        // Regular expressions used to parse the date
     153        $replacements = array(
     154                'd' => '([0-2][0-9]|3[0-1])',
     155                'D' => '(Sun|Mon|Tue|Wed|Thu|Fri|Sat)',
     156                'j' => '([1-9]|[1-2][0-9]|3[0-1])',
     157                'l' => '(Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday)',
     158                'S' => '(st|nd|rd|th)',
     159                'z' => '(\d{1,3})',
     160                'F' => '(January|February|March|April|May|June|July|August|September|October|November|December)',
     161                'M' => '(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)',
     162                'm' => '(0[1-9]|1[0-2])',
     163                'n' => '([1-9]|1[0-2])',
     164                'Y' => '(\d{4})',
     165                'y' => '(\d{2})',
     166                'a' => '(am|pm)',
     167                'A' => '(AM|PM)',
     168                'g' => '([0-9]|1[0-2])',
     169                'h' => '(0[0-9]|1[0-2])',
     170                'G' => '([0-9]|1[0-9]|2[0-3])',
     171                'H' => '([0-1][0-9]|2[0-3])',
     172                'i' => '([0-5][0-9])',
     173                's' => '([0-5][0-9])',
     174                'u' => '(\d{1,6})',
     175                'U' => '(\d{1,10})',
     176                'e' => '([a-zA-Z-\/]+(?:\+\d+)?)',
     177                'O' => '((?:\+|-)\d{4})',
     178                'P' => '((?:\+|-)\d{2}:\d{2})',
     179                'T' => '([A-Z]+)',
     180        );
     181       
     182        // Looking for used format elements
     183        $parsed_format = $format;
     184        $used_replacements = array();
     185        foreach ( $replacements as $k => $v ) {
     186                if ( ( $p = strpos( $format, $k ) ) !== false ) {
     187                        $parsed_format = str_replace( $k, "%{$k}%", $parsed_format );
     188                        $used_replacements[$k] = $v;
     189                }
     190        }
     191       
     192        if ( !empty( $used_replacements ) ) {
     193                // Computing sources elements to create the regular expression
     194                $replacement_keys = array_map( create_function( '$a', 'return "%{$a}%";' ), array_keys( $used_replacements ) );
     195                       
     196                // Building the regular expression
     197                return $delimiter . '^' . str_replace( '/', '\/', str_replace( $replacement_keys, array_values( $used_replacements ), $parsed_format ) ) . '$' . $delimiter;
     198        }
     199        else
     200                return false;
     201}
     202
     203/**
     204 * Get info about given date formatted according to the specified format
     205 *
     206 * This function is a placeholder for the PHP 5.3+ date_parse_from_format() function.
     207 * Please visit the official function documentation for further information :
     208 * http://fr.php.net/manual/fr/function.date-parse-from-format.php
     209 *
     210 * This function differs from its original version in its return values :
     211 * it returns false in case of an error instead of including errors in the returned array
     212 * and it does not support format modifiers such as '+' or '!' (yet)
     213 *
     214 * @param string Format of the date
     215 * @param string Date to parse
     216 * @return bool|array an array containing the date components, or false in case of an error
     217 */
     218if ( !function_exists( 'date_parse_from_format' ) )
     219{
     220        function date_parse_from_format( $format, $date ) {
     221                // Regular expressions used to parse the date
     222                $replacements = array(
     223                        'd' => '([0-2][0-9]|3[0-1])',
     224                        'D' => array( 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat' ),
     225                        'j' => '([1-9]|[1-2][0-9]|3[0-1])',
     226                        'l' => array( 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday' ),
     227                        'S' => array( 'st', 'nd', 'rd', 'th' ),
     228                        'z' => '(\d{1,3})',
     229                        'F' => array( 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' ),
     230                        'M' => array( 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ),
     231                        'm' => '(0[1-9]|1[0-2])',
     232                        'n' => '([1-9]|1[0-2])',
     233                        'Y' => '(\d{4})',
     234                        'y' => '(\d{2})',
     235                        'a' => '(am|pm)',
     236                        'A' => array( 'AM', 'PM' ),
     237                        'g' => '([0-9]|1[0-2])',
     238                        'h' => '(0[0-9]|1[0-2])',
     239                        'G' => '([0-9]|1[0-9]|2[0-3])',
     240                        'H' => '([0-1][0-9]|2[0-3])',
     241                        'i' => '([0-5][0-9])',
     242                        's' => '([0-5][0-9])',
     243                        'u' => '(\d{1,6})',
     244                        'U' => '(\d{1,10})',
     245                        'e' => '([a-zA-Z-\/]+(?:\+\d+)?)',
     246                        'O' => '((?:\+|-)\d{4})',
     247                        'P' => '((?:\+|-)\d{2}:\d{2})',
     248                        'T' => '([A-Z]+)',
     249                );
     250               
     251                // Looking for used format elements
     252                $parsed_format = $format;
     253                $used_replacements = array();
     254                $used_replacements_indices = array();
     255                foreach ( $replacements as $k => $v ) {
     256                        if ( ( $p = strpos( $format, $k ) ) !== false ) {
     257                                $parsed_format = str_replace( $k, "%{$k}%", $parsed_format );
     258                                $used_replacements[$k] = $v;
     259                                $used_replacements_indices[$p] = $k;
     260                        }
     261                }
     262               
     263                // If a format element has been found
     264                if ( !empty( $used_replacements ) ) {
     265                        // Sort format elements to be in the same order as the results of the regular expression
     266                        ksort( $used_replacements_indices );
     267               
     268                        // Computing sources and replacements elements to create the regular expression
     269                        $replacement_keys = array_map( create_function( '$a', 'return "%{$a}%";' ), array_keys( $used_replacements ) );
     270                        $replacement_values = array_map( create_function( '$a', 'return is_array($a) ? ("(" . implode("|", $a) . ")") : $a;' ), array_values( $used_replacements ) );
     271                       
     272                        // Applying the regular expression
     273                        $regexp = '/^' . str_replace( '/', '\/', str_replace( $replacement_keys, $replacement_values, $parsed_format ) ) . '$/';
     274                        if ( !preg_match( $regexp, $date, $regs ) )
     275                                return false;
     276                       
     277                        // Retrieving regular expression result for each format element
     278                        $members = array();
     279                        $i = 1;
     280                        foreach ( $used_replacements_indices as $v ) {
     281                                $members[$v] = $regs[$i++];
     282                        }
     283                       
     284                        // Computing results
     285                        $result = array(
     286                                'day' => false,
     287                                'month' => false,
     288                                'year' => false,
     289                                'hour' => 0,
     290                                'minute' => 0,
     291                                'second' => 0,
     292                                'fraction' => false
     293                        );
     294                        foreach ( $members as $k => $v ) {
     295                                switch ($k)
     296                                {
     297                                        case 'd':
     298                                        case 'j':
     299                                                $result['day'] = intval( $v );
     300                                                break;
     301                                       
     302                                        case 'M':
     303                                        case 'F':
     304                                                $result['month'] = array_search( $v, $replacements[$k] ) + 1;
     305                                                break;
     306                                       
     307                                        case 'm':
     308                                        case 'n':
     309                                                $result['month'] = intval( $v );
     310                                                break;
     311                                               
     312                                        case 'Y':
     313                                                $result['year'] = intval( $v );
     314                                                break;
     315                                       
     316                                        case 'y':
     317                                                $result['year'] = intval( $v );
     318                                                if ( $result['year'] < 70 )
     319                                                        $result['year'] += 2000;
     320                                                else
     321                                                        $result['year'] += 1900;
     322                                                break;
     323                                               
     324                                        case 'H':
     325                                        case 'h':
     326                                                $result['hour'] = intval( $v );
     327                                                if ( ( !empty( $members['a'] ) && $members['a'] == 'pm' ) || ( !empty( $members['A'] ) && $members['A'] == 'PM' ) )
     328                                                        $result['hour'] += 12;
     329                                                break;
     330                                               
     331                                        case 'i':
     332                                                $result['minute'] = intval( $v );
     333                                                break;
     334                                               
     335                                        case 's':
     336                                                $result['second'] = intval( $v );
     337                                                break;
     338                                               
     339                                        case 'u':
     340                                                $result['fraction'] = floatval( $v );
     341                                                break;
     342                                               
     343                                        case 'U':
     344                                                $ts = intval($v);
     345                                                $result['day'] = date( 'j', $ts );
     346                                                $result['month'] = date( 'n', $ts );
     347                                                $result['year'] = date( 'Y', $ts );
     348                                                $result['hour'] = date( 'G', $ts );
     349                                                $result['minute'] = date( 'i', $ts );
     350                                                $result['second'] = date( 's', $ts );
     351                                                $result = array_map( 'intval', $result );
     352                                                break;
     353                                }
     354                        }
     355                        return $result;
     356                }
     357                else
     358                        return false;
     359        }
     360}
     361
     362/**
    145363 * Convert integer number to format based on the locale.
    146364 *
    147365 * @since 2.3.0
  • wp-includes/script-loader.php

     
    6363
    6464        $scripts->add( 'common', "/wp-admin/js/common$suffix.js", array('jquery', 'hoverIntent', 'utils'), '20110927', 1 );
    6565        $scripts->add_script_data( 'common', 'commonL10n', array(
    66                 'warnDelete' => __("You are about to permanently delete the selected items.\n  'Cancel' to stop, 'OK' to delete.")
     66                'warnDelete' => __("You are about to permanently delete the selected items.\n  'Cancel' to stop, 'OK' to delete."),
     67
     68                'datePicker_dateFormat' => __('mm/dd/yy'),
     69                'datePicker_firstDay' => get_option('start_of_week'),
     70               
     71                'timePicker_hourText' => __('Hour'),
     72                'timePicker_minuteText' => __('Minute'),
     73                       
     74                'date_regexp' => build_date_parse_regexp_from_format( __('m/d/Y'), '' ),
     75                'date_components_order' => __('month,day,year'),
     76                'time_regexp' => build_date_parse_regexp_from_format( __('H:i'), '' )
    6777        ) );
    6878
    6979        $scripts->add( 'sack', "/wp-includes/js/tw-sack$suffix.js", false, '1.6.1', 1 );
     
    153163        $scripts->add( 'jquery-ui-sortable', '/wp-includes/js/jquery/ui/jquery.ui.sortable.min.js', array('jquery-ui-core', 'jquery-ui-mouse'), '1.8.16', 1 );
    154164        $scripts->add( 'jquery-ui-tabs', '/wp-includes/js/jquery/ui/jquery.ui.tabs.min.js', array('jquery-ui-core', 'jquery-ui-widget'), '1.8.16', 1 );
    155165        $scripts->add( 'jquery-ui-widget', '/wp-includes/js/jquery/ui/jquery.ui.widget.min.js', array('jquery'), '1.8.16', 1 );
     166        $scripts->add( 'jquery-ui-timepicker', '/wp-includes/js/jquery/ui.timepicker.js', array('jquery-ui-core'), '0.2.3', 1 );
    156167
     168        $scripts->add( 'jquery-ui-datepicker', '/wp-includes/js/jquery/ui.datepicker.js', array('jquery-ui-core'), '1.8.12' );
     169        $scripts->add_data( 'jquery-ui-datepicker', 'group', 1 );
     170       
     171        $locale_chunks = explode( '_', get_locale() );
     172        $jquery_datepicker_language_file = '/wp-includes/js/jquery/ui.datepicker.i18n/jquery.ui.datepicker-' . implode( '-', $locale_chunks ) . '.js';
     173        if ( !file_exists( ABSPATH . $jquery_datepicker_language_file ) ) {
     174                $jquery_datepicker_language_file = '/wp-includes/js/jquery/ui.datepicker.i18n/jquery.ui.datepicker-' . $locale_chunks[0] . '.js';
     175                if ( !file_exists( ABSPATH . $jquery_datepicker_language_file ) )
     176                        unset( $jquery_datepicker_language_file );
     177        }
     178        if ( !empty( $jquery_datepicker_language_file ) ) {
     179                $scripts->add( 'jquery-ui-datepicker-i18n', $jquery_datepicker_language_file, array('jquery-ui-core', 'jquery-ui-datepicker'), '1.8.12' );
     180                $scripts->add_data( 'jquery-ui-datepicker-i18n', 'group', 1 );
     181        }
     182
    157183        // deprecated, not used in core, most functionality is included in jQuery 1.3
    158184        $scripts->add( 'jquery-form', "/wp-includes/js/jquery/jquery.form$suffix.js", array('jquery'), '2.73', 1 );
    159185
     
    457483        $styles->add( 'wp-jquery-ui-dialog', "/wp-includes/css/jquery-ui-dialog$suffix.css", array(), '20101224' );
    458484        $styles->add( 'editor-buttons', "/wp-includes/css/editor-buttons$suffix.css", array(), '20110928' );
    459485        $styles->add( 'wp-pointer', "/wp-includes/css/wp-pointer$suffix.css", array(), '20110918' );
     486        $styles->add( 'jquery-ui-core', "/wp-includes/css/jquery-ui-core.css", array(), '20110717' );
     487        $styles->add( 'jquery-ui-theme', "/wp-includes/css/jquery-ui-theme.css", array(), '20110717' );
     488        $styles->add( 'jquery-ui-timepicker', "/wp-includes/css/jquery-ui-timepicker.css", array(), '20110622' );
     489        $styles->add( 'jquery-ui-datepicker', "/wp-includes/css/jquery-ui-datepicker.css", array(), '20110717' );
    460490
    461491        foreach ( $rtl_styles as $rtl_style ) {
    462492                $styles->add_data( $rtl_style, 'rtl', true );
  • wp-admin/includes/post.php

     
    101101        if (!isset( $post_data['ping_status'] ))
    102102                $post_data['ping_status'] = 'closed';
    103103
    104         foreach ( array('aa', 'mm', 'jj', 'hh', 'mn') as $timeunit ) {
     104        foreach ( array('dd', 'tt') as $timeunit ) {
    105105                if ( !empty( $post_data['hidden_' . $timeunit] ) && $post_data['hidden_' . $timeunit] != $post_data[$timeunit] ) {
    106106                        $post_data['edit_date'] = '1';
    107107                        break;
     
    109109        }
    110110
    111111        if ( !empty( $post_data['edit_date'] ) ) {
    112                 $aa = $post_data['aa'];
    113                 $mm = $post_data['mm'];
    114                 $jj = $post_data['jj'];
    115                 $hh = $post_data['hh'];
    116                 $mn = $post_data['mn'];
    117                 $ss = $post_data['ss'];
    118                 $aa = ($aa <= 0 ) ? date('Y') : $aa;
    119                 $mm = ($mm <= 0 ) ? date('n') : $mm;
    120                 $jj = ($jj > 31 ) ? 31 : $jj;
    121                 $jj = ($jj <= 0 ) ? date('j') : $jj;
    122                 $hh = ($hh > 23 ) ? $hh -24 : $hh;
    123                 $mn = ($mn > 59 ) ? $mn -60 : $mn;
    124                 $ss = ($ss > 59 ) ? $ss -60 : $ss;
    125                 $post_data['post_date'] = sprintf( "%04d-%02d-%02d %02d:%02d:%02d", $aa, $mm, $jj, $hh, $mn, $ss );
    126                 $post_data['post_date_gmt'] = get_gmt_from_date( $post_data['post_date'] );
     112                $date_str = sprintf( '%s %s', trim( $post_data['dd'] ), trim( $post_data['tt'] ) );
     113                $date_format_str = sprintf( '%s H:i', __( 'm/d/Y' ) );
     114                $result = date_parse_from_format( $date_format_str, $date_str );
     115                if ( !empty( $result ) && empty( $result['warning_count'] ) && empty( $result['error_count'] ) ) {
     116                        $aa = $result['year'];
     117                        $mm = $result['month'];
     118                        $jj = $result['day'];
     119                        $hh = $result['hour'];
     120                        $mn = $result['minute'];
     121                        $ss = $post_data['ss'];
     122                        $aa = ($aa <= 0 ) ? date('Y') : $aa;
     123                        $mm = ($mm <= 0 ) ? date('n') : $mm;
     124                        $jj = ($jj > 31 ) ? 31 : $jj;
     125                        $jj = ($jj <= 0 ) ? date('j') : $jj;
     126                        $hh = ($hh > 23 ) ? $hh -24 : $hh;
     127                        $mn = ($mn > 59 ) ? $mn -60 : $mn;
     128                        $ss = ($ss > 59 ) ? $ss -60 : $ss;
     129                        $post_data['post_date'] = sprintf( "%04d-%02d-%02d %02d:%02d:%02d", $aa, $mm, $jj, $hh, $mn, $ss );
     130                        $post_data['post_date_gmt'] = get_gmt_from_date( $post_data['post_date'] );
     131                }
    127132        }
    128133
    129134        return $post_data;
  • wp-admin/includes/comment.php

     
    4343        $_POST['comment_content'] = $_POST['content'];
    4444        $_POST['comment_ID'] = (int) $_POST['comment_ID'];
    4545
    46         foreach ( array ('aa', 'mm', 'jj', 'hh', 'mn') as $timeunit ) {
     46        foreach ( array ('dd', 'tt') as $timeunit ) {
    4747                if ( !empty( $_POST['hidden_' . $timeunit] ) && $_POST['hidden_' . $timeunit] != $_POST[$timeunit] ) {
    4848                        $_POST['edit_date'] = '1';
    4949                        break;
     
    5151        }
    5252
    5353        if ( !empty ( $_POST['edit_date'] ) ) {
    54                 $aa = $_POST['aa'];
    55                 $mm = $_POST['mm'];
    56                 $jj = $_POST['jj'];
    57                 $hh = $_POST['hh'];
    58                 $mn = $_POST['mn'];
    59                 $ss = $_POST['ss'];
    60                 $jj = ($jj > 31 ) ? 31 : $jj;
    61                 $hh = ($hh > 23 ) ? $hh -24 : $hh;
    62                 $mn = ($mn > 59 ) ? $mn -60 : $mn;
    63                 $ss = ($ss > 59 ) ? $ss -60 : $ss;
    64                 $_POST['comment_date'] = "$aa-$mm-$jj $hh:$mn:$ss";
     54                $date_str = sprintf( '%s %s', trim( $_POST['dd'] ), trim( $_POST['tt'] ) );
     55                $date_format_str = sprintf( '%s H:i', __( 'm/d/Y' ) );
     56                $result = date_parse_from_format( $date_format_str, $date_str );
     57               
     58                if ( !empty( $result ) && empty( $result['warning_count'] ) && empty( $result['error_count'] ) ) {
     59                        $aa = $result['year'];
     60                        $mm = $result['month'];
     61                        $jj = $result['day'];
     62                        $hh = $result['hour'];
     63                        $mn = $result['minute'];
     64                        $ss = $_POST['ss'];
     65                        $aa = ($aa <= 0 ) ? date('Y') : $aa;
     66                        $mm = ($mm <= 0 ) ? date('n') : $mm;
     67                        $jj = ($jj > 31 ) ? 31 : $jj;
     68                        $jj = ($jj <= 0 ) ? date('j') : $jj;
     69                        $hh = ($hh > 23 ) ? $hh -24 : $hh;
     70                        $mn = ($mn > 59 ) ? $mn -60 : $mn;
     71                        $ss = ($ss > 59 ) ? $ss -60 : $ss;
     72                        $_POST['comment_date'] = sprintf( "%04d-%02d-%02d %02d:%02d:%02d", $aa, $mm, $jj, $hh, $mn, $ss );
     73                }
    6574        }
    6675
    6776        wp_update_comment( $_POST );
  • wp-admin/includes/template.php

     
    244244        <div class="comment_status">' . esc_html( $post->comment_status ) . '</div>
    245245        <div class="ping_status">' . esc_html( $post->ping_status ) . '</div>
    246246        <div class="_status">' . esc_html( $post->post_status ) . '</div>
    247         <div class="jj">' . mysql2date( 'd', $post->post_date, false ) . '</div>
    248         <div class="mm">' . mysql2date( 'm', $post->post_date, false ) . '</div>
    249         <div class="aa">' . mysql2date( 'Y', $post->post_date, false ) . '</div>
    250         <div class="hh">' . mysql2date( 'H', $post->post_date, false ) . '</div>
    251         <div class="mn">' . mysql2date( 'i', $post->post_date, false ) . '</div>
     247        <div class="dd">' . mysql2date( __('m/d/Y'), $post->post_date, false ) . '</div>
     248        <div class="tt">' . mysql2date( 'H:i', $post->post_date, false ) . '</div>
    252249        <div class="ss">' . mysql2date( 's', $post->post_date, false ) . '</div>
    253250        <div class="post_password">' . esc_html( $post->post_password ) . '</div>';
    254251
     
    568565
    569566        $time_adj = current_time('timestamp');
    570567        $post_date = ($for_post) ? $post->post_date : $comment->comment_date;
    571         $jj = ($edit) ? mysql2date( 'd', $post_date, false ) : gmdate( 'd', $time_adj );
    572         $mm = ($edit) ? mysql2date( 'm', $post_date, false ) : gmdate( 'm', $time_adj );
    573         $aa = ($edit) ? mysql2date( 'Y', $post_date, false ) : gmdate( 'Y', $time_adj );
    574         $hh = ($edit) ? mysql2date( 'H', $post_date, false ) : gmdate( 'H', $time_adj );
    575         $mn = ($edit) ? mysql2date( 'i', $post_date, false ) : gmdate( 'i', $time_adj );
    576         $ss = ($edit) ? mysql2date( 's', $post_date, false ) : gmdate( 's', $time_adj );
     568       
     569        $date_format = __('m/d/Y');
     570        $dd = ($edit) ? mysql2date($date_format, $post_date, false) : gmdate($date_format, $time_adj);
     571        $tt = ($edit) ? mysql2date('H:i', $post_date, false) : gmdate('H:i', $time_adj);
     572        $ss = ($edit) ? mysql2date('s', $post_date, false) : gmdate('s', $time_adj);
     573       
     574        $cur_dd = gmdate($date_format, $time_adj);
     575        $cur_tt = gmdate('H:i', $time_adj);
    577576
    578         $cur_jj = gmdate( 'd', $time_adj );
    579         $cur_mm = gmdate( 'm', $time_adj );
    580         $cur_aa = gmdate( 'Y', $time_adj );
    581         $cur_hh = gmdate( 'H', $time_adj );
    582         $cur_mn = gmdate( 'i', $time_adj );
     577        $date = '<input type="text" ' . ($multi ? '' : 'id="dd"') . ' name="dd" value="' . $dd . '" size="10" maxlength="10"' . $tab_index_attribute . ' autocomplete="off" class="datepicker" />';
     578        $time = '<input type="text" ' . ($multi ? '' : 'id="tt"') . ' name="tt" value="' . $tt . '" size="10" maxlength="10"' . $tab_index_attribute . ' autocomplete="off" class="timepicker" />';
    583579
    584         $month = "<select " . ( $multi ? '' : 'id="mm" ' ) . "name=\"mm\"$tab_index_attribute>\n";
    585         for ( $i = 1; $i < 13; $i = $i +1 ) {
    586                 $month .= "\t\t\t" . '<option value="' . zeroise($i, 2) . '"';
    587                 if ( $i == $mm )
    588                         $month .= ' selected="selected"';
    589                 $month .= '>' . $wp_locale->get_month_abbrev( $wp_locale->get_month( $i ) ) . "</option>\n";
    590         }
    591         $month .= '</select>';
    592 
    593         $day = '<input type="text" ' . ( $multi ? '' : 'id="jj" ' ) . 'name="jj" value="' . $jj . '" size="2" maxlength="2"' . $tab_index_attribute . ' autocomplete="off" />';
    594         $year = '<input type="text" ' . ( $multi ? '' : 'id="aa" ' ) . 'name="aa" value="' . $aa . '" size="4" maxlength="4"' . $tab_index_attribute . ' autocomplete="off" />';
    595         $hour = '<input type="text" ' . ( $multi ? '' : 'id="hh" ' ) . 'name="hh" value="' . $hh . '" size="2" maxlength="2"' . $tab_index_attribute . ' autocomplete="off" />';
    596         $minute = '<input type="text" ' . ( $multi ? '' : 'id="mn" ' ) . 'name="mn" value="' . $mn . '" size="2" maxlength="2"' . $tab_index_attribute . ' autocomplete="off" />';
    597 
    598580        echo '<div class="timestamp-wrap">';
    599         /* translators: 1: month input, 2: day input, 3: year input, 4: hour input, 5: minute input */
    600         printf(__('%1$s%2$s, %3$s @ %4$s : %5$s'), $month, $day, $year, $hour, $minute);
     581        printf(__('Date %s @ %s'), $date, $time);
    601582
    602583        echo '</div><input type="hidden" id="ss" name="ss" value="' . $ss . '" />';
    603584
    604585        if ( $multi ) return;
    605586
    606587        echo "\n\n";
    607         foreach ( array('mm', 'jj', 'aa', 'hh', 'mn') as $timeunit ) {
     588        foreach ( array('dd', 'tt') as $timeunit ) {
    608589                echo '<input type="hidden" id="hidden_' . $timeunit . '" name="hidden_' . $timeunit . '" value="' . $$timeunit . '" />' . "\n";
    609590                $cur_timeunit = 'cur_' . $timeunit;
    610591                echo '<input type="hidden" id="'. $cur_timeunit . '" name="'. $cur_timeunit . '" value="' . $$cur_timeunit . '" />' . "\n";
     
    615596<a href="#edit_timestamp" class="save-timestamp hide-if-no-js button"><?php _e('OK'); ?></a>
    616597<a href="#edit_timestamp" class="cancel-timestamp hide-if-no-js"><?php _e('Cancel'); ?></a>
    617598</p>
     599
     600<script type="text/javascript">
     601<!--
     602jQuery(document).ready( function() {
     603        setupDateAndTimePickers(false);
     604} );
     605//-->
     606</script>
    618607<?php
    619608}
    620609
  • wp-admin/js/comment.dev.js

     
    1111
    1212        $('.cancel-timestamp').click(function() {
    1313                $('#timestampdiv').slideUp("normal");
    14                 $('#mm').val($('#hidden_mm').val());
    15                 $('#jj').val($('#hidden_jj').val());
    16                 $('#aa').val($('#hidden_aa').val());
    17                 $('#hh').val($('#hidden_hh').val());
    18                 $('#mn').val($('#hidden_mn').val());
     14                $('#dd').val($('#hidden_dd').val());
     15                $('#tt').val($('#hidden_tt').val());
    1916                $('#timestamp').html(stamp);
    2017                $('.edit-timestamp').show();
    2118                return false;
    2219        });
    2320
    2421        $('.save-timestamp').click(function () { // crazyhorse - multiple ok cancels
    25                 var aa = $('#aa').val(), mm = $('#mm').val(), jj = $('#jj').val(), hh = $('#hh').val(), mn = $('#mn').val(),
    26                         newD = new Date( aa, mm - 1, jj, hh, mn );
     22                var dateRE = new RegExp(commonL10n.date_regexp);
     23                var dateCompOrder = commonL10n.date_components_order.split(',');
     24                var timeRE = new RegExp(commonL10n.time_regexp);
     25       
     26                var dd = $('#dd').val(), tt = $('#tt').val();
     27               
     28                var dateREResult = dateRE.exec(dd);
     29                var timeREResult = timeRE.exec(tt);
     30                if (dateREResult == null || timeREResult == null)
     31                {
     32                        $('.timestamp-wrap', '#timestampdiv').addClass('form-invalid');
     33                        return false;           
     34                }
     35       
     36                var dateCompIndices = new Object();
     37                for (var i = 0; i < dateCompOrder.length; i++)
     38                        dateCompIndices[dateCompOrder[i]] = i + 1;
     39       
     40                var newD = new Date(dateREResult[dateCompIndices.year], dateREResult[dateCompIndices.month] - 1, dateREResult[dateCompIndices.day], timeREResult[1], timeREResult[2]); 
    2741
    28                 if ( newD.getFullYear() != aa || (1 + newD.getMonth()) != mm || newD.getDate() != jj || newD.getMinutes() != mn ) {
     42                if ( newD.getFullYear() != dateREResult[dateCompIndices.year] || (1 + newD.getMonth()) != dateREResult[dateCompIndices.month] || newD.getDate() != dateREResult[dateCompIndices.day] || newD.getMinutes() != timeREResult[2] ) {
    2943                        $('.timestamp-wrap', '#timestampdiv').addClass('form-invalid');
    3044                        return false;
    3145                } else {
     
    3448
    3549                $('#timestampdiv').slideUp("normal");
    3650                $('.edit-timestamp').show();
    37                 $('#timestamp').html(
    38                         commentL10n.submittedOn + ' <b>' +
    39                         $( '#mm option[value="' + mm + '"]' ).text() + ' ' +
    40                         jj + ', ' +
    41                         aa + ' @ ' +
    42                         hh + ':' +
    43                         mn + '</b> '
    44                 );
     51                $('#timestamp').html( commentL10n.submittedOn + ' <b>' + $( '#dd' ).val() + ' @ ' + $( '#tt' ).val() + '</b> ' );
    4552                return false;
    4653        });
    4754});
  • wp-admin/js/post.dev.js

     
    369369
    370370                function updateText() {
    371371                        var attemptedDate, originalDate, currentDate, publishOn, postStatus = $('#post_status'),
    372                                 optPublish = $('option[value="publish"]', postStatus), aa = $('#aa').val(),
    373                                 mm = $('#mm').val(), jj = $('#jj').val(), hh = $('#hh').val(), mn = $('#mn').val();
     372                                optPublish = $('option[value="publish"]', postStatus), dd = $('#dd').val(), tt = $('#tt').val();
    374373
    375                         attemptedDate = new Date( aa, mm - 1, jj, hh, mn );
    376                         originalDate = new Date( $('#hidden_aa').val(), $('#hidden_mm').val() -1, $('#hidden_jj').val(), $('#hidden_hh').val(), $('#hidden_mn').val() );
    377                         currentDate = new Date( $('#cur_aa').val(), $('#cur_mm').val() -1, $('#cur_jj').val(), $('#cur_hh').val(), $('#cur_mn').val() );
     374                        var dateRE = new RegExp(commonL10n.date_regexp);
     375                        var dateCompOrder = commonL10n.date_components_order.split(',');
     376                        var timeRE = new RegExp(commonL10n.time_regexp);
     377                       
     378                        var dateREResult = dateRE.exec(dd);
     379                        var hiddenDateREResult = dateRE.exec( $('#hidden_dd').val() );
     380                        var curDateREResult = dateRE.exec( $('#cur_dd').val() );
     381                        var timeREResult = timeRE.exec(tt);
     382                        var hiddenTimeREResult = timeRE.exec( $('#hidden_tt').val() );
     383                        var curTimeREResult = timeRE.exec( $('#cur_tt').val() );
     384                        if (dateREResult == null || hiddenDateREResult == null || curDateREResult == null
     385                                        || timeREResult == null || hiddenTimeREResult == null || curTimeREResult == null)
     386                        {
     387                                $('.timestamp-wrap', '#timestampdiv').addClass('form-invalid');
     388                                return false;
     389                        }
    378390
    379                         if ( attemptedDate.getFullYear() != aa || (1 + attemptedDate.getMonth()) != mm || attemptedDate.getDate() != jj || attemptedDate.getMinutes() != mn ) {
     391                        var dateCompIndices = new Object();
     392                        for (var i = 0; i < dateCompOrder.length; i++)
     393                                dateCompIndices[dateCompOrder[i]] = i + 1;
     394
     395                        attemptedDate = new Date( dateREResult[dateCompIndices.year], dateREResult[dateCompIndices.month] - 1, dateREResult[dateCompIndices.day], timeREResult[1], timeREResult[2] );
     396                        originalDate = new Date( hiddenDateREResult[dateCompIndices.year], hiddenDateREResult[dateCompIndices.month] - 1, hiddenDateREResult[dateCompIndices.day], hiddenTimeREResult[1], hiddenTimeREResult[2] );
     397                        currentDate = new Date( curDateREResult[dateCompIndices.year], curDateREResult[dateCompIndices.month] - 1, curDateREResult[dateCompIndices.day], curTimeREResult[1], curTimeREResult[2] );
     398
     399                        if ( attemptedDate.getFullYear() != dateREResult[dateCompIndices.year] || (1 + attemptedDate.getMonth()) != dateREResult[dateCompIndices.month] || attemptedDate.getDate() != dateREResult[dateCompIndices.day] || attemptedDate.getMinutes() != timeREResult[2] ) {
    380400                                $('.timestamp-wrap', '#timestampdiv').addClass('form-invalid');
    381401                                return false;
    382402                        } else {
     
    393413                                publishOn = postL10n.publishOnPast;
    394414                                $('#publish').val( postL10n.update );
    395415                        }
    396                         if ( originalDate.toUTCString() == attemptedDate.toUTCString() ) { //hack
     416                        if ( originalDate.getTime() == attemptedDate.getTime() ) {
    397417                                $('#timestamp').html(stamp);
    398418                        } else {
    399                                 $('#timestamp').html(
    400                                         publishOn + ' <b>' +
    401                                         $('option[value="' + $('#mm').val() + '"]', '#mm').text() + ' ' +
    402                                         jj + ', ' +
    403                                         aa + ' @ ' +
    404                                         hh + ':' +
    405                                         mn + '</b> '
    406                                 );
     419                                $('#timestamp').html(publishOn + ' <b>' + $('#dd').val() + ' @ ' + $('#tt').val() + '</b>' );
    407420                        }
    408421
    409422                        if ( $('input:radio:checked', '#post-visibility-select').val() == 'private' ) {
     
    496509
    497510                $('.cancel-timestamp', '#timestampdiv').click(function() {
    498511                        $('#timestampdiv').slideUp('fast');
    499                         $('#mm').val($('#hidden_mm').val());
    500                         $('#jj').val($('#hidden_jj').val());
    501                         $('#aa').val($('#hidden_aa').val());
    502                         $('#hh').val($('#hidden_hh').val());
    503                         $('#mn').val($('#hidden_mn').val());
     512                        $('#dd').val($('#hidden_dd').val());
     513                        $('#tt').val($('#hidden_tt').val());
    504514                        $('#timestampdiv').siblings('a.edit-timestamp').show();
    505515                        updateText();
    506516                        return false;
  • wp-admin/js/common.dev.js

     
    410410});
    411411
    412412})(jQuery);
     413
     414function setupDateAndTimePickers(useContext, context) {
     415        var ctx = null;
     416        if (useContext === true)
     417                ctx = jQuery(context);
     418
     419        jQuery('.datepicker', ctx).datepicker( {
     420                dateFormat: commonL10n.datePicker_dateFormat,
     421                firstDay: commonL10n.datePicker_firstDay
     422        } );
     423       
     424        jQuery('.timepicker', ctx).timepicker( {
     425                hourText: commonL10n.timePicker_hourText,
     426                minuteText: commonL10n.timePicker_minuteText,
     427                showPeriodLabels: false,
     428                minutes: {
     429                        starts: 0,
     430                        ends: 0,
     431                        interval: 1
     432                },
     433                rows: 6
     434        } );
     435}
  • wp-admin/js/inline-edit-post.dev.js

     
    129129                if ( typeof(id) == 'object' )
    130130                        id = t.getId(id);
    131131
    132                 fields = ['post_title', 'post_name', 'post_author', '_status', 'jj', 'mm', 'aa', 'hh', 'mn', 'ss', 'post_password', 'post_format'];
     132                fields = ['post_title', 'post_name', 'post_author', '_status', 'dd', 'tt', 'ss', 'post_password', 'post_format'];
    133133                if ( t.type == 'page' )
    134134                        fields.push('post_parent', 'menu_order', 'page_template');
    135135
     
    215215                $(editRow).attr('id', 'edit-'+id).addClass('inline-editor').show();
    216216                $('.ptitle', editRow).focus();
    217217
     218                setupDateAndTimePickers(true, editRow);
     219
    218220                return false;
    219221        },
    220222
  • wp-admin/admin-header.php

     
    4343
    4444wp_enqueue_style( 'colors' );
    4545wp_enqueue_style( 'ie' );
     46wp_enqueue_style( 'jquery-ui-core' );
     47wp_enqueue_style( 'jquery-ui-theme' );
     48wp_enqueue_style( 'jquery-ui-timepicker' );
     49wp_enqueue_style( 'jquery-ui-datepicker' );
    4650wp_enqueue_script('utils');
     51wp_enqueue_script( 'jquery-ui-timepicker' );
     52wp_enqueue_script( 'jquery-ui-datepicker' );
     53wp_enqueue_script( 'jquery-ui-datepicker-i18n' );
    4754
    4855$admin_body_class = preg_replace('/[^a-z0-9_-]+/i', '-', $hook_suffix);
    4956?>
  • wp-admin/css/wp-admin.dev.css

     
    26132613        float: left;
    26142614}
    26152615
    2616 .inline-edit-row fieldset input[name=jj],
    2617 .inline-edit-row fieldset input[name=hh],
    2618 .inline-edit-row fieldset input[name=mn] {
     2616.inline-edit-row fieldset input[name=dd] {
    26192617        font-size: 12px;
    2620         width: 2.1em;
     2618        width: 10.1em;
    26212619}
    26222620
     2621.inline-edit-row fieldset input[name=tt] {
     2622        font-size: 12px;
     2623        width: 5.1em;
     2624}
     2625
    26232626.inline-edit-row fieldset input[name=aa] {
    26242627        font-size: 12px;
    26252628        width: 3.5em;
     
    31363139        vertical-align: top;
    31373140}
    31383141
    3139 #jj, #hh, #mn {
    3140         width: 2em;
     3142#dd {
     3143        width: 10em;
    31413144        padding: 1px;
    31423145        font-size: 12px;
    31433146}
    31443147
     3148#tt {
     3149        width: 5em;
     3150        padding: 1px;
     3151        font-size: 12px;
     3152}
     3153
    31453154#aa {
    31463155        width: 3.4em;
    31473156        padding: 1px;