123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271 |
- (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('<div class="module-filter-clear"><a href="#" class="js-hide">' + Drupal.t('clear') + '</a></div>');
- 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($('<p class="module-filter-no-results"/>').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();
- }
- filterInput.data('moduleFilter', new Drupal.ModuleFilter.Filter(this, selector, options));
- };
- })(jQuery);
|