Upgrade to ExtJS 4.0.1 - Released 05/18/2011
[extjs.git] / docs / js / search.js
diff --git a/docs/js/search.js b/docs/js/search.js
new file mode 100644 (file)
index 0000000..72a25e7
--- /dev/null
@@ -0,0 +1,132 @@
+// 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);
+    };
+
+});