/* * Fuel UX Search * https://github.com/ExactTarget/fuelux * * Copyright (c) 2012 ExactTarget * Licensed under the MIT license. */ define(['require','jquery'],function(require) { var $ = require('jquery'); // SEARCH CONSTRUCTOR AND PROTOTYPE var Search = function (element, options) { this.$element = $(element); this.options = $.extend({}, $.fn.search.defaults, options); this.$button = this.$element.find('button') .on('click', $.proxy(this.buttonclicked, this)); this.$input = this.$element.find('input') .on('keydown', $.proxy(this.keypress, this)) .on('keyup', $.proxy(this.keypressed, this)); this.$icon = this.$element.find('i'); this.activeSearch = ''; }; Search.prototype = { constructor: Search, search: function (searchText) { this.$icon.attr('class', 'icon-remove'); this.activeSearch = searchText; this.$element.trigger('searched', searchText); }, clear: function () { this.$icon.attr('class', 'icon-search'); this.activeSearch = ''; this.$input.val(''); this.$element.trigger('cleared'); }, action: function () { var val = this.$input.val(); var inputEmptyOrUnchanged = val === '' || val === this.activeSearch; if (this.activeSearch && inputEmptyOrUnchanged) { this.clear(); } else if (val) { this.search(val); } }, buttonclicked: function (e) { e.preventDefault(); if ($(e.currentTarget).is('.disabled, :disabled')) return; this.action(); }, keypress: function (e) { if (e.which === 13) { e.preventDefault(); } }, keypressed: function (e) { var val, inputPresentAndUnchanged; if (e.which === 13) { e.preventDefault(); this.action(); } else { val = this.$input.val(); inputPresentAndUnchanged = val && (val === this.activeSearch); this.$icon.attr('class', inputPresentAndUnchanged ? 'icon-remove' : 'icon-search'); } }, disable: function () { this.$input.attr('disabled', 'disabled'); this.$button.addClass('disabled'); }, enable: function () { this.$input.removeAttr('disabled'); this.$button.removeClass('disabled'); } }; // SEARCH PLUGIN DEFINITION $.fn.search = function (option) { return this.each(function () { var $this = $(this); var data = $this.data('search'); var options = typeof option === 'object' && option; if (!data) $this.data('search', (data = new Search(this, options))); if (typeof option === 'string') data[option](); }); }; $.fn.search.defaults = {}; $.fn.search.Constructor = Search; // SEARCH DATA-API $(function () { $('body').on('mousedown.search.data-api', '.search', function () { var $this = $(this); if ($this.data('search')) return; $this.search($this.data()); }); }); });