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

Legend:
Removed from v.44  
changed lines
  Added in v.45

  ViewVC Help
Powered by ViewVC 1.1.26