Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
/* | |
* Real3D FlipBook [https://real3dflipbook.com] | |
* @author creativeinteractivemedia [https://codecanyon.net/user/creativeinteractivemedia/portfolio] | |
* @version 4.10 | |
* @date 2025-05-15 | |
*/ | |
; | |
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; | |
// Set up the wrapper and parent container | |
this.wrapper = el; | |
this.wrapper.classList.add('flipbook-book3'); | |
this.bookLayer = this.wrapper.parentNode; | |
this.flipEasing = 'easeOutQuad'; | |
this.translateZ = ''; | |
// Initialize IScroll with options | |
this.iscroll = new FLIPBOOK.IScroll(this.bookLayer, { | |
zoom: true, | |
scrollX: true, | |
scrollY: true, | |
scrollbars: true, | |
keepInCenterV: true, | |
keepInCenterH: true, | |
freeScroll: true, | |
preventDefault: false, | |
}); | |
// Event listeners for enabling/disabling IScroll | |
main.on('disableIScroll', this.disableIscroll.bind(this)); | |
main.on('enableIScroll', this.enableIscroll.bind(this)); | |
// Handle zoom end event | |
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; | |
} | |
}); | |
// Set wrapper and center container dimensions | |
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); | |
// Set perspective based on options or view mode | |
const perspective = this.options.perspective || (this.options.viewMode === '3d' ? 3 * this.pageHeight : 200000); | |
this.centerContainer.style.perspective = `${perspective}px`; | |
// Initialize pages | |
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; | |
} | |
// if (!this.options.backCover && this.options.rightToLeft) { | |
// index--; | |
// } | |
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); | |
// const jq = true; | |
// if (!jq) { | |
// FLIPBOOK.animate(params); | |
// } else { | |
// jQuery({ | |
// someValue: params.from, | |
// }).animate( | |
// { | |
// someValue: params.to, | |
// }, | |
// 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; | |
// this.pauseHtml(); | |
var ri = this.rightIndex; | |
var ri2 = this.goingToPage; | |
// if (this.options.rightToLeft && !this.options.backCover) { | |
// ri--; | |
// ri2--; | |
// } | |
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; | |
} | |
//flipping from right to left | |
//angle 0 -> 180 | |
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; | |
} | |
//flipping from left to right | |
//angle 0 -> -180 | |
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\/)/; | |
// var youtubeRegex = | |
// /(?:youtube\.com\/(?:[^\/\n\s]+\/\S+\/|(?:v|e(?:mbed)?)\/|\S*?[?&]v=)|youtu\.be\/)([a-zA-Z0-9_-]{11})/; | |
// if (youtubeRegex.test(src)) { | |
// var youtubeVideo = iframe.contentWindow; | |
// youtubeVideo.postMessage('{"event":"command","func":"pauseVideo","args":""}', '*'); | |
// } else { | |
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; | |
}, | |
}; | |