Files
odoo_source/addons/web_calendar/static/lib/dhtmlxScheduler/sources/scheduler.js
T

715 lines
24 KiB
JavaScript

/*
This software is allowed to use under GPL or you need to obtain Commercial or Enterise License
to use it in not GPL project. Please contact sales@dhtmlx.com for details
*/
window.dhtmlXScheduler=window.scheduler={version:3.0};
dhtmlxEventable(scheduler);
scheduler.init=function(id,date,mode){
date=date||(new Date());
mode=mode||"week";
scheduler.date.init();
this._obj=(typeof id == "string")?document.getElementById(id):id;
this._els=[];
this._scroll=true;
this._quirks=(_isIE && document.compatMode == "BackCompat");
this._quirks7=(_isIE && navigator.appVersion.indexOf("MSIE 8")==-1);
this.get_elements();
this.init_templates();
this.set_actions();
dhtmlxEvent(window,"resize",function(){
window.clearTimeout(scheduler._resize_timer);
scheduler._resize_timer=window.setTimeout(function(){
if (scheduler.callEvent("onSchedulerResize",[]))
scheduler.update_view();
}, 100);
});
this.set_sizes();
scheduler.callEvent('onSchedulerReady', []);
this.setCurrentView(date,mode);
};
scheduler.xy={
nav_height:22,
min_event_height:40,
scale_width:50,
bar_height:20,
scroll_width:18,
scale_height:20,
month_scale_height:20,
menu_width:25,
margin_top:0,
margin_left:0,
editor_width:140
};
scheduler.keys={
edit_save:13,
edit_cancel:27
};
scheduler.set_sizes=function(){
var w = this._x = this._obj.clientWidth-this.xy.margin_left;
var h = this._y = this._obj.clientHeight-this.xy.margin_top;
//not-table mode always has scroll - need to be fixed in future
var scale_x=this._table_view?0:(this.xy.scale_width+this.xy.scroll_width);
var scale_s=this._table_view?-1:this.xy.scale_width;
this.set_xy(this._els["dhx_cal_navline"][0],w,this.xy.nav_height,0,0);
this.set_xy(this._els["dhx_cal_header"][0],w-scale_x,this.xy.scale_height,scale_s,this.xy.nav_height+(this._quirks?-1:1));
//to support alter-skin, we need a way to alter height directly from css
var actual_height = this._els["dhx_cal_navline"][0].offsetHeight;
if (actual_height > 0) this.xy.nav_height = actual_height;
var data_y=this.xy.scale_height+this.xy.nav_height+(this._quirks?-2:0);
this.set_xy(this._els["dhx_cal_data"][0],w,h-(data_y+2),0,data_y+2);
};
scheduler.set_xy=function(node,w,h,x,y){
node.style.width=Math.max(0,w)+"px";
node.style.height=Math.max(0,h)+"px";
if (arguments.length>3){
node.style.left=x+"px";
node.style.top=y+"px";
}
};
scheduler.get_elements=function(){
//get all child elements as named hash
var els=this._obj.getElementsByTagName("DIV");
for (var i=0; i < els.length; i++){
var name=els[i].className;
if (!this._els[name]) this._els[name]=[];
this._els[name].push(els[i]);
//check if name need to be changed
var t=scheduler.locale.labels[els[i].getAttribute("name")||name];
if (t) els[i].innerHTML=t;
}
};
scheduler.set_actions=function(){
for (var a in this._els)
if (this._click[a])
for (var i=0; i < this._els[a].length; i++)
this._els[a][i].onclick=scheduler._click[a];
this._obj.onselectstart=function(e){ return false; };
this._obj.onmousemove=function(e){
scheduler._on_mouse_move(e||event);
};
this._obj.onmousedown=function(e){
scheduler._on_mouse_down(e||event);
};
this._obj.onmouseup=function(e){
scheduler._on_mouse_up(e||event);
};
this._obj.ondblclick=function(e){
scheduler._on_dbl_click(e||event);
}
};
scheduler.select=function(id){
if (this._table_view || !this.getEvent(id)._timed) return; //temporary block
if (this._select_id==id) return;
this.editStop(false);
this.unselect();
this._select_id = id;
this.updateEvent(id);
};
scheduler.unselect=function(id){
if (id && id!=this._select_id) return;
var t=this._select_id;
this._select_id = null;
if (t) this.updateEvent(t);
};
scheduler.getState=function(){
return {
mode: this._mode,
date: this._date,
min_date: this._min_date,
max_date: this._max_date,
editor_id: this._edit_id,
lightbox_id: this._lightbox_id,
new_event: this._new_event
};
};
scheduler._click={
dhx_cal_data:function(e){
//debugger;
var trg = e?e.target:event.srcElement;
var id = scheduler._locate_event(trg);
e = e || event;
if ((id && !scheduler.callEvent("onClick",[id,e])) ||scheduler.config.readonly) return;
if (id) {
scheduler.select(id);
var mask = trg.className;
if (mask.indexOf("_icon")!=-1)
scheduler._click.buttons[mask.split(" ")[1].replace("icon_","")](id);
} else
scheduler._close_not_saved();
},
dhx_cal_prev_button:function(){
scheduler._click.dhx_cal_next_button(0,-1);
},
dhx_cal_next_button:function(dummy,step){
scheduler.setCurrentView(scheduler.date.add( //next line changes scheduler._date , but seems it has not side-effects
scheduler.date[scheduler._mode+"_start"](scheduler._date),(step||1),scheduler._mode));
},
dhx_cal_today_button:function(){
scheduler.setCurrentView(new Date());
},
dhx_cal_tab:function(){
var name = this.getAttribute("name");
var mode = name.substring(0, name.search("_tab"));
scheduler.setCurrentView(scheduler._date,mode);
},
buttons:{
"delete":function(id){ var c=scheduler.locale.labels.confirm_deleting; if (!c||confirm(c)) scheduler.deleteEvent(id); },
edit:function(id){ scheduler.edit(id); },
save:function(id){ scheduler.editStop(true); },
details:function(id){ scheduler.showLightbox(id); },
cancel:function(id){ scheduler.editStop(false); }
}
};
scheduler.addEventNow=function(start,end,e){
var base = {};
if (start && start.constructor.toString().match(/object/i) !== null){
base = start;
start = null;
}
var d = (this.config.event_duration||this.config.time_step)*60000;
if (!start) start = Math.round((new Date()).valueOf()/d)*d;
var start_date = new Date(start);
if (!end){
var start_hour = this.config.first_hour;
if (start_hour > start_date.getHours()){
start_date.setHours(start_hour);
start = start_date.valueOf();
}
end = start+d;
}
var end_date = new Date(end);
// scheduler.addEventNow(new Date(), new Date()) + collision though get_visible events defect (such event was not retrieved)
if(start_date.valueOf() == end_date.valueOf())
end_date.setTime(end_date.valueOf()+d);
base.start_date = base.start_date||start_date;
base.end_date = base.end_date||end_date;
base.text = base.text||this.locale.labels.new_event;
base.id = this._drag_id = this.uid();
this._drag_mode="new-size";
this._loading=true;
this.addEvent(base);
this.callEvent("onEventCreated",[this._drag_id,e]);
this._loading=false;
this._drag_event={}; //dummy , to trigger correct event updating logic
this._on_mouse_up(e);
};
scheduler._on_dbl_click=function(e,src){
src = src||(e.target||e.srcElement);
if (this.config.readonly) return;
var name = src.className.split(" ")[0];
switch(name){
case "dhx_scale_holder":
case "dhx_scale_holder_now":
case "dhx_month_body":
case "dhx_wa_day_data":
if (!scheduler.config.dblclick_create) break;
var pos=this._mouse_coords(e);
var start=this._min_date.valueOf()+(pos.y*this.config.time_step+(this._table_view?0:pos.x)*24*60)*60000;
start = this._correct_shift(start);
this.addEventNow(start,null,e);
break;
case "dhx_body":
case "dhx_wa_ev_body":
case "dhx_cal_event_line":
case "dhx_cal_event_clear":
var id = this._locate_event(src);
if (!this.callEvent("onDblClick",[id,e])) return;
if (this.config.details_on_dblclick || this._table_view || !this.getEvent(id)._timed)
this.showLightbox(id);
else
this.edit(id);
break;
case "":
if (src.parentNode)
return scheduler._on_dbl_click(e,src.parentNode);
default:
var t = this["dblclick_"+name];
if (t) t.call(this,e);
break;
}
};
scheduler._mouse_coords=function(ev){
var pos;
var b=document.body;
var d = document.documentElement;
if(ev.pageX || ev.pageY)
pos={x:ev.pageX, y:ev.pageY};
else pos={
x:ev.clientX + (b.scrollLeft||d.scrollLeft||0) - b.clientLeft,
y:ev.clientY + (b.scrollTop||d.scrollTop||0) - b.clientTop
};
//apply layout
pos.x-=getAbsoluteLeft(this._obj)+(this._table_view?0:this.xy.scale_width);
pos.y-=getAbsoluteTop(this._obj)+this.xy.nav_height+(this._dy_shift||0)+this.xy.scale_height-this._els["dhx_cal_data"][0].scrollTop;
pos.ev = ev;
var handler = this["mouse_"+this._mode];
if (handler)
return handler.call(this,pos);
//transform to date
if (!this._table_view){
pos.x=Math.max(0,Math.ceil(pos.x/this._cols[0])-1);
pos.y=Math.max(0,Math.ceil(pos.y*60/(this.config.time_step*this.config.hour_size_px))-1)+this.config.first_hour*(60/this.config.time_step);
} else {
var dy=0;
for (dy=1; dy < this._colsS.heights.length; dy++)
if (this._colsS.heights[dy]>pos.y) break;
pos.y=(Math.max(0,Math.ceil(pos.x/this._cols[0])-1)+Math.max(0,dy-1)*7)*24*60/this.config.time_step;
pos.x=0;
}
return pos;
}
scheduler._close_not_saved=function(){
if (new Date().valueOf()-(scheduler._new_event||0) > 500 && scheduler._edit_id){
var c=scheduler.locale.labels.confirm_closing;
if (!c || confirm(c))
scheduler.editStop(scheduler.config.positive_closing);
}
};
scheduler._correct_shift=function(start, back){
return start-=((new Date(scheduler._min_date)).getTimezoneOffset()-(new Date(start)).getTimezoneOffset())*60000*(back?-1:1);
};
scheduler._on_mouse_move=function(e){
if (this._drag_mode){
var pos=this._mouse_coords(e);
if (!this._drag_pos || pos.custom || this._drag_pos.x!=pos.x || this._drag_pos.y!=pos.y){
if (this._edit_id!=this._drag_id)
this._close_not_saved();
this._drag_pos=pos;
if (this._drag_mode=="create"){
this._close_not_saved();
this._loading=true; //will be ignored by dataprocessor
var start=this._min_date.valueOf()+(pos.y*this.config.time_step+(this._table_view?0:pos.x)*24*60)*60000;
//if (this._mode != "week" && this._mode != "day")
start = this._correct_shift(start);
if (!this._drag_start){
this._drag_start=start; return;
}
var end = start;
if (end==this._drag_start) return;
this._drag_id=this.uid();
this.addEvent(new Date(this._drag_start), new Date(end),this.locale.labels.new_event,this._drag_id, pos.fields);
this.callEvent("onEventCreated",[this._drag_id,e]);
this._loading=false;
this._drag_mode="new-size";
}
var ev=this.getEvent(this._drag_id);
var start,end;
if (this._drag_mode=="move"){
start = this._min_date.valueOf()+(pos.y*this.config.time_step+pos.x*24*60)*60000;
if (!pos.custom && this._table_view) start+=this.date.time_part(ev.start_date)*1000;
start = this._correct_shift(start);
end = ev.end_date.valueOf()-(ev.start_date.valueOf()-start);
} else {
start = ev.start_date.valueOf();
if (this._table_view) {
end = this._min_date.valueOf()+pos.y*this.config.time_step*60000 + (pos.custom?0:24*60*60000);
if (this._mode == "month")
end = this._correct_shift(end, false);
}
else{
end = this.date.date_part(new Date(ev.end_date)).valueOf()+pos.y*this.config.time_step*60000;
this._els["dhx_cal_data"][0].style.cursor="s-resize";
if (this._mode == "week" || this._mode == "day")
end = this._correct_shift(end);
}
if (this._drag_mode == "new-size"){
if (end <= this._drag_start){
var shift = pos.shift||((this._table_view && !pos.custom)?24*60*60000:0);
start = end-(pos.shift?0:shift);
end = this._drag_start+(shift||(this.config.time_step*60000));
} else {
start = this._drag_start;
}
} else if (end<=start)
end=start+this.config.time_step*60000;
}
var new_end = new Date(end-1);
var new_start = new Date(start);
//prevent out-of-borders situation for day|week view
if ( this._table_view || (new_end.getDate()==new_start.getDate() && new_end.getHours()<this.config.last_hour) || (scheduler._wa && scheduler._wa._dnd) ){
ev.start_date=new_start;
ev.end_date=new Date(end);
if (this.config.update_render)
this.update_view();
else
this.updateEvent(this._drag_id);
}
if (this._table_view)
this.for_rendered(this._drag_id,function(r){
r.className+=" dhx_in_move";
})
}
} else {
if (scheduler.checkEvent("onMouseMove")){
var id = this._locate_event(e.target||e.srcElement);
this.callEvent("onMouseMove",[id,e]);
}
}
};
scheduler._on_mouse_context=function(e,src){
return this.callEvent("onContextMenu",[this._locate_event(src),e]);
};
scheduler._on_mouse_down=function(e,src){
if (this.config.readonly || this._drag_mode) return;
src = src||(e.target||e.srcElement);
if (e.button==2||e.ctrlKey) return this._on_mouse_context(e,src);
switch(src.className.split(" ")[0]){
case "dhx_cal_event_line":
case "dhx_cal_event_clear":
if (this._table_view)
this._drag_mode="move"; //item in table mode
break;
case "dhx_header":
case "dhx_title":
case "dhx_wa_ev_body":
this._drag_mode="move"; //item in table mode
break;
case "dhx_footer":
this._drag_mode="resize"; //item in table mode
break;
case "dhx_scale_holder":
case "dhx_scale_holder_now":
case "dhx_month_body":
case "dhx_matrix_cell":
this._drag_mode="create";
break;
case "":
if (src.parentNode)
return scheduler._on_mouse_down(e,src.parentNode);
default:
this._drag_mode=null;
this._drag_id=null;
}
if (this._drag_mode){
var id = this._locate_event(src);
if (!this.config["drag_"+this._drag_mode] || !this.callEvent("onBeforeDrag",[id, this._drag_mode, e]))
this._drag_mode=this._drag_id=0;
else {
this._drag_id= id;
this._drag_event=scheduler._lame_copy({},this._copy_event(this.getEvent(this._drag_id)||{}));
}
}
this._drag_start=null;
};
scheduler._on_mouse_up=function(e){
if (this._drag_mode && this._drag_id){
this._els["dhx_cal_data"][0].style.cursor="default";
//drop
var ev=this.getEvent(this._drag_id);
if (this._drag_event._dhx_changed || !this._drag_event.start_date || ev.start_date.valueOf()!=this._drag_event.start_date.valueOf() || ev.end_date.valueOf()!=this._drag_event.end_date.valueOf()){
var is_new=(this._drag_mode=="new-size");
if (!this.callEvent("onBeforeEventChanged",[ev,e,is_new])){
if (is_new)
this.deleteEvent(ev.id, true);
else {
this._drag_event._dhx_changed = false;
scheduler._lame_copy(ev, this._drag_event);
this.updateEvent(ev.id);
}
} else {
if (is_new && this.config.edit_on_create){
this.unselect();
this._new_event=new Date();//timestamp of creation
if (this._table_view || this.config.details_on_create) {
this._drag_mode=null;
return this.showLightbox(this._drag_id);
}
this._drag_pos=true; //set flag to trigger full redraw
this._select_id=this._edit_id=this._drag_id;
} else if (!this._new_event)
this.callEvent(is_new?"onEventAdded":"onEventChanged",[this._drag_id,this.getEvent(this._drag_id)]);
}
}
if (this._drag_pos) this.render_view_data(); //redraw even if there is no real changes - necessary for correct positioning item after drag
}
this._drag_mode=null;
this._drag_pos=null;
};
scheduler.update_view=function(){
this._reset_scale();
if (this._load_mode && this._load()) return this._render_wait = true;
this.render_view_data();
};
scheduler.setCurrentView=function(date,mode){
date = date || this._date;
mode = mode || this._mode;
if (!this.callEvent("onBeforeViewChange",[this._mode,this._date,mode,date])) return;
var dhx_cal_data = 'dhx_cal_data';
var prev_scroll = (this._mode == mode && this.config.preserve_scroll)?this._els[dhx_cal_data][0].scrollTop:false; // saving current scroll
//hide old custom view
if (this[this._mode+"_view"] && mode && this._mode!=mode)
this[this._mode+"_view"](false);
this._close_not_saved();
var dhx_multi_day = 'dhx_multi_day';
if(this._els[dhx_multi_day]) {
this._els[dhx_multi_day][0].parentNode.removeChild(this._els[dhx_multi_day][0]);
this._els[dhx_multi_day] = null;
}
this._mode=mode;
this._date=date;
this._table_view=(this._mode=="month");
var tabs=this._els["dhx_cal_tab"];
for (var i=0; i < tabs.length; i++) {
tabs[i].className="dhx_cal_tab"+((tabs[i].getAttribute("name")==this._mode+"_tab")?" active":"");
}
//show new view
var view=this[this._mode+"_view"];
view?view(true):this.update_view();
if(typeof prev_scroll == "number") // if we are updating or working with the same view scrollTop should be saved
this._els[dhx_cal_data][0].scrollTop = prev_scroll; // restoring original scroll
this.callEvent("onViewChange",[this._mode,this._date]);
};
scheduler._render_x_header = function(i,left,d,h){
//header scale
var head=document.createElement("DIV"); head.className="dhx_scale_bar";
this.set_xy(head,this._cols[i]-1,this.xy.scale_height-2,left,0);//-1 for border
head.innerHTML=this.templates[this._mode+"_scale_date"](d,this._mode); //TODO - move in separate method
h.appendChild(head);
};
scheduler._reset_scale=function(){
//current mode doesn't support scales
//we mustn't call reset_scale for such modes, so it just to be sure
if (!this.templates[this._mode+"_date"]) return;
var h=this._els["dhx_cal_header"][0];
var b=this._els["dhx_cal_data"][0];
var c = this.config;
h.innerHTML="";
b.scrollTop=0; //fix flickering in FF
b.innerHTML="";
var str=((c.readonly||(!c.drag_resize))?" dhx_resize_denied":"")+((c.readonly||(!c.drag_move))?" dhx_move_denied":"");
if (str) b.className = "dhx_cal_data"+str;
this._cols=[]; //store for data section
this._colsS={height:0};
this._dy_shift=0;
this.set_sizes();
var summ=parseInt(h.style.width); //border delta
var left=0;
var d,dd,sd,today;
dd=this.date[this._mode+"_start"](new Date(this._date.valueOf()));
d=sd=this._table_view?scheduler.date.week_start(dd):dd;
today=this.date.date_part(new Date());
//reset date in header
var ed=scheduler.date.add(dd,1,this._mode);
var count = 7;
if (!this._table_view){
var count_n = this.date["get_"+this._mode+"_end"];
if (count_n) ed = count_n(dd);
count = Math.round((ed.valueOf()-dd.valueOf())/(1000*60*60*24));
}
this._min_date=d;
this._els["dhx_cal_date"][0].innerHTML=this.templates[this._mode+"_date"](dd,ed,this._mode);
for (var i=0; i<count; i++){
this._cols[i]=Math.floor(summ/(count-i));
this._render_x_header(i,left,d,h);
if (!this._table_view){
var scales=document.createElement("DIV");
var cls = "dhx_scale_holder"
if (d.valueOf()==today.valueOf()) cls = "dhx_scale_holder_now";
scales.className=cls+" "+this.templates.week_date_class(d,today);
this.set_xy(scales,this._cols[i]-1,c.hour_size_px*(c.last_hour-c.first_hour),left+this.xy.scale_width+1,0);//-1 for border
b.appendChild(scales);
this.callEvent("onScaleAdd",[scales, d]);
}
d=this.date.add(d,1,"day");
summ-=this._cols[i];
left+=this._cols[i];
this._colsS[i]=(this._cols[i-1]||0)+(this._colsS[i-1]||(this._table_view?0:this.xy.scale_width+2));
this._colsS['col_length'] = count+1;
}
this._max_date=d;
this._colsS[count]=this._cols[count-1]+this._colsS[count-1];
if (this._table_view) // month view
this._reset_month_scale(b,dd,sd);
else{
this._reset_hours_scale(b,dd,sd);
if (c.multi_day){
var dhx_multi_day = 'dhx_multi_day';
if(this._els[dhx_multi_day]) {
this._els[dhx_multi_day][0].parentNode.removeChild(this._els[dhx_multi_day][0]);
this._els[dhx_multi_day] = null;
}
var navline = this._els["dhx_cal_navline"][0];
var top = navline.offsetHeight + this._els["dhx_cal_header"][0].offsetHeight+1;
var c1 = document.createElement("DIV");
c1.className = dhx_multi_day;
c1.style.visibility="hidden";
this.set_xy(c1, this._colsS[this._colsS.col_length-1]+this.xy.scroll_width, 0, 0, top); // 2 extra borders, dhx_header has -1 bottom margin
b.parentNode.insertBefore(c1,b);
var c2 = c1.cloneNode(true);
c2.className = dhx_multi_day+"_icon";
c2.style.visibility="hidden";
this.set_xy(c2, this.xy.scale_width, 0, 0, top); // dhx_header has -1 bottom margin
c1.appendChild(c2);
this._els[dhx_multi_day]=[c1,c2];
this._els[dhx_multi_day][0].onclick = this._click.dhx_cal_data;
}
if (this.config.mark_now){
var now = new Date();
if (now < this._max_date && now > this._min_date && now.getHours() >= this.config.first_hour && now.getHours()<this.config.last_hour){
var day = this.locate_holder_day(now);
var sm = now.getHours()*60+now.getMinutes();
var now_time = document.createElement("DIV");
now_time.className = "dhx_now_time";
now_time.style.top = (Math.round((sm*60*1000-this.config.first_hour*60*60*1000)*this.config.hour_size_px/(60*60*1000)))%(this.config.hour_size_px*24)+1+"px";
b.childNodes[day].appendChild(now_time);
}
}
}
};
scheduler._reset_hours_scale=function(b,dd,sd){
var c=document.createElement("DIV");
c.className="dhx_scale_holder";
var date = new Date(1980,1,1,this.config.first_hour,0,0);
for (var i=this.config.first_hour*1; i < this.config.last_hour; i++) {
var cc=document.createElement("DIV");
cc.className="dhx_scale_hour";
cc.style.height=this.config.hour_size_px-(this._quirks?0:1)+"px";
cc.style.width=this.xy.scale_width+"px";
cc.innerHTML=scheduler.templates.hour_scale(date);
c.appendChild(cc);
date=this.date.add(date,1,"hour");
};
b.appendChild(c);
if (this.config.scroll_hour)
b.scrollTop = this.config.hour_size_px*(this.config.scroll_hour-this.config.first_hour);
};
scheduler._reset_month_scale=function(b,dd,sd){
var ed=scheduler.date.add(dd,1,"month");
//trim time part for comparation reasons
var cd=new Date();
this.date.date_part(cd);
this.date.date_part(sd);
var rows=Math.ceil(Math.round((ed.valueOf()-sd.valueOf()) / (60*60*24*1000) ) / 7);
var tdcss=[];
var height=(Math.floor(b.clientHeight/rows)-22);
this._colsS.height=height+22;
var h = this._colsS.heights = [];
for (var i=0; i<=7; i++)
tdcss[i]=" style='height:"+height+"px; width:"+((this._cols[i]||0)-1)+"px;' "
var cellheight = 0;
this._min_date=sd;
var html="<table cellpadding='0' cellspacing='0'>";
for (var i=0; i<rows; i++){
html+="<tr>";
for (var j=0; j<7; j++){
html+="<td";
var cls = "";
if (sd<dd)
cls='dhx_before';
else if (sd>=ed)
cls='dhx_after';
else if (sd.valueOf()==cd.valueOf())
cls='dhx_now';
html+=" class='"+cls+" "+this.templates.month_date_class(sd,cd)+"' ";
html+="><div class='dhx_month_head'>"+this.templates.month_day(sd)+"</div><div class='dhx_month_body' "+tdcss[j]+"></div></td>";
sd=this.date.add(sd,1,"day");
}
html+="</tr>";
h[i] = cellheight;
cellheight+=this._colsS.height;
}
html+="</table>";
this._max_date=sd;
b.innerHTML=html;
return sd;
};
scheduler.getLabel = function(property, key) {
var sections = this.config.lightbox.sections;
for (var i=0; i<sections.length; i++) {
if(sections[i].map_to == property) {
var options = sections[i].options;
for (var j=0; j<options.length; j++) {
if(options[j].key == key) {
return options[j].label;
}
}
}
}
return "";
};
scheduler.updateCollection = function(list_name, collection){
var list = scheduler.serverList(list_name);
if(!list) return false;
list.splice(0,list.length);
list.push.apply(list, collection||[]);
scheduler.callEvent("onOptionsLoad", []);
scheduler.resetLightbox();
return true;
};
scheduler._lame_copy=function(target, source){
for(var key in source)
target[key] = source[key];
return target;
};