define(['browser', 'dom', 'layoutManager', 'css!components/viewManager/viewContainer'], function (browser, dom, layoutManager) { 'use strict'; function setControllerClass(view, options) { if (options.controllerFactory) { return Promise.resolve(); } var controllerUrl = view.getAttribute('data-controller'); if (controllerUrl) { if (0 === controllerUrl.indexOf('__plugin/')) { controllerUrl = controllerUrl.substring('__plugin/'.length); } controllerUrl = Dashboard.getConfigurationResourceUrl(controllerUrl); return getRequirePromise([controllerUrl]).then(function (ControllerFactory) { options.controllerFactory = ControllerFactory; }); } return Promise.resolve(); } function getRequirePromise(deps) { return new Promise(function (resolve, reject) { require(deps, resolve); }); } function loadView(options) { if (!options.cancel) { var selected = selectedPageIndex; var previousAnimatable = -1 === selected ? null : allPages[selected]; var pageIndex = selected + 1; if (pageIndex >= pageContainerCount) { pageIndex = 0; } var isPluginpage = -1 !== options.url.toLowerCase().indexOf('/configurationpage'); var newViewInfo = normalizeNewView(options, isPluginpage); var newView = newViewInfo.elem; var modulesToLoad = []; return new Promise(function (resolve) { require(modulesToLoad, function () { var currentPage = allPages[pageIndex]; if (currentPage) { triggerDestroy(currentPage); } var view = newView; if ('string' == typeof view) { view = document.createElement('div'); view.innerHTML = newView; } view.classList.add('mainAnimatedPage'); if (currentPage) { if (newViewInfo.hasScript && window.$) { view = $(view).appendTo(mainAnimatedPages)[0]; mainAnimatedPages.removeChild(currentPage); } else { mainAnimatedPages.replaceChild(view, currentPage); } } else { if (newViewInfo.hasScript && window.$) { view = $(view).appendTo(mainAnimatedPages)[0]; } else { mainAnimatedPages.appendChild(view); } } if (options.type) { view.setAttribute('data-type', options.type); } var properties = []; if (options.fullscreen) { properties.push('fullscreen'); } if (properties.length) { view.setAttribute('data-properties', properties.join(',')); } allPages[pageIndex] = view; setControllerClass(view, options).then(function () { if (onBeforeChange) { onBeforeChange(view, false, options); } beforeAnimate(allPages, pageIndex, selected); selectedPageIndex = pageIndex; currentUrls[pageIndex] = options.url; if (!options.cancel && previousAnimatable) { afterAnimate(allPages, pageIndex); } if (window.$) { $.mobile = $.mobile || {}; $.mobile.activePage = view; } resolve(view); }); }); }); } } function replaceAll(str, find, replace) { return str.split(find).join(replace); } function parseHtml(html, hasScript) { if (hasScript) { html = replaceAll(html, '\x3c!----\x3e', '<\/script>'); } var wrapper = document.createElement('div'); wrapper.innerHTML = html; return wrapper.querySelector('div[data-role="page"]'); } function normalizeNewView(options, isPluginpage) { var viewHtml = options.view; if (-1 === viewHtml.indexOf('data-role="page"')) { return viewHtml; } var hasScript = -1 !== viewHtml.indexOf('