]> git.donarmstrong.com Git - roundcube.git/blob - program/js/list.js
Imported Upstream version 0.2.2
[roundcube.git] / program / js / list.js
1 function rcube_list_widget(_1,p){
2 this.ENTER_KEY=13;
3 this.DELETE_KEY=46;
4 this.BACKSPACE_KEY=8;
5 this.list=_1?_1:null;
6 this.frame=null;
7 this.rows=[];
8 this.selection=[];
9 this.rowcount=0;
10 this.subject_col=-1;
11 this.shiftkey=false;
12 this.multiselect=false;
13 this.multi_selecting=false;
14 this.draggable=false;
15 this.keyboard=false;
16 this.toggleselect=false;
17 this.dont_select=false;
18 this.drag_active=false;
19 this.last_selected=0;
20 this.shift_start=0;
21 this.in_selection_before=false;
22 this.focused=false;
23 this.drag_mouse_start=null;
24 this.dblclick_time=600;
25 this.row_init=function(){
26 };
27 this.events={click:[],dblclick:[],select:[],keypress:[],dragstart:[],dragmove:[],dragend:[]};
28 if(p&&typeof (p)=="object"){
29 for(var n in p){
30 this[n]=p[n];
31 }
32 }
33 };
34 rcube_list_widget.prototype={init:function(){
35 if(this.list&&this.list.tBodies[0]){
36 this.rows=new Array();
37 this.rowcount=0;
38 var _4;
39 for(var r=0;r<this.list.tBodies[0].childNodes.length;r++){
40 _4=this.list.tBodies[0].childNodes[r];
41 while(_4&&(_4.nodeType!=1||_4.style.display=="none")){
42 _4=_4.nextSibling;
43 r++;
44 }
45 this.init_row(_4);
46 this.rowcount++;
47 }
48 this.frame=this.list.parentNode;
49 if(this.keyboard){
50 rcube_event.add_listener({element:document,event:"keyup",object:this,method:"key_press"});
51 rcube_event.add_listener({element:document,event:"keydown",object:this,method:"key_down"});
52 }
53 }
54 },init_row:function(_6){
55 if(_6&&String(_6.id).match(/rcmrow([a-z0-9\-_=\+\/]+)/i)){
56 var p=this;
57 var _8=RegExp.$1;
58 _6.uid=_8;
59 this.rows[_8]={uid:_8,id:_6.id,obj:_6,classname:_6.className};
60 _6.onmousedown=function(e){
61 return p.drag_row(e,this.uid);
62 };
63 _6.onmouseup=function(e){
64 return p.click_row(e,this.uid);
65 };
66 if(document.all){
67 _6.onselectstart=function(){
68 return false;
69 };
70 }
71 this.row_init(this.rows[_8]);
72 }
73 },clear:function(_b){
74 var _c=document.createElement("TBODY");
75 this.list.insertBefore(_c,this.list.tBodies[0]);
76 this.list.removeChild(this.list.tBodies[1]);
77 this.rows=new Array();
78 this.rowcount=0;
79 if(_b){
80 this.clear_selection();
81 }
82 },remove_row:function(_d,_e){
83 if(this.rows[_d].obj){
84 this.rows[_d].obj.style.display="none";
85 }
86 if(_e){
87 this.select_next();
88 }
89 this.rows[_d]=null;
90 this.rowcount--;
91 },insert_row:function(_f,_10){
92 var _11=this.list.tBodies[0];
93 if(_10&&_11.rows.length){
94 _11.insertBefore(_f,_11.firstChild);
95 }else{
96 _11.appendChild(_f);
97 }
98 this.init_row(_f);
99 this.rowcount++;
100 },focus:function(e){
101 this.focused=true;
102 for(var n=0;n<this.selection.length;n++){
103 id=this.selection[n];
104 if(this.rows[id]&&this.rows[id].obj){
105 this.set_classname(this.rows[id].obj,"selected",true);
106 this.set_classname(this.rows[id].obj,"unfocused",false);
107 }
108 }
109 if(e||(e=window.event)){
110 rcube_event.cancel(e);
111 }
112 },blur:function(){
113 var id;
114 this.focused=false;
115 for(var n=0;n<this.selection.length;n++){
116 id=this.selection[n];
117 if(this.rows[id]&&this.rows[id].obj){
118 this.set_classname(this.rows[id].obj,"selected",false);
119 this.set_classname(this.rows[id].obj,"unfocused",true);
120 }
121 }
122 },drag_row:function(e,id){
123 var _18=rcube_event.get_target(e);
124 if(this.dont_select||(_18&&(_18.tagName=="INPUT"||_18.tagName=="IMG"))){
125 return true;
126 }
127 if(rcube_event.get_button(e)==2){
128 return true;
129 }
130 this.in_selection_before=this.in_selection(id)?id:false;
131 if(!this.in_selection_before){
132 var _19=rcube_event.get_modifier(e);
133 this.select_row(id,_19,false);
134 }
135 if(this.draggable&&this.selection.length){
136 this.drag_start=true;
137 this.drag_mouse_start=rcube_event.get_mouse_pos(e);
138 rcube_event.add_listener({element:document,event:"mousemove",object:this,method:"drag_mouse_move"});
139 rcube_event.add_listener({element:document,event:"mouseup",object:this,method:"drag_mouse_up"});
140 var _1a=document.getElementsByTagName("IFRAME");
141 this.iframe_events=Object();
142 for(var n in _1a){
143 var _1c=null;
144 if(_1a[n].contentDocument){
145 _1c=_1a[n].contentDocument;
146 }else{
147 if(_1a[n].contentWindow){
148 _1c=_1a[n].contentWindow.document;
149 }else{
150 if(_1a[n].document){
151 _1c=_1a[n].document;
152 }
153 }
154 }
155 if(_1c){
156 var _1d=this;
157 var pos=rcube_get_object_pos(document.getElementById(_1a[n].id));
158 this.iframe_events[n]=function(e){
159 e._offset=pos;
160 return _1d.drag_mouse_move(e);
161 };
162 if(_1c.addEventListener){
163 _1c.addEventListener("mousemove",this.iframe_events[n],false);
164 }else{
165 if(_1a[n].attachEvent){
166 _1c.attachEvent("onmousemove",this.iframe_events[n]);
167 }else{
168 _1c["onmousemove"]=this.iframe_events[n];
169 }
170 }
171 rcube_event.add_listener({element:_1c,event:"mouseup",object:this,method:"drag_mouse_up"});
172 }
173 }
174 }
175 return false;
176 },click_row:function(e,id){
177 var now=new Date().getTime();
178 var _23=rcube_event.get_modifier(e);
179 var _24=rcube_event.get_target(e);
180 if((_24&&(_24.tagName=="INPUT"||_24.tagName=="IMG"))){
181 return true;
182 }
183 if(this.dont_select){
184 this.dont_select=false;
185 return false;
186 }
187 var _25=now-this.rows[id].clicked<this.dblclick_time;
188 if(!this.drag_active&&this.in_selection_before==id&&!_25){
189 this.select_row(id,_23,false);
190 }
191 this.drag_start=false;
192 this.in_selection_before=false;
193 if(this.rows&&_25&&this.in_selection(id)){
194 this.trigger_event("dblclick");
195 }else{
196 this.trigger_event("click");
197 }
198 if(!this.drag_active){
199 rcube_event.cancel(e);
200 }
201 this.rows[id].clicked=now;
202 return false;
203 },get_next_row:function(){
204 if(!this.rows){
205 return false;
206 }
207 var _26=this.rows[this.last_selected];
208 var _27=_26?_26.obj.nextSibling:null;
209 while(_27&&(_27.nodeType!=1||_27.style.display=="none")){
210 _27=_27.nextSibling;
211 }
212 return _27;
213 },get_prev_row:function(){
214 if(!this.rows){
215 return false;
216 }
217 var _28=this.rows[this.last_selected];
218 var _29=_28?_28.obj.previousSibling:null;
219 while(_29&&(_29.nodeType!=1||_29.style.display=="none")){
220 _29=_29.previousSibling;
221 }
222 return _29;
223 },get_last_row:function(){
224 if(this.rowcount){
225 var _2a=this.list.tBodies[0].rows;
226 for(var i=_2a.length-1;i>=0;i--){
227 if(_2a[i].id&&String(_2a[i].id).match(/rcmrow([a-z0-9\-_=\+\/]+)/i)&&this.rows[RegExp.$1]!=null){
228 return RegExp.$1;
229 }
230 }
231 }
232 return null;
233 },select_row:function(id,_2d,_2e){
234 var _2f=this.selection.join(",");
235 if(!this.multiselect){
236 _2d=0;
237 }
238 if(!this.shift_start){
239 this.shift_start=id;
240 }
241 if(!_2d){
242 this.shift_start=id;
243 this.highlight_row(id,false);
244 this.multi_selecting=false;
245 }else{
246 switch(_2d){
247 case SHIFT_KEY:
248 this.shift_select(id,false);
249 break;
250 case CONTROL_KEY:
251 if(!_2e){
252 this.highlight_row(id,true);
253 }
254 break;
255 case CONTROL_SHIFT_KEY:
256 this.shift_select(id,true);
257 break;
258 default:
259 this.highlight_row(id,false);
260 break;
261 }
262 this.multi_selecting=true;
263 }
264 if(this.selection.join(",")!=_2f){
265 this.trigger_event("select");
266 }
267 if(this.last_selected!=0&&this.rows[this.last_selected]){
268 this.set_classname(this.rows[this.last_selected].obj,"focused",false);
269 }
270 if(this.toggleselect&&this.last_selected==id){
271 this.clear_selection();
272 id=null;
273 }else{
274 this.set_classname(this.rows[id].obj,"focused",true);
275 }
276 if(!this.selection.length){
277 this.shift_start=null;
278 }
279 this.last_selected=id;
280 },select:function(id){
281 this.select_row(id,false);
282 this.scrollto(id);
283 },select_next:function(){
284 var _31=this.get_next_row();
285 var _32=this.get_prev_row();
286 var _33=(_31)?_31:_32;
287 if(_33){
288 this.select_row(_33.uid,false,false);
289 }
290 },shift_select:function(id,_35){
291 if(!this.rows[this.shift_start]||!this.selection.length){
292 this.shift_start=id;
293 }
294 var _36=this.rows[this.shift_start].obj.rowIndex;
295 var _37=this.rows[id].obj.rowIndex;
296 var i=((_36<_37)?_36:_37);
297 var j=((_36>_37)?_36:_37);
298 for(var n in this.rows){
299 if((this.rows[n].obj.rowIndex>=i)&&(this.rows[n].obj.rowIndex<=j)){
300 if(!this.in_selection(n)){
301 this.highlight_row(n,true);
302 }
303 }else{
304 if(this.in_selection(n)&&!_35){
305 this.highlight_row(n,true);
306 }
307 }
308 }
309 },in_selection:function(id){
310 for(var n in this.selection){
311 if(this.selection[n]==id){
312 return true;
313 }
314 }
315 return false;
316 },select_all:function(_3d){
317 if(!this.rows||!this.rows.length){
318 return false;
319 }
320 var _3e=this.selection.join(",");
321 this.selection=new Array();
322 for(var n in this.rows){
323 if(!_3d||(this.rows[n]&&this.rows[n][_3d]==true)){
324 this.last_selected=n;
325 this.highlight_row(n,true);
326 }else{
327 if(this.rows[n]){
328 this.set_classname(this.rows[n].obj,"selected",false);
329 this.set_classname(this.rows[n].obj,"unfocused",false);
330 }
331 }
332 }
333 if(this.selection.join(",")!=_3e){
334 this.trigger_event("select");
335 }
336 this.focus();
337 return true;
338 },clear_selection:function(id){
339 var _41=this.selection.length;
340 if(id){
341 for(var n=0;n<this.selection.length;n++){
342 if(this.selection[n]==id){
343 this.selection.splice(n,1);
344 break;
345 }
346 }
347 }else{
348 for(var n=0;n<this.selection.length;n++){
349 if(this.rows[this.selection[n]]){
350 this.set_classname(this.rows[this.selection[n]].obj,"selected",false);
351 this.set_classname(this.rows[this.selection[n]].obj,"unfocused",false);
352 }
353 }
354 this.selection=new Array();
355 }
356 if(_41&&!this.selection.length){
357 this.trigger_event("select");
358 }
359 },get_selection:function(){
360 return this.selection;
361 },get_single_selection:function(){
362 if(this.selection.length==1){
363 return this.selection[0];
364 }else{
365 return null;
366 }
367 },highlight_row:function(id,_44){
368 if(this.rows[id]&&!_44){
369 if(this.selection.length>1||!this.in_selection(id)){
370 this.clear_selection();
371 this.selection[0]=id;
372 this.set_classname(this.rows[id].obj,"selected",true);
373 }
374 }else{
375 if(this.rows[id]){
376 if(!this.in_selection(id)){
377 this.selection[this.selection.length]=id;
378 this.set_classname(this.rows[id].obj,"selected",true);
379 }else{
380 var p=find_in_array(id,this.selection);
381 var _46=this.selection.slice(0,p);
382 var _47=this.selection.slice(p+1,this.selection.length);
383 this.selection=_46.concat(_47);
384 this.set_classname(this.rows[id].obj,"selected",false);
385 this.set_classname(this.rows[id].obj,"unfocused",false);
386 }
387 }
388 }
389 },key_press:function(e){
390 if(this.focused!=true){
391 return true;
392 }
393 var _49=rcube_event.get_keycode(e);
394 var _4a=rcube_event.get_modifier(e);
395 switch(_49){
396 case 40:
397 case 38:
398 case 63233:
399 case 63232:
400 rcube_event.cancel(e);
401 return this.use_arrow_key(_49,_4a);
402 default:
403 this.shiftkey=e.shiftKey;
404 this.key_pressed=_49;
405 this.trigger_event("keypress");
406 if(this.key_pressed==this.BACKSPACE_KEY){
407 return rcube_event.cancel(e);
408 }
409 }
410 return true;
411 },key_down:function(e){
412 switch(rcube_event.get_keycode(e)){
413 case 40:
414 case 38:
415 case 63233:
416 case 63232:
417 if(!rcube_event.get_modifier(e)&&this.focused){
418 return rcube_event.cancel(e);
419 }
420 default:
421 }
422 return true;
423 },use_arrow_key:function(_4c,_4d){
424 var _4e;
425 if(_4c==40||_4c==63233){
426 _4e=this.get_next_row();
427 }else{
428 if(_4c==38||_4c==63232){
429 _4e=this.get_prev_row();
430 }
431 }
432 if(_4e){
433 this.select_row(_4e.uid,_4d,true);
434 this.scrollto(_4e.uid);
435 }
436 return false;
437 },scrollto:function(id){
438 var row=this.rows[id].obj;
439 if(row&&this.frame){
440 var _51=Number(row.offsetTop);
441 if(_51<Number(this.frame.scrollTop)){
442 this.frame.scrollTop=_51;
443 }else{
444 if(_51+Number(row.offsetHeight)>Number(this.frame.scrollTop)+Number(this.frame.offsetHeight)){
445 this.frame.scrollTop=(_51+Number(row.offsetHeight))-Number(this.frame.offsetHeight);
446 }
447 }
448 }
449 },drag_mouse_move:function(e){
450 if(this.drag_start){
451 var m=rcube_event.get_mouse_pos(e);
452 if(!this.drag_mouse_start||(Math.abs(m.x-this.drag_mouse_start.x)<3&&Math.abs(m.y-this.drag_mouse_start.y)<3)){
453 return false;
454 }
455 if(!this.draglayer){
456 this.draglayer=new rcube_layer("rcmdraglayer",{x:0,y:0,vis:0,zindex:2000});
457 }
458 var _54="";
459 var c,i,_57,_58,obj;
460 for(var n=0;n<this.selection.length;n++){
461 if(n>12){
462 _54+="...";
463 break;
464 }
465 if(this.rows[this.selection[n]].obj){
466 obj=this.rows[this.selection[n]].obj;
467 _58="";
468 for(c=0,i=0;i<obj.childNodes.length;i++){
469 if(obj.childNodes[i].nodeName=="TD"){
470 if(((_57=obj.childNodes[i].firstChild)&&(_57.nodeType==3||_57.nodeName=="A"))&&(this.subject_col<0||(this.subject_col>=0&&this.subject_col==c))){
471 _58=_57.nodeType==3?_57.data:_57.innerHTML;
472 _58=_58.replace(/^\s+/i,"");
473 _54+=(_58.length>50?_58.substring(0,50)+"...":_58)+"<br />";
474 break;
475 }
476 c++;
477 }
478 }
479 }
480 }
481 this.draglayer.write(_54);
482 this.draglayer.show(1);
483 this.drag_active=true;
484 this.trigger_event("dragstart");
485 }
486 if(this.drag_active&&this.draglayer){
487 var pos=rcube_event.get_mouse_pos(e);
488 this.draglayer.move(pos.x+20,bw.ie?pos.y-5+document.documentElement.scrollTop:pos.y-5);
489 this.trigger_event("dragmove",e);
490 }
491 this.drag_start=false;
492 return false;
493 },drag_mouse_up:function(e){
494 document.onmousemove=null;
495 if(this.draglayer&&this.draglayer.visible){
496 this.draglayer.show(0);
497 }
498 this.drag_active=false;
499 this.trigger_event("dragend");
500 rcube_event.remove_listener({element:document,event:"mousemove",object:this,method:"drag_mouse_move"});
501 rcube_event.remove_listener({element:document,event:"mouseup",object:this,method:"drag_mouse_up"});
502 var _5d=document.getElementsByTagName("IFRAME");
503 for(var n in _5d){
504 var _5f;
505 if(_5d[n].contentDocument){
506 _5f=_5d[n].contentDocument;
507 }else{
508 if(_5d[n].contentWindow){
509 _5f=_5d[n].contentWindow.document;
510 }else{
511 if(_5d[n].document){
512 _5f=_5d[n].document;
513 }
514 }
515 }
516 if(_5f){
517 if(this.iframe_events[n]){
518 if(_5f.removeEventListener){
519 _5f.removeEventListener("mousemove",this.iframe_events[n],false);
520 }else{
521 if(_5f.detachEvent){
522 _5f.detachEvent("onmousemove",this.iframe_events[n]);
523 }else{
524 _5f["onmousemove"]=null;
525 }
526 }
527 }
528 rcube_event.remove_listener({element:_5f,event:"mouseup",object:this,method:"drag_mouse_up"});
529 }
530 }
531 return rcube_event.cancel(e);
532 },set_classname:function(obj,_61,set){
533 var reg=new RegExp("s*"+_61,"i");
534 if(!set&&obj.className.match(reg)){
535 obj.className=obj.className.replace(reg,"");
536 }else{
537 if(set&&!obj.className.match(reg)){
538 obj.className+=" "+_61;
539 }
540 }
541 },addEventListener:function(evt,_65){
542 if(this.events[evt]){
543 var _66=this.events[evt].length;
544 this.events[evt][_66]=_65;
545 return _66;
546 }else{
547 return false;
548 }
549 },removeEventListener:function(evt,_68){
550 if(this.events[evt]&&this.events[evt][_68]){
551 this.events[evt][_68]=null;
552 }
553 },trigger_event:function(evt,p){
554 if(this.events[evt]&&this.events[evt].length){
555 for(var i=0;i<this.events[evt].length;i++){
556 if(typeof (this.events[evt][i])=="function"){
557 this.events[evt][i](this,p);
558 }
559 }
560 }
561 }};
562