/android_ble/www/lib/SoundJS/docs/assets/js/api-list.js
JavaScript | 251 lines | 188 code | 51 blank | 12 comment | 24 complexity | e23f348ed4e8c6780f744756f8ee8531 MD5 | raw file
- YUI.add('api-list', function (Y) {
- var Lang = Y.Lang,
- YArray = Y.Array,
- APIList = Y.namespace('APIList'),
- classesNode = Y.one('#api-classes'),
- inputNode = Y.one('#api-filter'),
- modulesNode = Y.one('#api-modules'),
- tabviewNode = Y.one('#api-tabview'),
- tabs = APIList.tabs = {},
- filter = APIList.filter = new Y.APIFilter({
- inputNode : inputNode,
- maxResults: 1000,
- on: {
- results: onFilterResults
- }
- }),
- search = APIList.search = new Y.APISearch({
- inputNode : inputNode,
- maxResults: 100,
- on: {
- clear : onSearchClear,
- results: onSearchResults
- }
- }),
- tabview = APIList.tabview = new Y.TabView({
- srcNode : tabviewNode,
- panelNode: '#api-tabview-panel',
- render : true,
- on: {
- selectionChange: onTabSelectionChange
- }
- }),
- focusManager = APIList.focusManager = tabviewNode.plug(Y.Plugin.NodeFocusManager, {
- circular : true,
- descendants: '#api-filter, .yui3-tab-panel-selected .api-list-item a, .yui3-tab-panel-selected .result a',
- keys : {next: 'down:40', previous: 'down:38'}
- }).focusManager,
- LIST_ITEM_TEMPLATE =
- '<li class="api-list-item {typeSingular}">' +
- '<a href="{rootPath}{typePlural}/{name}.html">{displayName}</a>' +
- '</li>';
- // -- Init ---------------------------------------------------------------------
- // Duckpunch FocusManager's key event handling to prevent it from handling key
- // events when a modifier is pressed.
- Y.before(function (e, activeDescendant) {
- if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) {
- return new Y.Do.Prevent();
- }
- }, focusManager, '_focusPrevious', focusManager);
- Y.before(function (e, activeDescendant) {
- if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) {
- return new Y.Do.Prevent();
- }
- }, focusManager, '_focusNext', focusManager);
- // Create a mapping of tabs in the tabview so we can refer to them easily later.
- tabview.each(function (tab, index) {
- var name = tab.get('label').toLowerCase();
- tabs[name] = {
- index: index,
- name : name,
- tab : tab
- };
- });
- // Switch tabs on Ctrl/Cmd-Left/Right arrows.
- tabviewNode.on('key', onTabSwitchKey, 'down:37,39');
- // Focus the filter input when the `/` key is pressed.
- Y.one(Y.config.doc).on('key', onSearchKey, 'down:83');
- // Keep the Focus Manager up to date.
- inputNode.on('focus', function () {
- focusManager.set('activeDescendant', inputNode);
- });
- // Update all tabview links to resolved URLs.
- tabview.get('panelNode').all('a').each(function (link) {
- link.setAttribute('href', link.get('href'));
- });
- // -- Private Functions --------------------------------------------------------
- function getFilterResultNode() {
- return filter.get('queryType') === 'classes' ? classesNode : modulesNode;
- }
- // -- Event Handlers -----------------------------------------------------------
- function onFilterResults(e) {
- var frag = Y.one(Y.config.doc.createDocumentFragment()),
- resultNode = getFilterResultNode(),
- typePlural = filter.get('queryType'),
- typeSingular = typePlural === 'classes' ? 'class' : 'module';
- if (e.results.length) {
- YArray.each(e.results, function (result) {
- frag.append(Lang.sub(LIST_ITEM_TEMPLATE, {
- rootPath : APIList.rootPath,
- displayName : filter.getDisplayName(result.highlighted),
- name : result.text,
- typePlural : typePlural,
- typeSingular: typeSingular
- }));
- });
- } else {
- frag.append(
- '<li class="message">' +
- 'No ' + typePlural + ' found.' +
- '</li>'
- );
- }
- resultNode.empty(true);
- resultNode.append(frag);
- focusManager.refresh();
- }
- function onSearchClear(e) {
- focusManager.refresh();
- }
- function onSearchKey(e) {
- var target = e.target;
- if (target.test('input,select,textarea')
- || target.get('isContentEditable')) {
- return;
- }
- e.preventDefault();
- inputNode.focus();
- focusManager.refresh();
- }
- function onSearchResults(e) {
- var frag = Y.one(Y.config.doc.createDocumentFragment());
- if (e.results.length) {
- YArray.each(e.results, function (result) {
- frag.append(result.display);
- });
- } else {
- frag.append(
- '<li class="message">' +
- 'No results found. Maybe you\'ll have better luck with a ' +
- 'different query?' +
- '</li>'
- );
- }
- focusManager.refresh();
- }
- function onTabSelectionChange(e) {
- var tab = e.newVal,
- name = tab.get('label').toLowerCase();
- tabs.selected = {
- index: tab.get('index'),
- name : name,
- tab : tab
- };
- switch (name) {
- case 'classes': // fallthru
- case 'modules':
- filter.setAttrs({
- minQueryLength: 0,
- queryType : name
- });
- search.set('minQueryLength', -1);
- // Only send a request if this isn't the initially-selected tab.
- if (e.prevVal) {
- filter.sendRequest(filter.get('value'));
- }
- break;
- case 'everything':
- filter.set('minQueryLength', -1);
- search.set('minQueryLength', 1);
- if (search.get('value')) {
- search.sendRequest(search.get('value'));
- } else {
- inputNode.focus();
- }
- break;
- default:
- // WTF? We shouldn't be here!
- filter.set('minQueryLength', -1);
- search.set('minQueryLength', -1);
- }
- if (focusManager) {
- setTimeout(function () {
- focusManager.refresh();
- }, 1);
- }
- }
- function onTabSwitchKey(e) {
- var currentTabIndex = tabs.selected.index;
- if (!(e.ctrlKey || e.metaKey)) {
- return;
- }
- e.preventDefault();
- switch (e.keyCode) {
- case 37: // left arrow
- if (currentTabIndex > 0) {
- tabview.selectChild(currentTabIndex - 1);
- inputNode.focus();
- }
- break;
- case 39: // right arrow
- if (currentTabIndex < (Y.Object.size(tabs) - 2)) {
- tabview.selectChild(currentTabIndex + 1);
- inputNode.focus();
- }
- break;
- }
- }
- }, '3.4.0', {requires: [
- 'api-filter', 'api-search', 'event-key', 'node-focusmanager', 'tabview'
- ]});