(function ($) { Drupal.ModuleFilter = {}; Drupal.ModuleFilter.explode = function(string) { var queryArray = string.match(/([a-zA-Z]+\:(\w+|"[^"]+")*)|\w+|"[^"]+"/g); if (!queryArray) { queryArray = new Array(); } var i = queryArray.length; while (i--) { queryArray[i] = queryArray[i].replace(/"/g, ""); } return queryArray; }; Drupal.ModuleFilter.getState = function(key) { if (!Drupal.ModuleFilter.state) { Drupal.ModuleFilter.state = {}; var cookie = $.cookie('DrupalModuleFilter'); var query = cookie ? cookie.split('&') : []; if (query) { for (var i in query) { // Extra check to avoid js errors in Chrome, IE and Safari when // combined with JS like twitter's widget.js. // See http://drupal.org/node/798764. if (typeof(query[i]) == 'string' && query[i].indexOf('=') != -1) { var values = query[i].split('='); if (values.length === 2) { Drupal.ModuleFilter.state[values[0]] = values[1]; } } } } } return Drupal.ModuleFilter.state[key] ? Drupal.ModuleFilter.state[key] : false; }; Drupal.ModuleFilter.setState = function(key, value) { var existing = Drupal.ModuleFilter.getState(key); if (existing != value) { Drupal.ModuleFilter.state[key] = value; var query = []; for (var i in Drupal.ModuleFilter.state) { query.push(i + '=' + Drupal.ModuleFilter.state[i]); } $.cookie('DrupalModuleFilter', query.join('&'), { expires: 7, path: '/' }); } }; Drupal.ModuleFilter.Filter = function(element, selector, options) { var self = this; this.element = element; this.text = $(this.element).val(); this.settings = Drupal.settings.moduleFilter; this.selector = selector; this.options = $.extend({ delay: 500, striping: false, childSelector: null, empty: Drupal.t('No results'), rules: new Array() }, options); if (this.options.wrapper == undefined) { this.options.wrapper = $(self.selector).parent(); } // Add clear button. this.element.after('
' + Drupal.t('clear') + '
'); if (this.text) { $('.module-filter-clear a', this.element.parent()).removeClass('js-hide'); } $('.module-filter-clear a', this.element.parent()).click(function() { self.element.val(''); self.text = ''; delete self.queries; self.applyFilter(); self.element.focus(); $(this).addClass('js-hide'); return false; }); this.updateQueries = function() { var queryStrings = Drupal.ModuleFilter.explode(self.text); self.queries = new Array(); for (var i in queryStrings) { var query = { operator: 'text', string: queryStrings[i] }; if (self.operators != undefined) { // Check if an operator is possibly used. if (queryStrings[i].indexOf(':') > 0) { // Determine operator used. var args = queryStrings[i].split(':', 2); var operator = args.shift(); if (self.operators[operator] != undefined) { query.operator = operator; query.string = args.shift(); } } } query.string = query.string.toLowerCase(); self.queries.push(query); } if (self.queries.length <= 0) { // Add a blank string query. self.queries.push({ operator: 'text', string: '' }); } }; this.applyFilter = function() { self.results = new Array(); self.updateQueries(); if (self.index == undefined) { self.buildIndex(); } self.element.trigger('moduleFilter:start'); $.each(self.index, function(key, item) { var $item = item.element; for (var i in self.queries) { var query = self.queries[i]; if (query.operator == 'text') { if (item.text.indexOf(query.string) < 0) { continue; } } else { var func = self.operators[query.operator]; if (!(func(query.string, self, item))) { continue; } } var rulesResult = self.processRules(item); if (rulesResult !== false) { return true; } } $item.addClass('js-hide'); }); self.element.trigger('moduleFilter:finish', { results: self.results }); if (self.options.striping) { self.stripe(); } if (self.results.length > 0) { self.options.wrapper.find('.module-filter-no-results').remove(); } else { if (!self.options.wrapper.find('.module-filter-no-results').length) { self.options.wrapper.append($('

').text(self.options.empty)); }; } }; self.element.keyup(function(e) { switch (e.which) { case 13: if (self.timeOut) { clearTimeout(self.timeOut); } self.applyFilter(); break; default: if (self.text != $(this).val()) { if (self.timeOut) { clearTimeout(self.timeOut); } self.text = $(this).val(); if (self.text) { self.element.parent().find('.module-filter-clear a').removeClass('js-hide'); } else { self.element.parent().find('.module-filter-clear a').addClass('js-hide'); } self.element.trigger('moduleFilter:keyup'); self.timeOut = setTimeout(self.applyFilter, self.options.delay); } break; } }); self.element.keypress(function(e) { if (e.which == 13) e.preventDefault(); }); }; Drupal.ModuleFilter.Filter.prototype.buildIndex = function() { var self = this; var index = new Array(); $(this.selector).each(function(i) { var text = (self.options.childSelector) ? $(self.options.childSelector, this).text() : $(this).text(); var item = { key: i, element: $(this), text: text.toLowerCase() }; for (var j in self.options.buildIndex) { var func = self.options.buildIndex[j]; item = $.extend(func(self, item), item); } $(this).data('indexKey', i); index.push(item); delete item; }); this.index = index; }; Drupal.ModuleFilter.Filter.prototype.processRules = function(item) { var self = this; var $item = item.element; var rulesResult = true; if (self.options.rules.length > 0) { for (var i in self.options.rules) { var func = self.options.rules[i]; rulesResult = func(self, item); if (rulesResult === false) { break; } } } if (rulesResult !== false) { $item.removeClass('js-hide'); self.results.push(item); } return rulesResult; }; Drupal.ModuleFilter.Filter.prototype.stripe = function() { var self = this; var flip = { even: 'odd', odd: 'even' }; var stripe = 'odd'; $.each(self.index, function(key, item) { if (!item.element.hasClass('js-hide')) { item.element.removeClass('odd even') .addClass(stripe); stripe = flip[stripe]; } }); }; $.fn.moduleFilter = function(selector, options) { var filterInput = this; filterInput.parents('.module-filter-inputs-wrapper').show(); if (Drupal.settings.moduleFilter.setFocus) { filterInput.focus(); } if (Drupal.settings.moduleFilter.expandedDescription) { $('#system-modules td.description .inner.expand').addClass('expanded'); } filterInput.data('moduleFilter', new Drupal.ModuleFilter.Filter(this, selector, options)); }; })(jQuery);