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(' '); } // Parse a string into a list of operators (see below). exports.parse = function (str) { var operators = []; var search_term = []; $.each(str.split(/ +/), function (idx, token) { var parts, operator; if (token.length === 0) return; parts = token.split(':'); if (parts.length > 1) { // Looks like an operator. // FIXME: Should we skip unknown operator names here? operator = parts.shift(); operators.push([operator, decodeURIComponent(parts.join(':'))]); } else { // Looks like a normal search term. search_term.push(token); } }); if (search_term.length > 0) operators.push(['search', search_term.join(' ').toLowerCase()]); return operators; }; // 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