--- /dev/null
+// Search box
+Ext.onReady(function() {
+ var searchStore = new Ext.data.Store({
+ fields: ['cls', 'member', 'type', 'doc'],
+ proxy: {
+ type: 'memory',
+ reader: {
+ type: 'json'
+ }
+ }
+ });
+ // This is the global object read from /output/members.js
+ searchStore.loadData(Docs.membersData.data);
+ var allRecords = searchStore.getRange();
+ searchStore.removeAll();
+
+ var panel = Ext.create('Ext.view.View', {
+ store: searchStore,
+ tpl: new Ext.XTemplate(
+ '<tpl for=".">',
+ '<div class="item {type}">',
+ '<div class="title">{member}</div>',
+ '<div class="class">{cls}</div>',
+ '</div>',
+ '</tpl>'
+ ),
+ id: 'quick-search',
+ overItemCls:'x-view-over',
+ trackOver: true,
+ itemSelector:'div.item',
+ singleSelect: true,
+
+ handleClick: function(curItem) {
+ curItem = curItem || panel.getSelectionModel().getLastSelected();
+ var cls = curItem.data.cls;
+ if (curItem.data.type != 'cls') {
+ cls += '-' + curItem.data.type + '-' + curItem.data.member;
+ }
+ panel.hide();
+ Docs.ClassLoader.load(cls);
+ },
+ listeners: {
+ itemclick: function(panel, item) {
+ this.handleClick(item);
+ }
+ }
+ });
+
+ panel.render('search-box');
+ panel.hide();
+
+ Ext.get('search-field').on('blur', function(ev, el) {
+ setTimeout(function() {
+ panel.hide();
+ }, 100);
+ });
+ Ext.get('search-field').on('focus', function(ev, el) {
+ panel.show();
+ });
+
+ // When a key is pressed in the search field, search for classes, methods, properties, configs, etc
+ Ext.get('search-field').on('keyup', function(ev, el) {
+ // Esc key
+ if (ev.keyCode == 27 || el.value == '') {
+ panel.hide();
+ return;
+ }
+ else {
+ panel.show();
+ }
+
+ var curItem = panel.store.indexOf(panel.getSelectionModel().getLastSelected()),
+ lastItem = panel.store.data.length - 1,
+ selModel = panel.getSelectionModel();
+
+ // Up arrow
+ if (ev.keyCode == 38) {
+ if (curItem == undefined) {
+ selModel.select(0);
+ } else {
+ selModel.select(curItem == 0 ? lastItem : (curItem - 1));
+ }
+ }
+ // Down arrow
+ else if (ev.keyCode == 40) {
+ if (curItem == undefined) {
+ selModel.select(0);
+ } else {
+ selModel.select(curItem == lastItem ? 0 : curItem + 1);
+ }
+ }
+ // Enter key
+ else if (ev.keyCode == 13) {
+ ev.preventDefault();
+ panel.handleClick();
+ }
+ else {
+ searchExt(Ext.get(el).getValue());
+ }
+ });
+
+ Ext.get(Ext.get('search-field').dom.parentNode).on('submit', function(ev, el) {
+ ev.preventDefault();
+ });
+
+ var searchExt = function(term) {
+ searchStore.loadData(filterMembers(term), false);
+ };
+
+ var filterMembers = function(text) {
+ var results = [[], [], []];
+ var safeText = Ext.escapeRe(text);
+ var re0 = new RegExp("^" + safeText + "$", "i");
+ var re1 = new RegExp("^" + safeText, "i");
+ var re2 = new RegExp(safeText, "i");
+ Ext.Array.forEach(allRecords, function(r) {
+ var member = r.get("member");
+ if (re0.test(member)) {
+ results[0].push(r);
+ }
+ else if (re1.test(member)) {
+ results[1].push(r);
+ }
+ else if (re2.test(member)) {
+ results[2].push(r);
+ }
+ });
+ // flatten results array and returns first n results
+ return Ext.Array.flatten(results).slice(0, 10);
+ };
+
+});