Guest User

Untitled

a guest
Jun 24th, 2018
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.45 KB | None | 0 0
  1. $.fn.tokenizer = function() {
  2. var contacts = [];
  3. $.getJSON('/backend.php/events/getContacts', null, function(data) {
  4. contacts = data;
  5. });
  6. return this.each(function() {
  7. var el = $(this), results, selected, val;
  8. el.html('<ul><li><input type="text" class="text" /></li></ul>');
  9. var input = el.find('input');
  10. val = input.val();
  11. var suggestions = $('<div class="autocomplete"></div>')
  12. .css({ left: el.find('ul').offset().left, width: el.find('ul').width() })
  13. .hide()
  14. .prependTo(document.body);
  15. var search = function(pattern) {
  16. var results = [];
  17. if (pattern) {
  18. var expression = new RegExp('(^| )(' + pattern + ')', 'i');
  19. $.each(contacts, function() {
  20. if (this.label.search(expression) !== -1) {
  21. results.push($.extend({}, this, { highlighted: this.label.replace(expression, '$1<strong>$2</strong>') }));
  22. }
  23. });
  24. }
  25. return results;
  26. };
  27. var autocomplete = function() {
  28. if (input.val() !== val) {
  29. val = input.val();
  30. results = search(val);
  31. if (results.length > 0) {
  32. selected = 0;
  33. var list = $('<ul></ul>');
  34. $.each(results, function() {
  35. var result = this;
  36. $('<li class="rounded"><div class="corner tl" /><div class="corner tr" /><div class="corner br" /><div class="corner bl" />' + this.highlighted + '</li>')
  37. .hover(function() {
  38. selected = suggestions.find('li').index(this);
  39. suggestions.find('li').removeClass('selected');
  40. $(this).addClass('selected');
  41. })
  42. .appendTo(list);
  43. });
  44. list.find('li:first').addClass('selected');
  45. suggestions.empty().append(list).css('top', el.find('ul').offset().top + el.find('ul').outerHeight()).show();
  46. } else {
  47. selected = null;
  48. suggestions.hide();
  49. }
  50. }
  51. };
  52. input.focus(autocomplete);
  53. el.click(function() {
  54. input.focus();
  55. return false;
  56. });
  57. var doSelect = function() {
  58. if (selected !== null) {
  59. var result = results[selected];
  60. if ($('[name="' + result.input + '"][value="' + result.value + '"]').size() === 0) {
  61. $('<li class="token rounded ' + result.className + '"><div class="corner tl" /><div class="corner tr" /><div class="corner br" /><div class="corner bl" /><input type="hidden" name="' + result.input + '" value="' + result.value + '" />' + result.label + ' <a href="#">x</a></li>')
  62. .find('a').click(function() {
  63. $(this).closest('li').remove();
  64. }).end()
  65. .insertBefore(el.find('li:last'));
  66. }
  67. selected = null;
  68. }
  69. input.val('');
  70. suggestions.hide();
  71. };
  72. input
  73. .blur(doSelect)
  74. .keyup(autocomplete)
  75. .keydown(function(e) {
  76. switch (e.keyCode) {
  77. case KEY.BACKSPACE:
  78. if (val === '') {
  79. el.find('li.token:last').remove();
  80. }
  81. break;
  82. case KEY.ESCAPE:
  83. selected = null;
  84. input.val('').blur();
  85. suggestions.hide();
  86. return false;
  87. case KEY.ENTER:
  88. doSelect();
  89. return false;
  90. case KEY.UP:
  91. if (selected > 0) {
  92. selected--;
  93. suggestions.find('li').removeClass('selected').eq(selected).addClass('selected');
  94. }
  95. return false;
  96. case KEY.DOWN:
  97. if (selected < results.length) {
  98. selected++;
  99. suggestions.find('li').removeClass('selected').eq(selected).addClass('selected');
  100. }
  101. return false;
  102. }
  103. });
  104. });
  105. };
Add Comment
Please, Sign In to add comment