-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') + ' « ' + this.searchString + " »", 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') + ' « ' + this.searchString + " »", 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);
+ }
+}
+