1 function rcube_list_widget(_1,p){
12 this.multiselect=false;
13 this.multi_selecting=false;
16 this.toggleselect=false;
17 this.dont_select=false;
18 this.drag_active=false;
21 this.in_selection_before=false;
23 this.drag_mouse_start=null;
24 this.dblclick_time=600;
25 this.row_init=function(){
27 this.events={click:[],dblclick:[],select:[],keypress:[],dragstart:[],dragmove:[],dragend:[]};
28 if(p&&typeof (p)=="object"){
34 rcube_list_widget.prototype={init:function(){
35 if(this.list&&this.list.tBodies[0]){
36 this.rows=new Array();
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")){
48 this.frame=this.list.parentNode;
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"});
54 },init_row:function(_6){
55 if(_6&&String(_6.id).match(/rcmrow([a-z0-9\-_=]+)/i)){
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);
63 _6.onmouseup=function(e){
64 return p.click_row(e,this.uid);
67 _6.onselectstart=function(){
71 this.row_init(this.rows[_8]);
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();
80 this.clear_selection();
82 },remove_row:function(_d,_e){
83 if(this.rows[_d].obj){
84 this.rows[_d].obj.style.display="none";
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);
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);
109 if(e||(e=window.event)){
110 rcube_event.cancel(e);
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);
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"))){
127 if(rcube_event.get_button(e)==2){
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);
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();
144 if(_1a[n].contentDocument){
145 _1c=_1a[n].contentDocument;
147 if(_1a[n].contentWindow){
148 _1c=_1a[n].contentWindow.document;
157 var pos=rcube_get_object_pos(document.getElementById(_1a[n].id));
158 this.iframe_events[n]=function(e){
160 return _1d.drag_mouse_move(e);
162 if(_1c.addEventListener){
163 _1c.addEventListener("mousemove",this.iframe_events[n],false);
165 if(_1a[n].attachEvent){
166 _1c.attachEvent("onmousemove",this.iframe_events[n]);
168 _1c["onmousemove"]=this.iframe_events[n];
171 rcube_event.add_listener({element:_1c,event:"mouseup",object:this,method:"drag_mouse_up"});
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"))){
183 if(this.dont_select){
184 this.dont_select=false;
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);
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");
196 this.trigger_event("click");
198 if(!this.drag_active){
199 rcube_event.cancel(e);
201 this.rows[id].clicked=now;
203 },get_next_row:function(){
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")){
213 },get_prev_row:function(){
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;
223 },get_last_row:function(){
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){
233 },select_row:function(id,_2d,_2e){
234 var _2f=this.selection.join(",");
235 if(!this.multiselect){
238 if(!this.shift_start){
243 this.highlight_row(id,false);
244 this.multi_selecting=false;
248 this.shift_select(id,false);
252 this.highlight_row(id,true);
255 case CONTROL_SHIFT_KEY:
256 this.shift_select(id,true);
259 this.highlight_row(id,false);
262 this.multi_selecting=true;
264 if(this.selection.join(",")!=_2f){
265 this.trigger_event("select");
267 if(this.last_selected!=0&&this.rows[this.last_selected]){
268 this.set_classname(this.rows[this.last_selected].obj,"focused",false);
270 if(this.toggleselect&&this.last_selected==id){
271 this.clear_selection();
274 this.set_classname(this.rows[id].obj,"focused",true);
276 if(!this.selection.length){
277 this.shift_start=null;
279 this.last_selected=id;
280 },select:function(id){
281 this.select_row(id,false);
283 },select_next:function(){
284 var _31=this.get_next_row();
285 var _32=this.get_prev_row();
286 var _33=(_31)?_31:_32;
288 this.select_row(_33.uid,false,false);
290 },shift_select:function(id,_35){
291 if(!this.rows[this.shift_start]||!this.selection.length){
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);
304 if(this.in_selection(n)&&!_35){
305 this.highlight_row(n,true);
309 },in_selection:function(id){
310 for(var n in this.selection){
311 if(this.selection[n]==id){
316 },select_all:function(_3d){
317 if(!this.rows||!this.rows.length){
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);
328 if(this.selection.join(",")!=_3e){
329 this.trigger_event("select");
333 },clear_selection:function(id){
334 var _41=this.selection.length;
336 for(var n=0;n<this.selection.length;n++){
337 if(this.selection[n]==id){
338 this.selection.splice(n,1);
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);
349 this.selection=new Array();
351 if(_41&&!this.selection.length){
352 this.trigger_event("select");
354 },get_selection:function(){
355 return this.selection;
356 },get_single_selection:function(){
357 if(this.selection.length==1){
358 return this.selection[0];
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);
371 if(!this.in_selection(id)){
372 this.selection[this.selection.length]=id;
373 this.set_classname(this.rows[id].obj,"selected",true);
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);
384 },key_press:function(e){
385 if(this.focused!=true){
388 var _49=rcube_event.get_keycode(e);
389 var _4a=rcube_event.get_modifier(e);
395 rcube_event.cancel(e);
396 return this.use_arrow_key(_49,_4a);
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);
406 },key_down:function(e){
407 switch(rcube_event.get_keycode(e)){
412 if(!rcube_event.get_modifier(e)&&this.focused){
413 return rcube_event.cancel(e);
418 },use_arrow_key:function(_4c,_4d){
420 if(_4c==40||_4c==63233){
421 _4e=this.get_next_row();
423 if(_4c==38||_4c==63232){
424 _4e=this.get_prev_row();
428 this.select_row(_4e.uid,_4d,true);
429 this.scrollto(_4e.uid);
432 },scrollto:function(id){
433 var row=this.rows[id].obj;
435 var _51=Number(row.offsetTop);
436 if(_51<Number(this.frame.scrollTop)){
437 this.frame.scrollTop=_51;
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);
444 },drag_mouse_move:function(e){
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)){
451 this.draglayer=new rcube_layer("rcmdraglayer",{x:0,y:0,vis:0,zindex:2000});
455 for(var n=0;n<this.selection.length;n++){
460 if(this.rows[this.selection[n]].obj){
461 obj=this.rows[this.selection[n]].obj;
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 />";
475 this.draglayer.write(_54);
476 this.draglayer.show(1);
477 this.drag_active=true;
478 this.trigger_event("dragstart");
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);
485 this.drag_start=false;
487 },drag_mouse_up:function(e){
488 document.onmousemove=null;
489 if(this.draglayer&&this.draglayer.visible){
490 this.draglayer.show(0);
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");
499 if(_5d[n].contentDocument){
500 _5f=_5d[n].contentDocument;
502 if(_5d[n].contentWindow){
503 _5f=_5d[n].contentWindow.document;
511 if(this.iframe_events[n]){
512 if(_5f.removeEventListener){
513 _5f.removeEventListener("mousemove",this.iframe_events[n],false);
516 _5f.detachEvent("onmousemove",this.iframe_events[n]);
518 _5f["onmousemove"]=null;
522 rcube_event.remove_listener({element:_5f,event:"mouseup",object:this,method:"drag_mouse_up"});
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,"");
532 if(set&&!obj.className.match(reg)){
533 obj.className+=" "+_61;
536 },addEventListener:function(evt,_65){
537 if(this.events[evt]){
538 var _66=this.events[evt].length;
539 this.events[evt][_66]=_65;
544 },removeEventListener:function(evt,_68){
545 if(this.events[evt]&&this.events[evt][_68]){
546 this.events[evt][_68]=null;
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);