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

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

  ViewVC Help
Powered by ViewVC 1.1.26