/[jquery]/tag_complete/tag_complete.js
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Contents of /tag_complete/tag_complete.js

Parent Directory Parent Directory | Revision Log Revision Log


Revision 52 - (show annotations)
Sat Aug 19 12:53:59 2006 UTC (17 years, 8 months ago) by dpavlin
File MIME type: application/javascript
File size: 4748 byte(s)
support tag removal by clicking on entered tag
1 /*
2 tag auto-completer written with jquery
3
4 2006-08-18 Dobrica Pavlinusic <dpavlin@rot13.org>
5 */
6
7 var _tag = {
8 name: new Array(),
9 obj: new Array(),
10 selected: new Array(),
11 entered: { // array of entered tags
12 i: new Array(), // offset to tags
13 tag: new Array() // mapping from tag i to entered
14 },
15
16 current: null, // current selected suggestion
17
18 select: function( tag ) {
19
20 $.log.info('filter '+tag);
21
22 var j = 0;
23 var tag_len = tag.length;
24 var suggest = '';
25
26 for(var i = 0; i < _tag.name.length; i++) {
27 var t = _tag.name[i];
28 if ( t.substr(0, tag_len) == tag ) {
29 $.log.debug('selected ['+i+']: ' + t );
30
31 jQuery.className.add( _tag.obj[i], 'selected' );
32
33 suggest += '<a href="#'+i+'" onclick="javascript:return _tag.tag(\'' + t + '\',' + i + ')">' + t + '</a> ';
34 _tag.selected[j++] = {
35 i: i,
36 obj: _tag.obj[i]
37 }
38 }
39 }
40
41 $('#suggest').html( suggest );
42 if (j > 0) {
43 $('#suggest a:nth(0)').addClass('selected');
44 _tag.current = 0;
45 }
46
47 },
48
49 clean_selected: function() {
50 for(var i = 0; i < _tag.selected.length; i++) {
51 jQuery.className.remove( _tag.selected[i].obj, 'selected' );
52 }
53
54 var c = _tag.current;
55 if (c == null) return c;
56
57 $('#suggest').html('');
58 _tag.current = null;
59
60 return c;
61 },
62
63
64 take_suggested: function() {
65 var c = _tag.current;
66 if (c == null) {
67 $.log.debug('no current, return true');
68 return true;
69 }
70
71 var s = $('#suggest a:nth('+c+')').html();
72 if (s == null) {
73 $.log.debug('no suggest, return true');
74 return true;
75 }
76
77 var i = _tag.selected[c].i;
78 $.log.debug('take_suggested '+i+':'+s);
79 _tag.add_tag( s, i );
80 return false;
81 },
82
83 add_tag: function( t, i ) {
84 $.log.info('add '+i+': '+t);
85 _tag.focus();
86 jQuery.className.add( _tag.obj[i], 'entered' );
87 var entered_i = _tag.entered.i.length;
88 _tag.entered.i[ entered_i ] = i;
89 _tag.entered.tag[i] = entered_i;
90 _tag.clean_selected();
91 $('#tags').val(
92 $('#tags').val().replace(
93 /[^ ]*$/, t + ' '
94 )
95 );
96 return false;
97 },
98
99 remove_tag: function( t, i ) {
100 $.log.info('remove '+i+': '+t);
101 _tag.focus();
102 jQuery.className.remove( _tag.obj[i], 'entered' );
103 // remove selected tag and rebuild tags
104
105 var ent_i = _tag.entered.tag[i];
106 $.log.debug('entered i:'+ent_i);
107 _tag.entered.i.splice(ent_i,1);
108 _tag.entered.tag[i] = null;
109
110 $.log.debug("tags "+_tag.entered.i.join(","));
111
112 var tags = '';
113 for (var j = 0; j < _tag.entered.i.length; j++) {
114 var tag_i = _tag.entered.i[j];
115 tags += _tag.name[ tag_i ] + ' ';
116 _tag.entered.tag[ tag_i ] = j;
117 }
118
119 _tag.clean_selected();
120 $.log.debug('tags left: '+tags);
121 $('#tags').val( tags );
122 return false;
123 },
124
125 tag: function( t, i ) {
126 if (_tag.entered.tag[i] != null) {
127 _tag.remove_tag( t, i );
128 } else {
129 _tag.add_tag( t, i );
130 }
131 },
132
133 move_suggested: function( where ) {
134 var c = _tag.current;
135 if (c == null) {
136 $.log.error('_tag.current is null');
137 return;
138 }
139 var to = c + where;
140 $.log.info('move_suggested('+where+') '+c+' -> '+to);
141 if (to < 0 || to >= _tag.selected.length) {
142 $.log.error('move to invalid element '+to);
143 return;
144 }
145 var s = '#suggest a:nth('+c+')';
146 $( s ).removeClass('selected');
147 $.log.debug('remove selected from '+s);
148 s = '#suggest a:nth('+to+')';
149 $( s ).addClass('selected');
150 $.log.debug('add selected to '+s);
151 _tag.current = to;
152 },
153
154 last_tag: function() {
155 return $('#tags').val().replace(/^([^ ][^ ]* )*/, '');
156 },
157 focus: function() {
158 // $('#tags').focus() doesn't work!
159 document.getElementById('tags').focus();
160 }
161
162 };
163
164 $(document).ready( function() {
165
166 $('.tag').each( function(i) {
167 var n = this.firstChild.nodeValue;
168 _tag.name[i] = n;
169 _tag.obj[i] = this;
170 this.onclick = function() {
171 return _tag.tag( n, i );
172 }
173 this.href = '#'+i; // FIXME debug
174 });
175 $.log.info( 'found ' + _tag.name.length + ' tags' );
176
177 $.log.info( 'hook onchange to #tags_form' );
178 $('#tags_form').keyup( function(e) {
179
180 $.log.debug('keyup: '+e.keyCode);
181
182 switch (e.keyCode) {
183 case 38: // up
184 e.preventDefault();
185 _tag.move_suggested( -1 );
186 return false;
187 case 40: // down
188 e.preventDefault();
189 _tag.move_suggested( +1 );
190 return false;
191 case 9: // tab
192 case 13: // return
193 if (_tag.current != null) _tag.focus();
194 e.preventDefault();
195 return false;
196 }
197
198
199 var t = _tag.last_tag();
200
201 $.log.debug('tag: ' + t + ' ['+t.length+']');
202
203 _tag.clean_selected();
204
205 if (t == '') return false;
206
207 _tag.select(t);
208
209 $.log.info('selected ' + _tag.selected.length + ' tags');
210
211 return true;
212 }).submit( function() {
213 $.log.debug('submit');
214 return _tag.take_suggested();
215 }).blur( function() {
216 $.log.debug('blur');
217 return _tag.take_suggested();
218 });
219
220 $.log.toggle();
221
222 _tag.focus();
223 });
224

  ViewVC Help
Powered by ViewVC 1.1.26