init_controls_from_prefs: function() { var prefs = Cookies.getJSON('prefs'); if (!prefs) { prefs = {}; } if (prefs['regex'] !== undefined) { CodesearchUI.input_regex.prop('checked', prefs['regex']); } if (prefs['repos'] !== undefined) { RepoSelector.updateSelected(prefs['repos']); } else if (CodesearchUI.defaultSearchRepos !== undefined) { RepoSelector.updateSelected(CodesearchUI.defaultSearchRepos); } if (prefs['context'] !== undefined) { CodesearchUI.input_context.prop('checked', prefs['context']); } },
onload: function() { if (CodesearchUI.input) return; CodesearchUI.view = new ResultView({model: CodesearchUI.state}); CodesearchUI.input = $('#searchbox'); CodesearchUI.input_repos = $('#repos'); CodesearchUI.input_backend = $('#backend'); if (CodesearchUI.input_backend.length == 0) CodesearchUI.input_backend = null; CodesearchUI.inputs_case = $('input[name=fold_case]'); CodesearchUI.input_regex = $('input[name=regex]'); CodesearchUI.input_context = $('input[name=context]'); if (CodesearchUI.inputs_case.filter(':checked').length == 0) { CodesearchUI.inputs_case.filter('[value=auto]').attr('checked', true); } RepoSelector.init(); CodesearchUI.update_repo_options(); CodesearchUI.init_query(); CodesearchUI.input.keydown(CodesearchUI.keypress); CodesearchUI.input.bind('paste', CodesearchUI.keypress); CodesearchUI.input.focus(); if (CodesearchUI.input_backend) CodesearchUI.input_backend.change(CodesearchUI.select_backend); CodesearchUI.inputs_case.change(CodesearchUI.keypress); CodesearchUI.input_regex.change(CodesearchUI.keypress); CodesearchUI.input_repos.change(CodesearchUI.keypress); CodesearchUI.input_context.change(CodesearchUI.toggle_context); CodesearchUI.input_regex.change(function(){ CodesearchUI.set_pref('regex', CodesearchUI.input_regex.prop('checked')); }); CodesearchUI.input_repos.change(function(){ CodesearchUI.set_pref('repos', CodesearchUI.input_repos.val()); }); CodesearchUI.input_context.change(function(){ CodesearchUI.set_pref('context', CodesearchUI.input_context.prop('checked')); }); CodesearchUI.toggle_context(); Codesearch.connect(CodesearchUI); // Update the search when the user hits Forward or Back. window.onpopstate = function(event) { var parms = CodesearchUI.parse_query_params(); CodesearchUI.init_query_from_parms(parms); CodesearchUI.newsearch(); } },
init_query_from_parms: function(parms) { var q = []; if (parms.q) q.push(parms.q[0]); if (parms.file) q.push("file:" + parms.file[0]); CodesearchUI.input.val(q.join(' ')); if (parms.fold_case) { CodesearchUI.inputs_case.filter('[value='+parms.fold_case[0]+']').attr('checked', true); } if (parms.regex) { CodesearchUI.input_regex.prop('checked', parms.regex[0] === "true"); } if (parms.context) { CodesearchUI.input_context.prop('checked', parms.context[0] === 'true'); } var backend = null; if (parms.backend) backend = parms.backend; var m; if (m = (new RegExp("/search/([^\/]+)/?").exec(window.location.pathname))) { backend = m[1]; } if (backend && CodesearchUI.input_backend) { var old_backend = CodesearchUI.input_backend.val(); CodesearchUI.input_backend.val(backend); // Something (bootstrap-select?) messes with the behaviour of val() on // normal select elements, so that trying to set an invalid value sets // null, rather than leaving the value unchanged. We manually check and // roll back if that happens (e.g. because someone navigated to a URL // like "/search/bogus?q=foo"). if (CodesearchUI.input_backend.val() === null) { CodesearchUI.input_backend.val(old_backend); } } var repos = []; if (parms.repo) repos = repos.concat(parms.repo); if (parms['repo[]']) repos = repos.concat(parms['repo[]']); RepoSelector.updateSelected(repos); },
update_repo_options: function(repos) { if (!CodesearchUI.input_backend) return; var backend = CodesearchUI.input_backend.val(); RepoSelector.updateOptions(_.keys(CodesearchUI.repo_urls[backend])); },