/[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 51 by dpavlin, Sat Aug 19 10:50:49 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()  
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() {  $(document).ready( function() {
124    
125          $('.tag').each( function(i) {          $('.tag').each( function(i) {
126                  _tag.name[i] = this.firstChild.nodeValue;                  var n = this.firstChild.nodeValue;
127                    _tag.name[i] = n;
128                  _tag.obj[i] = this;                  _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' );          $.log.info( 'found ' + _tag.name.length + ' tags' );
134    
135          $.log.info( 'hook onchange to #tags_form' );          $.log.info( 'hook onchange to #tags_form' );
136          $('#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(/^([^ ][^ ]* )*/, '');  
   
                 if (! t ) return;  
137    
138                  $.log.debug('tag: ' + t);                  $.log.debug('keyup: '+e.keyCode);
139    
140                  for(var i = 0; i < _tag.selected_obj.length; i++) {                  switch (e.keyCode) {
141                          jQuery.className.remove( _tag.selected_obj[i], 'selected' );                          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    
                 _tag.selected_name = Array();  
                 _tag.selected_obj = Array();  
                 var j = 0;  
156    
157                  if (t == '') return;                  var t = _tag.last_tag();
158    
159                  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 );  
160    
161                                  jQuery.className.add( _tag.obj[i], 'selected' );                  _tag.clean_selected();
162    
163                                  _tag.selected_obj[j] = _tag.obj[i];                  if (t == '') return false;
164                                  _tag.selected_name[j] = _tag.name[i];  
165                                  j++;                  _tag.select(t);
                         }  
                 }  
166    
167                  $.log.debug('selected ' + _tag.selected_obj.length + ' tags');                  $.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    
                 $('#suggest').html( _tag.selected_name.join(" ") );  
         }).focus();  
           
178          $.log.toggle();          $.log.toggle();
179    
180            _tag.focus();
181  });  });
182    

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

  ViewVC Help
Powered by ViewVC 1.1.26