define([], function () { var pageContainerCount; var animationDuration = 500; function loadView(options) { return new Promise(function (resolve, reject) { var animatedPages = document.querySelector('.mainAnimatedPages'); if (options.cancel) { return; } var selected = animatedPages.selected; var pageIndex = selected == null ? 0 : (selected + 1); if (pageIndex >= pageContainerCount) { pageIndex = 0; } var html = '
'; html += options.view; html += '
'; var animatable = animatedPages.querySelectorAll('.mainAnimatedPage')[pageIndex]; var currentPage = animatable.querySelector('.page-view'); if (currentPage) { triggerDestroy(currentPage); } animatable.innerHTML = html; var view = animatable.querySelector('.page-view'); if (onBeforeChange) { onBeforeChange(view, false, options); } sendResolve(resolve, view); }); } var onBeforeChange; function setOnBeforeChange(fn) { onBeforeChange = fn; } function sendResolve(resolve, view) { // Don't report completion until the animation has finished, otherwise rendering may not perform well setTimeout(function () { resolve(view); }, animationDuration); } function replaceAnimatedPages() { var elem = document.querySelector('neon-animated-pages.mainAnimatedPages'); if (elem) { var div = document.createElement('div'); div.classList.add('mainAnimatedPages'); div.classList.add('skinBody'); div.innerHTML = '
'; elem.parentNode.replaceChild(div, elem); pageContainerCount = document.querySelectorAll('.mainAnimatedPage').length; } } function tryRestoreView(options) { return new Promise(function (resolve, reject) { var url = options.url; var view = document.querySelector(".page-view[data-url='" + url + "']"); var page = parentWithClass(view, 'mainAnimatedPage'); if (view) { var index = -1; var pages = document.querySelectorAll('.mainAnimatedPage'); for (var i = 0, length = pages.length; i < length; i++) { if (pages[i] == page) { index = i; break; } } if (index != -1) { var animatedPages = document.querySelector('.mainAnimatedPages'); if (options.cancel) { return; } var animatable = animatedPages.querySelectorAll('.mainAnimatedPage')[index]; var view = animatable.querySelector('.page-view'); if (onBeforeChange) { onBeforeChange(view, true, options); } animatedPages.selected = index; sendResolve(resolve, view); return; } } reject(); }); } function triggerDestroy(view) { view.dispatchEvent(new CustomEvent("viewdestroy", {})); } function reset() { var views = document.querySelectorAll(".mainAnimatedPage:not(.iron-selected) .page-view"); for (var i = 0, length = views.length; i < length; i++) { var view = views[i]; triggerDestroy(view); view.parentNode.removeChild(view); } } function parentWithClass(elem, className) { while (!elem.classList || !elem.classList.contains(className)) { elem = elem.parentNode; if (!elem) { return null; } } return elem; } replaceAnimatedPages(); return { loadView: loadView, tryRestoreView: tryRestoreView, reset: reset, setOnBeforeChange: setOnBeforeChange }; });