window.wp = window.wp || {};
(function($) {
wp.revisions = {
views : {},
Model : Backbone.Model.extend({
idAttribute : 'ID',
urlRoot : ajaxurl + '?action=revisions-data' +
'&show_autosaves=true&show_split_view=true&nonce=' + wpRevisionsSettings.nonce,
defaults: {
ID : 0,
revision_date_author : '',
revision_date_author_short: '',
revisiondiff : '
" )
.addClass( "arrow" )
.addClass( feedback.vertical )
.addClass( feedback.horizontal )
.appendTo( $( this ) );
}
},
show: false,
hide: false,
content: function() {
return message;
}
} );
},
/**/
completeApplicationSetup : function() {
this._revisionView = new wp.revisions.views.View({
model : this._revisions
});
this._revisionView.render();
$( '#slider' ).slider( 'option', 'max', this._revisions.length - 1 );
this.reload_toload_revisions( this._revisions );
this._revisionsInteractions = new wp.revisions.views.Interact({
model : this._revisions
});
this._revisionsInteractions.render();
this._tickmarkView = new wp.revisions.views.Tickmarks({
model : this._revisions
});
this._tickmarkView.render();
this._tickmarkView.resetticks();
/*
.on( 'mouseup', function( event ) {
REVAPP._keep_tooltip_open = false;
$( this ).find('.ui-slider-tooltip').hide();
} ).on( 'mousedown', function( event ) {
REVAPP._keep_tooltip_open = true;
} ).on( 'mouseout', function( event ) {
if ( REVAPP._keep_tooltip_open)
event.stopImmediatePropagation();
});
*/
/*
//Options hidden for now, moving to screen options
this._revisionsOptions = new wp.revisions.views.Options({
model : this._revisions
});
this._revisionsOptions.render();
*/
}
})
};
wp.revisions.Collection = Backbone.Collection.extend({
model : wp.revisions.Model,
url : ajaxurl + '?action=revisions-data&compare_to=' + wpRevisionsSettings.post_id +
'&show_autosaves=true&show_split_view=true&nonce=' + wpRevisionsSettings.nonce,
initialize : function() {
}
} );
_.extend(wp.revisions.views, {
//Ticks inside slider view
//
Tickmarks : Backbone.View.extend({
el : $('#diff-slider-ticks')[0],
tagName : 'diff-slider-ticks-view',
className : 'diff-slider-ticks-container',
template : wp.template('revision-ticks'),
model : wp.revisions.Model,
resetticks : function() {
var slider_max = $( '#slider' ).slider( 'option', 'max');
var slider_width = $( '#slider' ).width();
var adjust_max = ( 2 === REVAPP._compareoneortwo ) ? 1 : 0;
var tick_width = Math.floor( slider_width / ( slider_max - adjust_max ) );
//TODO: adjust right margins for wider ticks so they stay centered on handle stop point
//set minimum and maximum widths for tick marks
tick_width = (tick_width > 50 ) ? 50 : tick_width;
tick_width = (tick_width < 10 ) ? 10 : tick_width;
slider_width = tick_width * (slider_max - adjust_max ) +1;
$( '#slider' ).width( slider_width );
$( '.diff-slider-ticks-wrapper' ).width( slider_width );
$( '#diffslider' ).width( slider_width );
$( '#diff-slider-ticks' ).width( slider_width );
var a_tick_width = $( '.revision-tick' ).width();
if ( tick_width !== a_tick_width ) { // is the width already set correctly?
$( '.revision-tick' ).each( function( ) {
$(this).css( 'margin-right', tick_width - 1 + 'px'); //space the ticks out using right margin
});
if( 2 === REVAPP._compareoneortwo ) {
$( '.revision-tick' ).first().remove(); //TODO - remove the check
}
$( '.revision-tick' ).last().css( 'margin-right', '0' ); // last tick gets no right margin
}
},
//render the tickmark view
render : function() {
var self = this;
if ( null !== self.model ) {
var addhtml = "";
_.each ( self.model.models, function ( the_model ) {
addhtml = addhtml + self.template ( the_model.toJSON() );
});
self.$el.html( addhtml );
}
self.resetticks();
return self;
}
}),
//
//primary revision diff view
//
View : Backbone.View.extend({
el : $('#backbonerevisionsdiff')[0],
tagName : 'revisionvview',
className : 'revisionview-container',
template : wp.template('revision'),
comparetwochecked : '',
draggingleft : false,
//
//render the revisions
//
render : function() {
var addhtml = '';
//compare two revisions mode?
if ( 2 === REVAPP._compareoneortwo ) {
this.comparetwochecked = 'checked';
if ( this.draggingleft ) {
if ( this.model.at( REVAPP._left_diff ) ) {
addhtml = this.template( _.extend(
this.model.at( REVAPP._left_diff ).toJSON(),
{ comparetwochecked : this.comparetwochecked } //keep the checkmark checked
) );
}
} else { //dragging right handle
var thediff = REVAPP._right_diff;
if ( this.model.at( thediff ) ) {
addhtml = this.template( _.extend(
this.model.at( thediff ).toJSON(),
{ comparetwochecked : this.comparetwochecked } //keep the checkmark checked
) );
}
}
} else { //end compare two revisions mode, eg only one slider handle
this.comparetwochecked = '';
if ( this.model.at( REVAPP._right_diff - 1 ) ) {
addhtml = this.template( _.extend(
this.model.at( REVAPP._right_diff - 1 ).toJSON(),
{ comparetwochecked : this.comparetwochecked } //keep the checkmark unchecked
) );
}
}
this.$el.html( addhtml );
if ( this.model.length < 3 ) {
$( 'div#comparetworevisions' ).hide(); //don't allow compare two if fewer than three revisions
}
if ( this.model.length < 2 ) {
$( 'div#diffslider' ).hide(); //don't allow compare two if fewer than three revisions
$( 'div.diff-slider-ticks-wrapper' ).hide();
}
//
// add tooltips to the handles
//
if ( 2 === REVAPP._compareoneortwo ) {
REVAPP.addTooltip ( $( 'a.ui-slider-handle.left-handle' ),
( REVAPP._right_diff >= REVAPP._revisions.length ) ? '' : REVAPP._revisions.at( REVAPP._left_diff ).get( 'revision_date_author_short' ) );
REVAPP.addTooltip ( $( 'a.ui-slider-handle.right-handle' ),
( REVAPP._right_diff >= REVAPP._revisions.length ) ? '' : REVAPP._revisions.at( REVAPP._right_diff ).get( 'revision_date_author_short' ) );
} else {
REVAPP.addTooltip ( $( 'a.ui-slider-handle' ),
( REVAPP._right_diff >= REVAPP._revisions.length ) ? '' : REVAPP._revisions.at( REVAPP._right_diff ).get( 'revision_date_author_short' ) );
}
//
// hide the restore button when on the last sport/current post data
//
if ( REVAPP._right_diff === REVAPP._revisions.length ){
$( '.restore-button' ).hide();
} else {
$( '.restore-button' ).show();
}
return this;
},
//the compare two button is in this view, add the interaction here
events : {
'click #comparetwo' : 'clickcomparetwo'
},
//
//turn on/off the compare two mmode
//
clickcomparetwo : function(){
self = this;
if ( $( 'input#comparetwo' ).is( ':checked' ) ) { //compare 2 mode
REVAPP._compareoneortwo = 2 ;
if ( 1 === REVAPP._right_diff )
REVAPP._right_diff = 2;
REVAPP._revisionView.draggingleft = false;
wpRevisionsSettings.revision_id = ''; // reset passed revision id so switching back to one handle mode doesn't re-select revision
REVAPP.reloadleftright();
REVAPP._revisionView.model = REVAPP._right_handle_revisions;
} else { //compare one mode
REVAPP._compareoneortwo = 1 ;
REVAPP._revisionView.draggingleft = false;
//REVAPP._left_diff = 0;
//REVAPP._right_diff = (REVAPP._revisions.length <= REVAPP._right_diff ) ? REVAPP._right_diff + 1 : REVAPP._right_diff + 1;
REVAPP.reloadmodelsingle();
}
//REVAPP._revisionView.render();
REVAPP._revisionsInteractions.render();
REVAPP._tickmarkView.render();
}
}),
//
//options view for show autosaves and show split view options
//
/* DISABLED for now
Options : Backbone.View.extend({
el : $('#backbonerevisionsoptions')[0],
tagName : 'revisionoptionsview',
className : 'revisionoptions-container',
template : wp.template('revisionoptions'),
//render the options view
render : function() {
var addhtml = this.template;
this.$el.html( addhtml );
return this;
},
//add options interactions
events : {
'click #toggleshowautosaves' : 'toggleshowautosaves',
'click #showsplitview' : 'showsplitview'
},
//
//toggle include autosaves
//
toggleshowautosaves : function() {
var self = this;
if ( $( '#toggleshowautosaves' ).is( ':checked' ) ) {
REVAPP._autosaves = true ;
} else {
REVAPP._autosaves = false ;
}
//refresh the model data
REVAPP.reloadmodel();
},
//
//toggle showing the split diff view
//
showsplitview : function() {
var self = this;
if ( $( 'input#showsplitview' ).is( ':checked' ) ) {
REVAPP._show_split_view = 'true';
$('.revisiondiffcontainer').addClass('diffsplit');
} else {
REVAPP._show_split_view = '';
$('.revisiondiffcontainer').removeClass('diffsplit');
}
REVAPP.reloadmodel();
}
}),
*/
//
//main interactions view
//
Interact : Backbone.View.extend({
el : $('#backbonerevisionsinteract')[0],
tagName : 'revisionvinteract',
className : 'revisionvinteract-container',
template : wp.template('revisionvinteract'),
initialize : function() {
},
render : function() {
var self = this;
var addhtml = this.template;
this.$el.html( addhtml );
var modelcount = REVAPP._revisions.length;
slider = $( "#slider" );
if ( 1 === REVAPP._compareoneortwo ) {
//set up the slider with a single handle
slider.slider({
value: REVAPP._right_diff-1,
min: 0,
max: modelcount-1,
step: 1,
//slide interactions for one handles slider
slide : function( event, ui ) {
REVAPP._right_diff = ( ui.value + 1 );
REVAPP._revisionView.render();
/*
$( 'a.ui-slider-handle' ).tooltip( {
content: REVAPP._revisions.at( ui.value ).get( 'revision_date_author_short' ),
position: {
my: "top-65",
using: function( position, feedback ) {
$( this ).css( position );
$( "
" )
.addClass( "arrow" )
.addClass( feedback.vertical )
.addClass( feedback.horizontal )
.appendTo( this );
}
}
});//.trigger( 'close' ).trigger( 'open' );
*/
}
});
$( '.revisiondiffcontainer' ).removeClass( 'comparetwo' );
} else { //comparing more than one, eg 2
//set up the slider with two handles
slider.slider({
values : [ REVAPP._left_diff, REVAPP._right_diff + 1 ],
min : 1,
max : modelcount+1,
step : 1,
range: true,
//in two handled mode when user starts dragging, swap in precalculated diff for handle
start : function (event, ui ) {
var index = $( ui.handle ).index(); //0 (left) or 1 (right)
switch ( index ) {
case 1: //left handle drag
if ( REVAPP._left_model_loading ) //left model still loading, prevent sliding left handle
return false;
REVAPP._revisionView.draggingleft = true;
if ( REVAPP._revisionView.model !== REVAPP._left_handle_revisions &&
null !== REVAPP._left_handle_revisions ) {
REVAPP._revisionView.model = REVAPP._left_handle_revisions;
REVAPP._tickmarkView.model = REVAPP._left_handle_revisions;
REVAPP._tickmarkView.render();
}
REVAPP._left_diff_start = ui.values[ 0 ];
break;
case 2: //right
if ( REVAPP._right_model_loading || 0 === REVAPP._right_handle_revisions.length) //right model still loading, prevent sliding right handle
return false;
if ( REVAPP._revisionView.model !== REVAPP._right_handle_revisions &&
null !== REVAPP._right_handle_revisions ) {
REVAPP._revisionView.model = REVAPP._right_handle_revisions;
REVAPP._tickmarkView.model = REVAPP._right_handle_revisions;
REVAPP._tickmarkView.render();
}
REVAPP._revisionView.draggingleft = false;
REVAPP._right_diff_start = ui.values[ 1 ];
break;
}
},
//when sliding in two handled mode change appropriate value
slide : function( event, ui ) {
if ( ui.values[ 0 ] === ui.values[ 1 ] ) //prevent compare to self
return false;
var index = $( ui.handle ).index(); //0 (left) or 1 (right)
switch ( index ) {
case 1: //left
if ( REVAPP._left_model_loading ) //left model still loading, prevent sliding left handle
return false;
REVAPP._left_diff = ui.values[ 0 ];
break;
case 2: //right
if ( REVAPP._right_model_loading ) //right model still loading, prevent sliding right handle
return false;
REVAPP._right_diff = ui.values[ 1 ];
break;
}
if ( 0 === REVAPP._left_diff ) {
$( '.revisiondiffcontainer' ).addClass( 'currentversion' );
} else {
$( '.revisiondiffcontainer' ).removeClass( 'currentversion' );
}
REVAPP._revisionView.render();
},
//when the user stops sliding in 2 handle mode, recalculate diffs
stop : function( event, ui ) {
if ( 2 === REVAPP._compareoneortwo ) {
//calculate and generate a diff for comparing to the left handle
//and the right handle, swap out when dragging
var index = $( ui.handle ).index(); //0 (left) or 1 (right)
switch ( index ) {
case 1: //left
//left handle dragged & changed, reload right handle model
if ( REVAPP._left_diff_start !== ui.values[ 0 ] )
REVAPP.reloadright();
break;
case 2: //right
//REVAPP._right_diff = ( 1 >= REVAPP._right_diff ) ? 1 : REVAPP._right_diff-1;
//right handle dragged & changed, reload left handle model if changed
if ( REVAPP._right_diff_start !== ui.values[ 1 ] )
REVAPP.reloadleft();
break;
}
}
}
});
$( '.revisiondiffcontainer' ).addClass( 'comparetwo' );
$( '#diffslider a.ui-slider-handle' ).first().addClass( 'left-handle' ).next().addClass( 'right-handle' );
}
return this;
},
//next and previous buttons, only available in compare one mode
events : {
'click #next' : 'nextrevision',
'click #previous' : 'previousrevision'
},
//go to the next revision
nextrevision : function() {
if ( REVAPP._right_diff < this.model.length ) //unless at right boundry
REVAPP._right_diff = REVAPP._right_diff + 1 ;
REVAPP._revisionView.render();
$( '#slider' ).slider( 'value', REVAPP._right_diff - 1 ).trigger( 'slide' );
},
//go the the previous revision
previousrevision : function() {
if ( REVAPP._right_diff > 1 ) //unless at left boundry
REVAPP._right_diff = REVAPP._right_diff - 1 ;
REVAPP._revisionView.render();
$( '#slider' ).slider( 'value', REVAPP._right_diff - 1 ).trigger( 'slide' );
}
})
});
//instantiate Revision Application
REVAPP = new wp.revisions.App();
}(jQuery));