element = $(this),
mode = element.data('mode'), // Either 'print' or 'download'
print = (mode == 'print'),
- choice = $('input[name="pageChoice"]:checked').val();
+ choice = $('input[name="pageChoice"]:checked').val(),
+ rangeStart = $this.fluidbook.virtualToPhysical($('#pageRangeStart').val()),
+ rangeEnd = $this.fluidbook.virtualToPhysical($('#pageRangeEnd').val());
switch (choice) {
- case 'left':
- $this.fluidbook._openFile(dynamicPDF + leftPageNumber, element, 'pdf', leftPageNumber + '.pdf', print);
- break;
- case 'right':
- $this.fluidbook._openFile(dynamicPDF + rightPageNumber, element, 'pdf', rightPageNumber + '.pdf', print);
- break;
- case 'double':
- var pageRange = leftPageNumber + '-' + rightPageNumber;
- $this.fluidbook._openFile(dynamicPDF + pageRange, element, 'pdf', pageRange + '.pdf', print);
- break;
- case 'all':
- $this.fluidbook.openPDF(element, print);
- break;
- case 'bookmarks':
- $this.fluidbook.bookmarks.openPDF(element, print);
- break;
- case 'range':
+ case 'left':
+ $this.fluidbook._openFile(dynamicPDF + leftPageNumber, element, 'pdf', leftPageNumber + '.pdf', print);
+ break;
+ case 'right':
+ $this.fluidbook._openFile(dynamicPDF + rightPageNumber, element, 'pdf', rightPageNumber + '.pdf', print);
+ break;
+ case 'double':
+ var pageRange = leftPageNumber + '-' + rightPageNumber;
+ $this.fluidbook._openFile(dynamicPDF + pageRange, element, 'pdf', pageRange + '.pdf', print);
+ break;
+ case 'all':
+ $this.fluidbook.openPDF(element, print);
+ break;
+ case 'bookmarks':
+ $this.fluidbook.bookmarks.openPDF(element, print);
+ break;
- default:
++ case 'range':
+ if (isNaN(rangeStart) ||
+ isNaN(rangeEnd) ||
+ (rangeStart < 1) ||
+ (rangeEnd > $this.fluidbook.datas.pages) ||
+ (rangeStart > rangeEnd)
+ ) {
+ alert(__('Invalid page range. Please try again.'));
+ return false;
+ }
+ var pageRange = rangeStart + '-' + rangeEnd;
+ $this.fluidbook._openFile(dynamicPDF + pageRange, element, 'pdf', pageRange + '.pdf', print);
- break;
- default:
- return false;
++ break;default:
+ return false;
}
});
+ // Automatically select page range option when clicking in the input fields
+ $(document).on('focus', '.page-range-input', function() {
+ $('#pageRange').prop('checked', true);
+ });
+
// When there are no bookmarks a click on the bookmarks option will open the bookmarks help modal
- $(document).on('click', '.bookmarks-option.disabled', function(event) {
+ $(document).on('click', '.bookmarks-option.disabled', function (event) {
event.preventDefault();
$this.fluidbook.menu.quickCloseView();
// Bookmarks
if (this.fluidbook.datas.bookmark) {
- var hasBookmarks = this.fluidbook.bookmarks.hasBookmarkedPages(),
- bookmarksDisabled = hasBookmarks ? '' : 'disabled';
+ var hasBookmarks = this.fluidbook.bookmarks.hasBookmarkedPages(),
+ bookmarksDisabled = hasBookmarks ? '' : 'disabled';
- view += '<div class="print-option bookmarks-option '+ bookmarksDisabled +'">';
- view += '<label for="bookmarkedPages">';
- view += '<div class="doubleThumb bookmarks">';
- view += this.fluidbook.bookmarks.getPrintPreview();
- view += '</div>'; // .doubleThumb
- view += '</label>';
- view += '<input type="radio" name="pageChoice" value="bookmarks" id="bookmarkedPages" '+ bookmarksDisabled +'>';
- view += '<label for="bookmarkedPages" class="print-label-text">' + __('bookmarks') + '</label>';
- view += '</div>'; // .print-option
+ view += '<div class="print-option bookmarks-option ' + bookmarksDisabled + '">';
+ view += '<label for="bookmarkedPages">';
+ view += '<div class="doubleThumb bookmarks">';
+ view += this.fluidbook.bookmarks.getPrintPreview();
+ view += '</div>'; // .doubleThumb
+ view += '</label>';
- view += '<input type="radio" name="pageChoice" value="bookmarks" id="bookmarkedPages" ' + bookmarksDisabled + '>'
++ view += '<input type="radio" name="pageChoice" value="bookmarks" id="bookmarkedPages" ' + bookmarksDisabled + '>';
+ view += '<label for="bookmarkedPages" class="print-label-text">' + __('bookmarks') + '</label>';
+ view += '</div>'; // .print-option
}
- view += '<div class="print-option"></div>'; // Extra empty div to ensure flexbox space-between works as expected
+ view += '<div class="print-option blank"></div>'; // Extra empty div to ensure flexbox space-between works as expected
+
+ // Page range inputs
+ if (this.fluidbook.datas.printPageRange) {
+
+ // leftPageNumber may be false if on first page
+ var rangeStart = Math.max(leftPageNumber, 1);
+
+ // Current page + 1 unless we're out of range.
+ // It has to be calculated this way because sometimes there is no rightPageNumber
+ var rangeEnd = Math.min(rangeStart + 1, this.fluidbook.datas.pages);
+
+ view += '<div class="print-option page-range-option">';
+ view += '<input type="radio" name="pageChoice" value="range" id="pageRange">';
+ view += '<label for="pageRange">';
+ view += __('From page');
+ view += '<input class="page-range-input" type="text" id="pageRangeStart" value="' + this.fluidbook.physicalToVirtual(rangeStart) + '" autocomplete="off">';
+ view += __('to');
+ view += '<input class="page-range-input" type="text" id="pageRangeEnd" value="' + this.fluidbook.physicalToVirtual(rangeEnd) + '" autocomplete="off">';
+ view += '</label>';
+ view += '</div>'; // .print-option
+ }
view += '</div>'; // .print-dialogue