/*
Facebook Friend Autocomplete JQuery Plugin v0.1
https://agelber.github.com/facebook-friend-autocomplete
Copyright 2014 Assaf Gelber
Released under the MIT license
*/
(function($, window, document) {
var FacebookAutocomplete, defaults, pluginName;
pluginName = "facebookAutocomplete";
defaults = {
showAvatars: true,
avatarSize: 32,
maxSuggestions: 6
};
FacebookAutocomplete = (function() {
function FacebookAutocomplete(element, options) {
var onpick;
this.element = element;
if (typeof options === 'function') {
onpick = options;
options = {
onpick: onpick
};
}
this.element = $(this.element);
this.settings = $.extend({}, defaults, options);
this.init();
}
FacebookAutocomplete.prototype.init = function() {
this.friends = this.getFriendList();
this.list = this.createSuggestionList();
this.element.on('keyup.fbac', (function(_this) {
return function(e) {
switch (e.which) {
case 40:
return _this.changeSelection('down');
case 38:
return _this.changeSelection('up');
case 13:
return _this.submit();
default:
return _this.filter($(e.currentTarget).val());
}
};
})(this));
this.list.on('click', '.fbac-suggestion', (function(_this) {
return function(e) {
_this.selected = $(e.currentTarget);
return _this.submit();
};
})(this));
return this.list.on('mouseover', '.fbac-suggestion', (function(_this) {
return function(e) {
_this.selected.removeClass('fbac-selected');
return _this.selected = $(e.currentTarget).addClass('fbac-selected');
};
})(this));
};
FacebookAutocomplete.prototype.getFriendList = function() {
var friends;
friends = [];
FB.api('/me/invitable_friends', (function(_this) {
return function(response) {
var friend, i, _i, _len, _ref, _results;
if (response.error) {
throw response.error.message;
} else {
_ref = response.data;
_results = [];
for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) {
friend = _ref[i];
_results.push(friends.push({
index: i,
invite_token: friend.id,
name: friend.name,
picture: friend.picture.data.url
}));
}
return _results;
}
};
})(this));
return friends;
};
FacebookAutocomplete.prototype.createSuggestionList = function() {
var $suggestionList;
$suggestionList = $('
').addClass('fbac-suggestion-list');
$suggestionList.css({
position: 'absolute',
left: this.element.position().left,
width: this.element.innerWidth()
});
$suggestionList.insertAfter(this.element);
return $suggestionList;
};
FacebookAutocomplete.prototype.getCurrentSuggestions = function(value) {
var index, suggestions;
value = value.toLowerCase();
suggestions = [];
index = 0;
while (suggestions.length < this.settings.maxSuggestions && index < this.friends.length) {
if (this.friends[index].name.toLowerCase().indexOf(value) > -1) {
suggestions.push(this.friends[index]);
}
index++;
}
return suggestions;
};
FacebookAutocomplete.prototype.generateSuggestion = function(suggestion) {
var $avatar, $name, $suggestion;
$suggestion = $('
').addClass('fbac-suggestion').data('index', suggestion.index);
$name = $('
').addClass('fbac-suggestion-name').text(suggestion.name);
if (this.settings.showAvatars) {
$avatar = $('
').addClass('fbac-suggestion-avatar').attr({
'src': suggestion.picture,
'width': this.settings.avatarSize,
'height': this.settings.avatarSize
});
$avatar.appendTo($suggestion);
}
$name.appendTo($suggestion);
return $suggestion;
};
FacebookAutocomplete.prototype.filter = function(value) {
var suggestion, suggestions, _i, _len;
this.list.empty();
if (value !== '') {
suggestions = this.getCurrentSuggestions(value);
for (_i = 0, _len = suggestions.length; _i < _len; _i++) {
suggestion = suggestions[_i];
this.list.append(this.generateSuggestion(suggestion));
}
return this.selected = this.list.children('.fbac-suggestion:first').addClass('fbac-selected');
}
};
FacebookAutocomplete.prototype.changeSelection = function(dir) {
var $target;
$target = this.selected[dir === 'down' ? 'next' : 'prev']('.fbac-suggestion');
if ($target.length > 0) {
this.selected.removeClass('fbac-selected');
return this.selected = $target.addClass('fbac-selected');
}
};
FacebookAutocomplete.prototype.submit = function() {
var selectedFriend, selectedIndex;
selectedIndex = this.selected.data('index');
selectedFriend = this.friends[selectedIndex];
this.settings.onpick.call(this.element, selectedFriend);
this.element.val("");
return this.list.empty();
};
return FacebookAutocomplete;
})();
return $.fn[pluginName] = function(options) {
return this.each(function() {
if (!$.data(this, "plugin_" + pluginName)) {
return $.data(this, "plugin_" + pluginName, new FacebookAutocomplete(this, options));
}
});
};
})(jQuery, window, document);