// Copyright (c) 2010 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. cr.define('options', function() { ///////////////////////////////////////////////////////////////////////////// // OptionsPage class: /** * Base class for options page. * @constructor * @param {string} name Options page name, also defines id of the div element * containing the options view and the name of options page navigation bar * item as name+'PageNav'. * @param {string} title Options page title, used for navigation bar * @extends {EventTarget} */ function OptionsPage(name, title, pageDivName) { this.name = name; this.title = title; this.pageDivName = pageDivName; this.pageDiv = $(this.pageDivName); this.tab = null; this.managed = false; } OptionsPage.registeredPages_ = {}; /** * Pages which are nested under a main page. */ OptionsPage.registeredSubPages_ = {}; /** * Pages which are meant to behave like modal dialogs. */ OptionsPage.registeredOverlayPages_ = {}; /** * Shows a registered page. This handles both top-level pages and sub-pages. * @param {string} pageName Page name. */ OptionsPage.showPageByName = function(pageName) { for (var name in OptionsPage.registeredPages_) { var page = OptionsPage.registeredPages_[name]; page.visible = name == pageName; } for (var name in OptionsPage.registeredSubPages_) { var pageInfo = OptionsPage.registeredSubPages_[name]; var match = name == pageName; if (match) pageInfo.parentPage.visible = true; pageInfo.page.visible = match; } }; /** * Called on load. Dispatch the URL hash to the given page's handleHash * function. * @param {string} pageName The string name of the (registered) options page. * @param {string} hash The value of the hash component of the URL. */ OptionsPage.handleHashForPage = function(pageName, hash) { var page = OptionsPage.registeredPages_[pageName]; if (!page) { page = OptionsPage.registeredSubPages_[pageName].page; } page.handleHash(hash); }; /** * Shows a registered Overlay page. * @param {string} overlayName Page name. */ OptionsPage.showOverlay = function(overlayName) { if (OptionsPage.registeredOverlayPages_[overlayName]) { OptionsPage.registeredOverlayPages_[overlayName].visible = true; } }; /** * Clears overlays (i.e. hide all overlays). */ OptionsPage.clearOverlays = function() { for (var name in OptionsPage.registeredOverlayPages_) { var page = OptionsPage.registeredOverlayPages_[name]; page.visible = false; } }; /** * Clears overlays if the key event is ESC. * @param {Event} e Key event. * @private */ OptionsPage.clearOverlaysOnEsc_ = function(e) { if (e.keyCode == 27) { // Esc OptionsPage.clearOverlays(); } }; /** * Closes any currently-open subpage. */ OptionsPage.closeSubPage = function() { for (var name in OptionsPage.registeredSubPages_) { var pageInfo = OptionsPage.registeredSubPages_[name]; if (pageInfo.page.visible) { pageInfo.page.visible = false; // Since the managed pref banner lives outside the overlay, and the // parent is not changing visibility, update the banner explicitly. pageInfo.parentPage.updateManagedBannerVisibility(); } } }; /** * Shows the tab contents for the given navigation tab. * @param {!Element} tab The tab that the user clicked. */ OptionsPage.showTab = function(tab) { // Search parents until we find a tab, or the nav bar itself. This allows // tabs to have child nodes, e.g. labels in separately-styled spans. while (tab && !tab.classList.contains('subpages-nav-tabs') && !tab.classList.contains('inactive-tab')) { tab = tab.parentNode; } if (!tab || !tab.classList.contains('inactive-tab')) return; if (this.activeNavTab != null) { this.activeNavTab.classList.remove('active-tab'); $(this.activeNavTab.getAttribute('tab-contents')).classList. remove('active-tab-contents'); } tab.classList.add('active-tab'); $(tab.getAttribute('tab-contents')).classList.add('active-tab-contents'); this.activeNavTab = tab; }; /** * Registers new options page. * @param {OptionsPage} page Page to register. */ OptionsPage.register = function(page) { OptionsPage.registeredPages_[page.name] = page; // Create and add new page