Upgrade to ExtJS 4.0.1 - Released 05/18/2011
[extjs.git] / docs / js / search.js
1 // Search box
2 Ext.onReady(function() {
3     var searchStore = new Ext.data.Store({
4         fields: ['cls', 'member', 'type', 'doc'],
5         proxy: {
6             type: 'memory',
7             reader: {
8                 type: 'json'
9             }
10         }
11     });
12     // This is the global object read from /output/members.js
13     searchStore.loadData(Docs.membersData.data);
14     var allRecords = searchStore.getRange();
15     searchStore.removeAll();
16
17     var panel = Ext.create('Ext.view.View', {
18         store: searchStore,
19         tpl: new Ext.XTemplate(
20             '<tpl for=".">',
21                 '<div class="item {type}">',
22                     '<div class="title">{member}</div>',
23                     '<div class="class">{cls}</div>',
24                 '</div>',
25             '</tpl>'
26         ),
27         id: 'quick-search',
28         overItemCls:'x-view-over',
29         trackOver: true,
30         itemSelector:'div.item',
31         singleSelect: true,
32
33         handleClick: function(curItem) {
34             curItem = curItem || panel.getSelectionModel().getLastSelected();
35             var cls = curItem.data.cls;
36             if (curItem.data.type != 'cls') {
37                 cls += '-' + curItem.data.type + '-' + curItem.data.member;
38             }
39             panel.hide();
40             Docs.ClassLoader.load(cls);
41         },
42         listeners: {
43             itemclick: function(panel, item) {
44                 this.handleClick(item);
45             }
46         }
47     });
48
49     panel.render('search-box');
50     panel.hide();
51
52     Ext.get('search-field').on('blur', function(ev, el) {
53         setTimeout(function() {
54             panel.hide();
55         }, 100);
56     });
57     Ext.get('search-field').on('focus', function(ev, el) {
58         panel.show();
59     });
60
61     // When a key is pressed in the search field, search for classes, methods, properties, configs, etc
62     Ext.get('search-field').on('keyup', function(ev, el) {
63         // Esc key
64         if (ev.keyCode == 27 || el.value == '') {
65             panel.hide();
66             return;
67         }
68         else {
69             panel.show();
70         }
71
72         var curItem = panel.store.indexOf(panel.getSelectionModel().getLastSelected()),
73             lastItem = panel.store.data.length - 1,
74             selModel = panel.getSelectionModel();
75
76         // Up arrow
77         if (ev.keyCode == 38) {
78             if (curItem == undefined) {
79                 selModel.select(0);
80             } else {
81                 selModel.select(curItem == 0 ? lastItem : (curItem - 1));
82             }
83         }
84         // Down arrow
85         else if (ev.keyCode == 40) {
86             if (curItem == undefined) {
87                 selModel.select(0);
88             } else {
89                 selModel.select(curItem == lastItem ? 0 : curItem + 1);
90             }
91         }
92         // Enter key
93         else if (ev.keyCode == 13) {
94             ev.preventDefault();
95             panel.handleClick();
96         }
97         else {
98             searchExt(Ext.get(el).getValue());
99         }
100     });
101
102     Ext.get(Ext.get('search-field').dom.parentNode).on('submit', function(ev, el) {
103         ev.preventDefault();
104     });
105
106     var searchExt = function(term) {
107         searchStore.loadData(filterMembers(term), false);
108     };
109
110     var filterMembers = function(text) {
111         var results = [[], [], []];
112         var safeText = Ext.escapeRe(text);
113         var re0 = new RegExp("^" + safeText + "$", "i");
114         var re1 = new RegExp("^" + safeText, "i");
115         var re2 = new RegExp(safeText, "i");
116         Ext.Array.forEach(allRecords, function(r) {
117             var member = r.get("member");
118             if (re0.test(member)) {
119                 results[0].push(r);
120             }
121             else if (re1.test(member)) {
122                 results[1].push(r);
123             }
124             else if (re2.test(member)) {
125                 results[2].push(r);
126             }
127         });
128         // flatten results array and returns first n results
129         return Ext.Array.flatten(results).slice(0, 10);
130     };
131
132 });