jui.defineUI("ui.autocomplete", [ "jquery", "util.base", "ui.dropdown" ], function($, _, dropdown) { /** * @class ui.autocomplete * Auto complete component that shows a list of keywords containing the input value when inputting a string in a text box * * @extends core * @requires jquery * @requires util.base * @requires ui.dropdown */ var UI = function() { var ddUi = null, target = null, words = [], list = []; function createDropdown(self, words) { if(words.length == 0) { if(ddUi) ddUi.hide(); return; } else { if(ddUi) $(ddUi.root).remove(); } var pos = $(self.root).position(), $ddObj = $(self.tpl.words({ words: words })); $(self.options.parent).append($ddObj); ddUi = dropdown($ddObj, { keydown: true, width: $(self.root).outerWidth(), height: self.options.height, left: pos.left, top: pos.top + $(self.root).outerHeight(), event: { change: function(data, e) { $(target).val(data.text); self.emit("change", [ data.text, e ]); } } }); if(self.options.dx > 0 || self.options.dy > 0) { ddUi.show(self.options.dx, self.options.dy); } else { ddUi.show(); } } function getFilteredWords(word) { var result = []; if(word != "") { for(var i = 0; i < words.length; i++) { var origin = words[i], a = words[i].toLowerCase(), b = word.toLowerCase(); if(a.indexOf(b) != -1) { result.push(origin); } } } return result; } function setEventKeyup(self) { self.addEvent(target, "keyup", function(e) { if(e.which == 38 || e.which == 40 || e.which == 13) return; list = getFilteredWords($(this).val()); createDropdown(self, list); return false; }); if(self.options.showAll) { self.addEvent(target, "focus", function(e) { if($(this).val() == "") { list = words; createDropdown(self, list); return false; } }); } } this.init = function() { var opts = this.options; // 타겟 엘리먼트 설정 target = (opts.target == null) ? this.root : $(this.root).find(opts.target); // 키-업 이벤트 설정 setEventKeyup(this); // 단어 업데이트 this.update(opts.words); } /** * @method update * Updates words subject to autofill * * @param {Array} words */ this.update = function(newWords) { words = newWords; } /** * @method close * Close the active drop-down * */ this.close = function() { if(ddUi) ddUi.hide(); } /** * @method list * Gets filtered words subject to autofill * * @return {Array} words */ this.list = function() { return list; } } UI.setup = function() { return { parent: "body", /** * @cfg {String/DOMElement} [target=null] * Designates a target selector when an autofill route is not a target */ target: null, /** * @cfg {Array} words * Designates words subject to autofill */ words: [], /** * @cfg {Boolean} showAll * When 'focus' event occur, show all words */ showAll: false, dx: 0, dy: 0, height: "auto" } } /** * @event change * Event that occurs when you click on a dropdown that shows a word list * * @param {String} word Changed word */ return UI; });