var Admin = Admin || {}; Admin.Search = (function () { var itemTemplate = function (data) { var path = function () { if (data.grandParent) { return $("

").text([data.grandParent, data.parent].join(" > ")).html(); } else { return data.parent; } }; var result = '

' + "
" + data.title + "
"; if (path()) { result = result + path(); } result = result + "
"; return result; }; var substringMatcher = function (enumerate) { var byRateAndTitle = function (a, b) { if (a.rate < b.rate) return 1; if (a.rate > b.rate) return -1; if (a.title < b.title) return -1; if (a.title > b.title) return 1; return 0; }; return function findMatches(q, cb) { var matches = []; var substrRegex = new RegExp(q, "i"); enumerate(function (item) { var rate = item.rate || 0; var missKeyword = false; if (item.link == "#") { missKeyword = true; } else if (substrRegex.test(item.title)) { rate += 10; } else if (item.node && substrRegex.test(item.node)) { rate += 5; } else if (substrRegex.test(item.root)) { rate += 1; } else { missKeyword = true; } item.rate = rate; if (!missKeyword) { matches.push(item); } }); matches.sort(byRateAndTitle); cb(matches); }; }; return { init: function () { Admin.Navigation.initOnce(); var $input = $(".admin-search-box"); $input.blur(function (e) { e.preventDefault(); e.stopPropagation(); }); $input.typeahead({ minLength: 2, highlight: true, hint: false }, { name: "pages", displayKey: "name", templates: { empty: [ '
', "NO RESULTS", "
" ].join("\n"), suggestion: itemTemplate }, source: substringMatcher(Admin.Navigation.enumerate), limit: 10 }); var navigateTo = function (item) { $input.typeahead("val", ""); Admin.Navigation.open(item.link); }; $input.on("typeahead:selected", function (e, item) { navigateTo(item); }); } }; })();