var narrow = (function () { var exports = {}; // For tracking where you were before you narrowed. var persistent_message_id = 0; // For narrowing based on a particular message var target_id = 0; var filter_function = false; exports.active = function () { // Cast to bool return !!filter_function; }; exports.predicate = function () { if (filter_function) { return filter_function; } else { return function () { return true; }; } }; var show_floating_recipient; var allow_collapse; exports.show_floating_recipient = function () { return (!filter_function) || show_floating_recipient; }; exports.allow_collapse = function () { return (!filter_function) || allow_collapse; }; /* Convert a list of operators to a string. Each operator is a key-value pair like ['subject', 'my amazing subject'] These are not keys in a JavaScript object, because we might need to support multiple operators of the same type. */ function unparse(operators) { var parts = []; $.each(operators, function (index, elem) { var operator = elem[0]; if (operator === 'search') { // Search terms are the catch-all case. // All tokens that don't start with a known operator and // a colon are glued together to form a search term. parts.push(elem[1]); } else { // FIXME: URI encoding will look really ugly parts.push(elem[0] + ':' + encodeURIComponent(elem[1])); } }); return parts.join(' '); } // Build a filter function from a list of operators. function build_filter(operators) { // FIXME: This is probably pretty slow. // We could turn it into something more like a compiler: // build JavaScript code in a string and then eval() it. return function (message) { var operand, i; for (i=0; i