X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=BookReader%2FBookReader.js;h=5bd7692b5b090ed1c38f4bdd2910b872a29155eb;hb=9dc5578257e8992aeb2cf15dd619cc23111f52d5;hp=02b759f1cd707fba177a14de3fba27087045b433;hpb=a6b997479f794e1385050683678bac1753795af6;p=bookreader.git
diff --git a/BookReader/BookReader.js b/BookReader/BookReader.js
index 02b759f..5bd7692 100644
--- a/BookReader/BookReader.js
+++ b/BookReader/BookReader.js
@@ -80,9 +80,8 @@ function BookReader() {
this.lastDisplayableIndex2up = null;
- // We link to index.php to avoid redirect which breaks back button
// Should be overriden (before init) by custom implmentations.
- this.logoURL = 'http://openlibrary.org';
+ this.logoURL = 'http://www.archive.org';
// Base URL for UI images - should be overriden (before init) by
// custom implementations.
@@ -119,7 +118,7 @@ function BookReader() {
this.twoPage = {
coverInternalPadding: 0, // Width of cover
coverExternalPadding: 0, // Padding outside of cover
- bookSpineDivWidth: 0, // Width of book spine $$$ consider sizing based on book length
+ bookSpineDivWidth: 64, // Width of book spine $$$ consider sizing based on book length
autofit: 'auto'
};
@@ -189,7 +188,7 @@ BookReader.prototype.init = function() {
document.title = this.shortTitle(50);
$("#BookReader").empty();
-
+
this.initToolbar(this.mode, this.ui); // Build inside of toolbar div
$("#BookReader").append("
");
$("#BRcontainer").append("");
@@ -241,6 +240,21 @@ BookReader.prototype.init = function() {
}
});
+ if (this.protected) {
+ $('.BRpagediv1up').live('contextmenu dragstart', this, function(e) {
+ return false;
+ });
+
+ $('.BRpageimage').live('contextmenu dragstart', this, function(e) {
+ return false;
+ });
+
+ $('.BRpagedivthumb').live('contextmenu dragstart', this, function(e) {
+ return false;
+ });
+
+ }
+
$('.BRpagediv1up').bind('mousedown', this, function(e) {
// $$$ the purpose of this is to disable selection of the image (makes it turn blue)
// but this also interferes with right-click. See https://bugs.edge.launchpad.net/gnubook/+bug/362626
@@ -271,8 +285,15 @@ BookReader.prototype.init = function() {
// We init the nav bar after the params processing so that the nav slider knows where
// it should start (doesn't jump after init)
- this.initNavbar();
+ if (this.ui == "embed") {
+ this.initEmbedNavbar();
+ } else {
+ this.initNavbar();
+ }
this.bindNavigationHandlers();
+
+ // Set strings in the UI
+ this.initUIStrings();
// Start AJAX request for OL data
if (this.getOpenLibraryRecord) {
@@ -694,11 +715,9 @@ BookReader.prototype.drawLeafsThumbnail = function( seekIndex ) {
$('#pagediv'+index).remove();
}
} else {
- /*
- var mRow = this.displayedRows[i];
- var mLeafs = '[' + [leaf.num for each (leaf in leafMap[mRow].leafs)] + ']';
- console.log('NOT Removing row ' + mRow + ' ' + mLeafs);
- */
+ // var mRow = this.displayedRows[i];
+ // var mLeafs = '[' + [leaf.num for each (leaf in leafMap[mRow].leafs)] + ']';
+ // console.log('NOT Removing row ' + mRow + ' ' + mLeafs);
}
}
@@ -785,9 +804,17 @@ BookReader.prototype.lazyLoadImage = function (dummyImage) {
// Remove class so we no longer count as loading
$(this).removeClass('BRlazyloading');
})
- .attr( { width: $(dummyImage).width(),
- height: $(dummyImage).height(),
- src: $(dummyImage).data('srcURL')
+
+ //the width set with .attr is ignored by Internet Explorer, causing it to show the image at its original size
+ //but with this one line of css, even IE shows the image at the proper size
+ .css({
+ 'width': $(dummyImage).width()+'px',
+ 'height': $(dummyImage).height()+'px'
+ })
+ .attr({
+ 'width': $(dummyImage).width(),
+ 'height': $(dummyImage).height(),
+ 'src': $(dummyImage).data('srcURL')
});
// replace with the new img
@@ -1518,10 +1545,10 @@ BookReader.prototype.prepareTwoPageView = function(centerPercentageX, centerPerc
}).appendTo('#BRtwopageview');
div = document.createElement('div');
- $(div).attr('id', 'BRbookspine').css({
+ $(div).attr('id', 'BRgutter').css({
width: this.twoPage.bookSpineDivWidth+'px',
height: this.twoPage.bookSpineDivHeight+'px',
- left: this.twoPage.bookSpineDivLeft+'px',
+ left: (this.twoPage.gutter - this.twoPage.bookSpineDivWidth*0.5)+'px',
top: this.twoPage.bookSpineDivTop+'px'
}).appendTo('#BRtwopageview');
@@ -1803,6 +1830,20 @@ BookReader.prototype.twoPageGetAutofitReduce = function() {
return spreadSize.reduce;
}
+// twoPageIsZoomedIn
+//______________________________________________________________________________
+// Returns true if the pages extend past the edge of the view
+BookReader.prototype.twoPageIsZoomedIn = function() {
+ var autofitReduce = this.twoPageGetAutofitReduce();
+ var isZoomedIn = false;
+ if (this.twoPage.autofit != 'auto') {
+ if (this.reduce < this.twoPageGetAutofitReduce()) {
+ isZoomedIn = true;
+ }
+ }
+ return isZoomedIn;
+}
+
BookReader.prototype.onePageGetAutofitWidth = function() {
var widthPadding = 20;
return (this.getMedianPageSize().width + 0.0) / ($('#BRcontainer').attr('clientWidth') - widthPadding * 2);
@@ -2172,10 +2213,16 @@ BookReader.prototype.flipLeftToRight = function(newIndexL, newIndexR) {
//console.log(' and now leafEdgeTmp to left: gutter+newWidthR ' + (gutter + newWidthR));
$(self.leafEdgeTmp).animate({left: gutter+newWidthR+'px'}, self.flipSpeed, 'easeOutSine');
+
+ $('#BRgutter').css({left: (gutter - self.twoPage.bookSpineDivWidth*0.5)+'px'});
//console.log(' animating newIndexR ' + newIndexR + ' to ' + newWidthR + ' from ' + $(self.prefetchedImgs[newIndexR]).width());
$(self.prefetchedImgs[newIndexR]).animate({width: newWidthR+'px'}, self.flipSpeed, 'easeOutSine', function() {
$(self.prefetchedImgs[newIndexL]).css('zIndex', 2);
+
+ //jquery adds display:block to the element style, which interferes with our print css
+ $(self.prefetchedImgs[newIndexL]).css('display', '');
+ $(self.prefetchedImgs[newIndexR]).css('display', '');
$(self.leafEdgeR).css({
// Moves the right leaf edge
@@ -2193,7 +2240,7 @@ BookReader.prototype.flipLeftToRight = function(newIndexL, newIndexR) {
$(self.twoPage.coverDiv).css({
width: self.twoPageCoverWidth(newWidthL+newWidthR)+'px',
left: gutter-newWidthL-newLeafEdgeWidthL-self.twoPage.coverInternalPadding+'px'
- });
+ });
$(self.leafEdgeTmp).remove();
self.leafEdgeTmp = null;
@@ -2272,7 +2319,6 @@ BookReader.prototype.willChangeToIndex = function(index)
{
// Update navbar position icon - leads page change animation
this.updateNavIndex(index);
-
}
// flipRightToLeft(nextL, nextR, gutter)
@@ -2321,9 +2367,14 @@ BookReader.prototype.flipRightToLeft = function(newIndexL, newIndexR) {
$(this.leafEdgeTmp).animate({left: gutter}, speed, 'easeInSine');
$(this.prefetchedImgs[this.twoPage.currentIndexR]).animate({width: '0px'}, speed, 'easeInSine', function() {
+ $('#BRgutter').css({left: (gutter - self.twoPage.bookSpineDivWidth*0.5)+'px'});
$(self.leafEdgeTmp).animate({left: gutter-newWidthL-leafEdgeTmpW+'px'}, speed, 'easeOutSine');
$(self.prefetchedImgs[newIndexL]).animate({width: newWidthL+'px'}, speed, 'easeOutSine', function() {
$(self.prefetchedImgs[newIndexR]).css('zIndex', 2);
+
+ //jquery adds display:block to the element style, which interferes with our print css
+ $(self.prefetchedImgs[newIndexL]).css('display', '');
+ $(self.prefetchedImgs[newIndexR]).css('display', '');
$(self.leafEdgeL).css({
width: newLeafEdgeWidthL+'px',
@@ -2334,8 +2385,8 @@ BookReader.prototype.flipRightToLeft = function(newIndexL, newIndexR) {
$(self.twoPage.coverDiv).css({
width: self.twoPageCoverWidth(newWidthL+newWidthR)+'px',
left: gutter - newWidthL - newLeafEdgeWidthL - self.twoPage.coverInternalPadding + 'px'
- });
-
+ });
+
$(self.leafEdgeTmp).remove();
self.leafEdgeTmp = null;
@@ -2373,14 +2424,15 @@ BookReader.prototype.setMouseHandlers2UP = function() {
this.setClickHandler2UP( this.prefetchedImgs[this.twoPage.currentIndexL],
{ self: this },
function(e) {
- if (e.button == 2) {
+ if (e.which == 3) {
// right click
- return;
+ if (e.data.self.protected) {
+ return false;
+ }
+ return true;
}
-
- var autofitReduce = e.data.self.twoPageGetAutofitReduce();
- // Don't trigger if zoomed in
- if (e.data.self.reduce >= e.data.self.twoPageGetAutofitReduce()) {
+
+ if (! e.data.self.twoPageIsZoomedIn()) {
e.data.self.ttsStop();
e.data.self.left();
}
@@ -2391,16 +2443,17 @@ BookReader.prototype.setMouseHandlers2UP = function() {
this.setClickHandler2UP( this.prefetchedImgs[this.twoPage.currentIndexR],
{ self: this },
function(e) {
- if (e.button == 2) {
+ if (e.which == 3) {
// right click
- return;
+ if (e.data.self.protected) {
+ return false;
+ }
+ return true;
}
-
- var autofitReduce = e.data.self.twoPageGetAutofitReduce();
- // Don't trigger if zoomed in
- if (e.data.self.reduce >= e.data.self.twoPageGetAutofitReduce()) {
+
+ if (! e.data.self.twoPageIsZoomedIn()) {
e.data.self.ttsStop();
- e.data.self.right();
+ e.data.self.right();
}
e.preventDefault();
}
@@ -2466,14 +2519,13 @@ BookReader.prototype.prepareFlipLeftToRight = function(prevL, prevR) {
//console.log(' prevL.left: ' + (gutter - scaledW) + 'px');
//console.log(' changing prevL ' + prevL + ' to left: ' + (gutter-scaledW) + ' width: ' + scaledW);
- leftCSS = {
+ var leftCSS = {
position: 'absolute',
left: gutter-scaledW+'px',
right: '', // clear right property
top: top+'px',
height: this.twoPage.height,
width: scaledW+'px',
- borderRight: '1px solid black', // XXXmang check
zIndex: 1
}
@@ -2483,13 +2535,12 @@ BookReader.prototype.prepareFlipLeftToRight = function(prevL, prevR) {
//console.log(' changing prevR ' + prevR + ' to left: ' + gutter + ' width: 0');
- rightCSS = {
+ var rightCSS = {
position: 'absolute',
left: gutter+'px',
right: '',
top: top+'px',
height: this.twoPage.height,
- borderLeft: '1px solid black', // XXXmang check
width: '0',
zIndex: 2
}
@@ -2665,7 +2716,7 @@ BookReader.prototype.search = function(term) {
this.removeSearchResults();
this.showProgressPopup(' Search results will appear below...');
- this.ttsAjax = $.ajax({url:url, dataType:'jsonp', jsonpCallback:'br.BRSearchCallback'});
+ $.ajax({url:url, dataType:'jsonp', jsonpCallback:'br.BRSearchCallback'});
}
// BRSearchCallback()
@@ -2677,12 +2728,18 @@ BookReader.prototype.BRSearchCallback = function(results) {
//console.log(br.searchResults);
if (0 == results.matches.length) {
- $(br.popup).text('No matches were found.');
+ var errStr = 'No matches were found.';
+ var timeout = 1000;
+ if (false === results.indexed) {
+ errStr = "
This book hasn't been indexed for searching yet. We've just started indexing it, so search should be available soon. Please try again later. Thanks!
";
+ timeout = 5000;
+ }
+ $(br.popup).html(errStr);
setTimeout(function(){
$(br.popup).fadeOut('slow', function() {
br.removeProgressPopup();
})
- },1000);
+ },timeout);
return;
}
@@ -2978,56 +3035,9 @@ BookReader.prototype.getPrintURI = function() {
return '/bookreader/print.php?' + options;
}
-/* iframe implementation
-BookReader.prototype.getPrintFrameContent = function(index) {
- // We fit the image based on an assumed A4 aspect ratio. A4 is a bit taller aspect than
- // 8.5x11 so we should end up not overflowing on either paper size.
- var paperAspect = 8.5 / 11;
- var imageAspect = this._getPageWidth(index) / this._getPageHeight(index);
-
- var rotate = 0;
-
- // Rotate if possible and appropriate, to get larger image size on printed page
- if (this.canRotatePage(index)) {
- if (imageAspect > 1 && imageAspect > paperAspect) {
- // more wide than square, and more wide than paper
- rotate = 90;
- imageAspect = 1/imageAspect;
- }
- }
-
- var fitAttrs;
- if (imageAspect > paperAspect) {
- // wider than paper, fit width
- fitAttrs = 'width="95%"';
- } else {
- // taller than paper, fit height
- fitAttrs = 'height="95%"';
- }
-
- var imageURL = this._getPageURI(index, 1, rotate);
- var iframeStr = '' + this.bookTitle + '';
- iframeStr += '
';
- iframeStr += '';
- iframeStr += '
';
- iframeStr += '';
-
- return iframeStr;
-}
-
-BookReader.prototype.updatePrintFrame = function(delta) {
- var newIndex = this.indexToPrint + delta;
- newIndex = BookReader.util.clamp(newIndex, 0, this.numLeafs - 1);
- if (newIndex == this.indexToPrint) {
- return;
- }
- this.indexToPrint = newIndex;
- var doc = BookReader.util.getIFrameDocument($('#printFrame')[0]);
- $('body', doc).html(this.getPrintFrameContent(this.indexToPrint));
-}
-*/
-
// showEmbedCode()
+//
+// Note: Has been replaced by the share dialog
//______________________________________________________________________________
BookReader.prototype.showEmbedCode = function() {
if (null != this.embedPopup) { // check if already showing
@@ -3274,8 +3284,7 @@ BookReader.prototype.jumpIndexForRightEdgePageX = function(pageX) {
BookReader.prototype.initNavbar = function() {
// Setup nav / chapter / search results bar
- // $$$ should make this work inside the BookReader div (self-contained), rather than after
- $('#BookReader').after(
+ $('#BookReader').append(
'
- A related distinction is between the emotion and the results of the emotion, principally behaviors and emotional expressions. People often behave in certain ways as a direct result of their emotional state, such as crying, fighting or fleeing. Page 163
-
');
//.wrap('').parent(); // XXXmang is this used for hiding the tooltip?
- // $$$mang, why are these set both here and in bindNavigationHandlers?
- $('.BRicon.book_left').bind('click', function() {
- self.ttsStop();
- self.left();
- });
- $('.BRicon.book_right').bind('click', function() {
- self.ttsStop();
- self.right();
- });
-
this.updateNavPageNum(this.currentIndex());
$("#BRzoombtn").draggable({axis:'y',containment:'parent'});
- //XXXmang remove once done testing
- //this.addSearchResult("There is a place where the sidewalk ends And before the street begins, And there the grass grows soft and white, And there the sun burns crimson bright,And there the moon-bird rests from his flight To cool in the peppermint wind.", "20", 31);
- //this.addSearchResult("There is a place where the sidewalk BEGINS And there the moon-bird rests from his flight To cool in the peppermint wind.", "60", 71);
+ /* Initial hiding
+ $('#BRtoolbar').delay(3000).animate({top:-40});
+ $('#BRnav').delay(3000).animate({bottom:-53});
+ changeArrow();
+ $('.BRnavCntl').delay(3000).animate({height:'43px'}).delay(1000).animate({opacity:.25},1000);
+ */
+}
+
+// initEmbedNavbar
+//______________________________________________________________________________
+// Initialize the navigation bar when embedded
+BookReader.prototype.initEmbedNavbar = function() {
+ var thisLink = (window.location + '').replace('?ui=embed',''); // IA-specific
+ $('#BookReader').append(
+ '
'
- ];
-
- // Use 3rd-party provided function if available
- if (this.getInfoDiv) {
- html.push(this.getInfoDiv());
- } else {
- html = html.concat([
- '
',
- ]);
+ jInfoDiv.find('.BRfloatTitle a').attr({'href': this.bookUrl, 'alt': this.bookTitle}).text(this.bookTitle);
+}
+
+// Can be overriden
+BookReader.prototype.initUIStrings = function()
+{
+ // Navigation handlers will be bound after all UI is in place -- makes moving icons between
+ // the toolbar and nav bar easier
+
+ // Setup tooltips -- later we could load these from a file for i18n
+ var titles = { '.logo': 'Go to Archive.org', // $$$ update after getting OL record
+ '.zoom_in': 'Zoom in',
+ '.zoom_out': 'Zoom out',
+ '.onepg': 'One-page view',
+ '.twopg': 'Two-page view',
+ '.thumb': 'Thumbnail view',
+ '.print': 'Print this page',
+ '.embed': 'Embed BookReader',
+ '.link': 'Link to this book (and page)',
+ '.bookmark': 'Bookmark this page',
+ '.read': 'Read this book aloud',
+ '.share': 'Share this book',
+ '.info': 'About this book',
+ '.full': 'Show fullscreen',
+ '.book_left': 'Flip left',
+ '.book_right': 'Flip right',
+ '.book_up': 'Page up',
+ '.book_down': 'Page down',
+ '.play': 'Play',
+ '.pause': 'Pause',
+ '.BRdn': 'Show/hide nav bar', // Would have to keep updating on state change to have just "Hide nav bar"
+ '.BRup': 'Show/hide nav bar',
+ '.book_top': 'First page',
+ '.book_bottom': 'Last page'
+ };
+ if ('rl' == this.pageProgression) {
+ titles['.book_leftmost'] = 'Last page';
+ titles['.book_rightmost'] = 'First page';
+ } else { // LTR
+ titles['.book_leftmost'] = 'First page';
+ titles['.book_rightmost'] = 'Last page';
}
-
- html = html.concat([
- '
', // BRfloatBody
- '
'
- ]);
-
- if (this.getInfoFooter) {
- html.push(this.getInfoFooter());
- } else {
- html.push(
- 'About the BookReader'
- );
+
+ for (var icon in titles) {
+ if (titles.hasOwnProperty(icon)) {
+ $('#BookReader').find(icon).attr('title', titles[icon]);
+ }
}
-
- html = html.concat([
- '