| | |
| | |
| | |
| | |
| | |
| | |
| | 'use strict'; |
| | var FLIPBOOK = FLIPBOOK || {}; |
| |
|
| | FLIPBOOK.Book3 = function (el, main, options) { |
| | this.options = options; |
| | this.main = main; |
| |
|
| | this.singlePage = options.singlePageMode; |
| | this.pageWidth = options.pageWidth; |
| | this.pageHeight = options.pageHeight; |
| |
|
| | |
| | this.wrapper = el; |
| | this.wrapper.classList.add('flipbook-book3'); |
| | this.bookLayer = this.wrapper.parentNode; |
| |
|
| | this.flipEasing = 'easeOutQuad'; |
| | this.translateZ = ''; |
| |
|
| | |
| | this.iscroll = new FLIPBOOK.IScroll(this.bookLayer, { |
| | zoom: true, |
| | scrollX: true, |
| | scrollY: true, |
| | scrollbars: true, |
| | keepInCenterV: true, |
| | keepInCenterH: true, |
| | freeScroll: true, |
| | preventDefault: false, |
| | }); |
| |
|
| | |
| | main.on('disableIScroll', this.disableIscroll.bind(this)); |
| | main.on('enableIScroll', this.enableIscroll.bind(this)); |
| |
|
| | |
| | this.iscroll.on('zoomEnd', () => { |
| | if (isNaN(this.iscroll.scale)) { |
| | return this.zoomTo(options.zoomMin); |
| | } |
| |
|
| | options.main.onZoom(this.iscroll.scale / this.ratio); |
| | this.updateVisiblePages(); |
| |
|
| | const zoomed = options.main.zoom > 1; |
| |
|
| | if (this.zoomed !== zoomed) { |
| | const scrollOptions = this.iscroll.options; |
| | scrollOptions.eventPassthrough = zoomed ? '' : 'vertical'; |
| | scrollOptions.freeScroll = zoomed; |
| | this.iscroll.refresh(); |
| | this.zoomed = zoomed; |
| | } |
| | }); |
| |
|
| | |
| | this.wrapper.style.width = `${2 * this.pageWidth}px`; |
| | this.wrapper.style.height = `${this.pageHeight}px`; |
| |
|
| | this.centerContainer = document.createElement('div'); |
| | this.centerContainer.className = 'flipbook-center-container3'; |
| | this.centerContainer.style.width = `${2 * this.pageWidth}px`; |
| | this.centerContainer.style.height = `${this.pageHeight}px`; |
| | this.wrapper.appendChild(this.centerContainer); |
| |
|
| | |
| | const perspective = this.options.perspective || (this.options.viewMode === '3d' ? 3 * this.pageHeight : 200000); |
| | this.centerContainer.style.perspective = `${perspective}px`; |
| |
|
| | |
| | this.pagesArr = []; |
| | this.animating = false; |
| |
|
| | let numSheets = this.options.pages.length; |
| | if (!this.options.cover) numSheets += 1; |
| |
|
| | for (let i = 0; i < numSheets; i++) { |
| | const page = new FLIPBOOK.Page3(this, i); |
| | this.pagesArr.push(page); |
| | this.centerContainer.appendChild(page.wrapper); |
| | } |
| | }; |
| |
|
| | FLIPBOOK.Book3.prototype = Object.create(FLIPBOOK.Book.prototype); |
| |
|
| | FLIPBOOK.Book3.prototype.constructor = FLIPBOOK.Book3; |
| |
|
| | FLIPBOOK.Book3.prototype.enableIscroll = function () { |
| | if (this.iscrollDisabled) { |
| | this.iscroll.enable(); |
| | this.iscrollDisabled = false; |
| | } |
| | }; |
| |
|
| | FLIPBOOK.Book3.prototype.disableIscroll = function () { |
| | if (!this.iscrollDisabled) { |
| | this.iscroll.disable(); |
| | this.iscroll.initiated = false; |
| | this.iscrollDisabled = true; |
| | } |
| | }; |
| |
|
| | FLIPBOOK.Book3.prototype.enableMouseWheelZoom = function () { |
| | this.iscroll.options.eventPassthrough = 'vertical'; |
| | this.iscroll.refresh(); |
| | }; |
| |
|
| | FLIPBOOK.Book3.prototype.disableMouseWheelZoom = function () { |
| | this.iscroll.options.eventPassthrough = ''; |
| | this.iscroll.refresh(); |
| | }; |
| |
|
| | FLIPBOOK.Book3.prototype.enablePrev = function (val) { |
| | this.prevEnabled = val; |
| | }; |
| |
|
| | FLIPBOOK.Book3.prototype.enablePan = function () { |
| | this.iscroll.enable(); |
| | }; |
| |
|
| | FLIPBOOK.Book3.prototype.disablePan = function () { |
| | this.iscroll.disable(); |
| | }; |
| |
|
| | FLIPBOOK.Book3.prototype.setRightIndex = function (val) { |
| | this.rightIndex = val; |
| | }; |
| |
|
| | FLIPBOOK.Book3.prototype.enableNext = function (val) { |
| | this.nextEnabled = val; |
| | }; |
| |
|
| | FLIPBOOK.Book3.prototype.isZoomed = function () { |
| | return this.options.main.zoom > this.options.zoomMin && this.options.main.zoom > 1; |
| | }; |
| |
|
| | FLIPBOOK.Book3.prototype.getNumPages = function () {}; |
| |
|
| | FLIPBOOK.Book3.prototype.move = function (direction) { |
| | if (this.zoom <= 1) { |
| | return; |
| | } |
| |
|
| | var iscroll = this.iscroll; |
| | var offset2 = 0; |
| |
|
| | if (iscroll) { |
| | var posX = iscroll.x; |
| | var posY = iscroll.y; |
| | var offset = 20 * this.zoom; |
| | switch (direction) { |
| | case 'left': |
| | posX += offset; |
| | break; |
| | case 'right': |
| | posX -= offset; |
| | break; |
| | case 'up': |
| | posY += offset; |
| | break; |
| | case 'down': |
| | posY -= offset; |
| | break; |
| | } |
| |
|
| | if (posX > 0) { |
| | posX = offset2; |
| | } |
| | if (posX < iscroll.maxScrollX) { |
| | posX = iscroll.maxScrollX - offset2; |
| | } |
| | if (posY > 0) { |
| | posY = offset2; |
| | } |
| | if (posY < iscroll.maxScrollY) { |
| | posY = iscroll.maxScrollY - offset2; |
| | } |
| |
|
| | iscroll.scrollTo(posX, posY, 0); |
| | } |
| | }; |
| |
|
| | FLIPBOOK.Book3.prototype.zoomTo = function (zoom, time, x, y) { |
| | if (!this.enabled) { |
| | return; |
| | } |
| |
|
| | x = x || 0; |
| | y = y || 0; |
| | time = time || 0; |
| | this.zoom = zoom; |
| |
|
| | time = 0; |
| |
|
| | var iscroll = this.iscroll; |
| | if (iscroll) { |
| | iscroll.zoom(zoom * this.ratio, x, y, time); |
| | } |
| | }; |
| |
|
| | FLIPBOOK.Book3.prototype.setWrapperW = function (w) { |
| | if (this.wrapperW != w) { |
| | this.wrapper.style.width = w + 'px'; |
| | this.wrapperW = w; |
| | } |
| | }; |
| |
|
| | FLIPBOOK.Book3.prototype.updateBookPosition = function () { |
| | if (this.singlePage) { |
| | this.setWrapperW(this.pageWidth); |
| | if (this.iscroll) { |
| | this.iscroll.refresh(); |
| | } |
| | this.view = 1; |
| | this.focusRight(); |
| | return; |
| | } |
| |
|
| | if (this.view == 1) { |
| | this.setWrapperW(this.pageWidth); |
| | } else { |
| | this.setWrapperW(2 * this.pageWidth); |
| | } |
| | if (this.iscroll) { |
| | this.iscroll.refresh(); |
| | } |
| |
|
| | if (this.view == 2) { |
| | if (this.isCover()) { |
| | this.focusRight(); |
| | } else if (this.isBackCover()) { |
| | if (!this.options.cover) { |
| | this.focusBoth(); |
| | } else { |
| | this.focusLeft(); |
| | } |
| | } else { |
| | this.focusBoth(); |
| | } |
| | } else if (this.view == 1) { |
| | if (this.isCover()) { |
| | this.focusRight(); |
| | } else if (this.isBackCover()) { |
| | this.focusLeft(); |
| | } |
| | } |
| | }; |
| |
|
| | FLIPBOOK.Book3.prototype.focusLeft = function (time, delay) { |
| | var pos = this.view == 1 || this.singlePage ? 0 : this.pageWidth / 2; |
| |
|
| | this.setBookPosition(pos, time, delay); |
| | }; |
| |
|
| | FLIPBOOK.Book3.prototype.focusRight = function (time, delay, updatePageNumber) { |
| | var pos = this.view == 1 || this.singlePage ? -this.pageWidth : -this.pageWidth / 2; |
| |
|
| | this.setBookPosition(pos, time, delay, updatePageNumber); |
| | }; |
| |
|
| | FLIPBOOK.Book3.prototype.focusBoth = function (time, delay) { |
| | var pos = this.view == 1 ? -this.pageWidth / 2 : 0; |
| |
|
| | this.setBookPosition(pos, time, delay); |
| | }; |
| |
|
| | FLIPBOOK.Book3.prototype.setBookPosition = function (pos, time, delay, updatePageNumber) { |
| | if (this.centerContainerPosition == pos) { |
| | return; |
| | } |
| | var start = this.centerContainerPosition; |
| |
|
| | if (time) { |
| | var self = this; |
| | delay = delay || 0; |
| |
|
| | const animationParams = { |
| | from: start, |
| | to: pos, |
| | delay, |
| | duration: time, |
| | step(now) { |
| | self.centerContainer.style.transform = 'translateX(' + now + 'px) ' + self.translateZ; |
| | }, |
| | complete() { |
| | self.centerContainerPosition = pos; |
| | if (updatePageNumber) { |
| | self.updateFlipped(); |
| | self.options.main.turnPageComplete(); |
| | } |
| | }, |
| | }; |
| |
|
| | this.animate(animationParams); |
| | } else if (this.centerContainerPosition != pos) { |
| | this.centerContainerPosition = pos; |
| | this.centerContainer.style.transform = 'translateX(' + pos + 'px) ' + this.translateZ; |
| |
|
| | this.updateFlipped(); |
| | this.options.main.turnPageComplete(); |
| | } |
| | }; |
| |
|
| | FLIPBOOK.Book3.prototype.updateSinglePage = function (singlePage) { |
| | this.singlePage = singlePage; |
| | let ri = this.rightIndex; |
| | if (ri > 0) { |
| | if (this.singlePage) { |
| | ri--; |
| | } else if (ri % 2 == 1) { |
| | ri++; |
| | } |
| | this.setRightIndex(ri); |
| | } |
| | this.resetLoadedPages(); |
| | this.onResize(); |
| | this.updateVisiblePages(); |
| | }; |
| |
|
| | FLIPBOOK.Book3.prototype.resetLoadedPages = function () { |
| | this.pagesArr.forEach(function (page) { |
| | if (page.bgFront) page.bgFront.replaceChildren(); |
| | if (page.bgBack) page.bgBack.replaceChildren(); |
| | page.sizeFront = 0; |
| | page.sizeBack = 0; |
| |
|
| | if (page.html.front) page.html.front.replaceChildren(); |
| | if (page.html.back) page.html.back.replaceChildren(); |
| | if (page.htmlContent) { |
| | page.htmlContent.front = null; |
| | page.htmlContent.back = null; |
| | } |
| | if (page.htmlLoaded) { |
| | page.htmlLoaded.front = null; |
| | page.htmlLoaded.back = null; |
| | } |
| | }); |
| | }; |
| |
|
| | FLIPBOOK.Book3.prototype.updateVisiblePages = function (loadNextPrev) { |
| | if (typeof loadNextPrev == 'undefined') { |
| | loadNextPrev = true; |
| | } |
| | var self = this; |
| |
|
| | var index = this.rightIndex; |
| | if (!this.singlePage) { |
| | index /= 2; |
| | } |
| |
|
| | |
| | |
| | |
| |
|
| | let numPages = this.options.pages.length; |
| | let numSheets = this.singlePage ? numPages : numPages / 2; |
| | if (!this.options.cover) numSheets++; |
| | this.visibleSheets = []; |
| | for (let i = 0; i < numSheets; i++) { |
| | this.visibleSheets.push(this.pagesArr[i]); |
| | } |
| |
|
| | var right = this.visibleSheets[index]; |
| | var next = this.visibleSheets[index + 1]; |
| | var left = this.visibleSheets[index - 1]; |
| | var prev = this.visibleSheets[index - 2]; |
| |
|
| | if (left) { |
| | left._setAngle(180); |
| | } |
| | if (right) { |
| | right._setAngle(0); |
| | } |
| |
|
| | for (var i = 0; i < this.pagesArr.length; i++) { |
| | if (this.pagesArr[i] == right) { |
| | this.pagesArr[i].show(); |
| | this.pagesArr[i].unpauseHtml('front'); |
| | this.pagesArr[i].pauseHtml('back'); |
| | } else if (this.pagesArr[i] == left && !this.singlePage) { |
| | this.pagesArr[i].show(); |
| | this.pagesArr[i].unpauseHtml('back'); |
| | this.pagesArr[i].pauseHtml('front'); |
| | } else { |
| | this.pagesArr[i].hide(); |
| | this.pagesArr[i].pauseHtml('front'); |
| | this.pagesArr[i].pauseHtml('back'); |
| | } |
| |
|
| | this.pagesArr[i]._setZIndex(0); |
| | } |
| | this.updateBookPosition(); |
| |
|
| | if (left && !this.singlePage) { |
| | self.options.main.setLoadingProgress(0.1); |
| | left.load('back', function () { |
| | self.options.main.setLoadingProgress(1); |
| | left.startHTML('back'); |
| | if (right) { |
| | self.options.main.setLoadingProgress(0.1); |
| | right.load('front', function () { |
| | self.options.main.setLoadingProgress(1); |
| | right.load('back', null, true); |
| | if (next) { |
| | next.load('front', null, true); |
| | } |
| | if (!self.options.doublePage || self.view != 2) { |
| | right.startHTML('front'); |
| | } |
| | }); |
| | } else { |
| | left.load('front', null, true); |
| | if (prev) { |
| | prev.load('back', null, true); |
| | } |
| | } |
| | }); |
| | } else { |
| | self.options.main.setLoadingProgress(0.1); |
| | right.load('front', function () { |
| | self.options.main.setLoadingProgress(1); |
| | if (!self.singlePage) { |
| | right.load('back', null, true); |
| | } else { |
| | if (left) { |
| | left.load('front', null, true); |
| | } |
| | } |
| | if (next) { |
| | next.load('front', null, true); |
| | } |
| | right.startHTML('front'); |
| | }); |
| | } |
| | }; |
| |
|
| | FLIPBOOK.Book3.prototype.enable = function () { |
| | this.onResize(); |
| | this.enabled = true; |
| | }; |
| |
|
| | FLIPBOOK.Book3.prototype.disable = function () { |
| | this.enabled = false; |
| | }; |
| |
|
| | FLIPBOOK.Book3.prototype.getLeftPage = function () { |
| | return this.pagesArr[this.flippedleft - 1]; |
| | }; |
| |
|
| | FLIPBOOK.Book3.prototype.getRightPage = function () { |
| | return this.pagesArr[this.flippedleft]; |
| | }; |
| |
|
| | FLIPBOOK.Book3.prototype.getLeftBackPage = function () { |
| | return this.pagesArr[this.flippedleft - 2]; |
| | }; |
| |
|
| | FLIPBOOK.Book3.prototype.getRightBackPage = function () { |
| | return this.pagesArr[this.flippedleft + 1]; |
| | }; |
| |
|
| | FLIPBOOK.Book3.prototype.getNextPage = function () { |
| | return this.pagesArr[this.flippedleft + 2]; |
| | }; |
| |
|
| | FLIPBOOK.Book3.prototype.getPrevPage = function () { |
| | return this.pagesArr[this.flippedleft - 3]; |
| | }; |
| |
|
| | FLIPBOOK.Book3.prototype.nextPage = function () { |
| | if (!this.nextEnabled) { |
| | return; |
| | } |
| |
|
| | if (this.view == 1 && this.isFocusedLeft() && !this.singlePage) { |
| | var duration = 700; |
| | var d = (this.options.pageFlipDuration * duration) / 2; |
| | this.focusRight(d, 0, true); |
| | return; |
| | } |
| | this.goToPage(this.rightIndex + 2); |
| | }; |
| |
|
| | FLIPBOOK.Book3.prototype.prevPage = function () { |
| | if (!this.prevEnabled) { |
| | return; |
| | } |
| |
|
| | if (this.view == 1 && this.isFocusedRight() && !this.singlePage) { |
| | var duration = 700; |
| | var d = (this.options.pageFlipDuration * duration) / 2; |
| | this.focusLeft(d, 0, true); |
| | return; |
| | } |
| | var target = this.singlePage ? this.rightIndex : this.rightIndex - 2; |
| | this.goToPage(target); |
| | }; |
| |
|
| | FLIPBOOK.Book3.prototype.goToPage = function (index, instant) { |
| | if (!this.enabled || this.flipping || isNaN(index)) { |
| | return; |
| | } |
| |
|
| | if (this.singlePage || index % 2 != 0) { |
| | index--; |
| | } |
| |
|
| | if (index < 0) { |
| | index = 0; |
| | } |
| |
|
| | if (index > this.options.pages.length) { |
| | index = this.options.pages.length; |
| | } |
| |
|
| | if (index == this.rightIndex) { |
| | return; |
| | } |
| |
|
| | if (instant || this.options.instantFlip) { |
| | this.setRightIndex(index); |
| | this.updateFlipped(); |
| | this.updateVisiblePages(); |
| | this.options.main.turnPageComplete(); |
| | } else { |
| | var self = this; |
| | var end; |
| | var duration = 600; |
| | var d = this.options.pageFlipDuration * duration; |
| | var easing = this.flipEasing; |
| |
|
| | if (index > this.rightIndex) { |
| | end = 180; |
| | if (self.angle <= 0 || self.angle >= 180 || !self.angle) { |
| | self.angle = 1; |
| | } |
| | } else if (index < this.rightIndex) { |
| | end = -180; |
| | if (self.angle >= 0 || self.angle <= -180 || !self.angle) { |
| | self.angle = -1; |
| | } |
| | } |
| |
|
| | this.flipping = true; |
| |
|
| | if (!this.singlePage) { |
| | if (this.view == 1) { |
| | if (index < this.rightIndex) { |
| | this.focusRight(d); |
| | } else { |
| | this.focusLeft(d); |
| | } |
| | } else { |
| | if (index == 0) { |
| | this.focusRight(d); |
| | } else if (index == this.visibleSheets.length * 2) { |
| | this.focusLeft(d); |
| | } else { |
| | this.focusBoth(d); |
| | } |
| | } |
| | } |
| |
|
| | this.goingToPage = index; |
| |
|
| | if (this.singlePage) { |
| | d /= 2; |
| | } |
| |
|
| | const animationParams = { |
| | from: self.angle, |
| | to: end, |
| | duration: d, |
| | easing: easing, |
| | step(now) { |
| | self._setPageAngle(now); |
| | }, |
| | complete() { |
| | self.setRightIndex(self.goingToPage); |
| | self.angle = 0; |
| | self.flipping = false; |
| |
|
| | self.updateFlipped(); |
| | self.updateVisiblePages(); |
| | self.options.main.turnPageComplete(); |
| | }, |
| | }; |
| | this.animate(animationParams); |
| |
|
| | this.options.main.turnPageStart(); |
| | } |
| | }; |
| |
|
| | FLIPBOOK.Book3.prototype.animate = function (params) { |
| | FLIPBOOK.animate(params); |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | }; |
| |
|
| | FLIPBOOK.Book3.prototype.updateFlipped = function () { |
| | if (this.singlePage) { |
| | this.flippedleft = this.rightIndex; |
| | this.flippedright = this.options.pages.length - this.rightIndex; |
| | } else { |
| | this.flippedleft = (this.rightIndex + (this.rightIndex % 2)) / 2; |
| | this.flippedright = this.options.pages.length / 2 - this.flippedleft; |
| | } |
| | }; |
| |
|
| | FLIPBOOK.Book3.prototype.onSwipe = function (event, phase, distanceX, distanceY, duration, fingerCount) { |
| | if (this.isZoomed() || event.target.className === 'flipbook-page-link' || this.flipping) { |
| | return; |
| | } |
| |
|
| | const angle = (-distanceX * 180) / this.main.wrapperW; |
| | const threshold = 5; |
| | const distance = Math.abs(distanceX); |
| |
|
| | if (phase === 'start') { |
| | this.dragging = true; |
| | return; |
| | } |
| |
|
| | if ((phase === 'end' || phase === 'cancel') && fingerCount <= 1 && distance > threshold) { |
| | angle > 0 ? this.nextPage() : this.prevPage(); |
| | this.dragging = false; |
| | return; |
| | } |
| |
|
| | if (phase === 'move' && fingerCount <= 1 && this.dragging && distance > threshold) { |
| | let increment = angle > 0 ? (this.singlePage ? 1 : 2) : this.singlePage ? -1 : -2; |
| | if ((angle > 0 && !this.nextEnabled) || (angle < 0 && !this.prevEnabled)) { |
| | return; |
| | } |
| |
|
| | this.goingToPage = this.rightIndex + increment; |
| |
|
| | if ( |
| | this.goingToPage !== this.rightIndex && |
| | this.goingToPage >= 0 && |
| | this.goingToPage <= this.pagesArr.length * 2 && |
| | !this.options.instantFlip |
| | ) { |
| | this._setPageAngle(angle); |
| | } |
| | } |
| | }; |
| |
|
| | FLIPBOOK.Book3.prototype.pauseHtml = function () { |
| | for (var i = 0; i < this.pagesArr.length; i++) { |
| | this.pagesArr[i].pauseHtml(); |
| | } |
| | }; |
| |
|
| | FLIPBOOK.Book3.prototype._setPageAngle = function (angle) { |
| | if (this.angle == angle) { |
| | return; |
| | } |
| |
|
| | this.angle = angle; |
| |
|
| | var prev; |
| | var next; |
| | var left; |
| | var right; |
| | this.angle = angle; |
| | |
| |
|
| | var ri = this.rightIndex; |
| | var ri2 = this.goingToPage; |
| | |
| | |
| | |
| | |
| |
|
| | var flippping; |
| |
|
| | if (this.singlePage) { |
| | right = this.visibleSheets[ri]; |
| | left = this.visibleSheets[ri - 1]; |
| | if (angle > 0) { |
| | right._setAngle(angle / 2); |
| | next = this.visibleSheets[ri2]; |
| | if (next) { |
| | next.show(); |
| | next.load('front'); |
| | } |
| | } else { |
| | left = this.visibleSheets[ri2]; |
| | left.show(); |
| | left.load('front'); |
| | left._setAngle(angle / 2 + 90); |
| | } |
| |
|
| | if (next) { |
| | next._setAngle(0); |
| | } |
| | if (prev) { |
| | prev._setAngle(90); |
| | } |
| | } else { |
| | right = this.visibleSheets[ri / 2]; |
| | left = this.visibleSheets[ri / 2 - 1]; |
| | var newRight = this.visibleSheets[ri2 / 2 - 1]; |
| | var newLeft = this.visibleSheets[ri2 / 2]; |
| | if (angle > 0) { |
| | if (this.view == 1 && this.isFocusedLeft()) { |
| | return; |
| | } |
| | |
| | |
| |
|
| | if (angle < 90) { |
| | flippping = right; |
| | if (newRight) newRight.hide(); |
| | } else { |
| | flippping = newRight; |
| | right.hide(); |
| | } |
| | flippping.show(); |
| | flippping._setAngle(angle); |
| | next = this.visibleSheets[ri2 / 2]; |
| | flippping.load( |
| | 'back', |
| | function () { |
| | if (next) { |
| | next.show(); |
| | next.load('front', null, true); |
| | } |
| | }, |
| | true |
| | ); |
| | } else { |
| | if (this.view == 1 && this.isFocusedRight()) { |
| | return; |
| | } |
| | |
| | |
| |
|
| | if (angle > -90) { |
| | flippping = left; |
| | if (newLeft) newLeft.hide(); |
| | } else { |
| | flippping = newLeft; |
| | left.hide(); |
| | } |
| | flippping.show(); |
| | flippping._setAngle(180 + angle); |
| | prev = this.visibleSheets[ri2 / 2 - 1]; |
| | flippping.load( |
| | 'front', |
| | function () { |
| | if (prev) { |
| | prev.show(); |
| | prev.load('back', null, true); |
| | } |
| | }, |
| | true |
| | ); |
| | } |
| |
|
| | if (next) { |
| | next._setAngle(0); |
| | } |
| | if (prev) { |
| | prev._setAngle(180); |
| | } |
| | } |
| | }; |
| |
|
| | FLIPBOOK.Book3.prototype.isCover = function () { |
| | return this.rightIndex == 0; |
| | }; |
| |
|
| | FLIPBOOK.Book3.prototype.isBackCover = function () { |
| | return this.rightIndex == this.options.pages.length; |
| | }; |
| |
|
| | FLIPBOOK.Book3.prototype.onPageUnloaded = function (index) { |
| | var pageIndex = index; |
| |
|
| | if (this.options.rightToLeft) { |
| | pageIndex = this.options.pages.length - index - 1; |
| | } |
| |
|
| | if (this.pagesArr[pageIndex]) { |
| | this.pagesArr[pageIndex].unload(); |
| | } |
| | }; |
| |
|
| | FLIPBOOK.Book3.prototype.onResize = function () { |
| | var self = this; |
| |
|
| | var main = this.main; |
| | var w = main.wrapperW; |
| | var h = main.wrapperH; |
| | var bw = main.bookW; |
| | var bh = main.bookH; |
| | var pw = main.pageW; |
| | var ph = main.pageH; |
| | var r1 = w / h; |
| | var r2 = pw / ph; |
| | var options = this.options; |
| |
|
| | function fitToHeight() { |
| | self.ratio = h / bh; |
| | fit(); |
| | } |
| |
|
| | function fitToWidth() { |
| | self.ratio = self.view == 1 ? w / pw : w / bw; |
| | fit(); |
| | } |
| |
|
| | function fit() { |
| | if (self.iscroll) { |
| | self.iscroll.options.zoomMin = self.ratio * options.zoomMin; |
| | } |
| | if (self.iscroll) { |
| | self.iscroll.options.zoomMax = self.ratio * options.zoomMax; |
| | } |
| |
|
| | self.updateBookPosition(); |
| | if (self.iscroll) { |
| | self.iscroll.zoom(self.ratio * options.main.zoom, w / 2, h / 2, 0); |
| | } |
| |
|
| | self.bookScale = self.iscroll.scale; |
| | } |
| |
|
| | var s = Math.min(this.zoom, 1); |
| |
|
| | var zoomMin = Number(this.options.zoomMin); |
| |
|
| | if ( |
| | this.singlePage || |
| | (this.options.responsiveView && |
| | w <= this.options.responsiveViewTreshold && |
| | r1 < 2 * r2 && |
| | r1 < this.options.responsiveViewRatio) |
| | ) { |
| | this.view = 1; |
| |
|
| | if (r2 > r1) { |
| | this.sc = (zoomMin * r1) / (r2 * s); |
| | } else { |
| | this.sc = 1; |
| | } |
| |
|
| | if (w / h > pw / ph) { |
| | fitToHeight(); |
| | } else { |
| | fitToWidth(); |
| | } |
| | } else { |
| | this.view = 2; |
| |
|
| | if (r1 < 2 * r2) { |
| | this.sc = (zoomMin * r1) / (2 * r2 * s); |
| | } else { |
| | this.sc = 1; |
| | } |
| |
|
| | if (w / h >= bw / bh) { |
| | fitToHeight(); |
| | } else { |
| | fitToWidth(); |
| | } |
| | } |
| |
|
| | this.updateBookPosition(); |
| | this.updateFlipped(); |
| | this.options.main.turnPageComplete(); |
| | }; |
| |
|
| | FLIPBOOK.Book3.prototype.isFocusedRight = function () { |
| | var center = this.view == 1 ? -this.pageWidth / 2 : 0; |
| | if (this.singlePage) { |
| | return this.rightIndex % 2 == 0; |
| | } else { |
| | return this.centerContainerPosition < center; |
| | } |
| | }; |
| |
|
| | FLIPBOOK.Book3.prototype.isFocusedLeft = function () { |
| | var center = this.view == 1 ? -this.pageWidth / 2 : 0; |
| |
|
| | if (this.singlePage) { |
| | return this.rightIndex % 2 == 1; |
| | } else { |
| | return this.centerContainerPosition > center; |
| | } |
| | }; |
| |
|
| | FLIPBOOK.Page3 = function (book, index) { |
| | this.book = book; |
| | this.main = book.main; |
| | this.options = book.options; |
| |
|
| | this.index = index; |
| |
|
| | this.wrapper = document.createElement('div'); |
| | this.wrapper.className = 'flipbook-page3'; |
| | this.wrapper.style.width = book.options.pageWidth + 'px'; |
| | this.wrapper.style.height = book.options.pageHeight + 'px'; |
| | this.angle = 0; |
| | this.wrapper.dataset.sheet = index; |
| |
|
| | var options = book.options; |
| |
|
| | let preloaderSrc = options.pagePreloader || options.assets.spinner; |
| | let preloaderClass = options.pagePreloader ? 'flipbook-page-preloader-image' : 'flipbook-page-preloader'; |
| |
|
| | this.front = document.createElement('div'); |
| | this.wrapper.appendChild(this.front); |
| | this.front.className = 'flipbook-page3-inner flipbook-page3-inner-front'; |
| |
|
| | this.bgFront = document.createElement('div'); |
| | this.front.appendChild(this.bgFront); |
| | this.bgFront.className = 'flipbook-page3-bg'; |
| |
|
| | this.htmlFront = document.createElement('div'); |
| | this.front.appendChild(this.htmlFront); |
| | this.htmlFront.className = 'flipbook-page3-html page_' + String(2 * index); |
| | this.htmlFront.style.width = (1000 * options.pageWidth) / options.pageHeight + 'px'; |
| |
|
| | var transform = 'scale(' + this.options.pageHeight / 1000 + ')'; |
| | if (this.options.doublePage && this.index > 0) { |
| | this.htmlFront.style.transform = transform + ' translateX(-100%)'; |
| | } else { |
| | this.htmlFront.style.transform = transform; |
| | } |
| |
|
| | this.html = { front: this.htmlFront }; |
| |
|
| | this.frontHtmlContentVisible = false; |
| |
|
| | this.preloaderFront = new Image(); |
| | this.preloaderFront.src = preloaderSrc; |
| | this.preloaderFront.className = preloaderClass; |
| | this.front.appendChild(this.preloaderFront); |
| |
|
| | if (!book.singlePage) { |
| | this.back = document.createElement('div'); |
| | this.wrapper.appendChild(this.back); |
| | this.back.className = 'flipbook-page3-inner flipbook-page3-inner-back'; |
| | this._setVisibility(this.back, false); |
| |
|
| | this.bgBack = document.createElement('div'); |
| | this.back.appendChild(this.bgBack); |
| | this.bgBack.className = 'flipbook-page3-bg'; |
| |
|
| | this.htmlBack = document.createElement('div'); |
| | this.back.appendChild(this.htmlBack); |
| | this.htmlBack.className = 'flipbook-page3-html page_' + String(2 * index + 1); |
| | this.htmlBack.style.width = (1000 * options.pageWidth) / options.pageHeight + 'px'; |
| |
|
| | this.htmlBack.style.transform = transform; |
| |
|
| | this.html.back = this.htmlBack; |
| |
|
| | this.backHtmlContentVisible = false; |
| |
|
| | this.preloaderBack = new Image(); |
| | this.preloaderBack.src = preloaderSrc; |
| | this.preloaderBack.className = preloaderClass; |
| | this.back.appendChild(this.preloaderBack); |
| | } |
| |
|
| | this.htmlPaused = { front: false, back: false }; |
| |
|
| | this.hide(); |
| | this.zIndex = 0; |
| |
|
| | if (this.options.rightToLeft && !this.options.backCover) { |
| | index++; |
| | } |
| | this.wrapper.style.left = String(this.book.options.pageWidth - 1) + 'px'; |
| | }; |
| |
|
| | FLIPBOOK.Page3.prototype = { |
| | load: function (side, callback, thumb) { |
| | var pageSize = this.book.pageHeight * this.book.iscroll.scale * window.devicePixelRatio; |
| | var o = this.options; |
| | var size = pageSize < o.pageTextureSizeSmall ? o.pageTextureSizeSmall : o.pageTextureSize; |
| | var isFront = side == 'front' || this.book.singlePage; |
| |
|
| | var pageIndex = this.book.singlePage ? this.index : isFront ? this.index * 2 : this.index * 2 + 1; |
| | var index = o.rightToLeft ? o.pages.length - pageIndex - 1 : pageIndex; |
| |
|
| | if ( |
| | (this.sizeFront == size && isFront && this.indexFront == index) || |
| | (this.sizeBack == size && !isFront && this.indexBack == index) |
| | ) { |
| | if (!thumb) { |
| | this.loadHTML(side); |
| | } |
| | if (callback) { |
| | callback.call(this); |
| | } |
| | } else { |
| | if (isFront) { |
| | this.sizeFront = size; |
| | } else { |
| | this.sizeBack = size; |
| | } |
| |
|
| | var self = this; |
| |
|
| | if (isFront) this.indexFront = index; |
| | else this.indexBack = index; |
| |
|
| | o.main.loadPage(index, size, function (page) { |
| | if (page && page.image) { |
| | var img = page.image[size] || page.image; |
| | var page = o.pages[index]; |
| | if ( |
| | (isFront && page && page.side == 'right') || |
| | (o.rightToLeft && isFront && page && page.side == 'left') |
| | ) { |
| | if (!img.clone) { |
| | img.clone = new Image(); |
| | img.clone.src = img.src; |
| | } |
| | img = img.clone; |
| | img.style.transform = 'translateX(-50%)'; |
| | } |
| |
|
| | if (isFront) { |
| | if (self.bgFront) self.bgFront.replaceChildren(img); |
| | if (self.preloaderFront) self.preloaderFront.style.display = 'none'; |
| | } else { |
| | if (self.bgBack) self.bgBack.replaceChildren(img); |
| | if (self.preloaderBack) self.preloaderBack.style.display = 'none'; |
| | } |
| |
|
| | if (!thumb) { |
| | self.loadHTML(side); |
| | } |
| | } |
| |
|
| | if (callback) { |
| | callback.call(self); |
| | } |
| | }); |
| | } |
| | }, |
| |
|
| | loadHTML: function (side) { |
| | var self = this; |
| |
|
| | var isFront = side == 'front'; |
| |
|
| | var pageIndex = this.book.singlePage ? this.index : isFront ? this.index * 2 : this.index * 2 + 1; |
| |
|
| | var o = this.options; |
| | var index = o.rightToLeft ? o.pages.length - pageIndex - 1 : pageIndex; |
| |
|
| | if (index < 0) { |
| | return; |
| | } |
| |
|
| | if (this.htmlContent && this.htmlContent[side]) { |
| | this.updateHtmlContent(side); |
| | } else { |
| | this.options.main.loadPageHTML(index, function (html) { |
| | self.htmlContent = this.htmlContent || {}; |
| | self.htmlContent[side] = html; |
| | self.updateHtmlContent(side); |
| | }); |
| | } |
| | }, |
| |
|
| | startHTML: function (side) { |
| | this.book.startPageItems(this.html[side]); |
| | }, |
| |
|
| | unload: function () { |
| | this.size = null; |
| | this.mat = false; |
| | this.pageSize = null; |
| | }, |
| |
|
| | pauseHtml: function (side) { |
| | if (!this.htmlPaused[side]) { |
| | this.htmlPaused[side] = true; |
| | const htmlContainer = this.html[side]; |
| | if (!htmlContainer) { |
| | return; |
| | } |
| | this.main.trigger('hidepagehtml', { page: this }); |
| |
|
| | var mediaElements = htmlContainer.querySelectorAll('video, audio'); |
| | mediaElements.forEach(function (media) { |
| | media.pause(); |
| | }); |
| |
|
| | var iframes = htmlContainer.querySelectorAll('iframe'); |
| | for (var i = 0; i < iframes.length; i++) { |
| | var iframe = iframes[i]; |
| | var src = iframe.src; |
| | var youtubeRegex = /(?:youtube\.com\/embed\/|youtu\.be\/)/; |
| | |
| | |
| |
|
| | |
| | |
| | |
| | |
| | this.removedIframes = this.removedIframes || []; |
| | this.removedIframes.push({ |
| | iframe: iframe, |
| | parentNode: iframe.parentNode, |
| | }); |
| | iframe.parentNode.removeChild(iframe); |
| | |
| | } |
| | } |
| | }, |
| |
|
| | unpauseHtml: function (side) { |
| | this.htmlPaused[side] = false; |
| | if (this.removedIframes && this.removedIframes.length) { |
| | this.removedIframes.forEach(function (obj) { |
| | obj.parentNode.appendChild(obj.iframe); |
| | }); |
| | } |
| | this.removedIframes = []; |
| | }, |
| |
|
| | showHtml: function () { |
| | if (!this.htmlContentVisible) { |
| | this.htmlContentVisible = true; |
| | } |
| | }, |
| |
|
| | updateHtmlContent: function (side) { |
| | this.htmlLoaded = this.htmlLoaded || {}; |
| | if (!this.htmlLoaded[side]) { |
| | var c = this.htmlContent[side]; |
| | if (c.jquery) { |
| | c = c[0]; |
| | } |
| |
|
| | this.htmlLoaded[side] = true; |
| | var container = this.html[side]; |
| | if (container) container.appendChild(c); |
| |
|
| | this.main.trigger('showpagehtml', { page: this }); |
| | } |
| | this.startHTML(side); |
| | }, |
| |
|
| | show: function () { |
| | if (this.hidden) { |
| | this.wrapper.style.display = 'block'; |
| | this.setShadowOpacity(0); |
| | this.showHtml(); |
| | } |
| | this.hidden = false; |
| | }, |
| |
|
| | setShadowOpacity: function (val) { |
| | if (this.shadowOpacity != val && !this.hidden) { |
| | this.wrapper.style.setProperty('--page3-shadow-opacity', val); |
| | this.shadowOpacity = val; |
| | } |
| | }, |
| |
|
| | hide: function () { |
| | if (!this.hidden) { |
| | this.wrapper.style.display = 'none'; |
| | this.setShadowOpacity(0); |
| | } |
| |
|
| | this.hidden = true; |
| | }, |
| |
|
| | _setVisibility: function (div, visible) { |
| | if (div && div.dataset.visible != visible) { |
| | div.dataset.visible = visible; |
| | div.style.opacity = visible ? '1' : '0'; |
| | div.style.pointerEvents = visible ? 'auto' : 'none'; |
| | } |
| | }, |
| |
|
| | _setAngle: function (angle) { |
| | angle = -angle; |
| |
|
| | if (angle != this.angle) { |
| | this.setShadowOpacity((1 - Math.abs(angle + 90) / 90) * 0.2); |
| | this.wrapper.style.setProperty('--page3-rotate-y', String(angle + 'deg')); |
| | this._setVisibility(this.front, angle > -90); |
| | this._setVisibility(this.back, angle < -90); |
| | this.angle = angle; |
| | var i; |
| | var max = 0; |
| | for (i = 0; i < this.book.pagesArr.length; i++) { |
| | if (i != this.index && this.book.pagesArr[i].zIndex > max) { |
| | max = this.book.pagesArr[i].zIndex; |
| | } |
| | } |
| | this._setZIndex(max + 1); |
| | } |
| | }, |
| |
|
| | _setZIndex: function (val) { |
| | if (this.zIndex != val) { |
| | this.wrapper.style['z-index'] = val; |
| | } |
| | this.zIndex = val; |
| | }, |
| | }; |
| |
|