/[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 51 - (show annotations)
Sat Aug 19 10:50:49 2006 UTC (17 years, 8 months ago) by dpavlin
File MIME type: application/javascript
File size: 3688 byte(s)
added hilight for entered tags
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
12 current: null, // current selected suggestion
13
14 select: function( tag ) {
15
16 $.log.info('filter '+tag);
17
18 var j = 0;
19 var tag_len = tag.length;
20 var suggest = '';
21
22 for(var i = 0; i < _tag.name.length; i++) {
23 var t = _tag.name[i];
24 if ( t.substr(0, tag_len) == tag ) {
25 $.log.debug('selected ['+i+']: ' + t );
26
27 jQuery.className.add( _tag.obj[i], 'selected' );
28
29 suggest += '<a href="#" onclick="javascript:return _tag.add_tag(\'' + t + '\',' + i + ')">' + t + '</a> ';
30 _tag.selected[j++] = {
31 i: i,
32 obj: _tag.obj[i],
33 }
34 }
35 }
36
37 $('#suggest').html( suggest );
38 if (j > 0) {
39 $('#suggest a:nth(0)').addClass('selected');
40 _tag.current = 0;
41 }
42
43 },
44
45 clean_selected: function() {
46 for(var i = 0; i < _tag.selected.length; i++) {
47 jQuery.className.remove( _tag.selected[i].obj, 'selected' );
48 }
49
50 var c = _tag.current;
51 if (c == null) return c;
52
53 $('#suggest').html('');
54 _tag.current = null;
55
56 return c;
57 },
58
59
60 take_suggested: function() {
61 var c = _tag.current;
62 if (c == null) {
63 $.log.debug('no current, return true');
64 return true;
65 }
66
67 var s = $('#suggest a:nth('+c+')').html();
68 if (s == null) {
69 $.log.debug('no suggest, return true');
70 return true;
71 }
72
73 var i = _tag.selected[c].i;
74 $.log.debug('take_suggested '+i+':'+s);
75 _tag.add_tag( s, i );
76 return false;
77 },
78
79 add_tag: function( t, i ) {
80 $.log.info('add '+i+': '+t);
81 _tag.focus();
82 jQuery.className.add( _tag.obj[i], 'entered' );
83 _tag.clean_selected();
84 $('#tags').val(
85 $('#tags').val().replace(
86 /[^ ]*$/, t + ' '
87 )
88 );
89 return false;
90 },
91
92 move_suggested: function( where ) {
93 var c = _tag.current;
94 if (c == null) {
95 $.log.error('_tag.current is null');
96 return;
97 }
98 var to = c + where;
99 $.log.info('move_suggested('+where+') '+c+' -> '+to);
100 if (to < 0 || to >= _tag.selected.length) {
101 $.log.error('move to invalid element '+to);
102 return;
103 }
104 var s = '#suggest a:nth('+c+')';
105 $( s ).removeClass('selected');
106 $.log.debug('remove selected from '+s);
107 s = '#suggest a:nth('+to+')';
108 $( s ).addClass('selected');
109 $.log.debug('add selected to '+s);
110 _tag.current = to;
111 },
112
113 last_tag: function() {
114 return $('#tags').val().replace(/^([^ ][^ ]* )*/, '');
115 },
116 focus: function() {
117 // $('#tags').focus() doesn't work!
118 document.getElementById('tags').focus();
119 }
120
121 };
122
123 $(document).ready( function() {
124
125 $('.tag').each( function(i) {
126 var n = this.firstChild.nodeValue;
127 _tag.name[i] = n;
128 _tag.obj[i] = this;
129 this.onclick = function() {
130 return _tag.add_tag( n, i );
131 }
132 });
133 $.log.info( 'found ' + _tag.name.length + ' tags' );
134
135 $.log.info( 'hook onchange to #tags_form' );
136 $('#tags_form').keyup( function(e) {
137
138 $.log.debug('keyup: '+e.keyCode);
139
140 switch (e.keyCode) {
141 case 38: // up
142 e.preventDefault();
143 _tag.move_suggested( -1 );
144 return false;
145 case 40: // down
146 e.preventDefault();
147 _tag.move_suggested( +1 );
148 return false;
149 case 9: // tab
150 case 13: // return
151 if (_tag.current != null) _tag.focus();
152 e.preventDefault();
153 return false;
154 }
155
156
157 var t = _tag.last_tag();
158
159 $.log.debug('tag: ' + t + ' ['+t.length+']');
160
161 _tag.clean_selected();
162
163 if (t == '') return false;
164
165 _tag.select(t);
166
167 $.log.info('selected ' + _tag.selected.length + ' tags');
168
169 return true;
170 }).submit( function() {
171 $.log.debug('submit');
172 return _tag.take_suggested();
173 }).blur( function() {
174 $.log.debug('blur');
175 return _tag.take_suggested();
176 });
177
178 $.log.toggle();
179
180 _tag.focus();
181 });
182

  ViewVC Help
Powered by ViewVC 1.1.26