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);