]> git.donarmstrong.com Git - roundcube.git/blob - program/js/list.js
Imported Upstream version 0.2~stable
[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 false;
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 false;
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.clear_selection();
322 for(var n in this.rows){
323 if(!_3d||this.rows[n][_3d]==true){
324 this.last_selected=n;
325 this.highlight_row(n,true);
326 }
327 }
328 if(this.selection.join(",")!=_3e){
329 this.trigger_event("select");
330 }
331 this.focus();
332 return true;
333 },clear_selection:function(id){
334 var _41=this.selection.length;
335 if(id){
336 for(var n=0;n<this.selection.length;n++){
337 if(this.selection[n]==id){
338 this.selection.splice(n,1);
339 break;
340 }
341 }
342 }else{
343 for(var n=0;n<this.selection.length;n++){
344 if(this.rows[this.selection[n]]){
345 this.set_classname(this.rows[this.selection[n]].obj,"selected",false);
346 this.set_classname(this.rows[this.selection[n]].obj,"unfocused",false);
347 }
348 }
349 this.selection=new Array();
350 }
351 if(_41&&!this.selection.length){
352 this.trigger_event("select");
353 }
354 },get_selection:function(){
355 return this.selection;
356 },get_single_selection:function(){
357 if(this.selection.length==1){
358 return this.selection[0];
359 }else{
360 return null;
361 }
362 },highlight_row:function(id,_44){
363 if(this.rows[id]&&!_44){
364 if(this.selection.length>1||!this.in_selection(id)){
365 this.clear_selection();
366 this.selection[0]=id;
367 this.set_classname(this.rows[id].obj,"selected",true);
368 }
369 }else{
370 if(this.rows[id]){
371 if(!this.in_selection(id)){
372 this.selection[this.selection.length]=id;
373 this.set_classname(this.rows[id].obj,"selected",true);
374 }else{
375 var p=find_in_array(id,this.selection);
376 var _46=this.selection.slice(0,p);
377 var _47=this.selection.slice(p+1,this.selection.length);
378 this.selection=_46.concat(_47);
379 this.set_classname(this.rows[id].obj,"selected",false);
380 this.set_classname(this.rows[id].obj,"unfocused",false);
381 }
382 }
383 }
384 },key_press:function(e){
385 if(this.focused!=true){
386 return true;
387 }
388 var _49=rcube_event.get_keycode(e);
389 var _4a=rcube_event.get_modifier(e);
390 switch(_49){
391 case 40:
392 case 38:
393 case 63233:
394 case 63232:
395 rcube_event.cancel(e);
396 return this.use_arrow_key(_49,_4a);
397 default:
398 this.shiftkey=e.shiftKey;
399 this.key_pressed=_49;
400 this.trigger_event("keypress");
401 if(this.key_pressed==this.BACKSPACE_KEY){
402 return rcube_event.cancel(e);
403 }
404 }
405 return true;
406 },key_down:function(e){
407 switch(rcube_event.get_keycode(e)){
408 case 40:
409 case 38:
410 case 63233:
411 case 63232:
412 if(!rcube_event.get_modifier(e)&&this.focused){
413 return rcube_event.cancel(e);
414 }
415 default:
416 }
417 return true;
418 },use_arrow_key:function(_4c,_4d){
419 var _4e;
420 if(_4c==40||_4c==63233){
421 _4e=this.get_next_row();
422 }else{
423 if(_4c==38||_4c==63232){
424 _4e=this.get_prev_row();
425 }
426 }
427 if(_4e){
428 this.select_row(_4e.uid,_4d,true);
429 this.scrollto(_4e.uid);
430 }
431 return false;
432 },scrollto:function(id){
433 var row=this.rows[id].obj;
434 if(row&&this.frame){
435 var _51=Number(row.offsetTop);
436 if(_51<Number(this.frame.scrollTop)){
437 this.frame.scrollTop=_51;
438 }else{
439 if(_51+Number(row.offsetHeight)>Number(this.frame.scrollTop)+Number(this.frame.offsetHeight)){
440 this.frame.scrollTop=(_51+Number(row.offsetHeight))-Number(this.frame.offsetHeight);
441 }
442 }
443 }
444 },drag_mouse_move:function(e){
445 if(this.drag_start){
446 var m=rcube_event.get_mouse_pos(e);
447 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)){
448 return false;
449 }
450 if(!this.draglayer){
451 this.draglayer=new rcube_layer("rcmdraglayer",{x:0,y:0,vis:0,zindex:2000});
452 }
453 var _54="";
454 var c,i,_57,_58,obj;
455 for(var n=0;n<this.selection.length;n++){
456 if(n>12){
457 _54+="...";
458 break;
459 }
460 if(this.rows[this.selection[n]].obj){
461 obj=this.rows[this.selection[n]].obj;
462 _58="";
463 for(c=0,i=0;i<obj.childNodes.length;i++){
464 if(obj.childNodes[i].nodeName=="TD"){
465 if(((_57=obj.childNodes[i].firstChild)&&(_57.nodeType==3||_57.nodeName=="A"))&&(this.subject_col<0||(this.subject_col>=0&&this.subject_col==c))){
466 _58=_57.nodeType==3?_57.data:_57.innerHTML;
467 _54+=(_58.length>50?_58.substring(0,50)+"...":_58)+"<br />";
468 break;
469 }
470 c++;
471 }
472 }
473 }
474 }
475 this.draglayer.write(_54);
476 this.draglayer.show(1);
477 this.drag_active=true;
478 this.trigger_event("dragstart");
479 }
480 if(this.drag_active&&this.draglayer){
481 var pos=rcube_event.get_mouse_pos(e);
482 this.draglayer.move(pos.x+20,pos.y-5);
483 this.trigger_event("dragmove",e);
484 }
485 this.drag_start=false;
486 return false;
487 },drag_mouse_up:function(e){
488 document.onmousemove=null;
489 if(this.draglayer&&this.draglayer.visible){
490 this.draglayer.show(0);
491 }
492 this.drag_active=false;
493 this.trigger_event("dragend");
494 rcube_event.remove_listener({element:document,event:"mousemove",object:this,method:"drag_mouse_move"});
495 rcube_event.remove_listener({element:document,event:"mouseup",object:this,method:"drag_mouse_up"});
496 var _5d=document.getElementsByTagName("IFRAME");
497 for(var n in _5d){
498 var _5f;
499 if(_5d[n].contentDocument){
500 _5f=_5d[n].contentDocument;
501 }else{
502 if(_5d[n].contentWindow){
503 _5f=_5d[n].contentWindow.document;
504 }else{
505 if(_5d[n].document){
506 _5f=_5d[n].document;
507 }
508 }
509 }
510 if(_5f){
511 if(this.iframe_events[n]){
512 if(_5f.removeEventListener){
513 _5f.removeEventListener("mousemove",this.iframe_events[n],false);
514 }else{
515 if(_5f.detachEvent){
516 _5f.detachEvent("onmousemove",this.iframe_events[n]);
517 }else{
518 _5f["onmousemove"]=null;
519 }
520 }
521 }
522 rcube_event.remove_listener({element:_5f,event:"mouseup",object:this,method:"drag_mouse_up"});
523 }
524 }
525 this.focus();
526 return rcube_event.cancel(e);
527 },set_classname:function(obj,_61,set){
528 var reg=new RegExp("s*"+_61,"i");
529 if(!set&&obj.className.match(reg)){
530 obj.className=obj.className.replace(reg,"");
531 }else{
532 if(set&&!obj.className.match(reg)){
533 obj.className+=" "+_61;
534 }
535 }
536 },addEventListener:function(evt,_65){
537 if(this.events[evt]){
538 var _66=this.events[evt].length;
539 this.events[evt][_66]=_65;
540 return _66;
541 }else{
542 return false;
543 }
544 },removeEventListener:function(evt,_68){
545 if(this.events[evt]&&this.events[evt][_68]){
546 this.events[evt][_68]=null;
547 }
548 },trigger_event:function(evt,p){
549 if(this.events[evt]&&this.events[evt].length){
550 for(var i=0;i<this.events[evt].length;i++){
551 if(typeof (this.events[evt][i])=="function"){
552 this.events[evt][i](this,p);
553 }
554 }
555 }
556 }};
557