WordPress.org

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, 3 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;