/[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

Annotation of /tag_complete/tag_complete.js

Parent Directory Parent Directory | Revision Log Revision Log


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

  ViewVC Help
Powered by ViewVC 1.1.26