Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- $.fn.tokenizer = function() {
- var contacts = [];
- $.getJSON('/backend.php/events/getContacts', null, function(data) {
- contacts = data;
- });
- return this.each(function() {
- var el = $(this), results, selected, val;
- el.html('<ul><li><input type="text" class="text" /></li></ul>');
- var input = el.find('input');
- val = input.val();
- var suggestions = $('<div class="autocomplete"></div>')
- .css({ left: el.find('ul').offset().left, width: el.find('ul').width() })
- .hide()
- .prependTo(document.body);
- var search = function(pattern) {
- var results = [];
- if (pattern) {
- var expression = new RegExp('(^| )(' + pattern + ')', 'i');
- $.each(contacts, function() {
- if (this.label.search(expression) !== -1) {
- results.push($.extend({}, this, { highlighted: this.label.replace(expression, '$1<strong>$2</strong>') }));
- }
- });
- }
- return results;
- };
- var autocomplete = function() {
- if (input.val() !== val) {
- val = input.val();
- results = search(val);
- if (results.length > 0) {
- selected = 0;
- var list = $('<ul></ul>');
- $.each(results, function() {
- var result = this;
- $('<li class="rounded"><div class="corner tl" /><div class="corner tr" /><div class="corner br" /><div class="corner bl" />' + this.highlighted + '</li>')
- .hover(function() {
- selected = suggestions.find('li').index(this);
- suggestions.find('li').removeClass('selected');
- $(this).addClass('selected');
- })
- .appendTo(list);
- });
- list.find('li:first').addClass('selected');
- suggestions.empty().append(list).css('top', el.find('ul').offset().top + el.find('ul').outerHeight()).show();
- } else {
- selected = null;
- suggestions.hide();
- }
- }
- };
- input.focus(autocomplete);
- el.click(function() {
- input.focus();
- return false;
- });
- var doSelect = function() {
- if (selected !== null) {
- var result = results[selected];
- if ($('[name="' + result.input + '"][value="' + result.value + '"]').size() === 0) {
- $('<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>')
- .find('a').click(function() {
- $(this).closest('li').remove();
- }).end()
- .insertBefore(el.find('li:last'));
- }
- selected = null;
- }
- input.val('');
- suggestions.hide();
- };
- input
- .blur(doSelect)
- .keyup(autocomplete)
- .keydown(function(e) {
- switch (e.keyCode) {
- case KEY.BACKSPACE:
- if (val === '') {
- el.find('li.token:last').remove();
- }
- break;
- case KEY.ESCAPE:
- selected = null;
- input.val('').blur();
- suggestions.hide();
- return false;
- case KEY.ENTER:
- doSelect();
- return false;
- case KEY.UP:
- if (selected > 0) {
- selected--;
- suggestions.find('li').removeClass('selected').eq(selected).addClass('selected');
- }
- return false;
- case KEY.DOWN:
- if (selected < results.length) {
- selected++;
- suggestions.find('li').removeClass('selected').eq(selected).addClass('selected');
- }
- return false;
- }
- });
- });
- };
Add Comment
Please, Sign In to add comment