diff --git a/.gitignore b/.gitignore index f9b91e5..2f9228c 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -.bin \ No newline at end of file +.bin +*~ diff --git a/src/areacomplete.js b/src/areacomplete.js index 94c450f..221da34 100644 --- a/src/areacomplete.js +++ b/src/areacomplete.js @@ -8,294 +8,294 @@ */ (function($){ - /** - * @param obj - * @attr wordCount {Number} the number of words the user want to for matching it with the dictionary - * @attr mode {String} set "outter" for using an autocomplete that is being displayed in the outter layout of the textarea, as opposed to inner display + /** + * @param obj + * @attr wordCount {Number} the number of words the user want to for matching it with the dictionary + * @attr mode {String} set "outter" for using an autocomplete that is being displayed in the outter layout of the textarea, as opposed to inner display * @attr highlight {Boolean} whether to highlight the searched string in the suggestion list * @attr triggers {optional Array} the list of characters that "trigger" completion when typed at the beginning of a word * triggers excludes wordCount - * @attr on {Object} containing the followings: - * @attr query {Function} will be called to query if there is any match for the user input - * The function will be called with parameters: - * - text {String} the word(s) that need to be completed - * - cb {Function} the callback that must be called to return results. Call it with either - * - a list of strings - * - a list of objects having attributes: display (what to show in the dropdown) and value (what to insert in the textarea) - * - trigger {optional String} the leading character that triggered this autocompletion request (if any) - * @attr valueChanged {optional Function} will be called to notify when the content has changed - */ - $.fn.areacomplete = function(obj){ - if( typeof $.browser.msie != 'undefined' ) obj.mode = 'outter'; - this.each(function(index,element){ - if( element.nodeName == 'TEXTAREA' ){ - makeAutoComplete(element,obj); - } - }); - } - - var browser = {isChrome: $.browser.webkit }; - - function getTextAreaSelectionEnd(ta) { - var textArea = ta;//document.getElementById('textarea1'); - if (document.selection) { //IE - var bm = document.selection.createRange().getBookmark(); - var sel = textArea.createTextRange(); - sel.moveToBookmark(bm); - var sleft = textArea.createTextRange(); - sleft.collapse(true); - sleft.setEndPoint("EndToStart", sel); - return sleft.text.length + sel.text.length; - } - return textArea.selectionEnd; //ff & chrome - } - - function getDefaultCharArray(){ - return { - '`':0, - '~':0, - '1':0, - '!':0, - '2':0, - '@':0, - '3':0, - '#':0, - '4':0, - '$':0, - '5':0, - '%':0, - '6':0, - '^':0, - '7':0, - '&':0, - '8':0, - '*':0, - '9':0, - '(':0, - '0':0, - ')':0, - '-':0, - '_':0, - '=':0, - '+':0, - 'q':0, - 'Q':0, - 'w':0, - 'W':0, - 'e':0, - 'E':0, - 'r':0, - 'R':0, - 't':0, - 'T':0, - 'y':0, - 'Y':0, - 'u':0, - 'U':0, - 'i':0, - 'I':0, - 'o':0, - 'O':0, - 'p':0, - 'P':0, - '[':0, - '{':0, - ']':0, - '}':0, - 'a':0, - 'A':0, - 's':0, - 'S':0, - 'd':0, - 'D':0, - 'f':0, - 'F':0, - 'g':0, - 'G':0, - 'h':0, - 'H':0, - 'j':0, - 'J':0, - 'k':0, - 'K':0, - 'l':0, - 'L':0, - ';':0, - ':':0, - '\'':0, - '"':0, - '\\':0, - '|':0, - 'z':0, - 'Z':0, - 'x':0, - 'X':0, - 'c':0, - 'C':0, - 'v':0, - 'V':0, - 'b':0, - 'B':0, - 'n':0, - 'N':0, - 'm':0, - 'M':0, - ',':0, - '<':0, - '.':0, - '>':0, - '/':0, - '?':0, - ' ':0 - }; - } - - - function setCharSize(data){ - for( var ch in data.chars ){ - if( ch == ' ' ) $(data.clone).html(" "); - else $(data.clone).html(""+ch+""); - var testWidth = $("#test-width_"+data.id).width(); - data.chars[ch] = testWidth; - } - } - - var _data = {}; - var _count = 0; - function makeAutoComplete(ta,obj){ - _count++; - _data[_count] = { - id:"auto_"+_count, - ta:ta, - wordCount:obj.wordCount, + * @attr on {Object} containing the followings: + * @attr query {Function} will be called to query if there is any match for the user input + * The function will be called with parameters: + * - text {String} the word(s) that need to be completed + * - cb {Function} the callback that must be called to return results. Call it with either + * - a list of strings + * - a list of objects having attributes: display (what to show in the dropdown) and value (what to insert in the textarea) + * - trigger {optional String} the leading character that triggered this autocompletion request (if any) + * @attr valueChanged {optional Function} will be called to notify when the content has changed + */ + $.fn.areacomplete = function(obj){ + if( typeof $.browser.msie != 'undefined' ) obj.mode = 'outter'; + this.each(function(index,element){ + if( element.nodeName == 'TEXTAREA' ){ + makeAutoComplete(element,obj); + } + }); + } + + var browser = {isChrome: $.browser.webkit }; + + function getTextAreaSelectionEnd(ta) { + var textArea = ta;//document.getElementById('textarea1'); + if (document.selection) { //IE + var bm = document.selection.createRange().getBookmark(); + var sel = textArea.createTextRange(); + sel.moveToBookmark(bm); + var sleft = textArea.createTextRange(); + sleft.collapse(true); + sleft.setEndPoint("EndToStart", sel); + return sleft.text.length + sel.text.length; + } + return textArea.selectionEnd; //ff & chrome + } + + function getDefaultCharArray(){ + return { + '`':0, + '~':0, + '1':0, + '!':0, + '2':0, + '@':0, + '3':0, + '#':0, + '4':0, + '$':0, + '5':0, + '%':0, + '6':0, + '^':0, + '7':0, + '&':0, + '8':0, + '*':0, + '9':0, + '(':0, + '0':0, + ')':0, + '-':0, + '_':0, + '=':0, + '+':0, + 'q':0, + 'Q':0, + 'w':0, + 'W':0, + 'e':0, + 'E':0, + 'r':0, + 'R':0, + 't':0, + 'T':0, + 'y':0, + 'Y':0, + 'u':0, + 'U':0, + 'i':0, + 'I':0, + 'o':0, + 'O':0, + 'p':0, + 'P':0, + '[':0, + '{':0, + ']':0, + '}':0, + 'a':0, + 'A':0, + 's':0, + 'S':0, + 'd':0, + 'D':0, + 'f':0, + 'F':0, + 'g':0, + 'G':0, + 'h':0, + 'H':0, + 'j':0, + 'J':0, + 'k':0, + 'K':0, + 'l':0, + 'L':0, + ';':0, + ':':0, + '\'':0, + '"':0, + '\\':0, + '|':0, + 'z':0, + 'Z':0, + 'x':0, + 'X':0, + 'c':0, + 'C':0, + 'v':0, + 'V':0, + 'b':0, + 'B':0, + 'n':0, + 'N':0, + 'm':0, + 'M':0, + ',':0, + '<':0, + '.':0, + '>':0, + '/':0, + '?':0, + ' ':0 + }; + } + + + function setCharSize(data){ + for( var ch in data.chars ){ + if( ch == ' ' ) $(data.clone).html(" "); + else $(data.clone).html(""+ch+""); + var testWidth = $("#test-width_"+data.id).width(); + data.chars[ch] = testWidth; + } + } + + var _data = {}; + var _count = 0; + function makeAutoComplete(ta,obj){ + _count++; + _data[_count] = { + id:"auto_"+_count, + ta:ta, + wordCount:obj.wordCount, triggers:obj.triggers, highlight: obj.highlight, - on:obj.on, - clone:null, - lineHeight:0, - list:null, - charInLines:{}, - mode:obj.mode, - chars:getDefaultCharArray()}; - - var clone = createClone(_count); - _data[_count].clone = clone; - setCharSize(_data[_count]); - //_data[_count].lineHeight = $(ta).css("font-size"); - _data[_count].list = createList(_data[_count]); - registerEvents(_data[_count]); - } - - function createList(data){ - var ul = document.createElement("ul"); - $(ul).addClass("auto-list"); - document.body.appendChild(ul); - return ul; - } - - function createClone(id){ - var data = _data[id]; - var div = document.createElement("div"); - var offset = $(data.ta).offset(); - offset.top = offset.top - parseInt($(data.ta).css("margin-top")); - offset.left = offset.left - parseInt($(data.ta).css("margin-left")); - //console.log("createClone: offset.top=",offset.top," offset.left=",offset.left); - $(div).css({ - position:"absolute", - top: offset.top, - left: offset.left, - "border-collapse" : $(data.ta).css("border-collapse"), - "border-bottom-style" : $(data.ta).css("border-bottom-style"), - "border-bottom-width" : $(data.ta).css("border-bottom-width"), - "border-left-style" : $(data.ta).css("border-left-style"), - "border-left-width" : $(data.ta).css("border-left-width"), - "border-right-style" : $(data.ta).css("border-right-style"), - "border-right-width" : $(data.ta).css("border-right-width"), - "border-spacing" : $(data.ta).css("border-spacing"), - "border-top-style" : $(data.ta).css("border-top-style"), - "border-top-width" : $(data.ta).css("border-top-width"), - "direction" : $(data.ta).css("direction"), - "font-size-adjust" : $(data.ta).css("font-size-adjust"), - "font-size" : $(data.ta).css("font-size"), - "font-stretch" : $(data.ta).css("font-stretch"), - "font-style" : $(data.ta).css("font-style"), - "font-family" : $(data.ta).css("font-family"), - "font-variant" : $(data.ta).css("font-variant"), - "font-weight" : $(data.ta).css("font-weight"), - "width" : $(data.ta).css("width"), - "height" : $(data.ta).css("height"), - "letter-spacing" : $(data.ta).css("letter-spacing"), - "margin-bottom" : $(data.ta).css("margin-bottom"), - "margin-top" : $(data.ta).css("margin-top"), - "margin-right" : $(data.ta).css("margin-right"), - "margin-left" : $(data.ta).css("margin-left"), - "padding-bottom" : $(data.ta).css("padding-bottom"), - "padding-top" : $(data.ta).css("padding-top"), - "padding-right" : $(data.ta).css("padding-right"), - "padding-left" : $(data.ta).css("padding-left"), - "overflow-x" : "hidden", - "line-height" : $(data.ta).css("line-height"), - "overflow-y" : "hidden", - "z-index" : -10, + on:obj.on, + clone:null, + lineHeight:0, + list:null, + charInLines:{}, + mode:obj.mode, + chars:getDefaultCharArray()}; + + var clone = createClone(_count); + _data[_count].clone = clone; + setCharSize(_data[_count]); + //_data[_count].lineHeight = $(ta).css("font-size"); + _data[_count].list = createList(_data[_count]); + registerEvents(_data[_count]); + } + + function createList(data){ + var ul = document.createElement("ul"); + $(ul).addClass("auto-list"); + document.body.appendChild(ul); + return ul; + } + + function createClone(id){ + var data = _data[id]; + var div = document.createElement("div"); + var offset = $(data.ta).offset(); + offset.top = offset.top - parseInt($(data.ta).css("margin-top")); + offset.left = offset.left - parseInt($(data.ta).css("margin-left")); + //console.log("createClone: offset.top=",offset.top," offset.left=",offset.left); + $(div).css({ + position:"absolute", + top: offset.top, + left: offset.left, + "border-collapse" : $(data.ta).css("border-collapse"), + "border-bottom-style" : $(data.ta).css("border-bottom-style"), + "border-bottom-width" : $(data.ta).css("border-bottom-width"), + "border-left-style" : $(data.ta).css("border-left-style"), + "border-left-width" : $(data.ta).css("border-left-width"), + "border-right-style" : $(data.ta).css("border-right-style"), + "border-right-width" : $(data.ta).css("border-right-width"), + "border-spacing" : $(data.ta).css("border-spacing"), + "border-top-style" : $(data.ta).css("border-top-style"), + "border-top-width" : $(data.ta).css("border-top-width"), + "direction" : $(data.ta).css("direction"), + "font-size-adjust" : $(data.ta).css("font-size-adjust"), + "font-size" : $(data.ta).css("font-size"), + "font-stretch" : $(data.ta).css("font-stretch"), + "font-style" : $(data.ta).css("font-style"), + "font-family" : $(data.ta).css("font-family"), + "font-variant" : $(data.ta).css("font-variant"), + "font-weight" : $(data.ta).css("font-weight"), + "width" : $(data.ta).css("width"), + "height" : $(data.ta).css("height"), + "letter-spacing" : $(data.ta).css("letter-spacing"), + "margin-bottom" : $(data.ta).css("margin-bottom"), + "margin-top" : $(data.ta).css("margin-top"), + "margin-right" : $(data.ta).css("margin-right"), + "margin-left" : $(data.ta).css("margin-left"), + "padding-bottom" : $(data.ta).css("padding-bottom"), + "padding-top" : $(data.ta).css("padding-top"), + "padding-right" : $(data.ta).css("padding-right"), + "padding-left" : $(data.ta).css("padding-left"), + "overflow-x" : "hidden", + "line-height" : $(data.ta).css("line-height"), + "overflow-y" : "hidden", + "z-index" : -10, "visibility": "hidden" - }); - - //console.log("createClone: ta width=",$(data.ta).css("width")," ta clientWidth=",data.ta.clientWidth, "scrollWidth=",data.ta.scrollWidth," offsetWidth=",data.ta.offsetWidth," jquery.width=",$(data.ta).width()); - //i don't know why by chrome adds some pixels to the clientWidth... - data.chromeWidthFix = (data.ta.clientWidth - $(data.ta).width()); - data.lineHeight = $(data.ta).css("line-height"); - if( isNaN(parseInt(data.lineHeight)) ) data.lineHeight = parseInt($(data.ta).css("font-size"))+2; - document.body.appendChild(div); - return div; - } - - /*function breakLongLines(lines,miror){ - var ret = []; - for( var i=0; i"+line+""); - var span = miror.children("span"); - if( span.width()+10 < miror.width()) return [line]; - while( span.width() >= miror.width()-10 ){ - - count++; - var words = line.split(" "); - var left = words.slice(0,words.length-count); - var right = words.slice(words.length-count,words.length); - miror.html(""+left.join(" ")+""); - var span = miror.children("span"); - - ret = [left.join(" "),right.join(" ")]; - } - var arr = breakLine(ret[1],miror); - var ret2= [ret[0]]; - for( var i=0; i"+line+""); + var span = miror.children("span"); + if( span.width()+10 < miror.width()) return [line]; + while( span.width() >= miror.width()-10 ){ + + count++; + var words = line.split(" "); + var left = words.slice(0,words.length-count); + var right = words.slice(words.length-count,words.length); + miror.html(""+left.join(" ")+""); + var span = miror.children("span"); + + ret = [left.join(" "),right.join(" ")]; + } + var arr = breakLine(ret[1],miror); + var ret2= [ret[0]]; + for( var i=0; i= 0 && text.charAt(pos) != '\n'){ - ret.unshift(text.charAt(pos)); - pos--; - if( text.charAt(pos) == ' ' || pos < 0 ){ - wordsFound++; - } - } - return {text: ret.join(""), pos: pos+1, trigger: null}; - } + if( text.charAt(text.length-1) == ' ' || text.charAt(text.length-1) == '\n' ) return ""; + var ret = []; + var wordsFound = 0; + var pos = text.length-1; + while( wordsFound < wordCount && pos >= 0 && text.charAt(pos) != '\n'){ + ret.unshift(text.charAt(pos)); + pos--; + if( text.charAt(pos) == ' ' || pos < 0 ){ + wordsFound++; + } + } + return {text: ret.join(""), pos: pos+1, trigger: null}; + } function getLastTriggerWord(text, triggers) { var ret = []; @@ -345,35 +345,35 @@ text = text.substr(0,selectionEnd); return text; } - - function showList(data, text, list){ - if( !data.listVisible ){ - data.listVisible = true; - var pos = getCursorPosition(data); - $(data.list).css({ - left: pos.left+"px", - top: pos.top+"px", - display: "block" - }); - - } - - var regEx = new RegExp("("+text+")", "i"); - var taWidth = $(data.ta).width()-5; - var width = data.mode == "outter" ? taWidth : ""; - $(data.list).empty(); - for( var i=0; i< list.length; i++ ) - { + + function showList(data, text, list){ + if( !data.listVisible ){ + data.listVisible = true; + var pos = getCursorPosition(data); + $(data.list).css({ + left: pos.left+"px", + top: pos.top+"px", + display: "block" + }); + + } + + var regEx = new RegExp("("+text+")", "i"); + var taWidth = $(data.ta).width()-5; + var width = data.mode == "outter" ? taWidth : ""; + $(data.list).empty(); + for( var i=0; i< list.length; i++ ) + { var listValue, textareaValue; var customData = {}; - if (typeof list[i] == "string") { + if (typeof list[i] == "string") { listValue = list[i]; textareaValue = list[i]; } else { listValue = list[i].display; textareaValue = list[i].value; customData = list[i].data || {}; - } + } if (data.highlight) { listValue = listValue.replace(regEx,"$1") } @@ -381,275 +381,275 @@ .attr({'data-value': textareaValue}) .html(listValue) .data(customData)); - } - } - - function breakLines(text,data){ - var lines = []; - - var width = $(data.clone).width(); - - var line1 = ""; - var line1Width = 0; - var line2Width = 0; - var line2 = ""; - var chSize = data.chars; - - - var len = text.length; - for( var i=0; i"+lines[i]+""); - } - miror.append(""+lines[lines.length-1]+""); - - miror.append(""+restText.replace(/\n/g,"
")+" 
"); - - miror.get(0).scrollTop = ta.scrollTop; - - var span = miror.children("#"+data.id); - var offset = span.offset(); - - return {top:offset.top+span.height(),left:offset.left+span.width()}; - - } - - function getOuterPosition(data){ - var offset = $(data.ta).offset(); - return {top:offset.top+$(data.ta).height()+8,left:offset.left}; - } - - function hideList(data){ - if( data.listVisible ){ - $(data.list).css("display","none"); - data.listVisible = false; - } - } - - function setSelected(dir,data){ - var selected = $(data.list).find("[data-selected=true]"); - if( selected.length != 1 ){ - if( dir > 0 ) $(data.list).find("li:first-child").attr("data-selected","true"); - else $(data.list).find("li:last-child").attr("data-selected","true"); - return; - } - selected.attr("data-selected","false"); - if( dir > 0 ){ - selected.next().attr("data-selected","true"); - } - else{ - selected.prev().attr("data-selected","true"); - } - - } - - function getCurrentSelected(data){ - var selected = $(data.list).find("[data-selected=true]"); - if( selected.length == 1) return selected.get(0); - return null; - } - - function onUserSelected(li,data){ - var selectedText = $(li).attr("data-value"); + //console.log("getCursorPosition: ta width=",$(data.ta).css("width")," ta clientWidth=",data.ta.clientWidth, "scrollWidth=",data.ta.scrollWidth," offsetWidth=",data.ta.offsetWidth," jquery.width=",$(data.ta).width()); + if( browser.isChrome ){ + $(data.clone).width(data.ta.clientWidth-data.chromeWidthFix); + } + else{ + $(data.clone).width(data.ta.clientWidth); + } + + + var ta = data.ta; + var selectionEnd = getTextAreaSelectionEnd(data.ta); + var text = ta.value;//.replace(/ /g," "); + + var subText = text.substr(0,selectionEnd); + var restText = text.substr(selectionEnd,text.length); + + var lines = breakLines(subText,data);//subText.split("\n"); + var miror = $(data.clone); + + miror.html(""); + for( var i=0; i< lines.length-1; i++){ + miror.append("
"+lines[i]+"
"); + } + miror.append(""+lines[lines.length-1]+""); + + miror.append(""+restText.replace(/\n/g,"
")+" 
"); + + miror.get(0).scrollTop = ta.scrollTop; + + var span = miror.children("#"+data.id); + var offset = span.offset(); + + return {top:offset.top+span.height(),left:offset.left+span.width()}; + + } + + function getOuterPosition(data){ + var offset = $(data.ta).offset(); + return {top:offset.top+$(data.ta).height()+8,left:offset.left}; + } + + function hideList(data){ + if( data.listVisible ){ + $(data.list).css("display","none"); + data.listVisible = false; + } + } + + function setSelected(dir,data){ + var selected = $(data.list).find("[data-selected=true]"); + if( selected.length != 1 ){ + if( dir > 0 ) $(data.list).find("li:first-child").attr("data-selected","true"); + else $(data.list).find("li:last-child").attr("data-selected","true"); + return; + } + selected.attr("data-selected","false"); + if( dir > 0 ){ + selected.next().attr("data-selected","true"); + } + else{ + selected.prev().attr("data-selected","true"); + } + + } + + function getCurrentSelected(data){ + var selected = $(data.list).find("[data-selected=true]"); + if( selected.length == 1) return selected.get(0); + return null; + } + + function onUserSelected(li,data){ + var selectedText = $(li).attr("data-value"); var toReplace = getWords(data); var pos = toReplace.pos; var selectionEnd = getTextAreaSelectionEnd(data.ta); - var a = data.ta.value.substr(0, pos); - var c = data.ta.value.substr(selectionEnd, data.ta.value.length); - var scrollTop = data.ta.scrollTop; + var a = data.ta.value.substr(0, pos); + var c = data.ta.value.substr(selectionEnd, data.ta.value.length); + var scrollTop = data.ta.scrollTop; - if(data.on && data.on.selected) - var retText = data.on.selected(selectedText, $(li).data()); - if(retText) selectedText = retText; + if(data.on && data.on.selected) + var retText = data.on.selected(selectedText, $(li).data()); + if(retText) selectedText = retText; - data.ta.value = a + selectedText + c; - data.ta.scrollTop = scrollTop; - data.ta.selectionEnd = pos + selectedText.length; - hideList(data); - $(data.ta).focus(); + data.ta.value = a + selectedText + c; + data.ta.scrollTop = scrollTop; + data.ta.selectionEnd = pos + selectedText.length; + hideList(data); + $(data.ta).focus(); notifyChangedValue(data); - } - - function registerEvents(data){ - $(data.list).delegate("li","click",function(e){ - var li = this; - onUserSelected(li,data); - e.stopPropagation(); - e.preventDefault(); - return false; - }); - - - - $(data.ta).blur(function(e){ - setTimeout(function(){ - hideList(data); - },400); - - }); - - $(data.ta).click(function(e){ - hideList(data); - }); - - $(data.ta).keydown(function(e){ - //console.log("keydown keycode="+e.keyCode); - if( data.listVisible ){ - switch(e.keyCode){ - case 13: - case 40: - case 38: - e.stopImmediatePropagation(); - e.preventDefault(); - return false; - case 27: //esc - hideList(data); - } + } + + function registerEvents(data){ + $(data.list).delegate("li","click",function(e){ + var li = this; + onUserSelected(li,data); + e.stopPropagation(); + e.preventDefault(); + return false; + }); + + + + $(data.ta).blur(function(e){ + setTimeout(function(){ + hideList(data); + },400); + + }); + + $(data.ta).click(function(e){ + hideList(data); + }); + + $(data.ta).keydown(function(e){ + //console.log("keydown keycode="+e.keyCode); + if( data.listVisible ){ + switch(e.keyCode){ + case 13: + case 40: + case 38: + e.stopImmediatePropagation(); + e.preventDefault(); + return false; + case 27: //esc + hideList(data); + } + } + }); + + $(data.ta).keyup(function(e){ + if( data.listVisible ){ + //console.log("keCode=",e.keyCode); + if( e.keyCode == 40 ){//down key + setSelected(+1,data); + e.stopImmediatePropagation(); + e.preventDefault(); + return false; + } + if( e.keyCode == 38 ){//up key + setSelected(-1,data); + e.stopImmediatePropagation(); + e.preventDefault(); + return false; + } + if( e.keyCode == 13 ){//enter key + var li = getCurrentSelected(data); + if( li ){ + + e.stopImmediatePropagation(); + e.preventDefault(); + hideList(data); + onUserSelected(li,data); + return false; + } + hideList(data); + } + if( e.keyCode == 27 ){ + e.stopImmediatePropagation(); + e.preventDefault(); + return false; + } + } + switch( e.keyCode ){ + case 27: + return true; } - }); - - $(data.ta).keyup(function(e){ - if( data.listVisible ){ - //console.log("keCode=",e.keyCode); - if( e.keyCode == 40 ){//down key - setSelected(+1,data); - e.stopImmediatePropagation(); - e.preventDefault(); - return false; - } - if( e.keyCode == 38 ){//up key - setSelected(-1,data); - e.stopImmediatePropagation(); - e.preventDefault(); - return false; - } - if( e.keyCode == 13 ){//enter key - var li = getCurrentSelected(data); - if( li ){ - - e.stopImmediatePropagation(); - e.preventDefault(); - hideList(data); - onUserSelected(li,data); - return false; - } - hideList(data); - } - if( e.keyCode == 27 ){ - e.stopImmediatePropagation(); - e.preventDefault(); - return false; - } - } - switch( e.keyCode ){ - case 27: - return true; - } - + var searchable = getWords(data); - if (searchable) { + if (searchable) { var text = searchable.text; var trigger = searchable.trigger; var handleResults = function(list) { - if( list.length ) { - showList(data, text, list); - } - else { - hideList(data); - } - }; + if( list.length ) { + showList(data, text, list); + } + else { + hideList(data); + } + }; data.on.query(text, handleResults, trigger); - } - else{ - hideList(data); - } + } + else{ + hideList(data); + } notifyChangedValue(data); - }); - - - - $(data.ta).scroll(function(e){ - var ta = e.target; - var miror = $(data.clone); - miror.get(0).scrollTop = ta.scrollTop; - }); - } + }); + + + + $(data.ta).scroll(function(e){ + var ta = e.target; + var miror = $(data.clone); + miror.get(0).scrollTop = ta.scrollTop; + }); + } function notifyChangedValue(data){ if( typeof data.on.valueChange === 'function' ){