X-Git-Url: http://git.rot13.org/?p=bookreader.git;a=blobdiff_plain;f=BookReader%2FBookReader.js;h=4b3e686c09fbeb55ffb221d28152aa7a9add8525;hp=43ff90870287c0018277aee07c427e13a2389274;hb=HEAD;hpb=6effa33e3a8bf09bf8e35aa750d4f2b053ffc9e7
diff --git a/BookReader/BookReader.js b/BookReader/BookReader.js
index 43ff908..4b3e686 100644
--- a/BookReader/BookReader.js
+++ b/BookReader/BookReader.js
@@ -18,7 +18,6 @@ This file is part of BookReader.
The BookReader source is hosted at http://github.com/openlibrary/bookreader/
- archive.org cvs $Revision: 1.2 $ $Date: 2009-06-22 18:42:51 $
*/
// BookReader()
@@ -80,9 +79,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.
@@ -145,6 +143,7 @@ function BookReader() {
return this;
};
+(function ($) {
// init()
//______________________________________________________________________________
BookReader.prototype.init = function() {
@@ -153,7 +152,16 @@ BookReader.prototype.init = function() {
this.pageScale = this.reduce; // preserve current reduce
// Find start index and mode if set in location hash
- var params = this.paramsFromFragment(window.location.hash);
+ var params = {};
+ if (window.location.hash) {
+ // params explicitly set in URL
+ params = this.paramsFromFragment(window.location.hash);
+ } else {
+ // params not explicitly set, use defaults if we have them
+ if ('defaults' in this) {
+ params = this.paramsFromFragment(this.defaults);
+ }
+ }
// Sanitize/process parameters
@@ -241,6 +249,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
@@ -790,9 +813,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
@@ -1224,7 +1255,21 @@ BookReader.prototype._reduceSort = function(a, b) {
// Attempts to jump to page. Returns true if page could be found, false otherwise.
BookReader.prototype.jumpToPage = function(pageNum) {
- var pageIndex = this.getPageIndex(pageNum);
+ var pageIndex;
+
+ // Check for special "leaf"
+ var re = new RegExp('^leaf(\\d+)');
+ leafMatch = re.exec(pageNum);
+ if (leafMatch) {
+ console.log(leafMatch[1]);
+ pageIndex = this.leafNumToIndex(parseInt(leafMatch[1],10));
+ if (pageIndex === null) {
+ pageIndex = undefined; // to match return type of getPageIndex
+ }
+
+ } else {
+ pageIndex = this.getPageIndex(pageNum);
+ }
if ('undefined' != typeof(pageIndex)) {
var leafTop = 0;
@@ -2197,6 +2242,10 @@ BookReader.prototype.flipLeftToRight = function(newIndexL, newIndexR) {
//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
@@ -2345,6 +2394,10 @@ BookReader.prototype.flipRightToLeft = function(newIndexL, newIndexR) {
$(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',
@@ -2394,8 +2447,11 @@ 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
+ if (e.data.self.protected) {
+ return false;
+ }
return true;
}
@@ -2410,8 +2466,11 @@ 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
+ if (e.data.self.protected) {
+ return false;
+ }
return true;
}
@@ -2692,12 +2751,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;
}
@@ -3301,7 +3366,6 @@ BookReader.prototype.initNavbar = function() {
//append icon to handle
var handleHelper = $('#BRpager .ui-slider-handle')
- // $$$mang update logic for setting the page number label -- use page numbers if available
.append('
');
//.wrap('').parent(); // XXXmang is this used for hiding the tooltip?
@@ -3341,7 +3405,7 @@ BookReader.prototype.updateNavPageNum = function(index) {
var pageNum = this.getPageNum(index);
var pageStr;
if (pageNum[0] == 'n') { // funny index
- pageStr = index + ' / ' + this.numLeafs;
+ pageStr = index + 1 + ' / ' + this.numLeafs; // Accessible index starts at 0 (alas) so we add 1 to make human
} else {
pageStr = 'Page ' + pageNum;
}
@@ -3568,7 +3632,7 @@ BookReader.prototype.initToolbar = function(mode, ui) {
//+ ""
+ ""
+ ""
- + "Back to" + this.bookTitle + "" // XXX escape
+ + ""
+ ""
+ ""
/*
@@ -3585,6 +3649,14 @@ BookReader.prototype.initToolbar = function(mode, ui) {
*/
);
+ // Browser hack - bug with colorbox on iOS 3 see https://bugs.launchpad.net/bookreader/+bug/686220
+ if ( navigator.userAgent.match(/ipad/i) && $.browser.webkit && (parseInt($.browser.version, 10) <= 531) ) {
+ $('#BRtoolbarbuttons .info').hide();
+ $('#BRtoolbarbuttons .share').hide();
+ }
+
+ $('#BRreturn a').attr('href', this.bookUrl).text(this.bookTitle);
+
$('#BRtoolbar .BRnavCntl').addClass('BRup');
$('#BRtoolbar .pause').hide();
@@ -3616,8 +3688,8 @@ BookReader.prototype.initToolbar = function(mode, ui) {
// $$$ Don't hardcode ids
var self = this;
- jToolbar.find('.share').colorbox({inline: true, opacity: "0.5", href: "#BRshare", onLoad: function() { self.ttsStop(); } });
- jToolbar.find('.info').colorbox({inline: true, opacity: "0.5", href: "#BRinfo", onLoad: function() { self.ttsStop(); } });
+ jToolbar.find('.share').colorbox({inline: true, opacity: "0.5", href: "#BRshare", onLoad: function() { self.autoStop(); self.ttsStop(); } });
+ jToolbar.find('.info').colorbox({inline: true, opacity: "0.5", href: "#BRinfo", onLoad: function() { self.autoStop(); self.ttsStop(); } });
$('').append(this.blankShareDiv()).append(this.blankInfoDiv()).appendTo($('body'));
@@ -3895,14 +3967,6 @@ BookReader.prototype.bindNavigationHandlers = function() {
$('.BRpageimage').die('mousedown.swipe').live('mousedown.swipe',
{ 'br': this },
this.swipeMousedownHandler
- )
- .die('mousemove.swipe').live('mousemove.swipe',
- { 'br': this },
- this.swipeMousemoveHandler
- )
- .die('mouseup.swipe').live('mouseup.swipe',
- { 'br': this },
- this.swipeMouseupHandler
);
this.bindMozTouchHandlers();
@@ -3955,17 +4019,37 @@ BookReader.prototype.initSwipeData = function(clientX, clientY) {
BookReader.prototype.swipeMousedownHandler = function(event) {
//console.log('swipe mousedown');
//console.log(event);
-
+
var self = event.data['br'];
+
+ // We should be the last bubble point for the page images
+ // Disable image drag and select, but keep right-click
+ if (event.which == 3) {
+ if (self.protected) {
+ return false;
+ }
+ return true;
+ }
+
+ $(event.target).bind('mouseout.swipe',
+ { 'br': self},
+ self.swipeMouseupHandler
+ ).bind('mouseup.swipe',
+ { 'br': self},
+ self.swipeMouseupHandler
+ ).bind('mousemove.swipe',
+ { 'br': self },
+ self.swipeMousemoveHandler
+ );
+
self.initSwipeData(event.clientX, event.clientY);
self._swipe.mightBeSwiping = true;
self._swipe.mightBeDragging = true;
- // We should be the last bubble point for the page images
- // Disable image drag and select, but keep right-click
- if ($(event.originalTarget).hasClass('BRpageimage') && event.button != 2) {
- event.preventDefault();
- }
+ event.preventDefault();
+ event.returnValue = false;
+ event.cancelBubble = true;
+ return false;
}
BookReader.prototype.swipeMousemoveHandler = function(event) {
@@ -4014,19 +4098,29 @@ BookReader.prototype.swipeMousemoveHandler = function(event) {
}
_swipe.lastX = event.clientX;
_swipe.lastY = event.clientY;
+
+ event.preventDefault();
+ event.returnValue = false;
+ event.cancelBubble = true;
+ return false;
}
BookReader.prototype.swipeMouseupHandler = function(event) {
var _swipe = event.data['br']._swipe;
//console.log('swipe mouseup - did swipe ' + _swipe.didSwipe);
_swipe.mightBeSwiping = false;
_swipe.mightBeDragging = false;
+
+ $(event.target).unbind('mouseout.swipe').unbind('mouseup.swipe').unbind('mousemove.swipe');
+
if (_swipe.didSwipe || _swipe.didDrag) {
// Swallow event if completed swipe gesture
event.preventDefault();
- event.stopPropagation();
+ event.returnValue = false;
+ event.cancelBubble = true;
+ return false;
}
+ return true;
}
-
BookReader.prototype.bindMozTouchHandlers = function() {
var self = this;
@@ -4201,7 +4295,7 @@ BookReader.prototype.updateFromParams = function(params) {
this.jumpToPage(params.page);
}
}
-
+
// $$$ process /region
// $$$ process /highlight
}
@@ -4542,14 +4636,44 @@ BookReader.prototype.gotOpenLibraryRecord = function(self, olObject) {
}
// $$$mang cleanup
- self.bookUrl = 'http://openlibrary.org' + olObject.key;
+ self.bookUrl = self.olHost + olObject.key;
self.bookTitle = olObject['title'];
- $('#BRreturn a').attr('href', this.bookUrl);
- $('#BookReader .logo').attr('title', 'Go to Open Library'); // i18n
+ $('#BRreturn a').attr( {'href': self.bookUrl, 'title': "Go to this book's page on Open Library" } );
+ $('#BRreturn a').text(self.bookTitle);
$('#BRinfo').remove();
$('#BRshare').after(self.blankInfoDiv());
self.buildInfoDiv($('#BRinfo'));
+
+ // Check for borrowed book
+ if (self.olAuth) {
+ var returnUrl = self.olHost + olObject.key + '/do_return/borrow';
+ var borrowUrl = self.olHost + olObject.key + '/borrow';
+
+ /*
+ $('')
+ .attr('href', borrowUrl)
+ .text('Return this book')
+ .click(function(event) {
+ event.preventDefault();
+ $('#BRreturnform').trigger('submit');
+ })
+ .appendTo('#BRreturn');
+ */
+
+ $('')
+ .appendTo('#BRreturn');
+
+ } else {
+ $('').attr( { 'href': self.bookUrl, 'title': 'Go to this book\'s page on Open Library' } )
+ .text('On openlibrary.org')
+ .appendTo('#BRreturn');
+ }
+
+ $('#BRreturn').css({ 'line-height': '19px'} );
+ $('#BRreturn a').css( {'height': '18px' } );
+
+
}
}
@@ -4692,15 +4816,17 @@ BookReader.prototype.ttsStartCB = function (data) {
this.showProgressPopup('Loading audio...');
- ///// whileloading: broken on safari
- ///// onload fires on safari, but *after* the sound starts playing..
+ ///// Many soundManger2 callbacks are broken when using HTML5 audio.
+ ///// whileloading: broken on safari, worked in FF4, but broken on FireFox 5
+ ///// onload: fires on safari, but *after* the sound starts playing, and does not fire in FF or IE9
+ ///// onbufferchange: fires in FF5 using HTML5 audio, but not in safari using flash audio
+ ///// whileplaying: fires everywhere
this.ttsPosition = -1;
var snd = soundManager.createSound({
id: 'chunk'+this.ttsIndex+'-0',
- //url: 'http://home.us.archive.org/~rkumar/arctic.ogg',
url: 'http://'+this.server+'/BookReader/BookReaderGetTTS.php?string=' + escape(data[0][0]) + '&format=.'+this.ttsFormat, //the .ogg is to trick SoundManager2 to use the HTML5 audio player
- whileloading: function(){if (this.bytesLoaded == this.bytesTotal) this.br.removeProgressPopup();}, //onload never fires in FF...
- onload: function(){this.br.removeProgressPopup();} //whileloading never fires in safari...
+ onload: function(){this.br.removeProgressPopup();}, //fires in safari...
+ onbufferchange: function(){if (false == this.isBuffering) this.br.removeProgressPopup();} //fires in FF and IE9
});
snd.br = this;
snd.load();
@@ -5083,8 +5209,10 @@ BookReader.prototype.buildShareDiv = function(jShareDiv)
params.page = self.getPageNum(self.currentIndex());
}
- // console.log(params);
- form.find('.BRframeEmbed').val(self.getEmbedCode());
+ // $$$ changeable width/height to be added to share UI
+ var frameWidth = "480px";
+ var frameHeight = "430px";
+ form.find('.BRframeEmbed').val(self.getEmbedCode(frameWidth, frameHeight, params));
})
jForm.find('input[name=thispage]').trigger('change');
jForm.find('input, textarea').bind('focus', function() {
@@ -5148,3 +5276,4 @@ BookReader.prototype.initUIStrings = function()
}
}
}
+})(jQuery);