WordPress.org

Make WordPress Core

Ticket #16215: 16215+23497.diff

File 16215+23497.diff, 75.7 KB (added by adamsilverstein, 13 months ago)

combined patch for testing

  • wp-includes/default-filters.php

     
    250250add_action( 'plugins_loaded',             'wp_maybe_load_widgets',                    0    ); 
    251251add_action( 'plugins_loaded',             'wp_maybe_load_embeds',                     0    ); 
    252252add_action( 'shutdown',                   'wp_ob_end_flush_all',                      1    ); 
    253 add_action( 'pre_post_update',            'wp_save_post_revision',                   10, 2 ); 
     253add_action( 'pre_post_update',            'wp_save_post_revision',                   10, 1 ); 
     254add_action( 'post_updated',               'wp_save_post_revision',                   10, 1 ); 
    254255add_action( 'publish_post',               '_publish_post_hook',                       5, 1 ); 
    255256add_action( 'transition_post_status',     '_transition_post_status',                  5, 3 ); 
    256257add_action( 'transition_post_status',     '_update_term_count_on_transition_post_status', 10, 3 ); 
  • wp-includes/post-template.php

     
    13061306        if ( !in_array( $revision->post_type, array( 'post', 'page', 'revision' ) ) ) 
    13071307                return false; 
    13081308 
     1309        /* translators: revision date format, see http://php.net/date */ 
     1310        $datef = _x( 'j F, Y @ G:i', 'revision date format'); 
     1311        /* translators: 1: date */ 
     1312        $autosavef = __( '%1$s [Autosave]' ); 
     1313        /* translators: 1: date */ 
     1314        $currentf  = __( '%1$s [Current Revision]' ); 
     1315 
     1316        $date = date_i18n( $datef, strtotime( $revision->post_modified ) ); 
     1317        if ( $link && current_user_can( 'edit_post', $revision->ID ) && $link = get_edit_post_link( $revision->ID ) ) 
     1318                $date = "<a href='$link'>$date</a>"; 
     1319 
     1320        if ( !wp_is_post_revision( $revision ) ) 
     1321                $date = sprintf( $currentf, $date ); 
     1322        elseif ( wp_is_post_autosave( $revision ) ) 
     1323                $date = sprintf( $autosavef, $date ); 
     1324 
     1325        return $date; 
     1326} 
     1327 
     1328/** 
     1329 * Retrieve formatted date timestamp of a revision (linked to that revisions's page). 
     1330 * 
     1331 * @package WordPress 
     1332 * @subpackage Post_Revisions 
     1333 * @since 3.6.0 
     1334 * 
     1335 * @uses date_i18n() 
     1336 * 
     1337 * @param int|object $revision Revision ID or revision object. 
     1338 * @param bool $link Optional, default is true. Link to revisions's page? 
     1339 * @return string gravatar, user, i18n formatted datetimestamp or localized 'Current Revision'. 
     1340 */ 
     1341function wp_post_revision_title_expanded( $revision, $link = true ) { 
     1342        if ( !$revision = get_post( $revision ) ) 
     1343                return $revision; 
     1344 
     1345        if ( !in_array( $revision->post_type, array( 'post', 'page', 'revision' ) ) ) 
     1346                return false; 
     1347 
    13091348        $author = get_the_author_meta( 'display_name', $revision->post_author ); 
    13101349        /* translators: revision date format, see http://php.net/date */ 
    13111350        $datef = _x( 'j F, Y @ G:i:s', 'revision date format'); 
    13121351 
    1313         $gravatar = get_avatar( $revision->post_author, 18 ); 
     1352        $gravatar = get_avatar( $revision->post_author, 24 ); 
    13141353 
    13151354        $date = date_i18n( $datef, strtotime( $revision->post_modified ) ); 
    13161355        if ( $link && current_user_can( 'edit_post', $revision->ID ) && $link = get_edit_post_link( $revision->ID ) ) 
     
    13881427        } 
    13891428 
    13901429        /* translators: post revision: 1: when, 2: author name */ 
    1391         $titlef = _x( '%1$s by %2$s', 'post revision' ); 
     1430        $titlef = _x( '%1$s', 'post revision' ); 
    13921431 
    13931432        if ( $parent ) 
    13941433                array_unshift( $revisions, $post ); 
    13951434 
     1435        // since 3.6 revisions include a copy of the current post data as a revision 
     1436        // the collowing removes this current revision if present from the list of 
     1437        // revisions returned by wp_list_post_revisions, remove these to include the 
     1438        // crrent post revision in the list of revisions 
     1439        if ( wp_first_revision_matches_current_version( $post_id ) ) 
     1440                array_pop( $revisions ); 
     1441 
    13961442        $rows = $right_checked = ''; 
    13971443        $class = false; 
    13981444        $can_edit_post = current_user_can( 'edit_post', $post->ID ); 
     
    14021448                if ( 'revision' === $type && wp_is_post_autosave( $revision ) ) 
    14031449                        continue; 
    14041450 
    1405                 $date = wp_post_revision_title( $revision ); 
    1406                 $name = get_the_author_meta( 'display_name', $revision->post_author ); 
     1451                $date = wp_post_revision_title_expanded( $revision ); 
    14071452 
    1408                 if ( 'form-table' == $format ) { 
    1409                         if ( $left ) 
    1410                                 $left_checked = $left == $revision->ID ? ' checked="checked"' : ''; 
    1411                         else 
    1412                                 $left_checked = $right_checked ? ' checked="checked"' : ''; // [sic] (the next one) 
    1413                         $right_checked = $right == $revision->ID ? ' checked="checked"' : ''; 
     1453                $title = sprintf( $titlef, $date ); 
     1454                $rows .= "\t<li>$title</li>\n"; 
    14141455 
    1415                         $class = $class ? '' : " class='alternate'"; 
    14161456 
    1417                         if ( $post->ID != $revision->ID && $can_edit_post ) 
    1418                                 $actions = '<a href="' . wp_nonce_url( add_query_arg( array( 'revision' => $revision->ID, 'action' => 'restore' ) ), "restore-post_$post->ID|$revision->ID" ) . '">' . __( 'Restore' ) . '</a>'; 
    1419                         else 
    1420                                 $actions = ''; 
    1421  
    1422                         $rows .= "<tr$class>\n"; 
    1423                         $rows .= "\t<th style='white-space: nowrap' scope='row'><input type='radio' name='left' value='$revision->ID'$left_checked /></th>\n"; 
    1424                         $rows .= "\t<th style='white-space: nowrap' scope='row'><input type='radio' name='right' value='$revision->ID'$right_checked /></th>\n"; 
    1425                         $rows .= "\t<td>$date</td>\n"; 
    1426                         $rows .= "\t<td>$name</td>\n"; 
    1427                         $rows .= "\t<td class='action-links'>$actions</td>\n"; 
    1428                         $rows .= "</tr>\n"; 
    1429                 } else { 
    1430                         $title = sprintf( $titlef, $date, $name ); 
    1431                         $rows .= "\t<li>$title</li>\n"; 
    1432                 } 
    14331457        } 
    14341458 
    14351459        if ( 'form-table' == $format ) : ?> 
     
    14791503                // if the post was previously restored from a revision 
    14801504                // show the restore event details 
    14811505                // 
    1482                 if ( $restored_from_meta = get_post_meta( $post->ID, '_post_restored_from', true ) ) {  
    1483                         $author = get_the_author_meta( 'display_name', $restored_from_meta[ 'restored_by_user' ] );  
    1484                         /* translators: revision date format, see http://php.net/date */  
    1485                         $datef = _x( 'j F, Y @ G:i:s', 'revision date format');  
    1486                         $date = date_i18n( $datef, strtotime( $restored_from_meta[ 'restored_time' ] ) );  
    1487                         $timesince = human_time_diff( $restored_from_meta[ 'restored_time' ], current_time( 'timestamp' ) );  
    1488                         ?>  
     1506                if ( $restored_from_meta = get_post_meta( $post->ID, '_post_restored_from', true ) ) { 
     1507                        $author = get_the_author_meta( 'display_name', $restored_from_meta[ 'restored_by_user' ] ); 
     1508                        /* translators: revision date format, see http://php.net/date */ 
     1509                        $datef = _x( 'j F, Y @ G:i:s', 'revision date format'); 
     1510                        $date = date_i18n( $datef, strtotime( $restored_from_meta[ 'restored_time' ] ) ); 
     1511                        $timesince = human_time_diff( $restored_from_meta[ 'restored_time' ], current_time( 'timestamp' ) ) ; 
     1512                        ?> 
    14891513                        <hr /> 
    1490                         <div id="revisions-meta-restored">  
    1491                                 <?php  
     1514                        <div id="revisions-meta-restored"> 
     1515                                <?php 
    14921516                                /* translators: restored revision details: 1: revision ID, 2: time ago, 3: author name, 4: date */ 
    1493                                 printf( _x( 'Previously restored from revision ID %1$d, %2$s ago by %3$s (%4$s)', 'restored revision details' ),  
    1494                                 $restored_from_meta[ 'restored_revision_id'],  
    1495                                 $timesince,  
    1496                                 $author,  
    1497                                 $date );  
    1498                                 ?>  
    1499                         </div>  
    1500                         <?php  
     1517                                printf( _x( 'Previously restored from revision ID %1$d, %2$s ago by %3$s (%4$s)', 'restored revision details' ), 
     1518                                $restored_from_meta[ 'restored_revision_id'], 
     1519                                $timesince, 
     1520                                $author, 
     1521                                $date ); 
     1522                                ?> 
     1523                        </div> 
     1524                        <?php 
    15011525                echo "</ul>"; 
    1502                 }  
     1526                } 
    15031527 
    15041528        endif; 
    15051529 
  • wp-includes/post.php

     
    28222822                $wpdb->update( $wpdb->posts, array( 'post_name' => $data['post_name'] ), $where ); 
    28232823        } 
    28242824 
     2825        if ( 'revision' !== $post_type ) 
     2826                update_post_meta( $post_ID, '_edit_last', $user_ID ); 
     2827 
    28252828        if ( is_object_in_taxonomy($post_type, 'category') ) 
    28262829                wp_set_post_categories( $post_ID, $post_category ); 
    28272830 
  • wp-includes/revision.php

     
    5252        $return['post_parent']   = $post['ID']; 
    5353        $return['post_status']   = 'inherit'; 
    5454        $return['post_type']     = 'revision'; 
    55         $return['post_name']     = $autosave ? "$post[ID]-autosave" : "$post[ID]-revision"; 
     55        $return['post_name']     = $autosave ? "$post[ID]-1-autosave" : "$post[ID]-1-revision"; // "1" is the revisioning system version 
    5656        $return['post_date']     = isset($post['post_modified']) ? $post['post_modified'] : ''; 
    5757        $return['post_date_gmt'] = isset($post['post_modified_gmt']) ? $post['post_modified_gmt'] : ''; 
     58        $return['post_author']   = get_post_meta( $post['ID'], '_edit_last', true ); 
    5859 
    5960        return $return; 
    6061} 
     
    6263/** 
    6364 * Saves an already existing post as a post revision. 
    6465 * 
    65  * Typically used immediately prior to post updates. 
     66 * Typically used immediately prior and after post updates. 
     67 * Prior to update checks for old revision data (latest revision != current post before update) and adds a copy of the current post as a revision if missing 
     68 * After update adds a copy of the current post as a revision, so latest revision always matches current post 
    6669 * 
    6770 * @package WordPress 
    6871 * @subpackage Post_Revisions 
    6972 * @since 2.6.0 
    7073 * 
    7174 * @uses _wp_put_post_revision() 
     75 * @uses wp_first_revision_matches_current_version() 
    7276 * 
    7377 * @param int $post_id The ID of the post to save as a revision. 
    7478 * @return mixed Null or 0 if error, new revision ID, if success. 
    7579 */ 
    76 function wp_save_post_revision( $post_id, $new_data = null ) { 
    77         // We do autosaves manually with wp_create_post_autosave() 
     80function wp_save_post_revision( $post_id ) { 
     81        //check to see if the post's first revision already matches the post data 
     82        //should be true before post update, _except_ for old data which 
     83        //doesn't include a copy of the current post data in revisions 
     84        if ( wp_first_revision_matches_current_version( $post_id ) ) 
     85                return; 
     86 
    7887        if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) 
    7988                return; 
    8089 
     
    8291        if ( ! WP_POST_REVISIONS ) 
    8392                return; 
    8493 
    85         if ( !$post = get_post( $post_id, ARRAY_A ) ) 
     94        if ( ! $post = get_post( $post_id, ARRAY_A ) ) 
    8695                return; 
    8796 
    8897        if ( 'auto-draft' == $post['post_status'] ) 
    8998                return; 
    9099 
    91         if ( !post_type_supports($post['post_type'], 'revisions') ) 
     100        if ( ! post_type_supports( $post['post_type'], 'revisions' ) ) 
    92101                return; 
    93102 
    94         // if new data is supplied, check that it is different from last saved revision, unless a plugin tells us to always save regardless 
    95         if ( apply_filters( 'wp_save_post_revision_check_for_changes', true, $post, $new_data ) && is_array( $new_data ) ) { 
    96                 $post_has_changed = false; 
    97                 foreach ( array_keys( _wp_post_revision_fields() ) as $field ) { 
    98                         if ( normalize_whitespace( $new_data[ $field ] ) != normalize_whitespace( $post[ $field ] ) ) { 
    99                                 $post_has_changed = true; 
    100                                 break; 
     103        // compare the proposed update with the last stored revision, verify 
     104        // different, unless a plugin tells us to always save regardless 
     105        if ( $revisions = wp_get_post_revisions( $post_id ) ) { // grab the last revision 
     106                $last_revision = array_shift( $revisions ); 
     107 
     108                if ( $last_revision_array = get_post( $last_revision->ID, ARRAY_A ) ) { //if no previous revisions, save one for sure 
     109 
     110                        if ( apply_filters( 'wp_save_post_revision_check_for_changes', true, $last_revision_array, $post ) && is_array( $post ) ) { 
     111                                $post_has_changed = false; 
     112 
     113                                foreach ( array_keys( _wp_post_revision_fields() ) as $field ) { 
     114 
     115                                        if ( normalize_whitespace( $post[ $field ] ) != normalize_whitespace( $last_revision_array[ $field ] ) ) { 
     116                                                $post_has_changed = true; 
     117                                                break; 
     118 
     119                                        } 
     120                                } 
     121 
     122                                //don't save revision if post unchanged 
     123                                if( ! $post_has_changed ) 
     124                                        return; 
    101125                        } 
    102126                } 
    103                 //don't save revision if post unchanged 
    104                 if( ! $post_has_changed ) 
    105                         return; 
    106127        } 
    107128 
    108129        $return = _wp_put_post_revision( $post ); 
    109130 
    110131        // WP_POST_REVISIONS = true (default), -1 
    111         if ( !is_numeric( WP_POST_REVISIONS ) || WP_POST_REVISIONS < 0 ) 
     132        if ( ! is_numeric( WP_POST_REVISIONS ) || WP_POST_REVISIONS < 0 ) 
    112133                return $return; 
    113134 
    114135        // all revisions and (possibly) one autosave 
    115136        $revisions = wp_get_post_revisions( $post_id, array( 'order' => 'ASC' ) ); 
    116137 
    117138        // WP_POST_REVISIONS = (int) (# of autosaves to save) 
    118         $delete = count($revisions) - WP_POST_REVISIONS; 
     139        $delete = count( $revisions ) - WP_POST_REVISIONS; 
    119140 
    120141        if ( $delete < 1 ) 
    121142                return $return; 
     
    123144        $revisions = array_slice( $revisions, 0, $delete ); 
    124145 
    125146        for ( $i = 0; isset($revisions[$i]); $i++ ) { 
    126                 if ( false !== strpos( $revisions[$i]->post_name, 'autosave' ) ) 
     147                if ( false !== strpos( $revisions[ $i ]->post_name, 'autosave' ) ) 
    127148                        continue; 
    128                 wp_delete_post_revision( $revisions[$i]->ID ); 
     149                wp_delete_post_revision( $revisions[ $i ]->ID ); 
    129150        } 
    130151 
    131152        return $return; 
     
    142163 * @subpackage Post_Revisions 
    143164 * @since 2.6.0 
    144165 * @uses wp_get_post_revisions() 
    145  *   
     166 * 
    146167 * @param int $post_id The post ID. 
    147168 * @param int $user_id optional The post author ID. 
    148169 * @return object|bool The autosaved data or false on failure or when no autosave exists. 
     
    316337        if ( $post_id ) 
    317338                do_action( 'wp_restore_post_revision', $post_id, $revision['ID'] ); 
    318339 
     340        //store revision event in post meta 
     341        $restore_details = array( 
     342                'restored_revision_id' => $revision_id, 
     343                'restored_by_user' => get_current_user_id(), 
     344                'restored_time' => time() 
     345        ); 
     346        update_post_meta( $post_id, '_post_restored_from', $restore_details ); 
     347        update_post_meta( $post_id, '_edit_last', get_current_user_id() ); 
     348 
    319349        return $post_id; 
    320350} 
    321351 
     
    393423        return $post; 
    394424} 
    395425 
     426function _wp_get_post_revision_version( $post ) { 
     427        if ( is_array( $post ) ) { 
     428                if ( ! isset( $post['post_name'] ) ) { 
     429                        return false; 
     430                } 
     431 
     432                $name = $post['post_name']; 
     433        } elseif ( is_object( $post ) ) { 
     434                if ( ! isset( $post->post_name ) ) { 
     435                        return false; 
     436                } 
     437 
     438                $name = $post->post_name; 
     439        } else { 
     440                return false; 
     441        } 
     442 
     443        if ( ! preg_match( '/^([\d-]+)(?:autosave|revision)(?:-\d+)*$/', $name, $matches ) ) { 
     444                return false; 
     445        } 
     446 
     447        $parts = explode( '-', trim( $matches[1], '-' ) ); 
     448 
     449        if ( 2 !== count( $parts ) ) { 
     450                return 0; 
     451        } 
     452 
     453        return (int) $parts[1]; 
     454} 
     455 
     456function _wp_upgrade_revisions_of_post( $post ) { 
     457        global $wpdb; 
     458 
     459        $post = get_post( $post ); 
     460        if ( ! $post ) 
     461                return false; 
     462 
     463        if ( ! post_type_supports( $post->post_type, 'revisions' ) ) 
     464                return false; 
     465 
     466        $revisions = wp_get_post_revisions( $post->ID ); // array( 'order' => 'DESC', 'orderby' => 'date' ); // Always work from most recent to oldest 
     467 
     468        if ( ! $revisions ) 
     469                return true; 
     470 
     471        // Add post option exclusively 
     472        $lock      = "revision-upgrade-{$post->ID}"; 
     473        $locked_at = time(); 
     474        $result = $wpdb->query( $wpdb->prepare( "INSERT IGNORE INTO `$wpdb->options` (`option_name`, `option_value`, `autoload`) VALUES (%s, %s, 'no') /* LOCK */", $lock, $locked_at ) ); 
     475        if ( ! $result ) { 
     476                // If we couldn't get a lock, see how old the previous lock is 
     477                $locked_at = get_option( $lock ); 
     478                if ( !$locked_at ) { 
     479                        // Can't write to the lock, and can't read the lock. 
     480                        // Something broken has happened 
     481                        return false; 
     482                } 
     483 
     484                if ( $lock_at < time() - 3600 ) { 
     485                        // Lock is too old - try again 
     486                        delete_option( $lock ); 
     487                        return wp_upgrade_revisions_of_post( $post ); 
     488                } 
     489 
     490                // Lock is not too old: some other process may be upgrading this post.  Bail. 
     491                return; 
     492        } else { 
     493                // If we could get a lock, re-"add" the option to fire all the correct filters. 
     494                add_option( $lock, $locked_at ); 
     495        } 
     496 
     497        $success = true; 
     498 
     499        reset( $revisions ); 
     500        do { 
     501                $this_revision = current( $revisions ); 
     502                $prev_revision = next( $revisions ); 
     503 
     504                $this_revision_version = _wp_get_post_revision_version( $this_revision ); 
     505 
     506                // Something terrible happened 
     507                if ( false === $this_revision_version ) 
     508                        continue; 
     509 
     510                // 1 is the latest revision version, so we're already up to date 
     511                if ( 0 < $this_revision_version ) 
     512                        continue; 
     513 
     514                // This revision is the oldest revision of the post. 
     515                // The correct post_author is probably $post->post_author, but that's only a good guess. 
     516                // Leave un-upgraded.  Will be caught by get_modified_post_author() on display. 
     517                if ( ! $prev_revision ) { 
     518                        continue; 
     519                } 
     520 
     521                $prev_revision_version = _wp_get_post_revision_version( $prev_revision ); 
     522 
     523                // If the previous revision is already up to date, it no longer has the information we need :( 
     524                if ( 0 < $prev_revision_version ) { 
     525                        continue; 
     526                } 
     527 
     528                // Upgrade this revision 
     529 
     530                // Cast as object so that wp_update_post() handles slashing for us 
     531                $update = (object) array( 
     532                        'ID'          => $this_revision->ID, 
     533                        'post_name'   => preg_replace( '/^(\d+)(?:-0)?-/', '\\1-1-', $this_revision->post_name ), 
     534                        'post_author' => $prev_revision->post_author, 
     535                ); 
     536 
     537                $result = wp_update_post( $update ); 
     538                if ( ! $result || is_wp_error( $result ) ) { 
     539                        // Wilhelm! 
     540                        $success = false; 
     541                        break; 
     542                } 
     543        } while ( $prev_revision ); 
     544 
     545        delete_option( $lock ); 
     546        return true; 
     547} 
     548 
     549 
    396550function _show_post_preview() { 
    397551 
    398552        if ( isset($_GET['preview_id']) && isset($_GET['preview_nonce']) ) { 
     
    404558                add_filter('the_preview', '_set_preview'); 
    405559        } 
    406560} 
     561 
     562/** 
     563 * Determines if the specified post's most recent revision matches the post (by checking post_modified). 
     564 * 
     565 * @package WordPress 
     566 * @subpackage Post_Revisions 
     567 * @since 3.6.0 
     568 * 
     569 * @param int|object $post Post ID or post object. 
     570 * @return bool false if not a match, otherwise true. 
     571 */ 
     572function wp_first_revision_matches_current_version( $post ) { 
     573 
     574        if ( ! $post = get_post( $post ) ) 
     575                return false; 
     576 
     577        if ( ! $revisions = wp_get_post_revisions( $post->ID ) ) 
     578                return false; 
     579 
     580        $last_revision = array_shift( $revisions ); 
     581 
     582        if ( ! ($last_revision->post_modified == $post->post_modified ) ) 
     583                return false; 
     584 
     585        return true; 
     586} 
  • wp-includes/author-template.php

     
    6161/** 
    6262 * Retrieve the author who last edited the current post. 
    6363 * 
     64 * As of WordPress 3.6, returns the display name of the user who created the revision if called on a revision object. 
     65 * 
    6466 * @since 2.8 
    65  * @uses $post The current post's DB object. 
    6667 * @uses get_post_meta() Retrieves the ID of the author who last edited the current post. 
    6768 * @uses get_userdata() Retrieves the author's DB object. 
    6869 * @uses apply_filters() Calls 'the_modified_author' hook on the author display name. 
     70 * 
     71 * @param mixed $post_id Post ID, WP_Post, or falsey to use the current post. 
    6972 * @return string The author's display name. 
    7073 */ 
    71 function get_the_modified_author() { 
    72         if ( $last_id = get_post_meta( get_post()->ID, '_edit_last', true) ) { 
    73                 $last_user = get_userdata($last_id); 
    74                 return apply_filters('the_modified_author', $last_user->display_name); 
     74function get_the_modified_author( $post_id = 0 ) { 
     75        $post = get_post( $post_id ); 
     76        if ( ! $post ) 
     77                return; 
     78 
     79        $unknown = false; 
     80 
     81        if ( 'revision' === $post->post_type ) { 
     82                // _wp_get_post_revision_version() can return false 
     83                $revision_version = _wp_get_post_revision_version( $post ); 
     84                if ( false === $revision_version ) { 
     85                        // False means something horrible happened.  Just return something. 
     86                        $modified_author_id = $post->post_author; 
     87                } elseif ( 0 === $revision_version ) { 
     88                        // Set as fallback 
     89                        $modified_author_id = $post->post_author; 
     90 
     91                        $revisions = wp_get_post_revisions( $post->post_parent ); 
     92                        reset( $revisions ); 
     93                        do { 
     94                                $this_revision = current( $revisions ); 
     95                                $prev_revision = next( $revisions ); // Ordered DESC 
     96 
     97                                if ( $post->ID == $this_revision->ID && $prev_revision ) { 
     98                                        $prev_revision_version = _wp_get_post_revision_version( $prev_revision ); 
     99                                        if ( 0 === $prev_revision_version ) { 
     100                                                $modified_author_id = $prev_revision->post_author; 
     101                                        } else { 
     102                                                $unknown = true; 
     103                                        } 
     104                                        break; 
     105                                } 
     106                        } while ( $prev_revision ); 
     107                } else { 
     108                        // Everything is up to date 
     109                        $modified_author_id = $post->post_author; 
     110                } 
     111        } else { 
     112                $modified_author_id = get_post_meta( $post->ID, '_edit_last', true ); 
    75113        } 
     114 
     115        if ( ! $modified_author_id ) 
     116                return; 
     117 
     118        $modified_author = get_userdata( $modified_author_id ); 
     119 
     120        $display_name = $modified_author->display_name; 
     121        if ( $unknown ) { 
     122                $display_name = sprintf( _x( '%1$s?', 'Unknown revision author name: %1$s = display_name of best guess at author' ), $display_name ); 
     123        } 
     124 
     125        return apply_filters( 'the_modified_author', $display_name ); 
    76126} 
    77127 
    78128/** 
  • wp-includes/pluggable.php

     
    17441744        return $r; 
    17451745} 
    17461746endif; 
     1747 
     1748if ( !function_exists( 'wp_text_diff_with_count' ) ) : 
     1749/** 
     1750 * Displays a human readable HTML representation of the difference between two strings. 
     1751 * similar to wp_text_diff, but tracks and returns could of lines added and removed 
     1752 * 
     1753 * @since 3.6 
     1754 * @see wp_parse_args() Used to change defaults to user defined settings. 
     1755 * @uses Text_Diff 
     1756 * @uses WP_Text_Diff_Renderer_Table 
     1757 * 
     1758 * @param string $left_string "old" (left) version of string 
     1759 * @param string $right_string "new" (right) version of string 
     1760 * @param string|array $args Optional. Change 'title', 'title_left', and 'title_right' defaults. 
     1761 * @return array contains html, linesadded & linesdeletd, empty string if strings are equivalent. 
     1762 */ 
     1763function wp_text_diff_with_count( $left_string, $right_string, $args = null ) { 
     1764        $defaults = array( 'title' => '', 'title_left' => '', 'title_right' => '' ); 
     1765        $args = wp_parse_args( $args, $defaults ); 
     1766 
     1767        if ( !class_exists( 'WP_Text_Diff_Renderer_Table' ) ) 
     1768                        require( ABSPATH . WPINC . '/wp-diff.php' ); 
     1769 
     1770        $left_string  = normalize_whitespace( $left_string ); 
     1771        $right_string = normalize_whitespace( $right_string ); 
     1772 
     1773        $left_lines  = explode( "\n", $left_string ); 
     1774        $right_lines = explode( "\n", $right_string) ; 
     1775 
     1776        $text_diff = new Text_Diff($left_lines, $right_lines  ); 
     1777        $linesadded = $text_diff->countAddedLines(); 
     1778        $linesdeleted = $text_diff->countDeletedLines(); 
     1779 
     1780        $renderer  = new WP_Text_Diff_Renderer_Table(); 
     1781        $diff = $renderer->render( $text_diff ); 
     1782 
     1783        if ( !$diff ) 
     1784                        return ''; 
     1785 
     1786                $r  = "<table class='diff'>\n"; 
     1787 
     1788        if ( ! empty( $args[ 'show_split_view' ] ) ) { 
     1789                $r .= "<col class='content diffsplit left' /><col class='content diffsplit middle' /><col class='content diffsplit right' />"; 
     1790        } else { 
     1791                $r .= "<col class='content' />"; 
     1792        } 
     1793 
     1794        if ( $args['title'] || $args['title_left'] || $args['title_right'] ) 
     1795                $r .= "<thead>"; 
     1796        if ( $args['title'] ) 
     1797                $r .= "<tr class='diff-title'><th colspan='4'>$args[title]</th></tr>\n"; 
     1798        if ( $args['title_left'] || $args['title_right'] ) { 
     1799                $r .= "<tr class='diff-sub-title'>\n"; 
     1800                $r .= "\t<td></td><th>$args[title_left]</th>\n"; 
     1801                $r .= "\t<td></td><th>$args[title_right]</th>\n"; 
     1802                $r .= "</tr>\n"; 
     1803        } 
     1804        if ( $args['title'] || $args['title_left'] || $args['title_right'] ) 
     1805                $r .= "</thead>\n"; 
     1806 
     1807        $r .= "<tbody>\n$diff\n</tbody>\n"; 
     1808        $r .= "</table>"; 
     1809 
     1810        return array( 'html' => $r, 'linesadded' => $linesadded, 'linesdeleted' => $linesdeleted ); 
     1811        } 
     1812        endif; 
  • wp-includes/script-loader.php

     
    273273        $scripts->add( 'template', "/wp-includes/js/template$suffix.js", array('underscore'), '1.4.4', 1 ); 
    274274        $scripts->add( 'backbone', '/wp-includes/js/backbone.min.js', array('underscore','jquery', 'template'), '0.9.10', 1 ); 
    275275 
    276         $scripts->add( 'revisions', "/wp-admin/js/revisions$suffix.js", array( 'backbone', 'jquery-ui-slider' ), false, 1 ); 
     276        $scripts->add( 'revisions', "/wp-admin/js/revisions$suffix.js", array( 'backbone', 'jquery-ui-slider', 'jquery-ui-tooltip' ), false, 1 ); 
    277277 
    278278        $scripts->add( 'imgareaselect', "/wp-includes/js/imgareaselect/jquery.imgareaselect$suffix.js", array('jquery'), '0.9.8', 1 ); 
    279279 
  • wp-admin/includes/ajax-actions.php

     
    21232123        /* translators: revision date format, see http://php.net/date */ 
    21242124        $datef = _x( 'j F, Y @ G:i:s', 'revision date format'); 
    21252125 
     2126        $left_revision = get_post( $compare_to ); 
     2127 
    21262128        //single model fetch mode 
     2129        //return the diff of a single revision comparison 
    21272130        if ( 0 != $single_revision_id ) { 
    2128                 $left_revision = get_post( $compare_to ); 
    21292131                $right_revision = get_post( $single_revision_id ); 
    21302132 
    2131                 if ( $compare_two_mode ) { 
    2132                         $compare_to_gravatar = get_avatar( $left_revision->post_author, 18 ); 
    2133                         $compare_to_author = get_the_author_meta( 'display_name', $left_revision->post_author ); 
    2134                         $compare_to_date = date_i18n( $datef, strtotime( $left_revision->post_modified ) ); 
    2135  
    2136                         $revision_from_date_author = sprintf( 
    2137                                 /* translators: post revision title: 1: author avatar, 2: author name, 3: time ago, 4: date */ 
    2138                                 _x( '%1$s %2$s, %3$s ago (%4$s)', 'post revision title' ), 
    2139                                 $compare_to_gravatar, 
    2140                                 $compare_to_author, 
    2141                                 human_time_diff( strtotime( $left_revision->post_modified ), current_time( 'timestamp' ) ), 
    2142                                 $compare_to_date 
    2143                         ); 
    2144                 } 
    2145  
    21462133                // 
    21472134                //make sure the left revision is the most recent 
    21482135                // 
     2136 
    21492137                if ( strtotime( $right_revision->post_modified_gmt ) < strtotime( $left_revision->post_modified_gmt ) ) { 
    21502138                        $temp = $left_revision; 
    21512139                        $left_revision = $right_revision; 
    21522140                        $right_revision = $temp; 
    21532141                } 
    21542142 
     2143                $linesadded=0; 
     2144                $linesdeleted=0; 
     2145 
    21552146                // 
    21562147                //compare from left to right, passed from application 
    21572148                // 
     
    21672158                        if ( ! empty( $show_split_view ) ) 
    21682159                                 $args = array( 'show_split_view' => true ); 
    21692160 
    2170                         $content .= wp_text_diff( $left_content, $right_content, $args ); 
     2161                        $diff = wp_text_diff_with_count( $left_content, $right_content, $args ); 
     2162 
     2163                        if ( isset( $diff[ 'html' ] ) ) 
     2164                                $content .= $diff[ 'html' ]; 
     2165 
     2166                        if ( isset( $diff[ 'linesadded' ] ) ) 
     2167                                $linesadded = $linesadded + $diff[ 'linesadded' ]; 
     2168 
     2169                        if ( isset( $diff[ 'linesdeleted' ] ) ) 
     2170                                $linesdeleted = $linesdeleted + $diff[ 'linesdeleted' ]; 
     2171 
     2172 
    21712173                } 
    2172                         $content = '' == $content ? __( 'No difference' ) : $content; 
    2173                         $alltherevisions = array ( 
    2174                                 'revisiondiff' => $content 
    2175                         ); 
     2174                $content = '' == $content ? __( 'No difference' ) : $content; 
     2175 
     2176                $alltherevisions = array ( 
     2177                        'revisiondiff' => $content, 
     2178                        'lines_deleted' => $linesdeleted, 
     2179                        'lines_added' => $linesadded 
     2180                ); 
    21762181                echo json_encode( $alltherevisions ); 
    21772182                exit(); 
    2178         } 
     2183        } //end single model fetch 
    21792184 
     2185        //fetch the list of revisions available 
     2186 
    21802187        //if we are comparing two revisions, the first 'revision' represented by the leftmost 
    21812188        //slider position is the current revision, prepend a comparison to this revision 
    2182         if ( $compare_two_mode )  
    2183                 array_unshift( $revisions, get_post( $post_id ) ); 
    2184                  
     2189        if ( ! wp_first_revision_matches_current_version( $post_id ) ) //revisions don't have current version 
     2190                array_unshift( $revisions, get_post( $post_id ) ) ; 
     2191        //$revisions->append ( get_post( $post_id ) ); 
     2192        //error_log( var_dump( $revisions )); 
    21852193        $count = -1; 
    21862194 
     2195        //reverse the list to start with oldes revision 
     2196        $revisions = array_reverse( $revisions ); 
     2197 
     2198        $previous_revision_id = 0; 
    21872199        foreach ( $revisions as $revision ) : 
    2188                 if ( ! empty( $show_autosaves ) && wp_is_post_autosave( $revision ) ) 
     2200                //error_log( ( $show_autosaves  )); 
     2201                if ( empty( $show_autosaves ) && wp_is_post_autosave( $revision ) ) 
    21892202                                continue; 
    21902203 
    21912204                $revision_from_date_author = ''; 
    21922205                $count++; 
    21932206                // return blank data for diffs to the left of the left handle (for right handel model) 
    21942207                // or to the right of the right handle (for left handel model) 
    2195                 if ( ( 0 != $left_handle_at && $count <= $left_handle_at ) ||  
    2196                          ( 0 != $right_handle_at && $count > $right_handle_at )) {  
     2208                if ( ( 0 != $left_handle_at && $count <= $left_handle_at ) || 
     2209                         ( 0 != $right_handle_at && $count > $right_handle_at )) { 
    21972210                        $alltherevisions[] = array ( 
    21982211                                'ID' => $revision->ID, 
    21992212                        ); 
    2200                          
    22012213                        continue; 
    22022214                } 
    22032215 
    2204                 $gravatar = get_avatar( $revision->post_author, 18 ); 
    2205                 $author = get_the_author_meta( 'display_name', $revision->post_author ); 
     2216                if ( $compare_two_mode ) { 
     2217                        $compare_to_gravatar = get_avatar( $left_revision->post_author, 24 ); 
     2218                        $compare_to_author = get_the_modified_author( $left_revision->ID ); 
     2219                        $compare_to_date = date_i18n( $datef, strtotime( $left_revision->post_modified ) ); 
     2220 
     2221                        $revision_from_date_author = sprintf( 
     2222                                /* translators: post revision title: 1: author avatar, 2: author name, 3: time ago, 4: date */ 
     2223                                _x( '%1$s %2$s, %3$s ago (%4$s)', 'post revision title' ), 
     2224                                $compare_to_gravatar, 
     2225                                $compare_to_author, 
     2226                                human_time_diff( strtotime( $left_revision->post_modified ), current_time( 'timestamp' ) ), 
     2227                                $compare_to_date 
     2228                        ); 
     2229                } 
     2230 
     2231                $gravatar = get_avatar( $revision->post_author, 24 ); 
     2232                $author = get_the_modified_author( $revision->ID ); 
    22062233                $date = date_i18n( $datef, strtotime( $revision->post_modified ) ); 
    22072234                $revision_date_author = sprintf( 
    22082235                        /* translators: post revision title: 1: author avatar, 2: author name, 3: time ago, 4: date */ 
     
    22132240                        $date 
    22142241                ); 
    22152242 
     2243                $autosavef = __( '%1$s [Autosave]' ); 
     2244                $currentf  = __( '%1$s [Current Revision]' ); 
     2245 
     2246                if ( ! $post = get_post( $post_id)) 
     2247                        exit(); 
     2248 
     2249                if ( $left_revision->post_modified === $post->post_modified ) 
     2250                        $revision_from_date_author = sprintf( $currentf, $revision_from_date_author ); 
     2251                elseif ( wp_is_post_autosave( $left_revision ) ) 
     2252                        $revision_from_date_author = sprintf( $autosavef, $revision_from_date_author ); 
     2253 
     2254                if ( $revision->post_modified === $post->post_modified ) 
     2255                        $revision_date_author = sprintf( $currentf, $revision_date_author ); 
     2256                elseif ( wp_is_post_autosave( $revision ) ) 
     2257                        $revision_date_author = sprintf( $autosavef, $revision_date_author ); 
     2258 
     2259                $date_short_format = __( 'j M @ G:i' ); 
     2260                $date_short = date_i18n( $date_short_format, strtotime( $revision->post_modified ) ); 
     2261 
     2262                $revision_date_author_short = sprintf( 
     2263                        '%s <strong>%s</strong><br />%s', 
     2264                        $gravatar, 
     2265                        $author, 
     2266                        $date_short 
     2267                ); 
     2268 
    22162269                $restoreaction = wp_nonce_url( 
    22172270                        add_query_arg( 
    22182271                                array( 'revision' => $revision->ID, 
    22192272                                        'action' => 'restore' ), 
    22202273                                        admin_url( 'revision.php' ) 
    22212274                        ), 
    2222                         "restore-post_{$compare_to}|{$revision->ID}" 
     2275                        "restore-post_{$revision->ID}" 
    22232276                ); 
    2224  
    2225                 $alltherevisions[] = array ( 
     2277                // if this is a left handled calculation swap data 
     2278                if ( 0 != $right_handle_at ) { 
     2279                        $tmp = $revision_from_date_author; 
     2280                        $revision_from_date_author = $revision_date_author; 
     2281                        $revision_date_author = $tmp; 
     2282                } 
     2283                if ( ( $compare_two_mode || 0 !== $previous_revision_id ) ) { 
     2284                        $alltherevisions[] = array ( 
    22262285                                'ID' => $revision->ID, 
    22272286                                'revision_date_author' => $revision_date_author, 
    22282287                                'revision_from_date_author' => $revision_from_date_author, 
     2288                                'revision_date_author_short' => $revision_date_author_short, 
    22292289                                'restoreaction' => urldecode( $restoreaction ), 
    2230                                 'revision_toload' => true 
     2290                                'revision_toload' => true, 
     2291                                'previous_revision_id' => $previous_revision_id 
    22312292                        ); 
     2293                } 
     2294                $previous_revision_id = $revision->ID; 
    22322295 
    22332296        endforeach; 
    22342297 
  • wp-admin/includes/post.php

     
    249249 
    250250        add_meta( $post_ID ); 
    251251 
    252         update_post_meta( $post_ID, '_edit_last', $GLOBALS['current_user']->ID ); 
    253  
    254252        wp_update_post( $post_data ); 
    255253 
    256254        // Now that we have an ID we can fix any attachment anchor hrefs 
     
    565563 
    566564        add_meta( $post_ID ); 
    567565 
    568         add_post_meta( $post_ID, '_edit_last', $GLOBALS['current_user']->ID ); 
    569  
    570566        // Now that we have an ID we can fix any attachment anchor hrefs 
    571567        _fix_attachment_links( $post_ID ); 
    572568 
  • wp-admin/js/revisions.js

     
    77 
    88                Model : Backbone.Model.extend({ 
    99                        idAttribute : 'ID', 
    10                         urlRoot : ajaxurl +     '?action=revisions-data&compare_to=' + wpRevisionsSettings.post_id + 
    11                                 '&show_autosaves=false&show_split_view=true&nonce=' + wpRevisionsSettings.nonce, 
     10                        urlRoot : ajaxurl +     '?action=revisions-data' + 
     11                                '&show_autosaves=true&show_split_view=true&nonce=' + wpRevisionsSettings.nonce, 
    1212                        defaults: { 
    1313                                ID : 0, 
    1414                                revision_date_author : '', 
     15                                revision_date_author_short: '', 
    1516                                revisiondiff : '<div class="diff-loading"><div class="spinner"></div></div>', 
    1617                                restoreaction : '', 
    1718                                revision_from_date_author : '', 
    18                                 revision_toload : false 
     19                                revision_toload : false, 
     20                                lines_added : 0, 
     21                                lines_deleted : 0, 
     22                                scope_of_changes : 'none', 
     23                                previous_revision_id : 0 
    1924                        }, 
    2025 
    2126                        url : function() { 
    22                                 return this.urlRoot + '&single_revision_id=' + this.id; 
     27                                if ( 1 === REVAPP._compareoneortwo ) { 
     28                                        return this.urlRoot + 
     29                                                '&single_revision_id=' + this.id + 
     30                                                '&compare_to=' + this.get( 'previous_revision_id' ) + 
     31                                                '&post_id=' + wpRevisionsSettings.post_id; 
     32                                } else { 
     33                                        return this.urlRoot + 
     34                                '&single_revision_id=' + this.id; 
     35                                } 
     36 
    2337                        } 
    2438 
    2539                }), 
     
    3347                        _right_handle_revisions : null, 
    3448                        _revisionsInteractions : null, 
    3549                        _revisionsOptions : null, 
    36                         _left_diff : 0, 
     50                        _left_diff : 1, 
    3751                        _right_diff : 1, 
    38                         _autosaves : false, 
     52                        _autosaves : true, 
    3953                        _show_split_view : true, 
    4054                        _compareoneortwo : 1, 
    4155                        _left_model_loading : false,    //keep track of model loads 
    4256                        _right_model_loading : false,   //disallow slider interaction, also repeat loads, while loading 
     57                        _tickmarkView : null, //the slider tickmarks 
     58                        _has_tooltip : false, 
    4359 
    44                         //TODO add ability to arrive on specific revision 
    4560                        routes : { 
    4661                        }, 
    4762 
    48                         viewrevision : function( revision ) { 
    49                                 //coming soon 
    50                         }, 
    51  
    5263                        reload_toload_revisions : function( model_collection, reverse_direction ) { 
    5364                                var self = this; 
    5465                                var revisions_to_load = model_collection.where( { revision_toload : true } ); 
    55                                 //console.log(revisions_to_load); 
    5666                                var delay=0; 
    57                                 _.each(revisions_to_load, function( the_model ) { 
     67                                //match slider to passed revision_id 
     68                                _.each( revisions_to_load, function( the_model ) { 
     69                                        if ( the_model.get( 'ID' )  == wpRevisionsSettings.revision_id ) { 
     70                                                self._right_diff = self._revisions.indexOf( the_model ) + 1; 
     71                                        } 
     72 
     73                                }); 
     74                                _.each( revisions_to_load, function( the_model ) { 
    5875                                                the_model.urlRoot = model_collection.url; 
    5976                                                _.delay( function() { 
    6077                                                        the_model.fetch( { 
    6178                                                                update : true, 
    6279                                                                add : false, 
    6380                                                                remove : false, 
    64                                                                 //async : false, 
    6581                                                                success : function( model ) { 
    66                                                                         //console.log(model.get( 'ID' ) +'-'+self._revisions.at( self._right_diff ).get( 'ID' )); 
    67                                                                         if ( model.get( 'ID' ) === self._revisions.at( self._right_diff - 1 ).get( 'ID' ) ) { //reload if current model refreshed 
    68                                                                                 //console.log('render'); 
     82                                                                        model.set( 'revision_toload', 'false' ); 
     83 
     84                                                                        //stop spinner when all models are loaded 
     85                                                                        if ( 0 === model_collection.where( { revision_toload : true } ).length ) 
     86                                                                                self.stop_model_loading_spinner(); 
     87 
     88                                                                        self._tickmarkView.render(); 
     89 
     90                                                                        var total_changes = model.get( 'lines_added' ) + model.get( 'lines_deleted'); 
     91                                                                        var scope_of_changes = 'vsmall'; 
     92 
     93                                                                        // Note: hard coded scope of changes 
     94                                                                        // TODO change to dynamic based on range of values 
     95                                                                        if  ( total_changes > 1 && total_changes <= 3 ) { 
     96                                                                                scope_of_changes = 'small'; 
     97                                                                        } else if(total_changes > 3 && total_changes <= 5 ) { 
     98                                                                                scope_of_changes = 'med'; 
     99                                                                        } else if(total_changes > 5 && total_changes <= 10 ) { 
     100                                                                                scope_of_changes = 'large'; 
     101                                                                        } else if(total_changes > 10 ) { 
     102                                                                                scope_of_changes = 'vlarge'; 
     103                                                                        } 
     104                                                                        model.set( 'scope_of_changes', scope_of_changes ); 
     105                                                                        if ( 0 !== self._right_diff && 
     106                                                                                model.get( 'ID' ) === self._revisions.at( self._right_diff - 1 ).get( 'ID' ) ) { 
     107                                                                                //reload if current model refreshed 
    69108                                                                                self._revisionView.render(); 
    70109                                                                        } 
     110 
    71111                                                                } 
    72112                                                } ); 
    73113                                                }, delay ) ; 
    74                                                 delay = delay + 200; //stagger model loads by 200 ms to avoid hammering server with requests 
     114                                                delay = delay + 150; //stagger model loads to avoid hammering server with requests 
    75115                                        } 
    76116                                ); 
    77117                        }, 
     
    83123 
    84124                        stop_left_model_loading : function() { 
    85125                                this._left_model_loading = false; 
    86                                 $('.revisiondiffcontainer').removeClass('leftmodelloading'); 
    87126                        }, 
    88127 
    89128                        start_right_model_loading : function() { 
     
    93132 
    94133                        stop_right_model_loading : function() { 
    95134                                this._right_model_loading = false; 
     135                        }, 
     136 
     137                        stop_model_loading_spinner : function() { 
    96138                                $('.revisiondiffcontainer').removeClass('rightmodelloading'); 
     139                                $('.revisiondiffcontainer').removeClass('leftmodelloading'); 
    97140                        }, 
    98141 
    99142                        reloadmodel : function() { 
     
    104147                                } 
    105148                        }, 
    106149 
     150                        //load the models for the single handle mode 
    107151                        reloadmodelsingle : function() { 
    108152                                var self = this; 
    109153                                self._revisions.url = ajaxurl + '?action=revisions-data&compare_to=' + wpRevisionsSettings.post_id + 
    110154                                                                                        '&show_autosaves=' + self._autosaves + 
    111                                                                                         '&show_split_view=' +  REVAPP._show_split_view + 
     155                                                                                        '&show_split_view=' +  self._show_split_view + 
    112156                                                                                        '&nonce=' + wpRevisionsSettings.nonce; 
    113157                                self.start_right_model_loading(); 
    114                                 this._revisions.fetch({ //reload revision data 
     158                                self._revisions.fetch({ //reload revision data 
    115159                                        success : function() { 
    116                                                 self.stop_right_model_loading(); 
     160                                                console.log('loaded'); 
     161                                                //self.stop_right_model_loading(); 
     162                                                //REVAPP._right_diff -= 1; 
    117163                                                var revisioncount = self._revisions.length; 
    118                                                 if ( self._right_diff > revisioncount ) //if right handle past rightmost, move 
    119                                                         self._right_diff = revisioncount; 
    120  
     164                                                self._revisionView.model = self._revisions; 
    121165                                                self._revisionView.render(); 
    122166                                                self.reload_toload_revisions( self._revisions ); 
     167                                                self._tickmarkView.model = self._revisions; 
     168                                                self._tickmarkView.render(); 
     169                                                $( '#slider' ).slider( 'option', 'max', revisioncount-1 ); //TODO test this, if autsave option changed 
     170                                                $( '#slider' ).slider( 'value', self._right_diff - 1 ).trigger( 'slide' ); 
    123171 
    124                                                 $( '#slider' ).slider( 'option', 'max', revisioncount-1 ); //TODO test this, autsaves changed 
    125172                                        }, 
    126173 
    127174                                        error : function () { 
    128175                                                self.stop_right_model_loading(); 
    129                                                 //console.log( 'Error loading revision data' ); 
    130176                                        } 
    131177 
    132178                                }); 
    133179                        }, 
    134180 
     181                        //load the models for the left handle 
    135182                        reloadleft : function() { 
    136183                                var self = this; 
    137184                                self.start_left_model_loading(); 
    138185                                self._left_handle_revisions = new wp.revisions.Collection(); 
     186 
    139187                                self._left_handle_revisions.url = 
    140188                                        ajaxurl + 
    141189                                        '?action=revisions-data&compare_to=' + self._revisions.at( self._right_diff - 1 ).get( 'ID' ) + 
    142190                                        '&post_id=' + wpRevisionsSettings.post_id + 
    143                                         '&show_autosaves=' + self._autosaves + 
    144                                         '&show_split_view=' +  self._show_split_view + 
     191                                        '&show_autosaves=' + REVAPP._autosaves + 
     192                                        '&show_split_view=' +  REVAPP._show_split_view + 
    145193                                        '&nonce=' + wpRevisionsSettings.nonce + 
    146194                                        '&right_handle_at='  + ( self._right_diff ); 
    147195 
     
    150198                                        success : function(){ 
    151199                                                self.stop_left_model_loading(); 
    152200                                                self.reload_toload_revisions( self._left_handle_revisions ); 
    153                                         }, 
     201                                                self._tickmarkView.model = self._left_handle_revisions; 
     202                                                $( '#slider' ).slider( 'option', 'max', self._revisions.length ); 
     203                                                // ensure right handle not beyond length, in particular if viewing autosaves is switched from on to off 
     204                                                // the number of models in the collection might get shorter, this ensures right handle is not beyond last model 
     205                                                if ( self._right_diff > self._revisions.length ) 
     206                                                        self._right_diff = self._revisions.length; 
     207                                                }, 
    154208 
    155209                                        error : function () { 
    156                                                 //console.log( 'Error loading revision data' ); 
    157210                                                self.stop_left_model_loading(); 
    158211                                        } 
    159212                                }); 
    160213                        }, 
    161214 
     215                        //load the models for the right handle 
    162216                        reloadright : function() { 
    163217                                var self = this; 
    164218                                self.start_right_model_loading(); 
    165219                                self._right_handle_revisions = new wp.revisions.Collection(); 
    166                                 if ( 0 === self._left_diff ) { 
     220 
    167221                                        self._right_handle_revisions.url = 
    168222                                                ajaxurl + 
    169                                                 '?action=revisions-data&compare_to=' + wpRevisionsSettings.post_id + 
     223                                                '?action=revisions-data&compare_to=' + ( self._revisions.at( self._left_diff ).get( 'ID' ) -1)+ 
    170224                                                '&post_id=' + wpRevisionsSettings.post_id + 
    171                                                 '&show_autosaves=' + self._autosaves + 
    172                                                 '&show_split_view=' +  self._show_split_view + 
     225                                                '&show_autosaves=' + REVAPP._autosaves + 
     226                                                '&show_split_view=' +  REVAPP._show_split_view + 
    173227                                                '&nonce=' + wpRevisionsSettings.nonce; 
    174                                 } else { 
    175                                         self._right_handle_revisions.url = 
    176                                                 ajaxurl + 
    177                                                 '?action=revisions-data&compare_to=' + self._revisions.at( self._left_diff - 1 ).get( 'ID' ) + 
    178                                                 '&post_id=' + wpRevisionsSettings.post_id + 
    179                                                 '&show_autosaves=' + self._autosaves + 
    180                                                 '&show_split_view=' +  self._show_split_view + 
    181                                                 '&nonce=' + wpRevisionsSettings.nonce + 
    182                                                 '&left_handle_at=' + (self._left_diff ) ; 
    183                                 } 
    184228 
    185229                                self._right_handle_revisions.fetch({ 
    186230 
    187231                                        success : function(){ 
    188232                                                self.stop_right_model_loading(); 
    189233                                                self.reload_toload_revisions( self._right_handle_revisions ); 
     234                                                self._tickmarkView.model = self._right_handle_revisions; 
     235                                                $( '#slider' ).slider( 'option', 'max', self._revisions.length ); 
     236                                                $( '#slider' ).slider( 'values', [ REVAPP._left_diff, REVAPP._right_diff] ).trigger( 'slide' ); 
     237 
     238                                                //REVAPP._revisionView.render(); 
     239 
    190240                                        }, 
    191241 
    192242                                        error : function ( response ) { 
    193                                                 //console.log( 'Error loading revision data - ' + response.toSource() ); 
    194243                                                self.stop_right_model_loading(); 
    195244                                        } 
    196245                                }); 
     
    198247                        }, 
    199248 
    200249                        reloadleftright : function() { 
     250                                this.start_right_model_loading(); 
     251                                this.start_left_model_loading(); 
    201252                                this.reloadleft(); 
    202253                                this.reloadright(); 
    203254                        }, 
     
    208259                        initialize : function( options ) { 
    209260                                var self = this; //store the application instance 
    210261                                if (this._revisions === null) { 
    211                                         self._autosaves = ''; 
    212262                                        self._revisions = new wp.revisions.Collection(); //set up collection 
    213263                                        self.start_right_model_loading(); 
    214264                                        self._revisions.fetch({ //load revision data 
    215265 
    216266                                                success : function() { 
    217267                                                        self.stop_right_model_loading(); 
    218                                                         self.revisionDiffSetup(); 
     268                                                        //self._right_handle_revisions = self._revisions; 
     269                                                        self.completeApplicationSetup(); 
    219270                                                } 
    220271                                        }); 
    221272                                } 
    222273                                return this; 
    223274                        }, 
    224275 
    225                         revisionDiffSetup : function() { 
     276                        addTooltip : function( handle, message ) { 
     277 
     278                                handle.attr( 'title', '' ).tooltip({ 
     279                                        track: false, 
     280 
     281                                        position: { 
     282                                                my: "left-30 top-66", 
     283                                                at: "top left", 
     284                                                using: function( position, feedback ) { 
     285                                                        $( this ).css( position ); 
     286                                                        $( "<div>" ) 
     287                                                        .addClass( "arrow" ) 
     288                                                        .addClass( feedback.vertical ) 
     289                                                        .addClass( feedback.horizontal ) 
     290                                                        .appendTo( $( this ) ); 
     291                                                } 
     292                                        }, 
     293                                        show: false, 
     294                                        hide: false, 
     295                                        content:  function() { 
     296                                                return message; 
     297                                        } 
     298 
     299                                } ); 
     300                        }, 
     301/**/ 
     302 
     303                        completeApplicationSetup : function() { 
    226304                                this._revisionView = new wp.revisions.views.View({ 
    227305                                        model : this._revisions 
    228306                                }); 
    229307                                this._revisionView.render(); 
    230                                 $( '#diff_max, #diff_maxof' ).html( this._revisions.length ); 
    231                                 $( '#diff_count' ).html( REVAPP._right_diff ); 
    232308                                $( '#slider' ).slider( 'option', 'max', this._revisions.length - 1 ); 
    233309 
    234310                                this.reload_toload_revisions( this._revisions ); 
     311 
    235312                                this._revisionsInteractions = new wp.revisions.views.Interact({ 
    236313                                        model : this._revisions 
    237314                                }); 
    238315                                this._revisionsInteractions.render(); 
    239316 
     317                                this._tickmarkView = new wp.revisions.views.Tickmarks({ 
     318                                        model : this._revisions 
     319                                }); 
     320                                this._tickmarkView.render(); 
     321                                this._tickmarkView.resetticks(); 
     322 
     323 
    240324                                /* 
     325                                .on( 'mouseup', function( event ) { 
     326                                        REVAPP._keep_tooltip_open = false; 
     327                                        $( this ).find('.ui-slider-tooltip').hide(); 
     328                                } ).on( 'mousedown', function( event ) { 
     329                                        REVAPP._keep_tooltip_open = true; 
     330                                } ).on( 'mouseout', function( event ) { 
     331                                        if ( REVAPP._keep_tooltip_open) 
     332                                                event.stopImmediatePropagation(); 
     333                                        }); 
     334                                */ 
     335                                /* 
    241336                                //Options hidden for now, moving to screen options 
    242337                                this._revisionsOptions = new wp.revisions.views.Options({ 
    243338                                        model : this._revisions 
     
    252347        wp.revisions.Collection = Backbone.Collection.extend({ 
    253348                model : wp.revisions.Model, 
    254349                url : ajaxurl + '?action=revisions-data&compare_to=' + wpRevisionsSettings.post_id + 
    255                         '&show_autosaves=false&show_split_view=true&nonce=' + wpRevisionsSettings.nonce, 
     350                        '&show_autosaves=true&show_split_view=true&nonce=' + wpRevisionsSettings.nonce, 
    256351 
    257352                initialize : function() { 
    258353                        } 
    259354        } ); 
    260355 
    261356        _.extend(wp.revisions.views, { 
     357 
     358                //Ticks inside slider view 
    262359                // 
     360                Tickmarks : Backbone.View.extend({ 
     361                        el : $('#diff-slider-ticks')[0], 
     362                        tagName : 'diff-slider-ticks-view', 
     363                        className : 'diff-slider-ticks-container', 
     364                        template : wp.template('revision-ticks'), 
     365                        model : wp.revisions.Model, 
     366 
     367                        resetticks : function() { 
     368                                var slider_max = $( '#slider' ).slider( 'option', 'max'); 
     369                                var slider_width = $( '#slider' ).width(); 
     370                                var adjust_max = ( 2 === REVAPP._compareoneortwo ) ? 1 : 0; 
     371                                var tick_width = Math.floor( slider_width / ( slider_max - adjust_max ) ); 
     372 
     373                                //TODO: adjust right margins for wider ticks so they stay centered on handle stop point 
     374 
     375                                //set minimum and maximum widths for tick marks 
     376                                tick_width = (tick_width > 50 ) ? 50 : tick_width; 
     377                                tick_width = (tick_width < 10 ) ? 10 : tick_width; 
     378 
     379                                slider_width = tick_width * (slider_max - adjust_max ) +1; 
     380 
     381                                $( '#slider' ).width( slider_width ); 
     382                                $( '.diff-slider-ticks-wrapper' ).width( slider_width ); 
     383                                $( '#diffslider' ).width( slider_width ); 
     384                                $( '#diff-slider-ticks' ).width( slider_width ); 
     385 
     386                                var a_tick_width = $( '.revision-tick' ).width(); 
     387 
     388                                if ( tick_width !==  a_tick_width ) { // is the width already set correctly? 
     389                                        $( '.revision-tick' ).each( function( ) { 
     390                                                $(this).css( 'margin-right', tick_width - 1 + 'px'); //space the ticks out using right margin 
     391                                        }); 
     392 
     393                                        if( 2 === REVAPP._compareoneortwo ) { 
     394                                                $( '.revision-tick' ).first().remove(); //TODO - remove the check 
     395                                        } 
     396                                        $( '.revision-tick' ).last().css( 'margin-right', '0' ); // last tick gets no right margin 
     397                                } 
     398 
     399                        }, 
     400 
     401                        //render the tickmark view 
     402                        render : function() { 
     403                                var self = this; 
     404 
     405                                if ( null !== self.model ) { 
     406                                        var addhtml = ""; 
     407                                        _.each ( self.model.models, function ( the_model ) { 
     408                                                addhtml = addhtml + self.template ( the_model.toJSON() ); 
     409                                        }); 
     410                                        self.$el.html( addhtml ); 
     411 
     412                                } 
     413                                self.resetticks(); 
     414                                return self; 
     415                        } 
     416                }), 
     417 
     418                // 
    263419                //primary revision diff view 
    264420                // 
    265421                View : Backbone.View.extend({ 
     
    267423                        tagName : 'revisionvview', 
    268424                        className : 'revisionview-container', 
    269425                        template : wp.template('revision'), 
    270                         revvapp : null, 
    271426                        comparetwochecked : '', 
    272427                        draggingleft : false, 
    273428 
    274                         initialize : function(){ 
    275                         }, 
    276  
    277429                        // 
    278430                        //render the revisions 
    279431                        // 
    280432                        render : function() { 
    281433                                var addhtml = ''; 
    282434                                //compare two revisions mode? 
     435 
    283436                                if ( 2 === REVAPP._compareoneortwo ) { 
    284437                                        this.comparetwochecked = 'checked'; 
    285438                                        if ( this.draggingleft ) { 
     
    310463                                this.$el.html( addhtml ); 
    311464                                if ( this.model.length < 3 ) { 
    312465                                        $( 'div#comparetworevisions' ).hide(); //don't allow compare two if fewer than three revisions 
     466                                } 
     467                                if ( this.model.length < 2 ) { 
     468                                        $( 'div#diffslider' ).hide(); //don't allow compare two if fewer than three revisions 
     469                                        $( 'div.diff-slider-ticks-wrapper' ).hide(); 
     470                                } 
    313471 
     472                                // 
     473                                // add tooltips to the handles 
     474                                // 
     475                                if ( 2 === REVAPP._compareoneortwo ) { 
     476                                        REVAPP.addTooltip ( $( 'a.ui-slider-handle.left-handle' ), 
     477                                                ( REVAPP._right_diff >= REVAPP._revisions.length ) ? '' : REVAPP._revisions.at( REVAPP._left_diff ).get( 'revision_date_author_short' ) ); 
     478                                        REVAPP.addTooltip ( $( 'a.ui-slider-handle.right-handle' ), 
     479                                                ( REVAPP._right_diff >= REVAPP._revisions.length ) ? '' : REVAPP._revisions.at( REVAPP._right_diff ).get( 'revision_date_author_short' ) ); 
     480                                } else { 
     481                                        REVAPP.addTooltip ( $( 'a.ui-slider-handle' ), 
     482                                                ( REVAPP._right_diff >= REVAPP._revisions.length ) ? '' : REVAPP._revisions.at( REVAPP._right_diff ).get( 'revision_date_author_short' ) ); 
    314483                                } 
    315                                 //console.log ( (this.model.at( REVAPP._right_diff - 1 )).url()); 
     484 
     485                                // 
     486                                // hide the restore button when on the last sport/current post data 
     487                                // 
     488                                if (  REVAPP._right_diff === REVAPP._revisions.length ){ 
     489                                        $( '.restore-button' ).hide(); 
     490                                } else { 
     491                                        $( '.restore-button' ).show(); 
     492                                } 
     493 
    316494                                return this; 
    317495                        }, 
    318496 
     
    326504                        // 
    327505                        clickcomparetwo : function(){ 
    328506                                self = this; 
    329                                 if ( $( 'input#comparetwo' ).is( ':checked' ) ) { 
     507 
     508                                if ( $( 'input#comparetwo' ).is( ':checked' ) ) { //compare 2 mode 
    330509                                        REVAPP._compareoneortwo = 2 ; 
    331                                         REVAPP.reloadleftright(); 
    332                                 } else { 
    333                                         REVAPP._compareoneortwo = 1 ; 
    334                                         REVAPP._revisionView.draggingleft = false; 
    335                                         REVAPP._left_diff = 0; 
    336                                         REVAPP.reloadmodelsingle(); 
    337                                 } 
    338                                 REVAPP._revisionsInteractions.render(); 
     510 
     511                                        if ( 1 === REVAPP._right_diff ) 
     512                                                REVAPP._right_diff = 2; 
     513                                                REVAPP._revisionView.draggingleft = false; 
     514 
     515                                                wpRevisionsSettings.revision_id = ''; // reset passed revision id so switching back to one handle mode doesn't re-select revision 
     516                                                REVAPP.reloadleftright(); 
     517                                                REVAPP._revisionView.model = REVAPP._right_handle_revisions; 
     518 
     519                                        } else { //compare one mode 
     520                                                REVAPP._compareoneortwo = 1 ; 
     521                                                REVAPP._revisionView.draggingleft = false; 
     522                                                //REVAPP._left_diff = 0; 
     523                                                //REVAPP._right_diff = (REVAPP._revisions.length <= REVAPP._right_diff ) ? REVAPP._right_diff + 1 : REVAPP._right_diff + 1; 
     524                                                REVAPP.reloadmodelsingle(); 
     525                                        } 
     526                                        //REVAPP._revisionView.render(); 
     527                                        REVAPP._revisionsInteractions.render(); 
     528                                        REVAPP._tickmarkView.render(); 
     529 
    339530                        } 
    340531                }), 
    341532 
    342533                // 
    343534                //options view for show autosaves and show split view options 
    344535                // 
     536                /* DISABLED for now 
    345537                Options : Backbone.View.extend({ 
    346538                        el : $('#backbonerevisionsoptions')[0], 
    347539                        tagName : 'revisionoptionsview', 
    348540                        className : 'revisionoptions-container', 
    349541                        template : wp.template('revisionoptions'), 
    350542 
    351                         initialize : function() { 
    352                         }, 
    353  
    354543                        //render the options view 
    355544                        render : function() { 
    356545                                var addhtml = this.template; 
     
    396585                                REVAPP.reloadmodel(); 
    397586                        } 
    398587                }), 
    399  
     588                */ 
    400589                // 
    401590                //main interactions view 
    402591                // 
     
    405594                        tagName : 'revisionvinteract', 
    406595                        className : 'revisionvinteract-container', 
    407596                        template : wp.template('revisionvinteract'), 
    408                         _restoreword : '', 
    409597 
    410598                        initialize : function() { 
    411                                 this._restoreword = $( 'input#restore' ).attr( 'value' ); 
    412599                        }, 
    413600 
    414                         reset_restore_button : function() { 
    415                                 $( 'input#restore' ).attr( 'value', this._restoreword + ' ' + REVAPP._revisions.at( REVAPP._right_diff - 1 ).get( 'ID' ) ); 
    416                         }, 
    417  
    418601                        render : function() { 
    419602                                var self = this; 
    420603 
    421604                                var addhtml = this.template; 
    422605                                this.$el.html( addhtml ); 
    423                                 $( '#diff_max, #diff_maxof' ).html( this.model.length ); 
    424                                 $( '#diff_count' ).html( REVAPP._right_diff ); 
    425                                 $( '#diff_left_count_inner' ).html( 0 === REVAPP._left_diff ? '' : 'revision' + REVAPP._left_diff ); 
    426                                 self.reset_restore_button(); 
    427606 
    428607                                var modelcount = REVAPP._revisions.length; 
    429608 
     
    431610                                if ( 1 === REVAPP._compareoneortwo ) { 
    432611                                        //set up the slider with a single handle 
    433612                                        slider.slider({ 
    434                                                 value : REVAPP._right_diff-1, 
    435                                                 min : 0, 
    436                                                 max : modelcount-1, 
    437                                                 step : 1, 
     613                                                value: REVAPP._right_diff-1, 
     614                                                min: 0, 
     615                                                max: modelcount-1, 
     616                                                step: 1, 
    438617 
     618 
    439619                                                //slide interactions for one handles slider 
    440620                                                slide : function( event, ui ) { 
    441                                                         if ( REVAPP._right_model_loading ) //left model stoll loading, prevent sliding left handle 
    442                                                                                 return false; 
    443621 
    444                                                         REVAPP._right_diff =( ui.value+1 ); 
    445                                                         $( '#diff_count' ).html( REVAPP._right_diff ); 
     622                                                        REVAPP._right_diff = ( ui.value + 1 ); 
    446623                                                        REVAPP._revisionView.render(); 
    447                                                         self.reset_restore_button(); 
    448                                                 } 
     624                                                        /* 
     625                                                        $( 'a.ui-slider-handle' ).tooltip( { 
     626                                                                content: REVAPP._revisions.at( ui.value ).get( 'revision_date_author_short' ), 
     627                                                                position: { 
     628                                                                my: "top-65", 
     629                                                                using: function( position, feedback ) { 
     630                                                                        $( this ).css( position ); 
     631                                                                        $( "<div>" ) 
     632                                                                        .addClass( "arrow" ) 
     633                                                                        .addClass( feedback.vertical ) 
     634                                                                        .addClass( feedback.horizontal ) 
     635                                                                        .appendTo( this ); 
     636                                                                        } 
     637                                                                } 
     638                                                        });//.trigger( 'close' ).trigger( 'open' ); 
     639*/ 
     640                                                        } 
    449641                                        }); 
    450642                                        $( '.revisiondiffcontainer' ).removeClass( 'comparetwo' ); 
     643 
    451644                                } else { //comparing more than one, eg 2 
    452645                                        //set up the slider with two handles 
    453646                                        slider.slider({ 
     
    460653                                                //in two handled mode when user starts dragging, swap in precalculated diff for handle 
    461654                                                start : function (event, ui ) { 
    462655                                                        var index = $( ui.handle ).index(); //0 (left) or 1 (right) 
    463  
    464656                                                        switch ( index ) { 
    465657                                                                case 1: //left handle drag 
    466                                                                         if ( REVAPP._left_model_loading ) //left model stoll loading, prevent sliding left handle 
     658                                                                        if ( REVAPP._left_model_loading ) //left model still loading, prevent sliding left handle 
    467659                                                                                return false; 
    468660 
     661                                                                        REVAPP._revisionView.draggingleft = true; 
     662 
    469663                                                                        if ( REVAPP._revisionView.model !== REVAPP._left_handle_revisions && 
    470                                                                                         null !== REVAPP._left_handle_revisions ) 
     664                                                                                        null !== REVAPP._left_handle_revisions ) { 
    471665                                                                                REVAPP._revisionView.model = REVAPP._left_handle_revisions; 
     666                                                                                REVAPP._tickmarkView.model = REVAPP._left_handle_revisions; 
     667                                                                                REVAPP._tickmarkView.render(); 
     668                                                                        } 
    472669 
    473                                                                         REVAPP._revisionView.draggingleft = true; 
    474670                                                                        REVAPP._left_diff_start = ui.values[ 0 ]; 
    475671                                                                        break; 
    476672 
    477673                                                                case 2: //right 
    478                                                                         if ( REVAPP._right_model_loading ) //right model stoll loading, prevent sliding right handle 
     674                                                                        if ( REVAPP._right_model_loading || 0 === REVAPP._right_handle_revisions.length) //right model still loading, prevent sliding right handle 
    479675                                                                                return false; 
    480676 
    481                                                                         //one extra spot at left end when comparing two 
    482677                                                                        if ( REVAPP._revisionView.model !== REVAPP._right_handle_revisions && 
    483                                                                                         null !== REVAPP._right_handle_revisions ) 
     678                                                                                        null !== REVAPP._right_handle_revisions ) { 
    484679                                                                                REVAPP._revisionView.model = REVAPP._right_handle_revisions; 
     680                                                                                REVAPP._tickmarkView.model = REVAPP._right_handle_revisions; 
     681                                                                                REVAPP._tickmarkView.render(); 
     682                                                                        } 
    485683 
    486684                                                                        REVAPP._revisionView.draggingleft = false; 
    487685                                                                        REVAPP._right_diff_start = ui.values[ 1 ]; 
     
    501699                                                                        if ( REVAPP._left_model_loading ) //left model still loading, prevent sliding left handle 
    502700                                                                                return false; 
    503701 
    504                                                                         REVAPP._left_diff = ui.values[ 0 ] - 1; //one extra spot at left end when comparing two 
     702                                                                        REVAPP._left_diff = ui.values[ 0 ]; 
    505703                                                                        break; 
    506704 
    507705                                                                case 2: //right 
    508706                                                                        if ( REVAPP._right_model_loading ) //right model still loading, prevent sliding right handle 
    509707                                                                                return false; 
    510708 
    511                                                                         REVAPP._right_diff = ui.values[ 1 ] - 1 ; 
     709                                                                        REVAPP._right_diff = ui.values[ 1 ]; 
    512710                                                                        break; 
    513711                                                        } 
    514712 
    515                                                         $( '#diff_count' ).html( REVAPP._right_diff ); 
    516  
    517713                                                        if ( 0 === REVAPP._left_diff ) { 
    518714                                                                $( '.revisiondiffcontainer' ).addClass( 'currentversion' ); 
    519715 
    520716                                                        } else { 
    521717                                                                $( '.revisiondiffcontainer' ).removeClass( 'currentversion' ); 
    522                                                                 $( '#diff_left_count_inner' ).html( REVAPP._left_diff ); 
    523718                                                        } 
    524719 
    525                                                         REVAPP._revisionView.render(); //render the diff view 
    526                                                         self.reset_restore_button(); 
     720                                                        REVAPP._revisionView.render(); 
     721 
    527722                                                }, 
    528723 
    529724                                                //when the user stops sliding  in 2 handle mode, recalculate diffs 
     
    536731 
    537732                                                                switch ( index ) { 
    538733                                                                        case 1: //left 
     734 
    539735                                                                                //left handle dragged & changed, reload right handle model 
    540                                                                                 if ( ! ( REVAPP._left_diff_start === ui.values[ 0 ] || REVAPP._left_model_loading ) ) 
     736                                                                                if ( REVAPP._left_diff_start !== ui.values[ 0 ] ) 
    541737                                                                                        REVAPP.reloadright(); 
    542738 
    543739                                                                                break; 
    544740 
    545741                                                                        case 2: //right 
     742                                                                                //REVAPP._right_diff =  ( 1 >= REVAPP._right_diff ) ? 1  : REVAPP._right_diff-1; 
    546743                                                                                //right handle dragged & changed, reload left handle model if changed 
    547                                                                                 if ( ! ( REVAPP._right_diff_start === ui.values[ 1 ] || REVAPP._right_model_loading ) ) { 
     744                                                                                if ( REVAPP._right_diff_start !== ui.values[ 1 ] ) 
    548745                                                                                        REVAPP.reloadleft(); 
    549                                                                                 } 
     746 
    550747                                                                                break; 
    551748                                                                } 
    552749                                                        } 
    553750                                                } 
    554751                                        }); 
    555752                                        $( '.revisiondiffcontainer' ).addClass( 'comparetwo' ); 
     753                                        $( '#diffslider a.ui-slider-handle' ).first().addClass( 'left-handle' ).next().addClass( 'right-handle' ); 
    556754                                } 
    557755 
    558756                                return this; 
     
    571769 
    572770                                REVAPP._revisionView.render(); 
    573771 
    574                                 $( '#diff_count' ).html( REVAPP._right_diff ); 
    575772                                $( '#slider' ).slider( 'value', REVAPP._right_diff - 1 ).trigger( 'slide' ); 
    576                                 this.reset_restore_button(); 
    577773                        }, 
    578774 
    579775                        //go the the previous revision 
     
    583779 
    584780                                REVAPP._revisionView.render(); 
    585781 
    586                                 $( '#diff_count' ).html( REVAPP._right_diff ); 
    587782                                $( '#slider' ).slider( 'value', REVAPP._right_diff - 1 ).trigger( 'slide' ); 
    588                                 this.reset_restore_button(); 
    589783                        } 
    590784                }) 
    591785        }); 
    592786 
    593787        //instantiate Revision Application 
    594788        REVAPP = new wp.revisions.App(); 
    595         //TODO consider enable back button to step back thru states? 
    596         //Backbone.history.start({pushState: true}); 
    597789 
    598790}(jQuery)); 
  • wp-admin/revision.php

     
    1717case 'restore' : 
    1818        if ( ! $revision = wp_get_post_revision( $revision_id ) ) 
    1919                break; 
     20 
    2021        if ( ! current_user_can( 'edit_post', $revision->post_parent ) ) 
    2122                break; 
     23 
     24 
    2225        if ( ! $post = get_post( $revision->post_parent ) ) 
    2326                break; 
    2427 
    25         // Revisions disabled and we're not looking at an autosave 
    26         if ( ( ! WP_POST_REVISIONS || ! post_type_supports( $post->post_type, 'revisions' ) ) && ! wp_is_post_autosave( $revision ) ) { 
     28        // Revisions disabled (previously checked autosavegs && ! wp_is_post_autosave( $revision )) 
     29        if ( ( ! WP_POST_REVISIONS || ! post_type_supports( $post->post_type, 'revisions' ) ) ) { 
    2730                $redirect = 'edit.php?post_type=' . $post->post_type; 
    2831                break; 
    2932        } 
    30         check_admin_referer( "restore-post_{$post->ID}|{$revision->ID}" ); 
    3133 
    32         //store revision event in post meta 
    33         $restore_details = array( 
    34                 'restored_revision_id' => $revision->ID, 
    35                 'restored_by_user' => get_current_user_id(), 
    36                 'restored_time' => time() 
    37         ); 
    38         update_post_meta( $post->ID, '_post_restored_from', $restore_details ); 
     34        check_admin_referer( "restore-post_{$revision->ID}" ); 
    3935 
    4036        wp_restore_post_revision( $revision->ID ); 
    4137        $redirect = add_query_arg( array( 'message' => 5, 'revision' => $revision->ID ), get_edit_post_link( $post->ID, 'url' ) ); 
     
    5854        } 
    5955 
    6056        $post_title = '<a href="' . get_edit_post_link() . '">' . get_the_title() . '</a>'; 
    61         $revision_title = wp_post_revision_title( $revision, false ); 
    6257        $h2 = sprintf( __( 'Compare Revisions of &#8220;%1$s&#8221;' ), $post_title ); 
    6358        $title = __( 'Revisions' ); 
    6459 
     
    8075        $parent_file = $submenu_file = 'edit.php?post_type=' . $post->post_type; 
    8176else 
    8277        $parent_file = $submenu_file = 'edit.php'; 
    83  
    8478wp_enqueue_script( 'revisions' ); 
    8579 
    8680require_once( './admin-header.php' ); 
    8781 
    8882//TODO - Some of the translations below split things into multiple strings that are contextually related and this makes it pretty impossible for RTL translation. 
    8983//TODO can we pass the context in a better way 
     84$wpRevisionsSettings = array( 'post_id' => $post->ID, 
     85                                                'nonce' => wp_create_nonce( 'revisions-ajax-nonce' ), 
     86                                                'revision_id' => $revision_id ); 
     87wp_localize_script( 'revisions', 'wpRevisionsSettings', $wpRevisionsSettings ); 
     88 
     89$comparetworevisionslink = get_edit_post_link( $revision->ID ); 
    9090?> 
    91 <script type="text/javascript"> 
    92 var wpRevisionsSettings = <?php echo json_encode( array( 'post_id' => $post->ID, 'nonce' => wp_create_nonce( 'revisions-ajax-nonce' ) ) ); ?>; 
    93 </script> 
    94 <?php 
    95         $comparetworevisionslink = get_edit_post_link( $revision->ID ); 
    96 ?> 
    9791 
    98 <div id="backbonerevisionsoptions"></div> 
     92<div id="backbonerevisionsoptions"> 
     93</div> 
    9994<div class="wrap"> 
    100         <div class="icon32 icon32-posts-post" id="icon-edit"><br></div> 
     95        <div class="icon32 icon32-posts-post" id="icon-edit"> 
     96                <br> 
     97        </div> 
    10198        <div class="revisiondiffcontainer diffsplit currentversion rightmodelloading"> 
    102                 <div id="modelsloading" class="updated message"><span class="spinner" ></span> <?php _e( 'Calculating revision diffs' ); ?></div> 
     99                <div id="modelsloading" class="updated message"> 
     100                        <span class="spinner" ></span> <?php _e( 'Calculating revision diffs' ); ?> 
     101                </div> 
    103102                <h2 class="long-header"><?php echo $h2; ?></h2> 
    104                 <div id="backbonerevisionsinteract"></div> 
    105                 <div id="backbonerevisionsdiff"></div> 
     103                <div class="diff-slider-ticks-wrapper"> 
     104                        <div id="diff-slider-ticks"> 
     105                        </div> 
     106                </div> 
     107                <div id="backbonerevisionsinteract"> 
     108                </div> 
     109                <div id="backbonerevisionsdiff"> 
     110                </div> 
    106111                <hr /> 
    107112        </div> 
    108113</div> 
    109114 
    110115<script id="tmpl-revision" type="text/html"> 
     116        <div id="diffsubheader" class="diff-left-hand-meta-row"> 
     117                <div id="diff_from_current_revision"> 
     118                        <?php printf( '<b>%1$s</b> %2$s.' , __( 'From:' ), __( 'the current version' ) ); ?> 
     119                </div> 
     120                <div id="difftitlefrom"> 
     121                        <div class="diff-from-title"><?php _e( 'From:' ); ?></div>{{{ data.revision_from_date_author }}} 
     122                </div> 
     123        </div> 
     124 
    111125        <div id="diffsubheader"> 
    112                 <span id="diff_from_current_revision"><?php _e( 'Current version' ); ?><?php _e( '- compared to -' ); ?></span> 
    113                 <div id="difftitlefrom">{{{ data.revision_from_date_author }}} <?php _e( '- compared to -' ); ?></div> 
    114                 <div id="difftitle">{{{ data.revision_date_author }}}</div> 
    115                 <div id="diffcancel"><input class="button" onClick="document.location='<?php echo get_edit_post_link( $post->ID ); ?>'" type="submit" id="cancel" value="<?php esc_attr_e( 'Cancel' )?>" /></div> 
    116                 <div id="diffrestore"><input class="button button-primary" onClick="document.location='{{{ data.restoreaction }}}'" type="submit" id="restore" value="<?php esc_attr_e( 'Restore revision ID' )?>" /></div> 
    117                 <div id="comparetworevisions"><input type="checkbox" id="comparetwo" value="comparetwo" {{{ data.comparetwochecked }}} name="comparetwo"/> <label for="comparetwo"><?php esc_attr_e( 'Compare two revisions' ); ?></a></div>    </div> 
     126                <div id="difftitle"> 
     127                        <div class="diff-to-title"><?php _e( 'To:' ); ?></div>{{{ data.revision_date_author }}} 
     128                </div> 
     129                <div id="diffrestore"> 
     130                        <input class="button button-primary restore-button" onClick="document.location='{{{ data.restoreaction }}}'" type="submit" id="restore" value="<?php esc_attr_e( 'Restore This Revision' )?>" /> 
     131                </div> 
     132                <div id="comparetworevisions"> 
     133                        <input type="checkbox" id="comparetwo" value="comparetwo" {{{ data.comparetwochecked }}} name="comparetwo"/> 
     134                                <label for="comparetwo"><?php esc_attr_e( 'Compare two revisions' ); ?></a></label> 
     135                </div> 
     136        </div> 
     137 
    118138        <div id="removedandadded"> 
    119139                <div id="removed"><?php _e( 'Removed -' ); ?></div> 
    120140                <div id="added"><?php _e( 'Added +' ); ?></div> 
     
    124144 
    125145<script id="tmpl-revisionvinteract" type="text/html"> 
    126146        <div id="diffheader"> 
    127 <div id="diffprevious"><input class="button" type="submit" id="previous" value="<?php esc_attr_e( 'Previous' ); ?>" /></div> 
    128                         <div id="diffnext"><input class="button" type="submit" id="next" value="<?php esc_attr_e( 'Next' ); ?>" /></div> 
    129                         <div id="diffslider"> 
    130         <div id="revisioncount"> 
    131                                         <?php _e( 'Comparing' ); ?> 
    132                                         <span id="diff_left_count"> <?php _e( 'revision' ); ?></span> <span id="diff_left_count_inner"></span> 
    133                                         <span id="diff_left_current_revision"><?php _e( 'current version' ); ?></span> 
    134                                         <span id="diff_revision_from">{{{ data.diff_revision_from }}}</span> 
    135                                         <?php _e( ' to revision' ); ?> 
    136                                         <span id="diff_count">{{{ data.current_diff }}}</span> 
    137                                         <?php _e( ' of ' ); ?> 
    138                                         <span id="diff_max" ></span> 
    139                                 </div> 
    140  
    141                         <div id="slider" class="wp-slider"></div> 
     147                <div id="diffprevious"><input class="button" type="submit" id="previous" value="<?php esc_attr_e( 'Previous' ); ?>" /> 
    142148                </div> 
     149                <div id="diffnext"><input class="button" type="submit" id="next" value="<?php esc_attr_e( 'Next' ); ?>" /> 
     150                </div> 
     151                <div id="diffslider"> 
     152                        <div id="slider" class="wp-slider"> 
     153                        </div> 
     154                </div> 
    143155        </div> 
    144156</script> 
     157<script id="tmpl-revision-ticks" type="text/html"> 
     158        <div class="revision-tick revision-toload{{{ data.revision_toload }}} revision-scopeofchanges-{{{ data.scope_of_changes }}}"> 
     159        </div> 
     160</script> 
    145161<?php 
    146162/* 
    147163TODO Convert these into screen options 
  • wp-admin/css/colors-fresh.css

     
    175175.sidebar-name, 
    176176#nav-menu-header, 
    177177#nav-menu-footer, 
    178 .menu-item-handle, 
    179 .wp-slider .ui-slider-handle { 
     178.menu-item-handle { 
    180179        background: #f1f1f1; 
    181180        background-image: -webkit-gradient(linear, left bottom, left top, from(#ececec), to(#f9f9f9)); 
    182181        background-image: -webkit-linear-gradient(bottom, #ececec, #f9f9f9); 
     
    185184        background-image: linear-gradient(to top, #ececec, #f9f9f9); 
    186185} 
    187186 
     187 
     188 
    188189.widget .widget-top, 
    189190.postbox h3, 
    190191.stuffbox h3 { 
     
    13781379        background-color: #e9f6ea; 
    13791380} 
    13801381 
     1382.diff-to-title { 
     1383        color: #0080AA; 
     1384} 
     1385 
    13811386#diffsubheader{ 
    13821387        background-color: #f7f7f7; 
    13831388} 
    13841389 
     1390.comparetwo#diffsubheader.diff-left-hand-meta-row { 
     1391        background-color: #fcfcfc; 
     1392} 
     1393 
     1394.revision-tick.revision-toloadtrue { 
     1395        background-color: #9999cc; 
     1396        background: url(../images/wpspin_light.gif) no-repeat; 
     1397        background-position: middle; 
     1398        background-size: 1px 10px; 
     1399} 
     1400 
     1401.revision-tick.revision-toloadfalse { 
     1402        background-color: #aaa; 
     1403} 
     1404 
    13851405#att-info { 
    13861406        background-color: #e4f2Fd; 
    13871407} 
    13881408 
     1409body .ui-tooltip { 
     1410        border-color: #d7d7d7; 
     1411        background-color: #fff; 
     1412} 
     1413 
    13891414/* jQuery UI Slider */ 
    13901415.wp-slider.ui-slider { 
    13911416        border-color: #d7d7d7; 
     
    13931418} 
    13941419 
    13951420.wp-slider .ui-slider-handle { 
    1396         border-color: #d7d7d7; 
     1421        border-color: none; 
    13971422} 
    13981423 
     1424.wp-slider .ui-slider-handle.left-handle { 
     1425background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAA3NCSVQICAjb4U/gAAABAlBMVEXR2uHM1dzCzNW4ydOzxtSxw9Gqwc+bs7+Ss8SVscaZrLqQq7yNrMCKqr+EqsGDqb6GpruCpbl8pL15o7t1n7hwnLVika1djq5giqJXiqlYiqNJgp9ieYlDfqA/epw3dpk7dpg2dpo3dZo6dZc4dJY4dJg3cZY2bpE1bosxaIYxZIMrYX0tXnwtXHYsWHEnVW0mTmglT2cjTGIhRVsfQlYaN0kYM0QULDgTKTYRJzQTJzINISoLHCYNGyYKGCEIFxwJEhcJEhsHEhQDDAkHCg8EBwwCBwoEBAQBAwIBAQEBAQMAAgEBAAAAAAQAAQMBAAIAAAICAAEBAQAAAQAAAAD///+62qV+AAAAVnRSTlP/////////////////////////////////////////////////////////////////////////////////////////////////////////////////AEpNbNkAAAAJcEhZcwAACusAAArrAYKLDVoAAAAUdEVYdENyZWF0aW9uIFRpbWUAMy85LzEzrdD8jAAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAACbSURBVBiVVcvVDoNQEEXRqbu781B3d/dQQknh/P+vtBQKt/tpsnKGEOW4klkQFFvIsqwYzUJUvCts1wJl9gIruxT5hpLEyMBLKG+Z0ToJgrPLTDqOjyCxNN7mcahiaz50uDWsX0Fk+tKahKGJpX55qp1qpAsCY0lt5MdPUD2KoniowBRXn+f5Xp4RZDfCKg1W0D637P/iznn06w0M+083NZW9ZwAAAABJRU5ErkJggg==); 
     1426} 
     1427 
     1428.wp-slider .ui-slider-handle.ui-state-active.left-handle { 
     1429background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAA3NCSVQICAjb4U/gAAAAzFBMVEXZ5ejU4eXM3ODG2NzE1tvB1Nq90deux86sxs2qxcynwsqlwcmjwMihvseevMWdvMSbusOXuMGTtb6IrbiHrLeCqbSBqLN/p7J3oa11oKxzn6tvnKhrmaZqmKVpmKVol6RllaJhk6Bej51djptaiZZZiJVYhpNWg5BUf4xSfYlRfIhPeYRMdYBKcXxFaXNDZnA+X2g9XmY8XGU4VV43VFw2U1s0UFgyTVQxS1IwSVAuR00sREosQ0orQkgqQEYpPkQoPkMoPUMoPUL///8pY4MvAAAARHRSTlP/////////////////////////////////////////////////////////////////////////////////////////AHHSjxIAAAAJcEhZcwAACusAAArrAYKLDVoAAAAUdEVYdENyZWF0aW9uIFRpbWUAMy85LzEzrdD8jAAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAACUSURBVBiVVctXEoJQEETRMaIo5qwF5hwxYOY9ev97EiQ43q+pUz2EYk9n5UElU0rpRO016toO79WhxlVysWqkroRgsswSjAsbnasgpGdsMk25gooZvR3K8CQxCuU9jH8FhZ3022rwJTZ4CK9nnwJBbiO8yVpFKDButm1bOn6iLFyZt5igeZLHOrhgfJ8k/yXTVoLrAxo1P5iCdUg7AAAAAElFTkSuQmCC); 
     1430} 
     1431 
     1432.wp-slider .ui-slider-handle { 
     1433        /* Slider drag Triangle CSS */ 
     1434background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAA3NCSVQICAjb4U/gAAAA8FBMVEU2dZipwNBJl8VGmcX///+EpLlBgqpymrNFjru3ydNWiKs6eZzY4uuRrL08faPL3OZBjLSBqsCTssRHlMJEf59cj657o7xKl8OEqsE9gag2dJtEkb+ct8iZs8BHmMePq8BejKZAiK5llK5FjrlJl8c6dZdGl8avxdBJlcZ4nbc6ep6XrbpKgZ+Lqr5KmcdIkbqsws1Gk8E+f6c4dptaiadFirRKl8V8pblImcNIl8eGpruVscZCh7BMlsdIlcFImchEkbs9eJpCjbdGjbk8fJ84dp02dpo8gatMlsM2dps8faVAg61Ej71Ek75IksFIlcOaLCw7AAAAUHRSTlP/////AP///////////////////////////////////////////////////////////////////////////////////////////////////xB6m5UAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAUdEVYdENyZWF0aW9uIFRpbWUAMy85LzEzrdD8jAAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAACaSURBVBiVVcxZD8FAGIXhjxzUVktQgqKmo7ZYhkgsiS1tQuj//zeomo736uS5OFSo2W6UXc/R5hxXW5foxDlXqUKZx0GFZpXynuM4kXhjgjgyJkGzQIjpvi9Fx1uQ0iQUh4GkR/Ini0CQ2IfQ24YC4X8T+Mn0zj8lO1IgnqZpzlxE0m4YhrFsKYJVn126UGV+W1wHf4LdpByuF0goFKI7tv/dAAAAAElFTkSuQmCC); 
     1435} 
     1436 
    13991437.wp-slider .ui-slider-handle.ui-state-hover, 
    14001438.wp-slider .ui-slider-handle.ui-state-focus { 
    1401         border-color: #aaa; 
     1439        border-color: none; 
     1440        outline: none; 
    14021441} 
    14031442 
    14041443.wp-slider .ui-slider-handle.ui-state-active { 
    1405         border-color: #aaa; 
    1406         background: #eee; 
    1407         background-image: -webkit-gradient(linear, left bottom, left top, from(#f9f9f9), to(#ececec)); 
    1408         background-image: -webkit-linear-gradient(bottom, #f9f9f9, #ececec); 
    1409         background-image:    -moz-linear-gradient(bottom, #f9f9f9, #ececec); 
    1410         background-image:      -o-linear-gradient(bottom, #f9f9f9, #ececec); 
    1411         background-image: linear-gradient(to top, #f9f9f9, #ececec); 
     1444        background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAA3NCSVQICAjb4U/gAAAA51BMVEUgZpDkzc0yd6f///8mcqFJm8cjbZZzr80mg78lh8BDk8UngLl+s9AmfKk4hrGeweBaoMhNlMORwt4nd6Zdm8BAjMEnf7RYmsMkb50mhsFWlsYhZ5ImhbwocZg0f61Lk8E9i7twqNBgo8VSmMUofLBcm8o3faUpfK8mh8Aia5MgZpFMmcgpeapDmcJjo8sliMEmh70nhLkkcKAqgLF2sc8sc5ojbZsngrMkh8EnfKw1eaUjbpkkapImeKQgaJAohb0mh8MmhcMng7kkcKEpf68iZ48haJMmhb8kicEmc6MibJkia5UnhLsw1mWvAAAATXRSTlP/AP8A/////////////////////////////////////////////////////////////////////////////////////////////////9/iR18AAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAUdEVYdENyZWF0aW9uIFRpbWUAMy85LzEzrdD8jAAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAACaSURBVBiVVc15D8FAEIfh+Ymj6761LIrSiCNVVyjbRGgifP/PQ6q22/evyZPJDNXzD6G0qNDq5PtO3DJDFyfRpk+po2Eo0h5Qx9U0LRa3SejdlR2rDMLI41yKh6/AtOSzUiuU4kvemSMUDBsRXGuRIHj/CvCXyTNcSXelQBQYY1uBWMY651xfK4KzbdgzqJI73LK7hGC6r0bTB5apIhqIH/YIAAAAAElFTkSuQmCC); 
    14121445} 
    14131446 
    14141447/* edit image */ 
  • wp-admin/css/wp-admin.css

     
    35973597        vertical-align: middle; 
    35983598} 
    35993599 
     3600.diff-from-title, 
     3601.diff-to-title { 
     3602        font-size: 14px; 
     3603        font-weight: bold; 
     3604        width:60px; 
     3605        text-align: right; 
     3606        float: left; 
     3607        margin-right: 5px; 
     3608} 
     3609 
    36003610.revisiondiffcontainer { 
    36013611        width: 96%; 
    36023612} 
     
    36053615        margin: 2px; 
    36063616} 
    36073617 
    3608 #diffrestore, 
    3609 #diffnext, 
    3610 #diffcancel { 
     3618#diffnext { 
    36113619        float: right; 
    36123620        margin-right: 5px; 
    36133621} 
    36143622 
     3623#diffrestore input{ 
     3624        margin-left: 10px; 
     3625} 
     3626 
    36153627#diffprevious, 
    36163628#difftitle, 
    36173629#difftitlefrom, 
     
    36233635 
    36243636#diffprevious, 
    36253637#diffnext { 
    3626         margin-top: 7px; 
    36273638        height: 30px; 
    36283639} 
    36293640 
     
    36353646#diffheader { 
    36363647        border-bottom: 1px solid #dfdfdf; 
    36373648        width: 100%; 
    3638         height: 45px; 
    3639         line-height: 45px; 
    3640         padding-top: 10px; 
     3649        height: 40px; 
     3650        line-height: 40px; 
     3651        padding-top: 30px; 
    36413652} 
    36423653 
    3643 #diffsubheader { 
    3644         border-bottom: 1px solid #dfdfdf; 
     3654#diffsubheader,.diff-left-hand-meta-row { 
    36453655        width: 100%; 
    36463656        height:35px; 
    36473657        line-height: 35px; 
     3658        display: block; 
    36483659} 
    36493660 
    3650 #diffslider { 
     3661#diffslider{ 
    36513662        width: 70%; 
    36523663        margin-left: auto; 
    36533664        margin-right: auto; 
    36543665        text-align: center; 
    3655         height: 3.5em; 
     3666        height: 0.8em; 
     3667        margin-top: 20px; 
    36563668} 
    36573669 
     3670.diff-slider-ticks-wrapper { 
     3671        margin-left: auto; 
     3672        margin-right: auto; 
     3673        text-align: center; 
     3674} 
     3675 
     3676#diff-slider-ticks { 
     3677        position: absolute; 
     3678        margin-top: 50px; 
     3679        z-index: 1; 
     3680} 
     3681 
    36583682#revisioncount { 
    36593683        width: 50%; 
    36603684        margin-left: auto; 
     
    37223746 
    37233747#comparetworevisions { 
    37243748        float: right; 
     3749        position: absolute; 
     3750        top: 10px; 
     3751        right: 10px; 
    37253752        line-height: 35px; 
    37263753        padding-right: 5px; 
    37273754} 
     
    37313758} 
    37323759 
    37333760#difftitle img, 
    3734 #difftitlefrom img { 
     3761#difftitlefrom img, 
     3762.post-revisions li img { 
    37353763        vertical-align: middle; 
    37363764        margin-left: 5px; 
    37373765} 
     3766.post-revisions li { 
     3767        vertical-align: middle; 
     3768        height: 28px; 
     3769} 
    37383770 
    37393771#showsplitviewoption, 
    37403772#toggleshowautosavesoption { 
     
    37573789.comparetwo #diffprevious, 
    37583790.comparetwo #diffnext, 
    37593791span#diff_left_current_revision, 
    3760 span#diff_from_current_revision, 
     3792#diff_from_current_revision, 
    37613793.currentversion span#diff_left_count, 
    37623794.currentversion span#diff_left_count_inner, 
    3763 .currentversion #difftitlefrom, 
    3764 .comparetwo.currentversion #difftitlefrom { 
     3795.comparetwo.currentversion #diff_from_current_revision, 
     3796#diffsubheader.diff-left-hand-meta-row { 
    37653797        display: none; 
    37663798} 
    37673799 
     
    37693801span#diff_left_count, 
    37703802span#diff_left_count_inner, 
    37713803.comparetwo #difftitlefrom, 
    3772 .comparetwo.currentversion span#diff_from_current_revision, 
    37733804.leftmodelloading #modelsloading, 
    37743805.rightmodelloading #modelsloading, 
    37753806.leftmodelloading #modelsloading .spinner, 
    37763807.rightmodelloading #modelsloading .spinner, 
    3777 { 
    3778         display: inline; 
     3808.comparetwo #diffsubheader.diff-left-hand-meta-row { 
     3809        display: block; 
    37793810} 
    37803811 
     3812.revision-tick { 
     3813        width: 1px; 
     3814        float: left; 
     3815        margin-right: 15px; 
     3816        height: 11px; 
     3817        padding: 0; 
     3818        margin-left: 0px; 
     3819} 
     3820 
     3821.revision-tick.revision-scopeofchanges-vsmall { 
     3822                width: 1px; 
     3823                background-color: #aaa; 
     3824} 
     3825 
     3826.revision-tick.revision-scopeofchanges-small { 
     3827                width: 2px; 
     3828                background-color: #aaa; 
     3829                margin-left: -1px; 
     3830} 
     3831 
     3832.revision-tick.revision-scopeofchanges-med { 
     3833                width: 3px; 
     3834                margin-left: -2px; 
     3835                background-color: #666; 
     3836} 
     3837 
     3838.revision-tick.revision-scopeofchanges-large { 
     3839                width: 4px; 
     3840                margin-left: -3px; 
     3841                background-color: #333; 
     3842} 
     3843 
     3844.revision-tick.revision-scopeofchanges-vlarge { 
     3845                margin-left: -3px; 
     3846                width: 4px; 
     3847                background-color: #111; 
     3848                left: 1; 
     3849} 
     3850 
    37813851.diff-loading { 
    37823852        margin-top: 50px; 
    37833853        width: 100%; 
     
    37923862        float: none; 
    37933863} 
    37943864 
    3795 #difftitlefrom { 
    3796         float: left; 
    3797         display: none; 
    3798 } 
    3799  
    38003865#modelsloading { 
    38013866        float: right; 
     3867        position: absolute; 
    38023868        line-height: 30px; 
    38033869        display: none; 
    38043870        clear: none; 
    3805         margin: 0; 
     3871        right: 170px; 
    38063872        margin-top: -40px; 
    38073873} 
    38083874 
    38093875#modelsloading .spinner { 
    38103876        float: left; 
    3811  } 
     3877} 
    38123878 
     3879.ui-tooltip-content img { 
     3880        float: left; 
     3881        margin-right: 5px; 
     3882} 
     3883 
     3884 
     3885 
     3886/*  jQuery UI Tooltip 1.10.1 */ 
     3887 
     3888.ui-tooltip { 
     3889        padding: 8px; 
     3890        position: absolute; 
     3891        z-index: 9999; 
     3892        max-width: 300px; 
     3893        min-width: 130px; 
     3894} 
     3895 
     3896body .ui-tooltip { 
     3897        border-width: 1px; 
     3898} 
     3899 
     3900.ui-tooltip, .arrow:after { 
     3901        border: 1px solid #d7d7d7; 
     3902} 
     3903 
     3904.ui-tooltip { 
     3905        padding: 5px 10px; 
     3906} 
     3907 
     3908.arrow { 
     3909        width: 70px; 
     3910        height: 16px; 
     3911        overflow: hidden; 
     3912        position: absolute; 
     3913        left: 50%; 
     3914        margin-left: -35px; 
     3915        bottom: -16px; 
     3916        z-index: 99999; 
     3917 
     3918} 
     3919 
     3920.arrow.top { 
     3921        top: -16px; 
     3922        bottom: auto; 
     3923} 
     3924 
     3925.arrow.left { 
     3926        left: 20%; 
     3927} 
     3928 
     3929.arrow:after { 
     3930        content: ""; 
     3931        position: absolute; 
     3932        left: 20px; 
     3933        top: -20px; 
     3934        width: 25px; 
     3935        height: 25px; 
     3936        background-color: #FFF; 
     3937        -webkit-transform: rotate(45deg); 
     3938        -moz-transform: rotate(45deg); 
     3939        -ms-transform: rotate(45deg); 
     3940        -o-transform: rotate(45deg); 
     3941        tranform: rotate(45deg); 
     3942} 
     3943 
     3944.arrow.top:after { 
     3945        bottom: -20px; 
     3946        top: auto; 
     3947} 
     3948 
    38133949 /* jQuery UI Slider */ 
    38143950 
    38153951.wp-slider.ui-slider { 
     
    38243960.wp-slider .ui-slider-handle { 
    38253961        position: absolute; 
    38263962        z-index: 2; 
    3827         width: 1.2em; 
    3828         height: 1.2em; 
    3829         border-width: 1px; 
    3830         border-style: solid; 
    3831         border-radius: 3px; 
     3963        width: 17px; 
     3964        height: 17px; 
     3965        border: none; 
    38323966} 
    38333967 
    38343968.wp-slider .ui-slider-range {