-
Notifications
You must be signed in to change notification settings - Fork 0
/
fbssts.js
108 lines (107 loc) · 4.01 KB
/
fbssts.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
Drupal.behaviors.fbssts = function (context) {
var dest = $(context).find('.facebook-status-text:first');
if (!dest || !dest.length) {
return;
}
var fbssts_box = $('.fbssts-suggestions');
var t;
var maxlen = Drupal.settings.facebook_status.maxlength;
fbssts_box.css('left', dest.offset().left);
fbssts_box.css('top', dest.offset().top + dest.outerHeight() + 1);
dest.keypress(function(fbss_key) {
if (t) {
clearTimeout(t);
}
if (fbss_key.which != 35 && fbss_key.which != 64) {
fbssts_box.empty();
t = setTimeout(function() {
// Get the last 30 characters before the cursor so we can look for a tag.
// 30 was chosen because it is longer than the longest word in the
// English language (antidisestablishmentarianism - 28 characters);
// much longer than the average Twitter #hashtag (probably around 8
// characters); and about 6 times the average English word length
// (about 5.1). The maximum length of a Drupal username is 60
// characters, and the maximum length of a taxonomy term is 255
// characters -- but while it is *possible* to have a tag that is
// longer than what we're checking for, if you've already typed 30
// characters, you've pretty much defeated the point of having a
// suggestion already. Meanwhile, we save AJAX calls.
var textBeforeCursor = dest.textBeforeCursor(30);
// Check if these characters could contain a tag.
if (textBeforeCursor.text.indexOf('#') < 0 && textBeforeCursor.text.indexOf('@') < 0) {
return;
}
// We might have a tag, so load in our suggestions.
fbssts_box.load(Drupal.settings.basePath +'index.php?q=fbssts/load',
{'text': textBeforeCursor.text},
function(response) {
if (!response) {
return;
}
fbssts_box.css('display', 'inline-block');
var tagStartsAt = textBeforeCursor.text.length - $('.fbssts-part-length').html();
$('.fbssts-suggestions li').click(function() {
var tag = $(this).html();
var op = textBeforeCursor.text.substring(tagStartsAt, tagStartsAt+1);
if (op == '[') {
op = textBeforeCursor.text.substring(tagStartsAt+1, tagStartsAt+2);
}
if (tag.match(/\W/)) {
tag = '['+ op + tag +']';
}
else {
tag = op + tag;
}
textBeforeCursor.replace(textBeforeCursor.text.substring(0, tagStartsAt) + tag);
if (maxlen > 0) {
fbss_print_remaining(maxlen - dest.val().length, dest.parents('.facebook-status-update').find('.facebook-status-chars'));
}
fbssts_box.hide();
dest.focus();
return false;
});
}
);
}, 333);
}
});
dest.blur(function() {
var t2 = setTimeout(function() { fbssts_box.hide(); }, 250);
});
}
/**
* Inspired by http://plugins.jquery.com/project/jCaret
*/
$.fn.textBeforeCursor = function(distanceBefore) {
var t = this[0];
if($.browser.msie) {
var range = document.selection.createRange();
var stored_range = range.duplicate();
stored_range.moveToElementText(t);
stored_range.setEndPoint('EndToEnd', range);
var e = stored_range.text.length - range.text.length;
var s = e - distanceBefore;
}
else {
var e = t.selectionStart, s = e - distanceBefore;
}
if (s < 0) {
s = 0;
}
var te = t.value.substring(s, e);
return {start: s, end: e, text: te, replace: function(st) {
t.value = t.value.substring(0, s) + st + t.value.substring(e, t.value.length);
var newloc = s + st.length;
if($.browser.msie){
var selRange = t.createTextRange();
selRange.collapse(true);
selRange.moveStart('character', newloc);
selRange.moveEnd('character', 0);
selRange.select();
}
else {
t.selectionStart = newloc;
t.selectionEnd = newloc;
}
}};
};