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

Diff of /tag_complete/tag_complete.js

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 41 by dpavlin, Fri Aug 18 17:23:51 2006 UTC revision 52 by dpavlin, Sat Aug 19 12:53:59 2006 UTC
# Line 7  Line 7 
7  var _tag = {  var _tag = {
8          name: new Array(),          name: new Array(),
9          obj: new Array(),          obj: new Array(),
10          selected_name: new Array(),          selected: new Array(),
11          selected_obj: new Array()          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() {  $(document).ready( function() {
165    
166          $('.tag').each( function(i) {          $('.tag').each( function(i) {
167                  _tag.name[i] = this.firstChild.nodeValue;                  var n = this.firstChild.nodeValue;
168                    _tag.name[i] = n;
169                  _tag.obj[i] = this;                  _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' );          $.log.info( 'found ' + _tag.name.length + ' tags' );
176    
177          $.log.info( 'hook onchange to #tags_form' );          $.log.info( 'hook onchange to #tags_form' );
178          $('#tags_form').change( function() {          $('#tags_form').keyup( function(e) {
                 $.log.debug('submit #tags_form');  
                 //this.submit();  
                 return false;  
         }).keyup( function() {  
                 var t = $('#tags').val().replace(/^([^ ][^ ]* )*/, '');  
179    
180                  if (! t ) return;                  $.log.debug('keyup: '+e.keyCode);
181    
182                  $.log.debug('tag: ' + t);                  switch (e.keyCode) {
183                            case 38:        // up
184                  for(var i = 0; i < _tag.selected_obj.length; i++) {                                  e.preventDefault();
185                          jQuery.className.remove( _tag.selected_obj[i], 'selected' );                                  _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    
                 _tag.selected_name = Array();  
                 _tag.selected_obj = Array();  
                 var j = 0;  
198    
199                  if (t == '') return;                  var t = _tag.last_tag();
200    
201                  for(var i = 0; i < _tag.name.length; i++) {                  $.log.debug('tag: ' + t + ' ['+t.length+']');
                         if ( _tag.name[i].substr(0, t.length) == t ) {  
                                 var t = _tag.name[i];  
                                 $.log.debug('selected ' + t );  
202    
203                                  jQuery.className.add( _tag.obj[i], 'selected' );                  _tag.clean_selected();
204    
205                                  _tag.selected_obj[j] = _tag.obj[i];                  if (t == '') return false;
                                 _tag.selected_name[j] = _tag.name[i];  
                                 j++;  
                         }  
                 }  
206    
207                  $.log.debug('selected ' + _tag.selected_obj.length + ' tags');                  _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    
                 $('#suggest').html( _tag.selected_name.join(" ") );  
         }).focus();  
           
220          $.log.toggle();          $.log.toggle();
221    
222            _tag.focus();
223  });  });
224    

Legend:
Removed from v.41  
changed lines
  Added in v.52

  ViewVC Help
Powered by ViewVC 1.1.26