auto import from //depot/cupcake/@135843
diff --git a/tools/droiddoc/templates/assets/search_autocomplete.js b/tools/droiddoc/templates/assets/search_autocomplete.js
new file mode 100644
index 0000000..2e12e0f
--- /dev/null
+++ b/tools/droiddoc/templates/assets/search_autocomplete.js
@@ -0,0 +1,173 @@
+var gSelectedIndex = -1;
+var gSelectedID = -1;
+var gMatches = new Array();
+var gLastText = "";
+var ROW_COUNT = 30;
+var gInitialized = false;
+var DEFAULT_TEXT = "search developer docs";
+
+function set_row_selected(row, selected)
+{
+    var c1 = row.cells[0];
+  //  var c2 = row.cells[1];
+    if (selected) {
+        c1.className = "jd-autocomplete jd-selected";
+  //      c2.className = "jd-autocomplete jd-selected jd-linktype";
+    } else {
+        c1.className = "jd-autocomplete";
+  //      c2.className = "jd-autocomplete jd-linktype";
+    }
+}
+
+function set_row_values(toroot, row, match)
+{
+    var link = row.cells[0].childNodes[0];
+    link.innerHTML = match.label;
+    link.href = toroot + match.link
+  //  row.cells[1].innerHTML = match.type;
+}
+
+function sync_selection_table(toroot)
+{
+    var filtered = document.getElementById("search_filtered");
+    var r; //TR DOM object
+    var i; //TR iterator
+    gSelectedID = -1;
+
+    filtered.onmouseover = function() { 
+        if(gSelectedIndex >= 0) {
+          set_row_selected(this.rows[gSelectedIndex], false);
+          gSelectedIndex = -1;
+        }
+    }
+
+    //initialize the table; draw it for the first time (but not visible).
+    if (!gInitialized) {
+        for (i=0; i<ROW_COUNT; i++) {
+            var r = filtered.insertRow(-1);
+            var c1 = r.insertCell(-1);
+        //    var c2 = r.insertCell(-1);
+            c1.className = "jd-autocomplete";
+         //   c2.className = "jd-autocomplete jd-linktype";
+            var link = document.createElement("a");
+            c1.onmousedown = function() {
+                window.location = this.firstChild.getAttribute("href");
+            }
+            c1.onmouseover = function() {
+                this.className = this.className + " jd-selected";
+            }
+            c1.onmouseout = function() {
+                this.className = "jd-autocomplete";
+            }
+            c1.appendChild(link);
+        }
+  /*      var r = filtered.insertRow(-1);
+        var c1 = r.insertCell(-1);
+        c1.className = "jd-autocomplete jd-linktype";
+        c1.colSpan = 2; */
+        gInitialized = true;
+    }
+
+    //if we have results, make the table visible and initialize result info
+    if (gMatches.length > 0) {
+        document.getElementById("search_filtered_div").className = "showing";
+        var N = gMatches.length < ROW_COUNT ? gMatches.length : ROW_COUNT;
+        for (i=0; i<N; i++) {
+            r = filtered.rows[i];
+            r.className = "show-row";
+            set_row_values(toroot, r, gMatches[i]);
+            set_row_selected(r, i == gSelectedIndex);
+            if (i == gSelectedIndex) {
+                gSelectedID = gMatches[i].id;
+            }
+        }
+        //start hiding rows that are no longer matches
+        for (; i<ROW_COUNT; i++) {
+            r = filtered.rows[i];
+            r.className = "no-display";
+        }
+        //if there are more results we're not showing, so say so.
+/*      if (gMatches.length > ROW_COUNT) {
+            r = filtered.rows[ROW_COUNT];
+            r.className = "show-row";
+            c1 = r.cells[0];
+            c1.innerHTML = "plus " + (gMatches.length-ROW_COUNT) + " more"; 
+        } else {
+            filtered.rows[ROW_COUNT].className = "hide-row";
+        }*/
+    //if we have no results, hide the table
+    } else {
+        document.getElementById("search_filtered_div").className = "no-display";
+    }
+}
+
+function search_changed(e, kd, toroot)
+{
+    var search = document.getElementById("search_autocomplete");
+    var text = search.value;
+
+    // 13 = enter
+    if (!kd && (e.keyCode == 13)) {
+        document.getElementById("search_filtered_div").className = "no-display";
+        if (gSelectedIndex >= 0) {
+            window.location = toroot + gMatches[gSelectedIndex].link;
+            return false;
+        }
+    }
+    // 38 -- arrow up
+    else if (kd && (e.keyCode == 38)) {
+        if (gSelectedIndex >= 0) {
+            gSelectedIndex--;
+        }
+        sync_selection_table(toroot);
+        return false;
+    }
+    // 40 -- arrow down
+    else if (kd && (e.keyCode == 40)) {
+        if (gSelectedIndex < gMatches.length-1
+                        && gSelectedIndex < ROW_COUNT-1) {
+            gSelectedIndex++;
+        }
+        sync_selection_table(toroot);
+        return false;
+    }
+    else if (!kd) {
+        gMatches = new Array();
+        matchedCount = 0;
+        gSelectedIndex = -1;
+        for (i=0; i<DATA.length; i++) {
+            var s = DATA[i];
+            if (text.length != 0 && s.label.indexOf(text) != -1) {
+                gMatches[matchedCount] = s;
+                if (gSelectedID == s.id) {
+                    gSelectedIndex = matchedCount;
+                }
+                matchedCount++;
+            }
+        }
+        sync_selection_table(toroot);
+        return true; // allow the event to bubble up to the search api
+    }
+}
+
+function search_focus_changed(obj, focused)
+{
+    if (focused) {
+        if(obj.value == DEFAULT_TEXT){
+            obj.value = "";
+            obj.style.color="#000000";
+        }
+    } else {
+        if(obj.value == ""){
+          obj.value = DEFAULT_TEXT;
+          obj.style.color="#aaaaaa";
+        }
+        document.getElementById("search_filtered_div").className = "no-display";
+    }
+}
+
+function submit_search() {
+  var query = document.getElementById('search_autocomplete').value;
+  document.location = '/search.html#q=' + query; 
+  return false;
+}