(function() { var $ = jQuery; // Handle namespaced jQuery // The model that holds individual search facets and their categories. // Held in a collection by `VS.app.searchQuery`. VS.model.SearchFacet = Backbone.Model.extend({ // Extract the category and value and serialize it in preparation for // turning the entire searchBox into a search query that can be sent // to the server for parsing and searching. serialize : function() { var category = this.quoteCategory(this.get('category')); var value = VS.utils.inflector.trim(this.get('value')); var remainder = this.get("app").options.remainder; if (!value) return ''; if (!_.contains(this.get("app").options.unquotable || [], category) && category != remainder) { value = this.quoteValue(value); } if (category != remainder) { category = category + ': '; } else { category = ""; } return category + value; }, // Wrap categories that have spaces or any kind of quote with opposite matching // quotes to preserve the complex category during serialization. quoteCategory : function(category) { var hasDoubleQuote = (/"/).test(category); var hasSingleQuote = (/'/).test(category); var hasSpace = (/\s/).test(category); if (hasDoubleQuote && !hasSingleQuote) { return "'" + category + "'"; } else if (hasSpace || (hasSingleQuote && !hasDoubleQuote)) { return '"' + category + '"'; } else { return category; } }, // Wrap values that have quotes in opposite matching quotes. If a value has // both single and double quotes, just use the double quotes. quoteValue : function(value) { var hasDoubleQuote = (/"/).test(value); var hasSingleQuote = (/'/).test(value); if (hasDoubleQuote && !hasSingleQuote) { return "'" + value + "'"; } else { return '"' + value + '"'; } }, // If provided, use a custom label instead of the raw value. label : function() { return this.get('label') || this.get('value'); } }); })();