{"version":3,"sources":["jsdelivr-header.js","/npm/@viostec/jquery-mentions-input@1.6.0/jquery.mentionsInput.js"],"names":[],"mappings":"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","file":"/npm/@viostec/jquery-mentions-input@1.6.0/jquery.mentionsInput.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.37.0.\n * Original file: /npm/@viostec/jquery-mentions-input@1.6.0/jquery.mentionsInput.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","/*\r\n * Mentions Input\r\n * Version 1.0.2\r\n * Written by: Kenneth Auchenberg (Podio)\r\n *\r\n * Using underscore.js\r\n *\r\n * License: MIT License - http://www.opensource.org/licenses/mit-license.php\r\n */\r\n\r\n(function ($, _, undefined) {\r\n\r\n    // Settings\r\n    var KEY = { BACKSPACE : 8, TAB : 9, RETURN : 13, ESC : 27, LEFT : 37, UP : 38, RIGHT : 39, DOWN : 40, COMMA : 188, SPACE : 32, HOME : 36, END : 35 }; // Keys \"enum\"\r\n\r\n    //Default settings\r\n    var defaultSettings = {\r\n        triggerChar   : '@', //Char that respond to event\r\n        onDataRequest : $.noop, //Function where we can search the data\r\n        minChars      : 2, //Minimum chars to fire the event\r\n        allowRepeat   : false, //Allow repeat mentions\r\n        showAvatars   : true, //Show the avatars\r\n        elastic       : true, //Grow the textarea automatically\r\n        defaultValue  : '',\r\n        onCaret       : false,\r\n        classes       : {\r\n            autoCompleteItemActive : \"active\" //Classes to apply in each item\r\n        },\r\n        templates     : {\r\n            wrapper                    : _.template('<div class=\"mentions-input-box\"></div>'),\r\n            autocompleteList           : _.template('<div class=\"mentions-autocomplete-list\"></div>'),\r\n            autocompleteListItem       : _.template('<li data-ref-id=\"<%= id %>\" data-ref-type=\"<%= type %>\" data-display=\"<%= display %>\"><%= content %></li>'),\r\n            autocompleteListItemAvatar : _.template('<img src=\"<%= avatar %>\" />'),\r\n            autocompleteListItemIcon   : _.template('<div class=\"icon <%= icon %>\"></div>'),\r\n            mentionsOverlay            : _.template('<div class=\"mentions\"><div></div></div>'),\r\n            mentionItemSyntax          : _.template('@[<%= value %>](<%= type %>:<%= id %>)'),\r\n            mentionItemHighlight       : _.template('<strong><span><%= value %></span></strong>')\r\n        }\r\n    };\r\n\r\n    //Class util\r\n    var utils = {\r\n\t    //Encodes the character with _.escape function (undersocre)\r\n        htmlEncode       : function (str) {\r\n            return _.escape(str);\r\n        },\r\n        //Encodes the character to be used with RegExp\r\n        regexpEncode     : function (str) {\r\n            return str.replace(/([.*+?^=!:${}()|\\[\\]\\/\\\\])/g, \"\\\\$1\");\r\n        },\r\n\t    highlightTerm    : function (value, term) {\r\n            if (!term && !term.length) {\r\n                return value;\r\n            }\r\n            return value.replace(new RegExp(\"(?![^&;]+;)(?!<[^<>]*)(\" + term + \")(?![^<>]*>)(?![^&;]+;)\", \"gi\"), \"<b>$1</b>\");\r\n        },\r\n        //Sets the caret in a valid position\r\n        setCaratPosition : function (domNode, caretPos) {\r\n            if (domNode.createTextRange) {\r\n                var range = domNode.createTextRange();\r\n                range.move('character', caretPos);\r\n                range.select();\r\n            } else {\r\n                if (domNode.selectionStart) {\r\n                    domNode.focus();\r\n                    domNode.setSelectionRange(caretPos, caretPos);\r\n                } else {\r\n                    domNode.focus();\r\n                }\r\n            }\r\n        },\r\n\t    //Deletes the white spaces\r\n        rtrim: function(string) {\r\n            return string.replace(/\\s+$/,\"\");\r\n        }\r\n    };\r\n\r\n    //Main class of MentionsInput plugin\r\n    var MentionsInput = function (settings) {\r\n\r\n        var domInput,\r\n            elmInputBox,\r\n            elmInputWrapper,\r\n            elmAutocompleteList,\r\n            elmWrapperBox,\r\n            elmMentionsOverlay,\r\n            elmActiveAutoCompleteItem,\r\n            mentionsCollection = [],\r\n            autocompleteItemCollection = {},\r\n            inputBuffer = [],\r\n            currentDataQuery = '';\r\n\r\n\t    //Mix the default setting with the users settings\r\n        settings = $.extend(true, {}, defaultSettings, settings );\r\n\r\n\t    //Initializes the text area target\r\n        function initTextarea() {\r\n            elmInputBox = $(domInput); //Get the text area target\r\n\r\n            //If the text area is already configured, return\r\n            if (elmInputBox.attr('data-mentions-input') === 'true') {\r\n                return;\r\n            }\r\n\r\n            elmInputWrapper = elmInputBox.parent(); //Get the DOM element parent\r\n            elmWrapperBox = $(settings.templates.wrapper());\r\n            elmInputBox.wrapAll(elmWrapperBox); //Wrap all the text area into the div elmWrapperBox\r\n            elmWrapperBox = elmInputWrapper.find('> div.mentions-input-box'); //Obtains the div elmWrapperBox that now contains the text area\r\n\r\n            elmInputBox.attr('data-mentions-input', 'true'); //Sets the attribute data-mentions-input to true -> Defines if the text area is already configured\r\n            elmInputBox.bind('keydown', onInputBoxKeyDown); //Bind the keydown event to the text area\r\n            elmInputBox.bind('keypress', onInputBoxKeyPress); //Bind the keypress event to the text area\r\n            elmInputBox.bind('click', onInputBoxClick); //Bind the click event to the text area\r\n            elmInputBox.bind('blur', onInputBoxBlur); //Bind the blur event to the text area\r\n\r\n            if (navigator.userAgent.indexOf(\"MSIE 8\") > -1) {\r\n                elmInputBox.bind('propertychange', onInputBoxInput); //IE8 won't fire the input event, so let's bind to the propertychange\r\n            } else {\r\n                elmInputBox.bind('input', onInputBoxInput); //Bind the input event to the text area\r\n            }\r\n\r\n            // Elastic textareas, grow automatically\r\n            if( settings.elastic ) {\r\n                elmInputBox.elastic();\r\n            }\r\n        }\r\n\r\n        //Initializes the autocomplete list, append to elmWrapperBox and delegate the mousedown event to li elements\r\n        function initAutocomplete() {\r\n            elmAutocompleteList = $(settings.templates.autocompleteList()); //Get the HTML code for the list\r\n            elmAutocompleteList.appendTo(elmWrapperBox); //Append to elmWrapperBox element\r\n            elmAutocompleteList.delegate('li', 'mousedown', onAutoCompleteItemClick); //Delegate the event\r\n        }\r\n\r\n        //Initializes the mentions' overlay\r\n        function initMentionsOverlay() {\r\n            elmMentionsOverlay = $(settings.templates.mentionsOverlay()); //Get the HTML code of the mentions' overlay\r\n            elmMentionsOverlay.prependTo(elmWrapperBox); //Insert into elmWrapperBox the mentions overlay\r\n        }\r\n\r\n\t    //Updates the values of the main variables\r\n        function updateValues() {\r\n            var syntaxMessage = getInputBoxValue(); //Get the actual value of the text area\r\n\r\n            _.each(mentionsCollection, function (mention) {\r\n                var textSyntax = settings.templates.mentionItemSyntax(mention);\r\n                syntaxMessage = syntaxMessage.replace(new RegExp(utils.regexpEncode(mention.value), 'g'), textSyntax);\r\n            });\r\n\r\n            var mentionText = utils.htmlEncode(syntaxMessage); //Encode the syntaxMessage\r\n\r\n            _.each(mentionsCollection, function (mention) {\r\n                var formattedMention = _.extend({}, mention, {value: utils.htmlEncode(mention.value)});\r\n                var textSyntax = settings.templates.mentionItemSyntax(formattedMention);\r\n                var textHighlight = settings.templates.mentionItemHighlight(formattedMention);\r\n\r\n                mentionText = mentionText.replace(new RegExp(utils.regexpEncode(textSyntax), 'g'), textHighlight);\r\n            });\r\n\r\n            mentionText = mentionText.replace(/\\n/g, '<br />'); //Replace the escape character for <br />\r\n            mentionText = mentionText.replace(/ {2}/g, '&nbsp; '); //Replace the 2 preceding token to &nbsp;\r\n\r\n            elmInputBox.data('messageText', syntaxMessage); //Save the messageText to elmInputBox\r\n\t        elmInputBox.trigger('updated');\r\n            elmMentionsOverlay.find('div').html(mentionText); //Insert into a div of the elmMentionsOverlay the mention text\r\n        }\r\n\r\n        //Cleans the buffer\r\n        function resetBuffer() {\r\n            inputBuffer = [];\r\n        }\r\n\r\n\t    //Updates the mentions collection\r\n        function updateMentionsCollection() {\r\n            var inputText = getInputBoxValue(); //Get the actual value of text area\r\n\r\n\t        //Returns the values that doesn't match the condition\r\n            mentionsCollection = _.reject(mentionsCollection, function (mention, index) {\r\n                return !mention.value || inputText.indexOf(mention.value) == -1;\r\n            });\r\n            mentionsCollection = _.compact(mentionsCollection); //Delete all the falsy values of the array and return the new array\r\n        }\r\n\r\n\t    //Adds mention to mentions collections\r\n        function addMention(mention) {\r\n\r\n            var currentMessage = getInputBoxValue(),\r\n                caretStart = elmInputBox[0].selectionStart,\r\n                shortestDistance = false,\r\n                bestLastIndex = false;\r\n\r\n            // Using a regex to figure out positions\r\n            var regex = new RegExp(\"\\\\\" + settings.triggerChar + currentDataQuery, \"gi\"),\r\n                regexMatch;\r\n\r\n            while(regexMatch = regex.exec(currentMessage)) {\r\n                if (shortestDistance === false || Math.abs(regex.lastIndex - caretStart) < shortestDistance) {\r\n                    shortestDistance = Math.abs(regex.lastIndex - caretStart);\r\n                    bestLastIndex = regex.lastIndex;\r\n                }\r\n            }\r\n\r\n            var startCaretPosition = bestLastIndex - currentDataQuery.length - 1; //Set the start caret position (right before the @)\r\n            var currentCaretPosition = bestLastIndex; //Set the current caret position (right after the end of the \"mention\")\r\n\r\n\r\n            var start = currentMessage.substr(0, startCaretPosition);\r\n            var end = currentMessage.substr(currentCaretPosition, currentMessage.length);\r\n            var startEndIndex = (start + mention.value).length + 1;\r\n\r\n            // See if there's the same mention in the list\r\n            if( !_.find(mentionsCollection, function (object) { return object.id == mention.id; }) ) {\r\n                mentionsCollection.push(mention);//Add the mention to mentionsColletions\r\n            }\r\n\r\n            // Cleaning before inserting the value, otherwise auto-complete would be triggered with \"old\" inputbuffer\r\n            resetBuffer();\r\n            currentDataQuery = '';\r\n            hideAutoComplete();\r\n\r\n            // Mentions and syntax message\r\n            var updatedMessageText = start + mention.value + ' ' + end;\r\n            elmInputBox.val(updatedMessageText); //Set the value to the txt area\r\n\t        elmInputBox.trigger('mention');\r\n            updateValues();\r\n\r\n            // Set correct focus and selection\r\n            elmInputBox.focus();\r\n            utils.setCaratPosition(elmInputBox[0], startEndIndex);\r\n        }\r\n\r\n        //Gets the actual value of the text area without white spaces from the beginning and end of the value\r\n        function getInputBoxValue() {\r\n            return $.trim(elmInputBox.val());\r\n        }\r\n\r\n        // This is taken straight from live (as of Sep 2012) GitHub code. The\r\n        // technique is known around the web. Just google it. Github's is quite\r\n        // succint though. NOTE: relies on selectionEnd, which as far as IE is concerned,\r\n        // it'll only work on 9+. Good news is nothing will happen if the browser\r\n        // doesn't support it.\r\n        function textareaSelectionPosition($el) {\r\n            var a, b, c, d, e, f, g, h, i, j, k;\r\n            if (!(i = $el[0])) return;\r\n            if (!$(i).is(\"textarea\")) return;\r\n            if (i.selectionEnd == null) return;\r\n            g = {\r\n                position: \"absolute\",\r\n                overflow: \"auto\",\r\n                whiteSpace: \"pre-wrap\",\r\n                wordWrap: \"break-word\",\r\n                boxSizing: \"content-box\",\r\n                top: 0,\r\n                left: -9999\r\n              }, h = [\"boxSizing\", \"fontFamily\", \"fontSize\", \"fontStyle\", \"fontVariant\", \"fontWeight\", \"height\", \"letterSpacing\", \"lineHeight\", \"paddingBottom\", \"paddingLeft\", \"paddingRight\", \"paddingTop\", \"textDecoration\", \"textIndent\", \"textTransform\", \"width\", \"word-spacing\"];\r\n            for (j = 0, k = h.length; j < k; j++) e = h[j], g[e] = $(i).css(e);\r\n            return c = document.createElement(\"div\"), $(c).css(g), $(i).after(c), b = document.createTextNode(i.value.substring(0, i.selectionEnd)), a = document.createTextNode(i.value.substring(i.selectionEnd)), d = document.createElement(\"span\"), d.innerHTML = \"&nbsp;\", c.appendChild(b), c.appendChild(d), c.appendChild(a), c.scrollTop = i.scrollTop, f = $(d).position(), $(c).remove(), f\r\n        }\r\n\r\n        //same as above function but return offset instead of position\r\n        function textareaSelectionOffset($el) {\r\n            var a, b, c, d, e, f, g, h, i, j, k;\r\n            if (!(i = $el[0])) return;\r\n            if (!$(i).is(\"textarea\")) return;\r\n            if (i.selectionEnd == null) return;\r\n            g = {\r\n                position: \"absolute\",\r\n                overflow: \"auto\",\r\n                whiteSpace: \"pre-wrap\",\r\n                wordWrap: \"break-word\",\r\n                boxSizing: \"content-box\",\r\n                top: 0,\r\n                left: -9999\r\n            }, h = [\"boxSizing\", \"fontFamily\", \"fontSize\", \"fontStyle\", \"fontVariant\", \"fontWeight\", \"height\", \"letterSpacing\", \"lineHeight\", \"paddingBottom\", \"paddingLeft\", \"paddingRight\", \"paddingTop\", \"textDecoration\", \"textIndent\", \"textTransform\", \"width\", \"word-spacing\"];\r\n            for (j = 0, k = h.length; j < k; j++) e = h[j], g[e] = $(i).css(e);\r\n            return c = document.createElement(\"div\"), $(c).css(g), $(i).after(c), b = document.createTextNode(i.value.substring(0, i.selectionEnd)), a = document.createTextNode(i.value.substring(i.selectionEnd)), d = document.createElement(\"span\"), d.innerHTML = \"&nbsp;\", c.appendChild(b), c.appendChild(d), c.appendChild(a), c.scrollTop = i.scrollTop, f = $(d).offset(), $(c).remove(), f\r\n        }\r\n\r\n        //Scrolls back to the input after autocomplete if the window has scrolled past the input\r\n        function scrollToInput() {\r\n            var elmDistanceFromTop = $(elmInputBox).offset().top; //input offset\r\n            var bodyDistanceFromTop = $('body').offset().top; //body offset\r\n            var distanceScrolled = $(window).scrollTop(); //distance scrolled\r\n\r\n            if (distanceScrolled > elmDistanceFromTop) {\r\n                //subtracts body distance to handle fixed headers\r\n                $(window).scrollTop(elmDistanceFromTop - bodyDistanceFromTop);\r\n              }\r\n        }\r\n\r\n        //Takes the click event when the user select a item of the dropdown\r\n        function onAutoCompleteItemClick(e) {\r\n            var elmTarget = $(this); //Get the item selected\r\n            var mention = autocompleteItemCollection[elmTarget.attr('data-uid')]; //Obtains the mention\r\n\r\n            addMention(mention);\r\n            scrollToInput();\r\n            return false;\r\n        }\r\n\r\n        //Takes the click event on text area\r\n        function onInputBoxClick(e) {\r\n            resetBuffer();\r\n        }\r\n\r\n        //Takes the blur event on text area\r\n        function onInputBoxBlur(e) {\r\n            hideAutoComplete();\r\n        }\r\n\r\n        //Takes the input event when users write or delete something\r\n        function onInputBoxInput(e) {\r\n            updateValues();\r\n            updateMentionsCollection();\r\n\r\n            var triggerCharIndex = _.lastIndexOf(inputBuffer, settings.triggerChar); //Returns the last match of the triggerChar in the inputBuffer\r\n            if (triggerCharIndex > -1) { //If the triggerChar is present in the inputBuffer array\r\n                currentDataQuery = inputBuffer.slice(triggerCharIndex + 1).join(''); //Gets the currentDataQuery\r\n                currentDataQuery = utils.rtrim(currentDataQuery); //Deletes the whitespaces\r\n                _.defer(_.bind(doSearch, this, currentDataQuery)); //Invoking the function doSearch ( Bind the function to this)\r\n            }\r\n        }\r\n\r\n        //Takes the keypress event\r\n        function onInputBoxKeyPress(e) {\r\n            if(e.keyCode !== KEY.BACKSPACE) { //If the key pressed is not the backspace\r\n                var typedValue = String.fromCharCode(e.which || e.keyCode); //Takes the string that represent this CharCode\r\n                inputBuffer.push(typedValue); //Push the value pressed into inputBuffer\r\n            }\r\n        }\r\n\r\n\t    //Takes the keydown event\r\n        function onInputBoxKeyDown(e) {\r\n\r\n            // This also matches HOME/END on OSX which is CMD+LEFT, CMD+RIGHT\r\n            if (e.keyCode === KEY.LEFT || e.keyCode === KEY.RIGHT || e.keyCode === KEY.HOME || e.keyCode === KEY.END) {\r\n                // Defer execution to ensure carat pos has changed after HOME/END keys then call the resetBuffer function\r\n                _.defer(resetBuffer);\r\n\r\n                // IE9 doesn't fire the oninput event when backspace or delete is pressed. This causes the highlighting\r\n                // to stay on the screen whenever backspace is pressed after a highlighed word. This is simply a hack\r\n                // to force updateValues() to fire when backspace/delete is pressed in IE9.\r\n                if (navigator.userAgent.indexOf(\"MSIE 9\") > -1) {\r\n                  _.defer(updateValues); //Call the updateValues function\r\n                }\r\n\r\n                return;\r\n            }\r\n\r\n            //If the key pressed was the backspace\r\n            if (e.keyCode === KEY.BACKSPACE) {\r\n                inputBuffer = inputBuffer.slice(0, -1 + inputBuffer.length); // Can't use splice, not available in IE\r\n                return;\r\n            }\r\n\r\n            //If the elmAutocompleteList is hidden\r\n            if (!elmAutocompleteList.is(':visible')) {\r\n                return true;\r\n            }\r\n\r\n            switch (e.keyCode) {\r\n                case KEY.UP: //If the key pressed was UP or DOWN\r\n                case KEY.DOWN:\r\n                    var elmCurrentAutoCompleteItem = null;\r\n                    if (e.keyCode === KEY.DOWN) { //If the key pressed was DOWN\r\n                        if (elmActiveAutoCompleteItem && elmActiveAutoCompleteItem.length) { //If elmActiveAutoCompleteItem exits\r\n                            elmCurrentAutoCompleteItem = elmActiveAutoCompleteItem.next(); //Gets the next li element in the list\r\n                        } else {\r\n                            elmCurrentAutoCompleteItem = elmAutocompleteList.find('li').first(); //Gets the first li element found\r\n                        }\r\n                    } else {\r\n                        elmCurrentAutoCompleteItem = $(elmActiveAutoCompleteItem).prev(); //The key pressed was UP and gets the previous li element\r\n                    }\r\n                    if (elmCurrentAutoCompleteItem.length) {\r\n                        selectAutoCompleteItem(elmCurrentAutoCompleteItem);\r\n                    }\r\n                    return false;\r\n                case KEY.RETURN: //If the key pressed was RETURN or TAB\r\n                case KEY.TAB:\r\n                    if (elmActiveAutoCompleteItem && elmActiveAutoCompleteItem.length) { //If the elmActiveAutoCompleteItem exists\r\n                        elmActiveAutoCompleteItem.trigger('mousedown'); //Calls the mousedown event\r\n                        return false;\r\n                    }\r\n                break;\r\n            }\r\n\r\n            return true;\r\n        }\r\n\r\n        //Hides the autoomplete\r\n        function hideAutoComplete() {\r\n            elmActiveAutoCompleteItem = null;\r\n            elmAutocompleteList.empty().hide();\r\n        }\r\n\r\n        //Selects the item in the autocomplete list\r\n        function selectAutoCompleteItem(elmItem) {\r\n            elmItem.addClass(settings.classes.autoCompleteItemActive); //Add the class active to item\r\n            elmItem.siblings().removeClass(settings.classes.autoCompleteItemActive); //Gets all li elements in autocomplete list and remove the class active\r\n\r\n            elmActiveAutoCompleteItem = elmItem; //Sets the item to elmActiveAutoCompleteItem\r\n        }\r\n\r\n\t    //Populates dropdown\r\n        function populateDropdown(query, results) {\r\n            elmAutocompleteList.show(); //Shows the autocomplete list\r\n\r\n            if(!settings.allowRepeat) {\r\n                // Filter items that has already been mentioned\r\n                var mentionValues = _.pluck(mentionsCollection, 'value');\r\n                results = _.reject(results, function (item) {\r\n                    return _.include(mentionValues, item.name);\r\n                });\r\n            }\r\n\r\n            if (!results.length) { //If there are not elements hide the autocomplete list\r\n                hideAutoComplete();\r\n                return;\r\n            }\r\n\r\n            elmAutocompleteList.empty(); //Remove all li elements in autocomplete list\r\n            var elmDropDownList = $(\"<ul>\").appendTo(elmAutocompleteList).hide(); //Inserts a ul element to autocomplete div and hide it\r\n\r\n            _.each(results, function (item, index) {\r\n                var itemUid = _.uniqueId('mention_'); //Gets the item with unique id\r\n\r\n                autocompleteItemCollection[itemUid] = _.extend({}, item, {value: item.name}); //Inserts the new item to autocompleteItemCollection\r\n\r\n                var elmListItem = $(settings.templates.autocompleteListItem({\r\n                    'id'      : utils.htmlEncode(item.id),\r\n                    'display' : utils.htmlEncode(item.name),\r\n                    'type'    : utils.htmlEncode(item.type),\r\n                    'content' : utils.highlightTerm(utils.htmlEncode((item.display ? item.display : item.name)), query)\r\n                })).attr('data-uid', itemUid); //Inserts the new item to list\r\n\r\n                //If the index is 0\r\n                if (index === 0) {\r\n                    selectAutoCompleteItem(elmListItem);\r\n                }\r\n\r\n                //If show avatars is true\r\n                if (settings.showAvatars) {\r\n                    var elmIcon;\r\n\r\n                    //If the item has an avatar\r\n                    if (item.avatar) {\r\n                        elmIcon = $(settings.templates.autocompleteListItemAvatar({ avatar : item.avatar }));\r\n                    } else { //If not then we set an default icon\r\n                        elmIcon = $(settings.templates.autocompleteListItemIcon({ icon : item.icon }));\r\n                    }\r\n                    elmIcon.prependTo(elmListItem); //Inserts the elmIcon to elmListItem\r\n                }\r\n                elmListItem = elmListItem.appendTo(elmDropDownList); //Insets the elmListItem to elmDropDownList\r\n            });\r\n\r\n            elmAutocompleteList.show(); //Shows the elmAutocompleteList div\r\n\t        if (settings.onCaret) {\r\n\t\t        positionAutocomplete(elmAutocompleteList, elmInputBox);\r\n            }\r\n\t        elmDropDownList.show(); //Shows the elmDropDownList\r\n        }\r\n\r\n        //Search into data list passed as parameter\r\n        function doSearch(query) {\r\n            //If the query is not null, undefined, empty and has the minimum chars\r\n            if (query && query.length && query.length >= settings.minChars) {\r\n                //Call the onDataRequest function and then call the populateDropDrown\r\n                settings.onDataRequest.call(this, 'search', query, function (responseData) {\r\n                    populateDropdown(query, responseData);\r\n                });\r\n            } else { //If the query is null, undefined, empty or has not the minimun chars\r\n                hideAutoComplete(); //Hide the autocompletelist\r\n            }\r\n        }\r\n\r\n\t    function positionAutocomplete(elmAutocompleteList, elmInputBox) {\r\n            var elmAutocompleteListPosition = elmAutocompleteList.css('position');\r\n            if (elmAutocompleteListPosition == 'absolute') {\r\n                var position = textareaSelectionPosition(elmInputBox),\r\n                    lineHeight = parseInt(elmInputBox.css('line-height'), 10) || 18;\r\n                elmAutocompleteList.css('width', '15em'); // Sort of a guess\r\n                elmAutocompleteList.css('left', position.left);\r\n                elmAutocompleteList.css('top', lineHeight + position.top);\r\n\r\n                //check if the right position of auto complete is larger than the right position of the input\r\n                //if yes, reset the left of auto complete list to make it fit the input\r\n                var elmInputBoxRight = elmInputBox.offset().left + elmInputBox.width(),\r\n                    elmAutocompleteListRight = elmAutocompleteList.offset().left + elmAutocompleteList.width();\r\n                if (elmInputBoxRight <= elmAutocompleteListRight) {\r\n                    elmAutocompleteList.css('left', Math.abs(elmAutocompleteList.position().left - (elmAutocompleteListRight - elmInputBoxRight)));\r\n                }\r\n            }\r\n            else if (elmAutocompleteListPosition == 'fixed') {\r\n                var offset = textareaSelectionOffset(elmInputBox),\r\n                    lineHeight = parseInt(elmInputBox.css('line-height'), 10) || 18;\r\n                elmAutocompleteList.css('width', '15em'); // Sort of a guess\r\n                elmAutocompleteList.css('left', offset.left + 10000);\r\n                elmAutocompleteList.css('top', lineHeight + offset.top);\r\n            }\r\n        }\r\n\r\n        //Resets the text area\r\n        function resetInput(currentVal) {\r\n            mentionsCollection = [];\r\n            var mentionText = utils.htmlEncode(currentVal);\r\n            var regex = new RegExp(\"(\" + settings.triggerChar + \")\\\\[(.*?)\\\\]\\\\((.*?):(.*?)\\\\)\", \"gi\");\r\n            var match, newMentionText = mentionText;\r\n            while ((match = regex.exec(mentionText)) != null) {\r\n                newMentionText = newMentionText.replace(match[0], match[1] + match[2]);\r\n                mentionsCollection.push({ 'id': match[4], 'type': match[3], 'value': match[2], 'trigger': match[1] });\r\n            }\r\n            elmInputBox.val(newMentionText);\r\n            updateValues();\r\n        }\r\n        // Public methods\r\n        return {\r\n            //Initializes the mentionsInput component on a specific element.\r\n\t        init : function (domTarget) {\r\n\r\n                domInput = domTarget;\r\n\r\n                initTextarea();\r\n                initAutocomplete();\r\n                initMentionsOverlay();\r\n                resetInput(settings.defaultValue);\r\n\r\n                //If the autocomplete list has prefill mentions\r\n                if( settings.prefillMention ) {\r\n                    addMention( settings.prefillMention );\r\n                }\r\n            },\r\n\r\n\t        //An async method which accepts a callback function and returns a value of the input field (including markup) as a first parameter of this function. This is the value you want to send to your server.\r\n            val : function (callback) {\r\n                if (!_.isFunction(callback)) {\r\n                    return;\r\n                }\r\n                callback.call(this, mentionsCollection.length ? elmInputBox.data('messageText') : getInputBoxValue());\r\n            },\r\n\r\n        \t//Resets the text area value and clears all mentions\r\n            reset : function () {\r\n                resetInput();\r\n            },\r\n\r\n            //Reinit with the text area value if it was changed programmatically\r\n            reinit : function () {\r\n                resetInput(false);\r\n            },\r\n\r\n\t        //An async method which accepts a callback function and returns a collection of mentions as hash objects as a first parameter.\r\n            getMentions : function (callback) {\r\n                if (!_.isFunction(callback)) {\r\n                    return;\r\n                }\r\n                callback.call(this, mentionsCollection);\r\n            }\r\n        };\r\n    };\r\n\r\n    //Main function to include into jQuery and initialize the plugin\r\n    $.fn.mentionsInput = function (method, settings) {\r\n\r\n        var outerArguments = arguments; //Gets the arguments\r\n        //If method is not a function\r\n        if (typeof method === 'object' || !method) {\r\n            settings = method;\r\n        }\r\n\r\n        return this.each(function () {\r\n            var instance = $.data(this, 'mentionsInput') || $.data(this, 'mentionsInput', new MentionsInput(settings));\r\n\r\n            if (_.isFunction(instance[method])) {\r\n                return instance[method].apply(this, Array.prototype.slice.call(outerArguments, 1));\r\n            } else if (typeof method === 'object' || !method) {\r\n                return instance.init.call(this, this);\r\n            } else {\r\n                $.error('Method ' + method + ' does not exist');\r\n            }\r\n        });\r\n    };\r\n\r\n})(jQuery, _);\r\n"]}