(function () { "use strict"; var nav = WinJS.Navigation; WinJS.Namespace.define("Application", { PageControlNavigator: WinJS.Class.define( // Define the constructor function for the PageControlNavigator. function PageControlNavigator(element, options) { this._element = element || document.createElement("div"); this._element.appendChild(this._createPageElement()); this.home = options.home; this._eventHandlerRemover = []; var that = this; function addRemovableEventListener(e, eventName, handler, capture) { e.addEventListener(eventName, handler, capture); that._eventHandlerRemover.push(function () { e.removeEventListener(eventName, handler); }); }; addRemovableEventListener(nav, 'navigating', this._navigating.bind(this), false); addRemovableEventListener(nav, 'navigated', this._navigated.bind(this), false); window.onresize = this._resized.bind(this); Application.navigator = this; }, { home: "", /// _element: null, _lastNavigationPromise: WinJS.Promise.as(), _lastViewstate: 0, // This is the currently loaded Page object. pageControl: { get: function () { return this.pageElement && this.pageElement.winControl; } }, // This is the root element of the current page. pageElement: { get: function () { return this._element.firstElementChild; } }, // This function disposes the page navigator and its contents. dispose: function () { if (this._disposed) { return; } this._disposed = true; WinJS.Utilities.disposeSubTree(this._element); for (var i = 0; i < this._eventHandlerRemover.length; i++) { this._eventHandlerRemover[i](); } this._eventHandlerRemover = null; }, // Creates a container for a new page to be loaded into. _createPageElement: function () { var element = document.createElement("div"); element.setAttribute("dir", window.getComputedStyle(this._element, null).direction); element.style.position = "absolute"; element.style.visibility = "hidden"; element.style.width = "100%"; element.style.height = "100%"; return element; }, // Retrieves a list of animation elements for the current page. // If the page does not define a list, animate the entire page. _getAnimationElements: function () { if (this.pageControl && this.pageControl.getAnimationElements) { return this.pageControl.getAnimationElements(); } return this.pageElement; }, _navigated: function () { this.pageElement.style.visibility = ""; WinJS.UI.Animation.enterPage(this._getAnimationElements()).done(); }, // Responds to navigation by adding new pages to the DOM. _navigating: function (args) { var newElement = this._createPageElement(); this._element.appendChild(newElement); this._lastNavigationPromise.cancel(); var that = this; this._lastNavigationPromise = WinJS.Promise.as().then(function () { return WinJS.UI.Pages.render(args.detail.location, newElement, args.detail.state); }).then(function parentElement(control) { var oldElement = that.pageElement; // Cleanup and remove previous element if (oldElement.winControl) { if (oldElement.winControl.unload) { oldElement.winControl.unload(); } oldElement.winControl.dispose(); } oldElement.parentNode.removeChild(oldElement); oldElement.innerText = ""; }); args.detail.setPromise(this._lastNavigationPromise); }, // Responds to resize events and call the updateLayout function // on the currently loaded page. _resized: function (args) { if (this.pageControl && this.pageControl.updateLayout) { this.pageControl.updateLayout.call(this.pageControl, this.pageElement); } }, } ) }); })();