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; if (isPluginpage) { require(["legacyDashboard"]); } if (newViewInfo.hasjQuerySelect) { require(["legacySelectMenu"]); } if (newViewInfo.hasjQueryChecked) { require(["fnchecked"]); } return new Promise(function (resolve) { 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("