AI-BOOK / flipbook.book3.js
ginipick's picture
Upload 6 files
8b7579c verified
/*
* Real3D FlipBook [https://real3dflipbook.com]
* @author creativeinteractivemedia [https://codecanyon.net/user/creativeinteractivemedia/portfolio]
* @version 4.10
* @date 2025-05-15
*/
'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;
// 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;
},
};