]> _ Git - fluidbook-html5.git/commitdiff
(no commit message)
authorVincent Vanwaelscappel <vincent@cubedesigners.com>
Fri, 14 Mar 2014 18:09:09 +0000 (18:09 +0000)
committerVincent Vanwaelscappel <vincent@cubedesigners.com>
Fri, 14 Mar 2014 18:09:09 +0000 (18:09 +0000)
js/libs/fluidbook/fluidbook.js
js/libs/fluidbook/fluidbook.search.js

index b739e5a96dc2030e22c31b2482d08efb47942164..37e97d27e69dc7c534ff8af7f57ca14bdaafa377 100644 (file)
-function Fluidbook(datas) {\r
-       this.init(datas);\r
-}\r
-\r
-// Constantes\r
-// Background dispoition\r
-Fluidbook.NONE = 3;\r
-Fluidbook.STRETCH = 0;\r
-Fluidbook.RATIO = 2;\r
-Fluidbook.REPEAT = 1;\r
-// Horizontal alignments\r
-Fluidbook.CENTER = 4;\r
-Fluidbook.LEFT = 5;\r
-Fluidbook.RIGHT = 6;\r
-// Vertical alignments\r
-Fluidbook.MIDDLE = 7;\r
-Fluidbook.TOP = 8;\r
-Fluidbook.BOTTOM = 9;\r
-\r
-Fluidbook.prototype = {\r
-       init: function(datas) {\r
-               this.datas = datas;\r
-               this.junk = datas.cacheDate;\r
-               this.cache = new FluidbookCache(datas);\r
-               this.service = new FluidbookService(this, datas.id);\r
-               this.support = new FluidbookSupport(this);\r
-               this.loader = new FluidbookLoader(this);\r
-               this.search = new FluidbookSearch(this);\r
-               this.pad = new FluidbookPad(this);\r
-               this.waiters = [];\r
-               if (Modernizr.ftouch && this.support.transitions2d && this.datas.mobileTransitions != 'none') {\r
-                       this.touch = new FluidbookTouch(this);\r
-               }\r
-               this.background = new FluidbookBackground(this);\r
-               this.viewport = new FluidbookViewport(this.support)\r
-               this.l10n = new FluidbookL10N(this, $_GET['lang']);\r
-\r
-               this.video = new FluidbookVideo(this);\r
-               this.bookmarks = new FluidbookBookmarks(this);\r
-               this.index = new FluidbookIndex(this);\r
-               this.tooltip = new FluidbookTooltip(this);\r
-               if (this.datas.form == 'bulle') {\r
-                       this.form = new FluidbookBulleForm(this);\r
-               } else {\r
-                       this.form == false;\r
-               }\r
-               this.refw = 0;\r
-               this.refh = 0;\r
-               this.zoom = 1;\r
-               this.searchHintXHR = null;\r
-               this.searchString = '';\r
-               this.termsToHighlight = '';\r
-               this.imagesVersion = (this.datas.mobileVersion == 'html5-images' || !this.support.SVG);\r
-               this.vectorTexts = !this.imagesVersion;\r
-               this.displayOnePage = false;\r
-               this.indexHTML = '';\r
-               this.transitionning = false;\r
-               this.gal = null;\r
-               this.isReady = false;\r
-\r
-               this.transitionAxis = 'x';\r
-\r
-               if (this.support.isMobile) {\r
-                       $("body").addClass('mobile');\r
-               }\r
-               else {\r
-                       $("body").addClass('desktop');\r
-               }\r
-\r
-               if (this.pad.enabled) {\r
-                       $("body").addClass('pad');\r
-               }\r
-               $('html').addClass(this.datas.mobileLVersion);\r
-\r
-               this.currentPage = -1;\r
-\r
-               this.resize = new FluidbookResize(this);\r
-               this.coquillette = new FluidbookCoquillette(this);\r
-\r
-               this.stats = new FluidbookStats(this);\r
-               this.stats.track(10);\r
-               if (!this.support.isMobile) {\r
-                       this.desktop = new FluidbookDesktop(this);\r
-               }\r
-\r
-               this.initLoading();\r
-\r
-       },\r
-       initLoading: function() {\r
-               this.displayLoader();\r
-\r
-       },\r
-       reloadErrorImages: function() {\r
-               $('img').each(function() {\r
-\r
-               });\r
-       },\r
-       hideSplash: function() {\r
-               if ($("#splash").length == 0) {\r
-                       return;\r
-               }\r
-               try {\r
-                       navigator.splashscreen.hide();\r
-               } catch (err) {\r
-               }\r
-\r
-               this.loader.canPreload();\r
-               var $this = this;\r
-               setTimeout(function() {\r
-                       $this._hideSplash();\r
-               }, 3000);\r
-       },\r
-       _hideSplash: function() {\r
-               this.ready();\r
-               $("#main").css('visibility', 'visible');\r
-               this.hideLoader(0, true);\r
-               if (this.support.transitions2d) {\r
-                       $("#splash").css('opacity', 0).one(this.support.getTransitionEndEvent(true), function() {\r
-                               $(this).remove();\r
-                       });\r
-               } else {\r
-                       $("#splash").fadeOut(500, function() {\r
-                               $(this.remove());\r
-                       })\r
-               }\r
-\r
-       },\r
-       ready: function() {\r
-               if (this.isReady) {\r
-                       return;\r
-               }\r
-               this.isReady = true;\r
-               $("#main").css('display', 'block');\r
-               this.nav = new FluidbookNav(this);\r
-               this.help = new FluidbookHelp(this);\r
-               this.help.displayAtStartup();\r
-               resize();\r
-               $(this).trigger('fluidbookready');\r
-       },\r
-       loadPlugins: function() {\r
-               $.each(this.datas.plugins, function(k, plugin) {\r
-                       try {\r
-                               var functionName = plugin.replace(/\./g, '_');\r
-                               eval(functionName + '();');\r
-                       } catch (err) {\r
-                       }\r
-               });\r
-               $.each(this.datas.htmlmultimedia, function(k, code) {\r
-                       try {\r
-                               eval(code);\r
-                       } catch (err) {\r
-                       }\r
-               });\r
-       },\r
-       resetZoom: function() {\r
-               var $this = this;\r
-               if (this.support.iOS) {\r
-               } else if (!this.support.isMobile) {\r
-                       this.desktop.updateDesktopScale(1);\r
-               }\r
-\r
-       },\r
-       setZoom: function(zoom) {\r
-               if (zoom) {\r
-                       $("#pages").addClass('zoom');\r
-               } else {\r
-                       $("#pages").removeClass('zoom');\r
-               }\r
-       },\r
-       initPage: function(pageNr, doublePage, position) {\r
-               if ($("#page_" + pageNr).length > 0) {\r
-                       return;\r
-               }\r
-               $(doublePage).find('.' + position).remove();\r
-\r
-               var page = '<div class="page ' + position + '" id="page_' + pageNr + '" data-page="' + pageNr + '"><div class="background" page="' + pageNr + '"></div><div class="clinks"></div><div class="texts" highlight=""></div><div class="shade"></div></div>';\r
-               $(doublePage).append(page);\r
-       },\r
-       hidePage: function(position) {\r
-               $("#pages ." + position).hide();\r
-       },\r
-       initLinks: function(pageNr) {\r
-               if (pageNr == undefined) {\r
-                       pageNr = this.currentPage;\r
-               }\r
-\r
-               var lClass = 'left';\r
-               if (this.displayOnePage && pageNr % 2 == 1) {\r
-                       lClass = 'right';\r
-               }\r
-\r
-               if (pageNr % 2 == 1) {\r
-                       pageNr--;\r
-               }\r
-\r
-               $("#links").removeClass('left').removeClass('right').addClass(lClass).html(this.datas.links[pageNr]).show();\r
-               if (this.datas.bookmark) {\r
-                       $("#links").append(this.bookmarks.getBookmarkForPage(pageNr));\r
-               }\r
-               $("#links").prepend('<a href="#" class="nonlinkarea"></a>');\r
-\r
-               var $this = this;\r
-               if (this.datas.linkBlinkTime > 0) {\r
-                       ///this.animateLinks();\r
-               }\r
-               setTimeout(function() {\r
-                       $this.initVideos();\r
-               }, 1000);\r
-       },\r
-       animateLinks: function() {\r
-               var links = $(".link a.displayArea");\r
-               var bookmarks = $("#links .bookmark:not([data-enabled])");\r
-               if (Modernizr.csstransitions) {\r
-                       $(links).addClass('animating');\r
-                       $(bookmarks).css('opacity', 1).addClass('animating');\r
-                       setTimeout(function() {\r
-                               $(links).css('opacity', 0);\r
-                               $(bookmarks).css('opacity', 0);\r
-                               setTimeout(function() {\r
-                                       $(links).removeClass('animating').css('opacity', 1);\r
-                                       $(bookmarks).removeClass('animating').css('opacity', "");\r
-                               }, 1100);\r
-                       }, 50);\r
-               } else {\r
-                       $(links).addClass('animating').fadeOut(1000, function() {\r
-                               $(links).removeClass('animating').show();\r
-                       }).mouseover(function() {\r
-                               $(links).stop().removeClass('animating').css('opacity', 1).show();\r
-                               return true;\r
-                       });\r
-               }\r
-       },\r
-       initVideos: function() {\r
-               var $this = this;\r
-               $(".videoContainer").each(function() {\r
-                       $this.video.initVideo(this);\r
-               });\r
-       },\r
-       getNextOffset: function() {\r
-               var offset = 2;\r
-               if (this.displayOnePage) {\r
-                       offset = 1;\r
-               }\r
-               this.transitionAxis = 'x';\r
-               return offset;\r
-       },\r
-       goNextPage: function() {\r
-               if (this.transitionning) {\r
-                       return;\r
-               }\r
-               this.transitionAxis = 'x';\r
-               this.setCurrentPage(this.normalizePage(this.currentPage) + this.getNextOffset());\r
-       },\r
-       goFirstPage: function() {\r
-               if (this.transitionning) {\r
-                       return;\r
-               }\r
-               this.transitionAxis = 'x';\r
-               this.setCurrentPage(1);\r
-       },\r
-       goPreviousPage: function() {\r
-               if (this.transitionning) {\r
-                       return;\r
-               }\r
-               this.transitionAxis = 'x';\r
-               this.setCurrentPage(this.normalizePage(this.currentPage) - this.getNextOffset());\r
-       },\r
-       goLastPage: function() {\r
-               if (this.transitionning) {\r
-                       return;\r
-               }\r
-               this.transitionAxis = 'x';\r
-               this.setCurrentPage(this.datas.pages);\r
-       },\r
-       goNextChapter: function() {\r
-               if (this.transitionning) {\r
-                       return;\r
-               }\r
-               var next = this.bookmarks.getNextGroupCover(this.currentPage);\r
-               if (next === false) {\r
-                       return;\r
-               }\r
-               this.transitionAxis = 'x';\r
-               this.setCurrentPage(this.normalizePage(next));\r
-\r
-       },\r
-       goPreviousChapter: function() {\r
-               if (this.transitionning) {\r
-                       return;\r
-               }\r
-               var prev = this.bookmarks.getPreviousGroupCover(this.currentPage);\r
-               if (prev === false) {\r
-                       return;\r
-               }\r
-               this.transitionAxis = 'x';\r
-               this.setCurrentPage(this.normalizePage(prev));\r
-       },\r
-       goNextChapterPage: function() {\r
-               if (this.transitionning) {\r
-                       return;\r
-               }\r
-\r
-               var next = this.bookmarks.getNextPageInGroupOfPage(this.currentPage);\r
-               if (next === false) {\r
-                       return;\r
-               }\r
-               this.transitionAxis = 'y';\r
-               this.setCurrentPage(this.normalizePage(next));\r
-       },\r
-       goPreviousChapterPage: function() {\r
-               if (this.transitionning) {\r
-                       return;\r
-               }\r
-\r
-               var prev = this.bookmarks.getPreviousPageInGroupOfPage(this.currentPage);\r
-               if (prev === false) {\r
-                       return;\r
-               }\r
-               this.transitionAxis = 'y';\r
-               this.setCurrentPage(this.normalizePage(prev));\r
-       },\r
-       normalizePage: function(page) {\r
-               page = Math.max(1, Math.min(page, this.datas.pages));\r
-               if (!this.displayOnePage && page % 2 == 1) {\r
-                       page--;\r
-               }\r
-               return page;\r
-       },\r
-       setCurrentPage: function(page) {\r
-               window.location.hash = "#/page/" + this.normalizePage(page);\r
-       },\r
-       changeAddress: function() {\r
-               var $this = this;\r
-               var page;\r
-               var args = window.location.hash.split('/');\r
-               if (args.length <= 1 || args[1] == '' || args[1] == undefined) {\r
-                       return this.setCurrentPage('1');\r
-               } else if (args[1] == 'page') {\r
-                       page = parseInt(args[2]);\r
-                       if (isNaN(page) || page == undefined) {\r
-                               return this.setCurrentPage('1');\r
-                       }\r
-                       if (this.pad.enabled) {\r
-                               this.transitionAxis = this.pad.getTransitionAxis(this.currentPage, page);\r
-                       } else {\r
-                               this.transitionAxis = 'x';\r
-                       }\r
-\r
-                       $($this).trigger('changePage', [page]);\r
-\r
-                       this.closeView(function() {\r
-                               $this.pageTransition(page);\r
-                               $this.resetZoom();\r
-                               $this.stats.track(0, page);\r
-                               $this.hideSplash();\r
-                       }, true);\r
-               }\r
-               else {\r
-                       this.openView(args[1], args[2], args[3], function() {\r
-                               $this.hideSplash();\r
-                       });\r
-                       this.resetZoom();\r
-               }\r
-\r
-               return;\r
-       },\r
-       pageTransition: function(pageNr) {\r
-               this.tooltip.hideTooltip();\r
-               if (pageNr == undefined) {\r
-                       pageNr = this.currentPage;\r
-                       if (pageNr == -1) {\r
-                               pageNr = 1;\r
-                       }\r
-               }\r
-               pageNr = this.normalizePage(pageNr);\r
-\r
-\r
-               if (pageNr == this.normalizePage(this.currentPage) || this.currentPage == -1 || !this.support.transitions2d || this.datas.mobileTransitions == 'none') {\r
-                       return this.pageTransition1D(pageNr);\r
-               }\r
-\r
-               if (this.displayOnePage) {\r
-                       return this.pageTransition2DPortrait(pageNr);\r
-               }\r
-\r
-               if (!this.support.transitions3d || this.datas.mobileTransitions == 'slide') {\r
-                       return this.pageTransition2D(pageNr);\r
-               }\r
-\r
-               return this.pageTransition3D(pageNr);\r
-       },\r
-       pageTransition3D: function(pageNr) {\r
-\r
-               var $this = this;\r
-               if ($("#pages").hasClass('_3dtransition')) {\r
-                       return;\r
-               }\r
-               this.transitionning = true;\r
-               var $this = this;\r
-\r
-               var turning = this.getTurningPages(pageNr);\r
-\r
-               $("#pages").prepend('<div id="nextDoublePage" class="_3d doublePage ' + turning.nextFromClass + 'start"></div>');\r
-               var doublePage = $("#nextDoublePage");\r
-               var currentDoublePage = $("#currentDoublePage");\r
-\r
-               this.displayLoader();\r
-\r
-               this.loader.preloadPagesBeforeTransition([turning.currentLeft, turning.currentRight], function() {\r
-                       $("#pages").addClass('_3dtransition');\r
-                       $this.loader.setContentsInDoublePage(currentDoublePage, turning.flat, true, function() {\r
-                               $this.loader.setContentsInDoublePage(doublePage, turning.flip, true, function() {\r
-                                       $this.beforeTransition(pageNr, 3);\r
-                                       $(doublePage).addClass(turning.nextFromClass + 'end').one($this.support.getTransitionEndEvent(), function() {\r
-                                               if ($this.transitionning == false) {\r
-                                                       return;\r
-                                               }\r
-                                               if ($("#nextDoublePage").length == 0) {\r
-                                                       $("#pages").removeClass('_3dtransition');\r
-                                                       $this.transitionning = false;\r
-                                                       return;\r
-                                               }\r
-\r
-                                               // Set the flat contents with the new page\r
-                                               $this.loader.setContentsInDoublePage(doublePage, turning.end, false, function() {\r
-                                                       $(doublePage).removeClass('_3d').removeClass(turning.nextFromClass + 'start').removeClass(turning.nextFromClass + 'end');\r
-                                                       // Remove former part\r
-                                                       $("#currentDoublePage").remove();\r
-                                                       $(doublePage).attr('id', 'currentDoublePage');\r
-\r
-                                                       $("#pages").removeClass('_3dtransition');\r
-                                                       $this.afterTransition(pageNr);\r
-\r
-                                               });\r
-\r
-                                       });\r
-                               });\r
-                       });\r
-               });\r
-       },\r
-       getTurningPages: function(newPage) {\r
-               var res = {};\r
-\r
-               res.dir = 1;\r
-               if (newPage < this.currentPage) {\r
-                       res.dir = -1;\r
-               }\r
-\r
-               if (this.l10n.dir == 'ltr') {\r
-                       res.currentLeft = this.currentPage - this.currentPage % 2;\r
-                       res.currentRight = res.currentLeft + 1;\r
-                       if (res.dir == 1) {\r
-                               res.currentToClass = 'prev';\r
-                               res.nextFromClass = 'next';\r
-                               res.flat = [res.currentLeft, newPage + 1];\r
-                               res.flip = [newPage, res.currentRight];\r
-                       } else {\r
-                               res.currentToClass = 'next';\r
-                               res.nextFromClass = 'prev';\r
-                               res.flat = [newPage, res.currentRight];\r
-                               res.flip = [res.currentLeft, newPage + 1];\r
-                       }\r
-                       res['end'] = [newPage, newPage + 1];\r
-               } else {\r
-                       res.currentRight = this.currentPage - this.currentPage % 2;\r
-                       res.currentLeft = res.currentRight + 1;\r
-\r
-                       if (res.dir == 1) {\r
-                               res.currentToClass = 'next';\r
-                               res.nextFromClass = 'prev';\r
-                               res.flat = [newPage + 1, res.currentRight];\r
-                               res.flip = [res.currentLeft, newPage];\r
-                       } else {\r
-                               res.currentToClass = 'prev';\r
-                               res.nextFromClass = 'next';\r
-                               res.flat = [res.currentLeft, newPage];\r
-                               res.flip = [newPage + 1, res.currentRight];\r
-                       }\r
-\r
-                       if (this.displayOnePage) {\r
-                               res.end = [newPage, newPage + 1];\r
-                       } else {\r
-                               res.end = [newPage + 1, newPage];\r
-                       }\r
-               }\r
-               res.loading = [res.currentLeft, res.currentRight];\r
-               return json_parse(JSON.stringify(res));\r
-       },\r
-       reloadCurrentPage: function() {\r
-               this.pageTransition(this.currentPage);\r
-       },\r
-       readingPage: function(side) {\r
-               if (!this.displayOnePage) {\r
-                       var page = this.currentPage;\r
-                       var change = false;\r
-                       if (side == 'left' && page % 2 == 1) {\r
-                               page--;\r
-                               change = true;\r
-                       } else if (side == 'right' && page % 2 == 0) {\r
-                               page++;\r
-                               change = true;\r
-                       }\r
-                       if (change) {\r
-                               window.location.hash = "/page/" + page;\r
-                       }\r
-               }\r
-       },\r
-       hideUnnecessaryButtons: function(page) {\r
-               var speed = 500;\r
-               if (page == undefined) {\r
-                       page = this.currentPage;\r
-                       speed = 0;\r
-               }\r
-\r
-               if (Modernizr.csstransitions) {\r
-                       if (page <= 1) {\r
-                               $("#previous").addClass('hidden');\r
-                       } else {\r
-                               $("#previous").removeClass('hidden');\r
-                       }\r
-\r
-                       if (page >= this.datas.pages) {\r
-                               $("#next").addClass('hidden');\r
-                       } else {\r
-                               $("#next").removeClass('hidden');\r
-                       }\r
-               } else {\r
-                       $("#previous,#next").removeClass('hidden');\r
-\r
-                       if (page <= 1) {\r
-                               $("#previous:visible").fadeOut(speed);\r
-                       } else {\r
-                               $("#previous:hidden").fadeIn(speed);\r
-                       }\r
-\r
-                       if (page >= this.datas.pages) {\r
-                               $("#next:visible").fadeOut(speed);\r
-                       } else {\r
-                               $("#next:hidden").fadeIn(speed);\r
-                       }\r
-               }\r
-       },\r
-       updateShadows: function(page, animationDuration) {\r
-               if (animationDuration == undefined) {\r
-                       animationDuration = 0;\r
-               }\r
-               animationDuration *= 1000;\r
-\r
-               var delay, duration;\r
-               if (animationDuration == 0) {\r
-                       delay = 0;\r
-                       duration = 0;\r
-               } else {\r
-                       delay = animationDuration * 0.7;\r
-                       duration = animationDuration * 0.3;\r
-               }\r
-\r
-               var left = true, right = true;\r
-               if (this.displayOnePage) {\r
-                       right = false;\r
-               } else {\r
-                       if ((page <= 1 && this.l10n.dir == 'ltr') || (page >= this.datas.pages && this.l10n.dir == 'rtl')) {\r
-                               left = false;\r
-                       } else if ((page <= 1 && this.l10n.dir == 'rtl') || (page >= this.datas.pages && this.l10n.dir == 'ltr')) {\r
-                               right = false;\r
-                       }\r
-               }\r
-\r
-\r
-               if (left) {\r
-                       $("#shadow>.left:hidden").delay(delay).fadeIn(duration);\r
-               } else {\r
-                       $("#shadow>.left:visible").fadeOut(duration);\r
-               }\r
-\r
-               if (right) {\r
-                       $("#shadow>.right:hidden").delay(delay).fadeIn(duration);\r
-               } else {\r
-                       $("#shadow>.right:visible").fadeOut(duration);\r
-               }\r
-       },\r
-       showAllButtons: function() {\r
-               $("#next,#previous").addClass('help').show();\r
-       },\r
-       pageTransition2D: function(pageNr) {\r
-               this.transitionning = true;\r
-               var $this = this;\r
-\r
-               var turning = this.getTurningPages(pageNr);\r
-\r
-               $("#pages").append('<div id="nextDoublePage" class="doublePage _2d axis_' + this.transitionAxis + ' ' + turning.nextFromClass + '"></div>');\r
-               var doublePage = $("#nextDoublePage");\r
-               this.displayLoader();\r
-               this.loader.preloadPagesBeforeTransition(turning.end, function() {\r
-                       $this.loader.setContentsInDoublePage(doublePage, turning.end, true, function() {\r
-                               $this.beforeTransition(pageNr, 2);\r
-                               $("#currentDoublePage").addClass('_2d').addClass('axis_' + $this.transitionAxis).addClass(turning.currentToClass);\r
-                               $(doublePage).removeClass(turning.nextFromClass).one($this.support.getTransitionEndEvent(), function(event) {\r
-                                       if ($this.transitionning == false) {\r
-                                               return;\r
-                                       }\r
-                                       $("#currentDoublePage").remove();\r
-                                       $("#nextDoublePage").attr('id', 'currentDoublePage');\r
-                                       $this.afterTransition(pageNr);\r
-                               });\r
-                       });\r
-               });\r
-       },\r
-       pageTransition2DPortrait: function(pageNr) {\r
-               this.transitionning = true;\r
-               var $this = this;\r
-\r
-               var turning = this.getTurningPages(pageNr);\r
-\r
-               $("#pages").append('<div id="nextDoublePage" class="doublePage _2d axis_' + this.transitionAxis + ' ' + turning.nextFromClass + '"></div>');\r
-               var doublePage = $("#nextDoublePage");\r
-\r
-               if (this.displayOnePage) {\r
-                       this.hidePage('right');\r
-               }\r
-\r
-               this.displayLoader();\r
-               this.loader.preloadPagesBeforeTransition(turning.end, function() {\r
-                       $this.loader.setContentsInDoublePage(doublePage, turning.end, true, function() {\r
-                               $this.beforeTransition(pageNr, 2);\r
-                               $("#currentDoublePage").addClass('axis_' + $this.transitionAxis).addClass('_2d').addClass(turning.currentToClass);\r
-                               $(doublePage).removeClass(turning.nextFromClass).one($this.support.getTransitionEndEvent(), function() {\r
-                                       fb('received event');\r
-                                       if ($this.transitionning == false) {\r
-                                               return;\r
-                                       }\r
-                                       $("#currentDoublePage").remove();\r
-                                       $("#nextDoublePage").attr('id', 'currentDoublePage');\r
-                                       $this.afterTransition(pageNr);\r
-                               });\r
-                       });\r
-               });\r
-       },\r
-       pageTransition1D: function(pageNr) {\r
-               var page = pageNr;\r
-               var doublePage = $("#currentDoublePage");\r
-               var $this = this;\r
-\r
-               if (this.displayOnePage) {\r
-                       this.hidePage('right');\r
-               }\r
-               var turning = this.getTurningPages(pageNr);\r
-               this.beforeTransition(pageNr);\r
-               this.loader.setContentsInDoublePage(doublePage, turning.end, true, function() {\r
-                       $this.afterTransition(page);\r
-               });\r
-\r
-       },\r
-       beforeTransition: function(page, d) {\r
-               if (d == undefined) {\r
-                       d = 1;\r
-               }\r
-               $(".axis_y").removeClass('axis_y');\r
-               $(".axis_x").removeClass('axis_x');\r
-               $("#links").hide();\r
-               this.hideLoader();\r
-               this.hideUnnecessaryButtons(page);\r
-               var animationDuration = d <= 1 ? 0 : parseFloat(this.datas.mobileTransitionDuration);\r
-               this.updateShadows(page, animationDuration);\r
-\r
-               fb('beforeTransition ' + page);\r
-       },\r
-       afterTransition: function(page) {\r
-               if (this.transitionning === false) {\r
-                       //return;\r
-               }\r
-               fb('afterTransition ' + page);\r
-\r
-               var $this = this;\r
-               this.currentPage = page;\r
-\r
-               this.setPageNumbers();\r
-               setTimeout(function() {\r
-                       $this.loader.preloadAround(page);\r
-               }, 1000);\r
-               this.initLinks();\r
-               this.hideLoader();\r
-               this.resetWaiters();\r
-\r
-               // Clean messy stuffs\r
-               $("#pages").removeClass('_3dtransition');\r
-               if ($("#nextDoublePage").length > 0) {\r
-                       $("#currentDoublePage").remove();\r
-                       $("#nextDoublePage").attr('id', 'currentDoublePage');\r
-               }\r
-               if ($("#currentDoublePage").length > 1) {\r
-                       $("#currentDoublePage:gt(0)").remove();\r
-               }\r
-               this.transitionning = false;\r
-\r
-               if (this.pad.enabled) {\r
-                       if (this.currentPage == this.datas.pages) {\r
-                               $("#down").css('opacity', 0);\r
-                       } else {\r
-                               $("#down").css('opacity', 1);\r
-                               if (!this.bookmarks.hasNextPageInGroup(this.currentPage)) {\r
-                                       $("#down").addClass('right');\r
-                               } else {\r
-                                       $("#down").removeClass('right');\r
-                               }\r
-                       }\r
-               } else {\r
-                       $("#down").css('opacity', 0);\r
-               }\r
-\r
-       },\r
-       setPageNumbers: function() {\r
-               $("#pagesnumbers .left").html(this.getPageNumberOfSide('left'));\r
-               $("#pagesnumbers .right").html(this.getPageNumberOfSide('right'));\r
-\r
-       },\r
-       getPageNumberOfSide: function(side) {\r
-               var p = $("#currentDoublePage").find('.' + side);\r
-               if (p.length == 0) {\r
-                       return '';\r
-               }\r
-               return this.physicalToVirtual($(p).data('page'));\r
-       },\r
-       clickLogo: function() {\r
-               if (this.datas.url_link == '' || this.datas.url_link == 'http://') {\r
-                       return;\r
-               }\r
-               this.wopen(this.datas.url_link, '_blank');\r
-       },\r
-       viewMode: function() {\r
-               return $("#view .mview").length > 0;\r
-       },\r
-       openView: function(view, param1, param2, callback) {\r
-               var $this = this;\r
-\r
-               this.displayLoader();\r
-               this.resetWaiters();\r
-\r
-               setTimeout(function() {\r
-                       $this._openView(view, param1, param2, callback);\r
-               }, 20);\r
-       },\r
-       addWaiter: function(reset) {\r
-               if (reset == undefined) {\r
-                       reset = false;\r
-               }\r
-               if (reset) {\r
-                       this.resetWaiters();\r
-               }\r
-               var rand = Math.round(Math.random() * 100000);\r
-               this.waiters.push(rand);\r
-               return rand;\r
-       },\r
-       waiterActive: function(id) {\r
-               return this.waiters.indexOf(id) > -1;\r
-       },\r
-       resetWaiters: function() {\r
-               this.waiters = [];\r
-       },\r
-       _openView: function(view, param1, param2, callback) {\r
-               var $this = this;\r
-               var preload = {index: 'thumbnails',\r
-                       search: 'thumbnails',\r
-                       bookmark: 'thumbnails',\r
-                       video: 'extras'};\r
-\r
-               if (!OFFLINEAPP && this.gal != null && preload[view] != undefined) {\r
-                       var w = this.addWaiter(true);\r
-                       this.gal.downloadAndCall(preload[view], function() {\r
-                               if ($this.waiterActive(w)) {\r
-                                       $this.__openView(view, param1, param2, callback);\r
-                               }\r
-                       });\r
-               } else {\r
-                       this.__openView(view, param1, param2, callback);\r
-               }\r
-       },\r
-       __openView: function(view, param1, param2, callback) {\r
-               var $this = this;\r
-               var camelView = view.charAt(0).toUpperCase() + view.substr(1);\r
-\r
-               var cb = function() {\r
-                       $this.openingView(callback);\r
-               };\r
-\r
-               if (view == 'index') {\r
-                       this.openIndex(this.l10n.__('overview'), undefined, true, cb);\r
-               } else if (view == 'search') {\r
-                       this.searchString = param1;\r
-                       var group = param2;\r
-                       $("#q").val(param1);\r
-                       this.displayResults(this.search.find(param1), group, cb);\r
-                       if (group == undefined) {\r
-                               this.stats.track(1, 0, param1);\r
-                       }\r
-               } else if (view == 'video') {\r
-                       this.openVideo(param1, cb);\r
-               } else if (view == 'webvideo') {\r
-                       this.openWebVideo(param1, param2, cb);\r
-               } else if (view == 'multimedia') {\r
-                       this.openMultimedia(param1, cb);\r
-               } else if (view == 'chapters') {\r
-                       this.openChapters(cb);\r
-               } else if (view == 'archives') {\r
-                       this.openArchives(this.l10n.__($("#nav #archives").attr('help')), cb);\r
-               } else {\r
-                       this['open' + camelView](param1, param2, cb);\r
-               }\r
-       },\r
-       openingView: function(callback) {\r
-               var $this = this;\r
-               this.resize.resizeView();\r
-               this.tooltip.hideTooltip();\r
-\r
-               var mview = $('#view .mview:last');\r
-\r
-               if (this.support.transitions2d) {\r
-                       var vertFrom = {\r
-                               translateY: $(window).height() + 'px'\r
-                       };\r
-                       var vertTo = {\r
-                               translateY: '0px'\r
-                       };\r
-                       var horiFrom = {\r
-                               translateX: $(window).width() + 'px'\r
-                       };\r
-                       var horiTo = {\r
-                               translateX: '0px'\r
-                       };\r
-                       var from = vertFrom;\r
-                       var to = vertTo;\r
-                       if ($(mview).hasClass('hori')) {\r
-                               from = horiFrom;\r
-                               to = horiTo;\r
-                       }\r
-\r
-                       $(mview).show().removeClass('animate').transform(from);\r
-\r
-                       setTimeout(function() {\r
-                               $(mview).one($this.support.getTransitionEndEvent(), function() {\r
-                                       $("#main").hide();\r
-                                       $('body').addClass('view');\r
-                                       $(mview).removeClass('animate');\r
-                                       callback();\r
-                                       $this.hideLoader();\r
-                                       resize();\r
-                               }).addClass('animate').transform(to);\r
-                       }, 50);\r
-\r
-               } else {\r
-                       $("#main").hide();\r
-                       $('body').addClass('view');\r
-                       $(mview).show();\r
-                       callback();\r
-                       this.hideLoader();\r
-                       resize();\r
-               }\r
-       },\r
-       displayResults: function(data, group, callback) {\r
-               var $this = this;\r
-               var results = data.results;\r
-               var hideNoResults = !this.datas.searchShowNoResultsPages;\r
-               if (data.total <= 0) {\r
-                       alert(this.l10n.__('no result found'));\r
-                       window.location = "#/page/" + this.currentPage;\r
-                       return;\r
-               }\r
-\r
-               this.openIndex(this.l10n.__('search results for') + ' &laquo; ' + this.searchString + " &raquo;", group, false, function() {\r
-                       var hits = [];\r
-                       for (var i = 0; i <= $this.datas.pages; i++) {\r
-                               hits[i] = 0;\r
-                       }\r
-\r
-                       $.each(results, function(k, v) {\r
-                               hits[k] += v;\r
-                       });\r
-\r
-                       var e = encodeURIComponent($this.searchString);\r
-\r
-                       $(".doubleThumb").each(function() {\r
-                               var pages = $(this).data('pages').toString().split(',');\r
-                               var hitsp = 0;\r
-                               var pagesWithHits = [];\r
-                               for (var i in pages) {\r
-                                       var n = parseInt(pages[i]);\r
-                                       if (hits[n] > 0) {\r
-                                               hitsp += hits[n];\r
-                                               pagesWithHits.push(pages[i]);\r
-                                       }\r
-                               }\r
-\r
-                               if ($(this))\r
-                                       if ($(this).find('.hits').length > 0) {\r
-                                               return;\r
-                                       }\r
-\r
-                               if (hitsp == 0) {\r
-                                       if (hideNoResults) {\r
-                                               $(this).remove();\r
-                                               return;\r
-                                       }\r
-                                       $(this).append('<div class="overlay"></div>');\r
-                                       $(this).append('<div class="hits no">' + $this.l10n.__('no result found') + '</div>');\r
-                               } else {\r
-                                       $(this).append('<div class="hits yes">' + hitsp + ' ' + $this.l10n.__('hit(s)') + '</div>');\r
-                                       if ($this.pad.enabled) {\r
-                                               if (pagesWithHits.length == 1) {\r
-                                                       $(this).find('a').attr('href', '#/page/' + pagesWithHits[0]);\r
-                                               } else {\r
-                                                       $(this).find('a').attr('href', '#/search/' + e + '/' + $(this).attr('page'));\r
-                                               }\r
-                                       } else {\r
-                                               $(this).find('a').attr('href', '#/page/' + $(this).attr('page'));\r
-                                       }\r
-                               }\r
-                       });\r
-\r
-                       $this.termsToHighlight = data.terms;\r
-\r
-                       if (callback != undefined) {\r
-                               callback();\r
-                       }\r
-               });\r
-       },\r
-       openMultimedia: function(multimedia, callback) {\r
-               var a = $('a[href="#/multimedia/' + multimedia + '"]');\r
-               var markup = decodeURIComponent($(a).attr('data-multimedia'));\r
-\r
-               var view = '<div class="caption"><a href="#" class="back">' + this.l10n.__('back') + '</a></div>';\r
-               view += '<div class="content">';\r
-               view += markup;\r
-               view += '</div>';\r
-\r
-               $("#view").append('<div class="mview">' + view + '</div>');\r
-\r
-               if (callback != undefined) {\r
-                       callback();\r
-               }\r
-       },\r
-       openVideo: function(video, callback) {\r
-               var a = $('a[href="#/video/' + video + '"]');\r
-               var markup = decodeURIComponent($(a).attr('data-video'));\r
-\r
-               var view = '<div class="caption"><a href="#" class="back">' + this.l10n.__('back') + '</a></div>';\r
-               view += '<div class="content">';\r
-               view += markup;\r
-               view += '</div>';\r
-\r
-               $("#view").append('<div class="mview">' + view + '</div>');\r
-\r
-               this.stats.track(11);\r
-\r
-               this.initVideos();\r
-               var $this = this;\r
-               var times = [250, 500, 750, 1000, 1250];\r
-               $.each(times, function(k, v) {\r
-                       setTimeout(function() {\r
-                               $this.resize.resizePopupVideos();\r
-                       }, v);\r
-               });\r
-               if (callback != undefined) {\r
-                       callback();\r
-               }\r
-       },\r
-       openWebVideo: function(service, video, callback) {\r
-\r
-               var view = '<div class="caption"><a href="#" class="back">' + this.l10n.__('back') + '</a></div>';\r
-               view += '<div class="content">';\r
-               if (service == 'youtube') {\r
-                       view += '<iframe class="webvideo" type="text/html" width="100%" height="407" src="http://www.youtube.com/embed/' + video + '?autoplay=1&modestbranding=1&rel=0&html5=1" frameborder="0"></iframe>';\r
-               } else if (service == 'dailymotion') {\r
-                       view += '<iframe class="webvideo" type="text/html" width="100%" height="407" src="http://www.dailymotion.com/embed/video/' + video + '?autoplay=1&logo=0&related=0&html5=1" width="100%" frameborder="0"></iframe>'\r
-               }\r
-               view += '</div>';\r
-               $("#view").append('<div class="mview">' + view + '</div>');\r
-\r
-               $("#view .mview:last iframe").each(function() {\r
-                       $(this).attr('height', ($(this).width() * 9) / 16);\r
-               });\r
-               this.stats.track(11);\r
-               if (callback != undefined) {\r
-                       callback();\r
-               }\r
-       },\r
-       openLocales: function(p1, p2, callback) {\r
-               var view = '<div class="caption"><a href="#" class="back">' + this.l10n.__('back') + '</a><h2>Select language</h2></div>';\r
-               view += '<div class="content">';\r
-               view += '<ul class="chapters localesList">';\r
-               var $this = this;\r
-               $.each(this.l10n.multilang, function(k, v) {\r
-                       var url = v.url;\r
-                       if (url.substr(0, 3) == '../' && !$this.datas.standalone) {\r
-                               url = '../' + url;\r
-                       }\r
-                       /*'datas' => array(__('Langue') => 'lang',\r
-                        __('Langue') . ' (' . __('Pays') . ')' => 'lang_country',\r
-                        __('Pays') . ' (' . __('Langue') . ')' => 'country_lang'));*/\r
-\r
-                       var name = '';\r
-                       if ($this.datas.multilangDisplay == 'lang') {\r
-                               name = v.langName;\r
-                       } else if ($this.datas.multilangDisplay == 'lang_country') {\r
-                               name = v.langName + ' (' + v.countryName + ')';\r
-                       } else if ($this.datas.multilangDisplay == 'country_lang') {\r
-                               name = v.countryName + ' (' + v.langName + ')';\r
-                       }\r
-\r
-                       var c = '';\r
-                       if ($this.datas.phonegap) {\r
-                               view += '<li data-level="0"><a href="#" data-id="' + url + '" data-locale="' + v.lang + '" class="level0 appswitchlocale"><img src="images/flags/' + v.flag + '.png" alt="' + name + '" />' + name + '</a></li>';\r
-                       } else {\r
-                               view += '<li data-level="0"><a href="' + url + '" class="level0"><img src="images/flags/' + v.flag + '.png" alt="' + name + '" />' + name + '</a></li>';\r
-                       }\r
-               });\r
-               view += '</ul>';\r
-               view += '</div>';\r
-\r
-               $("#view").append('<div class="mview">' + view + '</div>');\r
-               if (callback != undefined) {\r
-                       callback();\r
-               }\r
-       },\r
-       openShare: function(p1, p2, callback) {\r
-               var view = '<div class="caption"><a href="#" class="back">' + this.l10n.__('back') + '</a><h2>' + this.l10n.__('share') + '</h2></div>';\r
-               view += '<div class="content">';\r
-               view += '<ul class="chapters shareList">';\r
-               var $this = this;\r
-               if (this.datas.friend) {\r
-                       view += '<li data-level="0"><a href="#" data-service="email" class="share level0"><img height="25" src="data/images/share-email.svg" /> E-mail</a></li>';\r
-               }\r
-               if (this.datas.facebook) {\r
-                       view += '<li data-level="0"><a href="#" data-service="facebook" class="share level0"><img height="25" src="data/images/share-facebook.svg" /> Facebook</a></li>';\r
-               }\r
-               if (this.datas.twitter) {\r
-                       view += '<li data-level="0"><a href="#" data-service="twitter" class="share level0"><img height="25" src="data/images/share-twitter.svg" /> Twitter</a></li>';\r
-               }\r
-               if (this.datas.googleplus) {\r
-                       view += '<li data-level="0"><a href="#" data-service="googleplus" class="share level0"><img height="25" src="data/images/share-googleplus.svg" /> Google+</a></li>';\r
-               }\r
-               if (this.datas.linkedin) {\r
-                       view += '<li data-level="0"><a href="#" data-service="linkedin" class="share level0"><img height="25" src="data/images/share-linkedin.svg" /> LinkedIn</a></li>';\r
-               }\r
-               if (this.datas.viadeo) {\r
-                       view += '<li data-level="0"><a href="#" data-service="viadeo" class="share level0"><img height="25" src="data/images/share-viadeo.svg" /> Viadeo</a></li>';\r
-               }\r
-               view += '</ul>';\r
-               view += '</div>';\r
-\r
-               $("#view").append('<div class="mview">' + view + '</div>');\r
-               if (callback != undefined) {\r
-                       callback();\r
-               }\r
-       },\r
-       openBookmark: function(p1, p2, callback) {\r
-               var view = this.bookmarks.getView();\r
-               if (view !== false) {\r
-                       $("#view").append('<div class="mview">' + view + '</div>');\r
-                       if (callback != undefined) {\r
-                               callback();\r
-                       }\r
-               } else {\r
-                       var message = this.l10n.__("you don't have any bookmarks");\r
-                       if (this.datas.phonegap) {\r
-                               navigator.notification.alert(message, function() {\r
-\r
-                               }, this.l10n.__('bookmarks'));\r
-                       } else {\r
-                               window.alert(message);\r
-                               window.history.back();\r
-                       }\r
-                       this.hideLoader();\r
-               }\r
-       },\r
-       openChapters: function(callback) {\r
-               if (this.chapters == undefined) {\r
-                       this.chapters = new FluidbookChapters(this, this.datas.chapters);\r
-               }\r
-\r
-               var view = '<div class="caption"><a href="#" class="back">' + this.l10n.__('back') + '</a><h2>' + this.l10n.__('chapters') + '</h2></div>';\r
-               view += '<div class="content">';\r
-               view += this.chapters.getView();\r
-               view += '</div>';\r
-\r
-               $("#view").append('<div class="mview">' + view + '</div>');\r
-               if (callback != undefined) {\r
-                       callback();\r
-               }\r
-       },\r
-       openIndex: function(title, group, closeAll, callback) {\r
-               var c = !closeAll ? ' one' : '';\r
-               var index = '<div class="caption"><a href="#" class="back' + c + '">' + this.l10n.__('back') + '</a><h2>' + title + '</h2></div>';\r
-               index += this.index.getView(group);\r
-               $("#view").append('<div class="mview">' + index + '</div>');\r
-\r
-               this.bookmarks.updateBookmarks();\r
-               if (callback != undefined) {\r
-                       callback();\r
-               }\r
-       },\r
-       openArchives: function(title, callback) {\r
-               var archives = '<div class="caption"><a href="#" class="back">' + this.l10n.__('back') + '</a><h2>' + title + '</h2></div>';\r
-               archives += '<div class="image" id="archivesview"><img src="data/images/' + this.datas.externalArchives + '" /><div class="links">' + this.datas.links.archives + '</div></div>';\r
-               $("#view").append('<div class="mview archives">' + archives + '</div>');\r
-               if (callback != undefined) {\r
-                       callback();\r
-               }\r
-       },\r
-       physicalToVirtual: function(page) {\r
-               return this.datas.numerotation[page - 1];\r
-       },\r
-       virtualToPhysical: function(page) {\r
-               return this.datas.numerotation.indexOf(page) + 1;\r
-       },\r
-       closeView: function(callback, all, animate) {\r
-               var $this = this;\r
-               if (all == undefined) {\r
-                       all = false;\r
-               }\r
-               if (animate == undefined) {\r
-                       animate = true;\r
-               }\r
-               if ($('.mview').scrollTop() > 0) {\r
-                       $('.mview').scrollTo(0, 500, function() {\r
-                               $this.closeView(callback, all, animate);\r
-                       });\r
-                       return;\r
-               }\r
-\r
-               all = all || ($("#view .mview").length <= 1);\r
-               if (!this.viewMode()) {\r
-                       callback();\r
-                       return;\r
-               }\r
-\r
-               var mview = $("#view .mview:last");\r
-               if (all) {\r
-                       $("#view .mview:not(:last)").remove();\r
-               }\r
-\r
-               var to = {\r
-                       translateY: $(window).height() + 'px'\r
-               };\r
-\r
-               if ($(mview).hasClass('hori')) {\r
-                       to = {translateX: $(window).width() + 'px'}\r
-               }\r
-\r
-               if (animate && this.support.transitions2d) {\r
-                       setTimeout(function() {\r
-                               $(mview).one($this.support.getTransitionEndEvent(), function() {\r
-                                       $(this).remove();\r
-                                       callback();\r
-                               }).addClass('animate').transform(to);\r
-                       }, 50);\r
-\r
-               } else {\r
-                       $(mview).remove()\r
-                       callback();\r
-               }\r
-               if (all) {\r
-                       $("#main").show();\r
-                       $('body').removeClass('view');\r
-               }\r
-               resize();\r
-       },\r
-       getSearchHints: function(q) {\r
-               this.killLastSearchHint();\r
-               this.displaySearchHints(this.search.getHints(q));\r
-       },\r
-       displaySearchHints: function(hints) {\r
-\r
-               this.hideSearchHints();\r
-               if (hints.length == 0) {\r
-                       return;\r
-               }\r
-               $.each(hints, function(k, v) {\r
-                       $("#searchHints").append('<a class="hint" term="' + v[0] + '" href="#/search/' + v[0] + '">' + v[0] + ' <em>(' + v[1] + ')</em></a>');\r
-               });\r
-               var qoffset = $("#q").offset();\r
-               var top = qoffset.top + $("#q").outerHeight() + 5;\r
-\r
-               var left = qoffset.left;\r
-               if (this.l10n.dir == 'rtl') {\r
-                       left = -1 * ($(window).width() - left - $("#q").outerWidth());\r
-               }\r
-               $("#searchHints").css({top: top, left: left}).show();\r
-       },\r
-       killLastSearchHint: function() {\r
-               this.search.kill();\r
-       },\r
-       hideSearchHints: function() {\r
-               this.killLastSearchHint();\r
-               $("#searchHints").html('');\r
-               $("#searchHints").hide();\r
-       },\r
-       getLocationToShare: function() {\r
-               if (this.datas.phonegap) {\r
-                       return this.datas.offlineLink;\r
-               } else {\r
-                       var l = window.location.toString();\r
-                       var e = l.split("#");\r
-                       return e[0];\r
-               }\r
-       },\r
-       sendEmail: function() {\r
-               window.location = 'mailto:?subject=' + this.datas.title + '&body=' + this.datas.title + ' : ' + this.getLocationToShare();\r
-               this.stats.track(5);\r
-       },\r
-       sendTwitter: function() {\r
-               this.service.open('twitterShare', {\r
-                       url: this.getLocationToShare(),\r
-                       post: this.datas.twitter_description.replace('%title%', this.datas.title)\r
-               });\r
-               this.stats.track(13);\r
-       },\r
-       sendFacebook: function() {\r
-               this.service.open('facebookShare', {\r
-                       url: this.getLocationToShare()\r
-               });\r
-               this.stats.track(12);\r
-       },\r
-       sendGoogleplus: function() {\r
-               this.service.open('googleplusShare', {\r
-                       url: this.getLocationToShare()\r
-               });\r
-               this.stats.track(12);\r
-       },\r
-       sendLinkedin: function() {\r
-               this.service.open('linkedinShare', {\r
-                       url: this.getLocationToShare()\r
-               });\r
-               this.stats.track(12);\r
-       },\r
-       sendViadeo: function() {\r
-               this.service.open('viadeoShare', {\r
-                       url: this.getLocationToShare()\r
-               });\r
-               this.stats.track(12);\r
-       },\r
-       print: function() {\r
-               var $this = this;\r
-               var pdf;\r
-               var pdfName;\r
-               if (this.datas.pdfName.substr(0, 4) == 'http') {\r
-                       pdf = this.datas.pdfName;\r
-               } else {\r
-                       pdf = getBaseURL() + '/data/' + this.datas.pdfName;\r
-               }\r
-               var e = pdf.split('/');\r
-               pdfName = e.pop();\r
-               if (this.gal && !OFFLINEAPP) {\r
-                       this.displayLoader();\r
-                       this.gal.downloadAndCall('extras', function() {\r
-                               $this._openFile(pdf, $("#print"), 'pdf', pdfName);\r
-                       });\r
-               } else {\r
-                       this._openFile(pdf, $("#print"), 'pdf', pdfName);\r
-               }\r
-       },\r
-       _openFile: function(url, e, type, localname) {\r
-\r
-               var $this = this;\r
-\r
-               if (this.datas.phonegap != false) {\r
-                       if (type == undefined) {\r
-                               var e = url.split('.');\r
-                               type = e.pop();\r
-                       }\r
-\r
-                       if (url.indexOf('http') == 0) {\r
-                               return this._downloadFilePhonegap(url, localname, LocalFileSystem.TEMPORARY, this._openFilePhonegap, [url, e, type]);\r
-                       } else {\r
-                               if (this._openFilePhonegap(url, e, type)) {\r
-                                       return;\r
-                               }\r
-                       }\r
-\r
-               }\r
-               this.wopen(url, '_blank');\r
-       },\r
-       _downloadFilePhonegap: function(url, localname, fs, callback, callbackArgs) {\r
-               var $this = this;\r
-               if (fs == undefined) {\r
-                       fs = LocalFileSystem.PERSISTENT;\r
-               }\r
-\r
-               window.requestFileSystem(fs, 0, function(fileSystem) {\r
-                       fileSystem.root.getFile("dummy.html", {create: true, exclusive: false}, function(fileEntry) {\r
-                               var filePath = fileEntry.fullPath.replace("dummy.html", "") + localname;\r
-                               var fileTransfer = new FileTransfer();\r
-                               var uri = encodeURI(url);\r
-                               fileTransfer.download(\r
-                                               uri,\r
-                                               filePath,\r
-                                               function(entry) {\r
-                                                       if (callback != undefined) {\r
-                                                               if (callbackArgs == undefined) {\r
-                                                                       callbackArgs = [];\r
-                                                               }\r
-                                                               callbackArgs[0] = entry.toURL();\r
-                                                               callback.apply($this, callbackArgs);\r
-                                                       }\r
-                                               },\r
-                                               function(error) {\r
-\r
-                                               }\r
-                               );\r
-                       });\r
-               }, function() {\r
-\r
-               });\r
-       },\r
-       _openFilePhonegap: function(url, e, type) {\r
-               var $this = this;\r
-               var types_ios = {pdf: 'com.adobe.pdf'};\r
-               var types_android = {pdf: 'application/pdf'};\r
-               if (this.datas.phonegap == 'ios') {\r
-                       this.displayLoader();\r
-                       if (types_ios[type] != undefined) {\r
-                               var offset = $(e).offset();\r
-                               offset.left += ($(e).width() / 2);\r
-                               offset.top += ($(e).height());\r
-\r
-                               try {\r
-                                       ExternalFileUtil.openWith(url, types_ios[type], function() {\r
-                                               $this.hideLoader();\r
-                                       }, function() {\r
-                                               $this.wopen(url, "_blank", 'location=no');\r
-                                               $this.hideLoader();\r
-                                       }, offset);\r
-\r
-                               } catch (err) {\r
-                                       $this.wopen(url, "_blank", 'location=no');\r
-                                       $this.hideLoader();\r
-                               }\r
-                               return true;\r
-                       }\r
-               }\r
-               if (this.datas.phonegap == 'android') {\r
-                       if (types_android[type] != undefined) {\r
-                               this.displayLoader();\r
-                               setTimeout(function() {\r
-                                       webintent.startActivity({\r
-                                               action: webintent.ACTION_VIEW,\r
-                                               type: types_android[type],\r
-                                               url: url\r
-                                       }, function(args) {\r
-                                               $this.hideLoader(5);\r
-                                       }, function(args) {\r
-                                               $this.hideLoader(5);\r
-                                       });\r
-                               }, 100);\r
-\r
-                       }\r
-                       return true;\r
-\r
-               }\r
-               return false;\r
-       },\r
-       highlightSearchTerms: function(pageNr) {\r
-               return;\r
-       },\r
-       touchOffset: function(offset) {\r
-               offset *= $("#currentDoublePage").width();\r
-               $("#currentDoublePage").addClass('sliding');\r
-               $("#currentDoublePage").css({\r
-                       translateX: offset\r
-               });\r
-       },\r
-       displayLoader: function() {\r
-               if (this.support.isMobile) {\r
-                       this.coquillette.show();\r
-               } else {\r
-                       this.coquillette.show();\r
-                       $('body').addClass('loading');\r
-               }\r
-       },\r
-       hideLoader: function(delay, force) {\r
-               if (force == undefined) {\r
-                       force = false;\r
-               }\r
-               if (delay == undefined) {\r
-                       delay = 0;\r
-               }\r
-               var $this = this;\r
-               if (delay == 0) {\r
-                       return this._hideLoader(force);\r
-               }\r
-               setTimeout(function() {\r
-                       $this._hideLoader(force);\r
-               }, delay * 1000);\r
-       },\r
-       _hideLoader: function(force) {\r
-               if (force == undefined) {\r
-                       force = false;\r
-               }\r
-               if (!force && $('#splash').css('visibility') == 'visible') {\r
-                       return;\r
-               }\r
-               if (this.support.isMobile) {\r
-                       this.coquillette.hide();\r
-               } else {\r
-                       this.coquillette.hide();\r
-                       $('body').removeClass('loading');\r
-               }\r
-       },\r
-       pollZoom: function() {\r
-               var z = this.support.getZoomLevel();\r
-               //console.log(z);\r
-               $('html').attr('data-zoom', z);\r
-               if (z <= 1) {\r
-                       $("html").removeClass('pan');\r
-               } else {\r
-                       $("html").addClass('pan');\r
-               }\r
-       },\r
-       intentShare: function(subject, body) {\r
-               if (subject == undefined) {\r
-                       subject = this.datas.title;\r
-               }\r
-               if (body == undefined) {\r
-                       body = this.datas.title + ' : ' + this.getLocationToShare();\r
-               }\r
-\r
-               if (this.datas.phonegap == 'android') {\r
-                       var extras = {};\r
-                       extras[webintent.EXTRA_SUBJECT] = subject;\r
-                       extras[webintent.EXTRA_TEXT] = body;\r
-                       webintent.startActivity({\r
-                               action: webintent.ACTION_SEND,\r
-                               type: 'text/plain',\r
-                               extras: extras\r
-                       }, function(args) {\r
-                       }, function(args) {\r
-                       });\r
-               } else {\r
-                       window.location = 'mailto:?subject=' + subject + '&body=' + body;\r
-               }\r
-               this.stats.track(5);\r
-       },\r
-       wopen: function(url, target, options) {\r
-               if (target == undefined) {\r
-                       target = '_self';\r
-               }\r
-               if (options == undefined) {\r
-                       options = '';\r
-               }\r
-\r
-               var locationdefault = 'yes';\r
-               if (this.datas.phonegap) {\r
-                       locationdefault = 'yes';\r
-               }\r
-\r
-               if (options == '') {\r
-                       options = 'location=' + locationdefault;\r
-               } else if (options.indexOf('location=') == -1) {\r
-                       options += ',location=' + locationdefault;\r
-               }\r
-               window.open(url, target, options);\r
-       }\r
-}\r
-\r
+function Fluidbook(datas) {
+       this.init(datas);
+}
+
+// Constantes
+// Background dispoition
+Fluidbook.NONE = 3;
+Fluidbook.STRETCH = 0;
+Fluidbook.RATIO = 2;
+Fluidbook.REPEAT = 1;
+// Horizontal alignments
+Fluidbook.CENTER = 4;
+Fluidbook.LEFT = 5;
+Fluidbook.RIGHT = 6;
+// Vertical alignments
+Fluidbook.MIDDLE = 7;
+Fluidbook.TOP = 8;
+Fluidbook.BOTTOM = 9;
+Fluidbook.prototype = {
+       init: function(datas) {
+               this.datas = datas;
+               this.junk = datas.cacheDate;
+               this.cache = new FluidbookCache(datas);
+               this.service = new FluidbookService(this, datas.id);
+               this.support = new FluidbookSupport(this);
+               this.loader = new FluidbookLoader(this);
+               this.search = new FluidbookSearch(this);
+               this.pad = new FluidbookPad(this);
+               this.waiters = [];
+               if (Modernizr.ftouch && this.support.transitions2d && this.datas.mobileTransitions != 'none') {
+                       this.touch = new FluidbookTouch(this);
+               }
+               this.background = new FluidbookBackground(this);
+               this.viewport = new FluidbookViewport(this.support)
+               this.l10n = new FluidbookL10N(this, $_GET['lang']);
+               this.video = new FluidbookVideo(this);
+               this.bookmarks = new FluidbookBookmarks(this);
+               this.index = new FluidbookIndex(this);
+               this.tooltip = new FluidbookTooltip(this);
+               if (this.datas.form == 'bulle') {
+                       this.form = new FluidbookBulleForm(this);
+               } else {
+                       this.form == false;
+               }
+               this.refw = 0;
+               this.refh = 0;
+               this.zoom = 1;
+               this.searchHintXHR = null;
+               this.searchString = '';
+               this.termsToHighlight = '';
+               this.imagesVersion = (this.datas.mobileVersion == 'html5-images' || !this.support.SVG);
+               this.vectorTexts = !this.imagesVersion;
+               this.displayOnePage = false;
+               this.indexHTML = '';
+               this.transitionning = false;
+               this.gal = null;
+               this.isReady = false;
+               this.transitionAxis = 'x';
+               if (this.support.isMobile) {
+                       $("body").addClass('mobile');
+               }
+               else {
+                       $("body").addClass('desktop');
+               }
+
+               if (this.pad.enabled) {
+                       $("body").addClass('pad');
+               }
+               $('html').addClass(this.datas.mobileLVersion);
+               this.currentPage = -1;
+               this.resize = new FluidbookResize(this);
+               this.coquillette = new FluidbookCoquillette(this);
+               this.stats = new FluidbookStats(this);
+               this.stats.track(10);
+               if (!this.support.isMobile) {
+                       this.desktop = new FluidbookDesktop(this);
+               }
+
+               this.initLoading();
+       },
+       initLoading: function() {
+               this.displayLoader();
+       },
+       reloadErrorImages: function() {
+               $('img').each(function() {
+
+               });
+       },
+       hideSplash: function() {
+               if ($("#splash").length == 0) {
+                       return;
+               }
+               try {
+                       navigator.splashscreen.hide();
+               } catch (err) {
+               }
+
+               this.loader.canPreload();
+               var $this = this;
+               setTimeout(function() {
+                       $this._hideSplash();
+               }, 3000);
+       },
+       _hideSplash: function() {
+               this.ready();
+               $("#main").css('visibility', 'visible');
+               this.hideLoader(0, true);
+               if (this.support.transitions2d) {
+                       $("#splash").css('opacity', 0).one(this.support.getTransitionEndEvent(true), function() {
+                               $(this).remove();
+                       });
+               } else {
+                       $("#splash").fadeOut(500, function() {
+                               $(this.remove());
+                       })
+               }
+
+       },
+       ready: function() {
+               if (this.isReady) {
+                       return;
+               }
+               this.isReady = true;
+               $("#main").css('display', 'block');
+               this.nav = new FluidbookNav(this);
+               this.help = new FluidbookHelp(this);
+               this.help.displayAtStartup();
+               resize();
+               $(this).trigger('fluidbookready');
+       },
+       loadPlugins: function() {
+               $.each(this.datas.plugins, function(k, plugin) {
+                       try {
+                               var functionName = plugin.replace(/\./g, '_');
+                               eval(functionName + '();');
+                       } catch (err) {
+                       }
+               });
+               $.each(this.datas.htmlmultimedia, function(k, code) {
+                       try {
+                               eval(code);
+                       } catch (err) {
+                       }
+               });
+       },
+       resetZoom: function() {
+               var $this = this;
+               if (this.support.iOS) {
+               } else if (!this.support.isMobile) {
+                       this.desktop.updateDesktopScale(1);
+               }
+
+       },
+       setZoom: function(zoom) {
+               if (zoom) {
+                       $("#pages").addClass('zoom');
+               } else {
+                       $("#pages").removeClass('zoom');
+               }
+       },
+       initPage: function(pageNr, doublePage, position) {
+               if ($("#page_" + pageNr).length > 0) {
+                       return;
+               }
+               $(doublePage).find('.' + position).remove();
+               var page = '<div class="page ' + position + '" id="page_' + pageNr + '" data-page="' + pageNr + '"><div class="background" page="' + pageNr + '"></div><div class="clinks"></div><div class="texts" highlight=""></div><div class="shade"></div></div>';
+               $(doublePage).append(page);
+       },
+       hidePage: function(position) {
+               $("#pages ." + position).hide();
+       },
+       initLinks: function(pageNr) {
+               if (pageNr == undefined) {
+                       pageNr = this.currentPage;
+               }
+
+               var lClass = 'left';
+               if (this.displayOnePage && pageNr % 2 == 1) {
+                       lClass = 'right';
+               }
+
+               if (pageNr % 2 == 1) {
+                       pageNr--;
+               }
+
+               $("#links").removeClass('left').removeClass('right').addClass(lClass).html(this.datas.links[pageNr]).show();
+               if (this.datas.bookmark) {
+                       $("#links").append(this.bookmarks.getBookmarkForPage(pageNr));
+               }
+               $("#links").prepend('<a href="#" class="nonlinkarea"></a>');
+               var $this = this;
+               if (this.datas.linkBlinkTime > 0) {
+                       ///this.animateLinks();
+               }
+               setTimeout(function() {
+                       $this.initVideos();
+               }, 1000);
+       },
+       animateLinks: function() {
+               var links = $(".link a.displayArea");
+               var bookmarks = $("#links .bookmark:not([data-enabled])");
+               if (Modernizr.csstransitions) {
+                       $(links).addClass('animating');
+                       $(bookmarks).css('opacity', 1).addClass('animating');
+                       setTimeout(function() {
+                               $(links).css('opacity', 0);
+                               $(bookmarks).css('opacity', 0);
+                               setTimeout(function() {
+                                       $(links).removeClass('animating').css('opacity', 1);
+                                       $(bookmarks).removeClass('animating').css('opacity', "");
+                               }, 1100);
+                       }, 50);
+               } else {
+                       $(links).addClass('animating').fadeOut(1000, function() {
+                               $(links).removeClass('animating').show();
+                       }).mouseover(function() {
+                               $(links).stop().removeClass('animating').css('opacity', 1).show();
+                               return true;
+                       });
+               }
+       },
+       initVideos: function() {
+               var $this = this;
+               $(".videoContainer").each(function() {
+                       $this.video.initVideo(this);
+               });
+       },
+       getNextOffset: function() {
+               var offset = 2;
+               if (this.displayOnePage) {
+                       offset = 1;
+               }
+               this.transitionAxis = 'x';
+               return offset;
+       },
+       goNextPage: function() {
+               if (this.transitionning) {
+                       return;
+               }
+               this.transitionAxis = 'x';
+               this.setCurrentPage(this.normalizePage(this.currentPage) + this.getNextOffset());
+       },
+       goFirstPage: function() {
+               if (this.transitionning) {
+                       return;
+               }
+               this.transitionAxis = 'x';
+               this.setCurrentPage(1);
+       },
+       goPreviousPage: function() {
+               if (this.transitionning) {
+                       return;
+               }
+               this.transitionAxis = 'x';
+               this.setCurrentPage(this.normalizePage(this.currentPage) - this.getNextOffset());
+       },
+       goLastPage: function() {
+               if (this.transitionning) {
+                       return;
+               }
+               this.transitionAxis = 'x';
+               this.setCurrentPage(this.datas.pages);
+       },
+       goNextChapter: function() {
+               if (this.transitionning) {
+                       return;
+               }
+               var next = this.bookmarks.getNextGroupCover(this.currentPage);
+               if (next === false) {
+                       return;
+               }
+               this.transitionAxis = 'x';
+               this.setCurrentPage(this.normalizePage(next));
+       },
+       goPreviousChapter: function() {
+               if (this.transitionning) {
+                       return;
+               }
+               var prev = this.bookmarks.getPreviousGroupCover(this.currentPage);
+               if (prev === false) {
+                       return;
+               }
+               this.transitionAxis = 'x';
+               this.setCurrentPage(this.normalizePage(prev));
+       },
+       goNextChapterPage: function() {
+               if (this.transitionning) {
+                       return;
+               }
+
+               var next = this.bookmarks.getNextPageInGroupOfPage(this.currentPage);
+               if (next === false) {
+                       return;
+               }
+               this.transitionAxis = 'y';
+               this.setCurrentPage(this.normalizePage(next));
+       },
+       goPreviousChapterPage: function() {
+               if (this.transitionning) {
+                       return;
+               }
+
+               var prev = this.bookmarks.getPreviousPageInGroupOfPage(this.currentPage);
+               if (prev === false) {
+                       return;
+               }
+               this.transitionAxis = 'y';
+               this.setCurrentPage(this.normalizePage(prev));
+       },
+       normalizePage: function(page) {
+               page = Math.max(1, Math.min(page, this.datas.pages));
+               if (!this.displayOnePage && page % 2 == 1) {
+                       page--;
+               }
+               return page;
+       },
+       setCurrentPage: function(page) {
+               window.location.hash = "#/page/" + this.normalizePage(page);
+       },
+       changeAddress: function() {
+               var $this = this;
+               var page;
+               var args = window.location.hash.split('/');
+               if (args.length <= 1 || args[1] == '' || args[1] == undefined) {
+                       return this.setCurrentPage('1');
+               } else if (args[1] == 'page') {
+                       page = parseInt(args[2]);
+                       if (isNaN(page) || page == undefined) {
+                               return this.setCurrentPage('1');
+                       }
+                       if (this.pad.enabled) {
+                               this.transitionAxis = this.pad.getTransitionAxis(this.currentPage, page);
+                       } else {
+                               this.transitionAxis = 'x';
+                       }
+
+                       $($this).trigger('changePage', [page]);
+                       this.closeView(function() {
+                               $this.pageTransition(page);
+                               $this.resetZoom();
+                               $this.stats.track(0, page);
+                               $this.hideSplash();
+                       }, true);
+               }
+               else {
+                       this.openView(args[1], args[2], args[3], function() {
+                               $this.hideSplash();
+                       });
+                       this.resetZoom();
+               }
+
+               return;
+       },
+       pageTransition: function(pageNr) {
+               this.tooltip.hideTooltip();
+               if (pageNr == undefined) {
+                       pageNr = this.currentPage;
+                       if (pageNr == -1) {
+                               pageNr = 1;
+                       }
+               }
+               pageNr = this.normalizePage(pageNr);
+               if (pageNr == this.normalizePage(this.currentPage) || this.currentPage == -1 || !this.support.transitions2d || this.datas.mobileTransitions == 'none') {
+                       return this.pageTransition1D(pageNr);
+               }
+
+               if (this.displayOnePage) {
+                       return this.pageTransition2DPortrait(pageNr);
+               }
+
+               if (!this.support.transitions3d || this.datas.mobileTransitions == 'slide') {
+                       return this.pageTransition2D(pageNr);
+               }
+
+               return this.pageTransition3D(pageNr);
+       },
+       pageTransition3D: function(pageNr) {
+
+               var $this = this;
+               if ($("#pages").hasClass('_3dtransition')) {
+                       return;
+               }
+               this.transitionning = true;
+               var $this = this;
+               var turning = this.getTurningPages(pageNr);
+               $("#pages").prepend('<div id="nextDoublePage" class="_3d doublePage ' + turning.nextFromClass + 'start"></div>');
+               var doublePage = $("#nextDoublePage");
+               var currentDoublePage = $("#currentDoublePage");
+               this.displayLoader();
+               this.loader.preloadPagesBeforeTransition([turning.currentLeft, turning.currentRight], function() {
+                       $("#pages").addClass('_3dtransition');
+                       $this.loader.setContentsInDoublePage(currentDoublePage, turning.flat, true, function() {
+                               $this.loader.setContentsInDoublePage(doublePage, turning.flip, true, function() {
+                                       $this.beforeTransition(pageNr, 3);
+                                       $(doublePage).addClass(turning.nextFromClass + 'end').one($this.support.getTransitionEndEvent(), function() {
+                                               if ($this.transitionning == false) {
+                                                       return;
+                                               }
+                                               if ($("#nextDoublePage").length == 0) {
+                                                       $("#pages").removeClass('_3dtransition');
+                                                       $this.transitionning = false;
+                                                       return;
+                                               }
+
+                                               // Set the flat contents with the new page
+                                               $this.loader.setContentsInDoublePage(doublePage, turning.end, false, function() {
+                                                       $(doublePage).removeClass('_3d').removeClass(turning.nextFromClass + 'start').removeClass(turning.nextFromClass + 'end');
+                                                       // Remove former part
+                                                       $("#currentDoublePage").remove();
+                                                       $(doublePage).attr('id', 'currentDoublePage');
+                                                       $("#pages").removeClass('_3dtransition');
+                                                       $this.afterTransition(pageNr);
+                                               });
+                                       });
+                               });
+                       });
+               });
+       },
+       getTurningPages: function(newPage) {
+               var res = {};
+               res.dir = 1;
+               if (newPage < this.currentPage) {
+                       res.dir = -1;
+               }
+
+               if (this.l10n.dir == 'ltr') {
+                       res.currentLeft = this.currentPage - this.currentPage % 2;
+                       res.currentRight = res.currentLeft + 1;
+                       if (res.dir == 1) {
+                               res.currentToClass = 'prev';
+                               res.nextFromClass = 'next';
+                               res.flat = [res.currentLeft, newPage + 1];
+                               res.flip = [newPage, res.currentRight];
+                       } else {
+                               res.currentToClass = 'next';
+                               res.nextFromClass = 'prev';
+                               res.flat = [newPage, res.currentRight];
+                               res.flip = [res.currentLeft, newPage + 1];
+                       }
+                       res['end'] = [newPage, newPage + 1];
+               } else {
+                       res.currentRight = this.currentPage - this.currentPage % 2;
+                       res.currentLeft = res.currentRight + 1;
+                       if (res.dir == 1) {
+                               res.currentToClass = 'next';
+                               res.nextFromClass = 'prev';
+                               res.flat = [newPage + 1, res.currentRight];
+                               res.flip = [res.currentLeft, newPage];
+                       } else {
+                               res.currentToClass = 'prev';
+                               res.nextFromClass = 'next';
+                               res.flat = [res.currentLeft, newPage];
+                               res.flip = [newPage + 1, res.currentRight];
+                       }
+
+                       if (this.displayOnePage) {
+                               res.end = [newPage, newPage + 1];
+                       } else {
+                               res.end = [newPage + 1, newPage];
+                       }
+               }
+               res.loading = [res.currentLeft, res.currentRight];
+               return json_parse(JSON.stringify(res));
+       },
+       reloadCurrentPage: function() {
+               this.pageTransition(this.currentPage);
+       },
+       readingPage: function(side) {
+               if (!this.displayOnePage) {
+                       var page = this.currentPage;
+                       var change = false;
+                       if (side == 'left' && page % 2 == 1) {
+                               page--;
+                               change = true;
+                       } else if (side == 'right' && page % 2 == 0) {
+                               page++;
+                               change = true;
+                       }
+                       if (change) {
+                               window.location.hash = "/page/" + page;
+                       }
+               }
+       },
+       hideUnnecessaryButtons: function(page) {
+               var speed = 500;
+               if (page == undefined) {
+                       page = this.currentPage;
+                       speed = 0;
+               }
+
+               if (Modernizr.csstransitions) {
+                       if (page <= 1) {
+                               $("#previous").addClass('hidden');
+                       } else {
+                               $("#previous").removeClass('hidden');
+                       }
+
+                       if (page >= this.datas.pages) {
+                               $("#next").addClass('hidden');
+                       } else {
+                               $("#next").removeClass('hidden');
+                       }
+               } else {
+                       $("#previous,#next").removeClass('hidden');
+                       if (page <= 1) {
+                               $("#previous:visible").fadeOut(speed);
+                       } else {
+                               $("#previous:hidden").fadeIn(speed);
+                       }
+
+                       if (page >= this.datas.pages) {
+                               $("#next:visible").fadeOut(speed);
+                       } else {
+                               $("#next:hidden").fadeIn(speed);
+                       }
+               }
+       },
+       updateShadows: function(page, animationDuration) {
+               if (animationDuration == undefined) {
+                       animationDuration = 0;
+               }
+               animationDuration *= 1000;
+               var delay, duration;
+               if (animationDuration == 0) {
+                       delay = 0;
+                       duration = 0;
+               } else {
+                       delay = animationDuration * 0.7;
+                       duration = animationDuration * 0.3;
+               }
+
+               var left = true, right = true;
+               if (this.displayOnePage) {
+                       right = false;
+               } else {
+                       if ((page <= 1 && this.l10n.dir == 'ltr') || (page >= this.datas.pages && this.l10n.dir == 'rtl')) {
+                               left = false;
+                       } else if ((page <= 1 && this.l10n.dir == 'rtl') || (page >= this.datas.pages && this.l10n.dir == 'ltr')) {
+                               right = false;
+                       }
+               }
+
+
+               if (left) {
+                       $("#shadow>.left:hidden").delay(delay).fadeIn(duration);
+               } else {
+                       $("#shadow>.left:visible").fadeOut(duration);
+               }
+
+               if (right) {
+                       $("#shadow>.right:hidden").delay(delay).fadeIn(duration);
+               } else {
+                       $("#shadow>.right:visible").fadeOut(duration);
+               }
+       },
+       showAllButtons: function() {
+               $("#next,#previous").addClass('help').show();
+       },
+       pageTransition2D: function(pageNr) {
+               this.transitionning = true;
+               var $this = this;
+               var turning = this.getTurningPages(pageNr);
+               $("#pages").append('<div id="nextDoublePage" class="doublePage _2d axis_' + this.transitionAxis + ' ' + turning.nextFromClass + '"></div>');
+               var doublePage = $("#nextDoublePage");
+               this.displayLoader();
+               this.loader.preloadPagesBeforeTransition(turning.end, function() {
+                       $this.loader.setContentsInDoublePage(doublePage, turning.end, true, function() {
+                               $this.beforeTransition(pageNr, 2);
+                               $("#currentDoublePage").addClass('_2d').addClass('axis_' + $this.transitionAxis).addClass(turning.currentToClass);
+                               $(doublePage).removeClass(turning.nextFromClass).one($this.support.getTransitionEndEvent(), function(event) {
+                                       if ($this.transitionning == false) {
+                                               return;
+                                       }
+                                       $("#currentDoublePage").remove();
+                                       $("#nextDoublePage").attr('id', 'currentDoublePage');
+                                       $this.afterTransition(pageNr);
+                               });
+                       });
+               });
+       },
+       pageTransition2DPortrait: function(pageNr) {
+               this.transitionning = true;
+               var $this = this;
+               var turning = this.getTurningPages(pageNr);
+               $("#pages").append('<div id="nextDoublePage" class="doublePage _2d axis_' + this.transitionAxis + ' ' + turning.nextFromClass + '"></div>');
+               var doublePage = $("#nextDoublePage");
+               if (this.displayOnePage) {
+                       this.hidePage('right');
+               }
+
+               this.displayLoader();
+               this.loader.preloadPagesBeforeTransition(turning.end, function() {
+                       $this.loader.setContentsInDoublePage(doublePage, turning.end, true, function() {
+                               $this.beforeTransition(pageNr, 2);
+                               $("#currentDoublePage").addClass('axis_' + $this.transitionAxis).addClass('_2d').addClass(turning.currentToClass);
+                               $(doublePage).removeClass(turning.nextFromClass).one($this.support.getTransitionEndEvent(), function() {
+                                       fb('received event');
+                                       if ($this.transitionning == false) {
+                                               return;
+                                       }
+                                       $("#currentDoublePage").remove();
+                                       $("#nextDoublePage").attr('id', 'currentDoublePage');
+                                       $this.afterTransition(pageNr);
+                               });
+                       });
+               });
+       },
+       pageTransition1D: function(pageNr) {
+               var page = pageNr;
+               var doublePage = $("#currentDoublePage");
+               var $this = this;
+               if (this.displayOnePage) {
+                       this.hidePage('right');
+               }
+               var turning = this.getTurningPages(pageNr);
+               this.beforeTransition(pageNr);
+               this.loader.setContentsInDoublePage(doublePage, turning.end, true, function() {
+                       $this.afterTransition(page);
+               });
+       },
+       beforeTransition: function(page, d) {
+               if (d == undefined) {
+                       d = 1;
+               }
+               $(".axis_y").removeClass('axis_y');
+               $(".axis_x").removeClass('axis_x');
+               $("#links").hide();
+               this.hideLoader();
+               this.hideUnnecessaryButtons(page);
+               var animationDuration = d <= 1 ? 0 : parseFloat(this.datas.mobileTransitionDuration);
+               this.updateShadows(page, animationDuration);
+               fb('beforeTransition ' + page);
+       },
+       afterTransition: function(page) {
+               if (this.transitionning === false) {
+                       //return;
+               }
+               fb('afterTransition ' + page);
+               var $this = this;
+               this.currentPage = page;
+               this.setPageNumbers();
+               setTimeout(function() {
+                       $this.loader.preloadAround(page);
+               }, 1000);
+               this.initLinks();
+               this.hideLoader();
+               this.resetWaiters();
+               // Clean messy stuffs
+               $("#pages").removeClass('_3dtransition');
+               if ($("#nextDoublePage").length > 0) {
+                       $("#currentDoublePage").remove();
+                       $("#nextDoublePage").attr('id', 'currentDoublePage');
+               }
+               if ($("#currentDoublePage").length > 1) {
+                       $("#currentDoublePage:gt(0)").remove();
+               }
+               this.transitionning = false;
+               if (this.pad.enabled) {
+                       if (this.currentPage == this.datas.pages) {
+                               $("#down").css('opacity', 0);
+                       } else {
+                               $("#down").css('opacity', 1);
+                               if (!this.bookmarks.hasNextPageInGroup(this.currentPage)) {
+                                       $("#down").addClass('right');
+                               } else {
+                                       $("#down").removeClass('right');
+                               }
+                       }
+               } else {
+                       $("#down").css('opacity', 0);
+               }
+
+       },
+       setPageNumbers: function() {
+               $("#pagesnumbers .left").html(this.getPageNumberOfSide('left'));
+               $("#pagesnumbers .right").html(this.getPageNumberOfSide('right'));
+       },
+       getPageNumberOfSide: function(side) {
+               var p = $("#currentDoublePage").find('.' + side);
+               if (p.length == 0) {
+                       return '';
+               }
+               return this.physicalToVirtual($(p).data('page'));
+       },
+       clickLogo: function() {
+               if (this.datas.url_link == '' || this.datas.url_link == 'http://') {
+                       return;
+               }
+               this.wopen(this.datas.url_link, '_blank');
+       },
+       viewMode: function() {
+               return $("#view .mview").length > 0;
+       },
+       openView: function(view, param1, param2, callback) {
+               var $this = this;
+               this.displayLoader();
+               this.resetWaiters();
+               setTimeout(function() {
+                       $this._openView(view, param1, param2, callback);
+               }, 20);
+       },
+       addWaiter: function(reset) {
+               if (reset == undefined) {
+                       reset = false;
+               }
+               if (reset) {
+                       this.resetWaiters();
+               }
+               var rand = Math.round(Math.random() * 100000);
+               this.waiters.push(rand);
+               return rand;
+       },
+       waiterActive: function(id) {
+               return this.waiters.indexOf(id) > -1;
+       },
+       resetWaiters: function() {
+               this.waiters = [];
+       },
+       _openView: function(view, param1, param2, callback) {
+               var $this = this;
+               var preload = {index: 'thumbnails',
+                       search: 'thumbnails',
+                       bookmark: 'thumbnails',
+                       video: 'extras'};
+               if (!OFFLINEAPP && this.gal != null && preload[view] != undefined) {
+                       var w = this.addWaiter(true);
+                       this.gal.downloadAndCall(preload[view], function() {
+                               if ($this.waiterActive(w)) {
+                                       $this.__openView(view, param1, param2, callback);
+                               }
+                       });
+               } else {
+                       this.__openView(view, param1, param2, callback);
+               }
+       },
+       __openView: function(view, param1, param2, callback) {
+               var $this = this;
+               var camelView = view.charAt(0).toUpperCase() + view.substr(1);
+               var cb = function() {
+                       $this.openingView(callback);
+               };
+               if (view == 'index') {
+                       this.openIndex(this.l10n.__('overview'), undefined, true, cb);
+               } else if (view == 'search') {
+                       this.searchString = param1;
+                       var group = param2;
+                       $("#q").val(param1);
+                       this.search.find(param1, function(r) {
+                               $this.displayResults(r, group, cb);
+                       });
+                       if (group == undefined) {
+                               this.stats.track(1, 0, param1);
+                       }
+               } else if (view == 'video') {
+                       this.openVideo(param1, cb);
+               } else if (view == 'webvideo') {
+                       this.openWebVideo(param1, param2, cb);
+               } else if (view == 'multimedia') {
+                       this.openMultimedia(param1, cb);
+               } else if (view == 'chapters') {
+                       this.openChapters(cb);
+               } else if (view == 'archives') {
+                       this.openArchives(this.l10n.__($("#nav #archives").attr('help')), cb);
+               } else {
+                       this['open' + camelView](param1, param2, cb);
+               }
+       },
+       openingView: function(callback) {
+               var $this = this;
+               this.resize.resizeView();
+               this.tooltip.hideTooltip();
+               var mview = $('#view .mview:last');
+               if (this.support.transitions2d) {
+                       var vertFrom = {
+                               translateY: $(window).height() + 'px'
+                       };
+                       var vertTo = {
+                               translateY: '0px'
+                       };
+                       var horiFrom = {
+                               translateX: $(window).width() + 'px'
+                       };
+                       var horiTo = {
+                               translateX: '0px'
+                       };
+                       var from = vertFrom;
+                       var to = vertTo;
+                       if ($(mview).hasClass('hori')) {
+                               from = horiFrom;
+                               to = horiTo;
+                       }
+
+                       $(mview).show().removeClass('animate').transform(from);
+                       setTimeout(function() {
+                               $(mview).one($this.support.getTransitionEndEvent(), function() {
+                                       $("#main").hide();
+                                       $('body').addClass('view');
+                                       $(mview).removeClass('animate');
+                                       callback();
+                                       $this.hideLoader();
+                                       resize();
+                               }).addClass('animate').transform(to);
+                       }, 50);
+               } else {
+                       $("#main").hide();
+                       $('body').addClass('view');
+                       $(mview).show();
+                       callback();
+                       this.hideLoader();
+                       resize();
+               }
+       },
+       displayResults: function(data, group, callback) {
+               var $this = this;
+               var results = data.results;
+               var hideNoResults = !this.datas.searchShowNoResultsPages;
+               if (data.total <= 0) {
+                       alert(this.l10n.__('no result found'));
+                       window.location = "#/page/" + this.currentPage;
+                       return;
+               }
+
+               this.openIndex(this.l10n.__('search results for') + ' &laquo; ' + this.searchString + " &raquo;", group, false, function() {
+                       var hits = [];
+                       for (var i = 0; i <= $this.datas.pages; i++) {
+                               hits[i] = 0;
+                       }
+
+                       $.each(results, function(k, v) {
+                               hits[k] += v;
+                       });
+                       var e = encodeURIComponent($this.searchString);
+                       $(".doubleThumb").each(function() {
+                               var pages = $(this).data('pages').toString().split(',');
+                               var hitsp = 0;
+                               var pagesWithHits = [];
+                               for (var i in pages) {
+                                       var n = parseInt(pages[i]);
+                                       if (hits[n] > 0) {
+                                               hitsp += hits[n];
+                                               pagesWithHits.push(pages[i]);
+                                       }
+                               }
+
+                               if ($(this))
+                                       if ($(this).find('.hits').length > 0) {
+                                               return;
+                                       }
+
+                               if (hitsp == 0) {
+                                       if (hideNoResults) {
+                                               $(this).remove();
+                                               return;
+                                       }
+                                       $(this).append('<div class="overlay"></div>');
+                                       $(this).append('<div class="hits no">' + $this.l10n.__('no result found') + '</div>');
+                               } else {
+                                       $(this).append('<div class="hits yes">' + hitsp + ' ' + $this.l10n.__('hit(s)') + '</div>');
+                                       if ($this.pad.enabled) {
+                                               if (pagesWithHits.length == 1) {
+                                                       $(this).find('a').attr('href', '#/page/' + pagesWithHits[0]);
+                                               } else {
+                                                       $(this).find('a').attr('href', '#/search/' + e + '/' + $(this).attr('page'));
+                                               }
+                                       } else {
+                                               $(this).find('a').attr('href', '#/page/' + $(this).attr('page'));
+                                       }
+                               }
+                       });
+                       $this.termsToHighlight = data.terms;
+                       if (callback != undefined) {
+                               callback();
+                       }
+               });
+       },
+       openMultimedia: function(multimedia, callback) {
+               var a = $('a[href="#/multimedia/' + multimedia + '"]');
+               var markup = decodeURIComponent($(a).attr('data-multimedia'));
+               var view = '<div class="caption"><a href="#" class="back">' + this.l10n.__('back') + '</a></div>';
+               view += '<div class="content">';
+               view += markup;
+               view += '</div>';
+               $("#view").append('<div class="mview">' + view + '</div>');
+               if (callback != undefined) {
+                       callback();
+               }
+       },
+       openVideo: function(video, callback) {
+               var a = $('a[href="#/video/' + video + '"]');
+               var markup = decodeURIComponent($(a).attr('data-video'));
+               var view = '<div class="caption"><a href="#" class="back">' + this.l10n.__('back') + '</a></div>';
+               view += '<div class="content">';
+               view += markup;
+               view += '</div>';
+               $("#view").append('<div class="mview">' + view + '</div>');
+               this.stats.track(11);
+               this.initVideos();
+               var $this = this;
+               var times = [250, 500, 750, 1000, 1250];
+               $.each(times, function(k, v) {
+                       setTimeout(function() {
+                               $this.resize.resizePopupVideos();
+                       }, v);
+               });
+               if (callback != undefined) {
+                       callback();
+               }
+       },
+       openWebVideo: function(service, video, callback) {
+
+               var view = '<div class="caption"><a href="#" class="back">' + this.l10n.__('back') + '</a></div>';
+               view += '<div class="content">';
+               if (service == 'youtube') {
+                       view += '<iframe class="webvideo" type="text/html" width="100%" height="407" src="http://www.youtube.com/embed/' + video + '?autoplay=1&modestbranding=1&rel=0&html5=1" frameborder="0"></iframe>';
+               } else if (service == 'dailymotion') {
+                       view += '<iframe class="webvideo" type="text/html" width="100%" height="407" src="http://www.dailymotion.com/embed/video/' + video + '?autoplay=1&logo=0&related=0&html5=1" width="100%" frameborder="0"></iframe>'
+               }
+               view += '</div>';
+               $("#view").append('<div class="mview">' + view + '</div>');
+               $("#view .mview:last iframe").each(function() {
+                       $(this).attr('height', ($(this).width() * 9) / 16);
+               });
+               this.stats.track(11);
+               if (callback != undefined) {
+                       callback();
+               }
+       },
+       openLocales: function(p1, p2, callback) {
+               var view = '<div class="caption"><a href="#" class="back">' + this.l10n.__('back') + '</a><h2>Select language</h2></div>';
+               view += '<div class="content">';
+               view += '<ul class="chapters localesList">';
+               var $this = this;
+               $.each(this.l10n.multilang, function(k, v) {
+                       var url = v.url;
+                       if (url.substr(0, 3) == '../' && !$this.datas.standalone) {
+                               url = '../' + url;
+                       }
+                       /*'datas' => array(__('Langue') => 'lang',
+                        __('Langue') . ' (' . __('Pays') . ')' => 'lang_country',
+                        __('Pays') . ' (' . __('Langue') . ')' => 'country_lang'));*/
+
+                       var name = '';
+                       if ($this.datas.multilangDisplay == 'lang') {
+                               name = v.langName;
+                       } else if ($this.datas.multilangDisplay == 'lang_country') {
+                               name = v.langName + ' (' + v.countryName + ')';
+                       } else if ($this.datas.multilangDisplay == 'country_lang') {
+                               name = v.countryName + ' (' + v.langName + ')';
+                       }
+
+                       var c = '';
+                       if ($this.datas.phonegap) {
+                               view += '<li data-level="0"><a href="#" data-id="' + url + '" data-locale="' + v.lang + '" class="level0 appswitchlocale"><img src="images/flags/' + v.flag + '.png" alt="' + name + '" />' + name + '</a></li>';
+                       } else {
+                               view += '<li data-level="0"><a href="' + url + '" class="level0"><img src="images/flags/' + v.flag + '.png" alt="' + name + '" />' + name + '</a></li>';
+                       }
+               });
+               view += '</ul>';
+               view += '</div>';
+               $("#view").append('<div class="mview">' + view + '</div>');
+               if (callback != undefined) {
+                       callback();
+               }
+       },
+       openShare: function(p1, p2, callback) {
+               var view = '<div class="caption"><a href="#" class="back">' + this.l10n.__('back') + '</a><h2>' + this.l10n.__('share') + '</h2></div>';
+               view += '<div class="content">';
+               view += '<ul class="chapters shareList">';
+               var $this = this;
+               if (this.datas.friend) {
+                       view += '<li data-level="0"><a href="#" data-service="email" class="share level0"><img height="25" src="data/images/share-email.svg" /> E-mail</a></li>';
+               }
+               if (this.datas.facebook) {
+                       view += '<li data-level="0"><a href="#" data-service="facebook" class="share level0"><img height="25" src="data/images/share-facebook.svg" /> Facebook</a></li>';
+               }
+               if (this.datas.twitter) {
+                       view += '<li data-level="0"><a href="#" data-service="twitter" class="share level0"><img height="25" src="data/images/share-twitter.svg" /> Twitter</a></li>';
+               }
+               if (this.datas.googleplus) {
+                       view += '<li data-level="0"><a href="#" data-service="googleplus" class="share level0"><img height="25" src="data/images/share-googleplus.svg" /> Google+</a></li>';
+               }
+               if (this.datas.linkedin) {
+                       view += '<li data-level="0"><a href="#" data-service="linkedin" class="share level0"><img height="25" src="data/images/share-linkedin.svg" /> LinkedIn</a></li>';
+               }
+               if (this.datas.viadeo) {
+                       view += '<li data-level="0"><a href="#" data-service="viadeo" class="share level0"><img height="25" src="data/images/share-viadeo.svg" /> Viadeo</a></li>';
+               }
+               view += '</ul>';
+               view += '</div>';
+               $("#view").append('<div class="mview">' + view + '</div>');
+               if (callback != undefined) {
+                       callback();
+               }
+       },
+       openBookmark: function(p1, p2, callback) {
+               var view = this.bookmarks.getView();
+               if (view !== false) {
+                       $("#view").append('<div class="mview">' + view + '</div>');
+                       if (callback != undefined) {
+                               callback();
+                       }
+               } else {
+                       var message = this.l10n.__("you don't have any bookmarks");
+                       if (this.datas.phonegap) {
+                               navigator.notification.alert(message, function() {
+
+                               }, this.l10n.__('bookmarks'));
+                       } else {
+                               window.alert(message);
+                               window.history.back();
+                       }
+                       this.hideLoader();
+               }
+       },
+       openChapters: function(callback) {
+               if (this.chapters == undefined) {
+                       this.chapters = new FluidbookChapters(this, this.datas.chapters);
+               }
+
+               var view = '<div class="caption"><a href="#" class="back">' + this.l10n.__('back') + '</a><h2>' + this.l10n.__('chapters') + '</h2></div>';
+               view += '<div class="content">';
+               view += this.chapters.getView();
+               view += '</div>';
+               $("#view").append('<div class="mview">' + view + '</div>');
+               if (callback != undefined) {
+                       callback();
+               }
+       },
+       openIndex: function(title, group, closeAll, callback) {
+               var c = !closeAll ? ' one' : '';
+               var index = '<div class="caption"><a href="#" class="back' + c + '">' + this.l10n.__('back') + '</a><h2>' + title + '</h2></div>';
+               index += this.index.getView(group);
+               $("#view").append('<div class="mview">' + index + '</div>');
+               this.bookmarks.updateBookmarks();
+               if (callback != undefined) {
+                       callback();
+               }
+       },
+       openArchives: function(title, callback) {
+               var archives = '<div class="caption"><a href="#" class="back">' + this.l10n.__('back') + '</a><h2>' + title + '</h2></div>';
+               archives += '<div class="image" id="archivesview"><img src="data/images/' + this.datas.externalArchives + '" /><div class="links">' + this.datas.links.archives + '</div></div>';
+               $("#view").append('<div class="mview archives">' + archives + '</div>');
+               if (callback != undefined) {
+                       callback();
+               }
+       },
+       physicalToVirtual: function(page) {
+               return this.datas.numerotation[page - 1];
+       },
+       virtualToPhysical: function(page) {
+               return this.datas.numerotation.indexOf(page) + 1;
+       },
+       closeView: function(callback, all, animate) {
+               var $this = this;
+               if (all == undefined) {
+                       all = false;
+               }
+               if (animate == undefined) {
+                       animate = true;
+               }
+               if ($('.mview').scrollTop() > 0) {
+                       $('.mview').scrollTo(0, 500, function() {
+                               $this.closeView(callback, all, animate);
+                       });
+                       return;
+               }
+
+               all = all || ($("#view .mview").length <= 1);
+               if (!this.viewMode()) {
+                       callback();
+                       return;
+               }
+
+               var mview = $("#view .mview:last");
+               if (all) {
+                       $("#view .mview:not(:last)").remove();
+               }
+
+               var to = {
+                       translateY: $(window).height() + 'px'
+               };
+               if ($(mview).hasClass('hori')) {
+                       to = {translateX: $(window).width() + 'px'}
+               }
+
+               if (animate && this.support.transitions2d) {
+                       setTimeout(function() {
+                               $(mview).one($this.support.getTransitionEndEvent(), function() {
+                                       $(this).remove();
+                                       callback();
+                               }).addClass('animate').transform(to);
+                       }, 50);
+               } else {
+                       $(mview).remove()
+                       callback();
+               }
+               if (all) {
+                       $("#main").show();
+                       $('body').removeClass('view');
+               }
+               resize();
+       },
+       getSearchHints: function(q) {
+
+               var $this = this;
+               this.killLastSearchHint();
+               this.search.getHints(q, function(r) {
+                       $this.displaySearchHints(r);
+               });
+       },
+       displaySearchHints: function(hints) {
+
+               this.hideSearchHints();
+               if (hints.length == 0) {
+                       return;
+               }
+               $.each(hints, function(k, v) {
+                       $("#searchHints").append('<a class="hint" term="' + v[0] + '" href="#/search/' + v[0] + '">' + v[0] + ' <em>(' + v[1] + ')</em></a>');
+               });
+               var qoffset = $("#q").offset();
+               var top = qoffset.top + $("#q").outerHeight() + 5;
+               var left = qoffset.left;
+               if (this.l10n.dir == 'rtl') {
+                       left = -1 * ($(window).width() - left - $("#q").outerWidth());
+               }
+               $("#searchHints").css({top: top, left: left}).show();
+       },
+       killLastSearchHint: function() {
+               this.search.kill();
+       },
+       hideSearchHints: function() {
+               this.killLastSearchHint();
+               $("#searchHints").html('');
+               $("#searchHints").hide();
+       },
+       getLocationToShare: function() {
+               if (this.datas.phonegap) {
+                       return this.datas.offlineLink;
+               } else {
+                       var l = window.location.toString();
+                       var e = l.split("#");
+                       return e[0];
+               }
+       },
+       sendEmail: function() {
+               window.location = 'mailto:?subject=' + this.datas.title + '&body=' + this.datas.title + ' : ' + this.getLocationToShare();
+               this.stats.track(5);
+       },
+       sendTwitter: function() {
+               this.service.open('twitterShare', {
+                       url: this.getLocationToShare(),
+                       post: this.datas.twitter_description.replace('%title%', this.datas.title)
+               });
+               this.stats.track(13);
+       },
+       sendFacebook: function() {
+               this.service.open('facebookShare', {
+                       url: this.getLocationToShare()
+               });
+               this.stats.track(12);
+       },
+       sendGoogleplus: function() {
+               this.service.open('googleplusShare', {
+                       url: this.getLocationToShare()
+               });
+               this.stats.track(12);
+       },
+       sendLinkedin: function() {
+               this.service.open('linkedinShare', {
+                       url: this.getLocationToShare()
+               });
+               this.stats.track(12);
+       },
+       sendViadeo: function() {
+               this.service.open('viadeoShare', {
+                       url: this.getLocationToShare()
+               });
+               this.stats.track(12);
+       },
+       print: function() {
+               var $this = this;
+               var pdf;
+               var pdfName;
+               if (this.datas.pdfName.substr(0, 4) == 'http') {
+                       pdf = this.datas.pdfName;
+               } else {
+                       pdf = getBaseURL() + '/data/' + this.datas.pdfName;
+               }
+               var e = pdf.split('/');
+               pdfName = e.pop();
+               if (this.gal && !OFFLINEAPP) {
+                       this.displayLoader();
+                       this.gal.downloadAndCall('extras', function() {
+                               $this._openFile(pdf, $("#print"), 'pdf', pdfName);
+                       });
+               } else {
+                       this._openFile(pdf, $("#print"), 'pdf', pdfName);
+               }
+       },
+       _openFile: function(url, e, type, localname) {
+
+               var $this = this;
+               if (this.datas.phonegap != false) {
+                       if (type == undefined) {
+                               var e = url.split('.');
+                               type = e.pop();
+                       }
+
+                       if (url.indexOf('http') == 0) {
+                               return this._downloadFilePhonegap(url, localname, LocalFileSystem.TEMPORARY, this._openFilePhonegap, [url, e, type]);
+                       } else {
+                               if (this._openFilePhonegap(url, e, type)) {
+                                       return;
+                               }
+                       }
+
+               }
+               this.wopen(url, '_blank');
+       },
+       _downloadFilePhonegap: function(url, localname, fs, callback, callbackArgs) {
+               var $this = this;
+               if (fs == undefined) {
+                       fs = LocalFileSystem.PERSISTENT;
+               }
+
+               window.requestFileSystem(fs, 0, function(fileSystem) {
+                       fileSystem.root.getFile("dummy.html", {create: true, exclusive: false}, function(fileEntry) {
+                               var filePath = fileEntry.fullPath.replace("dummy.html", "") + localname;
+                               var fileTransfer = new FileTransfer();
+                               var uri = encodeURI(url);
+                               fileTransfer.download(
+                                               uri,
+                                               filePath,
+                                               function(entry) {
+                                                       if (callback != undefined) {
+                                                               if (callbackArgs == undefined) {
+                                                                       callbackArgs = [];
+                                                               }
+                                                               callbackArgs[0] = entry.toURL();
+                                                               callback.apply($this, callbackArgs);
+                                                       }
+                                               },
+                                               function(error) {
+
+                                               }
+                               );
+                       });
+               }, function() {
+
+               });
+       },
+       _openFilePhonegap: function(url, e, type) {
+               var $this = this;
+               var types_ios = {pdf: 'com.adobe.pdf'};
+               var types_android = {pdf: 'application/pdf'};
+               if (this.datas.phonegap == 'ios') {
+                       this.displayLoader();
+                       if (types_ios[type] != undefined) {
+                               var offset = $(e).offset();
+                               offset.left += ($(e).width() / 2);
+                               offset.top += ($(e).height());
+                               try {
+                                       ExternalFileUtil.openWith(url, types_ios[type], function() {
+                                               $this.hideLoader();
+                                       }, function() {
+                                               $this.wopen(url, "_blank", 'location=no');
+                                               $this.hideLoader();
+                                       }, offset);
+                               } catch (err) {
+                                       $this.wopen(url, "_blank", 'location=no');
+                                       $this.hideLoader();
+                               }
+                               return true;
+                       }
+               }
+               if (this.datas.phonegap == 'android') {
+                       if (types_android[type] != undefined) {
+                               this.displayLoader();
+                               setTimeout(function() {
+                                       webintent.startActivity({
+                                               action: webintent.ACTION_VIEW,
+                                               type: types_android[type],
+                                               url: url
+                                       }, function(args) {
+                                               $this.hideLoader(5);
+                                       }, function(args) {
+                                               $this.hideLoader(5);
+                                       });
+                               }, 100);
+                       }
+                       return true;
+               }
+               return false;
+       },
+       highlightSearchTerms: function(pageNr) {
+               return;
+       },
+       touchOffset: function(offset) {
+               offset *= $("#currentDoublePage").width();
+               $("#currentDoublePage").addClass('sliding');
+               $("#currentDoublePage").css({
+                       translateX: offset
+               });
+       },
+       displayLoader: function() {
+               if (this.support.isMobile) {
+                       this.coquillette.show();
+               } else {
+                       this.coquillette.show();
+                       $('body').addClass('loading');
+               }
+       },
+       hideLoader: function(delay, force) {
+               if (force == undefined) {
+                       force = false;
+               }
+               if (delay == undefined) {
+                       delay = 0;
+               }
+               var $this = this;
+               if (delay == 0) {
+                       return this._hideLoader(force);
+               }
+               setTimeout(function() {
+                       $this._hideLoader(force);
+               }, delay * 1000);
+       },
+       _hideLoader: function(force) {
+               if (force == undefined) {
+                       force = false;
+               }
+               if (!force && $('#splash').css('visibility') == 'visible') {
+                       return;
+               }
+               if (this.support.isMobile) {
+                       this.coquillette.hide();
+               } else {
+                       this.coquillette.hide();
+                       $('body').removeClass('loading');
+               }
+       },
+       pollZoom: function() {
+               var z = this.support.getZoomLevel();
+               //console.log(z);
+               $('html').attr('data-zoom', z);
+               if (z <= 1) {
+                       $("html").removeClass('pan');
+               } else {
+                       $("html").addClass('pan');
+               }
+       },
+       intentShare: function(subject, body) {
+               if (subject == undefined) {
+                       subject = this.datas.title;
+               }
+               if (body == undefined) {
+                       body = this.datas.title + ' : ' + this.getLocationToShare();
+               }
+
+               if (this.datas.phonegap == 'android') {
+                       var extras = {};
+                       extras[webintent.EXTRA_SUBJECT] = subject;
+                       extras[webintent.EXTRA_TEXT] = body;
+                       webintent.startActivity({
+                               action: webintent.ACTION_SEND,
+                               type: 'text/plain',
+                               extras: extras
+                       }, function(args) {
+                       }, function(args) {
+                       });
+               } else {
+                       window.location = 'mailto:?subject=' + subject + '&body=' + body;
+               }
+               this.stats.track(5);
+       },
+       wopen: function(url, target, options) {
+               if (target == undefined) {
+                       target = '_self';
+               }
+               if (options == undefined) {
+                       options = '';
+               }
+
+               var locationdefault = 'yes';
+               if (this.datas.phonegap) {
+                       locationdefault = 'yes';
+               }
+
+               if (options == '') {
+                       options = 'location=' + locationdefault;
+               } else if (options.indexOf('location=') == -1) {
+                       options += ',location=' + locationdefault;
+               }
+               window.open(url, target, options);
+       }
+}
+
index 1bff48ff169c2d2e6595ec3c8350c274196d4cd1..672d284c2a55a123fb2d01f6f1acb3bfa805a963 100644 (file)
@@ -1,16 +1,37 @@
+
 function FluidbookSearch() {
-       loadJSLibrary(
-                       'data/search.index.js'
-                       , function() {
-                       });
+       this.indexLoaded = false;
 }
 
 FluidbookSearch.prototype = {
-       getHints: function(q) {
+       getHints: function(q, callback) {
+               var $this = this;
+               this._loadLib(function() {
+                       $this._getHints(q, callback);
+               });
+       },
+       find: function(q, callback) {
+               var $this = this;
+               this._loadLib(function() {
+                       $this._find(q, callback);
+               });
+       },
+       _loadLib: function(callback) {
+               if (this.indexLoaded) {
+                       return callback();
+               }
+               var $this = this;
+               loadJSLibrary('data/search.index.js', function() {
+                       loadJSLibrary('data/search.texts.js', function() {
+                               $this.indexLoaded = true;
+                               callback();
+                       });
+               });
+       },
+       _getHints: function(q, callback) {
                var words = this.normalizeQuery(q);
                q = words.pop();
                var res = [];
-
                if (q.length < 3) {
                        return res;
                }
@@ -25,49 +46,51 @@ FluidbookSearch.prototype = {
                }
 
                res.sort(this.sortHints);
-               return res.slice(0, 12);
+               callback(res.slice(0, 12));
        },
-       find: function(q) {
+       _find: function(q, callback) {
                var words = this.normalizeQuery(q);
-
                var res = {};
                var terms = [];
                var total = 0;
-
                var q, v, k, kk, word, wordata, page, occurences;
                for (kk in words) {
                        q = words[kk];
-
                        for (k in INDEX) {
                                v = INDEX[k];
                                if (k.indexOf(q) != 0) {
                                        continue;
                                }
-                               for (word in v.w) {
-                                       wordata = v.w[word];
-                                       terms.push(word);
-                                       for (page in wordata.p) {
-
-                                               occurences = wordata.p[page];
-
-                                               page = parseInt(page);
-
-
-                                               if (res[page] == undefined) {
-                                                       res[page] = 0;
-                                               }
-                                               res[page] += occurences;
-                                               total += occurences;
+                               for (page in v.p) {
+                                       var occurences = v.p[page];
+                                       page = parseInt(page);
+                                       if (res[page] == undefined) {
+                                               res[page] = 0;
                                        }
+                                       res[page] += occurences;
+                                       total += occurences;
                                }
+                               /*for (word in v.w) {
+                                wordata = v.w[word];
+                                terms.push(word);
+                                for (page in wordata.p) {
+                                occurences = wordata.p[page];
+                                page = parseInt(page);
+                                if (res[page] == undefined) {
+                                res[page] = 0;
+                                }
+                                res[page] += occurences;
+                                total += occurences;
+                                }
+                                }*/
                        }
                }
 
-               return {
+               callback({
                        total: total,
                        results: res,
                        terms: terms.join(' ')
-               };
+               });
        },
        sortHints: function(a, b) {
                return b[1] - a[1];
@@ -106,7 +129,6 @@ FluidbookSearch.prototype = {
                source = source.replace(/[œ]/g, "oe");
                source = source.replace(/[Œ]/g, "OE");
                return source;
-
        }
 };