205 lines
6.4 KiB
JavaScript
205 lines
6.4 KiB
JavaScript
/********************************************************/
|
|
/** HERE MAIN MODIFIED PART FOR turnjs SUPPORT **/
|
|
/********************************************************/
|
|
/// requires jquery and turnjs
|
|
/// all code added in viewer.js (from pdfjs build) in order to support
|
|
/// flipbook is commented with '$FB:' string to allow to find it easilly
|
|
|
|
var bookFlip = {
|
|
_width: [], //flipbook pages width
|
|
_height: [], //flipbook pages height
|
|
active: false, //flipbook mode on
|
|
_spreadBk: NaN, //spread mode backup to restore
|
|
_evSpread: null,//spread mode changed default event handler
|
|
_spread: NaN, //spread page mode
|
|
toStart: false, //PDFjs require flipbook at start
|
|
_intoView: null,//link handler default function
|
|
_visPages: null,//visible pages function
|
|
_ready: false, //ready to start flipbook
|
|
|
|
// event listeners when bookFlip need different handling
|
|
init: function(){
|
|
$(document).on('rotationchanging', () => {this.rotate()});
|
|
$(document).on('scalechanging', () => {this.resize()});
|
|
$(document).on('pagechanging', () => {this.flip()});
|
|
|
|
$(document).on('documentinit', () => {
|
|
this.stop();
|
|
this._ready = false;
|
|
});
|
|
|
|
$(document).on('scrollmodechanged', () => {
|
|
var scroll = PDFViewerApplication.pdfViewer.scrollMode;
|
|
if (scroll === 3)this.start();
|
|
else this.stop();
|
|
var button = PDFViewerApplication.appConfig.secondaryToolbar.bookFlipButton;
|
|
button.classList.toggle('toggled', scroll === 3);
|
|
});
|
|
|
|
$(document).on('switchspreadmode', (evt) => {
|
|
this.spread(evt.originalEvent.detail.mode);
|
|
PDFViewerApplication.eventBus.dispatch('spreadmodechanged', {
|
|
source: PDFViewerApplication,
|
|
mode: evt.originalEvent.detail.mode
|
|
});
|
|
});
|
|
|
|
$(document).on('pagesloaded', () => {
|
|
this._ready = true;
|
|
if(this.toStart){
|
|
this.toStart = false;
|
|
PDFViewerApplication.pdfViewer.scrollMode = 3;
|
|
}
|
|
});
|
|
|
|
$(document).on('baseviewerinit', () => {
|
|
PDFViewerApplicationOptions.set('scrollModeOnLoad',3);
|
|
|
|
this._intoView = PDFViewerApplication.pdfViewer.scrollPageIntoView;
|
|
this._visPages = PDFViewerApplication.pdfViewer._getVisiblePages;
|
|
});
|
|
},
|
|
// startup flipbook
|
|
start: function(){
|
|
if(this.active || !this._ready)return;
|
|
this.active = true;
|
|
|
|
var viewer = PDFViewerApplication.pdfViewer;
|
|
|
|
$('.scrollModeButtons').removeClass('toggled');
|
|
|
|
this._spreadBk = viewer.spreadMode;
|
|
var selected = $('.spreadModeButtons.toggled').attr('id');
|
|
this._spread = (this._spreadBk !== 2) ? 0 : 2;
|
|
viewer.spreadMode = 0;
|
|
viewer._spreadMode = -1;
|
|
$('.spreadModeButtons').removeClass('toggled');
|
|
$('#' + selected).addClass('toggled');
|
|
|
|
this._evSpread = PDFViewerApplication.eventBus._listeners.switchspreadmode;
|
|
PDFViewerApplication.eventBus._listeners.switchspreadmode = null;
|
|
|
|
viewer.scrollPageIntoView = (data) => {return this.link(data)};
|
|
viewer._getVisiblePages = () => {return this.load()};
|
|
|
|
var scale = viewer.currentScale;
|
|
var parent = this;
|
|
$('#viewer .page').each(function(){
|
|
parent._width[$(this).attr('data-page-number')] = $(this).width() / scale;
|
|
parent._height[$(this).attr('data-page-number')] = $(this).height() / scale;
|
|
});
|
|
|
|
$('#viewer').removeClass('pdfViewer').addClass('bookViewer').css({ opacity: 1 });;
|
|
|
|
$('#spreadOdd').prop('disabled', true);
|
|
var pages = PDFViewerApplication.pagesCount;
|
|
for(var page = 3; page < pages + (pages%2); page ++){
|
|
if(this._height[page]!=this._height[page-1] || this._width[page]!=this._width[page-1]){
|
|
$('#spreadEven').prop('disabled', true);
|
|
this._spread = 0;
|
|
}
|
|
}
|
|
|
|
$('#viewer').turn({
|
|
elevation: 50,
|
|
width: this._size(PDFViewerApplication.page,'width') * this._spreadMult(),
|
|
height: this._size(PDFViewerApplication.page,'height'),
|
|
page: PDFViewerApplication.page,
|
|
when: {
|
|
turned: function(event, page) {
|
|
PDFViewerApplication.page = page;
|
|
viewer.update();
|
|
}
|
|
},
|
|
display: this._spreadType()
|
|
});
|
|
},
|
|
// shutdown flipbook
|
|
stop: function(){
|
|
if(!this.active)return;
|
|
this.active = false;
|
|
|
|
var viewer = PDFViewerApplication.pdfViewer;
|
|
|
|
$('#viewer').turn('destroy');
|
|
|
|
viewer.scrollPageIntoView = this._intoView;
|
|
viewer._getVisiblePages = this._visPages;
|
|
|
|
PDFViewerApplication.eventBus._listeners.switchspreadmode = this._evSpread;
|
|
viewer.spreadMode = this._spreadBk;
|
|
|
|
$('#viewer .page').removeAttr('style');
|
|
$('#viewer').removeAttr('style').removeClass('shadow bookViewer').addClass('pdfViewer');
|
|
|
|
var parent = this;
|
|
$('#viewer .page').each(function(){
|
|
var page = $(this).attr('data-page-number');
|
|
$(this).css( 'width', parent._size(page,'width')).css( 'height', parent._size(page,'height'));
|
|
});
|
|
|
|
},
|
|
// resize flipbook pages
|
|
resize: function(){
|
|
if(!this.active)return;
|
|
var page = PDFViewerApplication.page;
|
|
$('#viewer').turn('size', this._size(page,'width') * this._spreadMult(), this._size(page,'height'));
|
|
},
|
|
// rotate flipbook pages
|
|
rotate: function(){
|
|
if(!this.active)return;
|
|
[this._height, this._width] = [this._width, this._height];
|
|
this.resize();
|
|
},
|
|
// change flipbook spread mode
|
|
spread: function(spreadMode){
|
|
if(!this.active)return;
|
|
this._spread = spreadMode;
|
|
$('#viewer').turn('display', this._spreadType());
|
|
this.resize();
|
|
},
|
|
// turn page
|
|
flip: function(){
|
|
if(!this.active)return;
|
|
$('#viewer').turn('page', PDFViewerApplication.page);
|
|
if(!PDFViewerApplication.pdfViewer.hasEqualPageSizes)this.resize();
|
|
},
|
|
// follow internal links
|
|
link: function(data){
|
|
if(!this.active)return;
|
|
PDFViewerApplication.page = data.pageNumber;
|
|
},
|
|
// load pages near shown page
|
|
load: function(){
|
|
if(!this.active)return;
|
|
var views = PDFViewerApplication.pdfViewer._pages;
|
|
var arr = [];
|
|
var page = PDFViewerApplication.page;
|
|
var min = Math.max(page - ((this._spread === 0) ? 2 : 3 + (page%2)), 0);
|
|
var max = Math.min(page + ((this._spread === 0) ? 1 : 3 - (page%2)), views.length);
|
|
|
|
for (var i = min, ii = max; i < ii; i++) {
|
|
arr.push({
|
|
id: views[i].id,
|
|
view: views[i],
|
|
x: 0, y: 0, percent: 100
|
|
});
|
|
}
|
|
|
|
return { first:arr[page - min - 1], last:arr[arr.length-1], views:arr };
|
|
},
|
|
_spreadType: function(){
|
|
return (this._spread === 0) ? 'single' : 'double';
|
|
},
|
|
_spreadMult: function(){
|
|
return (this._spread === 0) ? 1 : 2;
|
|
},
|
|
_size: function(page,request){
|
|
var size;
|
|
if (request === 'width') size = this._width[page];
|
|
if (request === 'height') size = this._height[page];
|
|
return size * PDFViewerApplication.pdfViewer.currentScale;
|
|
}
|
|
};
|
|
|
|
bookFlip.init(); |