summaryrefslogtreecommitdiffstats
path: root/codebase/sources/ext
diff options
context:
space:
mode:
authorAlexKlimenkov <shurick.klimenkov@gmail.com>2014-06-10 20:50:30 +0300
committerAlexKlimenkov <shurick.klimenkov@gmail.com>2014-06-10 20:50:30 +0300
commitb5a0589955460a44c5428c4cb5429fcfce265d23 (patch)
tree87db58400a3e036de646fb630cbb358beeac3bc1 /codebase/sources/ext
parente2aaaef8540fabd0b5200a4959c269d6f1ae352e (diff)
downloadscheduler-b5a0589955460a44c5428c4cb5429fcfce265d23.zip
scheduler-b5a0589955460a44c5428c4cb5429fcfce265d23.tar.gz
scheduler-b5a0589955460a44c5428c4cb5429fcfce265d23.tar.bz2
[update] version 4.1.0
Diffstat (limited to 'codebase/sources/ext')
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_active_links.js43
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_active_links.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_agenda_view.js123
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_agenda_view.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_all_timed.js148
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_all_timed.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_collision.js131
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_collision.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_container_autoresize.js164
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_container_autoresize.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_cookie.js73
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_cookie.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_editors.js161
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_editors.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_expand.js76
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_expand.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_grid_view.js483
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_grid_view.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_html_templates.js22
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_html_templates.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_key_nav.js115
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_key_nav.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_layer.js407
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_layer.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_limit.js965
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_limit.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_map_view.js492
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_map_view.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_minical.js472
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_minical.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_monthheight.js34
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_monthheight.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_multisection.js254
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_multisection.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_multiselect.js69
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_multiselect.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_multisource.js29
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_multisource.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_mvc.js147
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_mvc.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_offline.js83
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_offline.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_outerdrag.js60
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_outerdrag.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_pdf.js363
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_pdf.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_quick_info.js199
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_quick_info.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_readonly.js160
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_readonly.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_recurring.js818
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_recurring.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_serialize.js110
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_serialize.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_timeline.js1277
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_timeline.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_tooltip.js223
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_tooltip.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_treetimeline.js313
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_treetimeline.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_units.js259
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_units.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_url.js37
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_url.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_week_agenda.js261
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_week_agenda.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_wp.js20
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_wp.js.map1
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_year_view.js391
-rw-r--r--codebase/sources/ext/dhtmlxscheduler_year_view.js.map1
70 files changed, 9017 insertions, 0 deletions
diff --git a/codebase/sources/ext/dhtmlxscheduler_active_links.js b/codebase/sources/ext/dhtmlxscheduler_active_links.js
new file mode 100644
index 0000000..f8a55b9
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_active_links.js
@@ -0,0 +1,43 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+scheduler.config.active_link_view = "day";
+scheduler._active_link_click = function(e){
+ var start = e.target || event.srcElement;
+ var to = start.getAttribute("jump_to");
+ var s_d = scheduler.date.str_to_date(scheduler.config.api_date);
+ if (to) {
+ scheduler.setCurrentView(s_d(to), scheduler.config.active_link_view);
+ if (e && e.preventDefault)
+ e.preventDefault();
+ return false;
+ }
+};
+scheduler.attachEvent("onTemplatesReady", function() {
+ var do_wrapper = function(key, fullname){
+ fullname = fullname || (key+"_scale_date");
+
+ if(!scheduler.templates['_active_links_old_'+ fullname]){
+ scheduler.templates['_active_links_old_'+ fullname] = scheduler.templates[fullname];
+ }
+ var week_x = scheduler.templates['_active_links_old_'+ fullname];
+ var d_s = scheduler.date.date_to_str(scheduler.config.api_date);
+ scheduler.templates[fullname] = function(date) {
+ return "<a jump_to='" + d_s(date) + "' href='#'>" + week_x(date) + "</a>";
+ };
+ };
+
+ do_wrapper("week");
+ do_wrapper("", "month_day");
+ if (this.matrix){
+ for (var key in this.matrix)
+ do_wrapper(key);
+ }
+
+ this._detachDomEvent(this._obj, "click", scheduler._active_link_click);
+ dhtmlxEvent(this._obj, "click", scheduler._active_link_click);
+}); \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_active_links.js.map b/codebase/sources/ext/dhtmlxscheduler_active_links.js.map
new file mode 100644
index 0000000..d1bc8a7
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_active_links.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_active_links.js.map","sources":["dhtmlxscheduler_active_links.js"],"names":["scheduler","config","active_link_view","_active_link_click","e","start","target","event","srcElement","to","getAttribute","s_d","date","str_to_date","api_date","setCurrentView","preventDefault","attachEvent","do_wrapper","key","fullname","templates","week_x","d_s","date_to_str","this","matrix","_detachDomEvent","_obj","dhtmlxEvent"],"mappings":"AAAAA,UAAUC,OAAOC,iBAAmB,MACpCF,UAAUG,mBAAqB,SAASC,GACvC,GAAIC,GAAQD,EAAEE,QAAUC,MAAMC,WAC1BC,EAAKJ,EAAMK,aAAa,WACxBC,EAAMX,UAAUY,KAAKC,YAAYb,UAAUC,OAAOa,SACtD,OAAIL,IACHT,UAAUe,eAAeJ,EAAIF,GAAKT,UAAUC,OAAOC,kBAC/CE,GAAKA,EAAEY,gBACVZ,EAAEY,kBACI,GAJR,QAODhB,UAAUiB,YAAY,mBAAoB,WACzC,GAAIC,GAAa,SAASC,EAAKC,GAC9BA,EAAWA,GAAaD,EAAI,cAExBnB,UAAUqB,UAAU,qBAAsBD,KAC7CpB,UAAUqB,UAAU,qBAAsBD,GAAYpB,UAAUqB,UAAUD,GAE3E;GAAIE,GAAStB,UAAUqB,UAAU,qBAAsBD,GACnDG,EAAMvB,UAAUY,KAAKY,YAAYxB,UAAUC,OAAOa,SACtDd,WAAUqB,UAAUD,GAAY,SAASR,GACxC,MAAO,eAAiBW,EAAIX,GAAQ,cAAgBU,EAAOV,GAAQ,QAMrE,IAFAM,EAAW,QACXA,EAAW,GAAI,aACXO,KAAKC,OACR,IAAK,GAAIP,KAAOM,MAAKC,OACpBR,EAAWC,EAGbM,MAAKE,gBAAgBF,KAAKG,KAAM,QAAS5B,UAAUG,oBACnD0B,YAAYJ,KAAKG,KAAM,QAAS5B,UAAUG"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_agenda_view.js b/codebase/sources/ext/dhtmlxscheduler_agenda_view.js
new file mode 100644
index 0000000..18d791b
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_agenda_view.js
@@ -0,0 +1,123 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+scheduler.date.add_agenda = function(date){
+ return scheduler.date.add(date, 1, "year");
+};
+
+scheduler.templates.agenda_time = function(start,end,ev){
+ if (ev._timed)
+ return this.day_date(ev.start_date, ev.end_date, ev)+" "+this.event_date(start);
+ else
+ return scheduler.templates.day_date(start)+" &ndash; "+scheduler.templates.day_date(end);
+};
+scheduler.templates.agenda_text = function(start,end,event){
+ return event.text;
+};
+scheduler.templates.agenda_date = function(){ return ""; };
+
+scheduler.date.agenda_start=function(){ return scheduler.date.date_part(scheduler._currentDate()); };
+
+scheduler.attachEvent("onTemplatesReady",function() {
+ var old_dblclick_dhx_cal_data = scheduler.dblclick_dhx_cal_data;
+ scheduler.dblclick_dhx_cal_data = function() {
+ if (this._mode == "agenda") {
+ if (!this.config.readonly && this.config.dblclick_create)
+ this.addEventNow();
+ } else {
+ if (old_dblclick_dhx_cal_data)
+ return old_dblclick_dhx_cal_data.apply(this, arguments);
+ }
+ };
+ scheduler.attachEvent("onSchedulerResize",function(){
+ if (this._mode == "agenda"){
+ this.agenda_view(true);
+ return false;
+ }
+ return true;
+ });
+
+
+ var old = scheduler.render_data;
+ scheduler.render_data=function(evs){
+ if (this._mode == "agenda")
+ fill_agenda_tab();
+ else
+ return old.apply(this,arguments);
+ };
+
+ var old_render_view_data = scheduler.render_view_data;
+ scheduler.render_view_data = function(){
+ if(this._mode == "agenda") {
+ scheduler._agendaScrollTop = scheduler._els["dhx_cal_data"][0].childNodes[0].scrollTop;
+ scheduler._els["dhx_cal_data"][0].childNodes[0].scrollTop = 0;
+ }
+ return old_render_view_data.apply(this,arguments);
+ };
+
+
+ function set_full_view(mode){
+ if (mode){
+ var l = scheduler.locale.labels;
+ scheduler._els["dhx_cal_header"][0].innerHTML="<div class='dhx_agenda_line'><div>"+l.date+"</div><span style='padding-left:25px'>"+l.description+"</span></div>";
+ scheduler._table_view=true;
+ scheduler.set_sizes();
+ }
+ }
+
+ function fill_agenda_tab(){
+ //get current date
+ var date = scheduler._date;
+ //select events for which data need to be printed
+
+ var events = scheduler.get_visible_events();
+ events.sort(function(a,b){ return a.start_date>b.start_date?1:-1;});
+
+ //generate html for the view
+ var html="<div class='dhx_agenda_area'>";
+ for (var i=0; i<events.length; i++){
+ var ev = events[i];
+ var bg_color = (ev.color?("background:"+ev.color+";"):"");
+ var color = (ev.textColor?("color:"+ev.textColor+";"):"");
+ var ev_class = scheduler.templates.event_class(ev.start_date, ev.end_date, ev);
+ html+="<div class='dhx_agenda_line"+(ev_class?' '+ev_class:'')+"' event_id='"+ev.id+"' style='"+color+""+bg_color+""+(ev._text_style||"")+"'><div class='dhx_agenda_event_time'>"+scheduler.templates.agenda_time(ev.start_date, ev.end_date,ev)+"</div>";
+ html+="<div class='dhx_event_icon icon_details'>&nbsp</div>";
+ html+="<span>"+scheduler.templates.agenda_text(ev.start_date, ev.end_date, ev)+"</span></div>";
+ }
+ html+="<div class='dhx_v_border'></div></div>";
+
+ //render html
+ scheduler._els["dhx_cal_data"][0].innerHTML = html;
+ scheduler._els["dhx_cal_data"][0].childNodes[0].scrollTop = scheduler._agendaScrollTop||0;
+
+ // setting up dhx_v_border size
+ var agenda_area = scheduler._els["dhx_cal_data"][0].childNodes[0];
+ var v_border = agenda_area.childNodes[agenda_area.childNodes.length-1];
+ v_border.style.height = (agenda_area.offsetHeight < scheduler._els["dhx_cal_data"][0].offsetHeight) ? "100%" : (agenda_area.offsetHeight+"px");
+
+ var t=scheduler._els["dhx_cal_data"][0].firstChild.childNodes;
+ scheduler._els["dhx_cal_date"][0].innerHTML=scheduler.templates.agenda_date(scheduler._min_date, scheduler._max_date, scheduler._mode);
+
+ scheduler._rendered=[];
+ for (var i=0; i < t.length-1; i++)
+ scheduler._rendered[i]=t[i];
+
+ }
+
+ scheduler.agenda_view=function(mode){
+ scheduler._min_date = scheduler.config.agenda_start||scheduler.date.agenda_start(scheduler._date);
+ scheduler._max_date = scheduler.config.agenda_end||scheduler.date.add_agenda(scheduler._min_date, 1);
+ scheduler._table_view = true;
+ set_full_view(mode);
+ if (mode){
+ //agenda tab activated
+ fill_agenda_tab();
+ } else {
+ //agenda tab de-activated
+ }
+ };
+});
diff --git a/codebase/sources/ext/dhtmlxscheduler_agenda_view.js.map b/codebase/sources/ext/dhtmlxscheduler_agenda_view.js.map
new file mode 100644
index 0000000..c7e5d0b
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_agenda_view.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_agenda_view.js.map","sources":["dhtmlxscheduler_agenda_view.js"],"names":["scheduler","date","add_agenda","add","templates","agenda_time","start","end","ev","_timed","this","day_date","start_date","end_date","event_date","agenda_text","event","text","agenda_date","agenda_start","date_part","_currentDate","attachEvent","set_full_view","mode","l","locale","labels","_els","innerHTML","description","_table_view","set_sizes","fill_agenda_tab","events","_date","get_visible_events","sort","a","b","html","i","length","bg_color","color","textColor","ev_class","event_class","id","_text_style","childNodes","scrollTop","_agendaScrollTop","agenda_area","v_border","style","height","offsetHeight","t","firstChild","_min_date","_max_date","_mode","_rendered","old_dblclick_dhx_cal_data","dblclick_dhx_cal_data","config","readonly","dblclick_create","addEventNow","apply","arguments","agenda_view","old","render_data","old_render_view_data","render_view_data","agenda_end"],"mappings":"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"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_all_timed.js b/codebase/sources/ext/dhtmlxscheduler_all_timed.js
new file mode 100644
index 0000000..2bb81fe
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_all_timed.js
@@ -0,0 +1,148 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+(function(){
+
+ scheduler.config.all_timed = "short";
+
+ var is_event_short = function (ev) {
+ return !((ev.end_date - ev.start_date)/(1000*60*60) >= 24);
+ };
+
+ // copy of usual events and recurring instances;
+ // regular copy causes problems with recurrings which have series event as a prototype
+ scheduler._safe_copy = function(event){
+ var proto = null,
+ copy = null;
+ if(event.event_pid){
+ proto = scheduler.getEvent(event.event_pid);
+ }
+
+ if (proto && proto.isPrototypeOf(event)) {
+ copy = scheduler._copy_event(event);
+ delete copy.event_length;
+ delete copy.event_pid;
+ delete copy.rec_pattern;
+ delete copy.rec_type;
+ } else {
+ copy = scheduler._lame_clone(event);
+ }
+ return copy;
+ };
+
+ var old_prerender_events_line = scheduler._pre_render_events_line;
+ scheduler._pre_render_events_line = function(evs, hold){
+ if (!this.config.all_timed)
+ return old_prerender_events_line.call(this, evs, hold);
+
+ for (var i=0; i < evs.length; i++) {
+ var ev=evs[i];
+
+ if (ev._timed)
+ continue;
+
+ if (this.config.all_timed == "short") {
+ if (!is_event_short(ev)) {
+ evs.splice(i--,1);
+ continue;
+ }
+ }
+
+ var ce = this._safe_copy(ev); // current event (event for one specific day) is copy of original with modified dates
+
+ ce.start_date = new Date(ce.start_date); // as lame copy doesn't copy date objects
+
+ if (!isOvernightEvent(ev)) {
+ ce.end_date = new Date(ev.end_date);
+ }
+ else {
+ ce.end_date = getNextDay(ce.start_date);
+ if (this.config.last_hour != 24) { // if specific last_hour was set (e.g. 20)
+ ce.end_date = setDateTime(ce.start_date, this.config.last_hour);
+ }
+ }
+
+ var event_changed = false;
+ if (ce.start_date < this._max_date && ce.end_date > this._min_date && ce.start_date < ce.end_date) {
+ evs[i] = ce; // adding another event in collection
+ event_changed = true;
+ }
+ // if (ce.start_date > ce.end_date) {
+ // evs.splice(i--,1);
+ // }
+
+ var re = this._safe_copy(ev); // remaining event, copy of original with modified start_date (making range more narrow)
+ re.end_date = new Date(re.end_date);
+ if (re.start_date < this._min_date)
+ re.start_date = setDateTime(this._min_date, this.config.first_hour);// as we are starting only with whole hours
+ else
+ re.start_date = setDateTime(getNextDay(ev.start_date), this.config.first_hour);
+
+ if (re.start_date < this._max_date && re.start_date < re.end_date) {
+ if (event_changed)
+ evs.splice(i+1,0,re);//insert part
+ else {
+ evs[i--] = re;
+ continue;
+ }
+ }
+
+ }
+ // in case of all_timed pre_render is not applied to the original event
+ // so we need to force redraw in case of dnd
+ var redraw = (this._drag_mode == 'move')?false:hold;
+ return old_prerender_events_line.call(this, evs, redraw);
+
+
+ function isOvernightEvent(ev){
+ var next_day = getNextDay(ev.start_date);
+ return (+ev.end_date > +next_day);
+ }
+ function getNextDay(date){
+ var next_day = scheduler.date.add(date, 1, "day");
+ next_day = scheduler.date.date_part(next_day);
+ return next_day;
+ }
+ function setDateTime(date, hours){
+ var val = scheduler.date.date_part(new Date(date));
+ val.setHours(hours);
+ return val;
+ }
+ };
+ var old_get_visible_events = scheduler.get_visible_events;
+ scheduler.get_visible_events = function(only_timed){
+ if (!(this.config.all_timed && this.config.multi_day))
+ return old_get_visible_events.call(this, only_timed);
+ return old_get_visible_events.call(this, false); // only timed = false
+ };
+ scheduler.attachEvent("onBeforeViewChange", function (old_mode, old_date, mode, date) {
+ scheduler._allow_dnd = (mode == "day" || mode == "week");
+ return true;
+ });
+
+ scheduler._is_main_area_event = function(ev){
+ return !!(ev._timed || this.config.all_timed === true || (this.config.all_timed == "short" && is_event_short(ev)) );
+ };
+
+ var oldUpdate = scheduler.updateEvent;
+ scheduler.updateEvent = function(id){
+ // full redraw(update_render=true) messes events order while dnd.
+ // individual redraw(update_render=false) of multiday event, which happens on select/unselect, expands event to full width of the cell and can be fixes only with full redraw.
+ // so for now full redraw is always enabled for not-dnd updates
+ var fullRedrawNeeded = (scheduler.config.all_timed && !(scheduler.isOneDayEvent(scheduler._events[id]) || scheduler.getState().drag_id));
+ var initial;
+ if(fullRedrawNeeded){
+ initial = scheduler.config.update_render;
+ scheduler.config.update_render = true;
+ }
+ oldUpdate.apply(scheduler, arguments);
+
+ if(fullRedrawNeeded){
+ scheduler.config.update_render = initial;
+ }
+ };
+})(); \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_all_timed.js.map b/codebase/sources/ext/dhtmlxscheduler_all_timed.js.map
new file mode 100644
index 0000000..e5589ea
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_all_timed.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_all_timed.js.map","sources":["dhtmlxscheduler_all_timed.js"],"names":["scheduler","config","all_timed","is_event_short","ev","end_date","start_date","_safe_copy","event","proto","copy","event_pid","getEvent","isPrototypeOf","_copy_event","event_length","rec_pattern","rec_type","_lame_clone","old_prerender_events_line","_pre_render_events_line","evs","hold","isOvernightEvent","next_day","getNextDay","date","add","date_part","setDateTime","hours","val","Date","setHours","this","call","i","length","_timed","ce","last_hour","event_changed","_max_date","_min_date","re","first_hour","splice","redraw","_drag_mode","old_get_visible_events","get_visible_events","only_timed","multi_day","attachEvent","old_mode","old_date","mode","_allow_dnd","_is_main_area_event","oldUpdate","updateEvent","id","initial","fullRedrawNeeded","isOneDayEvent","_events","getState","drag_id","update_render","apply","arguments"],"mappings":"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"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_collision.js b/codebase/sources/ext/dhtmlxscheduler_collision.js
new file mode 100644
index 0000000..ce79a4a
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_collision.js
@@ -0,0 +1,131 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+(function(){
+
+var temp_section;
+var before;
+
+scheduler.config.collision_limit = 1;
+
+function _setTempSection(event_id) { // for custom views (matrix, timeline, units)
+ var checked_mode = scheduler._get_section_view();
+ if(checked_mode && event_id){
+ temp_section = scheduler.getEvent(event_id)[scheduler._get_section_property()];
+ }
+}
+
+scheduler.attachEvent("onBeforeDrag",function(id){
+ _setTempSection(id);
+ return true;
+});
+scheduler.attachEvent("onBeforeLightbox",function(id){
+ var ev = scheduler.getEvent(id);
+ before = [ev.start_date, ev.end_date];
+ _setTempSection(id);
+ return true;
+});
+scheduler.attachEvent("onEventChanged",function(id){
+ if (!id || !scheduler.getEvent(id)) return true;
+ var ev = scheduler.getEvent(id);
+ if (!scheduler.checkCollision(ev)){
+ if (!before) return false;
+ ev.start_date = before[0];
+ ev.end_date = before[1];
+ ev._timed=this.isOneDayEvent(ev);
+ }
+ return true;
+});
+scheduler.attachEvent("onBeforeEventChanged",function(ev,e,is_new){
+ return scheduler.checkCollision(ev);
+});
+scheduler.attachEvent("onEventAdded",function(id,ev) {
+ var result = scheduler.checkCollision(ev);
+ if (!result)
+ scheduler.deleteEvent(id);
+});
+scheduler.attachEvent("onEventSave",function(id, edited_ev, is_new){
+ edited_ev = scheduler._lame_clone(edited_ev);
+ edited_ev.id = id;
+
+ //lightbox may not have 'time' section
+ if(!(edited_ev.start_date && edited_ev.end_date)){
+ var ev = scheduler.getEvent(id);
+ edited_ev.start_date = new Date(ev.start_date);
+ edited_ev.end_date = new Date(ev.end_date);
+ }
+
+ if(edited_ev.rec_type){
+ scheduler._roll_back_dates(edited_ev);
+ }
+ return scheduler.checkCollision(edited_ev); // in case user creates event on one date but then edited it another
+});
+
+scheduler._check_sections_collision = function(first, second){
+ var map_to = scheduler._get_section_property();
+ if (first[map_to] == second[map_to] && first.id != second.id)
+ return true;
+ return false;
+};
+
+scheduler.checkCollision = function(ev) {
+ var evs = [];
+ var collision_limit = scheduler.config.collision_limit;
+
+ if (ev.rec_type) {
+ var evs_dates = scheduler.getRecDates(ev);
+ for(var k=0; k<evs_dates.length; k++) {
+ var tevs = scheduler.getEvents(evs_dates[k].start_date, evs_dates[k].end_date);
+ for(var j=0; j<tevs.length; j++) {
+ if ((tevs[j].event_pid || tevs[j].id) != ev.id )
+ evs.push(tevs[j]);
+ }
+ }
+ } else {
+ evs = scheduler.getEvents(ev.start_date, ev.end_date);
+ for (var i=0; i<evs.length; i++) {
+ if (evs[i].id == ev.id) {
+ evs.splice(i,1);
+ break;
+ }
+ }
+ }
+
+
+ var checked_mode = scheduler._get_section_view();
+ var map_to = scheduler._get_section_property();
+
+ var single = true;
+ if (checked_mode) { // custom view
+ var count = 0;
+
+ for (var i = 0; i < evs.length; i++){
+ if (evs[i].id != ev.id && this._check_sections_collision(evs[i], ev))
+ count++;
+ }
+
+ if (count >= collision_limit) {
+
+ single = false;
+ }
+ }
+ else {
+ if ( evs.length >= collision_limit )
+ single = false;
+ }
+ if (!single) {
+ var res = !scheduler.callEvent("onEventCollision",[ev,evs]);
+ if (!res) {
+ ev[map_to] = temp_section||ev[map_to]; // from _setTempSection for custom views
+ }
+ return res;
+ }
+ return single;
+
+};
+
+})();
diff --git a/codebase/sources/ext/dhtmlxscheduler_collision.js.map b/codebase/sources/ext/dhtmlxscheduler_collision.js.map
new file mode 100644
index 0000000..033f96c
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_collision.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_collision.js.map","sources":["dhtmlxscheduler_collision.js"],"names":["_setTempSection","event_id","checked_mode","scheduler","_get_section_view","temp_section","getEvent","_get_section_property","before","config","collision_limit","attachEvent","id","ev","start_date","end_date","checkCollision","_timed","this","isOneDayEvent","result","deleteEvent","edited_ev","_lame_clone","Date","rec_type","_roll_back_dates","_check_sections_collision","first","second","map_to","evs","evs_dates","getRecDates","k","length","tevs","getEvents","j","event_pid","push","i","splice","single","count","res","callEvent"],"mappings":"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"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_container_autoresize.js b/codebase/sources/ext/dhtmlxscheduler_container_autoresize.js
new file mode 100644
index 0000000..78bbcf3
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_container_autoresize.js
@@ -0,0 +1,164 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+(function() {
+
+ scheduler.config.container_autoresize = true;
+ scheduler.config.month_day_min_height = 90;
+
+ var old_pre_render_event = scheduler._pre_render_events;
+
+ scheduler._pre_render_events = function(evs, hold) {
+ if (!scheduler.config.container_autoresize) {
+ return old_pre_render_event.apply(this, arguments);
+ }
+
+ var hb = this.xy.bar_height;
+ var h_old = this._colsS.heights;
+ var h = this._colsS.heights = [0, 0, 0, 0, 0, 0, 0];
+ var data = this._els["dhx_cal_data"][0];
+
+ if (!this._table_view)
+ evs = this._pre_render_events_line(evs, hold); //ignore long events for now
+ else
+ evs = this._pre_render_events_table(evs, hold);
+
+ if (this._table_view) {
+ if (hold){
+ this._colsS.heights = h_old;
+ } else {
+ var evl = data.firstChild;
+ if (evl.rows) {
+ for (var i = 0; i < evl.rows.length; i++) {
+ h[i]++;
+ if ((h[i]) * hb > this._colsS.height - this.xy.month_head_height) { // 22 - height of cell's header
+ //we have overflow, update heights
+ var cells = evl.rows[i].cells;
+
+ var cHeight = this._colsS.height - this.xy.month_head_height;
+ if(this.config.max_month_events*1 !== this.config.max_month_events || h[i] <= this.config.max_month_events){
+ cHeight = h[i] * hb;
+ }else if( (this.config.max_month_events + 1) * hb > this._colsS.height - this.xy.month_head_height){
+ cHeight = (this.config.max_month_events + 1) * hb;
+ }
+
+ for (var j = 0; j < cells.length; j++) {
+ cells[j].childNodes[1].style.height = cHeight + "px";
+ }
+ h[i] = (h[i - 1] || 0) + cells[0].offsetHeight;
+ }
+ h[i] = (h[i - 1] || 0) + evl.rows[i].cells[0].offsetHeight;
+ }
+ h.unshift(0);
+ if (evl.parentNode.offsetHeight < evl.parentNode.scrollHeight && !evl._h_fix) {
+ //we have v-scroll, decrease last day cell
+
+ // NO CHECK SHOULD BE MADE ON VERTICAL SCROLL
+ }
+ } else {
+ if (!evs.length && this._els["dhx_multi_day"][0].style.visibility == "visible")
+ h[0] = -1;
+ if (evs.length || h[0] == -1) {
+ //shift days to have space for multiday events
+ var childs = evl.parentNode.childNodes;
+ var dh = ((h[0] + 1) * hb + 1) + "px"; // +1 so multiday events would have 2px from top and 2px from bottom by default
+ data.style.top = (this._els["dhx_cal_navline"][0].offsetHeight + this._els["dhx_cal_header"][0].offsetHeight + parseInt(dh, 10)) + 'px';
+ data.style.height = (this._obj.offsetHeight - parseInt(data.style.top, 10) - (this.xy.margin_top || 0)) + 'px';
+ var last = this._els["dhx_multi_day"][0];
+ last.style.height = dh;
+ last.style.visibility = (h[0] == -1 ? "hidden" : "visible");
+ last = this._els["dhx_multi_day"][1];
+ last.style.height = dh;
+ last.style.visibility = (h[0] == -1 ? "hidden" : "visible");
+ last.className = h[0] ? "dhx_multi_day_icon" : "dhx_multi_day_icon_small";
+ this._dy_shift = (h[0] + 1) * hb;
+ h[0] = 0;
+ }
+ }
+ }
+ }
+
+ return evs;
+ };
+
+ var checked_divs = ["dhx_cal_navline", "dhx_cal_header", "dhx_multi_day", "dhx_cal_data"];
+ var updateContainterHeight = function(is_repaint) {
+ var total_height = 0;
+ for (var i = 0; i < checked_divs.length; i++) {
+
+ var className = checked_divs[i];
+ var checked_div = (scheduler._els[className]) ? scheduler._els[className][0] : null;
+ var height = 0;
+ switch (className) {
+ case "dhx_cal_navline":
+ case "dhx_cal_header":
+ height = parseInt(checked_div.style.height, 10);
+ break;
+ case "dhx_multi_day":
+ height = (checked_div) ? checked_div.offsetHeight : 0;
+ if (height == 1)
+ height = 0;
+ break;
+ case "dhx_cal_data":
+ height = Math.max(checked_div.offsetHeight - 1, checked_div.scrollHeight);
+ var mode = scheduler.getState().mode;
+ if (mode == "month") {
+ if (scheduler.config.month_day_min_height && !is_repaint) {
+ var rows_length = checked_div.getElementsByTagName("tr").length;
+ height = rows_length * scheduler.config.month_day_min_height;
+ }
+ if (is_repaint) {
+ checked_div.style.height = height + "px";
+ }
+ }
+ if (scheduler.matrix && scheduler.matrix[mode]) {
+ if (is_repaint) {
+ height += 2;
+ checked_div.style.height = height + "px";
+ } else {
+ height = 2;
+ var cfg = scheduler.matrix[mode];
+ var rows = cfg.y_unit;
+ for(var r=0; r < rows.length; r++){
+ height += !rows[r].children ? cfg.dy : (cfg.folder_dy||cfg.dy);
+ }
+ }
+ }
+ if (mode == "day" || mode == "week") {
+ height += 2;
+ }
+ break;
+ }
+ total_height += height;
+ }
+ scheduler._obj.style.height = (total_height) + "px";
+
+ if (!is_repaint)
+ scheduler.updateView();
+ };
+
+ var conditionalUpdateContainerHeight = function() {
+ var mode = scheduler.getState().mode;
+
+ updateContainterHeight();
+ if ( (scheduler.matrix && scheduler.matrix[mode]) || mode == "month" ) {
+ window.setTimeout(function() {
+ updateContainterHeight(true);
+ }, 1);
+ }
+ };
+
+ scheduler.attachEvent("onViewChange", conditionalUpdateContainerHeight);
+ scheduler.attachEvent("onXLE", conditionalUpdateContainerHeight);
+ scheduler.attachEvent("onEventChanged", conditionalUpdateContainerHeight);
+ scheduler.attachEvent("onEventCreated", conditionalUpdateContainerHeight);
+ scheduler.attachEvent("onEventAdded", conditionalUpdateContainerHeight);
+ scheduler.attachEvent("onEventDeleted", conditionalUpdateContainerHeight);
+ scheduler.attachEvent("onAfterSchedulerResize", conditionalUpdateContainerHeight);
+ scheduler.attachEvent("onClearAll", conditionalUpdateContainerHeight);
+
+})(); \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_container_autoresize.js.map b/codebase/sources/ext/dhtmlxscheduler_container_autoresize.js.map
new file mode 100644
index 0000000..207513a
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_container_autoresize.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_container_autoresize.js.map","sources":["dhtmlxscheduler_container_autoresize.js"],"names":["scheduler","config","container_autoresize","month_day_min_height","old_pre_render_event","_pre_render_events","evs","hold","apply","this","arguments","hb","xy","bar_height","h_old","_colsS","heights","h","data","_els","_table_view","_pre_render_events_table","_pre_render_events_line","evl","firstChild","rows","i","length","height","month_head_height","cells","cHeight","max_month_events","j","childNodes","style","offsetHeight","unshift","parentNode","scrollHeight","_h_fix","visibility","dh","top","parseInt","_obj","margin_top","last","className","_dy_shift","checked_divs","updateContainterHeight","is_repaint","total_height","checked_div","Math","max","mode","getState","rows_length","getElementsByTagName","matrix","cfg","y_unit","r","children","folder_dy","dy","updateView","conditionalUpdateContainerHeight","window","setTimeout","attachEvent"],"mappings":"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"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_cookie.js b/codebase/sources/ext/dhtmlxscheduler_cookie.js
new file mode 100644
index 0000000..4420e2b
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_cookie.js
@@ -0,0 +1,73 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+(function(){
+ function setCookie(name,cookie_param,value) {
+ var str = name + "=" + value + (cookie_param?("; "+cookie_param):"");
+ document.cookie = str;
+ }
+ function getCookie(name) {
+ var search = name + "=";
+ if (document.cookie.length > 0) {
+ var offset = document.cookie.indexOf(search);
+ if (offset != -1) {
+ offset += search.length;
+ var end = document.cookie.indexOf(";", offset);
+ if (end == -1)
+ end = document.cookie.length;
+ return document.cookie.substring(offset, end);
+ }
+ }
+ return "";
+ }
+ var first = true;
+ scheduler.attachEvent("onBeforeViewChange",function(om,od,m,d){
+ if (first){
+ first = false;
+
+
+
+ var data=getCookie("scheduler_settings");
+ if (data){
+
+ if(!scheduler._min_date){
+ //otherwise scheduler will have incorrect date until timeout
+ //it can cause js error with 'onMouseMove' handler of key_nav.js
+ scheduler._min_date = d;
+ }
+
+ data = unescape(data).split("@");
+ data[0] = this.templates.xml_date(data[0]);
+ var view = this.isViewExists(data[1]) ? data[1] : m,
+ date = !isNaN(+data[0]) ? data[0] : d;
+
+ window.setTimeout(function(){
+ scheduler.setCurrentView(date,view);
+ },1);
+ return false;
+ }
+ }
+ var text = escape(this.templates.xml_format(d||od)+"@"+(m||om));
+ setCookie("scheduler_settings","expires=Sun, 31 Jan 9999 22:00:00 GMT",text);
+ return true;
+ });
+
+
+ // As we are blocking first render above there could be a problem in case of dynamic loading ('from' won't be defined)
+ var old_load = scheduler._load;
+ scheduler._load = function() {
+ var args = arguments;
+ if (!scheduler._date && scheduler._load_mode) {
+ var that = this;
+ window.setTimeout(function() {
+ old_load.apply(that, args);
+ },1);
+ } else {
+ old_load.apply(this, args);
+ }
+ };
+})(); \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_cookie.js.map b/codebase/sources/ext/dhtmlxscheduler_cookie.js.map
new file mode 100644
index 0000000..5490213
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_cookie.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_cookie.js.map","sources":["dhtmlxscheduler_cookie.js"],"names":["setCookie","name","cookie_param","value","str","document","cookie","getCookie","search","length","offset","indexOf","end","substring","first","scheduler","attachEvent","om","od","m","d","data","_min_date","unescape","split","this","templates","xml_date","view","isViewExists","date","isNaN","window","setTimeout","setCurrentView","text","escape","xml_format","old_load","_load","args","arguments","_date","_load_mode","that","apply"],"mappings":"CAAA,WACC,QAASA,GAAUC,EAAKC,EAAaC,GACpC,GAAIC,GAAMH,EAAO,IAAME,GAAUD,EAAc,KAAKA,EAAc,GAClEG,UAASC,OAASF,EAEnB,QAASG,GAAUN,GAClB,GAAIO,GAASP,EAAO,GACpB,IAAII,SAASC,OAAOG,OAAS,EAAG,CAC/B,GAAIC,GAASL,SAASC,OAAOK,QAAQH,EACrC,IAAc,IAAVE,EAAc,CACjBA,GAAUF,EAAOC,MACjB,IAAIG,GAAMP,SAASC,OAAOK,QAAQ,IAAKD,EAGvC,OAFW,IAAPE,IACHA,EAAMP,SAASC,OAAOG,QAChBJ,SAASC,OAAOO,UAAUH,EAAQE,IAG3C,MAAO,GAER,GAAIE,IAAQ,CACZC,WAAUC,YAAY,qBAAqB,SAASC,EAAGC,EAAGC,EAAEC,GAC3D,GAAIN,EAAM,CACTA,GAAQ,CAIR,IAAIO,GAAKd,EAAU,qBACnB,IAAIc,EAAK,CAEJN,UAAUO,YAGbP,UAAUO,UAAYF,GAGvBC,EAAOE,SAASF,GAAMG,MAAM,KAC5BH,EAAK,GAAKI,KAAKC,UAAUC,SAASN,EAAK,GACvC;GAAIO,GAAOH,KAAKI,aAAaR,EAAK,IAAMA,EAAK,GAAKF,EACjDW,EAAQC,OAAOV,EAAK,IAAgBD,EAAVC,EAAK,EAKhC,OAHAW,QAAOC,WAAW,WACjBlB,UAAUmB,eAAeJ,EAAKF,IAC7B,IACK,GAGT,GAAIO,GAAOC,OAAOX,KAAKC,UAAUW,WAAWjB,GAAGF,GAAI,KAAKC,GAAGF,GAE3D,OADAjB,GAAU,qBAAqB,wCAAwCmC,IAChE,GAKR,IAAIG,GAAWvB,UAAUwB,KACzBxB,WAAUwB,MAAQ,WACjB,GAAIC,GAAOC,SACX,KAAK1B,UAAU2B,OAAS3B,UAAU4B,WAAY,CAC7C,GAAIC,GAAOnB,IACXO,QAAOC,WAAW,WACjBK,EAASO,MAAMD,EAAMJ,IACpB,OAEFF,GAASO,MAAMpB,KAAMe"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_editors.js b/codebase/sources/ext/dhtmlxscheduler_editors.js
new file mode 100644
index 0000000..f088140
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_editors.js
@@ -0,0 +1,161 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+scheduler.form_blocks['combo']={
+ render:function(sns) {
+ if (!sns.cached_options)
+ sns.cached_options = {};
+ var res = '';
+ res += "<div class='"+sns.type+"' style='height:"+(sns.height||20)+"px;' ></div>";
+ return res;
+ },
+ set_value:function(node,value,ev,config){
+ (function(){
+ resetCombo();
+ var id = scheduler.attachEvent("onAfterLightbox",function(){
+ // otherwise destructor will never be called after form reset(e.g. in readonly event mode)
+ resetCombo();
+ scheduler.detachEvent(id);
+ });
+ function resetCombo(){
+ if(node._combo && node._combo.DOMParent) {
+ node._combo.destructor();
+ }
+ }
+ })();
+ window.dhx_globalImgPath = config.image_path||'/';
+ node._combo = new dhtmlXCombo(node, config.name, node.offsetWidth-8);
+ if (config.onchange)
+ node._combo.attachEvent("onChange", config.onchange);
+
+ if (config.options_height)
+ node._combo.setOptionHeight(config.options_height);
+ var combo = node._combo;
+ combo.enableFilteringMode(config.filtering, config.script_path||null, !!config.cache);
+
+ if (!config.script_path) { // script-side filtration is used
+ var all_options = [];
+ for (var i = 0; i < config.options.length; i++) {
+ var option = config.options[i];
+ var single_option = [
+ option.key,
+ option.label,
+ option.css
+ ];
+ all_options.push(single_option);
+ }
+ combo.addOption(all_options);
+ if (ev[config.map_to]) {
+ var index = combo.getIndexByValue(ev[config.map_to]);
+ combo.selectOption(index);
+ }
+ } else { // server-side filtration is used
+ var selected_id = ev[config.map_to];
+ if (selected_id) {
+ if (config.cached_options[selected_id]) {
+ combo.addOption(selected_id, config.cached_options[selected_id]);
+ combo.disable(1);
+ combo.selectOption(0);
+ combo.disable(0);
+ } else {
+ dhtmlxAjax.get(config.script_path+"?id="+selected_id+"&uid="+scheduler.uid(), function(result){
+ var option = result.doXPath("//option")[0];
+ var label = option.childNodes[0].nodeValue;
+ config.cached_options[selected_id] = label;
+ combo.addOption(selected_id, label);
+ combo.disable(1);
+ combo.selectOption(0);
+ combo.disable(0);
+ });
+ }
+ } else {
+ combo.setComboValue("");
+ }
+ }
+ },
+ get_value:function(node,ev,config) {
+ var selected_id = node._combo.getSelectedValue(); // value = key
+ if (config.script_path) {
+ config.cached_options[selected_id] = node._combo.getSelectedText();
+ }
+ return selected_id;
+ },
+ focus:function(node){
+ }
+};
+
+scheduler.form_blocks['radio']={
+ render:function(sns) {
+ var res = '';
+ res += "<div class='dhx_cal_ltext dhx_cal_radio' style='height:"+sns.height+"px;' >";
+ for (var i=0; i<sns.options.length; i++) {
+ var id = scheduler.uid();
+ res += "<input id='"+id+"' type='radio' name='"+sns.name+"' value='"+sns.options[i].key+"'><label for='"+id+"'>"+" "+sns.options[i].label+"</label>";
+ if(sns.vertical)
+ res += "<br/>";
+ }
+ res += "</div>";
+
+ return res;
+ },
+ set_value:function(node,value,ev,config){
+ var radiobuttons = node.getElementsByTagName('input');
+ for (var i = 0; i < radiobuttons.length; i++) {
+ radiobuttons[i].checked = false;
+ var checked_value = ev[config.map_to]||value;
+ if (radiobuttons[i].value == checked_value) {
+ radiobuttons[i].checked = true;
+ }
+ }
+ },
+ get_value:function(node,ev,config){
+ var radiobuttons = node.getElementsByTagName('input');
+ for(var i=0; i<radiobuttons.length; i++) {
+ if(radiobuttons[i].checked) {
+ return radiobuttons[i].value;
+ }
+ }
+ },
+ focus:function(node){
+ }
+};
+
+scheduler.form_blocks['checkbox']={
+ render:function(sns) {
+ if (scheduler.config.wide_form)
+ return '<div class="dhx_cal_wide_checkbox" '+(sns.height?("style='height:"+sns.height+"px;'"):"")+'></div>';
+ else
+ return '';
+ },
+ set_value:function(node,value,ev,config){
+ node=document.getElementById(config.id);
+ var id = scheduler.uid();
+ var isChecked = (typeof config.checked_value != "undefined") ? value == config.checked_value : !!value;
+ node.className += " dhx_cal_checkbox";
+ var check_html = "<input id='"+id+"' type='checkbox' value='true' name='"+config.name+"'"+((isChecked)?"checked='true'":'')+"'>";
+ var label_html = "<label for='"+id+"'>"+(scheduler.locale.labels["section_"+config.name]||config.name)+"</label>";
+ if (scheduler.config.wide_form){
+ node.innerHTML = label_html;
+ node.nextSibling.innerHTML=check_html;
+ } else
+ node.innerHTML=check_html+label_html;
+
+ if (config.handler) {
+ var checkbox = node.getElementsByTagName('input')[0];
+ checkbox.onclick = config.handler;
+ }
+ },
+ get_value:function(node,ev,config){
+ node=document.getElementById(config.id);
+ var checkbox = node.getElementsByTagName('input')[0]; // moved to the header
+ if (!checkbox)
+ checkbox = node.nextSibling.getElementsByTagName('input')[0];
+ return (checkbox.checked)?(config.checked_value||true):(config.unchecked_value||false);
+ },
+ focus:function(node){
+ }
+};
diff --git a/codebase/sources/ext/dhtmlxscheduler_editors.js.map b/codebase/sources/ext/dhtmlxscheduler_editors.js.map
new file mode 100644
index 0000000..1980416
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_editors.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_editors.js.map","sources":["dhtmlxscheduler_editors.js"],"names":["scheduler","form_blocks","render","sns","cached_options","res","type","height","set_value","node","value","ev","config","resetCombo","_combo","DOMParent","destructor","id","attachEvent","detachEvent","window","dhx_globalImgPath","image_path","dhtmlXCombo","name","offsetWidth","onchange","options_height","setOptionHeight","combo","enableFilteringMode","filtering","script_path","cache","selected_id","map_to","addOption","disable","selectOption","dhtmlxAjax","get","uid","result","option","doXPath","label","childNodes","nodeValue","setComboValue","all_options","i","options","length","single_option","key","css","push","index","getIndexByValue","get_value","getSelectedValue","getSelectedText","focus","vertical","radiobuttons","getElementsByTagName","checked","checked_value","wide_form","document","getElementById","isChecked","className","check_html","label_html","locale","labels","innerHTML","nextSibling","handler","checkbox","onclick","unchecked_value"],"mappings":"AAAAA,UAAUC,YAAmB,OAC5BC,OAAO,SAASC,GACVA,EAAIC,iBACRD,EAAIC,kBACL,IAAIC,GAAM,EAEV,OADAA,IAAO,eAAeF,EAAIG,KAAK,oBAAoBH,EAAII,QAAQ,IAAI,gBAGpEC,UAAU,SAASC,EAAKC,EAAMC,EAAGC,IAChC,WAOC,QAASC,KACLJ,EAAKK,QAAUL,EAAKK,OAAOC,WAC7BN,EAAKK,OAAOE,aARdH,GACA,IAAII,GAAKjB,UAAUkB,YAAY,kBAAkB,WAEhDL,IACAb,UAAUmB,YAAYF,QAQxBG,OAAOC,kBAAoBT,EAAOU,YAAY,IAC9Cb,EAAKK,OAAS,GAAIS,aAAYd,EAAMG,EAAOY,KAAMf,EAAKgB,YAAY,GAC9Db,EAAOc,UACVjB,EAAKK,OAAOI,YAAY,WAAYN,EAAOc,UAExCd,EAAOe,gBACVlB,EAAKK,OAAOc,gBAAgBhB,EAAOe,eACpC;GAAIE,GAAQpB,EAAKK,MAGjB,IAFAe,EAAMC,oBAAoBlB,EAAOmB,UAAWnB,EAAOoB,aAAa,OAAQpB,EAAOqB,OAE1ErB,EAAOoB,YAgBL,CACN,GAAIE,GAAcvB,EAAGC,EAAOuB,OACxBD,GACCtB,EAAOR,eAAe8B,IACzBL,EAAMO,UAAUF,EAAatB,EAAOR,eAAe8B,IACnDL,EAAMQ,QAAQ,GACdR,EAAMS,aAAa,GACnBT,EAAMQ,QAAQ,IAEdE,WAAWC,IAAI5B,EAAOoB,YAAY,OAAOE,EAAY,QAAQlC,UAAUyC,MAAO,SAASC,GACtF,GAAIC,GAASD,EAAOE,QAAQ,YAAY,GACpCC,EAAQF,EAAOG,WAAW,GAAGC,SACjCnC,GAAOR,eAAe8B,GAAeW,EACrChB,EAAMO,UAAUF,EAAaW,GAC7BhB,EAAMQ,QAAQ,GACdR,EAAMS,aAAa,GACnBT,EAAMQ,QAAQ,KAIhBR,EAAMmB,cAAc,QApCG,CAExB,IAAK,GADDC,MACKC,EAAI,EAAGA,EAAItC,EAAOuC,QAAQC,OAAQF,IAAK,CAC/C,GAAIP,GAAS/B,EAAOuC,QAAQD,GACxBG,GACHV,EAAOW,IACPX,EAAOE,MACPF,EAAOY,IAERN;EAAYO,KAAKH,GAGlB,GADAxB,EAAMO,UAAUa,GACZtC,EAAGC,EAAOuB,QAAS,CACtB,GAAIsB,GAAQ5B,EAAM6B,gBAAgB/C,EAAGC,EAAOuB,QAC5CN,GAAMS,aAAamB,MA0BtBE,UAAU,SAASlD,EAAKE,EAAGC,GAC1B,GAAIsB,GAAczB,EAAKK,OAAO8C,kBAI9B,OAHIhD,GAAOoB,cACVpB,EAAOR,eAAe8B,GAAezB,EAAKK,OAAO+C,mBAE3C3B,GAER4B,MAAM,cAIP9D,UAAUC,YAAmB,OAC5BC,OAAO,SAASC,GACf,GAAIE,GAAM,EACVA,IAAO,0DAA0DF,EAAII,OAAO,QAC5E,KAAK,GAAI2C,GAAE,EAAGA,EAAE/C,EAAIgD,QAAQC,OAAQF,IAAK,CACxC,GAAIjC,GAAKjB,UAAUyC,KACnBpC,IAAO,cAAcY,EAAG,wBAAwBd,EAAIqB,KAAK,YAAYrB,EAAIgD,QAAQD,GAAGI,IAAI,iBAAiBrC,EAAG,MAASd,EAAIgD,QAAQD,GAAGL,MAAM,WACvI1C,EAAI4D,WACN1D,GAAO;CAIT,MAFAA,IAAO,UAIRG,UAAU,SAASC,EAAKC,EAAMC,EAAGC,GAEhC,IAAK,GADDoD,GAAevD,EAAKwD,qBAAqB,SACpCf,EAAI,EAAGA,EAAIc,EAAaZ,OAAQF,IAAK,CAC7Cc,EAAad,GAAGgB,SAAU,CAC1B,IAAIC,GAAgBxD,EAAGC,EAAOuB,SAASzB,CACnCsD,GAAad,GAAGxC,OAASyD,IAC5BH,EAAad,GAAGgB,SAAU,KAI7BP,UAAU,SAASlD,GAElB,IAAI,GADAuD,GAAevD,EAAKwD,qBAAqB,SACrCf,EAAE,EAAGA,EAAEc,EAAaZ,OAAQF,IACnC,GAAGc,EAAad,GAAGgB,QAClB,MAAOF,GAAad,GAAGxC,OAI1BoD,MAAM,cAIP9D,UAAUC,YAAsB,UAC/BC,OAAO,SAASC,GACf,MAAIH,WAAUY,OAAOwD,UACb,uCAAuCjE,EAAII,OAAQ,iBAAiBJ,EAAII,OAAO,OAAQ,IAAI,UAE3F;EAETC,UAAU,SAASC,EAAKC,EAAMC,EAAGC,GAChCH,EAAK4D,SAASC,eAAe1D,EAAOK,GACpC,IAAIA,GAAKjB,UAAUyC,MACf8B,EAA4C,mBAAxB3D,GAAOuD,cAAgCzD,GAASE,EAAOuD,gBAAkBzD,CACjGD,GAAK+D,WAAa,mBAClB,IAAIC,GAAa,cAAcxD,EAAG,wCAAwCL,EAAOY,KAAK,KAAK,EAAY,iBAAiB,IAAI,KACxHkD,EAAa,eAAezD,EAAG,MAAMjB,UAAU2E,OAAOC,OAAO,WAAWhE,EAAOY,OAAOZ,EAAOY,MAAM,UAOvG,IANIxB,UAAUY,OAAOwD,WACpB3D,EAAKoE,UAAYH,EACjBjE,EAAKqE,YAAYD,UAAUJ,GAE3BhE,EAAKoE,UAAUJ,EAAWC,EAEvB9D,EAAOmE,QAAS,CACnB,GAAIC,GAAWvE,EAAKwD,qBAAqB,SAAS,EAClDe;EAASC,QAAUrE,EAAOmE,UAG5BpB,UAAU,SAASlD,EAAKE,EAAGC,GAC1BH,EAAK4D,SAASC,eAAe1D,EAAOK,GACpC,IAAI+D,GAAWvE,EAAKwD,qBAAqB,SAAS,EAGlD,OAFKe,KACJA,EAAWvE,EAAKqE,YAAYb,qBAAqB,SAAS,IACnDe,EAAgB,QAAGpE,EAAOuD,gBAAe,EAAOvD,EAAOsE,kBAAiB,GAEjFpB,MAAM"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_expand.js b/codebase/sources/ext/dhtmlxscheduler_expand.js
new file mode 100644
index 0000000..2a5a4b8
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_expand.js
@@ -0,0 +1,76 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+scheduler.expand = function() {
+ var t = scheduler._obj;
+ do {
+ t._position = t.style.position || "";
+ t.style.position = "static";
+ } while ((t = t.parentNode) && t.style);
+ t = scheduler._obj;
+ t.style.position = "absolute";
+ t._width = t.style.width;
+ t._height = t.style.height;
+ t.style.width = t.style.height = "100%";
+ t.style.top = t.style.left = "0px";
+
+ var top = document.body;
+ top.scrollTop = 0;
+
+ top = top.parentNode;
+ if (top)
+ top.scrollTop = 0;
+ document.body._overflow = document.body.style.overflow || "";
+ document.body.style.overflow = "hidden";
+ scheduler._maximize();
+};
+scheduler.collapse = function() {
+ var t = scheduler._obj;
+ do {
+ t.style.position = t._position;
+ } while ((t = t.parentNode) && t.style);
+ t = scheduler._obj;
+ t.style.width = t._width;
+ t.style.height = t._height;
+ document.body.style.overflow = document.body._overflow;
+ scheduler._maximize();
+};
+scheduler.attachEvent("onTemplatesReady", function() {
+ var t = document.createElement("DIV");
+ t.className = "dhx_expand_icon";
+ scheduler.toggleIcon = t;
+ scheduler._obj.appendChild(t);
+ t.onclick = function() {
+ if (!scheduler.expanded)
+ scheduler.expand(); else
+ scheduler.collapse();
+ };
+});
+scheduler._maximize = function() {
+ this.expanded = !this.expanded;
+ this.toggleIcon.style.backgroundPosition = "0 " + (this.expanded ? "0" : "18") + "px";
+
+ var directions = ['left', 'top'];
+ for (var i = 0; i < directions.length; i++) {
+ var margin = scheduler.xy['margin_' + directions[i]];
+ var prev_margin = scheduler['_prev_margin_' + directions[i]];
+ if (scheduler.xy['margin_' + directions[i]]) {
+ scheduler['_prev_margin_' + directions[i]] = scheduler.xy['margin_' + directions[i]];
+ scheduler.xy['margin_' + directions[i]] = 0;
+ } else {
+ if (prev_margin) {
+ scheduler.xy['margin_' + directions[i]] = scheduler['_prev_margin_' + directions[i]];
+ delete scheduler['_prev_margin_' + directions[i]];
+ }
+ }
+ }
+
+ if (scheduler.callEvent("onSchedulerResize", [])) {
+ scheduler.update_view();
+ scheduler.callEvent("onAfterSchedulerResize");
+ }
+};
diff --git a/codebase/sources/ext/dhtmlxscheduler_expand.js.map b/codebase/sources/ext/dhtmlxscheduler_expand.js.map
new file mode 100644
index 0000000..7c67fd4
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_expand.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_expand.js.map","sources":["dhtmlxscheduler_expand.js"],"names":["scheduler","expand","t","_obj","_position","style","position","parentNode","_width","width","_height","height","top","left","document","body","scrollTop","_overflow","overflow","_maximize","collapse","attachEvent","createElement","className","toggleIcon","appendChild","onclick","expanded","this","backgroundPosition","directions","i","length","prev_margin","xy","callEvent","update_view"],"mappings":"AAAAA,UAAUC,OAAS,WAClB,GAAIC,GAAIF,UAAUG,IAClB,GACCD,GAAEE,UAAYF,EAAEG,MAAMC,UAAY,GAClCJ,EAAEG,MAAMC,SAAW,gBACVJ,EAAIA,EAAEK,aAAeL,EAAEG,MACjCH,GAAIF,UAAUG,KACdD,EAAEG,MAAMC,SAAW,WACnBJ,EAAEM,OAASN,EAAEG,MAAMI,MACnBP,EAAEQ,QAAUR,EAAEG,MAAMM,OACpBT,EAAEG,MAAMI,MAAQP,EAAEG,MAAMM,OAAS,OACjCT,EAAEG,MAAMO,IAAMV,EAAEG,MAAMQ,KAAO,KAE7B,IAAID,GAAME,SAASC,IACnBH,GAAII,UAAY,EAEhBJ,EAAMA,EAAIL,WACNK,IACHA,EAAII,UAAY,GACjBF,SAASC,KAAKE,UAAYH,SAASC,KAAKV,MAAMa,UAAY,GAC1DJ,SAASC,KAAKV,MAAMa,SAAW,SAC/BlB,UAAUmB,aAEXnB,UAAUoB,SAAW,WACpB,GAAIlB,GAAIF,UAAUG,IAClB;EACCD,GAAEG,MAAMC,SAAWJ,EAAEE,iBACZF,EAAIA,EAAEK,aAAeL,EAAEG,MACjCH,GAAIF,UAAUG,KACdD,EAAEG,MAAMI,MAAQP,EAAEM,OAClBN,EAAEG,MAAMM,OAAST,EAAEQ,QACnBI,SAASC,KAAKV,MAAMa,SAAWJ,SAASC,KAAKE,UAC7CjB,UAAUmB,aAEXnB,UAAUqB,YAAY,mBAAoB,WACzC,GAAInB,GAAIY,SAASQ,cAAc,MAC/BpB,GAAEqB,UAAY,kBACdvB,UAAUwB,WAAatB,EACvBF,UAAUG,KAAKsB,YAAYvB,GAC3BA,EAAEwB,QAAU,WACN1B,UAAU2B,SAEd3B,UAAUoB,WADVpB,UAAUC,YAIbD,UAAUmB,UAAY,WACrBS,KAAKD,UAAYC,KAAKD,SACtBC,KAAKJ,WAAWnB,MAAMwB,mBAAqB,MAAQD,KAAKD,SAAW,IAAM,MAAQ,IAGjF;IAAK,GADDG,IAAc,OAAQ,OACjBC,EAAI,EAAGA,EAAID,EAAWE,OAAQD,IAAK,CAC3C,GACIE,IADSjC,UAAUkC,GAAG,UAAYJ,EAAWC,IAC/B/B,UAAU,gBAAkB8B,EAAWC,IACrD/B,WAAUkC,GAAG,UAAYJ,EAAWC,KACvC/B,UAAU,gBAAkB8B,EAAWC,IAAM/B,UAAUkC,GAAG,UAAYJ,EAAWC,IACjF/B,UAAUkC,GAAG,UAAYJ,EAAWC,IAAM,GAEtCE,IACHjC,UAAUkC,GAAG,UAAYJ,EAAWC,IAAM/B,UAAU,gBAAkB8B,EAAWC,UAC1E/B,WAAU,gBAAkB8B,EAAWC,KAK7C/B,UAAUmC,UAAU,0BACvBnC,UAAUoC,cACVpC,UAAUmC,UAAU"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_grid_view.js b/codebase/sources/ext/dhtmlxscheduler_grid_view.js
new file mode 100644
index 0000000..d1e7c47
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_grid_view.js
@@ -0,0 +1,483 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+(function(){
+ scheduler._grid = {
+ sort_rules:{
+ "int":function(a,b, getVal){ return getVal(a)*1 < getVal(b)*1?1:-1; },
+ "str":function(a,b, getVal){ return getVal(a) < getVal(b)?1:-1; },
+ "date":function(a,b, getVal){ return new Date(getVal(a))< new Date(getVal(b))?1:-1; }
+ },
+ _getObjName:function(name){
+ return "grid_"+name;
+ },
+ _getViewName:function(objName){
+ return objName.replace(/^grid_/,'');
+ }
+ };
+}
+)();
+/*
+obj={
+ name:'grid_name'
+ fields:[
+ { id:"id", label:"Id", width:80, sort:"int/date/str", template:function(start_date, end_date, ev){ return ""}, align:"right/left/center" },
+ { id:"text", label:"Text", width:'*', css:"class_name", sort:function(a,b){ return 1 or -1}, valign:'top/bottom/middle' }
+ ...
+ ],
+ from:new Date(0),
+ to:Date:new Date(9999,1,1),
+ rowHeight:int,
+ paging:true/false,
+ select:true/false
+}
+*/
+
+
+scheduler.createGridView=function(obj){
+
+ var name = obj.name || 'grid';
+ var objName = scheduler._grid._getObjName(name);
+
+ scheduler.config[name + '_start'] = obj.from || (new Date(0));
+ scheduler.config[name + '_end'] = obj.to || (new Date(9999,1,1));
+
+ scheduler[objName] = obj;
+ scheduler[objName].defPadding = 8;
+ scheduler[objName].columns = scheduler[objName].fields;
+ scheduler[objName].unit = obj.unit || "month";
+ scheduler[objName].step = obj.step || 1;
+ delete scheduler[objName].fields;
+ function isValidSize(size){
+ return !(size !== undefined && (size*1 != size || size < 0));
+ }
+
+ var cols = scheduler[objName].columns;
+ for(var i=0; i < cols.length; i++){
+ if(isValidSize(cols[i].width))
+ cols[i].initialWidth = cols[i].width;
+ if(!isValidSize(cols[i].paddingLeft))
+ delete cols[i].paddingLeft;
+ if(!isValidSize(cols[i].paddingRight))
+ delete cols[i].paddingRight;
+ }
+
+ scheduler[objName].select = obj.select === undefined ? true : obj.select;
+ if(scheduler.locale.labels[name +'_tab'] === undefined)
+ scheduler.locale.labels[name +'_tab'] = scheduler[objName].label || scheduler.locale.labels.grid_tab;
+
+ scheduler[objName]._selected_divs = [];
+
+ scheduler.date[name+'_start']=function(d){
+ if(scheduler.date[obj.unit+'_start'])
+ return scheduler.date[obj.unit+'_start'](d);
+ else
+ return (d);
+ };
+ scheduler.date['add_' + name] = function(date, inc){
+ return scheduler.date.add(date, inc*scheduler[objName].step, scheduler[objName].unit);
+ };
+
+ scheduler.templates[name+"_date"] = function(start, end){
+ return scheduler.templates.day_date(start)+" - "+scheduler.templates.day_date(end);
+ };
+ scheduler.templates[name + '_full_date'] = function(start,end,ev){
+ if (scheduler.isOneDayEvent(ev))
+ return this[name + '_single_date'](start);
+ else
+ return scheduler.templates.day_date(start)+" &ndash; "+scheduler.templates.day_date(end);
+ };
+ scheduler.templates[name + '_single_date'] = function(date){
+ return scheduler.templates.day_date(date)+" "+this.event_date(date);
+ };
+ scheduler.templates[name + '_field'] = function(field_name, event){
+ return event[field_name];
+ };
+
+ scheduler.attachEvent("onTemplatesReady",function(){
+
+ scheduler.attachEvent("onDblClick",function(event_id, native_event_object){
+ if(this._mode == name){
+ scheduler._click.buttons['details'](event_id);
+ return false;
+ }
+ return true;
+ });
+
+ scheduler.attachEvent("onClick",function(event_id, native_event_object){
+ if(this._mode == name && scheduler[objName].select ){
+ scheduler._grid.unselectEvent('', name);
+ scheduler._grid.selectEvent(event_id, name, native_event_object);
+ return false;
+ }
+ return true;
+ });
+
+ scheduler.attachEvent("onSchedulerResize", function() {
+ if (this._mode == name) {
+ this[name + '_view'](true);
+ // timeout used to run code after all onSchedulerResize handlers are finished
+ window.setTimeout(function(){
+ // we need to call event manually because handler return false, and blocks default logic
+ scheduler.callEvent("onAfterSchedulerResize", []);
+ },1);
+ return false;
+ }
+ return true;
+ });
+
+
+ var old = scheduler.render_data;
+ scheduler.render_data=function(evs){
+ if (this._mode == name)
+ scheduler._grid._fill_grid_tab(objName);
+ else
+ return old.apply(this,arguments);
+ };
+
+ var old_render_view_data = scheduler.render_view_data;
+ scheduler.render_view_data=function(){
+ if(this._mode == name) {
+ scheduler._grid._gridScrollTop = scheduler._els["dhx_cal_data"][0].childNodes[0].scrollTop;
+ scheduler._els["dhx_cal_data"][0].childNodes[0].scrollTop = 0;
+ scheduler._els["dhx_cal_data"][0].style.overflowY = 'auto';
+ }
+ else {
+ scheduler._els["dhx_cal_data"][0].style.overflowY = 'auto';
+ }
+ return old_render_view_data.apply(this,arguments);
+ };
+});
+
+
+ scheduler[name+'_view']=function(mode){
+ if (mode){
+ var min = null,
+ max = null;
+ var view = scheduler[objName];
+ if(view.paging){
+ min = scheduler.date[name+'_start'](new Date(scheduler._date));
+ max = scheduler.date['add_'+name](min, 1);
+ }else{
+ min = scheduler.config[name + '_start'];
+ max = scheduler.config[name + '_end'];
+ }
+
+ scheduler._min_date = min;
+ scheduler._max_date = max;
+
+ scheduler._grid.set_full_view(objName);
+
+ var header = "";
+ if(+min > +new Date(0) && +max < +(new Date(9999,1,1)))
+ header = scheduler.templates[name+"_date"](min, max);
+
+ scheduler._els["dhx_cal_date"][0].innerHTML = header;
+
+ //grid tab activated
+ scheduler._gridView = objName;
+ } else {
+ scheduler._grid._sort_marker = null;
+ delete scheduler._gridView;
+ scheduler._rendered=[];
+ scheduler[objName]._selected_divs = [];
+ //grid tab de-activated
+ }
+ };
+
+
+};
+
+
+scheduler.dblclick_dhx_grid_area=function(){
+ if (!this.config.readonly && this.config.dblclick_create)
+ this.addEventNow();
+};
+
+if(scheduler._click.dhx_cal_header){
+ scheduler._old_header_click = scheduler._click.dhx_cal_header;
+}
+scheduler._click.dhx_cal_header=function(e){
+ if(scheduler._gridView){
+ var event = e||window.event;
+ var params = scheduler._grid.get_sort_params(event, scheduler._gridView);
+
+ scheduler._grid.draw_sort_marker(event.originalTarget || event.srcElement, params.dir);
+
+ scheduler.clear_view();
+ scheduler._grid._fill_grid_tab(scheduler._gridView, params);
+ }
+ else if(scheduler._old_header_click)
+ return scheduler._old_header_click.apply(this,arguments);
+};
+
+scheduler._grid.selectEvent = function(id, view_name, native_event_object){
+ if(scheduler.callEvent("onBeforeRowSelect",[id,native_event_object])){
+ var objName = scheduler._grid._getObjName(view_name);
+
+ scheduler.for_rendered(id, function(event_div){
+ event_div.className += " dhx_grid_event_selected";
+ scheduler[objName]._selected_divs.push(event_div);
+ });
+ scheduler._select_id = id;
+ }
+};
+
+scheduler._grid._unselectDiv= function(div){
+ div.className = div.className.replace(/ dhx_grid_event_selected/,'');
+};
+scheduler._grid.unselectEvent = function(id, view_name){
+ var objName = scheduler._grid._getObjName(view_name);
+ if(!objName || !scheduler[objName]._selected_divs)
+ return;
+
+ if(!id){
+ for(var i=0; i<scheduler[objName]._selected_divs.length; i++)
+ scheduler._grid._unselectDiv(scheduler[objName]._selected_divs[i]);
+
+ scheduler[objName]._selected_divs = [];
+
+ }else{
+ for(var i=0; i<scheduler[objName]._selected_divs.length; i++)
+ if(scheduler[objName]._selected_divs[i].getAttribute('event_id') == id){
+ scheduler._grid._unselectDiv(scheduler[objName]._selected_divs[i]);
+ scheduler[objName]._selected_divs.slice(i,1);
+ break;
+ }
+
+ }
+};
+
+scheduler._grid.get_sort_params = function(event, objName){
+ var targ = event.originalTarget || event.srcElement;
+ var direction = "desc";
+ if(targ.className == 'dhx_grid_view_sort')
+ targ = targ.parentNode;
+ if(!targ.className || targ.className.indexOf("dhx_grid_sort_asc") == -1)
+ direction = 'asc';
+
+ var index = 0;
+ for(var i =0; i < targ.parentNode.childNodes.length; i++){
+ if(targ.parentNode.childNodes[i] == targ){
+ index = i;
+ break;
+ }
+ }
+
+ var value = null;
+ if(scheduler[objName].columns[index].template){
+ var template = scheduler[objName].columns[index].template;
+ value = function(ev){
+ return template(ev.start_date, ev.end_date, ev);
+ };
+ }else{
+ var field = scheduler[objName].columns[index].id;
+ if(field == "date")
+ field = "start_date";
+ value = function(ev){ return ev[field]; };
+ }
+
+ var rule = scheduler[objName].columns[index].sort;
+
+ if(typeof rule != 'function'){
+ rule = scheduler._grid.sort_rules[rule] || scheduler._grid.sort_rules['str'];
+ }
+
+ return {dir:direction, value:value, rule:rule};
+};
+
+scheduler._grid.draw_sort_marker = function(node, direction){
+ if(node.className == 'dhx_grid_view_sort')
+ node = node.parentNode;
+
+ if(scheduler._grid._sort_marker){
+ scheduler._grid._sort_marker.className = scheduler._grid._sort_marker.className.replace(/( )?dhx_grid_sort_(asc|desc)/, '');
+ scheduler._grid._sort_marker.removeChild(scheduler._grid._sort_marker.lastChild);
+ }
+
+ node.className += " dhx_grid_sort_"+direction;
+ scheduler._grid._sort_marker = node;
+ var html = "<div class='dhx_grid_view_sort' style='left:"+(+node.style.width.replace('px','') -15+node.offsetLeft)+"px'>&nbsp;</div>";
+ node.innerHTML += html;
+
+};
+
+scheduler._grid.sort_grid=function(sort){
+
+ var sort = sort || {dir:'desc', value:function(ev){return ev.start_date;}, rule:scheduler._grid.sort_rules['date']};
+
+ var events = scheduler.get_visible_events();
+
+ if(sort.dir == 'desc')
+ events.sort(function(a,b){return sort.rule(a,b,sort.value);});
+ else
+ events.sort(function(a,b){return -sort.rule(a,b, sort.value);});
+ return events;
+};
+
+
+
+scheduler._grid.set_full_view = function(mode){
+ if (mode){
+ var l = scheduler.locale.labels;
+ var html =scheduler._grid._print_grid_header(mode);
+
+ scheduler._els["dhx_cal_header"][0].innerHTML= html;
+ scheduler._table_view=true;
+ scheduler.set_sizes();
+ }
+};
+scheduler._grid._calcPadding = function(column, parent){
+ var padding = (column.paddingLeft !== undefined ? 1*column.paddingLeft : scheduler[parent].defPadding) +
+ (column.paddingRight !== undefined ? 1*column.paddingRight : scheduler[parent].defPadding);
+ return padding;
+};
+
+scheduler._grid._getStyles = function(column, items){
+ var cell_style = [], style = "";
+ for(var i=0; items[i]; i++ ){
+ style = items[i] + ":";
+ switch (items[i]){
+ case "text-align":
+ if(column.align)
+ cell_style.push(style+column.align);
+ break;
+ case "vertical-align":
+ if(column.valign)
+ cell_style.push(style+column.valign);
+ break;
+ case "padding-left":
+ if(column.paddingLeft !== undefined)
+ cell_style.push(style+(column.paddingLeft||'0') + "px");
+ break;
+ case "padding-right":
+ if(column.paddingRight !== undefined)
+ cell_style.push(style+(column.paddingRight||'0') + "px");
+ break;
+ }
+ }
+ return cell_style;
+};
+
+scheduler._grid._fill_grid_tab = function(objName, sort){
+ //get current date
+ var date = scheduler._date;
+ //select events for which data need to be printed
+ var events = scheduler._grid.sort_grid(sort);
+
+ //generate html for the view
+ var columns = scheduler[objName].columns;
+
+ var html = "<div>";
+ var left = -2;//column borders at the same pos as header borders...
+ for(var i=0; i < columns.length; i++){
+ var padding = scheduler._grid._calcPadding(columns[i], objName);
+ left +=columns[i].width + padding ;//
+ if(i < columns.length - 1)
+ html += "<div class='dhx_grid_v_border' style='left:"+(left)+"px'></div>";
+ }
+ html += "</div>";
+ html +="<div class='dhx_grid_area'><table>";
+
+ for (var i=0; i<events.length; i++){
+ html += scheduler._grid._print_event_row(events[i], objName);
+ }
+
+ html +="</table></div>";
+ //render html
+ scheduler._els["dhx_cal_data"][0].innerHTML = html;
+ scheduler._els["dhx_cal_data"][0].scrollTop = scheduler._grid._gridScrollTop||0;
+
+ var t=scheduler._els["dhx_cal_data"][0].getElementsByTagName("tr");
+
+ scheduler._rendered=[];
+ for (var i=0; i < t.length; i++){
+ scheduler._rendered[i]=t[i];
+ }
+
+};
+scheduler._grid._print_event_row = function(ev, objName){
+
+ var styles = [];
+ if(ev.color)
+ styles.push("background:"+ev.color);
+ if(ev.textColor)
+ styles.push("color:"+ev.textColor);
+ if(ev._text_style)
+ styles.push(ev._text_style);
+ if(scheduler[objName]['rowHeight'])
+ styles.push('height:'+scheduler[objName]['rowHeight'] + 'px');
+
+ var style = "";
+ if(styles.length){
+ style = "style='"+styles.join(";")+"'";
+ }
+
+ var columns = scheduler[objName].columns;
+ var ev_class = scheduler.templates.event_class(ev.start_date, ev.end_date, ev);
+
+ var html ="<tr class='dhx_grid_event"+(ev_class? ' '+ev_class:'')+"' event_id='"+ev.id+"' " + style + ">";
+
+ var name = scheduler._grid._getViewName(objName);
+ var availStyles = ["text-align", "vertical-align", "padding-left","padding-right"];
+ for(var i =0; i < columns.length; i++){
+ var value;
+ if(columns[i].template){
+ value = columns[i].template(ev.start_date, ev.end_date, ev);
+ }else if(columns[i].id == 'date') {
+ value = scheduler.templates[name + '_full_date'](ev.start_date, ev.end_date, ev);
+ }else if(columns[i].id == 'start_date' || columns[i].id == 'end_date' ){
+ value = scheduler.templates[name + '_single_date'](ev[columns[i].id]);
+ }else{
+ value = scheduler.templates[name + '_field'](columns[i].id, ev);
+ }
+
+ var cell_style = scheduler._grid._getStyles(columns[i], availStyles);
+
+ var className = columns[i].css ? (" class=\""+columns[i].css+"\"") : "";
+
+ html+= "<td style='width:"+ (columns[i].width )+"px;"+cell_style.join(";")+"' "+className+">"+value+"</td>";
+
+ }
+ html+="<td class='dhx_grid_dummy'></td></tr>";
+
+ return html;
+};
+
+scheduler._grid._print_grid_header = function(objName){
+ var head = "<div class='dhx_grid_line'>";
+
+ var columns = scheduler[objName].columns;
+ var widths = [];
+
+ var unsized_columns = columns.length;
+ var avail_width = scheduler._obj.clientWidth - 2*columns.length -20;//-20 for possible scrollbar, -length for borders
+ for(var ind=0; ind < columns.length; ind++){
+
+ var val = columns[ind].initialWidth*1;
+ if(!isNaN(val) && columns[ind].initialWidth !== '' && columns[ind].initialWidth !== null && typeof columns[ind].initialWidth != 'boolean'){
+
+ unsized_columns--;
+ avail_width -= val;
+ widths[ind] = val;
+ }else {
+ widths[ind] = null;
+ }
+ }
+
+ var unsized_width = Math.floor(avail_width / unsized_columns);
+ var availStyles = ["text-align", "padding-left","padding-right"];
+ for(var i=0; i < columns.length; i++){
+ var column_width = !widths[i] ? unsized_width : widths[i];
+ columns[i].width = column_width - scheduler._grid._calcPadding(columns[i], objName);
+ var cell_style = scheduler._grid._getStyles(columns[i], availStyles);
+ head += "<div style='width:"+(columns[i].width -1)+"px;"+cell_style.join(";")+"'>" + (columns[i].label === undefined ? columns[i].id : columns[i].label) + "</div>";
+ }
+ head +="</div>";
+
+ return head;
+};
diff --git a/codebase/sources/ext/dhtmlxscheduler_grid_view.js.map b/codebase/sources/ext/dhtmlxscheduler_grid_view.js.map
new file mode 100644
index 0000000..f0f702b
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_grid_view.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_grid_view.js.map","sources":["dhtmlxscheduler_grid_view.js"],"names":["scheduler","_grid","sort_rules","int","a","b","getVal","str","date","Date","_getObjName","name","_getViewName","objName","replace","createGridView","obj","isValidSize","size","undefined","config","from","to","defPadding","columns","fields","unit","step","cols","i","length","width","initialWidth","paddingLeft","paddingRight","select","locale","labels","label","grid_tab","_selected_divs","d","inc","add","templates","start","end","day_date","ev","isOneDayEvent","this","event_date","field_name","event","attachEvent","event_id","_mode","_click","buttons","native_event_object","unselectEvent","selectEvent","window","setTimeout","callEvent","old","render_data","apply","arguments","_fill_grid_tab","old_render_view_data","render_view_data","_gridScrollTop","_els","childNodes","scrollTop","style","overflowY","mode","min","max","view","paging","_date","_min_date","_max_date","set_full_view","header","innerHTML","_gridView","_sort_marker","_rendered","dblclick_dhx_grid_area","readonly","dblclick_create","addEventNow","dhx_cal_header","_old_header_click","e","params","get_sort_params","draw_sort_marker","originalTarget","srcElement","dir","clear_view","id","view_name","for_rendered","event_div","className","push","_select_id","_unselectDiv","div","getAttribute","slice","targ","direction","parentNode","indexOf","index","value","template","start_date","end_date","field","rule","sort","node","removeChild","lastChild","html","offsetLeft","sort_grid","events","get_visible_events","_print_grid_header","_table_view","set_sizes","_calcPadding","column","parent","padding","_getStyles","items","cell_style","align","valign","left","_print_event_row","t","getElementsByTagName","styles","color","textColor","_text_style","join","ev_class","event_class","availStyles","css","head","widths","unsized_columns","avail_width","_obj","clientWidth","ind","val","isNaN","unsized_width","Math","floor","column_width"],"mappings":"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"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_html_templates.js b/codebase/sources/ext/dhtmlxscheduler_html_templates.js
new file mode 100644
index 0000000..713c6d4
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_html_templates.js
@@ -0,0 +1,22 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+scheduler.attachEvent("onTemplatesReady",function(){
+ var els = document.body.getElementsByTagName("DIV");
+ for (var i=0; i < els.length; i++) {
+ var cs = els[i].className||"";
+ cs = cs.split(":");
+ if (cs.length == 2 && cs[0] == "template"){
+ var code = "return \""+(els[i].innerHTML||"").replace(/\"/g,"\\\"").replace(/[\n\r]+/g,"")+"\";";
+ code = unescape(code).replace(/\{event\.([a-z]+)\}/g,function(all,mask){
+ return '"+ev.'+mask+'+"';
+ });
+ scheduler.templates[cs[1]]=Function("start","end","ev",code);
+ els[i].style.display='none';
+ }
+ }
+}); \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_html_templates.js.map b/codebase/sources/ext/dhtmlxscheduler_html_templates.js.map
new file mode 100644
index 0000000..e10ce27
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_html_templates.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_html_templates.js.map","sources":["dhtmlxscheduler_html_templates.js"],"names":["scheduler","attachEvent","els","document","body","getElementsByTagName","i","length","cs","className","split","code","innerHTML","replace","unescape","all","mask","templates","Function","style","display"],"mappings":"AAAAA,UAAUC,YAAY,mBAAmB,WAExC,IAAK,GADDC,GAAMC,SAASC,KAAKC,qBAAqB,OACpCC,EAAE,EAAGA,EAAIJ,EAAIK,OAAQD,IAAK,CAClC,GAAIE,GAAKN,EAAII,GAAGG,WAAW,EAE3B,IADAD,EAAKA,EAAGE,MAAM,KACG,GAAbF,EAAGD,QAAwB,YAATC,EAAG,GAAiB,CACzC,GAAIG,GAAO,YAAaT,EAAII,GAAGM,WAAW,IAAIC,QAAQ,MAAM,OAAQA,QAAQ,WAAW,IAAI,IAC3FF,GAAOG,SAASH,GAAME,QAAQ,uBAAuB,SAASE,EAAIC,GACjE,MAAO,QAAQA,EAAK,OAErBhB,UAAUiB,UAAUT,EAAG,IAAIU,SAAS,QAAQ,MAAM,KAAKP,GACvDT,EAAII,GAAGa,MAAMC,QAAQ"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_key_nav.js b/codebase/sources/ext/dhtmlxscheduler_key_nav.js
new file mode 100644
index 0000000..33fb417
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_key_nav.js
@@ -0,0 +1,115 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+//Initial idea and implementation by Steve MC
+scheduler._temp_key_scope = function (){
+
+scheduler.config.key_nav = true;
+
+var date; // used for copy and paste operations
+var section; // used for copy and paste operations
+var isCopy = null;
+
+
+scheduler.attachEvent("onMouseMove", function(id,e){
+ date = scheduler.getActionData(e).date;
+ section = scheduler.getActionData(e).section;
+});
+
+function clear_event_after(ev){
+ delete ev.rec_type; delete ev.rec_pattern;
+ delete ev.event_pid; delete ev.event_length;
+}
+scheduler._make_pasted_event = function(ev){
+ var event_duration = ev.end_date-ev.start_date;
+
+ var copy = scheduler._lame_copy({}, ev);
+ clear_event_after(copy);
+ copy.start_date = new Date(date);
+ copy.end_date = new Date(copy.start_date.valueOf() + event_duration);
+
+ if(section){
+ var state = scheduler.getState().mode,
+ property = null;
+
+ if(scheduler.matrix[state]){
+ property = scheduler.matrix[state].y_property;
+ }else if(scheduler._props[state]){
+ property = scheduler._props[state].property;
+ }
+ copy[property] = section;
+ }
+ return copy;
+};
+scheduler._do_paste = function(is_copy, modified_ev, original_ev){
+ scheduler.addEvent(modified_ev);
+ scheduler.callEvent("onEventPasted", [is_copy, modified_ev, original_ev]);
+};
+
+scheduler._is_key_nav_active = function(){
+ if(this._is_initialized() && !this._is_lightbox_open() && this.config.key_nav){
+ return true;
+ }
+ return false;
+};
+
+dhtmlxEvent(document,(_isOpera?"keypress":"keydown"),function(e){
+ if(!scheduler._is_key_nav_active()) return true;
+
+ e=e||event;
+
+ if (e.keyCode == 37 || e.keyCode == 39) { // Left, Right arrows
+ e.cancelBubble = true;
+
+ var next = scheduler.date.add(scheduler._date,(e.keyCode == 37 ? -1 : 1 ),scheduler._mode);
+ scheduler.setCurrentView(next);
+ return true;
+ }
+
+ var select_id = scheduler._select_id;
+ if (e.ctrlKey && e.keyCode == 67) { // CTRL+C
+ if (select_id) {
+ scheduler._buffer_id = select_id;
+ isCopy = true;
+ scheduler.callEvent("onEventCopied", [scheduler.getEvent(select_id)]);
+ }
+ return true;
+ }
+ if (e.ctrlKey && e.keyCode == 88) { // CTRL+X
+ if (select_id) {
+ isCopy = false;
+ scheduler._buffer_id = select_id;
+ var ev = scheduler.getEvent(select_id);
+ scheduler.updateEvent(ev.id);
+ scheduler.callEvent("onEventCut", [ev]);
+ }
+ }
+
+ if (e.ctrlKey && e.keyCode == 86) { // CTRL+V
+ var ev = scheduler.getEvent(scheduler._buffer_id);
+ if (ev) {
+ var new_ev = scheduler._make_pasted_event(ev);
+ if (isCopy) {
+ new_ev.id = scheduler.uid();
+ scheduler._do_paste(isCopy, new_ev, ev);
+ }
+ else { // cut operation
+ var res = scheduler.callEvent("onBeforeEventChanged",[new_ev, e, false, ev]);
+ if (res) {
+ scheduler._do_paste(isCopy, new_ev, ev);
+ isCopy = true; // switch to copy after first paste operation
+ }
+ }
+
+ }
+ return true;
+ }
+
+});
+
+};
+scheduler._temp_key_scope();
diff --git a/codebase/sources/ext/dhtmlxscheduler_key_nav.js.map b/codebase/sources/ext/dhtmlxscheduler_key_nav.js.map
new file mode 100644
index 0000000..4aa116c
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_key_nav.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_key_nav.js.map","sources":["dhtmlxscheduler_key_nav.js"],"names":["scheduler","_temp_key_scope","clear_event_after","ev","rec_type","rec_pattern","event_pid","event_length","config","key_nav","date","section","isCopy","attachEvent","id","e","getActionData","_make_pasted_event","event_duration","end_date","start_date","copy","_lame_copy","Date","valueOf","state","getState","mode","property","matrix","y_property","_props","_do_paste","is_copy","modified_ev","original_ev","addEvent","callEvent","_is_key_nav_active","this","_is_initialized","_is_lightbox_open","dhtmlxEvent","document","_isOpera","event","keyCode","cancelBubble","next","add","_date","_mode","setCurrentView","select_id","_select_id","ctrlKey","_buffer_id","getEvent","updateEvent","new_ev","uid","res"],"mappings":"AACAA,UAAUC,gBAAkB,WAc5B,QAASC,GAAkBC,SACnBA,GAAGC,eAAiBD,GAAGE,kBACvBF,GAAGG,gBAAkBH,GAAGI,aAdhCP,UAAUQ,OAAOC,SAAU,CAE3B,IAAIC,GACAC,EACAC,EAAS,IAGbZ,WAAUa,YAAY,cAAe,SAASC,EAAGC,GAChDL,EAAOV,UAAUgB,cAAcD,GAAGL,KAClCC,EAAUX,UAAUgB,cAAcD,GAAGJ,UAOtCX,UAAUiB,mBAAqB,SAASd,GACvC,GAAIe,GAAiBf,EAAGgB,SAAShB,EAAGiB,WAEhCC,EAAOrB,UAAUsB,cAAenB,EAKpC,IAJAD,EAAkBmB,GAClBA,EAAKD,WAAa,GAAIG,MAAKb,GAC3BW,EAAKF,SAAW,GAAII,MAAKF,EAAKD,WAAWI,UAAYN,GAElDP,EAAQ,CACV,GAAIc,GAAQzB,UAAU0B,WAAWC,KAChCC,EAAW,IAET5B;UAAU6B,OAAOJ,GACnBG,EAAW5B,UAAU6B,OAAOJ,GAAOK,WAC3B9B,UAAU+B,OAAON,KACzBG,EAAW5B,UAAU+B,OAAON,GAAOG,UAEpCP,EAAKO,GAAYjB,EAElB,MAAOU,IAERrB,UAAUgC,UAAY,SAASC,EAASC,EAAaC,GACpDnC,UAAUoC,SAASF,GACnBlC,UAAUqC,UAAU,iBAAkBJ,EAASC,EAAaC,KAG7DnC,UAAUsC,mBAAqB,WAC9B,MAAGC,MAAKC,oBAAsBD,KAAKE,qBAAuBF,KAAK/B,OAAOC,SAC9D,GAED,GAGRiC,YAAYC,SAAUC,SAAS,WAAW,UAAW,SAAS7B,GAC7D,IAAIf,UAAUsC,qBAAsB,OAAO,CAI3C,IAFAvB,EAAEA,GAAG8B,MAEY,IAAb9B,EAAE+B,SAA8B,IAAb/B,EAAE+B,QAAe,CACvC/B,EAAEgC,cAAe,CAEjB;GAAIC,GAAOhD,UAAUU,KAAKuC,IAAIjD,UAAUkD,MAAoB,IAAbnC,EAAE+B,QAAgB,GAAK,EAAI9C,UAAUmD,MAEpF,OADAnD,WAAUoD,eAAeJ,IAClB,EAGR,GAAIK,GAAYrD,UAAUsD,UAC1B,IAAIvC,EAAEwC,SAAwB,IAAbxC,EAAE+B,QAMlB,MALIO,KACHrD,UAAUwD,WAAaH,EACvBzC,GAAS,EACTZ,UAAUqC,UAAU,iBAAkBrC,UAAUyD,SAASJ,OAEnD,CAER,IAAItC,EAAEwC,SAAwB,IAAbxC,EAAE+B,SACdO,EAAW,CACdzC,GAAS,EACTZ,UAAUwD,WAAaH,CACvB,IAAIlD,GAAKH,UAAUyD,SAASJ,EAC5BrD,WAAU0D,YAAYvD,EAAGW,IACzBd,UAAUqC,UAAU,cAAelC,IAIrC,GAAIY,EAAEwC,SAAwB,IAAbxC,EAAE+B,QAAe,CACjC,GAAI3C,GAAKH,UAAUyD,SAASzD,UAAUwD,WACtC;GAAIrD,EAAI,CACP,GAAIwD,GAAS3D,UAAUiB,mBAAmBd,EAC1C,IAAIS,EACH+C,EAAO7C,GAAKd,UAAU4D,MACtB5D,UAAUgC,UAAUpB,EAAQ+C,EAAQxD,OAEhC,CACJ,GAAI0D,GAAM7D,UAAUqC,UAAU,wBAAwBsB,EAAQ5C,GAAG,EAAOZ,GACpE0D,KACH7D,UAAUgC,UAAUpB,EAAQ+C,EAAQxD,GACpCS,GAAS,IAKZ,OAAO,MAMTZ,UAAUC"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_layer.js b/codebase/sources/ext/dhtmlxscheduler_layer.js
new file mode 100644
index 0000000..dcaa362
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_layer.js
@@ -0,0 +1,407 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+scheduler.attachEvent("onTemplatesReady",function(){
+
+ this.layers.sort(function(a, b){
+ return a.zIndex - b.zIndex;
+ });
+
+ scheduler._dp_init=function(dp){
+ dp._methods=["_set_event_text_style","","changeEventId","deleteEvent"];
+
+ this.attachEvent("onEventAdded",function(id){
+ if (!this._loading && this.validId(id) && this.getEvent(id) && this.getEvent(id).layer == dp.layer)
+ dp.setUpdated(id,true,"inserted");
+ });
+ this.attachEvent("onBeforeEventDelete",function(id){
+ if(this.getEvent(id) && this.getEvent(id).layer == dp.layer) {
+ if (!this.validId(id)) return;
+ var z=dp.getState(id);
+
+ if (z=="inserted" || this._new_event) { dp.setUpdated(id,false); return true; }
+ if (z=="deleted") return false;
+ if (z=="true_deleted") return true;
+
+ dp.setUpdated(id,true,"deleted");
+ return false;
+ }
+ else return true;
+ });
+ this.attachEvent("onEventChanged",function(id){
+ if (!this._loading && this.validId(id) && this.getEvent(id) && this.getEvent(id).layer == dp.layer)
+ dp.setUpdated(id,true,"updated");
+ });
+
+ dp._getRowData=function(id,pref){
+ var ev=this.obj.getEvent(id);
+ var data = {};
+
+ for (var a in ev){
+ if (a.indexOf("_")===0) continue;
+ if (ev[a] && ev[a].getUTCFullYear) //not very good, but will work
+ data[a] = this.obj.templates.xml_format(ev[a]);
+ else
+ data[a] = ev[a];
+ }
+ return data;
+ };
+ dp._clearUpdateFlag=function(){};
+
+ dp.attachEvent("insertCallback", scheduler._update_callback);
+ dp.attachEvent("updateCallback", scheduler._update_callback);
+ dp.attachEvent("deleteCallback", function(upd, id) {
+ this.obj.setUserData(id, this.action_param, "true_deleted");
+ this.obj.deleteEvent(id);
+ });
+ };
+
+ (function() {
+ var _cloneObj = function(obj){
+ if(obj === null || typeof(obj) != 'object')
+ return obj;
+ var temp = new obj.constructor();
+ for(var key in obj)
+ temp[key] = _cloneObj(obj[key]);
+ return temp;
+ };
+
+ scheduler._dataprocessors = [];
+ scheduler._layers_zindex = {};
+ for(var i=0; i<scheduler.layers.length; i++) {
+ scheduler.config['lightbox_'+scheduler.layers[i].name] = { };
+ scheduler.config['lightbox_'+scheduler.layers[i].name].sections = _cloneObj(scheduler.config.lightbox.sections);
+ scheduler._layers_zindex[scheduler.layers[i].name] = scheduler.config.inital_layer_zindex||5 + i*3;
+ if(scheduler.layers[i].url) {
+ var dp = new dataProcessor(scheduler.layers[i].url);
+ dp.layer = scheduler.layers[i].name;
+ scheduler._dataprocessors.push(dp);
+ scheduler._dataprocessors[i].init(scheduler);
+ }
+ if(scheduler.layers[i].isDefault)
+ scheduler.defaultLayer = scheduler.layers[i].name;
+ }
+ })();
+
+
+ scheduler.showLayer = function(tlayer) {
+ this.toggleLayer(tlayer, true);
+ };
+
+ scheduler.hideLayer = function(tlayer) {
+ this.toggleLayer(tlayer, false);
+ };
+
+ scheduler.toggleLayer = function(tlayer, visible) { // visible is optional
+ var layer = this.getLayer(tlayer);
+
+ if(typeof visible != 'undefined')
+ layer.visible = !!visible;
+ else
+ layer.visible = !layer.visible;
+
+ this.setCurrentView(this._date, this._mode);
+ };
+
+ scheduler.getLayer = function(tlayer) { // either string with layer name or event with layer property
+ var layer,
+ layer_name;
+ if(typeof tlayer == 'string')
+ layer_name = tlayer;
+ if(typeof tlayer == 'object')
+ layer_name = tlayer.layer;
+ for (var i=0; i<scheduler.layers.length; i++) {
+ if(scheduler.layers[i].name == layer_name)
+ layer = scheduler.layers[i];
+ }
+ return layer;
+ };
+
+ scheduler.attachEvent("onBeforeLightbox", function (event_id){
+ var ev = this.getEvent(event_id);
+ this.config.lightbox.sections = this.config['lightbox_'+ev.layer].sections;
+ scheduler.resetLightbox();
+ return true;
+ });
+
+ scheduler.attachEvent("onClick", function (event_id, native_event_object){
+ var ev = scheduler.getEvent(event_id);
+ return !scheduler.getLayer(ev.layer).noMenu;
+ });
+
+ scheduler.attachEvent('onEventCollision', function(ev, evs) {
+ var layer = this.getLayer(ev);
+ if(!layer.checkCollision)
+ return false;
+ var count = 0;
+ for(var i = 0; i<evs.length; i++) {
+ if(evs[i].layer == layer.name && evs[i].id != ev.id)
+ count++;
+ }
+ return (count >= scheduler.config.collision_limit);
+ });
+
+ scheduler.addEvent=function(start_date,end_date,text,id,extra_data){
+ var ev=start_date;
+ if (arguments.length!=1){
+ ev=extra_data||{};
+ ev.start_date=start_date;
+ ev.end_date=end_date;
+ ev.text=text;
+ ev.id=id;
+ ev.layer = this.defaultLayer;
+ }
+ ev.id = ev.id||scheduler.uid();
+ ev.text = ev.text||"";
+
+
+ if (typeof ev.start_date == "string") ev.start_date=this.templates.api_date(ev.start_date);
+ if (typeof ev.end_date == "string") ev.end_date=this.templates.api_date(ev.end_date);
+ ev._timed=this.isOneDayEvent(ev);
+
+ var is_new=!this._events[ev.id];
+ this._events[ev.id]=ev;
+ this.event_updated(ev);
+ if (!this._loading)
+ this.callEvent(is_new?"onEventAdded":"onEventChanged",[ev.id,ev]);
+ };
+
+ this._evs_layer = {};
+ for (var i = 0; i < this.layers.length; i++) { // array in object for each layer
+ this._evs_layer[this.layers[i].name] = [];
+ }
+
+ scheduler.addEventNow=function(start,end,e){
+ var base = {};
+ if (typeof start == "object"){
+ base = start;
+ start = null;
+ }
+
+ var d = (this.config.event_duration||this.config.time_step)*60000;
+ if (!start) start = Math.round((scheduler._currentDate()).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;
+ }
+
+
+ base.start_date = base.start_date||start_date;
+ base.end_date = base.end_date||new Date(end);
+ base.text = base.text||this.locale.labels.new_event;
+ base.id = this._drag_id = this.uid();
+ base.layer = this.defaultLayer;
+ 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._t_render_view_data = function(events) { // helper
+ if (this.config.multi_day && !this._table_view) {
+ var tvs = [];
+ var tvd = [];
+ for (var k = 0; k < events.length; k++) {
+ if (events[k]._timed)
+ tvs.push(events[k]);
+ else
+ tvd.push(events[k]);
+ }
+ this._table_view = true;
+ this.render_data(tvd);
+ this._table_view = false;
+ this.render_data(tvs);
+ }
+ else
+ this.render_data(events);
+ };
+
+ scheduler.render_view_data = function(){
+ if (this._not_render) {
+ this._render_wait = true;
+ return;
+ }
+ this._render_wait = false;
+
+ this.clear_view();
+
+ this._evs_layer = {};
+ for (var i = 0; i < this.layers.length; i++) { // array in object for each layer
+ this._evs_layer[this.layers[i].name] = [];
+ }
+
+ var evs = this.get_visible_events();
+ for (var i = 0; i < evs.length; i++) { // filling layer arrays with events
+ if(this._evs_layer[evs[i].layer])
+ this._evs_layer[evs[i].layer].push(evs[i]);
+ }
+
+ if(this._mode == 'month') { // old logic is used
+ var tevs = [];
+ for (var i = 0; i < this.layers.length; i++) {
+ if (this.layers[i].visible)
+ tevs = tevs.concat(this._evs_layer[this.layers[i].name]);
+ }
+ this._t_render_view_data(tevs);
+ }
+ else { // week, day; should use new logic
+ for (var i = 0; i < this.layers.length; i++) {
+ if (this.layers[i].visible) {
+ var evs_layer = this._evs_layer[this.layers[i].name];
+ this._t_render_view_data(evs_layer);
+ }
+ }
+ }
+ };
+
+ scheduler._render_v_bar=function(ev,x,y,w,h,style,contentA,contentB,bottom){
+ var id = ev.id;
+ if(contentA.indexOf('<div class=') == -1)
+ contentA = (scheduler.templates['event_header_'+ev.layer])?scheduler.templates['event_header_'+ev.layer](ev.start_date,ev.end_date,ev):contentA;
+ if(contentB.indexOf('<div class=') == -1)
+ contentB = (scheduler.templates['event_text_'+ev.layer])?scheduler.templates['event_text_'+ev.layer](ev.start_date,ev.end_date,ev):contentB;
+
+ var d=document.createElement("DIV");
+
+
+ var cs = "dhx_cal_event";
+ var cse = (scheduler.templates['event_class_'+ev.layer])?scheduler.templates['event_class_'+ev.layer](ev.start_date,ev.end_date,ev):scheduler.templates.event_class(ev.start_date,ev.end_date,ev);
+ if (cse) cs=cs+" "+cse;
+
+ var html='<div event_id="'+id+'" class="'+cs+'" style="position:absolute; top:'+y+'px; left:'+x+'px; width:'+(w-4)+'px; height:'+h+'px;'+(style||"")+'">';
+ html+='<div class="dhx_header" style=" width:'+(w-6)+'px;" >&nbsp;</div>';
+ html+='<div class="dhx_title">'+contentA+'</div>';
+ html+='<div class="dhx_body" style=" width:'+(w-(this._quirks?4:14))+'px; height:'+(h-(this._quirks?20:30))+'px;">'+contentB+'</div>';
+ html+='<div class="dhx_footer" style=" width:'+(w-8)+'px;'+(bottom?' margin-top:-1px;':'')+'" ></div></div>';
+
+ d.innerHTML=html;
+ d.style.zIndex = 100;
+ return d.firstChild;
+ };
+
+ scheduler.render_event_bar=function(ev){
+ var parent=this._els["dhx_cal_data"][0];
+
+ var x=this._colsS[ev._sday];
+ var x2=this._colsS[ev._eday];
+ if (x2==x) x2=this._colsS[ev._eday+1];
+ var hb = this.xy.bar_height;
+
+ var y=this._colsS.heights[ev._sweek]+(this._colsS.height?(this.xy.month_scale_height+2):2)+ev._sorder*hb;
+
+ var d=document.createElement("DIV");
+ var cs = ev._timed?"dhx_cal_event_clear":"dhx_cal_event_line";
+ var cse = (scheduler.templates['event_class_'+ev.layer])?scheduler.templates['event_class_'+ev.layer](ev.start_date,ev.end_date,ev):scheduler.templates.event_class(ev.start_date,ev.end_date,ev);
+ if (cse) cs=cs+" "+cse;
+
+ var html='<div event_id="'+ev.id+'" class="'+cs+'" style="position:absolute; top:'+y+'px; left:'+x+'px; width:'+(x2-x-15)+'px;'+(ev._text_style||"")+'">';
+
+ if (ev._timed)
+ html+=(scheduler.templates['event_bar_date_'+ev.layer])?scheduler.templates['event_bar_date_'+ev.layer](ev.start_date,ev.end_date,ev):scheduler.templates.event_bar_date(ev.start_date,ev.end_date,ev);
+ html+=( (scheduler.templates['event_bar_text_'+ev.layer])?scheduler.templates['event_bar_text_'+ev.layer](ev.start_date,ev.end_date,ev):scheduler.templates.event_bar_text(ev.start_date,ev.end_date,ev) + '</div>)');
+ html+='</div>';
+
+ d.innerHTML=html;
+
+ this._rendered.push(d.firstChild);
+ parent.appendChild(d.firstChild);
+ };
+
+ scheduler.render_event=function(ev){
+ var menu = scheduler.xy.menu_width;
+ if(scheduler.getLayer(ev.layer).noMenu)
+ menu = 0;
+
+ if (ev._sday<0) return; //can occur in case of recurring event during time shift
+ var parent=scheduler.locate_holder(ev._sday);
+ if (!parent) return; //attempt to render non-visible event
+ var sm = ev.start_date.getHours()*60+ev.start_date.getMinutes();
+ var em = (ev.end_date.getHours()*60+ev.end_date.getMinutes())||(scheduler.config.last_hour*60);
+
+ var 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; //42px/hour
+ var height = Math.max(scheduler.xy.min_event_height,(em-sm)*this.config.hour_size_px/60)+1; //42px/hour
+ //var height = Math.max(25,Math.round((ev.end_date.valueOf()-ev.start_date.valueOf())*(this.config.hour_size_px+(this._quirks?1:0))/(60*60*1000))); //42px/hour
+ var width=Math.floor((parent.clientWidth-menu)/ev._count);
+ var left=ev._sorder*width+1;
+ if (!ev._inner) width=width*(ev._count-ev._sorder);
+
+
+
+ var d=this._render_v_bar(ev.id,menu+left,top,width,height,ev._text_style,scheduler.templates.event_header(ev.start_date,ev.end_date,ev),scheduler.templates.event_text(ev.start_date,ev.end_date,ev));
+
+ this._rendered.push(d);
+ parent.appendChild(d);
+
+ left=left+parseInt(parent.style.left,10)+menu;
+
+ top+=this._dy_shift; //corrupt top, to include possible multi-day shift
+ d.style.zIndex = this._layers_zindex[ev.layer];
+
+ if (this._edit_id==ev.id){
+ d.style.zIndex = parseInt(d.style.zIndex)+1; //fix overlapping issue
+ var new_zIndex = d.style.zIndex;
+ width=Math.max(width-4,scheduler.xy.editor_width);
+ var d=document.createElement("DIV");
+ d.setAttribute("event_id",ev.id);
+ this.set_xy(d,width,height-20,left,top+14);
+ d.className="dhx_cal_editor";
+ d.style.zIndex = new_zIndex;
+ var d2=document.createElement("DIV");
+ this.set_xy(d2,width-6,height-26);
+ d2.style.cssText+=";margin:2px 2px 2px 2px;overflow:hidden;";
+
+
+ d2.style.zIndex = new_zIndex;
+ d.appendChild(d2);
+ this._els["dhx_cal_data"][0].appendChild(d);
+ this._rendered.push(d);
+
+ d2.innerHTML="<textarea class='dhx_cal_editor'>"+ev.text+"</textarea>";
+ if (this._quirks7) d2.firstChild.style.height=height-12+"px"; //IEFIX
+ this._editor=d2.firstChild;
+ this._editor.onkeypress=function(e){
+ if ((e||event).shiftKey) return true;
+ var code=(e||event).keyCode;
+ if (code==scheduler.keys.edit_save) scheduler.editStop(true);
+ if (code==scheduler.keys.edit_cancel) scheduler.editStop(false);
+ };
+ this._editor.onselectstart=function(e){ (e||event).cancelBubble=true; return true; };
+ d2.firstChild.focus();
+ //IE and opera can add x-scroll during focusing
+ this._els["dhx_cal_data"][0].scrollLeft=0;
+ d2.firstChild.select();
+ }
+ if (this._select_id==ev.id){
+ d.style.zIndex = parseInt(d.style.zIndex)+1; //fix overlapping issue
+ var icons=this.config["icons_"+((this._edit_id==ev.id)?"edit":"select")];
+ var icons_str="";
+ for (var i=0; i<icons.length; i++)
+ icons_str+="<div class='dhx_menu_icon "+icons[i]+"' title='"+this.locale.labels[icons[i]]+"'></div>";
+ var obj = this._render_v_bar(ev.id,left-menu+1,top,menu,icons.length*20+26,"","<div class='dhx_menu_head'></div>",icons_str,true);
+ obj.style.left=left-menu+1;
+ obj.style.zIndex = d.style.zIndex;
+ this._els["dhx_cal_data"][0].appendChild(obj);
+ this._rendered.push(obj);
+ }
+
+ };
+
+ scheduler.filter_agenda = function(id, event) {
+ var layer = scheduler.getLayer(event.layer);
+ return (layer && layer.visible);
+ };
+});
diff --git a/codebase/sources/ext/dhtmlxscheduler_layer.js.map b/codebase/sources/ext/dhtmlxscheduler_layer.js.map
new file mode 100644
index 0000000..0483f36
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_layer.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_layer.js.map","sources":["dhtmlxscheduler_layer.js"],"names":["scheduler","attachEvent","this","layers","sort","a","b","zIndex","_dp_init","dp","_methods","id","_loading","validId","getEvent","layer","setUpdated","z","getState","_new_event","_getRowData","ev","obj","data","indexOf","getUTCFullYear","templates","xml_format","_clearUpdateFlag","_update_callback","upd","setUserData","action_param","deleteEvent","_cloneObj","temp","constructor","key","_dataprocessors","_layers_zindex","i","length","config","name","sections","lightbox","inital_layer_zindex","url","dataProcessor","push","init","isDefault","defaultLayer","showLayer","tlayer","toggleLayer","hideLayer","visible","getLayer","setCurrentView","_date","_mode","layer_name","event_id","resetLightbox","noMenu","evs","checkCollision","count","collision_limit","addEvent","start_date","end_date","text","extra_data","arguments","uid","api_date","_timed","isOneDayEvent","is_new","_events","event_updated","callEvent","_evs_layer","addEventNow","start","end","e","base","d","event_duration","time_step","Math","round","_currentDate","valueOf","Date","start_hour","first_hour","getHours","setHours","locale","labels","new_event","_drag_id","_drag_mode","_drag_event","_on_mouse_up","_t_render_view_data","events","multi_day","_table_view","tvs","tvd","k","render_data","render_view_data","_not_render","_render_wait","clear_view","get_visible_events","tevs","concat","evs_layer","_render_v_bar","x","y","w","h","style","contentA","contentB","bottom","document","createElement","cs","cse","event_class","html","_quirks","innerHTML","firstChild","render_event_bar","parent","_els","_colsS","_sday","x2","_eday","hb","xy","bar_height","heights","_sweek","height","month_scale_height","_sorder","_text_style","event_bar_date","event_bar_text","_rendered","appendChild","render_event","menu","menu_width","locate_holder","sm","getMinutes","em","last_hour","top","hour_size_px","max","min_event_height","width","floor","clientWidth","_count","left","_inner","event_header","event_text","parseInt","_dy_shift","_edit_id","new_zIndex","editor_width","setAttribute","set_xy","className","d2","cssText","_quirks7","_editor","onkeypress","event","shiftKey","code","keyCode","keys","edit_save","editStop","edit_cancel","onselectstart","cancelBubble","focus","scrollLeft","select","_select_id","icons","icons_str","filter_agenda"],"mappings":"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"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_limit.js b/codebase/sources/ext/dhtmlxscheduler_limit.js
new file mode 100644
index 0000000..e56abc5
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_limit.js
@@ -0,0 +1,965 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+scheduler.config.limit_start = null;
+scheduler.config.limit_end = null;
+scheduler.config.limit_view = false;
+scheduler.config.check_limits = true;
+scheduler.config.mark_now = true;
+scheduler.config.display_marked_timespans = true;
+
+scheduler._temp_limit_scope = function(){
+ var before = null;
+ var dhx_time_block = "dhx_time_block";
+ var default_timespan_type = "default";
+ var fix_options = function(options, days, zones) {
+ if (days instanceof Date && zones instanceof Date) {
+ options.start_date = days;
+ options.end_date = zones;
+ } else {
+ options.days = days;
+ options.zones = zones;
+ }
+ return options;
+ };
+ var get_resulting_options = function(days, zones, sections) {
+ var options = (typeof days == "object") ? days : { days: days };
+ options.type = dhx_time_block;
+ options.css = "";
+ if (zones) {
+ if (sections)
+ options.sections = sections;
+ options = fix_options(options, days, zones);
+ }
+ return options;
+ };
+ scheduler.blockTime = function(days, zones, sections){
+ var options = get_resulting_options(days, zones, sections);
+ return scheduler.addMarkedTimespan(options);
+ };
+ scheduler.unblockTime = function(days, zones, sections) {
+ zones = zones || "fullday";
+ var options = get_resulting_options(days, zones, sections);
+ return scheduler.deleteMarkedTimespan(options);
+ };
+ scheduler.attachEvent("onBeforeViewChange",function(om,od,nm,nd){
+ if (scheduler.config.limit_view){
+ nd = nd||od; nm = nm||om;
+ if (nd.valueOf()>scheduler.config.limit_end.valueOf() || this.date.add(nd,1,nm)<=scheduler.config.limit_start.valueOf()){
+ setTimeout(function(){
+ scheduler.setCurrentView((od || scheduler.config.limit_start), nm);
+ },1);
+ return false;
+ }
+ }
+ return true;
+ });
+ scheduler.checkInMarkedTimespan = function(ev, timespan_type, on_overlap){
+ timespan_type = timespan_type || default_timespan_type;
+
+ var res = true;
+ var temp_start_date = new Date(ev.start_date.valueOf());
+ var temp_end_date = scheduler.date.add(temp_start_date, 1, "day");
+ var timespans = scheduler._marked_timespans;
+ for (; temp_start_date < ev.end_date; temp_start_date = scheduler.date.date_part(temp_end_date), temp_end_date = scheduler.date.add(temp_start_date, 1, "day") ) {
+ var day_value = +scheduler.date.date_part( new Date(temp_start_date) ); // the first part of event not necessarily contains only date part
+ var day_index = temp_start_date.getDay();
+
+ var zones = getZones(ev, timespans, day_index, day_value, timespan_type);
+ if (zones){
+ for (var i = 0; i < zones.length; i+=2) {
+
+ // they may change for new event if it passes limit zone
+ var sm = scheduler._get_zone_minutes(temp_start_date);
+ var em = ( ev.end_date>temp_end_date || ev.end_date.getDate() != temp_start_date.getDate() ) ? 1440 : scheduler._get_zone_minutes(ev.end_date);
+
+ var sz = zones[i];
+ var ez = zones[i+1];
+ if (sz<em && ez>sm) {
+ if(typeof on_overlap == "function"){
+ //handler allows to cancel overlapping
+ //actually needed only to keep default behavior of limits
+ res = on_overlap(ev, sm, em, sz, ez);//event object, event start/end minutes in 'zones' format, zone start/end minutes
+ }else{
+ res = false;
+ }
+ if(!res)
+ break;
+ }
+ }
+ }
+ }
+ return !res;
+ };
+ var blocker = scheduler.checkLimitViolation = function(event){
+ if(!event)
+ return true;
+ if (!scheduler.config.check_limits)
+ return true;
+ var s = scheduler;
+ var c = s.config;
+ var evs = [];
+ if (event.rec_type) {
+ var dates = scheduler.getRecDates(event);
+ for(var i=0; i < dates.length; i++){
+ var ev = scheduler._copy_event(event);
+ scheduler._lame_copy(ev, dates[i]);
+ evs.push(ev);
+ }
+
+ } else {
+ evs = [event];
+ }
+
+ var complete_res = true;
+ for (var p=0; p<evs.length; p++) {
+ var res = true;
+ var ev = evs[p];
+ // Event could have old _timed property (e.g. we are creating event with DND on timeline view and crossed day)
+ ev._timed = scheduler.isOneDayEvent(ev);
+
+ res = (c.limit_start && c.limit_end) ? (ev.start_date.valueOf() >= c.limit_start.valueOf() && ev.end_date.valueOf() <= c.limit_end.valueOf()) : true;
+ if (res){
+ res = !scheduler.checkInMarkedTimespan(ev, dhx_time_block, function(ev, sm, em, sz, ez){
+ //try crop event to allow placing
+ var allow = true;
+ if (sm<=ez && sm >=sz){
+ if (ez == 24*60 || em<ez){
+ allow = false;
+ }
+ if(ev._timed && s._drag_id && s._drag_mode == "new-size"){
+ ev.start_date.setHours(0);
+ ev.start_date.setMinutes(ez);
+ }
+ else {
+ allow = false;
+ }
+ }
+ if ((em>=sz && em<ez) || (sm < sz && em > ez)){
+ if(ev._timed && s._drag_id && s._drag_mode == "new-size"){
+ ev.end_date.setHours(0);
+ ev.end_date.setMinutes(sz);
+ }
+ else {
+ allow = false;
+ }
+ }
+ return allow;
+ });
+ }
+ if (!res) {
+ res = (s.checkEvent("onLimitViolation")) ? s.callEvent("onLimitViolation",[ev.id, ev]) : res;
+ }
+ complete_res = complete_res && res;
+ }
+ if(!complete_res){
+ s._drag_id = null;
+ s._drag_mode = null;
+ }
+ return complete_res;
+
+
+ };
+ scheduler._get_blocked_zones = function(timespans, property, day_index, day_value, timespan_type){
+ var zones =[];
+ if (timespans && timespans[property]) {
+ var timeline_zones = timespans[property];
+ var blocked_timeline_zones = this._get_relevant_blocked_zones(day_index, day_value, timeline_zones, timespan_type);
+ for (var i=0; i<blocked_timeline_zones.length; i++) {
+ zones = this._add_timespan_zones(zones, blocked_timeline_zones[i].zones);
+ }
+ }
+ return zones;
+ };
+ scheduler._get_relevant_blocked_zones = function(day_index, day_value, zones, timespan_type) {
+ var relevant_zones = (zones[day_value] && zones[day_value][timespan_type]) ? zones[day_value][timespan_type] :
+ (zones[day_index] && zones[day_index][timespan_type]) ? zones[day_index][timespan_type] : [];
+ return relevant_zones;
+ };
+ function getZones(ev, timespans, day_index, day_value, timespan_type){
+ var s = scheduler;
+ //containers for 'unit' and 'timeline' views, and related 'section_id' properties
+ var zones = [];
+ var containers = {
+ '_props':'map_to',
+ 'matrix':'y_property'};
+ //check blocked sections in all units and timelines
+ for(var container in containers){
+ var property = containers[container];
+ if(s[container]){
+ for(var view in s[container]){
+ var view_config = s[container][view];
+ var linker = view_config[property];
+ if(!ev[linker]) continue;
+ zones = s._add_timespan_zones(zones,
+ scheduler._get_blocked_zones(timespans[view], ev[linker], day_index, day_value, timespan_type));
+ }
+ }
+ }
+ // now need to add day blocks
+ zones = s._add_timespan_zones(zones, scheduler._get_blocked_zones(timespans, 'global', day_index, day_value, timespan_type));
+ return zones;
+ }
+
+ scheduler.attachEvent("onMouseDown", function(classname) {
+ return !(classname == dhx_time_block);
+ });
+ scheduler.attachEvent("onBeforeDrag",function(id){
+ if (!id) return true;
+ return blocker(scheduler.getEvent(id));
+ });
+ scheduler.attachEvent("onClick", function (event_id, native_event_object){
+ return blocker(scheduler.getEvent(event_id));
+ });
+ scheduler.attachEvent("onBeforeLightbox",function(id){
+
+ var ev = scheduler.getEvent(id);
+ before = [ev.start_date, ev.end_date];
+ return blocker(ev);
+ });
+ scheduler.attachEvent("onEventSave", function(id, data, is_new_event) {
+
+ //lightbox may not have 'time' section
+ if(!(data.start_date && data.end_date)){
+ var ev = scheduler.getEvent(id);
+ data.start_date = new Date(ev.start_date);
+ data.end_date = new Date(ev.end_date);
+ }
+
+ if(data.rec_type){
+ //_roll_back_dates modifies start_date of recurring event, need to check limits after modification
+ // use a copy to keep original event unchanged
+ var data_copy = scheduler._lame_clone(data);
+ scheduler._roll_back_dates(data_copy);
+ return blocker(data_copy);
+ }
+ return blocker(data);
+ });
+ scheduler.attachEvent("onEventAdded",function(id){
+ if (!id) return true;
+ var ev = scheduler.getEvent(id);
+ if (!blocker(ev) && scheduler.config.limit_start && scheduler.config.limit_end) {
+ //if newly created event is outside of limited time - crop it, leaving only allowed time
+ if (ev.start_date < scheduler.config.limit_start) {
+ ev.start_date = new Date(scheduler.config.limit_start);
+ }
+ if (ev.start_date.valueOf() >= scheduler.config.limit_end.valueOf()) {
+ ev.start_date = this.date.add(scheduler.config.limit_end, -1, "day");
+ }
+ if (ev.end_date < scheduler.config.limit_start) {
+ ev.end_date = new Date(scheduler.config.limit_start);
+ }
+ if (ev.end_date.valueOf() >= scheduler.config.limit_end.valueOf()) {
+ ev.end_date = this.date.add(scheduler.config.limit_end, -1, "day");
+ }
+ if (ev.start_date.valueOf() >= ev.end_date.valueOf()) {
+ ev.end_date = this.date.add(ev.start_date, (this.config.event_duration||this.config.time_step), "minute");
+ }
+ ev._timed=this.isOneDayEvent(ev);
+ }
+ return true;
+ });
+ scheduler.attachEvent("onEventChanged",function(id){
+ if (!id) return true;
+ var ev = scheduler.getEvent(id);
+ if (!blocker(ev)){
+ if (!before) return false;
+ ev.start_date = before[0];
+ ev.end_date = before[1];
+ ev._timed=this.isOneDayEvent(ev);
+ }
+ return true;
+ });
+ scheduler.attachEvent("onBeforeEventChanged",function(ev, native_object, is_new){
+ return blocker(ev);
+ });
+ scheduler.attachEvent("onBeforeEventCreated", function(ev) { // native event
+ var start_date = scheduler.getActionData(ev).date;
+ var event = {
+ _timed: true,
+ start_date: start_date,
+ end_date: scheduler.date.add(start_date, scheduler.config.time_step, "minute")
+ };
+ return blocker(event);
+ });
+
+ scheduler.attachEvent("onViewChange", function(){
+ scheduler._mark_now();
+ });
+ scheduler.attachEvent("onSchedulerResize", function(){
+ window.setTimeout(function(){ scheduler._mark_now(); }, 1);
+ return true;
+ });
+ scheduler.attachEvent("onTemplatesReady", function() {
+ scheduler._mark_now_timer = window.setInterval(function() {
+ if(!scheduler._is_initialized())
+ return;
+ scheduler._mark_now();
+ }, 60000);
+ });
+ scheduler._mark_now = function(hide) {
+ // day, week, units views
+ var dhx_now_time = 'dhx_now_time';
+ if (!this._els[dhx_now_time]) {
+ this._els[dhx_now_time] = [];
+ }
+ var now = scheduler._currentDate();
+ var cfg = this.config;
+ scheduler._remove_mark_now(); // delete previous marks if they exist
+ if (!hide && cfg.mark_now && now < this._max_date && now > this._min_date && now.getHours() >= cfg.first_hour && now.getHours()<cfg.last_hour) {
+ var day_index = this.locate_holder_day(now);
+ this._els[dhx_now_time] = scheduler._append_mark_now(day_index, now);
+ }
+ };
+ scheduler._append_mark_now = function(day_index, now) {
+ var dhx_now_time = 'dhx_now_time';
+ var zone_start= scheduler._get_zone_minutes(now);
+ var options = {
+ zones: [zone_start, zone_start+1],
+ css: dhx_now_time,
+ type: dhx_now_time
+ };
+ if (!this._table_view) {
+ if (this._props && this._props[this._mode]) { // units view
+ var day_divs = this._els["dhx_cal_data"][0].childNodes;
+ var r_divs = [];
+
+ for (var i=0; i<day_divs.length-1; i++) {
+ var t_day = day_index+i; // as each unit is actually considered +1 day
+ options.days = t_day;
+ var t_div = scheduler._render_marked_timespan(options, null, t_day)[0];
+ r_divs.push(t_div);
+ }
+ return r_divs;
+ } else { // day/week views
+ options.days = day_index;
+ return scheduler._render_marked_timespan(options, null, day_index);
+ }
+ } else {
+ if (this._mode == "month") {
+ options.days = +scheduler.date.date_part(now);
+ return scheduler._render_marked_timespan(options, null, null);
+ }
+ }
+ };
+ scheduler._remove_mark_now = function() {
+ var dhx_now_time = 'dhx_now_time';
+ var els = this._els[dhx_now_time];
+ for (var i=0; i<els.length; i++) {
+ var div = els[i];
+ var parent = div.parentNode;
+ if (parent) {
+ parent.removeChild(div);
+ }
+ }
+ this._els[dhx_now_time] = [];
+ };
+
+ /*
+ scheduler._marked_timespans = {
+ "global": {
+ "0": {
+ "default": [
+ { // sunday
+ zones: [0, 100, 500, 600],
+ css: "yellow_box",
+ type: "default",
+ view: "global",
+ day: 0
+ }
+ ]
+ }
+ "112121312": {
+ "my_special_type": [
+ {
+ zones: [600, 900],
+ type: "block",
+ css: "some_class",
+ view: "global",
+ day: 112121312
+ },
+ {}
+ ]
+ }
+ },
+ "units": {
+ "5_id": {
+ "3": {
+ "special_type": [ {}, {}, {} ],
+ "another_type": [ {} ]
+ }
+ },
+ "6_id": {
+ "11212127": {
+ ...
+ }
+ }
+ }
+ }
+ */
+ scheduler._marked_timespans = { global: {} };
+
+ scheduler._get_zone_minutes = function(date) {
+ return date.getHours()*60 + date.getMinutes();
+ };
+ scheduler._prepare_timespan_options = function(config) { // receives 1 option, returns array of options
+ var r_configs = []; // resulting configs
+ var temp_configs = [];
+
+ if (config.days == "fullweek")
+ config.days = [0,1,2,3,4,5,6];
+
+ if (config.days instanceof Array) {
+ var t_days = config.days.slice();
+ for (var i=0; i<t_days.length; i++) {
+ var cloned_config = scheduler._lame_clone(config);
+ cloned_config.days = t_days[i];
+ r_configs.push.apply(r_configs, scheduler._prepare_timespan_options(cloned_config));
+ }
+ return r_configs;
+ }
+
+ if ( !config || !((config.start_date && config.end_date && config.end_date > config.start_date) || (config.days !== undefined && config.zones)) )
+ return r_configs; // incorrect config was provided
+
+ var min = 0;
+ var max = 24*60;
+ if (config.zones == "fullday")
+ config.zones = [min, max];
+ if (config.zones && config.invert_zones) {
+ config.zones = scheduler.invertZones(config.zones);
+ }
+
+ config.id = scheduler.uid();
+ config.css = config.css||"";
+ config.type = config.type||default_timespan_type;
+
+ var sections = config.sections;
+ if (sections) {
+ for (var view_key in sections) {
+ if (sections.hasOwnProperty(view_key)) {
+ var ids = sections[view_key];
+ if (!(ids instanceof Array))
+ ids = [ids];
+ for (var i=0; i<ids.length; i++) {
+ var t_config = scheduler._lame_copy({}, config);
+ t_config.sections = {};
+ t_config.sections[view_key] = ids[i];
+ temp_configs.push(t_config);
+ }
+ }
+ }
+ } else {
+ temp_configs.push(config);
+ }
+
+ for (var k=0; k<temp_configs.length; k++) {
+ var c_config = temp_configs[k]; // config to be checked
+
+ var start_date = c_config.start_date;
+ var end_date = c_config.end_date;
+
+ if (start_date && end_date) {
+ var t_sd = scheduler.date.date_part(new Date(start_date)); // e.g. 05 october
+ var t_ed= scheduler.date.add(t_sd, 1, "day"); // 06 october, will both be incremented in the loop
+
+ while (t_sd < end_date) {
+ var t_config = scheduler._lame_copy({}, c_config);
+ delete t_config.start_date;
+ delete t_config.end_date;
+ t_config.days = t_sd.valueOf();
+ var zone_start = (start_date > t_sd) ? scheduler._get_zone_minutes(start_date) : min;
+ var zone_end = ( end_date>t_ed || end_date.getDate() != t_sd.getDate() ) ? max : scheduler._get_zone_minutes(end_date);
+ t_config.zones = [zone_start, zone_end];
+ r_configs.push(t_config);
+
+ t_sd = t_ed;
+ t_ed = scheduler.date.add(t_ed, 1, "day");
+ }
+ } else {
+ if (c_config.days instanceof Date)
+ c_config.days = (scheduler.date.date_part(c_config.days)).valueOf();
+ c_config.zones = config.zones.slice();
+ r_configs.push(c_config);
+ }
+ }
+ return r_configs;
+ };
+ scheduler._get_dates_by_index = function(index, start, end) {
+ var dates = [];
+ start = scheduler.date.date_part(new Date(start||scheduler._min_date));
+ end = new Date(end||scheduler._max_date);
+ var start_day = start.getDay();
+ var delta = (index-start_day >= 0) ? (index-start_day) : (7-start.getDay()+index);
+ var t_date = scheduler.date.add(start, delta, "day");
+ for (; t_date < end; t_date = scheduler.date.add(t_date, 1, "week")) {
+ dates.push(t_date);
+ }
+ return dates;
+ };
+ scheduler._get_css_classes_by_config = function(config) {
+ var css_classes = [];
+ if (config.type == dhx_time_block) {
+ css_classes.push(dhx_time_block);
+ if (config.css)
+ css_classes.push(dhx_time_block+"_reset");
+ }
+ css_classes.push("dhx_marked_timespan", config.css);
+ return css_classes.join(" ");
+ };
+ scheduler._get_block_by_config = function(config) {
+ var block = document.createElement("DIV");
+ if (config.html) {
+ if (typeof config.html == "string")
+ block.innerHTML = config.html;
+ else
+ block.appendChild(config.html);
+ }
+ return block;
+ };
+ scheduler._render_marked_timespan = function(options, area, day) {
+ var blocks = []; // resulting block which will be rendered and returned
+ var c = scheduler.config;
+ var min_date = this._min_date;
+ var max_date = this._max_date;
+ var day_value = false; // if timespan for specific date should be displayed
+
+ if (!c.display_marked_timespans)
+ return blocks;
+
+ // in case of markTimespan
+ if (!day && day !== 0) {
+ if (options.days < 7)
+ day = options.days;
+ else {
+ var date_to_display = new Date(options.days);
+ day_value = +date_to_display;
+
+ // in case of markTimespan date could be not in the viewing range, need to return
+ if ( !(+max_date > +date_to_display && +min_date <= +date_to_display) )
+ return blocks;
+
+ day = date_to_display.getDay();
+ }
+
+ // convert day default index (Sun - 0, Sat - 6) to index of hourscales (depends on week_start and config.start_on_monday)
+ var min_day = min_date.getDay();
+ if (min_day > day) {
+ day = 7 - (min_day-day);
+ } else {
+ day = day - min_day;
+ }
+ }
+ var zones = options.zones;
+ var css_classes = scheduler._get_css_classes_by_config(options);
+
+ if (scheduler._table_view && scheduler._mode == "month") {
+ var areas = [];
+ var days = [];
+
+
+ if (!area) {
+ days = (day_value) ? [day_value] : scheduler._get_dates_by_index(day);
+ for (var i=0; i < days.length; i++) {
+ areas.push( this._scales[days[i]] );
+ }
+ } else {
+ areas.push(area);
+ days.push(day);
+ }
+
+ for (var i=0; i < areas.length; i++) {
+ area = areas[i];
+ day = days[i];
+
+ var sweek = Math.floor((this._correct_shift(day,1)-min_date.valueOf())/(60*60*1000*24*this._cols.length)),
+ sday = this.locate_holder_day(day, false) % this._cols.length;
+
+ if(this._ignores[sday]) continue;
+
+ var block_proto = scheduler._get_block_by_config(options),
+ height = Math.max(area.offsetHeight - 1, 0), // 1 for bottom border
+ width = Math.max(area.offsetWidth - 1, 0), // 1 for left border
+ left = this._colsS[sday],
+ top = this._colsS.heights[sweek]+(this._colsS.height?(this.xy.month_scale_height+2):2)-1;
+
+ block_proto.className = css_classes;
+ block_proto.style.top = top + "px";
+ block_proto.style.lineHeight = block_proto.style.height = height + "px";
+
+ for (var k=0; k < zones.length; k+=2) {
+ var start = zones[i];
+ var end = zones[i+1];
+ if (end <= start)
+ return [];
+
+ var block = block_proto.cloneNode(true);
+
+ block.style.left = (left + Math.round( (start)/(24*60) * width)) + "px";
+ block.style.width = Math.round( (end-start)/(24*60) * width) + "px";
+
+ area.appendChild(block);
+ blocks.push(block);
+ }
+ }
+ } else {
+ var index = day;
+
+ if(this._ignores[this.locate_holder_day(day, false)]) return blocks;
+
+ if (this._props && this._props[this._mode] && options.sections && options.sections[this._mode]) {
+ var view = this._props[this._mode];
+ index = view.order[options.sections[this._mode]];
+ if (view.size && (index > view.position+view.size)) {
+ index = 0;
+ }
+ }
+ area = area ? area : scheduler.locate_holder(index);
+
+ for (var i = 0; i < zones.length; i+=2){
+ var start = Math.max(zones[i], c.first_hour*60);
+ var end = Math.min(zones[i+1], c.last_hour*60);
+ if (end <= start) {
+ if (i+2 < zones.length)
+ continue;
+ else
+ return [];
+ }
+
+ var block = scheduler._get_block_by_config(options);
+ block.className = css_classes;
+
+ // +1 for working with section which really takes up whole height (as % would be == 0)
+ var all_hours_height = this.config.hour_size_px*24 + 1;
+ var hour_ms = 60*60*1000;
+ block.style.top = (Math.round((start*60*1000-this.config.first_hour*hour_ms)*this.config.hour_size_px/hour_ms) % all_hours_height) + "px";
+ block.style.lineHeight = block.style.height = Math.max((Math.round(((end-start)*60*1000)*this.config.hour_size_px/hour_ms)) % all_hours_height, 1)+"px";
+
+ area.appendChild(block);
+ blocks.push(block);
+ }
+ }
+
+ return blocks;
+ };
+ // just marks timespan, will be cleaned after refresh
+ scheduler.markTimespan = function(configuration) {
+ var configs = scheduler._prepare_timespan_options(configuration);
+ if (!configs.length)
+ return;
+ var divs = [];
+ for (var i=0; i<configs.length; i++) {
+ var config = configs[i];
+ var blocks = scheduler._render_marked_timespan(config, null, null);
+ if(blocks.length)
+ divs.push.apply(divs, blocks);
+ }
+ return divs;
+ };
+ scheduler.unmarkTimespan = function(divs) {
+ if (!divs)
+ return;
+ for (var i=0; i<divs.length; i++) {
+ var div = divs[i];
+ // parent may no longer be present if we switched views, navigated
+ if (div.parentNode) {
+ div.parentNode.removeChild(div);
+ }
+ }
+ };
+
+ scheduler._marked_timespans_ids = {};
+ // adds marked timespan to collections, persistent
+ scheduler.addMarkedTimespan = function(configuration) {
+ var configs = scheduler._prepare_timespan_options(configuration);
+ var global = "global";
+
+ if (!configs.length)
+ return; // options are incorrect, nothing to mark
+
+ var id = configs[0].id;
+ var timespans = scheduler._marked_timespans;
+ var ids = scheduler._marked_timespans_ids;
+ if (!ids[id])
+ ids[id] = [];
+
+ for (var i=0; i<configs.length; i++) {
+ var config = configs[i];
+ var day = config.days;
+ var zones = config.zones;
+ var css = config.css;
+ var sections = config.sections;
+ var type = config.type; // default or specified
+ config.id = id;
+
+ if (sections) {
+ for (var view_key in sections) {
+ if (sections.hasOwnProperty(view_key)) {
+ if (!timespans[view_key])
+ timespans[view_key] = {};
+ var unit_id = sections[view_key];
+ var timespans_view = timespans[view_key];
+ if (!timespans_view[unit_id])
+ timespans_view[unit_id] = {};
+ if (!timespans_view[unit_id][day])
+ timespans_view[unit_id][day] = {};
+ if (!timespans_view[unit_id][day][type]){
+ timespans_view[unit_id][day][type] = [];
+ if(!scheduler._marked_timespans_types)
+ scheduler._marked_timespans_types = {};
+ if(!scheduler._marked_timespans_types[type])
+ scheduler._marked_timespans_types[type] = true;
+ }
+ var day_configs = timespans_view[unit_id][day][type];
+ config._array = day_configs;
+ day_configs.push(config);
+ ids[id].push(config);
+ }
+ }
+ } else {
+ if (!timespans[global][day])
+ timespans[global][day] = {};
+ if (!timespans[global][day][type])
+ timespans[global][day][type] = [];
+
+ if(!scheduler._marked_timespans_types)
+ scheduler._marked_timespans_types = {};
+ if(!scheduler._marked_timespans_types[type])
+ scheduler._marked_timespans_types[type] = true;
+
+
+ var day_configs = timespans[global][day][type];
+ config._array = day_configs;
+ day_configs.push(config);
+ ids[id].push(config);
+ }
+ }
+ return id;
+ };
+ // not used for now
+ scheduler._add_timespan_zones = function(current_zones, zones) {
+ var resulting_zones = current_zones.slice();
+ zones = zones.slice();
+
+ if (!resulting_zones.length)
+ return zones;
+
+ for (var i=0; i<resulting_zones.length; i+=2) {
+ var c_zone_start = resulting_zones[i];
+ var c_zone_end = resulting_zones[i+1];
+ var isLast = (i+2 == resulting_zones.length);
+
+ for (var k=0; k<zones.length; k+=2) {
+ var zone_start = zones[k];
+ var zone_end = zones[k+1];
+ if ((zone_end > c_zone_end && zone_start <= c_zone_end) || (zone_start < c_zone_start && zone_end >= c_zone_start)) {
+ resulting_zones[i] = Math.min(c_zone_start, zone_start);
+ resulting_zones[i+1] = Math.max(c_zone_end, zone_end);
+ i -= 2;
+ } else {
+ if (!isLast) // do nothing, maybe next current zone will match or will be last
+ continue;
+
+ var offset = (c_zone_start > zone_start)?0:2;
+ resulting_zones.splice(i+offset, 0, zone_start, zone_end); // last current zone, need to add another
+ }
+ zones.splice(k--,2); // zone was merged or added, need to exclude it
+ break;
+ }
+ }
+ return resulting_zones;
+ };
+ scheduler._subtract_timespan_zones = function(current_zones, zones) {
+ var resulting_zones = current_zones.slice();
+ for (var i=0; i<resulting_zones.length; i+=2 ) {
+ var c_zone_start = resulting_zones[i];// current_zone_start
+ var c_zone_end = resulting_zones[i+1];
+ for (var k=0; k<zones.length; k+=2) {
+ var zone_start = zones[k];
+ var zone_end = zones[k+1];
+ if (zone_end > c_zone_start && zone_start < c_zone_end) {
+ var is_modified = false;
+ if (c_zone_start >= zone_start && c_zone_end <= zone_end) {
+ resulting_zones.splice(i, 2);
+ }
+ if (c_zone_start < zone_start) {
+ resulting_zones.splice(i, 2, c_zone_start, zone_start);
+ is_modified = true;
+ }
+ if (c_zone_end > zone_end) {
+ resulting_zones.splice( (is_modified)?(i+2):i, (is_modified)?0:2, zone_end, c_zone_end);
+ }
+ i -= 2;
+ break;
+ } else {
+ continue;
+ }
+ }
+ }
+ return resulting_zones;
+ };
+ scheduler.invertZones = function(zones) {
+ return scheduler._subtract_timespan_zones([0, 1440], zones.slice());
+ };
+ scheduler._delete_marked_timespan_by_id = function(id) {
+ var configs = scheduler._marked_timespans_ids[id];
+ if (configs) {
+ for (var i=0; i<configs.length; i++) {
+ var config = configs[i];
+ var parent_array = config._array;
+ for (var k=0; k<parent_array.length; k++) {
+ if (parent_array[k] == config) {
+ parent_array.splice(k, 1);
+ break;
+ }
+ }
+ }
+ }
+ };
+ scheduler._delete_marked_timespan_by_config = function(config) {
+ var timespans = scheduler._marked_timespans;
+ var sections = config.sections;
+ var day = config.days;
+ var type = config.type||default_timespan_type;
+ var day_timespans = []; // array of timespans to subtract our config
+ if (sections) {
+ for (var view_key in sections) {
+ if (sections.hasOwnProperty(view_key) && timespans[view_key]) {
+ var unit_id = sections[view_key];
+ if (timespans[view_key][unit_id] && timespans[view_key][unit_id][day] && timespans[view_key][unit_id][day][type])
+ day_timespans = timespans[view_key][unit_id][day][type];
+ }
+ }
+ } else {
+ if (timespans.global[day] && timespans.global[day][type])
+ day_timespans = timespans.global[day][type];
+ }
+ for (var i=0; i<day_timespans.length; i++) {
+ var d_t = day_timespans[i];
+ var zones = scheduler._subtract_timespan_zones(d_t.zones, config.zones);
+ if (zones.length)
+ d_t.zones = zones;
+ else {
+ day_timespans.splice(i,1);
+ i--;
+ // need to update ids collection
+ var related_zones = scheduler._marked_timespans_ids[d_t.id];
+ for (var k=0; k<related_zones.length; k++) {
+ if (related_zones[k] == d_t) {
+ related_zones.splice(k, 1);
+ break;
+ }
+ }
+ }
+ }
+ };
+ scheduler.deleteMarkedTimespan = function(configuration) {
+ // delete everything
+ if (!arguments.length) {
+ scheduler._marked_timespans = { global: {} };
+ scheduler._marked_timespans_ids = {};
+ scheduler._marked_timespans_types = {};
+ }
+
+ if (typeof configuration != "object") { // id was passed
+ scheduler._delete_marked_timespan_by_id(configuration);
+ } else { // normal configuration was passed
+
+ if(!(configuration.start_date && configuration.end_date)){
+ if(!configuration.days)
+ configuration.days = "fullweek";
+ if(!configuration.zones)
+ configuration.zones = "fullday";
+ }
+
+ var types = [];
+ if(!configuration.type){
+ //if type not specified - delete timespans of all types
+ for(var type in scheduler._marked_timespans_types){
+ types.push(type);
+ }
+ }else{
+ types.push(configuration.type);
+ }
+
+
+ var configs = scheduler._prepare_timespan_options(configuration);
+
+ for (var i=0; i<configs.length; i++) {
+
+ var config = configs[i];
+ for( var t=0; t < types.length; t++){
+ var typedConfig = scheduler._lame_clone(config);
+ typedConfig.type = types[t];
+ scheduler._delete_marked_timespan_by_config(typedConfig);
+ }
+ }
+
+ }
+ };
+ scheduler._get_types_to_render = function(common, specific) {
+ var types_to_render = (common) ? scheduler._lame_copy({},common) : {};
+ for (var type in specific||{} ) {
+ if (specific.hasOwnProperty(type)) {
+ types_to_render[type] = specific[type];
+ }
+ }
+ return types_to_render;
+ };
+ scheduler._get_configs_to_render = function(types) {
+ var configs = [];
+ for (var type in types) {
+ if (types.hasOwnProperty(type)) {
+ configs.push.apply(configs, types[type]);
+ }
+ }
+ return configs;
+ };
+ scheduler.attachEvent("onScaleAdd", function(area, day) {
+ if (scheduler._table_view && scheduler._mode != "month")
+ return;
+
+ var day_index = day.getDay();
+ var day_value = day.valueOf();
+ var mode = this._mode;
+ var timespans = scheduler._marked_timespans;
+ var r_configs = [];
+
+ if (this._props && this._props[mode]) { // we are in the units view and need to draw it's sections as well
+ var view = this._props[mode]; // units view object
+ var units = view.options;
+ var index = scheduler._get_unit_index(view, day);
+ var unit = units[index]; // key, label
+ day = scheduler.date.date_part(new Date(this._date)); // for units view actually only 1 day is displayed yet the day variable will change, need to use this._date for all calls
+ day_index = day.getDay();
+ day_value = day.valueOf();
+
+ if (timespans[mode] && timespans[mode][unit.key]) {
+ var unit_zones = timespans[mode][unit.key];
+ var unit_types = scheduler._get_types_to_render(unit_zones[day_index], unit_zones[day_value]);
+ r_configs.push.apply(r_configs, scheduler._get_configs_to_render(unit_types));
+ }
+ }
+
+ var global_data = timespans["global"];
+ var day_types = global_data[day_value]||global_data[day_index];
+ r_configs.push.apply(r_configs, scheduler._get_configs_to_render(day_types));
+
+ for (var i=0; i<r_configs.length; i++) {
+ scheduler._render_marked_timespan(r_configs[i], area, day);
+ }
+ });
+
+ scheduler.dblclick_dhx_marked_timespan = function(e,src){
+ if (!scheduler.config.dblclick_create){
+ scheduler.callEvent("onScaleDblClick",[scheduler.getActionData(e).date,src,e]);
+ }
+ scheduler.addEventNow(scheduler.getActionData(e).date,null,e);
+ };
+
+};
+scheduler._temp_limit_scope();
diff --git a/codebase/sources/ext/dhtmlxscheduler_limit.js.map b/codebase/sources/ext/dhtmlxscheduler_limit.js.map
new file mode 100644
index 0000000..96d0ed7
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_limit.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_limit.js.map","sources":["dhtmlxscheduler_limit.js"],"names":["scheduler","config","limit_start","limit_end","limit_view","check_limits","mark_now","display_marked_timespans","_temp_limit_scope","getZones","ev","timespans","day_index","day_value","timespan_type","s","zones","containers","_props","matrix","container","property","view","view_config","linker","_add_timespan_zones","_get_blocked_zones","before","dhx_time_block","default_timespan_type","fix_options","options","days","Date","start_date","end_date","get_resulting_options","sections","type","css","blockTime","addMarkedTimespan","unblockTime","deleteMarkedTimespan","attachEvent","om","od","nm","nd","valueOf","this","date","add","setTimeout","setCurrentView","checkInMarkedTimespan","on_overlap","res","temp_start_date","temp_end_date","_marked_timespans","date_part","getDay","i","length","sm","_get_zone_minutes","em","getDate","sz","ez","blocker","checkLimitViolation","event","c","evs","rec_type","dates","getRecDates","_copy_event","_lame_copy","push","complete_res","p","_timed","isOneDayEvent","allow","_drag_id","_drag_mode","setHours","setMinutes","checkEvent","callEvent","id","timeline_zones","blocked_timeline_zones","_get_relevant_blocked_zones","relevant_zones","classname","getEvent","event_id","data","data_copy","_lame_clone","_roll_back_dates","event_duration","time_step","getActionData","_mark_now","window","_mark_now_timer","setInterval","_is_initialized","hide","dhx_now_time","_els","now","_currentDate","cfg","_remove_mark_now","_max_date","_min_date","getHours","first_hour","last_hour","locate_holder_day","_append_mark_now","zone_start","_table_view","_mode","day_divs","childNodes","r_divs","t_day","t_div","_render_marked_timespan","els","div","parent","parentNode","removeChild","global","getMinutes","_prepare_timespan_options","r_configs","temp_configs","Array","t_days","slice","cloned_config","apply","undefined","min","max","invert_zones","invertZones","uid","view_key","hasOwnProperty","ids","t_config","k","c_config","t_sd","t_ed","zone_end","_get_dates_by_index","index","start","end","start_day","delta","t_date","_get_css_classes_by_config","css_classes","join","_get_block_by_config","block","document","createElement","html","innerHTML","appendChild","area","day","blocks","min_date","max_date","date_to_display","min_day","areas","_scales","sweek","Math","floor","_correct_shift","_cols","sday","_ignores","block_proto","height","offsetHeight","width","offsetWidth","left","_colsS","top","heights","xy","month_scale_height","className","style","lineHeight","cloneNode","round","order","size","position","locate_holder","all_hours_height","hour_size_px","hour_ms","markTimespan","configuration","configs","divs","unmarkTimespan","_marked_timespans_ids","unit_id","timespans_view","_marked_timespans_types","day_configs","_array","current_zones","resulting_zones","c_zone_start","c_zone_end","isLast","offset","splice","_subtract_timespan_zones","is_modified","_delete_marked_timespan_by_id","parent_array","_delete_marked_timespan_by_config","day_timespans","d_t","related_zones","arguments","types","t","typedConfig","_get_types_to_render","common","specific","types_to_render","_get_configs_to_render","mode","units","_get_unit_index","unit","_date","key","unit_zones","unit_types","global_data","day_types","dblclick_dhx_marked_timespan","e","src","dblclick_create","addEventNow"],"mappings":"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"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_map_view.js b/codebase/sources/ext/dhtmlxscheduler_map_view.js
new file mode 100644
index 0000000..2ea6044
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_map_view.js
@@ -0,0 +1,492 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+scheduler.xy.map_date_width = 188; // date column width
+scheduler.xy.map_description_width = 400; // description column width
+
+scheduler.config.map_resolve_event_location = true; // if events in database doesn't have lat and lng values there will be an attempt to resolve them on event loading, useful for migration
+scheduler.config.map_resolve_user_location = true; // if user will be promted to share his location to display it on the map
+
+scheduler.config.map_initial_position = new google.maps.LatLng(48.724, 8.215); // inital position of the map
+scheduler.config.map_error_position = new google.maps.LatLng(15, 15); // this position will be displayed in case if event doesn't have corresponding coordinates
+
+scheduler.config.map_infowindow_max_width = 300;
+
+scheduler.config.map_type = google.maps.MapTypeId.ROADMAP;
+
+scheduler.config.map_zoom_after_resolve = 15;
+
+scheduler.locale.labels.marker_geo_success = "It seems you are here.";
+scheduler.locale.labels.marker_geo_fail = "Sorry, could not get your current position using geolocation.";
+
+scheduler.templates.marker_date = scheduler.date.date_to_str("%Y-%m-%d %H:%i"); // date for map's infowindow will be formated following way
+
+scheduler.templates.marker_text = function(start, end, ev) {
+ return "<div><b>" + ev.text + "</b><br/><br/>" + (ev.event_location || '') + "<br/><br/>" + scheduler.templates.marker_date(start) + " - " + scheduler.templates.marker_date(end) + "</div>";
+};
+scheduler.dblclick_dhx_map_area = function() {
+ if (!this.config.readonly && this.config.dblclick_create)
+ this.addEventNow({
+ start_date: scheduler._date,
+ end_date: scheduler.date.add(scheduler._date, scheduler.config.time_step, "minute")
+ });
+};
+scheduler.templates.map_time = function(start, end, ev) {
+ if (ev._timed)
+ return this.day_date(ev.start_date, ev.end_date, ev) + " " + this.event_date(start);
+ else
+ return scheduler.templates.day_date(start) + " &ndash; " + scheduler.templates.day_date(end);
+};
+scheduler.templates.map_text = function(start, end, ev) {
+ return ev.text;
+};
+
+scheduler.date.map_start = function(d) {
+ return d;
+};
+scheduler.date.add_map = function(date, inc, mode) {
+ return (new Date(date.valueOf()));
+};
+
+scheduler.templates.map_date = function(dd, ed, mode) {
+ return '';
+};
+
+scheduler._latLngUpdate = false; // flag for not displaying event second time in case of coordinates update
+
+scheduler.attachEvent("onSchedulerReady", function() {
+ scheduler._isMapPositionSet = false; // if user actual (geolocation) position was set on the map
+
+ var gmap = document.createElement('div');
+ gmap.className = 'dhx_map';
+ gmap.id = 'dhx_gmap';
+ gmap.style.dispay = "none";
+
+ var node = scheduler._obj;
+
+ node.appendChild(gmap);
+
+ scheduler._els.dhx_gmap = [];
+ scheduler._els.dhx_gmap.push(gmap);
+
+ _setMapSize('dhx_gmap');
+
+ var mapOptions = {
+ zoom: scheduler.config.map_inital_zoom || 10,
+ center: scheduler.config.map_initial_position,
+ mapTypeId: scheduler.config.map_type || google.maps.MapTypeId.ROADMAP
+ };
+ var map = new google.maps.Map(document.getElementById('dhx_gmap'), mapOptions);
+ map.disableDefaultUI = false;
+ map.disableDoubleClickZoom = !scheduler.config.readonly;
+
+ google.maps.event.addListener(map, "dblclick", function(event) {
+ if (!scheduler.config.readonly && scheduler.config.dblclick_create) {
+ var point = event.latLng;
+ geocoder.geocode(
+ { 'latLng': point },
+ function(results, status) {
+ if (status == google.maps.GeocoderStatus.OK) {
+ point = results[0].geometry.location;
+ scheduler.addEventNow({
+ lat: point.lat(),
+ lng: point.lng(),
+ event_location: results[0].formatted_address,
+ start_date: scheduler._date,
+ end_date: scheduler.date.add(scheduler._date, scheduler.config.time_step, "minute")
+ });
+ }
+ }
+ );
+ }
+ });
+
+ var infoWindowOptions = {
+ content: ''
+ };
+
+ if (scheduler.config.map_infowindow_max_width) {
+ infoWindowOptions.maxWidth = scheduler.config.map_infowindow_max_width;
+ }
+
+ scheduler.map = {
+ _points: [],
+ _markers: [],
+ _infowindow: new google.maps.InfoWindow(infoWindowOptions),
+ _infowindows_content: [],
+ _initialization_count: -1,
+ _obj: map
+ };
+
+ geocoder = new google.maps.Geocoder();
+
+ if (scheduler.config.map_resolve_user_location) {
+ if (navigator.geolocation) {
+ if (!scheduler._isMapPositionSet) {
+ navigator.geolocation.getCurrentPosition(function(position) {
+ var _userLocation = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);
+ map.setCenter(_userLocation);
+ map.setZoom(scheduler.config.map_zoom_after_resolve || 10);
+ scheduler.map._infowindow.setContent(scheduler.locale.labels.marker_geo_success);
+ scheduler.map._infowindow.position = map.getCenter();
+ scheduler.map._infowindow.open(map);
+
+ scheduler._isMapPositionSet = true;
+ },
+ function() {
+ scheduler.map._infowindow.setContent(scheduler.locale.labels.marker_geo_fail);
+ scheduler.map._infowindow.setPosition(map.getCenter());
+ scheduler.map._infowindow.open(map);
+ scheduler._isMapPositionSet = true;
+ });
+ }
+ }
+ }
+ google.maps.event.addListener(map, "resize", function(event) {
+ gmap.style.zIndex = '5';
+ map.setZoom(map.getZoom());
+
+ });
+ google.maps.event.addListener(map, "tilesloaded", function(event) {
+ gmap.style.zIndex = '5';
+ });
+
+ gmap.style.display = 'none'; // property was changed after attaching map
+
+
+ scheduler.attachEvent("onSchedulerResize", function() {
+ if (this._mode == "map") {
+ this.map_view(true);
+ return false;
+ }
+ return true;
+ });
+
+ var old = scheduler.render_data;
+ scheduler.render_data = function(evs, hold) {
+ if (this._mode == "map") {
+ fill_map_tab();
+ var events = scheduler.get_visible_events();
+ for (var i = 0; i < events.length; i++) {
+ if (!scheduler.map._markers[events[i].id]) {
+ showAddress(events[i], false, false);
+ }
+ }
+ } else
+ return old.apply(this, arguments);
+ };
+
+ function set_full_view(mode) {
+ if (mode) {
+ var l = scheduler.locale.labels;
+ scheduler._els["dhx_cal_header"][0].innerHTML = "<div class='dhx_map_line' style='width: " + (scheduler.xy.map_date_width + scheduler.xy.map_description_width + 2) + "px;' ><div class='headline_date' style='width: " + scheduler.xy.map_date_width + "px;'>" + l.date + "</div><div class='headline_description' style='width: " + scheduler.xy.map_description_width + "px;'>" + l.description + "</div></div>";
+ scheduler._table_view = true;
+ scheduler.set_sizes();
+ }
+ }
+
+ function clear_map_tab() {
+ scheduler._selected_event_id = null;
+ scheduler.map._infowindow.close();
+ var markers = scheduler.map._markers;
+ for (var key in markers) {
+ if (markers.hasOwnProperty(key)) {
+ markers[key].setMap(null);
+ delete scheduler.map._markers[key];
+ if (scheduler.map._infowindows_content[key])
+ delete scheduler.map._infowindows_content[key];
+ }
+ }
+ }
+
+ function fill_map_tab() {
+ //select events for which data need to be printed
+ var events = scheduler.get_visible_events();
+ events.sort(function(a, b) {
+ if(a.start_date.valueOf()==b.start_date.valueOf())
+ return a.id>b.id?1:-1;
+ return a.start_date>b.start_date?1:-1;
+ });
+
+ //generate html for the view
+ var html = "<div class='dhx_map_area'>";
+ for (var i = 0; i < events.length; i++) {
+ var ev = events[i];
+ var event_class = (ev.id == scheduler._selected_event_id) ? 'dhx_map_line highlight' : 'dhx_map_line';
+ var bg_color = (ev.color ? ("background:" + ev.color + ";") : "");
+ var color = (ev.textColor ? ("color:" + ev.textColor + ";") : "");
+ html += "<div class='" + event_class + "' event_id='" + ev.id + "' style='" + bg_color + "" + color + "" + (ev._text_style || "") + " width: " + (scheduler.xy.map_date_width + scheduler.xy.map_description_width + 2) + "px;'><div style='width: " + scheduler.xy.map_date_width + "px;' >" + scheduler.templates.map_time(ev.start_date, ev.end_date, ev) + "</div>";
+ html += "<div class='dhx_event_icon icon_details'>&nbsp</div>";
+ html += "<div class='line_description' style='width:" + (scheduler.xy.map_description_width - 25) + "px;'>" + scheduler.templates.map_text(ev.start_date, ev.end_date, ev) + "</div></div>"; // -25 = icon size 20 and padding 5
+ }
+ html += "<div class='dhx_v_border' style='left: " + (scheduler.xy.map_date_width - 2) + "px;'></div><div class='dhx_v_border_description'></div></div>";
+
+ //render html
+ scheduler._els["dhx_cal_data"][0].scrollTop = 0; //fix flickering in FF
+ scheduler._els["dhx_cal_data"][0].innerHTML = html;
+ scheduler._els["dhx_cal_data"][0].style.width = (scheduler.xy.map_date_width + scheduler.xy.map_description_width + 1) + 'px';
+
+ var t = scheduler._els["dhx_cal_data"][0].firstChild.childNodes;
+ scheduler._els["dhx_cal_date"][0].innerHTML = scheduler.templates[scheduler._mode + "_date"](scheduler._min_date, scheduler._max_date, scheduler._mode);
+
+ scheduler._rendered = [];
+ for (var i = 0; i < t.length - 2; i++) {
+ scheduler._rendered[i] = t[i];
+ }
+ }
+
+ function _setMapSize(elem_id) { //input - map's div id
+ var map = document.getElementById(elem_id);
+ var height = scheduler._y - scheduler.xy.nav_height;
+ if (height < 0)
+ height = 0;
+ var width = scheduler._x - scheduler.xy.map_date_width - scheduler.xy.map_description_width - 1;
+ if (width < 0)
+ width = 0;
+ map.style.height = height + 'px';
+ map.style.width = width + 'px';
+ map.style.marginLeft = (scheduler.xy.map_date_width + scheduler.xy.map_description_width + 1) + 'px';
+ map.style.marginTop = (scheduler.xy.nav_height + 2) + 'px';
+ }
+
+ scheduler.map_view = function(mode) {
+ scheduler.map._initialization_count++;
+ var gmap = scheduler._els.dhx_gmap[0];
+ var temp_center;
+ scheduler._els.dhx_cal_data[0].style.width = (scheduler.xy.map_date_width + scheduler.xy.map_description_width + 1) + 'px';
+
+ scheduler._min_date = scheduler.config.map_start || (scheduler._currentDate());
+ scheduler._max_date = scheduler.config.map_end || scheduler.date.add(scheduler._currentDate(), 1, "year");
+
+ scheduler._table_view = true;
+ set_full_view(mode);
+
+ if (mode) { //map tab activated
+ clear_map_tab();
+ fill_map_tab();
+ gmap.style.display = 'block';
+
+ // need to resize block everytime window is resized
+ _setMapSize('dhx_gmap');
+ temp_center = scheduler.map._obj.getCenter();
+
+ var events = scheduler.get_visible_events();
+ for (var i = 0; i < events.length; i++) {
+ if (!scheduler.map._markers[events[i].id]) {
+ showAddress(events[i]);
+ }
+ }
+
+ } else { //map tab de-activated
+ gmap.style.display = 'none';
+ }
+ google.maps.event.trigger(scheduler.map._obj, 'resize');
+
+ if (scheduler.map._initialization_count === 0 && temp_center) { // if tab is activated for the first time need to fix position
+ scheduler.map._obj.setCenter(temp_center);
+ }
+
+ if (scheduler._selected_event_id) {
+ selectEvent(scheduler._selected_event_id);
+ }
+ };
+
+ var selectEvent = function(event_id) {
+ scheduler.map._obj.setCenter(scheduler.map._points[event_id]);
+ scheduler.callEvent("onClick", [event_id]);
+ };
+
+ var showAddress = function(event, setCenter, performClick) { // what if event have incorrect position from the start?
+ var point = scheduler.config.map_error_position;
+ if (event.lat && event.lng) {
+ point = new google.maps.LatLng(event.lat, event.lng);
+ }
+ var message = scheduler.templates.marker_text(event.start_date, event.end_date, event);
+ if (!scheduler._new_event) {
+
+ scheduler.map._infowindows_content[event.id] = message;
+
+ if (scheduler.map._markers[event.id])
+ scheduler.map._markers[event.id].setMap(null);
+
+ scheduler.map._markers[event.id] = new google.maps.Marker({
+ position: point,
+ map: scheduler.map._obj
+ });
+
+ google.maps.event.addListener(scheduler.map._markers[event.id], 'click', function() {
+ scheduler.map._infowindow.setContent(scheduler.map._infowindows_content[event.id]);
+ scheduler.map._infowindow.open(scheduler.map._obj, scheduler.map._markers[event.id]);
+ scheduler._selected_event_id = event.id;
+ scheduler.render_data();
+ });
+ scheduler.map._points[event.id] = point;
+
+ if (setCenter) scheduler.map._obj.setCenter(scheduler.map._points[event.id]);
+ if (performClick) scheduler.callEvent("onClick", [event.id]);
+ }
+ };
+
+ scheduler.attachEvent("onClick", function(event_id, native_event_object) {
+ if (this._mode == "map") {
+ scheduler._selected_event_id = event_id;
+ for (var i = 0; i < scheduler._rendered.length; i++) {
+ scheduler._rendered[i].className = 'dhx_map_line';
+ if (scheduler._rendered[i].getAttribute("event_id") == event_id) {
+ scheduler._rendered[i].className += " highlight";
+ }
+ }
+ if (scheduler.map._points[event_id] && scheduler.map._markers[event_id]) {
+ scheduler.map._obj.setCenter(scheduler.map._points[event_id]); // was panTo
+ google.maps.event.trigger(scheduler.map._markers[event_id], 'click');
+ }
+ }
+ return true;
+ });
+
+ var _displayEventOnMap = function(event) {
+ if (event.event_location && geocoder) {
+ geocoder.geocode(
+ {
+ 'address': event.event_location,
+ 'language': scheduler.uid().toString()
+ },
+ function(results, status) {
+ var point = {};
+ if (status != google.maps.GeocoderStatus.OK) {
+ point = scheduler.callEvent("onLocationError", [event.id]);
+ if (!point || point === true)
+ point = scheduler.config.map_error_position;
+ } else {
+ point = results[0].geometry.location;
+ }
+ event.lat = point.lat();
+ event.lng = point.lng();
+
+ scheduler._selected_event_id = event.id;
+
+ scheduler._latLngUpdate = true;
+ scheduler.callEvent("onEventChanged", [event.id, event]);
+ showAddress(event, true, true);
+ }
+ );
+ } else {
+ showAddress(event, true, true);
+ }
+ };
+
+ var _updateEventLocation = function(event) { // update lat and lng in database
+ if (event.event_location && geocoder) {
+ geocoder.geocode(
+ {
+ 'address': event.event_location,
+ 'language': scheduler.uid().toString()
+ },
+ function(results, status) {
+ var point = {};
+ if (status != google.maps.GeocoderStatus.OK) {
+ point = scheduler.callEvent("onLocationError", [event.id]);
+ if (!point || point === true)
+ point = scheduler.config.map_error_position;
+ } else {
+ point = results[0].geometry.location;
+ }
+ event.lat = point.lat();
+ event.lng = point.lng();
+ scheduler._latLngUpdate = true;
+ scheduler.callEvent("onEventChanged", [event.id, event]);
+ }
+ );
+ }
+ };
+
+ var _delay = function(method, object, params, delay) {
+ setTimeout(function() {
+ var ret = method.apply(object, params);
+ method = object = params = null;
+ return ret;
+ }, delay || 1);
+ };
+
+ scheduler.attachEvent("onEventChanged", function(event_id, event_object) {
+ if (!this._latLngUpdate) {
+ var event = scheduler.getEvent(event_id);
+ if ((event.start_date < scheduler._min_date && event.end_date > scheduler._min_date) || (event.start_date < scheduler._max_date && event.end_date > scheduler._max_date) || (event.start_date.valueOf() >= scheduler._min_date && event.end_date.valueOf() <= scheduler._max_date)) {
+ if (scheduler.map._markers[event_id])
+ scheduler.map._markers[event_id].setMap(null);
+ _displayEventOnMap(event);
+ } else { // event no longer should be displayed on the map view
+ scheduler._selected_event_id = null;
+ scheduler.map._infowindow.close();
+ if (scheduler.map._markers[event_id])
+ scheduler.map._markers[event_id].setMap(null);
+ }
+ }
+ else
+ this._latLngUpdate = false;
+ return true;
+ });
+
+
+ scheduler.attachEvent("onEventIdChange", function(old_event_id, new_event_id) {
+ var event = scheduler.getEvent(new_event_id);
+ if ((event.start_date < scheduler._min_date && event.end_date > scheduler._min_date) || (event.start_date < scheduler._max_date && event.end_date > scheduler._max_date) || (event.start_date.valueOf() >= scheduler._min_date && event.end_date.valueOf() <= scheduler._max_date)) {
+ if (scheduler.map._markers[old_event_id]) {
+ scheduler.map._markers[old_event_id].setMap(null);
+ delete scheduler.map._markers[old_event_id];
+ }
+ if (scheduler.map._infowindows_content[old_event_id])
+ delete scheduler.map._infowindows_content[old_event_id];
+ _displayEventOnMap(event);
+ }
+ return true;
+ });
+
+ scheduler.attachEvent("onEventAdded", function(event_id, event_object) {
+ if (!scheduler._dataprocessor) {
+ if ((event_object.start_date < scheduler._min_date && event_object.end_date > scheduler._min_date) || (event_object.start_date < scheduler._max_date && event_object.end_date > scheduler._max_date) || (event_object.start_date.valueOf() >= scheduler._min_date && event_object.end_date.valueOf() <= scheduler._max_date)) {
+ if (scheduler.map._markers[event_id])
+ scheduler.map._markers[event_id].setMap(null);
+ _displayEventOnMap(event_object);
+ }
+ }
+ return true;
+ });
+
+ /* Test/example
+ scheduler.attachEvent("onLocationError", function(event_id,event_object){
+ return new google.maps.LatLng(8, 8);
+ });
+ */
+
+ scheduler.attachEvent("onBeforeEventDelete", function(event_id, event_object) {
+ if (scheduler.map._markers[event_id]) {
+ scheduler.map._markers[event_id].setMap(null); // if new event is deleted tab != map then it doesn't have marker yet
+ }
+ scheduler._selected_event_id = null;
+ scheduler.map._infowindow.close();
+ return true;
+ });
+
+ scheduler._event_resolve_delay = 1500;
+ scheduler.attachEvent("onEventLoading", function(event) {
+ if (scheduler.config.map_resolve_event_location && event.event_location && !event.lat && !event.lng) { // don't delete !event.lat && !event.lng as location could change
+ scheduler._event_resolve_delay += 1500;
+ _delay(_updateEventLocation, this, [event], scheduler._event_resolve_delay);
+ }
+ return true;
+ });
+
+ scheduler.attachEvent("onEventCancel", function(event_id, is_new) {
+ if (is_new) {
+ if (scheduler.map._markers[event_id])
+ scheduler.map._markers[event_id].setMap(null);
+ scheduler.map._infowindow.close();
+ }
+ return true;
+ });
+});
diff --git a/codebase/sources/ext/dhtmlxscheduler_map_view.js.map b/codebase/sources/ext/dhtmlxscheduler_map_view.js.map
new file mode 100644
index 0000000..e7bcadb
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_map_view.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_map_view.js.map","sources":["dhtmlxscheduler_map_view.js"],"names":["scheduler","xy","map_date_width","map_description_width","config","map_resolve_event_location","map_resolve_user_location","map_initial_position","google","maps","LatLng","map_error_position","map_infowindow_max_width","map_type","MapTypeId","ROADMAP","map_zoom_after_resolve","locale","labels","marker_geo_success","marker_geo_fail","templates","marker_date","date","date_to_str","marker_text","start","end","ev","text","event_location","dblclick_dhx_map_area","this","readonly","dblclick_create","addEventNow","start_date","_date","end_date","add","time_step","map_time","_timed","day_date","event_date","map_text","map_start","d","add_map","Date","valueOf","map_date","_latLngUpdate","attachEvent","set_full_view","mode","l","_els","innerHTML","description","_table_view","set_sizes","clear_map_tab","_selected_event_id","map","_infowindow","close","markers","_markers","key","hasOwnProperty","setMap","_infowindows_content","fill_map_tab","events","get_visible_events","sort","a","b","id","html","i","length","event_class","bg_color","color","textColor","_text_style","scrollTop","style","width","t","firstChild","childNodes","_mode","_min_date","_max_date","_rendered","_setMapSize","elem_id","document","getElementById","height","_y","nav_height","_x","marginLeft","marginTop","_isMapPositionSet","gmap","createElement","className","dispay","node","_obj","appendChild","dhx_gmap","push","mapOptions","zoom","map_inital_zoom","center","mapTypeId","Map","disableDefaultUI","disableDoubleClickZoom","event","addListener","point","latLng","geocoder","geocode","results","status","GeocoderStatus","OK","geometry","location","lat","lng","formatted_address","infoWindowOptions","content","maxWidth","_points","InfoWindow","_initialization_count","Geocoder","navigator","geolocation","getCurrentPosition","position","_userLocation","coords","latitude","longitude","setCenter","setZoom","setContent","getCenter","open","setPosition","zIndex","getZoom","display","map_view","old","render_data","apply","arguments","showAddress","temp_center","dhx_cal_data","_currentDate","map_end","trigger","selectEvent","event_id","callEvent","performClick","message","_new_event","Marker","getAttribute","_displayEventOnMap","address","language","uid","toString","_updateEventLocation","_delay","method","object","params","delay","setTimeout","ret","getEvent","old_event_id","new_event_id","event_object","_dataprocessor","_event_resolve_delay","is_new"],"mappings":"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"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_minical.js b/codebase/sources/ext/dhtmlxscheduler_minical.js
new file mode 100644
index 0000000..262c7cb
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_minical.js
@@ -0,0 +1,472 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+scheduler.templates.calendar_month = scheduler.date.date_to_str("%F %Y");
+scheduler.templates.calendar_scale_date = scheduler.date.date_to_str("%D");
+scheduler.templates.calendar_date = scheduler.date.date_to_str("%d");
+scheduler.config.minicalendar = {
+ mark_events: true
+};
+scheduler._synced_minicalendars = [];
+scheduler.renderCalendar = function(obj, _prev, is_refresh) {
+ var cal = null;
+ var date = obj.date || (scheduler._currentDate());
+ if (typeof date == "string")
+ date = this.templates.api_date(date);
+
+ if (!_prev) {
+ var cont = obj.container;
+ var pos = obj.position;
+
+ if (typeof cont == "string")
+ cont = document.getElementById(cont);
+
+ if (typeof pos == "string")
+ pos = document.getElementById(pos);
+ if (pos && (typeof pos.left == "undefined")) {
+ var tpos = getOffset(pos);
+ pos = {
+ top: tpos.top + pos.offsetHeight,
+ left: tpos.left
+ };
+ }
+ if (!cont)
+ cont = scheduler._get_def_cont(pos);
+
+ cal = this._render_calendar(cont, date, obj);
+ cal.onclick = function(e) {
+ e = e || event;
+ var src = e.target || e.srcElement;
+
+ if (src.className.indexOf("dhx_month_head") != -1) {
+ var pname = src.parentNode.className;
+ if (pname.indexOf("dhx_after") == -1 && pname.indexOf("dhx_before") == -1) {
+ var newdate = scheduler.templates.xml_date(this.getAttribute("date"));
+ newdate.setDate(parseInt(src.innerHTML, 10));
+ scheduler.unmarkCalendar(this);
+ scheduler.markCalendar(this, newdate, "dhx_calendar_click");
+ this._last_date = newdate;
+ if (this.conf.handler) this.conf.handler.call(scheduler, newdate, this);
+ }
+ }
+ };
+ } else {
+ cal = this._render_calendar(_prev.parentNode, date, obj, _prev);
+ scheduler.unmarkCalendar(cal);
+ }
+
+ if (scheduler.config.minicalendar.mark_events) {
+ var start = scheduler.date.month_start(date);
+ var end = scheduler.date.add(start, 1, "month");
+ var evs = this.getEvents(start, end);
+ var filter = this["filter_" + this._mode];
+ for (var i = 0; i < evs.length; i++) {
+ var ev = evs[i];
+ if (filter && !filter(ev.id, ev))
+ continue;
+ var d = ev.start_date;
+ if (d.valueOf() < start.valueOf())
+ d = start;
+ d = scheduler.date.date_part(new Date(d.valueOf()));
+ while (d < ev.end_date) {
+ this.markCalendar(cal, d, "dhx_year_event");
+ d = this.date.add(d, 1, "day");
+ if (d.valueOf() >= end.valueOf())
+ break;
+ }
+ }
+ }
+
+ this._markCalendarCurrentDate(cal);
+
+ cal.conf = obj;
+ if (obj.sync && !is_refresh)
+ this._synced_minicalendars.push(cal);
+
+ return cal;
+};
+scheduler._get_def_cont = function(pos) {
+ if (!this._def_count) {
+ this._def_count = document.createElement("DIV");
+ this._def_count.className = "dhx_minical_popup";
+ this._def_count.onclick = function(e) { (e || event).cancelBubble = true; };
+ document.body.appendChild(this._def_count);
+ }
+
+ this._def_count.style.left = pos.left + "px";
+ this._def_count.style.top = pos.top + "px";
+ this._def_count._created = new Date();
+
+ return this._def_count;
+};
+scheduler._locateCalendar = function(cal, date) {
+ if (typeof date == "string")
+ date = scheduler.templates.api_date(date);
+
+ if(+date > +cal._max_date || +date < +cal._min_date)
+ return null;
+
+ var table = cal.childNodes[2].childNodes[0];
+
+ var weekNum = 0;
+ var dat = new Date(cal._min_date);
+ while(+this.date.add(dat, 1, "week") <= +date){
+ dat = this.date.add(dat, 1, "week");
+ weekNum++;
+ }
+
+ var sm = scheduler.config.start_on_monday;
+ var day = (date.getDay() || (sm ? 7 : 0)) - (sm ? 1 : 0);
+ return table.rows[weekNum].cells[day].firstChild;
+};
+scheduler.markCalendar = function(cal, date, css) {
+ var div = this._locateCalendar(cal, date);
+ if(!div)
+ return;
+
+ div.className += " " + css;
+};
+scheduler.unmarkCalendar = function(cal, date, css) {
+ date = date || cal._last_date;
+ css = css || "dhx_calendar_click";
+ if (!date) return;
+ var el = this._locateCalendar(cal, date);
+ if(!el)
+ return;
+ el.className = (el.className || "").replace(RegExp(css, "g"));
+};
+scheduler._week_template = function(width) {
+ var summ = (width || 250);
+ var left = 0;
+
+ var week_template = document.createElement("div");
+ var dummy_date = this.date.week_start(scheduler._currentDate());
+ for (var i = 0; i < 7; i++) {
+ this._cols[i] = Math.floor(summ / (7 - i));
+ this._render_x_header(i, left, dummy_date, week_template);
+ dummy_date = this.date.add(dummy_date, 1, "day");
+ summ -= this._cols[i];
+ left += this._cols[i];
+ }
+ week_template.lastChild.className += " dhx_scale_bar_last";
+ return week_template;
+};
+scheduler.updateCalendar = function(obj, sd) {
+ obj.conf.date = sd;
+ this.renderCalendar(obj.conf, obj, true);
+};
+scheduler._mini_cal_arrows = ["&nbsp", "&nbsp"];
+scheduler._render_calendar = function(obj, sd, conf, previous) {
+ /*store*/
+ var ts = scheduler.templates;
+ var temp = this._cols;
+ this._cols = [];
+ var temp2 = this._mode;
+ this._mode = "calendar";
+ var temp3 = this._colsS;
+ this._colsS = {height: 0};
+ var temp4 = new Date(this._min_date);
+ var temp5 = new Date(this._max_date);
+ var temp6 = new Date(scheduler._date);
+ var temp7 = ts.month_day;
+ var temp8 = this._ignores_detected; this._ignores_detected = 0;
+ ts.month_day = ts.calendar_date;
+
+ sd = this.date.month_start(sd);
+ var week_template = this._week_template(obj.offsetWidth - 1 - this.config.minicalendar.padding );
+
+ var d;
+ if (previous)
+ d = previous; else {
+ d = document.createElement("DIV");
+ d.className = "dhx_cal_container dhx_mini_calendar";
+ }
+ d.setAttribute("date", this.templates.xml_format(sd));
+ d.innerHTML = "<div class='dhx_year_month'></div><div class='dhx_year_week'>" + week_template.innerHTML + "</div><div class='dhx_year_body'></div>";
+
+ d.childNodes[0].innerHTML = this.templates.calendar_month(sd);
+ if (conf.navigation) {
+ var move_minicalendar_date = function(calendar, diff) {
+ var date = scheduler.date.add(calendar._date, diff, "month");
+ scheduler.updateCalendar(calendar, date);
+ if (scheduler._date.getMonth() == calendar._date.getMonth() && scheduler._date.getFullYear() == calendar._date.getFullYear()) {
+ scheduler._markCalendarCurrentDate(calendar);
+ }
+ };
+
+ var css_classnames = ["dhx_cal_prev_button", "dhx_cal_next_button"];
+ var css_texts = ["left:1px;top:2px;position:absolute;", "left:auto; right:1px;top:2px;position:absolute;"];
+ var diffs = [-1, 1];
+ var handler = function(diff) {
+ return function() {
+ if (conf.sync) {
+ var calendars = scheduler._synced_minicalendars;
+ for (var k = 0; k < calendars.length; k++) {
+ move_minicalendar_date(calendars[k], diff);
+ }
+ } else {
+ move_minicalendar_date(d, diff);
+ }
+ };
+ };
+ for (var j = 0; j < 2; j++) {
+ var arrow = document.createElement("DIV");
+ //var diff = diffs[j];
+ arrow.className = css_classnames[j];
+ arrow.style.cssText = css_texts[j];
+ arrow.innerHTML = this._mini_cal_arrows[j];
+ d.firstChild.appendChild(arrow);
+ arrow.onclick = handler(diffs[j]);
+ }
+ }
+ d._date = new Date(sd);
+
+ d.week_start = (sd.getDay() - (this.config.start_on_monday ? 1 : 0) + 7) % 7;
+
+ var dd = d._min_date = this.date.week_start(sd);
+ d._max_date = this.date.add(d._min_date, 6, "week");
+
+ this._reset_month_scale(d.childNodes[2], sd, dd);
+
+ var r = d.childNodes[2].firstChild.rows;
+ for (var k = r.length; k < 6; k++) {
+ var last_row = r[r.length - 1];
+ r[0].parentNode.appendChild(last_row.cloneNode(true));
+ var last_day_number = parseInt(last_row.childNodes[last_row.childNodes.length - 1].childNodes[0].innerHTML);
+ last_day_number = (last_day_number < 10) ? last_day_number : 0; // previous week could end on 28-31, so we should start with 0
+ for (var ri = 0; ri < r[k].childNodes.length; ri++) {
+ r[k].childNodes[ri].className = "dhx_after";
+ r[k].childNodes[ri].childNodes[0].innerHTML = scheduler.date.to_fixed(++last_day_number);
+ }
+ }
+
+ if (!previous)
+ obj.appendChild(d);
+
+ d.childNodes[1].style.height = (d.childNodes[1].childNodes[0].offsetHeight - 1) + "px"; // dhx_year_week should have height property so that day dates would get correct position. dhx_year_week height = height of it's child (with the day name)
+
+ /*restore*/
+ this._cols = temp;
+ this._mode = temp2;
+ this._colsS = temp3;
+ this._min_date = temp4;
+ this._max_date = temp5;
+ scheduler._date = temp6;
+ ts.month_day = temp7;
+ this._ignores_detected = temp8;
+ return d;
+};
+scheduler.destroyCalendar = function(cal, force) {
+ if (!cal && this._def_count && this._def_count.firstChild) {
+ if (force || (new Date()).valueOf() - this._def_count._created.valueOf() > 500)
+ cal = this._def_count.firstChild;
+ }
+ if (!cal) return;
+ cal.onclick = null;
+ cal.innerHTML = "";
+ if (cal.parentNode)
+ cal.parentNode.removeChild(cal);
+ if (this._def_count)
+ this._def_count.style.top = "-1000px";
+};
+scheduler.isCalendarVisible = function() {
+ if (this._def_count && parseInt(this._def_count.style.top, 10) > 0)
+ return this._def_count;
+ return false;
+};
+
+scheduler._attach_minical_events = function(){
+ dhtmlxEvent(document.body, "click", function() { scheduler.destroyCalendar(); });
+ scheduler._attach_minical_events = function(){};
+};
+
+scheduler.attachEvent("onTemplatesReady", function() {
+ scheduler._attach_minical_events();
+});
+
+scheduler.templates.calendar_time = scheduler.date.date_to_str("%d-%m-%Y");
+
+scheduler.form_blocks.calendar_time = {
+ render: function() {
+ var html = "<input class='dhx_readonly' type='text' readonly='true'>";
+
+ var cfg = scheduler.config;
+ var dt = this.date.date_part(scheduler._currentDate());
+
+ var last = 24 * 60, first = 0;
+ if (cfg.limit_time_select) {
+ first = 60 * cfg.first_hour;
+ last = 60 * cfg.last_hour + 1; // to include "17:00" option if time select is limited
+ }
+ dt.setHours(first / 60);
+
+ html += " <select>";
+ for (var i = first; i < last; i += this.config.time_step * 1) { // `<` to exclude last "00:00" option
+ var time = this.templates.time_picker(dt);
+ html += "<option value='" + i + "'>" + time + "</option>";
+ dt = this.date.add(dt, this.config.time_step, "minute");
+ }
+ html += "</select>";
+
+ var full_day = scheduler.config.full_day;
+
+ return "<div style='height:30px;padding-top:0; font-size:inherit;' class='dhx_section_time'>" + html + "<span style='font-weight:normal; font-size:10pt;'> &nbsp;&ndash;&nbsp; </span>" + html + "</div>";
+ },
+ set_value: function(node, value, ev) {
+
+ var inputs = node.getElementsByTagName("input");
+ var selects = node.getElementsByTagName("select");
+ var start_date,
+ end_date;
+
+ var _init_once = function(inp, date, number) {
+ inp.onclick = function() {
+ scheduler.destroyCalendar(null, true);
+ scheduler.renderCalendar({
+ position: inp,
+ date: new Date(this._date),
+ navigation: true,
+ handler: function(new_date) {
+ inp.value = scheduler.templates.calendar_time(new_date);
+ inp._date = new Date(new_date);
+ scheduler.destroyCalendar();
+ if (scheduler.config.event_duration && scheduler.config.auto_end_date && number === 0) { //first element = start date
+ _update_minical_select();
+ }
+ }
+ });
+ };
+ };
+
+ if (scheduler.config.full_day) {
+ if (!node._full_day) {
+ var html = "<label class='dhx_fullday'><input type='checkbox' name='full_day' value='true'> " + scheduler.locale.labels.full_day + "&nbsp;</label></input>";
+ if (!scheduler.config.wide_form)
+ html = node.previousSibling.innerHTML + html;
+ node.previousSibling.innerHTML = html;
+ node._full_day = true;
+ }
+ var input = node.previousSibling.getElementsByTagName("input")[0];
+
+ var isFulldayEvent = (scheduler.date.time_part(ev.start_date) === 0 && scheduler.date.time_part(ev.end_date) === 0);
+ input.checked = isFulldayEvent;
+
+ selects[0].disabled = input.checked;
+ selects[1].disabled = input.checked;
+
+ input.onclick = function() {
+ if (input.checked === true) {
+ var obj = {};
+ scheduler.form_blocks.calendar_time.get_value(node, obj);
+
+ start_date = scheduler.date.date_part(obj.start_date);
+ end_date = scheduler.date.date_part(obj.end_date);
+
+ if (+end_date == +start_date || (+end_date >= +start_date && (ev.end_date.getHours() !== 0 || ev.end_date.getMinutes() !== 0)))
+ end_date = scheduler.date.add(end_date, 1, "day");
+ }
+
+ var start = start_date || ev.start_date;
+ var end = end_date || ev.end_date;
+ _attach_action(inputs[0], start);
+ _attach_action(inputs[1], end);
+ selects[0].value = start.getHours() * 60 + start.getMinutes();
+ selects[1].value = end.getHours() * 60 + end.getMinutes();
+
+ selects[0].disabled = input.checked;
+ selects[1].disabled = input.checked;
+
+ };
+ }
+
+ if (scheduler.config.event_duration && scheduler.config.auto_end_date) {
+
+ var _update_minical_select = function () {
+ start_date = scheduler.date.add(inputs[0]._date, selects[0].value, "minute");
+ end_date = new Date(start_date.getTime() + (scheduler.config.event_duration * 60 * 1000));
+
+ inputs[1].value = scheduler.templates.calendar_time(end_date);
+ inputs[1]._date = scheduler.date.date_part(new Date(end_date));
+
+ selects[1].value = end_date.getHours() * 60 + end_date.getMinutes();
+ };
+
+ selects[0].onchange = _update_minical_select; // only update on first select should trigger update so user could define other end date if he wishes too
+ }
+
+ function _attach_action(inp, date, number) {
+ _init_once(inp, date, number);
+ inp.value = scheduler.templates.calendar_time(date);
+ inp._date = scheduler.date.date_part(new Date(date));
+ }
+
+ _attach_action(inputs[0], ev.start_date, 0);
+ _attach_action(inputs[1], ev.end_date, 1);
+ _init_once = function() {};
+
+ selects[0].value = ev.start_date.getHours() * 60 + ev.start_date.getMinutes();
+ selects[1].value = ev.end_date.getHours() * 60 + ev.end_date.getMinutes();
+
+ },
+ get_value: function(node, ev) {
+ var inputs = node.getElementsByTagName("input");
+ var selects = node.getElementsByTagName("select");
+
+ ev.start_date = scheduler.date.add(inputs[0]._date, selects[0].value, "minute");
+ ev.end_date = scheduler.date.add(inputs[1]._date, selects[1].value, "minute");
+
+ if (ev.end_date <= ev.start_date)
+ ev.end_date = scheduler.date.add(ev.start_date, scheduler.config.time_step, "minute");
+ return {
+ start_date: new Date(ev.start_date),
+ end_date: new Date(ev.end_date)
+ };
+ },
+ focus: function(node) {
+ }
+};
+scheduler.linkCalendar = function(calendar, datediff) {
+ var action = function() {
+ var date = scheduler._date;
+ var dateNew = new Date(date.valueOf());
+ if (datediff) dateNew = datediff(dateNew);
+ dateNew.setDate(1);
+ scheduler.updateCalendar(calendar, dateNew);
+ return true;
+ };
+
+ scheduler.attachEvent("onViewChange", action);
+ scheduler.attachEvent("onXLE", action);
+ scheduler.attachEvent("onEventAdded", action);
+ scheduler.attachEvent("onEventChanged", action);
+ scheduler.attachEvent("onAfterEventDelete", action);
+ action();
+};
+
+scheduler._markCalendarCurrentDate = function(calendar) {
+ var date = scheduler._date;
+ var mode = scheduler._mode;
+ var month_start = scheduler.date.month_start(new Date(calendar._date));
+ var month_end = scheduler.date.add(month_start, 1, "month");
+
+ if (mode == 'day' || (this._props && !!this._props[mode])) { // if day or units view
+ if (month_start.valueOf() <= date.valueOf() && month_end > date) {
+ scheduler.markCalendar(calendar, date, "dhx_calendar_click");
+ }
+ } else if (mode == 'week') {
+ var dateNew = scheduler.date.week_start(new Date(date.valueOf()));
+ for (var i = 0; i < 7; i++) {
+ if (month_start.valueOf() <= dateNew.valueOf() && month_end > dateNew) // >= would mean mark first day of the next month
+ scheduler.markCalendar(calendar, dateNew, "dhx_calendar_click");
+ dateNew = scheduler.date.add(dateNew, 1, "day");
+ }
+ }
+};
+
+scheduler.attachEvent("onEventCancel", function(){
+ scheduler.destroyCalendar(null, true);
+}); \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_minical.js.map b/codebase/sources/ext/dhtmlxscheduler_minical.js.map
new file mode 100644
index 0000000..f5838fb
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_minical.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_minical.js.map","sources":["dhtmlxscheduler_minical.js"],"names":["scheduler","templates","calendar_month","date","date_to_str","calendar_scale_date","calendar_date","config","minicalendar","mark_events","_synced_minicalendars","renderCalendar","obj","_prev","is_refresh","cal","_currentDate","this","api_date","_render_calendar","parentNode","unmarkCalendar","cont","container","pos","position","document","getElementById","left","tpos","getOffset","top","offsetHeight","_get_def_cont","onclick","e","event","src","target","srcElement","className","indexOf","pname","newdate","xml_date","getAttribute","setDate","parseInt","innerHTML","markCalendar","_last_date","conf","handler","call","start","month_start","end","add","evs","getEvents","filter","_mode","i","length","ev","id","d","start_date","valueOf","date_part","Date","end_date","_markCalendarCurrentDate","sync","push","_def_count","createElement","cancelBubble","body","appendChild","style","_created","_locateCalendar","_max_date","_min_date","table","childNodes","weekNum","dat","sm","start_on_monday","day","getDay","rows","cells","firstChild","css","div","el","replace","RegExp","_week_template","width","summ","week_template","dummy_date","week_start","_cols","Math","floor","_render_x_header","lastChild","updateCalendar","sd","_mini_cal_arrows","previous","ts","temp","temp2","temp3","_colsS","height","temp4","temp5","temp6","_date","temp7","month_day","temp8","_ignores_detected","offsetWidth","padding","setAttribute","xml_format","navigation","move_minicalendar_date","calendar","diff","getMonth","getFullYear","css_classnames","css_texts","diffs","calendars","k","j","arrow","cssText","dd","_reset_month_scale","r","last_row","cloneNode","last_day_number","ri","to_fixed","destroyCalendar","force","removeChild","isCalendarVisible","_attach_minical_events","dhtmlxEvent","attachEvent","calendar_time","form_blocks","render","html","cfg","dt","last","first","limit_time_select","first_hour","last_hour","setHours","time_step","time","time_picker","full_day","set_value","node","value","_attach_action","inp","number","_init_once","inputs","getElementsByTagName","selects","new_date","event_duration","auto_end_date","_update_minical_select","_full_day","locale","labels","wide_form","previousSibling","input","isFulldayEvent","time_part","checked","disabled","get_value","getHours","getMinutes","getTime","onchange","focus","linkCalendar","datediff","action","dateNew","mode","month_end","_props"],"mappings":"AAAAA,UAAUC,UAAUC,eAAiBF,UAAUG,KAAKC,YAAY,SAChEJ,UAAUC,UAAUI,oBAAsBL,UAAUG,KAAKC,YAAY,MACrEJ,UAAUC,UAAUK,cAAgBN,UAAUG,KAAKC,YAAY,MAC/DJ,UAAUO,OAAOC,cAChBC,aAAa,GAEdT,UAAUU,yBACVV,UAAUW,eAAiB,SAASC,EAAKC,EAAOC,GAC/C,GAAIC,GAAM,KACNZ,EAAOS,EAAIT,MAASH,UAAUgB,cAIlC,IAHmB,gBAARb,KACVA,EAAOc,KAAKhB,UAAUiB,SAASf,IAE3BU,EAqCJE,EAAME,KAAKE,iBAAiBN,EAAMO,WAAYjB,EAAMS,EAAKC,GACzDb,UAAUqB,eAAeN;IAtCd,CACX,GAAIO,GAAOV,EAAIW,UACXC,EAAMZ,EAAIa,QAOd,IALmB,gBAARH,KACVA,EAAOI,SAASC,eAAeL,IAEd,gBAAPE,KACVA,EAAME,SAASC,eAAeH,IAC3BA,GAA2B,mBAAZA,GAAII,KAAsB,CAC5C,GAAIC,GAAOC,UAAUN,EACrBA,IACCO,IAAKF,EAAKE,IAAMP,EAAIQ,aACpBJ,KAAMC,EAAKD,MAGRN,IACJA,EAAOtB,UAAUiC,cAAcT,IAEhCT,EAAME,KAAKE,iBAAiBG,EAAMnB,EAAMS,GACxCG,EAAImB,QAAU,SAASC,GACtBA,EAAIA,GAAKC,KACT,IAAIC,GAAMF,EAAEG,QAAUH,EAAEI,UAExB,IAA+C,IAA3CF,EAAIG,UAAUC,QAAQ,kBAAyB,CAClD,GAAIC,GAAQL,EAAIjB,WAAWoB,SAC3B,IAAkC,IAA9BE,EAAMD,QAAQ,cAAqD,IAA/BC,EAAMD,QAAQ,cAAqB,CAC1E,GAAIE,GAAU3C,UAAUC,UAAU2C,SAAS3B,KAAK4B,aAAa,QAC7DF;EAAQG,QAAQC,SAASV,EAAIW,UAAW,KACxChD,UAAUqB,eAAeJ,MACzBjB,UAAUiD,aAAahC,KAAM0B,EAAS,sBACtC1B,KAAKiC,WAAaP,EACd1B,KAAKkC,KAAKC,SAASnC,KAAKkC,KAAKC,QAAQC,KAAKrD,UAAW2C,EAAS1B,SAStE,GAAIjB,UAAUO,OAAOC,aAAaC,YAKjC,IAAK,GAJD6C,GAAQtD,UAAUG,KAAKoD,YAAYpD,GACnCqD,EAAMxD,UAAUG,KAAKsD,IAAIH,EAAO,EAAG,SACnCI,EAAMzC,KAAK0C,UAAUL,EAAOE,GAC5BI,EAAS3C,KAAK,UAAYA,KAAK4C,OAC1BC,EAAI,EAAGA,EAAIJ,EAAIK,OAAQD,IAAK,CACpC,GAAIE,GAAKN,EAAII,EACb,KAAIF,GAAWA,EAAOI,EAAGC,GAAID,GAA7B,CAEA,GAAIE,GAAIF,EAAGG,UAIX,KAHID,EAAEE,UAAYd,EAAMc,YACvBF,EAAIZ,GACLY,EAAIlE,UAAUG,KAAKkE,UAAU,GAAIC,MAAKJ,EAAEE,YACjCF,EAAIF,EAAGO,WACbtD,KAAKgC,aAAalC,EAAKmD,EAAG,kBAC1BA,EAAIjD,KAAKd,KAAKsD,IAAIS,EAAG,EAAG,SACpBA,EAAEE,WAAaZ,EAAIY,gBAY1B,MANAnD,MAAKuD,yBAAyBzD,GAE9BA,EAAIoC,KAAOvC,EACPA,EAAI6D,OAAS3D,GAChBG,KAAKP,sBAAsBgE,KAAK3D,GAE1BA;EAERf,UAAUiC,cAAgB,SAAST,GAYlC,MAXKP,MAAK0D,aACT1D,KAAK0D,WAAajD,SAASkD,cAAc,OACzC3D,KAAK0D,WAAWnC,UAAY,oBAC5BvB,KAAK0D,WAAWzC,QAAU,SAASC,IAAMA,GAAKC,OAAOyC,cAAe,GACpEnD,SAASoD,KAAKC,YAAY9D,KAAK0D,aAGhC1D,KAAK0D,WAAWK,MAAMpD,KAAOJ,EAAII,KAAO,KACxCX,KAAK0D,WAAWK,MAAMjD,IAAMP,EAAIO,IAAM,KACtCd,KAAK0D,WAAWM,SAAW,GAAIX,MAExBrD,KAAK0D,YAEb3E,UAAUkF,gBAAkB,SAASnE,EAAKZ,GAIzC,GAHmB,gBAARA,KACVA,EAAOH,UAAUC,UAAUiB,SAASf,KAEjCA,GAAQY,EAAIoE,YAAchF,GAAQY,EAAIqE,UACzC,MAAO,KAMR;IAJA,GAAIC,GAAQtE,EAAIuE,WAAW,GAAGA,WAAW,GAErCC,EAAU,EACVC,EAAM,GAAIlB,MAAKvD,EAAIqE,YAChBnE,KAAKd,KAAKsD,IAAI+B,EAAK,EAAG,UAAYrF,GACxCqF,EAAMvE,KAAKd,KAAKsD,IAAI+B,EAAK,EAAG,QAC5BD,GAGD,IAAIE,GAAKzF,UAAUO,OAAOmF,gBACtBC,GAAOxF,EAAKyF,WAAaH,EAAK,EAAI,KAAOA,EAAK,EAAI,EACtD,OAAOJ,GAAMQ,KAAKN,GAASO,MAAMH,GAAKI,YAEvC/F,UAAUiD,aAAe,SAASlC,EAAKZ,EAAM6F,GAC5C,GAAIC,GAAMhF,KAAKiE,gBAAgBnE,EAAKZ,EAChC8F,KAGJA,EAAIzD,WAAa,IAAMwD,IAExBhG,UAAUqB,eAAiB,SAASN,EAAKZ,EAAM6F,GAG9C,GAFA7F,EAAOA,GAAQY,EAAImC,WACnB8C,EAAMA,GAAO,qBACR7F,EAAL,CACA,GAAI+F,GAAKjF,KAAKiE,gBAAgBnE,EAAKZ,EAC/B+F,KAEJA,EAAG1D,WAAa0D,EAAG1D,WAAa,IAAI2D,QAAQC,OAAOJ,EAAK;GAEzDhG,UAAUqG,eAAiB,SAASC,GAMnC,IAAK,GALDC,GAAQD,GAAS,IACjB1E,EAAO,EAEP4E,EAAgB9E,SAASkD,cAAc,OACvC6B,EAAaxF,KAAKd,KAAKuG,WAAW1G,UAAUgB,gBACvC8C,EAAI,EAAO,EAAJA,EAAOA,IACtB7C,KAAK0F,MAAM7C,GAAK8C,KAAKC,MAAMN,GAAQ,EAAIzC,IACvC7C,KAAK6F,iBAAiBhD,EAAGlC,EAAM6E,EAAYD,GAC3CC,EAAaxF,KAAKd,KAAKsD,IAAIgD,EAAY,EAAG,OAC1CF,GAAQtF,KAAK0F,MAAM7C,GACnBlC,GAAQX,KAAK0F,MAAM7C,EAGpB,OADA0C,GAAcO,UAAUvE,WAAa,sBAC9BgE,GAERxG,UAAUgH,eAAiB,SAASpG,EAAKqG,GACxCrG,EAAIuC,KAAKhD,KAAO8G,EAChBhG,KAAKN,eAAeC,EAAIuC,KAAMvC,GAAK,IAEpCZ,UAAUkH,kBAAoB,QAAS,SACvClH,UAAUmB,iBAAmB,SAASP,EAAKqG,EAAI9D,EAAMgE,GAEpD,GAAIC,GAAKpH,UAAUC,UACfoH,EAAOpG,KAAK0F,KAChB1F;KAAK0F,QACL,IAAIW,GAAQrG,KAAK4C,KACjB5C,MAAK4C,MAAQ,UACb,IAAI0D,GAAQtG,KAAKuG,MACjBvG,MAAKuG,QAAUC,OAAQ,EACvB,IAAIC,GAAQ,GAAIpD,MAAKrD,KAAKmE,WACtBuC,EAAQ,GAAIrD,MAAKrD,KAAKkE,WACtByC,EAAQ,GAAItD,MAAKtE,UAAU6H,OAC3BC,EAAQV,EAAGW,UACXC,EAAQ/G,KAAKgH,iBAAmBhH,MAAKgH,kBAAoB,EAC7Db,EAAGW,UAAYX,EAAG9G,cAElB2G,EAAKhG,KAAKd,KAAKoD,YAAY0D,EAC3B,IAEI/C,GAFAsC,EAAgBvF,KAAKoF,eAAezF,EAAIsH,YAAc,EAAIjH,KAAKV,OAAOC,aAAa2H,QAYvF,IATIhB,EACHjD,EAAIiD,GACJjD,EAAIxC,SAASkD,cAAc,OAC3BV,EAAE1B,UAAY,uCAEf0B,EAAEkE,aAAa,OAAQnH,KAAKhB,UAAUoI,WAAWpB,IACjD/C,EAAElB,UAAY,gEAAkEwD,EAAcxD,UAAY,0CAE1GkB,EAAEoB,WAAW,GAAGtC,UAAY/B,KAAKhB,UAAUC,eAAe+G,GACtD9D,EAAKmF,WAwBR,IAAK,GAvBDC,GAAyB,SAASC,EAAUC,GAC/C,GAAItI,GAAOH,UAAUG,KAAKsD,IAAI+E,EAASX,MAAOY,EAAM,QACpDzI;UAAUgH,eAAewB,EAAUrI,GAC/BH,UAAU6H,MAAMa,YAAcF,EAASX,MAAMa,YAAc1I,UAAU6H,MAAMc,eAAiBH,EAASX,MAAMc,eAC9G3I,UAAUwE,yBAAyBgE,IAIjCI,GAAkB,sBAAuB,uBACzCC,GAAa,sCAAuC,mDACpDC,GAAS,GAAI,GACb1F,EAAU,SAASqF,GACtB,MAAO,YACN,GAAItF,EAAKsB,KAER,IAAK,GADDsE,GAAY/I,UAAUU,sBACjBsI,EAAI,EAAGA,EAAID,EAAUhF,OAAQiF,IACrCT,EAAuBQ,EAAUC,GAAIP,OAGtCF,GAAuBrE,EAAGuE,KAIpBQ,EAAI,EAAO,EAAJA,EAAOA,IAAK,CAC3B,GAAIC,GAAQxH,SAASkD,cAAc,MAEnCsE,GAAM1G,UAAYoG,EAAeK,GACjCC,EAAMlE,MAAMmE,QAAUN,EAAUI,GAChCC,EAAMlG,UAAY/B,KAAKiG,iBAAiB+B,GACxC/E,EAAE6B,WAAWhB,YAAYmE,GACzBA,EAAMhH,QAAUkB,EAAQ0F,EAAMG;CAGhC/E,EAAE2D,MAAQ,GAAIvD,MAAK2C,GAEnB/C,EAAEwC,YAAcO,EAAGrB,UAAY3E,KAAKV,OAAOmF,gBAAkB,EAAI,GAAK,GAAK,CAE3E,IAAI0D,GAAKlF,EAAEkB,UAAYnE,KAAKd,KAAKuG,WAAWO,EAC5C/C,GAAEiB,UAAYlE,KAAKd,KAAKsD,IAAIS,EAAEkB,UAAW,EAAG,QAE5CnE,KAAKoI,mBAAmBnF,EAAEoB,WAAW,GAAI2B,EAAImC,EAG7C,KAAK,GADDE,GAAIpF,EAAEoB,WAAW,GAAGS,WAAWF,KAC1BmD,EAAIM,EAAEvF,OAAY,EAAJiF,EAAOA,IAAK,CAClC,GAAIO,GAAWD,EAAEA,EAAEvF,OAAS,EAC5BuF,GAAE,GAAGlI,WAAW2D,YAAYwE,EAASC,WAAU,GAC/C,IAAIC,GAAkB1G,SAASwG,EAASjE,WAAWiE,EAASjE,WAAWvB,OAAS,GAAGuB,WAAW,GAAGtC,UACjGyG,GAAqC,GAAlBA,EAAwBA,EAAkB,CAC7D,KAAK,GAAIC,GAAK,EAAGA,EAAKJ,EAAEN,GAAG1D,WAAWvB,OAAQ2F,IAC7CJ,EAAEN,GAAG1D,WAAWoE,GAAIlH,UAAY,YAChC8G,EAAEN,GAAG1D,WAAWoE,GAAIpE,WAAW,GAAGtC,UAAYhD,UAAUG,KAAKwJ,WAAWF;CAkB1E,MAdKtC,IACJvG,EAAImE,YAAYb,GAEjBA,EAAEoB,WAAW,GAAGN,MAAMyC,OAAUvD,EAAEoB,WAAW,GAAGA,WAAW,GAAGtD,aAAe,EAAK,KAGlFf,KAAK0F,MAAQU,EACbpG,KAAK4C,MAAQyD,EACbrG,KAAKuG,OAASD,EACdtG,KAAKmE,UAAYsC,EACjBzG,KAAKkE,UAAYwC,EACjB3H,UAAU6H,MAAQD,EAClBR,EAAGW,UAAYD,EACf7G,KAAKgH,kBAAoBD,EAClB9D,GAERlE,UAAU4J,gBAAkB,SAAS7I,EAAK8I,IACpC9I,GAAOE,KAAK0D,YAAc1D,KAAK0D,WAAWoB,aAC1C8D,IAAS,GAAKvF,OAAQF,UAAYnD,KAAK0D,WAAWM,SAASb,UAAY,OAC1ErD,EAAME,KAAK0D,WAAWoB,YAEnBhF,IACLA,EAAImB,QAAU,KACdnB,EAAIiC,UAAY,GACZjC,EAAIK,YACPL,EAAIK,WAAW0I,YAAY/I,GACxBE,KAAK0D,aACR1D,KAAK0D,WAAWK,MAAMjD,IAAM;EAE9B/B,UAAU+J,kBAAoB,WAC7B,MAAI9I,MAAK0D,YAAc5B,SAAS9B,KAAK0D,WAAWK,MAAMjD,IAAK,IAAM,EACzDd,KAAK0D,YACN,GAGR3E,UAAUgK,uBAAyB,WAClCC,YAAYvI,SAASoD,KAAM,QAAS,WAAa9E,UAAU4J,oBAC3D5J,UAAUgK,uBAAyB,cAGpChK,UAAUkK,YAAY,mBAAoB,WACzClK,UAAUgK,2BAGXhK,UAAUC,UAAUkK,cAAgBnK,UAAUG,KAAKC,YAAY,YAE/DJ,UAAUoK,YAAYD,eACrBE,OAAQ,WACP,GAAIC,GAAO,2DAEPC,EAAMvK,UAAUO,OAChBiK,EAAKvJ,KAAKd,KAAKkE,UAAUrE,UAAUgB,gBAEnCyJ,EAAO,KAASC,EAAQ,CACxBH;EAAII,oBACPD,EAAQ,GAAKH,EAAIK,WACjBH,EAAO,GAAKF,EAAIM,UAAY,GAE7BL,EAAGM,SAASJ,EAAQ,IAEpBJ,GAAQ,WACR,KAAK,GAAIxG,GAAI4G,EAAWD,EAAJ3G,EAAUA,GAA6B,EAAxB7C,KAAKV,OAAOwK,UAAe,CAC7D,GAAIC,GAAO/J,KAAKhB,UAAUgL,YAAYT,EACtCF,IAAQ,kBAAoBxG,EAAI,KAAOkH,EAAO,YAC9CR,EAAKvJ,KAAKd,KAAKsD,IAAI+G,EAAIvJ,KAAKV,OAAOwK,UAAW,UAE/CT,GAAQ,WAEOtK,WAAUO,OAAO2K,QAEhC,OAAO,uFAAyFZ,EAAO,iFAAmFA,EAAO,UAElMa,UAAW,SAASC,EAAMC,EAAOrH,GAkFhC,QAASsH,GAAeC,EAAKpL,EAAMqL,GAClCC,EAAWF,EAAKpL,EAAMqL,GACtBD,EAAIF,MAAQrL,UAAUC,UAAUkK,cAAchK,GAC9CoL,EAAI1D,MAAQ7H,UAAUG,KAAKkE,UAAU,GAAIC,MAAKnE;CAnF/C,GAEIgE,GACHI,EAHGmH,EAASN,EAAKO,qBAAqB,SACnCC,EAAUR,EAAKO,qBAAqB,UAIpCF,EAAa,SAASF,EAAKpL,EAAMqL,GACpCD,EAAIrJ,QAAU,WACblC,UAAU4J,gBAAgB,MAAM,GAChC5J,UAAUW,gBACTc,SAAU8J,EACVpL,KAAM,GAAImE,MAAKrD,KAAK4G,OACpBS,YAAY,EACZlF,QAAS,SAASyI,GACjBN,EAAIF,MAAQrL,UAAUC,UAAUkK,cAAc0B,GAC9CN,EAAI1D,MAAQ,GAAIvD,MAAKuH,GACrB7L,UAAU4J,kBACN5J,UAAUO,OAAOuL,gBAAkB9L,UAAUO,OAAOwL,eAA4B,IAAXP,GACxEQ,QAOL,IAAIhM,UAAUO,OAAO2K,SAAU,CAC9B,IAAKE,EAAKa,UAAW,CACpB,GAAI3B,GAAO,mFAAqFtK,UAAUkM,OAAOC,OAAOjB,SAAW,wBAC9HlL;UAAUO,OAAO6L,YACrB9B,EAAOc,EAAKiB,gBAAgBrJ,UAAYsH,GACzCc,EAAKiB,gBAAgBrJ,UAAYsH,EACjCc,EAAKa,WAAY,EAElB,GAAIK,GAAQlB,EAAKiB,gBAAgBV,qBAAqB,SAAS,GAE3DY,EAA8D,IAA5CvM,UAAUG,KAAKqM,UAAUxI,EAAGG,aAA+D,IAA1CnE,UAAUG,KAAKqM,UAAUxI,EAAGO,SACnG+H,GAAMG,QAAUF,EAEhBX,EAAQ,GAAGc,SAAWJ,EAAMG,QAC5Bb,EAAQ,GAAGc,SAAWJ,EAAMG,QAE5BH,EAAMpK,QAAU,WACf,GAAIoK,EAAMG,WAAY,EAAM,CAC3B,GAAI7L,KACJZ,WAAUoK,YAAYD,cAAcwC,UAAUvB,EAAMxK,GAEpDuD,EAAanE,UAAUG,KAAKkE,UAAUzD,EAAIuD,YAC1CI,EAAWvE,UAAUG,KAAKkE,UAAUzD,EAAI2D,YAEnCA,IAAaJ,IAAgBI,IAAaJ,IAA0C,IAA3BH,EAAGO,SAASqI,YAAiD,IAA7B5I,EAAGO,SAASsI,iBACzGtI,EAAWvE,UAAUG,KAAKsD,IAAIc,EAAU,EAAG;CAG7C,GAAIjB,GAAQa,GAAcH,EAAGG,WACzBX,EAAMe,GAAYP,EAAGO,QACzB+G,GAAeI,EAAO,GAAIpI,GAC1BgI,EAAeI,EAAO,GAAIlI,GAC1BoI,EAAQ,GAAGP,MAA2B,GAAnB/H,EAAMsJ,WAAkBtJ,EAAMuJ,aACjDjB,EAAQ,GAAGP,MAAyB,GAAjB7H,EAAIoJ,WAAkBpJ,EAAIqJ,aAE7CjB,EAAQ,GAAGc,SAAWJ,EAAMG,QAC5Bb,EAAQ,GAAGc,SAAWJ,EAAMG,SAK9B,GAAIzM,UAAUO,OAAOuL,gBAAkB9L,UAAUO,OAAOwL,cAAe,CAEtE,GAAIC,GAAyB,WAC5B7H,EAAanE,UAAUG,KAAKsD,IAAIiI,EAAO,GAAG7D,MAAO+D,EAAQ,GAAGP,MAAO,UACnE9G,EAAW,GAAID,MAAKH,EAAW2I,UAA+C,GAAlC9M,UAAUO,OAAOuL,eAAsB,KAEnFJ,EAAO,GAAGL,MAAQrL,UAAUC,UAAUkK,cAAc5F,GACpDmH,EAAO,GAAG7D,MAAQ7H,UAAUG,KAAKkE,UAAU,GAAIC,MAAKC,IAEpDqH,EAAQ,GAAGP,MAA8B,GAAtB9G,EAASqI,WAAkBrI,EAASsI;CAGxDjB,GAAQ,GAAGmB,SAAWf,EASvBV,EAAeI,EAAO,GAAI1H,EAAGG,WAAY,GACzCmH,EAAeI,EAAO,GAAI1H,EAAGO,SAAU,GACvCkH,EAAa,aAEbG,EAAQ,GAAGP,MAAmC,GAA3BrH,EAAGG,WAAWyI,WAAkB5I,EAAGG,WAAW0I,aACjEjB,EAAQ,GAAGP,MAAiC,GAAzBrH,EAAGO,SAASqI,WAAkB5I,EAAGO,SAASsI,cAG9DF,UAAW,SAASvB,EAAMpH,GACzB,GAAI0H,GAASN,EAAKO,qBAAqB,SACnCC,EAAUR,EAAKO,qBAAqB,SAOxC,OALA3H,GAAGG,WAAanE,UAAUG,KAAKsD,IAAIiI,EAAO,GAAG7D,MAAO+D,EAAQ,GAAGP,MAAO,UACtErH,EAAGO,SAAWvE,UAAUG,KAAKsD,IAAIiI,EAAO,GAAG7D,MAAO+D,EAAQ,GAAGP,MAAO,UAEhErH,EAAGO,UAAYP,EAAGG,aACrBH,EAAGO,SAAWvE,UAAUG,KAAKsD,IAAIO,EAAGG,WAAYnE,UAAUO,OAAOwK,UAAW,YAE5E5G,WAAY,GAAIG,MAAKN,EAAGG,YACxBI,SAAU,GAAID,MAAKN,EAAGO;EAGxByI,MAAO,cAGRhN,UAAUiN,aAAe,SAASzE,EAAU0E,GAC3C,GAAIC,GAAS,WACZ,GAAIhN,GAAOH,UAAU6H,MACjBuF,EAAU,GAAI9I,MAAKnE,EAAKiE,UAI5B,OAHI8I,KAAUE,EAAUF,EAASE,IACjCA,EAAQtK,QAAQ,GAChB9C,UAAUgH,eAAewB,EAAU4E,IAC5B,EAGRpN,WAAUkK,YAAY,eAAgBiD,GACtCnN,UAAUkK,YAAY,QAASiD,GAC/BnN,UAAUkK,YAAY,eAAgBiD,GACtCnN,UAAUkK,YAAY,iBAAkBiD,GACxCnN,UAAUkK,YAAY,qBAAsBiD,GAC5CA,KAGDnN,UAAUwE,yBAA2B,SAASgE,GAC7C,GAAIrI,GAAOH,UAAU6H,MACjBwF,EAAOrN,UAAU6D,MACjBN,EAAcvD,UAAUG,KAAKoD,YAAY,GAAIe,MAAKkE,EAASX,QAC3DyF,EAAYtN,UAAUG,KAAKsD,IAAIF,EAAa,EAAG,QAEnD;GAAY,OAAR8J,GAAkBpM,KAAKsM,QAAYtM,KAAKsM,OAAOF,GAC9C9J,EAAYa,WAAajE,EAAKiE,WAAakJ,EAAYnN,GAC1DH,UAAUiD,aAAauF,EAAUrI,EAAM,0BAElC,IAAY,QAARkN,EAEV,IAAK,GADDD,GAAUpN,UAAUG,KAAKuG,WAAW,GAAIpC,MAAKnE,EAAKiE,YAC7CN,EAAI,EAAO,EAAJA,EAAOA,IAClBP,EAAYa,WAAagJ,EAAQhJ,WAAakJ,EAAYF,GAC7DpN,UAAUiD,aAAauF,EAAU4E,EAAS,sBAC3CA,EAAUpN,UAAUG,KAAKsD,IAAI2J,EAAS,EAAG,QAK5CpN,UAAUkK,YAAY,gBAAiB,WACtClK,UAAU4J,gBAAgB,MAAM"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_monthheight.js b/codebase/sources/ext/dhtmlxscheduler_monthheight.js
new file mode 100644
index 0000000..ccf6611
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_monthheight.js
@@ -0,0 +1,34 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+scheduler.attachEvent("onTemplatesReady",function(){
+ scheduler.xy.scroll_width = 0;
+
+ var old = scheduler.render_view_data;
+ scheduler.render_view_data=function(){
+ var data = this._els["dhx_cal_data"][0];
+ data.firstChild._h_fix = true;
+
+ old.apply(scheduler,arguments);
+
+
+
+ var height = parseInt(data.style.height);
+ data.style.height="1px";
+ data.style.height=data.scrollHeight+"px";
+
+ this._obj.style.height = this._obj.clientHeight + data.scrollHeight - height + "px";
+ };
+
+ var old_s=scheduler._reset_month_scale;
+ scheduler._reset_month_scale=function(a,b,c){
+ var dummy = {clientHeight:100};
+ old_s.apply(scheduler,[dummy,b,c]);
+ a.innerHTML = dummy.innerHTML;
+ };
+
+}); \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_monthheight.js.map b/codebase/sources/ext/dhtmlxscheduler_monthheight.js.map
new file mode 100644
index 0000000..47ff310
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_monthheight.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_monthheight.js.map","sources":["dhtmlxscheduler_monthheight.js"],"names":["scheduler","attachEvent","xy","scroll_width","old","render_view_data","data","this","_els","firstChild","_h_fix","apply","arguments","height","parseInt","style","scrollHeight","_obj","clientHeight","old_s","_reset_month_scale","a","b","c","dummy","innerHTML"],"mappings":"AAAAA,UAAUC,YAAY,mBAAmB,WACxCD,UAAUE,GAAGC,aAAe,CAE5B,IAAIC,GAAMJ,UAAUK,gBACpBL,WAAUK,iBAAiB,WAC1B,GAAIC,GAAOC,KAAKC,KAAmB,aAAE,EACrCF,GAAKG,WAAWC,QAAS,EAEzBN,EAAIO,MAAMX,UAAUY,UAIpB,IAAIC,GAASC,SAASR,EAAKS,MAAMF,OACjCP,GAAKS,MAAMF,OAAO,MAClBP,EAAKS,MAAMF,OAAOP,EAAKU,aAAa,KAEpCT,KAAKU,KAAKF,MAAMF,OAASN,KAAKU,KAAKC,aAAeZ,EAAKU,aAAeH,EAAS,KAGhF,IAAIM,GAAMnB,UAAUoB,kBACpBpB,WAAUoB,mBAAmB,SAASC,EAAEC,EAAEC,GACzC,GAAIC,IAASN,aAAa,IAC1BC,GAAMR,MAAMX,WAAWwB,EAAMF,EAAEC,IAC/BF,EAAEI,UAAYD,EAAMC"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_multisection.js b/codebase/sources/ext/dhtmlxscheduler_multisection.js
new file mode 100644
index 0000000..90c59e0
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_multisection.js
@@ -0,0 +1,254 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+scheduler.config.multisection = true;
+scheduler.config.section_delemiter = ",";
+scheduler.attachEvent("onSchedulerReady", function(){
+
+
+ var old_unit = scheduler._update_unit_section;
+ scheduler._update_unit_section = function(action){
+ return scheduler._update_sections(action, old_unit);
+ };
+ var old_timeline = scheduler._update_timeline_section;
+ scheduler._update_timeline_section =function(action){
+ return scheduler._update_sections(action, old_timeline);
+ };
+
+
+ scheduler.isMultisectionEvent = function(ev){
+ if(ev && this._get_multisection_view()){
+ var units = this._get_event_sections(ev);
+ return (units.length > 1);
+ }
+ return false;
+ };
+
+ scheduler._get_event_sections = function(event){
+ var mapping = this._get_section_property();
+ var units = event[mapping] || "";
+ return this._parse_event_sections(units);
+ };
+ scheduler._parse_event_sections = function(value){
+ if(value instanceof Array){
+ return value;
+ }else{
+ return value.toString().split(scheduler.config.section_delemiter);
+ }
+ };
+
+ scheduler._register_copies_array = function(evs){
+ for(var i=0; i < evs.length; i++)
+ this._register_copy(evs[i]);
+ };
+ scheduler._register_copy = function(copy){
+ if(!this._multisection_copies[copy.id]){
+ this._multisection_copies[copy.id] = {};
+ }
+ var section = copy[this._get_section_property()];
+ var evs = this._multisection_copies[copy.id];
+ if(!evs[section]){
+ evs[section] = copy;
+ }
+ };
+ scheduler._get_copied_event = function(event_id, section){
+ if(!this._multisection_copies[event_id])
+ return null;
+
+ if(this._multisection_copies[event_id][section])
+ return this._multisection_copies[event_id][section];
+
+ var parts = this._multisection_copies[event_id];
+ //multisection event has not been rendered in this section, need retrieve state of one of rendered events
+ if(scheduler._drag_event && scheduler._drag_event._orig_section && parts[scheduler._drag_event._orig_section]){
+ return parts[scheduler._drag_event._orig_section];
+ }else{
+ var min_sorder = Infinity,
+ ev = null;
+ for(var i in parts){
+ if(parts[i]._sorder < min_sorder){
+ ev = parts[i];
+ min_sorder = parts[i]._sorder;
+ }
+ }
+ return ev;
+ }
+ };
+ scheduler._clear_copied_events = function(){
+ this._multisection_copies = {};
+ };
+ scheduler._clear_copied_events();
+
+ scheduler._split_events = function(evs) {
+ var stack = [];
+ var pr = this._get_multisection_view();
+ var mapping = this._get_section_property();
+ if(pr) {
+ for (var i=0; i<evs.length; i++) {
+ var units = this._get_event_sections(evs[i]);
+
+ if(units.length > 1) {
+ for (var j=0; j<units.length; j++) {
+ if(typeof pr.order[units[j]] === "undefined")
+ continue;
+ var ev = this._lame_copy({}, evs[i]);
+ ev[mapping] = units[j];
+ stack.push(ev);
+ }
+ } else {
+ stack.push(evs[i]);
+ }
+
+ }
+ }else{
+ stack = evs;
+ }
+ return stack;
+ };
+
+
+ scheduler._get_multisection_view = function(){
+ if(!this.config.multisection){
+ return false;
+ }else{
+ return scheduler._get_section_view();
+ }
+ };
+
+ var vis_evs = scheduler.get_visible_events;
+ scheduler.get_visible_events = function(only_timed) {
+ this._clear_copied_events();
+ var evs = vis_evs.apply(this,arguments);
+ var pr = this._get_multisection_view();
+ if (this._get_multisection_view()){
+ evs = this._split_events(evs);
+ this._register_copies_array(evs);
+ }
+
+ return evs;
+ };
+
+ scheduler._rendered_events = {};
+ var old_view_data = scheduler.render_view_data;
+ scheduler.render_view_data = function(evs, hold) {
+ if (this._get_multisection_view() && evs) {
+ //render single event during dnd, restore flags that were calculated during full render
+ evs = this._split_events(evs);
+ this._restore_render_flags(evs);
+ }
+
+ return old_view_data.apply(this,[evs, hold]);
+ };
+ scheduler._restore_render_flags = function(section_evs){
+ var map_to = this._get_section_property();
+ for(var i=0; i < section_evs.length; i++){
+ var ev = section_evs[i];
+ var prev_state = scheduler._get_copied_event(ev.id, ev[map_to]);
+ if(prev_state){
+ for(var p in prev_state){
+ if(p.indexOf("_") === 0){
+ ev[p] = prev_state[p];
+ }
+ }
+ }
+ }
+ };
+ scheduler._update_sections = function(action, def_handler){
+ var view = action.view,
+ event = action.event,
+ pos = action.pos;
+ //view - timeline or units view object. both stores displayed sections in 'view.order' hash
+ // pos - mouse position, calculated in _mouse_coords method
+ // event - scheduler event
+
+ if(!scheduler.isMultisectionEvent(event)){
+ def_handler.apply(scheduler, [action]);
+ }else{
+ if(!scheduler._drag_event._orig_section){
+ scheduler._drag_event._orig_section = pos.section;
+ }
+
+ if(scheduler._drag_event._orig_section != pos.section){
+ var shift = (view.order[pos.section] - view.order[scheduler._drag_event._orig_section]);
+ if(shift){
+ var sections = this._get_event_sections(event);
+ var new_sections = [];
+ var shifted = true;
+ for(var i=0; i<sections.length; i++){
+ var new_section = scheduler._shift_sections(view, sections[i], shift);
+ if(new_section !== null){
+ new_sections[i] = new_section;
+ }else{
+ new_sections = sections;
+ shifted = false;
+ break;
+
+ }
+ }
+ if(shifted)
+ scheduler._drag_event._orig_section = pos.section;
+
+ event[scheduler._get_section_property()] = new_sections.join(",");
+ }
+
+ }
+ }
+ };
+
+ scheduler._shift_sections = function(matrix, orig_section, shift){
+ for(var i in matrix.order){
+ if(matrix.order[i] - matrix.order[orig_section] == shift){
+ return i;
+ }
+ }
+ return null;
+ };
+
+
+ // limit extension
+
+ var old_get_blocked_zones = scheduler._get_blocked_zones;
+ scheduler._get_blocked_zones = function(timespans, property, day_index, day_value, timespan_type){
+ if(property && this.config.multisection){
+ property = this._parse_event_sections(property);
+ var zones = [];
+ for(var i =0; i < property.length; i++){
+ zones = zones.concat(old_get_blocked_zones.apply(this, [timespans, property[i], day_index, day_value, timespan_type]));
+ }
+ return zones;
+ }else{
+ return old_get_blocked_zones.apply(this, arguments);
+ }
+ };
+
+
+ // collision extension
+ var old_check_secions_collision = scheduler._check_sections_collision;
+
+ scheduler._check_sections_collision = function(a, b){
+ if(this.config.multisection && this._get_section_view()){
+ a = this._split_events([a]);
+ b = this._split_events([b]);
+
+ var collision = false;
+ for(var a_ind = 0, a_len = a.length; a_ind < a_len; a_ind++){
+ if(collision){
+ break;
+ }
+ for(var b_ind = 0, b_len = b.length; b_ind < b_len; b_ind++){
+ if(old_check_secions_collision.apply(this, [a[a_ind], b[b_ind]])){
+ collision = true;
+ break;
+ }
+ }
+ }
+ return collision;
+ }else{
+ return old_check_secions_collision.apply(this, arguments);
+ }
+ };
+}); \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_multisection.js.map b/codebase/sources/ext/dhtmlxscheduler_multisection.js.map
new file mode 100644
index 0000000..1645dcd
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_multisection.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_multisection.js.map","sources":["dhtmlxscheduler_multisection.js"],"names":["scheduler","config","multisection","section_delemiter","attachEvent","old_unit","_update_unit_section","action","_update_sections","old_timeline","_update_timeline_section","isMultisectionEvent","ev","this","_get_multisection_view","units","_get_event_sections","length","event","mapping","_get_section_property","_parse_event_sections","value","Array","toString","split","_register_copies_array","evs","i","_register_copy","copy","_multisection_copies","id","section","_get_copied_event","event_id","parts","_drag_event","_orig_section","min_sorder","Infinity","_sorder","_clear_copied_events","_split_events","stack","pr","j","order","_lame_copy","push","_get_section_view","vis_evs","get_visible_events","apply","arguments","_rendered_events","old_view_data","render_view_data","hold","_restore_render_flags","section_evs","map_to","prev_state","p","indexOf","def_handler","view","pos","shift","sections","new_sections","shifted","new_section","_shift_sections","join","matrix","orig_section","old_get_blocked_zones","_get_blocked_zones","timespans","property","day_index","day_value","timespan_type","zones","concat","old_check_secions_collision","_check_sections_collision","a","b","collision","a_ind","a_len","b_ind","b_len"],"mappings":"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"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_multiselect.js b/codebase/sources/ext/dhtmlxscheduler_multiselect.js
new file mode 100644
index 0000000..c797198
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_multiselect.js
@@ -0,0 +1,69 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+scheduler.form_blocks["multiselect"]={
+ render:function(sns) {
+ var _result = "<div class='dhx_multi_select_"+sns.name+"' style='overflow: auto; height: "+sns.height+"px; position: relative;' >";
+ for (var i=0; i<sns.options.length; i++) {
+ _result += "<label><input type='checkbox' value='"+sns.options[i].key+"'/>"+sns.options[i].label+"</label>";
+ if(convertStringToBoolean(sns.vertical)) _result += '<br/>';
+ }
+ _result += "</div>";
+ return _result;
+ },
+ set_value:function(node,value,ev,config){
+
+ var _children = node.getElementsByTagName('input');
+ for(var i=0;i<_children.length;i++) {
+ _children[i].checked = false; //unchecking all inputs on the form
+ }
+
+ function _mark_inputs(ids) { // ids = [ 0: undefined, 1: undefined, 2: true ... ]
+ var _children = node.getElementsByTagName('input');
+ for(var i=0;i<_children.length; i++) {
+ _children[i].checked = !! ids[_children[i].value];
+ }
+ }
+
+ var _ids = [];
+ if (ev[config.map_to]) {
+ var results = (ev[config.map_to] + "").split(',');
+ for (var i = 0; i < results.length; i++) {
+ _ids[results[i]] = true;
+ }
+ _mark_inputs(_ids);
+ } else {
+ if (scheduler._new_event || !config.script_url)
+ return;
+ var divLoading = document.createElement('div');
+ divLoading.className = 'dhx_loading';
+ divLoading.style.cssText = "position: absolute; top: 40%; left: 40%;";
+ node.appendChild(divLoading);
+ dhtmlxAjax.get(config.script_url + '?dhx_crosslink_' + config.map_to + '=' + ev.id + '&uid=' + scheduler.uid(), function(loader) {
+ var _result = loader.doXPath("//data/item");
+ var _ids = [];
+ for (var i = 0; i < _result.length; i++) {
+ _ids[_result[i].getAttribute(config.map_to)] = true;
+ }
+ _mark_inputs(_ids);
+ node.removeChild(divLoading);
+ });
+ }
+ },
+ get_value:function(node,ev,config){
+ var _result = [];
+ var _children = node.getElementsByTagName("input");
+ for(var i=0;i<_children.length;i++) {
+ if(_children[i].checked)
+ _result.push(_children[i].value);
+ }
+ return _result.join(',');
+ },
+
+ focus:function(node){
+ }
+}; \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_multiselect.js.map b/codebase/sources/ext/dhtmlxscheduler_multiselect.js.map
new file mode 100644
index 0000000..c9b43ed
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_multiselect.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_multiselect.js.map","sources":["dhtmlxscheduler_multiselect.js"],"names":["scheduler","form_blocks","render","sns","_result","name","height","i","options","length","key","label","convertStringToBoolean","vertical","set_value","node","value","ev","config","_mark_inputs","ids","_children","getElementsByTagName","checked","_ids","map_to","results","split","_new_event","script_url","divLoading","document","createElement","className","style","cssText","appendChild","dhtmlxAjax","get","id","uid","loader","doXPath","getAttribute","removeChild","get_value","push","join","focus"],"mappings":"AAAAA,UAAUC,YAAyB,aAClCC,OAAO,SAASC,GAEf,IAAK,GADDC,GAAU,gCAAgCD,EAAIE,KAAK,oCAAoCF,EAAIG,OAAO,6BAC7FC,EAAE,EAAGA,EAAEJ,EAAIK,QAAQC,OAAQF,IACnCH,GAAW,wCAAwCD,EAAIK,QAAQD,GAAGG,IAAI,MAAMP,EAAIK,QAAQD,GAAGI,MAAM,WAC9FC,uBAAuBT,EAAIU,YAAWT,GAAW,QAGrD,OADAA,IAAW,UAGZU,UAAU,SAASC,EAAKC,EAAMC,EAAGC,GAOhC,QAASC,GAAaC,GAErB,IAAI,GADAC,GAAYN,EAAKO,qBAAqB,SAClCf,EAAE,EAAEA,EAAEc,EAAUZ,OAAQF,IAC/Bc,EAAUd,GAAGgB,UAAaH,EAAIC,EAAUd,GAAGS,OAP7C,IAAI,GADAK,GAAYN,EAAKO,qBAAqB,SAClCf,EAAE,EAAEA,EAAEc,EAAUZ,OAAOF,IAC9Bc,EAAUd,GAAGgB,SAAU,CAUxB;GAAIC,KACJ,IAAIP,EAAGC,EAAOO,QAAS,CAEtB,IAAK,GADDC,IAAWT,EAAGC,EAAOO,QAAU,IAAIE,MAAM,KACpCpB,EAAI,EAAGA,EAAImB,EAAQjB,OAAQF,IACnCiB,EAAKE,EAAQnB,KAAM,CAEpBY,GAAaK,OACP,CACN,GAAIxB,UAAU4B,aAAeV,EAAOW,WACnC,MACD,IAAIC,GAAaC,SAASC,cAAc,MACxCF,GAAWG,UAAY,cACvBH,EAAWI,MAAMC,QAAU,2CAC3BpB,EAAKqB,YAAYN,GACjBO,WAAWC,IAAIpB,EAAOW,WAAa,kBAAoBX,EAAOO,OAAS,IAAMR,EAAGsB,GAAK,QAAUvC,UAAUwC,MAAO,SAASC,GAGxH,IAAK,GAFDrC,GAAUqC,EAAOC,QAAQ,eACzBlB,KACKjB,EAAI,EAAGA,EAAIH,EAAQK,OAAQF,IACnCiB,EAAKpB,EAAQG,GAAGoC,aAAazB,EAAOO,UAAW,CAEhDN,GAAaK,GACbT,EAAK6B,YAAYd;KAIpBe,UAAU,SAAS9B,GAGlB,IAAI,GAFAX,MACAiB,EAAYN,EAAKO,qBAAqB,SAClCf,EAAE,EAAEA,EAAEc,EAAUZ,OAAOF,IAC3Bc,EAAUd,GAAGgB,SACfnB,EAAQ0C,KAAKzB,EAAUd,GAAGS,MAE5B,OAAOZ,GAAQ2C,KAAK,MAGrBC,MAAM"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_multisource.js b/codebase/sources/ext/dhtmlxscheduler_multisource.js
new file mode 100644
index 0000000..09194bc
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_multisource.js
@@ -0,0 +1,29 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+(function(){
+
+ function backup(obj){
+ var t = function(){};
+ t.prototype = obj;
+ return t;
+ }
+
+ var old = scheduler._load;
+ scheduler._load=function(url,from){
+ url=url||this._load_url;
+ if (typeof url == "object"){
+ var t = backup(this._loaded);
+ for (var i=0; i < url.length; i++) {
+ this._loaded=new t();
+ old.call(this,url[i],from);
+ }
+ } else
+ old.apply(this,arguments);
+ };
+
+})(); \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_multisource.js.map b/codebase/sources/ext/dhtmlxscheduler_multisource.js.map
new file mode 100644
index 0000000..910606c
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_multisource.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_multisource.js.map","sources":["dhtmlxscheduler_multisource.js"],"names":["backup","obj","t","prototype","old","scheduler","_load","url","from","this","_load_url","_loaded","i","length","call","apply","arguments"],"mappings":"CAAA,WAEC,QAASA,GAAOC,GACf,GAAIC,GAAI,YAER,OADAA,GAAEC,UAAYF,EACPC,EAGR,GAAIE,GAAMC,UAAUC,KACpBD,WAAUC,MAAM,SAASC,EAAIC,GAE5B,GADAD,EAAIA,GAAKE,KAAKC,UACI,gBAAPH,GAEV,IAAK,GADDL,GAAIF,EAAOS,KAAKE,SACXC,EAAE,EAAGA,EAAIL,EAAIM,OAAQD,IAC7BH,KAAKE,QAAQ,GAAIT,GACjBE,EAAIU,KAAKL,KAAKF,EAAIK,GAAGJ,OAGtBJ,GAAIW,MAAMN,KAAKO"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_mvc.js b/codebase/sources/ext/dhtmlxscheduler_mvc.js
new file mode 100644
index 0000000..f3009cd
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_mvc.js
@@ -0,0 +1,147 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+(function(){
+
+ var cfg = {
+ use_id : false
+ };
+
+ //remove private properties
+ function sanitize(ev){
+ var obj = {};
+ for (var key in ev)
+ if (key.indexOf("_") !== 0)
+ obj[key] = ev[key];
+
+ if (!cfg.use_id)
+ delete obj.id;
+
+ return obj;
+ }
+
+ var update_timer;
+ function update_view(){
+ clearTimeout(update_timer);
+ update_timer = setTimeout(function(){
+ scheduler.updateView();
+ },1);
+ }
+
+ function _start_ext_load(cal){
+ cal._loading = true;
+ cal._not_render = true;
+
+ cal.callEvent("onXLS", []);
+ }
+ function _finish_ext_load(cal){
+ cal._not_render = false;
+ if (cal._render_wait)
+ cal.render_view_data();
+ cal._loading = false;
+
+ cal.callEvent("onXLE", []);
+ }
+
+
+ function _get_id(model){
+ return cfg.use_id ? model.id : model.cid;
+ }
+
+scheduler.backbone = function(events, config){
+ if (config) cfg = config;
+
+ events.bind("change", function(model, info){
+ var cid = _get_id(model);
+ var ev = scheduler._events[cid] = model.toJSON();
+ ev.id = cid;
+
+ scheduler._init_event(ev);
+ update_view();
+ });
+ events.bind("remove", function(model, changes){
+ var cid = _get_id(model);
+ if (scheduler._events[cid])
+ scheduler.deleteEvent(cid);
+ });
+
+ var queue = [];
+ function add_from_queue(){
+ if (queue.length){
+ scheduler.parse(queue, "json");
+ queue = [];
+ }
+ }
+
+ events.bind("add", function(model, changes){
+ var cid = _get_id(model);
+ if (!scheduler._events[cid]){
+ var ev = model.toJSON();
+ ev.id = cid;
+ scheduler._init_event(ev);
+
+ queue.push(ev);
+ if (queue.length == 1)
+ setTimeout(add_from_queue,1);
+ }
+ });
+
+ events.bind("request", function(obj){
+ if (obj instanceof Backbone.Collection)
+ _start_ext_load(scheduler);
+ });
+ events.bind("sync", function(obj){
+ if (obj instanceof Backbone.Collection)
+ _finish_ext_load(scheduler);
+ });
+ events.bind("error", function(obj){
+ if (obj instanceof Backbone.Collection)
+ _finish_ext_load(scheduler);
+ });
+
+
+ scheduler.attachEvent("onEventCreated", function(id){
+ var ev = new events.model(scheduler.getEvent(id));
+ scheduler._events[id] = ev.toJSON();
+ scheduler._events[id].id = id;
+
+ return true;
+ });
+
+ scheduler.attachEvent("onEventAdded", function(id){
+ if (!events.get(id)){
+ var data = sanitize(scheduler.getEvent(id));
+ var model = new events.model(data);
+
+ var cid = _get_id(model);
+ if (cid != id)
+ this.changeEventId(id, cid);
+ events.add(model);
+ events.trigger("scheduler:add", model);
+ }
+ return true;
+ });
+ scheduler.attachEvent("onEventChanged", function(id){
+ var ev = events.get(id);
+ var upd = sanitize(scheduler.getEvent(id));
+
+ ev.set(upd);
+ events.trigger("scheduler:change", ev);
+
+ return true;
+ });
+ scheduler.attachEvent("onEventDeleted", function(id){
+ var model = events.get(id);
+ if (model){
+ events.trigger("scheduler:remove", model);
+ events.remove(id);
+ }
+ return true;
+ });
+};
+
+})(); \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_mvc.js.map b/codebase/sources/ext/dhtmlxscheduler_mvc.js.map
new file mode 100644
index 0000000..668f82d
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_mvc.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_mvc.js.map","sources":["dhtmlxscheduler_mvc.js"],"names":["sanitize","ev","obj","key","indexOf","cfg","use_id","id","update_view","clearTimeout","update_timer","setTimeout","scheduler","updateView","_start_ext_load","cal","_loading","_not_render","callEvent","_finish_ext_load","_render_wait","render_view_data","_get_id","model","cid","backbone","events","config","add_from_queue","queue","length","parse","bind","_events","toJSON","_init_event","deleteEvent","push","Backbone","Collection","attachEvent","getEvent","get","data","this","changeEventId","add","trigger","upd","set","remove"],"mappings":"CAAA,WAOC,QAASA,GAASC,GACjB,GAAIC,KACJ,KAAK,GAAIC,KAAOF,GACU,IAArBE,EAAIC,QAAQ,OACfF,EAAIC,GAAOF,EAAGE,GAKhB,OAHKE,GAAIC,cACDJ,GAAIK,GAELL,EAIR,QAASM,KACRC,aAAaC,GACbA,EAAeC,WAAW,WACzBC,UAAUC,cACT,GAGH,QAASC,GAAgBC,GACxBA,EAAIC,UAAW,EACfD,EAAIE,aAAc,EAElBF,EAAIG,UAAU,YAEf,QAASC,GAAiBJ,GACzBA,EAAIE,aAAc,EACdF,EAAIK,cACPL,EAAIM,mBACLN,EAAIC,UAAW,EAEfD,EAAIG,UAAU,YAIf,QAASI,GAAQC,GAChB,MAAOlB,GAAIC,OAASiB,EAAMhB,GAAKgB,EAAMC,IA1CtC,GAiBId,GAjBAL,GACHC,QAAS,EA4CXM,WAAUa,SAAW,SAASC,EAAQC,GAkBrC,QAASC,KACJC,EAAMC,SACTlB,UAAUmB,MAAMF,EAAO,QACvBA;CApBEF,IAAQtB,EAAMsB,GAElBD,EAAOM,KAAK,SAAU,SAAST,GAC9B,GAAIC,GAAMF,EAAQC,GACdtB,EAAKW,UAAUqB,QAAQT,GAAOD,EAAMW,QACxCjC,GAAGM,GAAKiB,EAERZ,UAAUuB,YAAYlC,GACtBO,MAEDkB,EAAOM,KAAK,SAAU,SAAST,GAC9B,GAAIC,GAAMF,EAAQC,EACdX,WAAUqB,QAAQT,IACrBZ,UAAUwB,YAAYZ,IAGxB,IAAIK,KAQJH,GAAOM,KAAK,MAAO,SAAST,GAC3B,GAAIC,GAAMF,EAAQC,EAClB,KAAKX,UAAUqB,QAAQT,GAAK,CAC3B,GAAIvB,GAAMsB,EAAMW,QAChBjC,GAAGM,GAAKiB,EACRZ,UAAUuB,YAAYlC,GAEtB4B,EAAMQ,KAAKpC,GACS,GAAhB4B,EAAMC,QACTnB,WAAWiB,EAAe,MAI7BF,EAAOM,KAAK,UAAW,SAAS9B,GAC3BA,YAAeoC,UAASC,YAC3BzB,EAAgBF,aAElBc,EAAOM,KAAK,OAAQ,SAAS9B,GACxBA,YAAeoC,UAASC,YAC3BpB,EAAiBP;GAEnBc,EAAOM,KAAK,QAAS,SAAS9B,GACzBA,YAAeoC,UAASC,YAC3BpB,EAAiBP,aAInBA,UAAU4B,YAAY,iBAAkB,SAASjC,GAChD,GAAIN,GAAK,GAAIyB,GAAOH,MAAMX,UAAU6B,SAASlC,GAI7C,OAHAK,WAAUqB,QAAQ1B,GAAMN,EAAGiC,SAC3BtB,UAAUqB,QAAQ1B,GAAIA,GAAKA,GAEpB,IAGRK,UAAU4B,YAAY,eAAgB,SAASjC,GAC9C,IAAKmB,EAAOgB,IAAInC,GAAI,CACnB,GAAIoC,GAAO3C,EAASY,UAAU6B,SAASlC,IACnCgB,EAAQ,GAAIG,GAAOH,MAAMoB,GAEzBnB,EAAMF,EAAQC,EACdC,IAAOjB,GACVqC,KAAKC,cAActC,EAAIiB,GACxBE,EAAOoB,IAAIvB,GACXG,EAAOqB,QAAQ,gBAAiBxB,GAEjC,OAAO,IAERX,UAAU4B,YAAY,iBAAkB,SAASjC,GAChD,GAAIN,GAAKyB,EAAOgB,IAAInC,GAChByC,EAAMhD,EAASY,UAAU6B,SAASlC,GAKtC;MAHAN,GAAGgD,IAAID,GACPtB,EAAOqB,QAAQ,mBAAoB9C,IAE5B,IAERW,UAAU4B,YAAY,iBAAkB,SAASjC,GAChD,GAAIgB,GAAQG,EAAOgB,IAAInC,EAKvB,OAJIgB,KACHG,EAAOqB,QAAQ,mBAAoBxB,GACnCG,EAAOwB,OAAO3C,KAER"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_offline.js b/codebase/sources/ext/dhtmlxscheduler_offline.js
new file mode 100644
index 0000000..8f18cce
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_offline.js
@@ -0,0 +1,83 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+scheduler.load=function(url,call){
+ var type;
+ if (typeof call == "string"){
+ this._process=call;
+ type = call;
+ call = arguments[2];
+ }
+
+ this._load_url=url;
+ this._after_call=call;
+ if (url.$proxy) {
+ url.load(this, typeof type == "string" ? type : null);
+ return;
+ }
+
+ this._load(url,this._date);
+};
+
+scheduler._dp_init_backup = scheduler._dp_init;
+scheduler._dp_init = function(dp) {
+ dp._sendData = function(a1,rowId){
+ if (!a1) return; //nothing to send
+ if (!this.callEvent("onBeforeDataSending",rowId?[rowId,this.getState(rowId),a1]:[null, null, a1])) return false;
+ if (rowId)
+ this._in_progress[rowId]=(new Date()).valueOf();
+ if (this.serverProcessor.$proxy) {
+ var mode = this._tMode!="POST" ? 'get' : 'post';
+ var to_send = [];
+ for (var i in a1)
+ to_send.push({ id: i, data: a1[i], operation: this.getState(i)});
+ this.serverProcessor._send(to_send, mode, this);
+ return;
+ }
+
+ var a2=new dtmlXMLLoaderObject(this.afterUpdate,this,true);
+ var a3 = this.serverProcessor+(this._user?(getUrlSymbol(this.serverProcessor)+["dhx_user="+this._user,"dhx_version="+this.obj.getUserData(0,"version")].join("&")):"");
+ if (this._tMode!="POST")
+ a2.loadXML(a3+((a3.indexOf("?")!=-1)?"&":"?")+this.serialize(a1,rowId));
+ else
+ a2.loadXML(a3,true,this.serialize(a1,rowId));
+ this._waitMode++;
+ };
+
+ dp._updatesToParams = function(items) {
+ var stack = {};
+ for (var i = 0; i < items.length; i++)
+ stack[items[i].id] = items[i].data;
+ return this.serialize(stack);
+ };
+
+ dp._processResult = function(text, xml, loader) {
+ if (loader.status != 200) {
+ for (var i in this._in_progress) {
+ var state = this.getState(i);
+ this.afterUpdateCallback(i, i, state, null);
+ }
+ return;
+ }
+ xml = new dtmlXMLLoaderObject(function() {},this,true);
+ xml.loadXMLString(text);
+ xml.xmlDoc = loader;
+
+ this.afterUpdate(this, null, null, null, xml);
+ };
+ this._dp_init_backup(dp);
+};
+
+if (window.dataProcessor)
+ dataProcessor.prototype.init=function(obj){
+ this.init_original(obj);
+ obj._dataprocessor=this;
+
+ this.setTransactionMode("POST",true);
+ if (!this.serverProcessor.$proxy)
+ this.serverProcessor+=(this.serverProcessor.indexOf("?")!=-1?"&":"?")+"editing=true";
+ }; \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_offline.js.map b/codebase/sources/ext/dhtmlxscheduler_offline.js.map
new file mode 100644
index 0000000..aa628e5
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_offline.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_offline.js.map","sources":["dhtmlxscheduler_offline.js"],"names":["scheduler","load","url","call","type","this","_process","arguments","_load_url","_after_call","$proxy","_load","_date","_dp_init_backup","_dp_init","dp","_sendData","a1","rowId","callEvent","getState","_in_progress","Date","valueOf","serverProcessor","mode","_tMode","to_send","i","push","id","data","operation","_send","a2","dtmlXMLLoaderObject","afterUpdate","a3","_user","getUrlSymbol","obj","getUserData","join","loadXML","indexOf","serialize","_waitMode","_updatesToParams","items","stack","length","_processResult","text","xml","loader","status","loadXMLString","xmlDoc","state","afterUpdateCallback","window","dataProcessor","prototype","init","init_original","_dataprocessor","setTransactionMode"],"mappings":"AAAAA,UAAUC,KAAK,SAASC,EAAIC,GAC3B,GAAIC,EASJ,OARmB,gBAARD,KACVE,KAAKC,SAASH,EACdC,EAAOD,EACPA,EAAOI,UAAU,IAGlBF,KAAKG,UAAUN,EACfG,KAAKI,YAAYN,EACbD,EAAIQ,WACPR,GAAID,KAAKI,KAAqB,gBAARD,GAAmBA,EAAO,UAIjDC,MAAKM,MAAMT,EAAIG,KAAKO,QAGrBZ,UAAUa,gBAAkBb,UAAUc,SACtCd,UAAUc,SAAW,SAASC,GAC7BA,EAAGC,UAAY,SAASC,EAAGC,GACvB,GAAKD,EAAL,CACH,IAAKZ,KAAKc,UAAU,sBAAsBD,GAAOA,EAAMb,KAAKe,SAASF,GAAOD,IAAK,KAAM,KAAMA,IAAM,OAAO,CAG1G,IAFOC,IACNb,KAAKgB,aAAaH,IAAO,GAAKI,OAAQC,WACnClB,KAAKmB,gBAAgBd,OAAQ,CAChC,GAAIe,GAAoB,QAAbpB,KAAKqB,OAAiB,MAAQ,OACrCC,IACJ;IAAK,GAAIC,KAAKX,GACbU,EAAQE,MAAOC,GAAIF,EAAGG,KAAMd,EAAGW,GAAII,UAAW3B,KAAKe,SAASQ,IAE7D,YADAvB,MAAKmB,gBAAgBS,MAAMN,EAASF,EAAMpB,MAI3C,GAAI6B,GAAG,GAAIC,qBAAoB9B,KAAK+B,YAAY/B,MAAK,GACjDgC,EAAKhC,KAAKmB,iBAAiBnB,KAAKiC,MAAOC,aAAalC,KAAKmB,kBAAkB,YAAYnB,KAAKiC,MAAM,eAAejC,KAAKmC,IAAIC,YAAY,EAAE,YAAYC,KAAK,KAAM,GAClJ,SAAbrC,KAAKqB,OACFQ,EAAGS,QAAQN,GAAsB,IAAjBA,EAAGO,QAAQ,KAAU,IAAI,KAAKvC,KAAKwC,UAAU5B,EAAGC,IAEhEgB,EAAGS,QAAQN,GAAG,EAAKhC,KAAKwC,UAAU5B,EAAGC,IAC5Cb,KAAKyC,cAGN/B,EAAGgC,iBAAmB,SAASC,GAE9B,IAAK,GADDC,MACKrB,EAAI,EAAGA,EAAIoB,EAAME,OAAQtB,IACjCqB,EAAMD,EAAMpB,GAAGE,IAAMkB,EAAMpB,GAAGG,IAC/B;MAAO1B,MAAKwC,UAAUI,IAGvBlC,EAAGoC,eAAiB,SAASC,EAAMC,EAAKC,GACvC,GAAqB,KAAjBA,EAAOC,OAOXF,EAAM,GAAIlB,qBAAoB,aAAc9B,MAAK,GACjDgD,EAAIG,cAAcJ,GAClBC,EAAII,OAASH,EAEbjD,KAAK+B,YAAY/B,KAAM,KAAM,KAAM,KAAMgD,OAVxC,KAAK,GAAIzB,KAAKvB,MAAKgB,aAAc,CAChC,GAAIqC,GAAQrD,KAAKe,SAASQ,EAC1BvB,MAAKsD,oBAAoB/B,EAAGA,EAAG8B,EAAO,QAUzCrD,KAAKQ,gBAAgBE,IAGlB6C,OAAOC,gBACVA,cAAcC,UAAUC,KAAK,SAASvB,GACrCnC,KAAK2D,cAAcxB,GACnBA,EAAIyB,eAAe5D,KAEnBA,KAAK6D,mBAAmB,QAAO,GAC1B7D,KAAKmB,gBAAgBd,SACzBL,KAAKmB,kBAAqD,IAAnCnB,KAAKmB,gBAAgBoB,QAAQ,KAAS,IAAI,KAAK"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_outerdrag.js b/codebase/sources/ext/dhtmlxscheduler_outerdrag.js
new file mode 100644
index 0000000..9a2f640
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_outerdrag.js
@@ -0,0 +1,60 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+// lame old code doesn't provide raw event object
+scheduler.attachEvent("onTemplatesReady", function() {
+ var dragger = (new dhtmlDragAndDropObject());
+ var old = dragger.stopDrag;
+ var last_event;
+ dragger.stopDrag = function(e) {
+ last_event = e || event;
+ return old.apply(this, arguments);
+ };
+ dragger.addDragLanding(scheduler._els["dhx_cal_data"][0], {
+ _drag: function(sourceHtmlObject, dhtmlObject, targetHtmlObject, targetHtml) {
+
+ if (scheduler.checkEvent("onBeforeExternalDragIn") && !scheduler.callEvent("onBeforeExternalDragIn", [sourceHtmlObject, dhtmlObject, targetHtmlObject, targetHtml, last_event]))
+ return;
+
+ var temp = scheduler.attachEvent("onEventCreated", function(id) {
+ if (!scheduler.callEvent("onExternalDragIn", [id, sourceHtmlObject, last_event])) {
+ this._drag_mode = this._drag_id = null;
+ this.deleteEvent(id);
+ }
+ });
+
+ var action_data = scheduler.getActionData(last_event);
+ var event_data = {
+ start_date: new Date(action_data.date)
+ };
+
+ // custom views, need to assign section id, fix dates
+ if (scheduler.matrix && scheduler.matrix[scheduler._mode]) {
+ var view_options = scheduler.matrix[scheduler._mode];
+ event_data[view_options.y_property] = action_data.section;
+
+ var pos = scheduler._locate_cell_timeline(last_event);
+ event_data.start_date = view_options._trace_x[pos.x];
+ event_data.end_date = scheduler.date.add(event_data.start_date, view_options.x_step, view_options.x_unit);
+ }
+ if (scheduler._props && scheduler._props[scheduler._mode]) {
+ event_data[scheduler._props[scheduler._mode].map_to] = action_data.section;
+ }
+
+ scheduler.addEventNow(event_data);
+
+ scheduler.detachEvent(temp);
+
+ },
+ _dragIn: function(htmlObject, shtmlObject) {
+ return htmlObject;
+ },
+ _dragOut: function(htmlObject) {
+ return this;
+ }
+ });
+});
diff --git a/codebase/sources/ext/dhtmlxscheduler_outerdrag.js.map b/codebase/sources/ext/dhtmlxscheduler_outerdrag.js.map
new file mode 100644
index 0000000..d928376
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_outerdrag.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_outerdrag.js.map","sources":["dhtmlxscheduler_outerdrag.js"],"names":["scheduler","attachEvent","last_event","dragger","dhtmlDragAndDropObject","old","stopDrag","e","event","apply","this","arguments","addDragLanding","_els","_drag","sourceHtmlObject","dhtmlObject","targetHtmlObject","targetHtml","checkEvent","callEvent","temp","id","_drag_mode","_drag_id","deleteEvent","action_data","getActionData","event_data","start_date","Date","date","matrix","_mode","view_options","y_property","section","pos","_locate_cell_timeline","_trace_x","x","end_date","add","x_step","x_unit","_props","map_to","addEventNow","detachEvent","_dragIn","htmlObject","_dragOut"],"mappings":"AACAA,UAAUC,YAAY,mBAAoB,WACzC,GAEIC,GAFAC,EAAU,GAAKC,wBACfC,EAAMF,EAAQG,QAElBH,GAAQG,SAAW,SAASC,GAE3B,MADAL,GAAaK,GAAKC,MACXH,EAAII,MAAMC,KAAMC,YAExBR,EAAQS,eAAeZ,UAAUa,KAAmB,aAAE,IACrDC,MAAO,SAASC,EAAkBC,EAAaC,EAAkBC,GAEhE,IAAIlB,UAAUmB,WAAW,2BAA8BnB,UAAUoB,UAAU,0BAA2BL,EAAkBC,EAAaC,EAAkBC,EAAYhB,IAAnK,CAGA,GAAImB,GAAOrB,UAAUC,YAAY,iBAAkB,SAASqB,GACtDtB,UAAUoB,UAAU,oBAAqBE,EAAIP,EAAkBb,MACnEQ,KAAKa,WAAab,KAAKc,SAAW,KAClCd,KAAKe,YAAYH;GAIfI,EAAc1B,UAAU2B,cAAczB,GACtC0B,GACHC,WAAY,GAAIC,MAAKJ,EAAYK,MAIlC,IAAI/B,UAAUgC,QAAUhC,UAAUgC,OAAOhC,UAAUiC,OAAQ,CAC1D,GAAIC,GAAelC,UAAUgC,OAAOhC,UAAUiC,MAC9CL,GAAWM,EAAaC,YAAcT,EAAYU,OAElD,IAAIC,GAAMrC,UAAUsC,sBAAsBpC,EAC1C0B,GAAWC,WAAaK,EAAaK,SAASF,EAAIG,GAClDZ,EAAWa,SAAWzC,UAAU+B,KAAKW,IAAId,EAAWC,WAAYK,EAAaS,OAAQT,EAAaU,QAE/F5C,UAAU6C,QAAU7C,UAAU6C,OAAO7C,UAAUiC,SAClDL,EAAW5B,UAAU6C,OAAO7C,UAAUiC,OAAOa,QAAUpB,EAAYU,SAGpEpC,UAAU+C,YAAYnB,GAEtB5B,UAAUgD,YAAY3B,KAGvB4B,QAAS,SAASC,GACjB,MAAOA;EAERC,SAAU,WACT,MAAOzC"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_pdf.js b/codebase/sources/ext/dhtmlxscheduler_pdf.js
new file mode 100644
index 0000000..77c9a73
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_pdf.js
@@ -0,0 +1,363 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+(function() {
+ var dx, dy,
+ html_regexp = new RegExp("<[^>]*>", "g"),
+ newline_regexp = new RegExp("<br[^>]*>", "g");
+
+ function clean_html(val) {
+ return val.replace(newline_regexp, "\n").replace(html_regexp, "");
+ }
+
+ function x_norm(x, offset) {
+ x = parseFloat(x);
+ offset = parseFloat(offset);
+ if (!isNaN(offset)) x -= offset;
+
+ var w = colsWidth(x);
+ x = x - w.width + w.cols*dx;
+ return isNaN(x)?"auto":(100*x/(dx));
+ }
+
+ function x_norm_event(x, offset, is_left) {
+ x = parseFloat(x);
+ offset = parseFloat(offset);
+ if (!isNaN(offset) && is_left) x -= offset;
+
+ var w = colsWidth(x);
+ x = x - w.width + w.cols*dx;
+ return isNaN(x)?"auto":(100*x/(dx-(!isNaN(offset)?offset:0)));
+ }
+ function colsWidth(width) {
+ var r = 0;
+ var header = scheduler._els.dhx_cal_header[0].childNodes;
+ var els = header[1] ? header[1].childNodes : header[0].childNodes;
+ for (var i = 0; i < els.length; i++) {
+ var el = els[i].style ? els[i] : els[i].parentNode;
+ var w = parseFloat(el.style.width);
+ if (width > w){
+ width -= (w+1);
+ r+=(w+1);
+ }
+ else
+ break;
+ }
+ return { width: r, cols: i };
+ }
+
+ function y_norm(y) {
+ y = parseFloat(y);
+ if (isNaN(y)) return "auto";
+ return 100 * y / dy;
+ }
+
+ function get_style(node, style){
+ return (window.getComputedStyle?(window.getComputedStyle(node, null)[style]):(node.currentStyle?node.currentStyle[style]:null))||"";
+ }
+
+ function de_day(node, n) {
+ var x = parseInt(node.style.left, 10);
+
+ for (var dx = 0; dx < scheduler._cols.length; dx++) {
+ x -= scheduler._cols[dx];
+ if (x < 0) return dx;
+ }
+ return n;
+ }
+
+ function de_week(node, n) {
+ var y = parseInt(node.style.top, 10);
+ for (var dy = 0; dy < scheduler._colsS.heights.length; dy++)
+ if (scheduler._colsS.heights[dy] > y) return dy;
+ return n;
+ }
+
+ function xml_start(tag) {
+ return tag ? "<"+tag+">" : "";
+ }
+ function xml_end(tag) {
+ return tag ? "</"+tag+">" : "";
+ }
+
+ function xml_top(tag, profile, header, footer) {
+ var xml = "<"+tag+" profile='" + profile + "'";
+ if (header)
+ xml += " header='" + header + "'";
+ if (footer)
+ xml += " footer='" + footer + "'";
+ xml += ">";
+ return xml;
+ }
+
+ function xml_body_header() {
+ var xml = "";
+ // detects if current mode is timeline
+ var mode = scheduler._mode;
+ if (scheduler.matrix && scheduler.matrix[scheduler._mode])
+ mode = (scheduler.matrix[scheduler._mode].render == "cell") ? "matrix" : "timeline";
+ xml += "<scale mode='" + mode + "' today='" + scheduler._els.dhx_cal_date[0].innerHTML + "'>";
+
+ if (scheduler._mode == "week_agenda") {
+ var xh = scheduler._els.dhx_cal_data[0].getElementsByTagName("DIV");
+ for (var i = 0; i < xh.length; i++)
+ if (xh[i].className == "dhx_wa_scale_bar")
+ xml += "<column>" + clean_html(xh[i].innerHTML) + "</column>";
+ } else if (scheduler._mode == "agenda" || scheduler._mode == "map") {
+ var xh = scheduler._els.dhx_cal_header[0].childNodes[0].childNodes;
+
+ xml += "<column>" + clean_html(xh[0].innerHTML) + "</column><column>" + clean_html(xh[1].innerHTML) + "</column>";
+ } else if (scheduler._mode == "year") {
+ var xh = scheduler._els.dhx_cal_data[0].childNodes;
+ for (var i = 0; i < xh.length; i++) {
+ xml += "<month label='" + clean_html(xh[i].childNodes[0].innerHTML) + "'>";
+ xml += xml_month_scale(xh[i].childNodes[1].childNodes);
+ xml += xml_month(xh[i].childNodes[2]);
+ xml += "</month>";
+ }
+ } else {
+ xml += "<x>";
+ var xh = scheduler._els.dhx_cal_header[0].childNodes;
+ xml += xml_month_scale(xh);
+ xml += "</x>";
+
+ var yh = scheduler._els.dhx_cal_data[0];
+ if (scheduler.matrix && scheduler.matrix[scheduler._mode]) {
+ xml += "<y>";
+ for (var i = 0; i < yh.firstChild.rows.length; i++) {
+ var el = yh.firstChild.rows[i];
+ xml += "<row><![CDATA[" + clean_html(el.cells[0].innerHTML) + "]]></row>";
+ }
+ xml += "</y>";
+ dy = yh.firstChild.rows[0].cells[0].offsetHeight;
+ } else if (yh.firstChild.tagName == "TABLE") {
+ xml += xml_month(yh);
+ } else {
+ yh = yh.childNodes[yh.childNodes.length - 1];
+ while (yh.className.indexOf("dhx_scale_holder") == -1)
+ yh = yh.previousSibling;
+ yh = yh.childNodes;
+
+ xml += "<y>";
+ for (var i = 0; i < yh.length; i++)
+ xml += "\n<row><![CDATA[" + clean_html(yh[i].innerHTML) + "]]></row>";
+ xml += "</y>";
+ dy = yh[0].offsetHeight;
+ }
+ }
+ xml += "</scale>";
+ return xml;
+ }
+
+ function xml_month(yh) {
+ var xml = "";
+ var r = yh.firstChild.rows;
+ for (var i = 0; i < r.length; i++) {
+ var days = [];
+ for (var j = 0; j < r[i].cells.length; j++)
+ days.push(r[i].cells[j].firstChild.innerHTML);
+
+ xml += "\n<row height='" + yh.firstChild.rows[i].cells[0].offsetHeight + "'><![CDATA[" + clean_html(days.join("|")) + "]]></row>";
+ dy = yh.firstChild.rows[0].cells[0].offsetHeight;
+ }
+ return xml;
+ }
+
+ function xml_month_scale(xh) {
+ var xhs,
+ xml = "";
+ if (scheduler.matrix && scheduler.matrix[scheduler._mode]) {
+ if (scheduler.matrix[scheduler._mode].second_scale)
+ xhs = xh[1].childNodes;
+
+ xh = xh[0].childNodes;
+ }
+
+ for (var i = 0; i < xh.length; i++)
+ xml += "\n<column><![CDATA[" + clean_html(xh[i].innerHTML) + "]]></column>";
+ dx = xh[0].offsetWidth;
+
+ if (xhs) {
+ var width = 0;
+ var top_width = xh[0].offsetWidth;
+ var top_col = 1;
+ for (var i = 0; i < xhs.length; i++) {
+ xml += "\n<column second_scale='" + top_col + "'><![CDATA[" + clean_html(xhs[i].innerHTML) + "]]></column>";
+ width += xhs[i].offsetWidth;
+ if (width >= top_width) {
+ top_width += (xh[top_col] ? xh[top_col].offsetWidth : 0);
+ top_col++;
+ }
+ dx = xhs[0].offsetWidth;
+ }
+ }
+ return xml;
+ }
+
+ function xml_body(colors) {
+ var xml = "";
+ var evs = scheduler._rendered;
+ var matrix = scheduler.matrix && scheduler.matrix[scheduler._mode];
+
+ if (scheduler._mode == "agenda" || scheduler._mode == "map") {
+
+ for (var i = 0; i < evs.length; i++)
+ xml += "<event><head><![CDATA[" + clean_html(evs[i].childNodes[0].innerHTML) + "]]></head><body><![CDATA[" + clean_html(evs[i].childNodes[2].innerHTML) + "]]></body></event>";
+
+ } else if (scheduler._mode == "week_agenda") {
+
+ for (var i = 0; i < evs.length; i++)
+ xml += "<event day='" + evs[i].parentNode.getAttribute("day") + "'><body>" + clean_html(evs[i].innerHTML) + "</body></event>";
+
+ } else if (scheduler._mode == "year") {
+
+ var evs = scheduler.get_visible_events();
+ for (var i = 0; i < evs.length; i++) {
+ var d = evs[i].start_date;
+ if (d.valueOf() < scheduler._min_date.valueOf())
+ d = scheduler._min_date;
+
+ while (d < evs[i].end_date) {
+ var m = d.getMonth() + 12 * (d.getFullYear() - scheduler._min_date.getFullYear()) - scheduler.week_starts._month;
+ var day = scheduler.week_starts[m] + d.getDate() - 1;
+ var text_color = colors ? get_style(scheduler._get_year_cell(d), "color") : "";
+ var bg_color = colors ? get_style(scheduler._get_year_cell(d), "backgroundColor") : "";
+
+ xml += "<event day='" + (day % 7) + "' week='" + Math.floor(day / 7) + "' month='" + m + "' backgroundColor='" + bg_color + "' color='" + text_color + "'></event>";
+ d = scheduler.date.add(d, 1, "day");
+ if (d.valueOf() >= scheduler._max_date.valueOf())
+ break;
+ }
+ }
+ } else if (matrix && matrix.render == "cell") {
+ var evs = scheduler._els.dhx_cal_data[0].getElementsByTagName("TD");
+ for (var i = 0; i < evs.length; i++) {
+ var text_color = colors ? get_style(evs[i], "color") : "";
+ var bg_color = colors ? get_style(evs[i], "backgroundColor") : "";
+ xml += "\n<event><body backgroundColor='" + bg_color + "' color='" + text_color + "'><![CDATA[" + clean_html(evs[i].innerHTML) + "]]></body></event>";
+ }
+ } else {
+ for (var i = 0; i < evs.length; i++) {
+ var zx, zdx;
+ if (scheduler.matrix && scheduler.matrix[scheduler._mode]) {
+ // logic for timeline view
+ zx = x_norm(evs[i].style.left);
+ zdx = x_norm(evs[i].offsetWidth)-1;
+ } else {
+ // we should use specific logic for day/week/units view
+ var left_norm = scheduler.config.use_select_menu_space ? 0 : 26;
+ zx = x_norm_event(evs[i].style.left, left_norm, true);
+ zdx = x_norm_event(evs[i].style.width, left_norm)-1;
+ }
+ if (isNaN(zdx * 1)) continue;
+ var zy = y_norm(evs[i].style.top);
+ var zdy = y_norm(evs[i].style.height);
+
+ var e_type = evs[i].className.split(" ")[0].replace("dhx_cal_", "");
+ if (e_type === 'dhx_tooltip_line') continue;
+
+ var dets = scheduler.getEvent(evs[i].getAttribute("event_id"));
+ if (!dets) continue;
+ var day = dets._sday;
+ var week = dets._sweek;
+ var length = dets._length || 0;
+
+ if (scheduler._mode == "month") {
+ zdy = parseInt(evs[i].offsetHeight, 10);
+ zy = parseInt(evs[i].style.top, 10) - scheduler.xy.month_head_height;
+
+ day = de_day(evs[i], day);
+ week = de_week(evs[i], week);
+ } else if (scheduler.matrix && scheduler.matrix[scheduler._mode]) {
+ day = 0;
+ var el = evs[i].parentNode.parentNode.parentNode;
+ week = el.rowIndex;
+ var dy_copy = dy;
+ dy = evs[i].parentNode.offsetHeight;
+ zy = y_norm(evs[i].style.top);
+ zy -= zy * 0.2;
+ dy = dy_copy;
+ } else {
+ if (evs[i].parentNode == scheduler._els.dhx_cal_data[0]) continue;
+ var parent = scheduler._els["dhx_cal_data"][0].childNodes[0];
+ var offset = parseFloat(parent.className.indexOf("dhx_scale_holder") != -1 ? parent.style.left : 0);
+ zx += x_norm(evs[i].parentNode.style.left, offset);
+ }
+
+ xml += "\n<event week='" + week + "' day='" + day + "' type='" + e_type + "' x='" + zx + "' y='" + zy + "' width='" + zdx + "' height='" + zdy + "' len='" + length + "'>";
+
+ if (e_type == "event") {
+ xml += "<header><![CDATA[" + clean_html(evs[i].childNodes[1].innerHTML) + "]]></header>";
+ var text_color = colors ? get_style(evs[i].childNodes[2], "color") : "";
+ var bg_color = colors ? get_style(evs[i].childNodes[2], "backgroundColor") : "";
+ xml += "<body backgroundColor='" + bg_color + "' color='" + text_color + "'><![CDATA[" + clean_html(evs[i].childNodes[2].innerHTML) + "]]></body>";
+ } else {
+ var text_color = colors ? get_style(evs[i], "color") : "";
+ var bg_color = colors ? get_style(evs[i], "backgroundColor") : "";
+ xml += "<body backgroundColor='" + bg_color + "' color='" + text_color + "'><![CDATA[" + clean_html(evs[i].innerHTML) + "]]></body>";
+ }
+ xml += "</event>";
+ }
+ }
+
+ return xml;
+ }
+
+ function to_pdf(start, end, view, url, mode, header, footer) {
+ var colors = false;
+ if (mode == "fullcolor") {
+ colors = true;
+ mode = "color";
+ }
+
+ mode = mode || "color";
+
+ var uid = scheduler.uid();
+ var d = document.createElement("div");
+ d.style.display = "none";
+ document.body.appendChild(d);
+
+ d.innerHTML = '<form id="' + uid + '" method="post" target="_blank" action="' + url + '" accept-charset="utf-8" enctype="application/x-www-form-urlencoded"><input type="hidden" name="mycoolxmlbody"/> </form>';
+
+
+ var xml = "";
+ if (start) {
+ var original_date = scheduler._date;
+ var original_mode = scheduler._mode;
+ end = scheduler.date[view+"_start"](end);
+ end = scheduler.date["get_"+view+"_end"] ? scheduler.date["get_"+view+"_end"](end) : scheduler.date.add(end, 1, view);
+
+ xml = xml_top("pages", mode, header, footer);
+ for (var temp_date = new Date(start); +temp_date < +end; temp_date = scheduler.date.add(temp_date, 1, view)) {
+ scheduler.setCurrentView(temp_date, view);
+ xml += xml_start("page") + xml_body_header().replace("\u2013", "-") + xml_body(colors) + xml_end("page");
+ }
+ xml += xml_end("pages");
+
+ scheduler.setCurrentView(original_date, original_mode);
+ } else {
+ xml = xml_top("data", mode, header, footer) + xml_body_header().replace("\u2013", "-") + xml_body(colors) + xml_end("data");
+ }
+
+
+ document.getElementById(uid).firstChild.value = encodeURIComponent(xml);
+ document.getElementById(uid).submit();
+ d.parentNode.removeChild(d);
+ }
+
+ scheduler.toPDF = function(url, mode, header, footer) {
+ return to_pdf.apply(this, [null, null, null, url, mode, header, footer]);
+ };
+ scheduler.toPDFRange = function(start, end, view, url, mode, header, footer) {
+ if (typeof start == "string") {
+ start = scheduler.templates.api_date(start);
+ end = scheduler.templates.api_date(end);
+ }
+
+ return to_pdf.apply(this, arguments);
+ };
+})();
diff --git a/codebase/sources/ext/dhtmlxscheduler_pdf.js.map b/codebase/sources/ext/dhtmlxscheduler_pdf.js.map
new file mode 100644
index 0000000..0d4607e
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_pdf.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_pdf.js.map","sources":["dhtmlxscheduler_pdf.js"],"names":["clean_html","val","replace","newline_regexp","html_regexp","x_norm","x","offset","parseFloat","isNaN","w","colsWidth","width","cols","dx","x_norm_event","is_left","r","header","scheduler","_els","dhx_cal_header","childNodes","els","i","length","el","style","parentNode","y_norm","y","dy","get_style","node","window","getComputedStyle","currentStyle","de_day","n","parseInt","left","_cols","de_week","top","_colsS","heights","xml_start","tag","xml_end","xml_top","profile","footer","xml","xml_body_header","mode","_mode","matrix","render","dhx_cal_date","innerHTML","xh","dhx_cal_data","getElementsByTagName","className","xml_month_scale","xml_month","yh","firstChild","rows","cells","offsetHeight","tagName","indexOf","previousSibling","days","j","push","join","xhs","second_scale","offsetWidth","top_width","top_col","xml_body","colors","evs","_rendered","getAttribute","get_visible_events","d","start_date","valueOf","_min_date","end_date","m","getMonth","getFullYear","week_starts","_month","day","getDate","text_color","_get_year_cell","bg_color","Math","floor","date","add","_max_date","zx","zdx","left_norm","config","use_select_menu_space","zy","zdy","height","e_type","split","dets","getEvent","_sday","week","_sweek","_length","xy","month_head_height","rowIndex","dy_copy","parent","to_pdf","start","end","view","url","uid","document","createElement","display","body","appendChild","original_date","_date","original_mode","temp_date","Date","setCurrentView","getElementById","value","encodeURIComponent","submit","removeChild","RegExp","toPDF","apply","this","toPDFRange","templates","api_date","arguments"],"mappings":"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"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_quick_info.js b/codebase/sources/ext/dhtmlxscheduler_quick_info.js
new file mode 100644
index 0000000..08fc7bb
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_quick_info.js
@@ -0,0 +1,199 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+scheduler.config.icons_select = ["icon_details", "icon_delete"];
+scheduler.config.details_on_create = true;
+scheduler.xy.menu_width = 0;
+
+scheduler.attachEvent("onClick", function(id){
+ scheduler.showQuickInfo(id);
+ return true;
+});
+
+(function(){
+ var events = ["onEmptyClick", "onViewChange", "onLightbox", "onBeforeEventDelete", "onBeforeDrag"];
+ var hiding_function = function(){
+ scheduler._hideQuickInfo();
+ return true;
+ };
+ for (var i=0; i<events.length; i++)
+ scheduler.attachEvent(events[i], hiding_function);
+})();
+
+scheduler.templates.quick_info_title = function(start, end, ev){ return ev.text.substr(0,50); };
+scheduler.templates.quick_info_content = function(start, end, ev){ return ev.details || ev.text; };
+scheduler.templates.quick_info_date = function(start, end, ev){
+ if (scheduler.isOneDayEvent(ev))
+ return scheduler.templates.day_date(start, end, ev) + " " +scheduler.templates.event_header(start, end, ev);
+ else
+ return scheduler.templates.week_date(start, end, ev);
+};
+
+scheduler.showQuickInfo = function(id){
+ if (id == this._quick_info_box_id) return;
+ this.hideQuickInfo(true);
+
+ var pos = this._get_event_counter_part(id);
+
+ if (pos){
+ this._quick_info_box = this._init_quick_info(pos);
+ this._fill_quick_data(id);
+ this._show_quick_info(pos);
+ }
+};
+scheduler._hideQuickInfo = function(){
+ scheduler.hideQuickInfo();
+};
+scheduler.hideQuickInfo = function(forced){
+ var qi = this._quick_info_box;
+ this._quick_info_box_id = 0;
+
+ if (qi && qi.parentNode){
+ if (scheduler.config.quick_info_detached)
+ return qi.parentNode.removeChild(qi);
+
+ if (qi.style.right == "auto")
+ qi.style.left = "-350px";
+ else
+ qi.style.right = "-350px";
+
+ if (forced)
+ qi.parentNode.removeChild(qi);
+ }
+};
+dhtmlxEvent(window, "keydown", function(e){
+ if (e.keyCode == 27)
+ scheduler.hideQuickInfo();
+});
+
+scheduler._show_quick_info = function(pos){
+ var qi = scheduler._quick_info_box;
+
+ if (scheduler.config.quick_info_detached){
+ scheduler._obj.appendChild(qi);
+ var width = qi.offsetWidth;
+ var height = qi.offsetHeight;
+
+ qi.style.left = pos.left - pos.dx*(width - pos.width) + "px";
+ qi.style.top = pos.top - (pos.dy?height:-pos.height) + "px";
+ } else {
+ qi.style.top = this.xy.scale_height+this.xy.nav_height + 20 + "px";
+ if (pos.dx == 1){
+ qi.style.right = "auto";
+ qi.style.left = "-300px";
+
+ setTimeout(function(){
+ qi.style.left = "-10px";
+ },1);
+ } else {
+ qi.style.left = "auto";
+ qi.style.right = "-300px";
+
+ setTimeout(function(){
+ qi.style.right = "-10px";
+ },1);
+ }
+ qi.className = qi.className.replace("dhx_qi_left","").replace("dhx_qi_left","")+" dhx_qi_"+(pos==1?"left":"right");
+ scheduler._obj.appendChild(qi);
+ }
+};
+scheduler.attachEvent("onTemplatesReady", function(){
+ scheduler.hideQuickInfo();
+ if(this._quick_info_box){
+ var box = this._quick_info_box;
+ if(box.parentNode){
+ box.parentNode.removeChild(box);
+ }
+ this._quick_info_box = null;
+ }
+});
+scheduler._quick_info_onscroll_handler = function(e){
+ scheduler.hideQuickInfo();
+};
+scheduler._init_quick_info = function(){
+ if (!this._quick_info_box){
+ var sizes = scheduler.xy;
+
+ var qi = this._quick_info_box = document.createElement("div");
+ qi.className = "dhx_cal_quick_info";
+ if (scheduler.$testmode)
+ qi.className += " dhx_no_animate";
+ //title
+ var html = "<div class=\"dhx_cal_qi_title\" style=\"height:"+sizes.quick_info_title+"px\">" +
+ "<div class=\"dhx_cal_qi_tcontent\"></div><div class=\"dhx_cal_qi_tdate\"></div>" +
+ "</div>" +
+ "<div class=\"dhx_cal_qi_content\"></div>";
+
+ //buttons
+ html += "<div class=\"dhx_cal_qi_controls\" style=\"height:"+sizes.quick_info_buttons+"px\">";
+ var buttons = scheduler.config.icons_select;
+ for (var i = 0; i < buttons.length; i++)
+ html += "<div class=\"dhx_qi_big_icon "+buttons[i]+"\" title=\""+scheduler.locale.labels[buttons[i]]+"\"><div class='dhx_menu_icon " + buttons[i] + "'></div><div>"+scheduler.locale.labels[buttons[i]]+"</div></div>";
+ html += "</div>";
+
+ qi.innerHTML = html;
+ dhtmlxEvent(qi, "click", function(ev){
+ ev = ev || event;
+ scheduler._qi_button_click(ev.target || ev.srcElement);
+ });
+ if (scheduler.config.quick_info_detached){
+ scheduler._detachDomEvent(scheduler._els["dhx_cal_data"][0], "scroll", scheduler._quick_info_onscroll_handler);
+ dhtmlxEvent(scheduler._els["dhx_cal_data"][0], "scroll", scheduler._quick_info_onscroll_handler);
+ }
+ }
+
+ return this._quick_info_box;
+};
+
+scheduler._qi_button_click = function(node){
+ var box = scheduler._quick_info_box;
+ if (!node || node == box) return;
+
+ var mask = node.className;
+ if (mask.indexOf("_icon")!=-1){
+ var id = scheduler._quick_info_box_id;
+ scheduler._click.buttons[mask.split(" ")[1].replace("icon_","")](id);
+ } else
+ scheduler._qi_button_click(node.parentNode);
+};
+scheduler._get_event_counter_part = function(id){
+ var domEv = scheduler.getRenderedEvent(id);
+ var left = 0;
+ var top = 0;
+
+ var node = domEv;
+ while (node && node != scheduler._obj){
+ left += node.offsetLeft;
+ top += node.offsetTop-node.scrollTop;
+ node = node.offsetParent;
+ }
+ if(node){
+ var dx = (left + domEv.offsetWidth/2) > (scheduler._x/2) ? 1 : 0;
+ var dy = (top + domEv.offsetHeight/2) > (scheduler._y/2) ? 1 : 0;
+
+ return { left:left, top:top, dx:dx, dy:dy,
+ width:domEv.offsetWidth, height:domEv.offsetHeight };
+ }
+ return 0;
+};
+
+scheduler._fill_quick_data = function(id){
+ var ev = scheduler.getEvent(id);
+ var qi = scheduler._quick_info_box;
+
+ scheduler._quick_info_box_id = id;
+
+//title content
+ var titleContent = qi.firstChild.firstChild;
+ titleContent.innerHTML = scheduler.templates.quick_info_title(ev.start_date, ev.end_date, ev);
+ var titleDate = titleContent.nextSibling;
+ titleDate.innerHTML = scheduler.templates.quick_info_date(ev.start_date, ev.end_date, ev);
+
+//main content
+ var main = qi.firstChild.nextSibling;
+ main.innerHTML = scheduler.templates.quick_info_content(ev.start_date, ev.end_date, ev);
+};
diff --git a/codebase/sources/ext/dhtmlxscheduler_quick_info.js.map b/codebase/sources/ext/dhtmlxscheduler_quick_info.js.map
new file mode 100644
index 0000000..65165d0
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_quick_info.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_quick_info.js.map","sources":["dhtmlxscheduler_quick_info.js"],"names":["scheduler","config","icons_select","details_on_create","xy","menu_width","attachEvent","id","showQuickInfo","events","hiding_function","_hideQuickInfo","i","length","templates","quick_info_title","start","end","ev","text","substr","quick_info_content","details","quick_info_date","isOneDayEvent","day_date","event_header","week_date","this","_quick_info_box_id","hideQuickInfo","pos","_get_event_counter_part","_quick_info_box","_init_quick_info","_fill_quick_data","_show_quick_info","forced","qi","parentNode","quick_info_detached","removeChild","style","right","left","dhtmlxEvent","window","e","keyCode","_obj","appendChild","width","offsetWidth","height","offsetHeight","dx","top","dy","scale_height","nav_height","setTimeout","className","replace","box","_quick_info_onscroll_handler","sizes","document","createElement","$testmode","html","quick_info_buttons","buttons","locale","labels","innerHTML","event","_qi_button_click","target","srcElement","_detachDomEvent","_els","node","mask","indexOf","_click","split","domEv","getRenderedEvent","offsetLeft","offsetTop","scrollTop","offsetParent","_x","_y","getEvent","titleContent","firstChild","start_date","end_date","titleDate","nextSibling","main"],"mappings":"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"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_readonly.js b/codebase/sources/ext/dhtmlxscheduler_readonly.js
new file mode 100644
index 0000000..462d878
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_readonly.js
@@ -0,0 +1,160 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+scheduler.attachEvent("onTemplatesReady", function() {
+ var original_sns = scheduler.config.lightbox.sections.slice();
+ var original_left_buttons = scheduler.config.buttons_left.slice();
+ var original_right_buttons = scheduler.config.buttons_right.slice();
+
+
+ scheduler.attachEvent("onBeforeLightbox", function(id) {
+ if (this.config.readonly_form || this.getEvent(id).readonly) {
+ this.config.readonly_active = true;
+
+ for (var i = 0; i < this.config.lightbox.sections.length; i++) {
+ this.config.lightbox.sections[i].focus = false;
+ }
+ }
+ else {
+ this.config.readonly_active = false;
+ scheduler.config.lightbox.sections = original_sns.slice(); // restore original list of sections including recurring
+ scheduler.config.buttons_left = original_left_buttons.slice();
+ scheduler.config.buttons_right = original_right_buttons.slice();
+ }
+
+ var sns = this.config.lightbox.sections;
+ if (this.config.readonly_active) {
+ for (var i = 0; i < sns.length; i++) {
+ if (sns[i].type == 'recurring') {
+ if (this.config.readonly_active) {
+ sns.splice(i, 1);
+ }
+ break;
+ }
+ }
+
+ var forbidden_buttons = ["dhx_delete_btn", "dhx_save_btn"];
+ var button_arrays = [scheduler.config.buttons_left, scheduler.config.buttons_right];
+ for (var i = 0; i < forbidden_buttons.length; i++) {
+ var forbidden_button = forbidden_buttons[i];
+ for (var k = 0; k < button_arrays.length; k++) {
+ var button_array = button_arrays[k];
+ var index = -1;
+ for (var p = 0; p < button_array.length; p++) {
+ if (button_array[p] == forbidden_button) {
+ index = p;
+ break;
+ }
+ }
+ if (index != -1) {
+ button_array.splice(index, 1);
+ }
+ }
+ }
+
+
+ }
+
+ this.resetLightbox();
+
+ return true;
+ });
+
+ function txt_replace(tag, d, n, text) {
+ var txts = d.getElementsByTagName(tag);
+ var txtt = n.getElementsByTagName(tag);
+ for (var i = txtt.length - 1; i >= 0; i--) {
+ var n = txtt[i];
+ if (!text){
+ n.disabled = true;
+ //radio and checkboxes loses state after .cloneNode in IE
+ if(d.checked)
+ n.checked = true;
+ }else {
+ var t = document.createElement("SPAN");
+ t.className = "dhx_text_disabled";
+ t.innerHTML = text(txts[i]);
+ n.parentNode.insertBefore(t, n);
+ n.parentNode.removeChild(n);
+ }
+ }
+ }
+
+ var old = scheduler._fill_lightbox;
+ scheduler._fill_lightbox = function() {
+
+ var lb = this.getLightbox();
+ if (this.config.readonly_active) {
+ lb.style.visibility = 'hidden';
+ // lightbox should have actual sizes before rendering controls
+ // currently only matters for dhtmlxCombo
+ lb.style.display = 'block';
+ }
+ var res = old.apply(this, arguments);
+ if (this.config.readonly_active) {
+ //reset visibility and display
+ lb.style.visibility = '';
+ lb.style.display = 'none';
+ }
+
+ if (this.config.readonly_active) {
+
+ var d = this.getLightbox();
+ var n = this._lightbox_r = d.cloneNode(true);
+ n.id = scheduler.uid();
+
+ txt_replace("textarea", d, n, function(a) {
+ return a.value;
+ });
+ txt_replace("input", d, n, false);
+ txt_replace("select", d, n, function(a) {
+ if(!a.options.length) return "";
+ return a.options[Math.max((a.selectedIndex || 0), 0)].text;
+ });
+
+ d.parentNode.insertBefore(n, d);
+
+ olds.call(this, n);
+ if (scheduler._lightbox)
+ scheduler._lightbox.parentNode.removeChild(scheduler._lightbox);
+ this._lightbox = n;
+
+ if (scheduler.config.drag_lightbox)
+ n.firstChild.onmousedown = scheduler._ready_to_dnd;
+ this.setLightboxSize();
+ n.onclick = function(e) {
+ var src = e ? e.target : event.srcElement;
+ if (!src.className) src = src.previousSibling;
+ if (src && src.className)
+ switch (src.className) {
+ case "dhx_cancel_btn":
+ scheduler.callEvent("onEventCancel", [scheduler._lightbox_id]);
+ scheduler._edit_stop_event(scheduler.getEvent(scheduler._lightbox_id), false);
+ scheduler.hide_lightbox();
+ break;
+ }
+ };
+ }
+ return res;
+ };
+
+ var olds = scheduler.showCover;
+ scheduler.showCover = function() {
+ if (!this.config.readonly_active)
+ olds.apply(this, arguments);
+ };
+
+ var hold = scheduler.hide_lightbox;
+ scheduler.hide_lightbox = function() {
+ if (this._lightbox_r) {
+ this._lightbox_r.parentNode.removeChild(this._lightbox_r);
+ this._lightbox_r = this._lightbox = null;
+ }
+
+ return hold.apply(this, arguments);
+ };
+});
diff --git a/codebase/sources/ext/dhtmlxscheduler_readonly.js.map b/codebase/sources/ext/dhtmlxscheduler_readonly.js.map
new file mode 100644
index 0000000..8ce874d
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_readonly.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_readonly.js.map","sources":["dhtmlxscheduler_readonly.js"],"names":["scheduler","attachEvent","txt_replace","tag","d","n","text","txts","getElementsByTagName","txtt","i","length","t","document","createElement","className","innerHTML","parentNode","insertBefore","removeChild","disabled","checked","original_sns","config","lightbox","sections","slice","original_left_buttons","buttons_left","original_right_buttons","buttons_right","id","this","readonly_form","getEvent","readonly","readonly_active","focus","sns","type","splice","forbidden_buttons","button_arrays","forbidden_button","k","button_array","index","p","resetLightbox","old","_fill_lightbox","lb","getLightbox","style","visibility","display","res","apply","arguments","_lightbox_r","cloneNode","uid","a","value","options","Math","max","selectedIndex","olds","call","_lightbox","drag_lightbox","firstChild","onmousedown","_ready_to_dnd","setLightboxSize","onclick","e","src","target","event","srcElement","previousSibling","callEvent","_lightbox_id","_edit_stop_event","hide_lightbox","showCover","hold"],"mappings":"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"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_recurring.js b/codebase/sources/ext/dhtmlxscheduler_recurring.js
new file mode 100644
index 0000000..ad4a7a0
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_recurring.js
@@ -0,0 +1,818 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+scheduler.config.occurrence_timestamp_in_utc = false;
+scheduler.config.recurring_workdays = [1,2,3,4,5];
+scheduler.form_blocks["recurring"] = {
+ render:function(sns) {
+ return scheduler.__recurring_template;
+ },
+ _ds: {},
+ _init_set_value:function(node, value, ev) {
+ scheduler.form_blocks["recurring"]._ds = {start:ev.start_date, end:ev._end_date};
+
+ var str_date_format = scheduler.date.str_to_date(scheduler.config.repeat_date);
+ var str_date = function(str_date) {
+ var date = str_date_format(str_date);
+ if (scheduler.config.include_end_by)
+ date = scheduler.date.add(date, 1, 'day');
+ return date;
+ };
+
+ var date_str = scheduler.date.date_to_str(scheduler.config.repeat_date);
+
+ var top = node.getElementsByTagName("FORM")[0];
+ var els = [];
+
+ function register_els(inps) {
+ for (var i = 0; i < inps.length; i++) {
+ var inp = inps[i];
+ if (inp.type == "checkbox" || inp.type == "radio") {
+ if (!els[inp.name])
+ els[inp.name] = [];
+ els[inp.name].push(inp);
+ } else
+ els[inp.name] = inp;
+ }
+ }
+
+ register_els(top.getElementsByTagName("INPUT"));
+ register_els(top.getElementsByTagName("SELECT"));
+
+ if (!scheduler.config.repeat_date_of_end) {
+ var formatter = scheduler.date.date_to_str(scheduler.config.repeat_date);
+ scheduler.config.repeat_date_of_end = formatter(scheduler.date.add(scheduler._currentDate(), 30, "day"));
+ }
+ els["date_of_end"].value = scheduler.config.repeat_date_of_end;
+
+ var $ = function(a) {
+ return document.getElementById(a);
+ };
+
+ function get_radio_value(name) {
+ var col = els[name];
+ for (var i = 0; i < col.length; i++)
+ if (col[i].checked) return col[i].value;
+ }
+
+ function change_current_view() {
+ $("dhx_repeat_day").style.display = "none";
+ $("dhx_repeat_week").style.display = "none";
+ $("dhx_repeat_month").style.display = "none";
+ $("dhx_repeat_year").style.display = "none";
+ $("dhx_repeat_" + this.value).style.display = "block";
+ }
+
+ function get_repeat_code(dates) {
+ var code = [get_radio_value("repeat")];
+ get_rcode[code[0]](code, dates);
+
+ while (code.length < 5) code.push("");
+ var repeat = "";
+ if (els["end"][0].checked) {
+ dates.end = new Date(9999, 1, 1);
+ repeat = "no";
+ }
+ else if (els["end"][2].checked) {
+ dates.end = str_date(els["date_of_end"].value);
+ }
+ else {
+ scheduler.transpose_type(code.join("_"));
+ repeat = Math.max(1, els["occurences_count"].value);
+ var transp = ((code[0] == "week" && code[4] && code[4].toString().indexOf(scheduler.config.start_on_monday ? 1 : 0) == -1) ? 1 : 0);
+ dates.end = scheduler.date.add(new Date(dates.start), repeat + transp, code.join("_"));
+ }
+
+ return code.join("_") + "#" + repeat;
+ }
+
+ scheduler.form_blocks["recurring"]._get_repeat_code = get_repeat_code;
+ var get_rcode = {
+ month:function(code, dates) {
+ if (get_radio_value("month_type") == "d") {
+ code.push(Math.max(1, els["month_count"].value));
+ dates.start.setDate(els["month_day"].value);
+ } else {
+ code.push(Math.max(1, els["month_count2"].value));
+ code.push(els["month_day2"].value);
+ code.push(Math.max(1, els["month_week2"].value));
+ if (!scheduler.config.repeat_precise){
+ dates.start.setDate(1);
+ }
+ }
+ dates._start = true;
+ },
+ week:function(code, dates) {
+ code.push(Math.max(1, els["week_count"].value));
+ code.push("");
+ code.push("");
+ var t = [];
+ var col = els["week_day"];
+ var day = dates.start.getDay();
+ var start_exists = false;
+
+ for (var i = 0; i < col.length; i++){
+ if (col[i].checked) {
+ t.push(col[i].value);
+ start_exists = start_exists || col[i].value == day;
+ }
+ }
+ if (!t.length){
+ t.push(day);
+ start_exists = true;
+ }
+ t.sort();
+
+
+ if (!scheduler.config.repeat_precise){
+ dates.start = scheduler.date.week_start(dates.start);
+ dates._start = true;
+ } else if (!start_exists){
+ scheduler.transpose_day_week(dates.start, t, 1, 7);
+ dates._start = true;
+ }
+
+ code.push(t.join(","));
+ },
+ day:function(code) {
+ if (get_radio_value("day_type") == "d") {
+ code.push(Math.max(1, els["day_count"].value));
+ }
+ else {
+ code.push("week");
+ code.push(1);
+ code.push("");
+ code.push("");
+ code.push(scheduler.config.recurring_workdays.join(","));
+ code.splice(0, 1);
+ }
+ },
+ year:function(code, dates) {
+ if (get_radio_value("year_type") == "d") {
+ code.push("1");
+ dates.start.setMonth(0);
+ dates.start.setDate(els["year_day"].value);
+ dates.start.setMonth(els["year_month"].value);
+
+ } else {
+ code.push("1");
+ code.push(els["year_day2"].value);
+ code.push(els["year_week2"].value);
+ dates.start.setDate(1);
+ dates.start.setMonth(els["year_month2"].value);
+ }
+ dates._start = true;
+ }
+ };
+ var set_rcode = {
+ week:function(code, dates) {
+ els["week_count"].value = code[1];
+ var col = els["week_day"];
+ var t = code[4].split(",");
+ var d = {};
+ for (var i = 0; i < t.length; i++) d[t[i]] = true;
+ for (var i = 0; i < col.length; i++)
+ col[i].checked = (!!d[col[i].value]);
+ },
+ month:function(code, dates) {
+ if (code[2] === "") {
+ els["month_type"][0].checked = true;
+ els["month_count"].value = code[1];
+ els["month_day"].value = dates.start.getDate();
+ } else {
+ els["month_type"][1].checked = true;
+ els["month_count2"].value = code[1];
+ els["month_week2"].value = code[3];
+ els["month_day2"].value = code[2];
+ }
+ },
+ day:function(code, dates) {
+ els["day_type"][0].checked = true;
+ els["day_count"].value = code[1];
+ },
+ year:function(code, dates) {
+ if (code[2] === "") {
+ els["year_type"][0].checked = true;
+ els["year_day"].value = dates.start.getDate();
+ els["year_month"].value = dates.start.getMonth();
+ } else {
+ els["year_type"][1].checked = true;
+ els["year_week2"].value = code[3];
+ els["year_day2"].value = code[2];
+ els["year_month2"].value = dates.start.getMonth();
+ }
+ }
+ };
+
+ function set_repeat_code(code, dates) {
+ var data = code.split("#");
+ code = data[0].split("_");
+ set_rcode[code[0]](code, dates);
+ var e = els["repeat"][({day:0, week:1, month:2, year:3})[code[0]]];
+ switch (data[1]) {
+ case "no":
+ els["end"][0].checked = true;
+ break;
+ case "":
+ els["end"][2].checked = true;
+
+ var end_date = dates.end;
+ if (scheduler.config.include_end_by){
+ end_date = scheduler.date.add(end_date, -1, 'day');
+ }
+
+ els["date_of_end"].value = date_str(end_date);
+ break;
+ default:
+ els["end"][1].checked = true;
+ els["occurences_count"].value = data[1];
+ break;
+ }
+
+ e.checked = true;
+ e.onclick();
+ }
+
+ scheduler.form_blocks["recurring"]._set_repeat_code = set_repeat_code;
+
+ for (var i = 0; i < top.elements.length; i++) {
+ var el = top.elements[i];
+ switch (el.name) {
+ case "repeat":
+ el.onclick = change_current_view;
+ break;
+ }
+ }
+ scheduler._lightbox._rec_init_done = true;
+ },
+ set_value:function(node, value, ev) {
+ var rf = scheduler.form_blocks["recurring"];
+ if (!scheduler._lightbox._rec_init_done)
+ rf._init_set_value(node, value, ev);
+ node.open = !ev.rec_type;
+ if (this._is_modified_occurence(ev))
+ node.blocked = true;
+ else node.blocked = false;
+
+ var ds = rf._ds;
+ ds.start = ev.start_date;
+ ds.end = ev._end_date;
+
+ rf.button_click(0, node.previousSibling.firstChild.firstChild, node, node);
+ if (value)
+ rf._set_repeat_code(value, ds);
+ },
+ get_value:function(node, ev) {
+ if (node.open) {
+ var ds = scheduler.form_blocks["recurring"]._ds;
+ var actual_dates = {};
+ this.formSection('time').getValue(actual_dates);
+ ds.start = actual_dates.start_date;
+ ev.rec_type = scheduler.form_blocks["recurring"]._get_repeat_code(ds);
+ if (ds._start) {
+ ev.start_date = new Date(ds.start);
+ ev._start_date = new Date(ds.start);
+ ds._start = false;
+ } else
+ ev._start_date = null;
+
+ ev._end_date = ds.end;
+ ev.rec_pattern = ev.rec_type.split("#")[0];
+ } else {
+ ev.rec_type = ev.rec_pattern = "";
+ ev._end_date = ev.end_date;
+ }
+ return ev.rec_type;
+ },
+ focus:function(node) {
+ },
+ button_click:function(index, el, section, cont) {
+ if (!cont.open && !cont.blocked) {
+ cont.style.height = "115px";
+ el.style.backgroundPosition = "-5px 0px";
+ el.nextSibling.innerHTML = scheduler.locale.labels.button_recurring_open;
+ } else {
+ cont.style.height = "0px";
+ el.style.backgroundPosition = "-5px 20px";
+ el.nextSibling.innerHTML = scheduler.locale.labels.button_recurring;
+ }
+ cont.open = !cont.open;
+
+ scheduler.setLightboxSize();
+ }
+};
+
+
+//problem may occur if we will have two repeating events in the same moment of time
+scheduler._rec_markers = {};
+scheduler._rec_markers_pull = {};
+scheduler._add_rec_marker = function(ev, time) {
+ ev._pid_time = time;
+ this._rec_markers[ev.id] = ev;
+ if (!this._rec_markers_pull[ev.event_pid]) this._rec_markers_pull[ev.event_pid] = {};
+ this._rec_markers_pull[ev.event_pid][time] = ev;
+};
+scheduler._get_rec_marker = function(time, id) {
+ var ch = this._rec_markers_pull[id];
+ if (ch) return ch[time];
+ return null;
+};
+scheduler._get_rec_markers = function(id) {
+ return (this._rec_markers_pull[id] || []);
+};
+scheduler._rec_temp = [];
+(function() {
+ var old_add_event = scheduler.addEvent;
+ scheduler.addEvent = function(start_date, end_date, text, id, extra_data) {
+ var ev_id = old_add_event.apply(this, arguments);
+
+ if (ev_id) {
+ var ev = scheduler.getEvent(ev_id);
+ if (this._is_modified_occurence(ev))
+ scheduler._add_rec_marker(ev, ev.event_length * 1000);
+ if (ev.rec_type)
+ ev.rec_pattern = ev.rec_type.split("#")[0];
+ }
+ return ev_id;
+ };
+})();
+scheduler.attachEvent("onEventIdChange", function(id, new_id) {
+ if (this._ignore_call) return;
+ this._ignore_call = true;
+
+ if(scheduler._rec_markers[id]){
+ //important for for correct work of scheduler.getEvents(from, to) and collision detection
+ scheduler._rec_markers[new_id] = scheduler._rec_markers[id];
+ delete scheduler._rec_markers[id];
+ }
+
+ for (var i = 0; i < this._rec_temp.length; i++) {
+ var tev = this._rec_temp[i];
+ if (tev.event_pid == id) {
+ tev.event_pid = new_id;
+ this.changeEventId(tev.id, new_id + "#" + tev.id.split("#")[1]);
+ }
+ }
+
+ delete this._ignore_call;
+});
+scheduler.attachEvent("onConfirmedBeforeEventDelete", function(id) {
+ var ev = this.getEvent(id);
+ if (this._is_virtual_event(id) || (this._is_modified_occurence(ev) && ev.rec_type && ev.rec_type != 'none')) {
+ id = id.split("#");
+ var nid = this.uid();
+ var tid = (id[1]) ? id[1] : (ev._pid_time / 1000);
+
+ var nev = this._copy_event(ev);
+ nev.id = nid;
+ nev.event_pid = ev.event_pid || id[0];
+ var timestamp = tid;
+ nev.event_length = timestamp;
+ nev.rec_type = nev.rec_pattern = "none";
+ this.addEvent(nev);
+
+ this._add_rec_marker(nev, timestamp * 1000);
+ } else {
+ if (ev.rec_type && this._lightbox_id)
+ this._roll_back_dates(ev);
+ var sub = this._get_rec_markers(id);
+ for (var i in sub) {
+ if (sub.hasOwnProperty(i)) {
+ id = sub[i].id;
+ if (this.getEvent(id))
+ this.deleteEvent(id, true);
+ }
+ }
+ }
+ return true;
+});
+scheduler.attachEvent("onEventDeleted", function(id, ev){
+ if(!this._is_virtual_event(id) && this._is_modified_occurence(ev)){
+ if(!scheduler._events[id]){
+ ev.rec_type = ev.rec_pattern = "none";
+ this.setEvent(id, ev);
+ }
+ }
+});
+scheduler.attachEvent("onEventChanged", function(id) {
+ if (this._loading) return true;
+
+ var ev = this.getEvent(id);
+
+ if (this._is_virtual_event(id)) {
+ var id = id.split("#");
+ var nid = this.uid();
+ this._not_render = true;
+
+ var nev = this._copy_event(ev);
+ nev.id = nid;
+ nev.event_pid = id[0];
+ var timestamp = id[1];
+ nev.event_length = timestamp;
+ nev.rec_type = nev.rec_pattern = "";
+
+ this._add_rec_marker(nev, timestamp * 1000);
+ this.addEvent(nev);
+
+ this._not_render = false;
+
+ } else {
+ if (ev.rec_type && this._lightbox_id)
+ this._roll_back_dates(ev);
+ var sub = this._get_rec_markers(id);
+ for (var i in sub) {
+ if (sub.hasOwnProperty(i)) {
+ delete this._rec_markers[sub[i].id];
+ this.deleteEvent(sub[i].id, true);
+ }
+ }
+ delete this._rec_markers_pull[id];
+
+ // it's possible that after editing event is no longer exists, in such case we need to remove _select_id flag
+ var isEventFound = false;
+ for (var k = 0; k < this._rendered.length; k++) {
+ if (this._rendered[k].getAttribute('event_id') == id)
+ isEventFound = true;
+ }
+ if (!isEventFound)
+ this._select_id = null;
+ }
+ return true;
+});
+scheduler.attachEvent("onEventAdded", function(id) {
+ if (!this._loading) {
+ var ev = this.getEvent(id);
+ if (ev.rec_type && !ev.event_length)
+ this._roll_back_dates(ev);
+ }
+ return true;
+});
+scheduler.attachEvent("onEventSave", function(id, data, is_new_event) {
+ var ev = this.getEvent(id);
+ if (!ev.rec_type && data.rec_type && !this._is_virtual_event(id))
+ this._select_id = null;
+ return true;
+});
+scheduler.attachEvent("onEventCreated", function(id) {
+ var ev = this.getEvent(id);
+ if (!ev.rec_type)
+ ev.rec_type = ev.rec_pattern = ev.event_length = ev.event_pid = "";
+ return true;
+});
+scheduler.attachEvent("onEventCancel", function(id) {
+ var ev = this.getEvent(id);
+ if (ev.rec_type) {
+ this._roll_back_dates(ev);
+ // a bit expensive, but we need to be sure that event re-rendered, because view can be corrupted by resize , during edit process
+ this.render_view_data();
+ }
+});
+scheduler._roll_back_dates = function(ev) {
+ ev.event_length = (ev.end_date.valueOf() - ev.start_date.valueOf()) / 1000;
+ ev.end_date = ev._end_date;
+ if (ev._start_date) {
+ ev.start_date.setMonth(0);
+ ev.start_date.setDate(ev._start_date.getDate());
+ ev.start_date.setMonth(ev._start_date.getMonth());
+ ev.start_date.setFullYear(ev._start_date.getFullYear());
+
+ }
+};
+
+scheduler._is_virtual_event = function(id){
+ return id.toString().indexOf("#") != -1;
+};
+scheduler._is_modified_occurence = function(ev){
+ return (ev.event_pid && ev.event_pid != "0");
+};
+
+scheduler._validId = function(id) {
+ return !this._is_virtual_event(id);
+};
+
+scheduler.showLightbox_rec = scheduler.showLightbox;
+scheduler.showLightbox = function(id) {
+ var locale = this.locale;
+ var c = scheduler.config.lightbox_recurring;
+ var ev = this.getEvent(id);
+ var pid = ev.event_pid;
+ var isVirtual = this._is_virtual_event(id);
+ if (isVirtual)
+ pid = id.split("#")[0];
+
+ // show series
+ var showSeries = function(id) {
+ var event = scheduler.getEvent(id);
+ event._end_date = event.end_date;
+ event.end_date = new Date(event.start_date.valueOf() + event.event_length * 1000);
+ return scheduler.showLightbox_rec(id); // editing series
+ };
+
+ if ( (pid || pid*1 === 0) && ev.rec_type) {
+ // direct API call on series id
+ return showSeries(id);
+ }
+ if ( !pid || pid === '0' || ( (!locale.labels.confirm_recurring || c == 'instance') || (c == 'series' && !isVirtual)) ) {
+ // editing instance or non recurring event
+ return this.showLightbox_rec(id);
+ }
+ if (c == 'ask') {
+ var that = this;
+ dhtmlx.modalbox({
+ text: locale.labels.confirm_recurring,
+ title: locale.labels.title_confirm_recurring,
+ width: "500px",
+ position: "middle",
+ buttons:[locale.labels.button_edit_series, locale.labels.button_edit_occurrence, locale.labels.icon_cancel],
+ callback: function(index) {
+ switch(+index) {
+ case 0:
+ return showSeries(pid);
+ case 1:
+ return that.showLightbox_rec(id);
+ case 2:
+ return;
+ }
+ }
+ });
+ } else {
+ showSeries(pid);
+ }
+};
+
+
+scheduler.get_visible_events_rec = scheduler.get_visible_events;
+scheduler.get_visible_events = function(only_timed) {
+ for (var i = 0; i < this._rec_temp.length; i++)
+ delete this._events[this._rec_temp[i].id];
+ this._rec_temp = [];
+
+ var stack = this.get_visible_events_rec(only_timed);
+ var out = [];
+ for (var i = 0; i < stack.length; i++) {
+ if (stack[i].rec_type) {
+ //deleted element of serie
+ if (stack[i].rec_pattern != "none")
+ this.repeat_date(stack[i], out);
+ }
+ else out.push(stack[i]);
+ }
+ return out;
+};
+
+
+(function() {
+ var old = scheduler.isOneDayEvent;
+ scheduler.isOneDayEvent = function(ev) {
+ if (ev.rec_type) return true;
+ return old.call(this, ev);
+ };
+ var old_update_event = scheduler.updateEvent;
+ scheduler.updateEvent = function(id) {
+ var ev = scheduler.getEvent(id);
+ if(ev && ev.rec_type){
+ //rec_type can be changed without the lightbox,
+ // make sure rec_pattern updated as well
+ ev.rec_pattern = (ev.rec_type || "").split("#")[0];
+ }
+ if (ev && ev.rec_type && !this._is_virtual_event(id)) {
+ scheduler.update_view();
+ } else {
+ old_update_event.call(this, id);
+ }
+ };
+})();
+
+scheduler.transponse_size = {
+ day:1, week:7, month:1, year:12
+};
+scheduler.date.day_week = function(sd, day, week) {
+ sd.setDate(1);
+ week = (week - 1) * 7;
+ var cday = sd.getDay();
+ var nday = day * 1 + week - cday + 1;
+ sd.setDate(nday <= week ? (nday + 7) : nday);
+};
+scheduler.transpose_day_week = function(sd, list, cor, size, cor2) {
+ var cday = (sd.getDay() || (scheduler.config.start_on_monday ? 7 : 0)) - cor;
+ for (var i = 0; i < list.length; i++) {
+ if (list[i] > cday)
+ return sd.setDate(sd.getDate() + list[i] * 1 - cday - (size ? cor : cor2));
+ }
+ this.transpose_day_week(sd, list, cor + size, null, cor);
+};
+scheduler.transpose_type = function(type) {
+ var f = "transpose_" + type;
+ if (!this.date[f]) {
+ var str = type.split("_");
+ var day = 60 * 60 * 24 * 1000;
+ var gf = "add_" + type;
+ var step = this.transponse_size[str[0]] * str[1];
+
+ if (str[0] == "day" || str[0] == "week") {
+ var days = null;
+ if (str[4]) {
+ days = str[4].split(",");
+ if (scheduler.config.start_on_monday) {
+ for (var i = 0; i < days.length; i++)
+ days[i] = (days[i] * 1) || 7;
+ days.sort();
+ }
+ }
+
+ this.date[f] = function(nd, td) {
+ var delta = Math.floor((td.valueOf() - nd.valueOf()) / (day * step));
+ if (delta > 0)
+ nd.setDate(nd.getDate() + delta * step);
+ if (days)
+ scheduler.transpose_day_week(nd, days, 1, step);
+ };
+ this.date[gf] = function(sd, inc) {
+ var nd = new Date(sd.valueOf());
+ if (days) {
+ for (var count = 0; count < inc; count++)
+ scheduler.transpose_day_week(nd, days, 0, step);
+ } else
+ nd.setDate(nd.getDate() + inc * step);
+
+ return nd;
+ };
+ }
+ else if (str[0] == "month" || str[0] == "year") {
+ this.date[f] = function(nd, td) {
+ var delta = Math.ceil(((td.getFullYear() * 12 + td.getMonth() * 1) - (nd.getFullYear() * 12 + nd.getMonth() * 1)) / (step));
+ if (delta >= 0)
+ nd.setMonth(nd.getMonth() + delta * step);
+ if (str[3])
+ scheduler.date.day_week(nd, str[2], str[3]);
+ };
+ this.date[gf] = function(sd, inc) {
+ var nd = new Date(sd.valueOf());
+ nd.setMonth(nd.getMonth() + inc * step);
+ if (str[3])
+ scheduler.date.day_week(nd, str[2], str[3]);
+ return nd;
+ };
+ }
+ }
+};
+scheduler.repeat_date = function(ev, stack, non_render, from, to) {
+
+ from = from || this._min_date;
+ to = to || this._max_date;
+
+ var td = new Date(ev.start_date.valueOf());
+
+ if (!ev.rec_pattern && ev.rec_type)
+ ev.rec_pattern = ev.rec_type.split("#")[0];
+
+ this.transpose_type(ev.rec_pattern);
+ scheduler.date["transpose_" + ev.rec_pattern](td, from);
+ while (td < ev.start_date || scheduler._fix_daylight_saving_date(td,from,ev,td,new Date(td.valueOf() + ev.event_length * 1000)).valueOf() <= from.valueOf() || td.valueOf() + ev.event_length * 1000 <= from.valueOf())
+ td = this.date.add(td, 1, ev.rec_pattern);
+ while (td < to && td < ev.end_date) {
+ var timestamp = (scheduler.config.occurrence_timestamp_in_utc) ? Date.UTC(td.getFullYear(), td.getMonth(), td.getDate(), td.getHours(), td.getMinutes(), td.getSeconds()) : td.valueOf();
+ var ch = this._get_rec_marker(timestamp, ev.id);
+ if (!ch) { // unmodified element of series
+ var ted = new Date(td.valueOf() + ev.event_length * 1000);
+ var copy = this._copy_event(ev);
+ //copy._timed = ev._timed;
+ copy.text = ev.text;
+ copy.start_date = td;
+ copy.event_pid = ev.id;
+ copy.id = ev.id + "#" + Math.ceil(timestamp / 1000);
+ copy.end_date = ted;
+
+ copy.end_date = scheduler._fix_daylight_saving_date(copy.start_date, copy.end_date, ev, td, copy.end_date);
+
+ copy._timed = this.isOneDayEvent(copy);
+
+ if (!copy._timed && !this._table_view && !this.config.multi_day) return;
+ stack.push(copy);
+
+ if (!non_render) {
+ this._events[copy.id] = copy;
+ this._rec_temp.push(copy);
+ }
+
+ } else
+ if (non_render) stack.push(ch);
+
+ td = this.date.add(td, 1, ev.rec_pattern);
+ }
+};
+scheduler._fix_daylight_saving_date = function(start_date, end_date, ev, counter, default_date) {
+ var shift = start_date.getTimezoneOffset() - end_date.getTimezoneOffset();
+ if (shift) {
+ if (shift > 0) {
+ // e.g. 24h -> 23h
+ return new Date(counter.valueOf() + ev.event_length * 1000 - shift * 60 * 1000);
+ }
+ else {
+ // e.g. 24h -> 25h
+ return new Date(end_date.valueOf() - shift * 60 * 1000);
+ }
+ }
+ return new Date(default_date.valueOf());
+};
+scheduler.getRecDates = function(id, max) {
+ var ev = typeof id == "object" ? id : scheduler.getEvent(id);
+ var count = 0;
+ var result = [];
+ max = max || 100;
+
+ var td = new Date(ev.start_date.valueOf());
+ var from = new Date(td.valueOf());
+
+ if (!ev.rec_type) {
+ return [
+ { start_date: ev.start_date, end_date: ev.end_date }
+ ];
+ }
+ if (ev.rec_type == "none") {
+ return [];
+ }
+ this.transpose_type(ev.rec_pattern);
+ scheduler.date["transpose_" + ev.rec_pattern](td, from);
+
+ while (td < ev.start_date || (td.valueOf() + ev.event_length * 1000) <= from.valueOf())
+ td = this.date.add(td, 1, ev.rec_pattern);
+ while (td < ev.end_date) {
+ var ch = this._get_rec_marker(td.valueOf(), ev.id);
+ var res = true;
+ if (!ch) { // unmodified element of series
+ var sed = new Date(td);
+ var ted = new Date(td.valueOf() + ev.event_length * 1000);
+
+ ted = scheduler._fix_daylight_saving_date(sed, ted, ev, td, ted);
+
+ result.push({start_date:sed, end_date:ted});
+ } else if(ch.rec_type == "none") {
+ res = false;
+ } else {
+ result.push({ start_date: ch.start_date, end_date: ch.end_date });
+ }
+
+ td = this.date.add(td, 1, ev.rec_pattern);
+ if (res) {
+ count++;
+ if (count == max)
+ break;
+ }
+ }
+ return result;
+};
+scheduler.getEvents = function(from, to) {
+ var result = [];
+ for (var a in this._events) {
+ var ev = this._events[a];
+ if (ev && ev.start_date < to && ev.end_date > from) {
+ if (ev.rec_pattern) {
+ if (ev.rec_pattern == "none") continue;
+ var sev = [];
+ this.repeat_date(ev, sev, true, from, to);
+ for (var i = 0; i < sev.length; i++) {
+ // if event is in rec_markers then it will be checked by himself, here need to skip it
+ if (!sev[i].rec_pattern && sev[i].start_date < to && sev[i].end_date > from && !this._rec_markers[sev[i].id]) {
+ result.push(sev[i]);
+ }
+ }
+ } else if (!this._is_virtual_event(ev.id)) { // if it's virtual event we can skip it
+ result.push(ev);
+ }
+ }
+ }
+ return result;
+};
+
+scheduler.config.repeat_date = "%m.%d.%Y";
+scheduler.config.lightbox.sections = [
+ {name:"description", height:130, map_to:"text", type:"textarea" , focus:true},
+ {name:"recurring", type:"recurring", map_to:"rec_type", button:"recurring"},
+ {name:"time", height:72, type:"time", map_to:"auto"}
+];
+
+
+//drop secondary attributes
+scheduler._copy_dummy = function(ev) {
+ var start_date = new Date(this.start_date);
+ var end_date = new Date(this.end_date);
+ this.start_date = start_date;
+ this.end_date = end_date;
+ this.event_length = this.event_pid = this.rec_pattern = this.rec_type = null;
+};
+
+scheduler.config.include_end_by = false;
+scheduler.config.lightbox_recurring = 'ask'; // series, instance
+
+scheduler.attachEvent("onClearAll", function(){
+ scheduler._rec_markers = {}; //clear recurring events data
+ scheduler._rec_markers_pull = {};
+ scheduler._rec_temp = [];
+});
+
+scheduler.__recurring_template='<div class="dhx_form_repeat"> <form> <div class="dhx_repeat_left"> <label><input class="dhx_repeat_radio" type="radio" name="repeat" value="day" />Daily</label><br /> <label><input class="dhx_repeat_radio" type="radio" name="repeat" value="week"/>Weekly</label><br /> <label><input class="dhx_repeat_radio" type="radio" name="repeat" value="month" checked />Monthly</label><br /> <label><input class="dhx_repeat_radio" type="radio" name="repeat" value="year" />Yearly</label> </div> <div class="dhx_repeat_divider"></div> <div class="dhx_repeat_center"> <div style="display:none;" id="dhx_repeat_day"> <label><input class="dhx_repeat_radio" type="radio" name="day_type" value="d"/>Every</label><input class="dhx_repeat_text" type="text" name="day_count" value="1" />day<br /> <label><input class="dhx_repeat_radio" type="radio" name="day_type" checked value="w"/>Every workday</label> </div> <div style="display:none;" id="dhx_repeat_week"> Repeat every<input class="dhx_repeat_text" type="text" name="week_count" value="1" />week next days:<br /> <table class="dhx_repeat_days"> <tr> <td> <label><input class="dhx_repeat_checkbox" type="checkbox" name="week_day" value="1" />Monday</label><br /> <label><input class="dhx_repeat_checkbox" type="checkbox" name="week_day" value="4" />Thursday</label> </td> <td> <label><input class="dhx_repeat_checkbox" type="checkbox" name="week_day" value="2" />Tuesday</label><br /> <label><input class="dhx_repeat_checkbox" type="checkbox" name="week_day" value="5" />Friday</label> </td> <td> <label><input class="dhx_repeat_checkbox" type="checkbox" name="week_day" value="3" />Wednesday</label><br /> <label><input class="dhx_repeat_checkbox" type="checkbox" name="week_day" value="6" />Saturday</label> </td> <td> <label><input class="dhx_repeat_checkbox" type="checkbox" name="week_day" value="0" />Sunday</label><br /><br /> </td> </tr> </table> </div> <div id="dhx_repeat_month"> <label><input class="dhx_repeat_radio" type="radio" name="month_type" value="d"/>Repeat</label><input class="dhx_repeat_text" type="text" name="month_day" value="1" />day every<input class="dhx_repeat_text" type="text" name="month_count" value="1" />month<br /> <label><input class="dhx_repeat_radio" type="radio" name="month_type" checked value="w"/>On</label><input class="dhx_repeat_text" type="text" name="month_week2" value="1" /><select name="month_day2"><option value="1" selected >Monday<option value="2">Tuesday<option value="3">Wednesday<option value="4">Thursday<option value="5">Friday<option value="6">Saturday<option value="0">Sunday</select>every<input class="dhx_repeat_text" type="text" name="month_count2" value="1" />month<br /> </div> <div style="display:none;" id="dhx_repeat_year"> <label><input class="dhx_repeat_radio" type="radio" name="year_type" value="d"/>Every</label><input class="dhx_repeat_text" type="text" name="year_day" value="1" />day<select name="year_month"><option value="0" selected >January<option value="1">February<option value="2">March<option value="3">April<option value="4">May<option value="5">June<option value="6">July<option value="7">August<option value="8">September<option value="9">October<option value="10">November<option value="11">December</select>month<br /> <label><input class="dhx_repeat_radio" type="radio" name="year_type" checked value="w"/>On</label><input class="dhx_repeat_text" type="text" name="year_week2" value="1" /><select name="year_day2"><option value="1" selected >Monday<option value="2">Tuesday<option value="3">Wednesday<option value="4">Thursday<option value="5">Friday<option value="6">Saturday<option value="7">Sunday</select>of<select name="year_month2"><option value="0" selected >January<option value="1">February<option value="2">March<option value="3">April<option value="4">May<option value="5">June<option value="6">July<option value="7">August<option value="8">September<option value="9">October<option value="10">November<option value="11">December</select><br /> </div> </div> <div class="dhx_repeat_divider"></div> <div class="dhx_repeat_right"> <label><input class="dhx_repeat_radio" type="radio" name="end" checked/>No end date</label><br /> <label><input class="dhx_repeat_radio" type="radio" name="end" />After</label><input class="dhx_repeat_text" type="text" name="occurences_count" value="1" />occurrences<br /> <label><input class="dhx_repeat_radio" type="radio" name="end" />End by</label><input class="dhx_repeat_date" type="text" name="date_of_end" value="'+scheduler.config.repeat_date_of_end+'" /><br /> </div> </form> </div> <div style="clear:both"> </div>';
diff --git a/codebase/sources/ext/dhtmlxscheduler_recurring.js.map b/codebase/sources/ext/dhtmlxscheduler_recurring.js.map
new file mode 100644
index 0000000..d69ba82
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_recurring.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_recurring.js.map","sources":["dhtmlxscheduler_recurring.js"],"names":["scheduler","config","occurrence_timestamp_in_utc","recurring_workdays","form_blocks","render","__recurring_template","_ds","_init_set_value","node","value","ev","register_els","inps","i","length","inp","type","els","name","push","get_radio_value","col","checked","change_current_view","$","style","display","this","get_repeat_code","dates","code","get_rcode","repeat","end","Date","str_date","transpose_type","join","Math","max","transp","toString","indexOf","start_on_monday","date","add","start","set_repeat_code","data","split","set_rcode","e","day","week","month","year","end_date","include_end_by","date_str","onclick","start_date","_end_date","str_date_format","str_to_date","repeat_date","date_to_str","top","getElementsByTagName","repeat_date_of_end","formatter","_currentDate","a","document","getElementById","_get_repeat_code","setDate","repeat_precise","_start","t","getDay","start_exists","sort","transpose_day_week","week_start","splice","setMonth","d","getDate","getMonth","_set_repeat_code","elements","el","_lightbox","_rec_init_done","set_value","rf","open","rec_type","blocked","_is_modified_occurence","ds","button_click","previousSibling","firstChild","get_value","actual_dates","formSection","getValue","_start_date","rec_pattern","focus","index","section","cont","height","backgroundPosition","nextSibling","innerHTML","locale","labels","button_recurring","button_recurring_open","setLightboxSize","_rec_markers","_rec_markers_pull","_add_rec_marker","time","_pid_time","id","event_pid","_get_rec_marker","ch","_get_rec_markers","_rec_temp","old_add_event","addEvent","ev_id","apply","arguments","getEvent","event_length","attachEvent","new_id","_ignore_call","tev","changeEventId","_is_virtual_event","nid","uid","tid","nev","_copy_event","timestamp","_lightbox_id","_roll_back_dates","sub","hasOwnProperty","deleteEvent","_events","setEvent","_loading","_not_render","isEventFound","k","_rendered","getAttribute","_select_id","render_view_data","valueOf","setFullYear","getFullYear","_validId","showLightbox_rec","showLightbox","c","lightbox_recurring","pid","isVirtual","showSeries","event","confirm_recurring","that","dhtmlx","modalbox","text","title","title_confirm_recurring","width","position","buttons","button_edit_series","button_edit_occurrence","icon_cancel","callback","get_visible_events_rec","get_visible_events","only_timed","stack","out","old","isOneDayEvent","call","old_update_event","updateEvent","update_view","transponse_size","day_week","sd","cday","nday","list","cor","size","cor2","f","str","gf","step","days","nd","td","delta","floor","inc","count","ceil","non_render","from","to","_min_date","_max_date","_fix_daylight_saving_date","UTC","getHours","getMinutes","getSeconds","ted","copy","_timed","_table_view","multi_day","counter","default_date","shift","getTimezoneOffset","getRecDates","result","res","sed","getEvents","sev","lightbox","sections","map_to","button","_copy_dummy"],"mappings":"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"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_serialize.js b/codebase/sources/ext/dhtmlxscheduler_serialize.js
new file mode 100644
index 0000000..88b70ef
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_serialize.js
@@ -0,0 +1,110 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+scheduler._get_serializable_data = function(){
+ var res = {};
+ for (var a in this._events){
+ var ev = this._events[a];
+ if (ev.id.toString().indexOf("#") == -1){
+ res[ev.id] = ev;
+ }
+ }
+ return res;
+};
+
+//redefine this method, if you want to provide a custom set of attributes for serialization
+scheduler.data_attributes=function(){
+ var attrs = [];
+ var format = scheduler.templates.xml_format;
+ var all_events = this._get_serializable_data();
+ for (var a in all_events){
+ var ev = all_events[a];
+ for (var name in ev)
+ if (name.substr(0,1) !="_")
+ attrs.push([name,((name == "start_date" || name == "end_date")?format:null)]);
+ break;
+ }
+ return attrs;
+};
+
+scheduler.toXML = function(header){
+ var xml = [];
+ var attrs = this.data_attributes();
+
+ var all_events = this._get_serializable_data();
+ for (var a in all_events){
+ var ev = all_events[a];
+
+ xml.push("<event>");
+ for (var i=0; i < attrs.length; i++)
+ xml.push("<"+attrs[i][0]+"><![CDATA["+(attrs[i][1]?attrs[i][1](ev[attrs[i][0]]):ev[attrs[i][0]])+"]]></"+attrs[i][0]+">");
+
+ xml.push("</event>");
+ }
+ return (header||"")+"<data>"+xml.join("\n")+"</data>";
+};
+
+scheduler._serialize_json_value = function(value){
+ if(value === null || typeof value === "boolean"){
+ value = "" + value;
+ }else{
+ if(!value && value !== 0){
+ value = "";
+ }
+ value = '"' + value.toString().
+ replace(/\n/g,"").
+ replace(/\\/g,"\\\\").
+ replace(/\"/g, '\\"') + '"';
+ }
+ return value;
+};
+
+scheduler.toJSON = function(){
+ var json = [], value = "";
+ var attrs = this.data_attributes();
+ var all_events = this._get_serializable_data();
+ for (var a in all_events){
+ var ev = all_events[a];
+
+ var line =[];
+ for (var i=0; i < attrs.length; i++){
+ value = (attrs[i][1]) ? attrs[i][1](ev[attrs[i][0]]) : ev[attrs[i][0]];
+
+ line.push(' "'+attrs[i][0]+'": '+ this._serialize_json_value(value));
+ }
+ json.push("{"+line.join(",")+"}");
+ }
+ return "["+json.join(",\n")+"]";
+};
+
+
+scheduler.toICal = function(header){
+ var start = "BEGIN:VCALENDAR\nVERSION:2.0\nPRODID:-//dhtmlXScheduler//NONSGML v2.2//EN\nDESCRIPTION:";
+ var end = "END:VCALENDAR";
+ var format = scheduler.date.date_to_str("%Y%m%dT%H%i%s");
+ var full_day_format = scheduler.date.date_to_str("%Y%m%d");
+
+ var ical = [];
+ var all_events = this._get_serializable_data();
+ for (var a in all_events){
+ var ev = all_events[a];
+
+
+ ical.push("BEGIN:VEVENT");
+ if (!ev._timed || (!ev.start_date.getHours() && !ev.start_date.getMinutes()))
+ ical.push("DTSTART:"+full_day_format(ev.start_date));
+ else
+ ical.push("DTSTART:"+format(ev.start_date));
+ if (!ev._timed || (!ev.end_date.getHours() && !ev.end_date.getMinutes()))
+ ical.push("DTEND:"+full_day_format(ev.end_date));
+ else
+ ical.push("DTEND:"+format(ev.end_date));
+ ical.push("SUMMARY:"+ev.text);
+ ical.push("END:VEVENT");
+ }
+ return start+(header||"")+"\n"+ical.join("\n")+"\n"+end;
+}; \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_serialize.js.map b/codebase/sources/ext/dhtmlxscheduler_serialize.js.map
new file mode 100644
index 0000000..6ad3a60
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_serialize.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_serialize.js.map","sources":["dhtmlxscheduler_serialize.js"],"names":["scheduler","_get_serializable_data","res","a","this","_events","ev","id","toString","indexOf","data_attributes","attrs","format","templates","xml_format","all_events","name","substr","push","toXML","header","xml","i","length","join","_serialize_json_value","value","replace","toJSON","json","line","toICal","start","end","date","date_to_str","full_day_format","ical","_timed","start_date","getHours","getMinutes","end_date","text"],"mappings":"AAAAA,UAAUC,uBAAyB,WAClC,GAAIC,KACJ,KAAK,GAAIC,KAAKC,MAAKC,QAAQ,CAC1B,GAAIC,GAAKF,KAAKC,QAAQF,EACe,KAAjCG,EAAGC,GAAGC,WAAWC,QAAQ,OAC5BP,EAAII,EAAGC,IAAMD,GAGf,MAAOJ,IAIRF,UAAUU,gBAAgB,WACzB,GAAIC,MACAC,EAASZ,UAAUa,UAAUC,WAC7BC,EAAaX,KAAKH,wBACtB,KAAK,GAAIE,KAAKY,GAAW,CACxB,GAAIT,GAAKS,EAAWZ,EACpB,KAAK,GAAIa,KAAQV,GACO,KAAnBU,EAAKC,OAAO,EAAE,IACjBN,EAAMO,MAAMF,EAAe,cAARA,GAAgC,YAARA,EAAoBJ,EAAO,MACxE,OAED,MAAOD,IAGRX,UAAUmB,MAAQ,SAASC,GAC1B,GAAIC,MACAV,EAAQP,KAAKM,kBAEbK,EAAaX,KAAKH,wBACtB,KAAK,GAAIE,KAAKY,GAAW,CACxB,GAAIT,GAAKS,EAAWZ,EAEpBkB;EAAIH,KAAK,UACT,KAAK,GAAII,GAAE,EAAGA,EAAIX,EAAMY,OAAQD,IAC/BD,EAAIH,KAAK,IAAIP,EAAMW,GAAG,GAAG,cAAcX,EAAMW,GAAG,GAAGX,EAAMW,GAAG,GAAGhB,EAAGK,EAAMW,GAAG,KAAKhB,EAAGK,EAAMW,GAAG,KAAK,QAAQX,EAAMW,GAAG,GAAG,IAEtHD,GAAIH,KAAK,YAEV,OAAQE,GAAQ,IAAI,SAASC,EAAIG,KAAK,MAAM,WAG7CxB,UAAUyB,sBAAwB,SAASC,GAY1C,MAXa,QAAVA,GAAmC,iBAAVA,GAC3BA,EAAQ,GAAKA,GAETA,GAAmB,IAAVA,IACZA,EAAQ,IAETA,EAAQ,IAAMA,EAAMlB,WACnBmB,QAAQ,MAAM,IACdA,QAAQ,MAAM,QACdA,QAAQ,MAAO,OAAS,KAEnBD,GAGR1B,UAAU4B,OAAS,WAClB,GAAIC,MAAWH,EAAQ,GACnBf,EAAQP,KAAKM,kBACbK,EAAaX,KAAKH,wBACtB,KAAK,GAAIE,KAAKY,GAAW,CAIxB,IAAK,GAHDT,GAAKS,EAAWZ,GAEhB2B,KACKR,EAAE,EAAGA,EAAIX,EAAMY,OAAQD,IAC/BI,EAASf,EAAMW,GAAG,GAAMX,EAAMW,GAAG,GAAGhB,EAAGK,EAAMW,GAAG,KAAOhB,EAAGK,EAAMW,GAAG,IAEnEQ,EAAKZ,KAAK,KAAKP,EAAMW,GAAG,GAAG,MAAOlB,KAAKqB,sBAAsBC,GAE9DG;EAAKX,KAAK,IAAIY,EAAKN,KAAK,KAAK,KAE9B,MAAO,IAAIK,EAAKL,KAAK,OAAO,KAI7BxB,UAAU+B,OAAS,SAASX,GAC3B,GAAIY,GAAQ,0FACRC,EAAM,gBACNrB,EAASZ,UAAUkC,KAAKC,YAAY,iBACpCC,EAAkBpC,UAAUkC,KAAKC,YAAY,UAE7CE,KACAtB,EAAaX,KAAKH,wBACtB,KAAK,GAAIE,KAAKY,GAAW,CACxB,GAAIT,GAAKS,EAAWZ,EAGpBkC,GAAKnB,KAAK,gBAITmB,EAAKnB,KAHDZ,EAAGgC,SAAYhC,EAAGiC,WAAWC,YAAelC,EAAGiC,WAAWE,cAGpD,WAAW7B,EAAON,EAAGiC,YAFrB,WAAWH,EAAgB9B,EAAGiC,aAMxCF,EAAKnB,KAHDZ,EAAGgC,SAAYhC,EAAGoC,SAASF,YAAelC,EAAGoC,SAASD,cAGhD,SAAS7B,EAAON,EAAGoC,UAFnB,SAASN,EAAgB9B,EAAGoC,WAGvCL,EAAKnB,KAAK,WAAWZ,EAAGqC,MACxBN,EAAKnB,KAAK;CAEX,MAAOc,IAAOZ,GAAQ,IAAI,KAAKiB,EAAKb,KAAK,MAAM,KAAKS"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_timeline.js b/codebase/sources/ext/dhtmlxscheduler_timeline.js
new file mode 100644
index 0000000..2f60f9f
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_timeline.js
@@ -0,0 +1,1277 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+scheduler._temp_matrix_scope = function(){
+
+
+
+scheduler.matrix = {};
+scheduler._merge=function(a,b){
+ for (var c in b)
+ if (typeof a[c] == "undefined")
+ a[c]=b[c];
+};
+scheduler.createTimelineView=function(obj){
+ scheduler._skin_init();
+
+ scheduler._merge(obj,{
+ section_autoheight: true,
+ name:"matrix",
+ x:"time",
+ y:"time",
+ x_step:1,
+ x_unit:"hour",
+ y_unit:"day",
+ y_step:1,
+ x_start:0,
+ x_size:24,
+ y_start:0,
+ y_size: 7,
+ render:"cell",
+ dx:200,
+ dy:50,
+ event_dy: scheduler.xy.bar_height-5,
+ event_min_dy: scheduler.xy.bar_height-5,
+ resize_events: true,
+ fit_events: true,
+ show_unassigned: false,
+ second_scale: false,
+ round_position: false,
+ _logic: function(render_name, y_unit, timeline) {
+ var res = {};
+ if(scheduler.checkEvent("onBeforeSectionRender")) {
+ res = scheduler.callEvent("onBeforeSectionRender", [render_name, y_unit, timeline]);
+ }
+ return res;
+ }
+ });
+ obj._original_x_start = obj.x_start;
+
+ //first and last hours are applied only to day based timeline
+ if (obj.x_unit != "day") obj.first_hour = obj.last_hour = 0;
+ //correction for first and last hour
+ obj._start_correction = obj.first_hour?obj.first_hour*60*60*1000:0;
+ obj._end_correction = obj.last_hour?(24-obj.last_hour)*60*60*1000:0;
+
+ if (scheduler.checkEvent("onTimelineCreated")) {
+ scheduler.callEvent("onTimelineCreated", [obj]);
+ }
+
+ var old = scheduler.render_data;
+ scheduler.render_data = function(evs, mode) {
+ if (this._mode == obj.name) {
+ //repaint single event, precision is not necessary
+ if (mode && !obj.show_unassigned && obj.render != "cell") {
+ for (var i = 0; i < evs.length; i++) {
+ this.clear_event(evs[i]);
+ this.render_timeline_event.call(this.matrix[this._mode], evs[i], true);
+ }
+ } else {
+ scheduler._renderMatrix.call(obj, true, true);
+ }
+ } else
+ return old.apply(this, arguments);
+ };
+
+ scheduler.matrix[obj.name]=obj;
+ scheduler.templates[obj.name+"_cell_value"] = function(ar){ return ar?ar.length:""; };
+ scheduler.templates[obj.name+"_cell_class"] = function(arr){ return ""; };
+ scheduler.templates[obj.name+"_scalex_class"] = function(date){ return ""; };
+ scheduler.templates[obj.name+"_second_scalex_class"] = function(date){ return ""; };
+
+ scheduler.templates[obj.name+"_scaley_class"] = function(section_id, section_label, section_options){ return ""; };
+ scheduler.templates[obj.name+"_scale_label"] = function(section_id, section_label, section_options){ return section_label; };
+
+ scheduler.templates[obj.name+"_tooltip"] = function(a,b,e){ return e.text; };
+ scheduler.templates[obj.name+"_date"] = function(datea, dateb){
+ if ( (datea.getDay()==dateb.getDay() && dateb-datea < (24*60*60*1000)) ||
+ +datea == +scheduler.date.date_part(new Date(dateb)) ||
+ (+scheduler.date.add(datea, 1, "day") == +dateb && dateb.getHours() === 0 && dateb.getMinutes() === 0) )
+ return scheduler.templates.day_date(datea);
+ if ( (datea.getDay() != dateb.getDay() && dateb-datea < (24*60*60*1000)) ) {
+ return scheduler.templates.day_date(datea)+" &ndash; "+scheduler.templates.day_date(dateb);
+ }
+ return scheduler.templates.week_date(datea, dateb);
+ };
+
+ scheduler.templates[obj.name+"_scale_date"] = scheduler.date.date_to_str(obj.x_date||scheduler.config.hour_date);
+ scheduler.templates[obj.name+"_second_scale_date"] = scheduler.date.date_to_str((obj.second_scale && obj.second_scale.x_date)?obj.second_scale.x_date:scheduler.config.hour_date);
+
+ scheduler.date["add_" + obj.name] = function(date, step, c) {
+ var resulting_date = scheduler.date.add(date, (obj.x_length || obj.x_size) * step * obj.x_step, obj.x_unit);
+ if (obj.x_unit == "minute" || obj.x_unit == "hour") {
+ var size = (obj.x_length || obj.x_size);
+ var converted_step = (obj.x_unit == "hour") ? obj.x_step*60 : obj.x_step;
+ if((converted_step * size) % (24 * 60)){
+ //if scroll hours within the day
+ if ( +scheduler.date.date_part(new Date(date)) == +scheduler.date.date_part(new Date(resulting_date )) ) {
+ obj.x_start += step*size;
+ } else {
+ // total steps starting from 0
+ var total_steps = ( (24 * 60) / (size * converted_step) ) - 1;
+ var steps_offset = Math.round(total_steps * size);
+
+ if (step > 0) {
+ obj.x_start = obj.x_start - steps_offset;
+ } else {
+ obj.x_start = steps_offset + obj.x_start;
+ }
+ }
+ }
+ }
+ return resulting_date;
+ };
+ scheduler.date[obj.name+"_start"] = function(date) {
+ var func = scheduler.date[obj.x_unit+"_start"] || scheduler.date.day_start;
+ var start_date = func.call(scheduler.date, date);
+ start_date = scheduler.date.add(start_date, obj.x_step*obj.x_start, obj.x_unit);
+ return start_date;
+ };
+
+
+ scheduler.callEvent("onOptionsLoad",[obj]);
+
+ //init custom wrappers
+ scheduler[obj.name+"_view"]=function(){
+ scheduler._renderMatrix.apply(obj, arguments);
+ };
+
+ //enable drag for non-cell modes
+ var temp_date = new Date();
+ var step_diff = (scheduler.date.add(temp_date, obj.x_step, obj.x_unit).valueOf() - temp_date.valueOf()); // "minute" + step in ms
+ scheduler["mouse_"+obj.name]=function(pos){ //mouse_coord handler
+ //get event object
+ var ev = this._drag_event;
+ if (this._drag_id){
+ ev = this.getEvent(this._drag_id);
+ this._drag_event._dhx_changed = true;
+ }
+
+ pos.x-=obj.dx;
+ var summ = 0, xind = 0;
+ var ratio,
+ column_width;
+ for (xind; xind <= this._cols.length-1; xind++) {
+
+ column_width = this._cols[xind];
+ summ += column_width;
+ if (summ>pos.x){ //index of section
+ ratio = (pos.x-(summ-column_width))/column_width;
+ ratio = (ratio < 0) ? 0 : ratio;
+ break;
+ }
+ }
+
+ if(obj.round_position){
+ // in case of click, mouse position will be always rounded to start date of the cell
+ // when dragging - position can be rounded to the start date of the next column, in order to improve the usability
+ // edge = 1 - always return start date of current cell
+ // 0.5 - round to next cell if mouse in the right half of cell
+ var edge = 1;
+ if(scheduler.getState().drag_mode && scheduler.getState().drag_mode != "move"){
+ edge = 0.5;//rounding for resize
+ }
+ if(ratio >= edge){
+ xind++;
+ }
+ ratio = 0;
+ }
+
+ //border cases
+ if (xind === 0 && this._ignores[0]) {
+ xind = 1; ratio = 0;
+ while (this._ignores[xind]) xind++;
+ } else if ( xind == this._cols.length && this._ignores[xind-1]) {
+ xind = this._cols.length-1; ratio = 0;
+ while (this._ignores[xind]) xind--;
+ xind++;
+ }
+
+
+ pos.x = 0;
+ pos.force_redraw = true;
+ pos.custom = true;
+
+ var end_date;
+ // if our event is at the end of the view
+ if(xind >= obj._trace_x.length) {
+ end_date = scheduler.date.add(obj._trace_x[obj._trace_x.length-1], obj.x_step, obj.x_unit);
+ if (obj._end_correction)
+ end_date = new Date(end_date-obj._end_correction);
+ } else {
+ var timestamp_diff = ratio * column_width * obj._step + obj._start_correction;
+ end_date = new Date(+obj._trace_x[xind]+timestamp_diff);
+ }
+
+ // as we can simply be calling _locate_cell_timeline
+ if (this._drag_mode == "move" && this._drag_id && this._drag_event) {
+ var ev = this.getEvent(this._drag_id);
+ var drag_event = this._drag_event;
+
+ pos._ignores = (this._ignores_detected || obj._start_correction || obj._end_correction);
+ if (!drag_event._move_delta) {
+ drag_event._move_delta = (ev.start_date-end_date)/60000;
+ if (this.config.preserve_length && pos._ignores){
+ drag_event._move_delta = this._get_real_event_length(ev.start_date,end_date, obj);
+ drag_event._event_length = this._get_real_event_length(ev.start_date,ev.end_date, obj);
+ }
+ }
+
+
+
+
+ //preserve visible size of event
+ if (this.config.preserve_length && pos._ignores){
+ var ev_length = drag_event._event_length;//this._get_real_event_length(ev.start_date, ev.end_date, obj);
+ var current_back_shift = this._get_fictional_event_length(end_date, drag_event._move_delta, obj, true);
+ end_date = new Date(end_date - current_back_shift);
+ } else {
+ // converting basically to start_date
+ end_date = scheduler.date.add(end_date, drag_event._move_delta, "minute");
+ }
+ }
+
+ if (this._drag_mode == "resize" && ev){
+ if(this._drag_from_start && +end_date> +ev.end_date){
+ this._drag_from_start = false;
+ }else if(!this._drag_from_start && +end_date < +ev.start_date){
+ this._drag_from_start = true;
+ }
+ pos.resize_from_start = this._drag_from_start;
+ }
+
+ if (obj.round_position) {
+ switch(this._drag_mode) {
+ case "move":
+ if (!this.config.preserve_length){
+ end_date = get_rounded_date.call(obj, end_date, false);
+ // to preserve original start and end dates
+ if(obj.x_unit == "day")//only make sense for whole-day cells
+ pos.custom = false;
+ }
+ break;
+ case "resize":
+ if(this._drag_event){
+ // will save and use resize position only once
+ if (this._drag_event._resize_from_start === null || this._drag_event._resize_from_start === undefined) {
+ this._drag_event._resize_from_start = pos.resize_from_start;
+ }
+ pos.resize_from_start = this._drag_event._resize_from_start;
+ end_date = get_rounded_date.call(obj, end_date, !this._drag_event._resize_from_start);
+ }
+ break;
+ }
+ }
+
+ this._resolve_timeline_section(obj, pos);
+ if(pos.section){
+ // update draggable event with current section
+ this._update_timeline_section({pos:pos, event:this.getEvent(this._drag_id), view:obj});
+ }
+ pos.y = Math.round((end_date-this._min_date)/(1000*60*this.config.time_step));
+ pos.shift = this.config.time_step; //step_diff;
+
+
+ return pos;
+ };
+};
+
+scheduler._get_timeline_event_height = function(ev, config){
+ var section = ev[config.y_property]; // section id
+ var event_height = config.event_dy;
+ if (config.event_dy == "full") {
+ if (config.section_autoheight) {
+ event_height = config._section_height[section] - 6;
+ } else {
+ event_height = config.dy - 3;
+ }
+ }
+
+ if (config.resize_events) {
+ event_height = Math.max(Math.floor(event_height / ev._count), config.event_min_dy);
+ }
+ return event_height;
+};
+scheduler._get_timeline_event_y = function(order, event_height){
+ var sorder = order;
+ var y = 2+sorder*event_height+(sorder?(sorder*2):0); // original top + number_of_events * event_dy + default event top/bottom borders
+ if (scheduler.config.cascade_event_display) {
+ y =2+sorder*scheduler.config.cascade_event_margin+(sorder?(sorder*2):0);
+ }
+ return y;
+};
+
+scheduler.render_timeline_event = function(ev, attach){
+ var section = ev[this.y_property]; // section id
+ if (!section)
+ return ""; // as we may await html
+
+ var sorder = ev._sorder;
+
+ var x_start = _getX(ev, false, this);
+ var x_end = _getX(ev, true, this);
+
+ var event_height = scheduler._get_timeline_event_height(ev, this);
+
+ var hb = event_height - 2;// takes into account css sizes (border/padding)
+ if (!ev._inner && this.event_dy == "full") {
+ hb=(hb+2)*(ev._count-sorder)-2;
+ }
+
+ var y = scheduler._get_timeline_event_y(ev._sorder, event_height);
+
+ var section_height = event_height+y+2;
+ if(!this._events_height[section] || (this._events_height[section] < section_height)){
+ this._events_height[section] = section_height;
+ }
+
+ var cs = scheduler.templates.event_class(ev.start_date,ev.end_date,ev);
+ cs = "dhx_cal_event_line "+(cs||"");
+
+ var bg_color = (ev.color?("background:"+ev.color+";"):"");
+ var color = (ev.textColor?("color:"+ev.textColor+";"):"");
+ var text = scheduler.templates.event_bar_text(ev.start_date,ev.end_date,ev);
+
+ var html='<div event_id="'+ev.id+'" class="'+cs+'" style="'+bg_color+''+color+'position:absolute; top:'+y+'px; height: '+hb+'px; left:'+x_start+'px; width:'+Math.max(0,x_end-x_start)+'px;'+(ev._text_style||"")+'">';
+ if (scheduler.config.drag_resize && !scheduler.config.readonly) {
+ var dhx_event_resize = 'dhx_event_resize';
+ html += ("<div class='"+dhx_event_resize+" "+dhx_event_resize+"_start' style='height: "+hb+"px;'></div><div class='"+dhx_event_resize+" "+dhx_event_resize+"_end' style='height: "+hb+"px;'></div>");
+ }
+ html += (text+'</div>');
+
+ if (!attach)
+ return html;
+ else {
+ var d = document.createElement("DIV");
+ d.innerHTML = html;
+ var ind = this.order[section];
+ var parent = scheduler._els["dhx_cal_data"][0].firstChild.rows[ind].cells[1].firstChild;
+
+ scheduler._rendered.push(d.firstChild);
+ parent.appendChild(d.firstChild);
+ }
+};
+function trace_events(){
+ //minimize event set
+ var evs = scheduler.get_visible_events();
+ var matrix =[];
+ for (var i=0; i < this.y_unit.length; i++)
+ matrix[i]=[];
+
+ //next code defines row for undefined key
+ //most possible it is an artifact of incorrect configuration
+ if (!matrix[y])
+ matrix[y]=[];
+
+ for (var i=0; i < evs.length; i++) {
+ var y = this.order[evs[i][this.y_property]];
+ var x = 0;
+ while (this._trace_x[x+1] && evs[i].start_date>=this._trace_x[x+1]) x++;
+ while (this._trace_x[x] && evs[i].end_date>this._trace_x[x]) {
+ if (!matrix[y][x]) matrix[y][x]=[];
+ matrix[y][x].push(evs[i]);
+ x++;
+ }
+ }
+ return matrix;
+}
+// function used to get X (both start and end) coordinates for timeline bar view
+function _getX(ev, isEndPoint, config) {
+ var x = 0;
+ var step = config._step;
+ var round_position = config.round_position;
+
+ var column_offset = 0;
+ var date = (isEndPoint) ? ev.end_date : ev.start_date;
+
+ if(date.valueOf()>scheduler._max_date.valueOf())
+ date = scheduler._max_date;
+ var delta = date - scheduler._min_date_timeline;
+
+ if (delta > 0){
+ var index = scheduler._get_date_index(config, date);
+ if (scheduler._ignores[index])
+ round_position=true;
+
+ for (var i = 0; i < index; i++) {
+ x += scheduler._cols[i];
+ }
+
+ var column_date = scheduler.date.add(scheduler._min_date_timeline, scheduler.matrix[scheduler._mode].x_step*index, scheduler.matrix[scheduler._mode].x_unit);
+ if (!round_position) {
+ delta = date - column_date;
+ if (config.first_hour || config.last_hour){
+ delta = delta - config._start_correction;
+ if (delta < 0) delta = 0;
+ column_offset = Math.round(delta/step);
+ if (column_offset > scheduler._cols[index])
+ column_offset = scheduler._cols[index];
+ } else {
+ column_offset = Math.round(delta/step);
+ }
+ } else {
+ if (+date > +column_date && isEndPoint) {
+ column_offset = scheduler._cols[index];
+ }
+ }
+ }
+ if (isEndPoint) {
+ // special handling for "round" dates which match columns and usual ones
+ if (delta !== 0 && !round_position) {
+ x += column_offset-12;
+ } else {
+ x += column_offset-14;
+ }
+ } else {
+ x += column_offset+1;
+ }
+ return x;
+}
+function get_rounded_date(date, isEndDate) {
+ var index = scheduler._get_date_index(this, date);
+ var rounded_date = this._trace_x[index];
+ if (isEndDate && (+date != +this._trace_x[index])) {
+ rounded_date = (this._trace_x[index+1]) ? this._trace_x[index+1] : scheduler.date.add(this._trace_x[index], this.x_step, this.x_unit);
+ }
+ return new Date(rounded_date);
+}
+function get_events_html(evs) {
+ var html = "";
+ if (evs && this.render != "cell"){
+ evs.sort(this.sort || function(a,b){
+ if(a.start_date.valueOf()==b.start_date.valueOf())
+ return a.id>b.id?1:-1;
+ return a.start_date>b.start_date?1:-1;
+ });
+ var stack=[];
+ var evs_length = evs.length;
+ // prepare events for render
+ for (var j=0; j<evs_length; j++){
+ var ev = evs[j];
+ ev._inner = false;
+
+ var ev_start_date = (this.round_position) ? get_rounded_date.apply(this, [ev.start_date, false]) : ev.start_date;
+ var ev_end_date = (this.round_position) ? get_rounded_date.apply(this, [ev.end_date, true]) : ev.end_date;
+
+ // cutting stack from the last -> first event side
+ while (stack.length) {
+ var stack_ev = stack[stack.length-1];
+ if (stack_ev.end_date.valueOf() <= ev_start_date.valueOf()) {
+ stack.splice(stack.length-1,1);
+ } else {
+ break;
+ }
+ }
+
+ // cutting stack from the first -> last event side
+ var sorderSet = false;
+ for(var p=0; p<stack.length; p++){
+ var t_ev = stack[p];
+ if(t_ev.end_date.valueOf() <= ev_start_date.valueOf()){
+ sorderSet = true;
+ ev._sorder=t_ev._sorder;
+ stack.splice(p,1);
+ ev._inner=true;
+ break;
+ }
+ }
+
+
+ if (stack.length)
+ stack[stack.length-1]._inner=true;
+
+
+ if (!sorderSet) {
+ if (stack.length) {
+ if (stack.length <= stack[stack.length - 1]._sorder) {
+ if (!stack[stack.length - 1]._sorder)
+ ev._sorder = 0;
+ else
+ for (var h = 0; h < stack.length; h++) {
+ var _is_sorder = false;
+ for (var t = 0; t < stack.length; t++) {
+ if (stack[t]._sorder == h) {
+ _is_sorder = true;
+ break;
+ }
+ }
+ if (!_is_sorder) {
+ ev._sorder = h;
+ break;
+ }
+ }
+ ev._inner = true;
+ }
+ else {
+ var _max_sorder = stack[0]._sorder;
+ for (var w = 1; w < stack.length; w++)
+ if (stack[w]._sorder > _max_sorder)
+ _max_sorder = stack[w]._sorder;
+ ev._sorder = _max_sorder + 1;
+ ev._inner = false;
+ }
+ }
+ else
+ ev._sorder = 0;
+ }
+
+ stack.push(ev);
+
+ if (stack.length>(stack.max_count||0)) {
+ stack.max_count=stack.length;
+ ev._count=stack.length;
+ }
+ else {
+ ev._count=(ev._count)?ev._count:1;
+ }
+ }
+ // fix _count for every event
+ for (var m=0; m < evs.length; m++) {
+ evs[m]._count = stack.max_count;
+ }
+ // render events
+ for (var v=0; v<evs_length; v++) {
+ html+=scheduler.render_timeline_event.call(this, evs[v], false);
+ }
+ }
+ return html;
+}
+
+
+function y_scale(d) {
+ var html = "<table style='table-layout:fixed;' cellspacing='0' cellpadding='0'>";
+ var evs=[];
+ if(scheduler._load_mode)
+ scheduler._load();
+ if (this.render == "cell")
+ evs = trace_events.call(this);
+ else {
+ var tevs = scheduler.get_visible_events();
+ var order = this.order;
+
+ for (var j = 0; j < tevs.length; j++) {
+ var tev = tevs[j];
+ var tev_section = tev[this.y_property];
+ var index = this.order[ tev_section ];
+
+ if (this.show_unassigned && !tev_section) {
+ for (var key in order) {
+ if (order.hasOwnProperty(key)) {
+ index = order[key];
+ if (!evs[index]) evs[index] = [];
+ var clone = scheduler._lame_copy({}, tev);
+ clone[this.y_property] = key;
+ evs[index].push(clone);
+ }
+ }
+ } else {
+ // required as we could have index of not displayed section or "undefined"
+ if (!evs[index]) evs[index] = [];
+ evs[index].push(tev);
+ }
+ }
+ }
+
+ var summ = 0;
+ for (var i=0; i < scheduler._cols.length; i++)
+ summ+=scheduler._cols[i];
+
+ var step = new Date();
+ var realcount = scheduler._cols.length-scheduler._ignores_detected;
+ step = ((scheduler.date.add(step, this.x_step*realcount, this.x_unit)-step)-(this._start_correction + this._end_correction)*realcount)/summ;
+ this._step = step;
+ this._summ = summ;
+
+ var heights = scheduler._colsS.heights=[];
+
+ this._events_height = {};
+ this._section_height = {};
+ for (var i=0; i<this.y_unit.length; i++){
+
+ var stats = this._logic(this.render, this.y_unit[i], this); // obj with custom style
+
+ scheduler._merge(stats, {
+ height: this.dy
+ });
+
+ //autosize height, if we have a free space
+ if(this.section_autoheight) {
+ if (this.y_unit.length * stats.height < d.offsetHeight) {
+ stats.height = Math.max(stats.height, Math.floor((d.offsetHeight - 1) / this.y_unit.length));
+ }
+ this._section_height[this.y_unit[i].key] = stats.height;
+ }
+
+ scheduler._merge(stats, {
+ //section 1
+ tr_className: "",
+ style_height: "height:"+stats.height+"px;",
+ style_width: "width:"+(this.dx-1)+"px;",
+ td_className: "dhx_matrix_scell"+((scheduler.templates[this.name+"_scaley_class"](this.y_unit[i].key, this.y_unit[i].label, this.y_unit[i]))?" "+scheduler.templates[this.name+"_scaley_class"](this.y_unit[i].key, this.y_unit[i].label, this.y_unit[i]):''),
+ td_content: scheduler.templates[this.name+'_scale_label'](this.y_unit[i].key, this.y_unit[i].label, this.y_unit[i]),
+ //section 2
+ summ_width: "width:"+summ+"px;",
+ //section 3
+ table_className: ''
+ });
+
+ // generating events html in a temporary file, calculating their height
+ var events_html = get_events_html.call(this, evs[i]);
+
+ if(this.fit_events){
+ var rendered_height = this._events_height[this.y_unit[i].key]||0;
+ stats.height = (rendered_height>stats.height)?rendered_height:stats.height;
+ stats.style_height = "height:"+stats.height+"px;";
+ this._section_height[this.y_unit[i].key] = stats.height;
+ }
+
+ // section 1
+ html+="<tr class='"+stats.tr_className+"' style='"+stats.style_height+"'><td class='"+stats.td_className+"' style='"+stats.style_width+" height:"+(stats.height-1)+"px;'>"+stats.td_content+"</td>";
+
+ if (this.render == "cell"){
+ for (var j=0; j < scheduler._cols.length; j++) {
+ if (scheduler._ignores[j])
+ html+="<td></td>";
+ else
+ html+="<td class='dhx_matrix_cell "+scheduler.templates[this.name+"_cell_class"](evs[i][j],this._trace_x[j],this.y_unit[i])+"' style='width:"+(scheduler._cols[j]-1)+"px'><div style='width:"+(scheduler._cols[j]-1)+"px'>"+scheduler.templates[this.name+"_cell_value"](evs[i][j],this._trace_x[j],this.y_unit[i])+"</div></td>";
+ }
+ } else {
+ //section 2
+ html+="<td><div style='"+stats.summ_width+" "+stats.style_height+" position:relative;' class='dhx_matrix_line'>";
+
+ // adding events
+ html += events_html;
+
+ //section 3
+ html+="<table class='"+stats.table_className+"' cellpadding='0' cellspacing='0' style='"+stats.summ_width+" "+stats.style_height+"' >";
+ for (var j=0; j < scheduler._cols.length; j++){
+ if (scheduler._ignores[j])
+ html+="<td></td>";
+ else
+ html+="<td class='dhx_matrix_cell "+scheduler.templates[this.name+"_cell_class"](evs[i],this._trace_x[j],this.y_unit[i])+"' style='width:"+(scheduler._cols[j]-1)+"px'><div style='width:"+(scheduler._cols[j]-1)+"px'></div></td>";
+ }
+ html+="</table>";
+ html+="</div></td>";
+ }
+ html+="</tr>";
+ }
+ html += "</table>";
+ this._matrix = evs;
+ //d.scrollTop = 0; //fix flickering in FF; disabled as it was impossible to create dnd event if scroll was used (window jumped to the top)
+ d.innerHTML = html;
+
+ scheduler._rendered = [];
+ var divs = scheduler._obj.getElementsByTagName("DIV");
+ for (var i=0; i < divs.length; i++)
+ if (divs[i].getAttribute("event_id"))
+ scheduler._rendered.push(divs[i]);
+
+ this._scales = {};
+ for (var i=0; i < d.firstChild.rows.length; i++) {
+ heights.push(d.firstChild.rows[i].offsetHeight);
+ var unit_key = this.y_unit[i].key;
+ var scale = this._scales[unit_key] = (scheduler._isRender('cell')) ? d.firstChild.rows[i] : d.firstChild.rows[i].childNodes[1].getElementsByTagName('div')[0];
+ scheduler.callEvent("onScaleAdd", [scale, unit_key]);
+ }
+}
+function x_scale(h){
+ var current_sh = scheduler.xy.scale_height;
+ var original_sh = this._header_resized||scheduler.xy.scale_height;
+ scheduler._cols=[]; //store for data section, each column width
+ scheduler._colsS={height:0}; // heights of the y sections
+ this._trace_x =[]; // list of dates per cells
+ var summ = scheduler._x - this.dx - scheduler.xy.scroll_width; //border delta, whole width
+ var left = [this.dx]; // left margins, initial left margin
+ var header = scheduler._els['dhx_cal_header'][0];
+ header.style.width = (left[0]+summ)+'px';
+
+ scheduler._min_date_timeline = scheduler._min_date;
+
+ var preserve = scheduler.config.preserve_scale_length;
+ var start = scheduler._min_date;
+ scheduler._process_ignores(start, this.x_size, this.x_unit, this.x_step, preserve);
+
+ var size = this.x_size + (preserve ? scheduler._ignores_detected : 0);
+ if (size != this.x_size)
+ scheduler._max_date = scheduler.date.add(scheduler._min_date, size*this.x_step, this.x_unit);
+
+ var realcount = size - scheduler._ignores_detected;
+ for (var k=0; k<size; k++){
+ // dates calculation
+ this._trace_x[k]=new Date(start);
+ start = scheduler.date.add(start, this.x_step, this.x_unit);
+
+ // position calculation
+ if (scheduler._ignores[k]){
+ scheduler._cols[k]=0;
+ realcount++;
+ } else {
+ scheduler._cols[k]=Math.floor(summ/(realcount-k));
+ }
+
+ summ -= scheduler._cols[k];
+ left[k+1] = left[k] + scheduler._cols[k];
+ }
+ h.innerHTML = "<div></div>";
+
+ if(this.second_scale){
+ // additional calculations
+ var mode = this.second_scale.x_unit;
+ var control_dates = [this._trace_x[0]]; // first control date
+ var second_cols = []; // each column width of the secondary row
+ var second_left = [this.dx, this.dx]; // left margins of the secondary row
+ var t_index = 0; // temp index
+ for (var l = 0; l < this._trace_x.length; l++) {
+ var date = this._trace_x[l];
+ var res = is_new_interval(mode, date, control_dates[t_index]);
+
+ if(res) { // new interval
+ ++t_index; // starting new interval
+ control_dates[t_index] = date; // updating control date as we moved to the new interval
+ second_left[t_index+1] = second_left[t_index];
+ }
+ var t = t_index+1;
+ second_cols[t_index] = scheduler._cols[l] + (second_cols[t_index]||0);
+ second_left[t] += scheduler._cols[l];
+ }
+
+ h.innerHTML = "<div></div><div></div>";
+ var top = h.firstChild;
+ top.style.height = (original_sh)+'px'; // actually bottom header takes 21px
+ var bottom = h.lastChild;
+ bottom.style.position = "relative";
+
+ for (var m = 0; m < control_dates.length; m++) {
+ var tdate = control_dates[m];
+ var scs = scheduler.templates[this.name+"_second_scalex_class"](tdate);
+ var head=document.createElement("DIV"); head.className="dhx_scale_bar dhx_second_scale_bar"+((scs)?(" "+scs):"");
+ scheduler.set_xy(head,second_cols[m]-1,original_sh-3,second_left[m],0); //-1 for border, -3 = -2 padding -1 border bottom
+ head.innerHTML = scheduler.templates[this.name+"_second_scale_date"](tdate);
+ top.appendChild(head);
+ }
+ }
+
+ scheduler.xy.scale_height = original_sh; // fix for _render_x_header which uses current scale_height value
+ h = h.lastChild; // h - original scale
+ for (var i=0; i<this._trace_x.length; i++){
+ if (scheduler._ignores[i])
+ continue;
+
+ start = this._trace_x[i];
+ scheduler._render_x_header(i, left[i], start, h);
+ var cs = scheduler.templates[this.name+"_scalex_class"](start);
+ if (cs)
+ h.lastChild.className += " "+cs;
+ }
+ scheduler.xy.scale_height = current_sh; // restoring current value
+
+ var trace = this._trace_x;
+ h.onclick = function(e){
+ var pos = locate_hcell(e);
+ if (pos)
+ scheduler.callEvent("onXScaleClick",[pos.x, trace[pos.x], e||event]);
+ };
+ h.ondblclick = function(e){
+ var pos = locate_hcell(e);
+ if (pos)
+ scheduler.callEvent("onXScaleDblClick",[pos.x, trace[pos.x], e||event]);
+ };
+}
+function is_new_interval(mode, date, control_date){ // mode, date to check, control_date for which period should be checked
+ switch(mode) {
+ case "hour":
+ return ((date.getHours() != control_date.getHours()) || is_new_interval("day", date, control_date));
+ case "day":
+ return !(date.getDate() == control_date.getDate() && date.getMonth() == control_date.getMonth() && date.getFullYear() == control_date.getFullYear());
+ case "week":
+ return !(scheduler.date.getISOWeek(date) == scheduler.date.getISOWeek(control_date) && date.getFullYear() == control_date.getFullYear());
+ case "month":
+ return !(date.getMonth() == control_date.getMonth() && date.getFullYear() == control_date.getFullYear());
+ case "year":
+ return !(date.getFullYear() == control_date.getFullYear());
+ default:
+ return false; // same interval
+ }
+}
+function set_full_view(mode){
+ if (mode){
+ scheduler.set_sizes();
+ scheduler._init_matrix_tooltip();
+
+ //we need to have day-rounded scales for navigation
+ //in same time, during rendering scales may be shifted
+ var temp = scheduler._min_date;
+ x_scale.call(this,scheduler._els["dhx_cal_header"][0]);
+ y_scale.call(this,scheduler._els["dhx_cal_data"][0]);
+ scheduler._min_date = temp;
+ scheduler._els["dhx_cal_date"][0].innerHTML=scheduler.templates[this.name+"_date"](scheduler._min_date, scheduler._max_date);
+ if (scheduler._mark_now) {
+ scheduler._mark_now();
+ }
+ }
+
+ // hide tooltip if it is displayed
+ hideToolTip();
+}
+
+
+function hideToolTip(){
+ if (scheduler._tooltip){
+ scheduler._tooltip.style.display = "none";
+ scheduler._tooltip.date = "";
+ }
+}
+function showToolTip(obj,pos,offset){
+ if (obj.render != "cell") return;
+ var mark = pos.x+"_"+pos.y;
+ var evs = obj._matrix[pos.y][pos.x];
+
+ if (!evs) return hideToolTip();
+
+ evs.sort(function(a,b){ return a.start_date>b.start_date?1:-1; });
+
+ if (scheduler._tooltip){
+ if (scheduler._tooltip.date == mark) return;
+ scheduler._tooltip.innerHTML="";
+ } else {
+ var t = scheduler._tooltip = document.createElement("DIV");
+ t.className = "dhx_year_tooltip";
+ document.body.appendChild(t);
+ t.onclick = scheduler._click.dhx_cal_data;
+ }
+
+ var html = "";
+
+ for (var i=0; i<evs.length; i++){
+ var bg_color = (evs[i].color?("background-color:"+evs[i].color+";"):"");
+ var color = (evs[i].textColor?("color:"+evs[i].textColor+";"):"");
+ html+="<div class='dhx_tooltip_line' event_id='"+evs[i].id+"' style='"+bg_color+""+color+"'>";
+ html+="<div class='dhx_tooltip_date'>"+(evs[i]._timed?scheduler.templates.event_date(evs[i].start_date):"")+"</div>";
+ html+="<div class='dhx_event_icon icon_details'>&nbsp;</div>";
+ html+=scheduler.templates[obj.name+"_tooltip"](evs[i].start_date, evs[i].end_date,evs[i])+"</div>";
+ }
+
+ scheduler._tooltip.style.display="";
+ scheduler._tooltip.style.top = "0px";
+
+ if (document.body.offsetWidth-offset.left-scheduler._tooltip.offsetWidth < 0)
+ scheduler._tooltip.style.left = offset.left-scheduler._tooltip.offsetWidth+"px";
+ else
+ scheduler._tooltip.style.left = offset.left+pos.src.offsetWidth+"px";
+
+ scheduler._tooltip.date = mark;
+ scheduler._tooltip.innerHTML = html;
+
+ if (document.body.offsetHeight-offset.top-scheduler._tooltip.offsetHeight < 0)
+ scheduler._tooltip.style.top= offset.top-scheduler._tooltip.offsetHeight+pos.src.offsetHeight+"px";
+ else
+ scheduler._tooltip.style.top= offset.top+"px";
+}
+
+scheduler._matrix_tooltip_handler = function(e){
+ var obj = scheduler.matrix[scheduler._mode];
+ if (!obj || obj.render != "cell")
+ return;
+ if (obj){
+ var pos = scheduler._locate_cell_timeline(e);
+ var e = e || event;
+ var src = e.target||e.srcElement;
+ if (pos)
+ return showToolTip(obj,pos,getOffset(pos.src));
+ }
+ hideToolTip();
+};
+scheduler._init_matrix_tooltip = function() {
+ scheduler._detachDomEvent(scheduler._els["dhx_cal_data"][0], "mouseover", scheduler._matrix_tooltip_handler);
+ dhtmlxEvent(scheduler._els["dhx_cal_data"][0], "mouseover", scheduler._matrix_tooltip_handler);
+};
+
+scheduler._renderMatrix = function(mode, refresh) {
+ if (!refresh)
+ scheduler._els['dhx_cal_data'][0].scrollTop=0;
+
+ scheduler._min_date = scheduler.date[this.name+"_start"](scheduler._date);
+ scheduler._max_date = scheduler.date.add(scheduler._min_date, this.x_size*this.x_step, this.x_unit);
+ scheduler._table_view = true;
+ if (this.second_scale) {
+ if (mode && !this._header_resized) {
+ this._header_resized = scheduler.xy.scale_height;
+ scheduler.xy.scale_height *= 2;
+ scheduler._els['dhx_cal_header'][0].className += " dhx_second_cal_header";
+ }
+ if (!mode && this._header_resized) {
+ scheduler.xy.scale_height /= 2;
+ this._header_resized = false;
+ var header = scheduler._els['dhx_cal_header'][0];
+ header.className = header.className.replace(/ dhx_second_cal_header/gi,"");
+ }
+ }
+ set_full_view.call(this,mode);
+};
+
+function html_index(el) {
+ var p = el.parentNode.childNodes;
+ for (var i=0; i < p.length; i++)
+ if (p[i] == el) return i;
+ return -1;
+}
+function locate_hcell(e){
+ e = e||event;
+ var trg = e.target?e.target:e.srcElement;
+ while (trg && trg.tagName != "DIV")
+ trg=trg.parentNode;
+ if (trg && trg.tagName == "DIV"){
+ var cs = trg.className.split(" ")[0];
+ if (cs == "dhx_scale_bar")
+ return { x:html_index(trg), y:-1, src:trg, scale:true };
+ }
+}
+scheduler._locate_cell_timeline = function(e){
+ e = e||event;
+ var trg = e.target?e.target:e.srcElement;
+
+ var res = {};
+ var view = scheduler.matrix[scheduler._mode];
+ var pos = scheduler.getActionData(e);
+
+ for (var xind = 0; xind < view._trace_x.length-1; xind++) {
+ // | 8:00, 8:30 | 8:15 should be checked against 8:30
+ // clicking at the most left part of the cell, say 8:30 should create event in that cell, not previous one
+ if (+pos.date < view._trace_x[xind+1])
+ break;
+ }
+
+ res.x = xind;
+ res.y = view.order[pos.section];
+ var diff = scheduler._isRender('cell') ? 1 : 0;
+ res.src = view._scales[pos.section] ? view._scales[pos.section].getElementsByTagName('td')[xind+diff] : null;
+
+ var isScale = false;
+ while (res.x === 0 && trg.className != "dhx_cal_data" && trg.parentNode) {
+ if (trg.className.split(" ")[0] == "dhx_matrix_scell") {
+ isScale = true;
+ break;
+ } else {
+ trg = trg.parentNode;
+ }
+ }
+ if (isScale) { // Y scale
+ res.x = -1;
+ res.src = trg;
+ res.scale = true;
+ }
+
+ return res;
+};
+
+var old_click = scheduler._click.dhx_cal_data;
+scheduler._click.dhx_marked_timespan = scheduler._click.dhx_cal_data = function(e){
+ var ret = old_click.apply(this,arguments);
+ var obj = scheduler.matrix[scheduler._mode];
+ if (obj){
+ var pos = scheduler._locate_cell_timeline(e);
+ if (pos){
+ if (pos.scale)
+ scheduler.callEvent("onYScaleClick",[pos.y, obj.y_unit[pos.y], e||event]);
+ else
+ scheduler.callEvent("onCellClick",[pos.x, pos.y, obj._trace_x[pos.x], (((obj._matrix[pos.y]||{})[pos.x])||[]), e||event]);
+ }
+ }
+ return ret;
+};
+
+scheduler.dblclick_dhx_matrix_cell = function(e){
+ var obj = scheduler.matrix[scheduler._mode];
+ if (obj){
+ var pos = scheduler._locate_cell_timeline(e);
+ if (pos){
+ if (pos.scale)
+ scheduler.callEvent("onYScaleDblClick",[pos.y, obj.y_unit[pos.y], e||event]);
+ else
+ scheduler.callEvent("onCellDblClick",[pos.x, pos.y, obj._trace_x[pos.x], (((obj._matrix[pos.y]||{})[pos.x])||[]), e||event]);
+ }
+ }
+};
+
+var old_dblclick_marked_timespan = scheduler.dblclick_dhx_marked_timespan || function(){};
+scheduler.dblclick_dhx_marked_timespan = function(e){
+ var obj = scheduler.matrix[scheduler._mode];
+ if (obj)
+ return scheduler.dblclick_dhx_matrix_cell(e);
+ else
+ return old_dblclick_marked_timespan.apply(this,arguments);
+};
+
+scheduler.dblclick_dhx_matrix_scell = function(e){
+ return scheduler.dblclick_dhx_matrix_cell(e);
+};
+
+scheduler._isRender = function(mode){
+ return (scheduler.matrix[scheduler._mode] && scheduler.matrix[scheduler._mode].render == mode);
+};
+
+scheduler.attachEvent("onCellDblClick", function (x, y, a, b, event){
+ if (this.config.readonly|| (event.type == "dblclick" && !this.config.dblclick_create)) return;
+
+ var obj = scheduler.matrix[scheduler._mode];
+ var event_options = {};
+ event_options.start_date = obj._trace_x[x];
+ event_options.end_date = (obj._trace_x[x+1]) ? obj._trace_x[x+1] : scheduler.date.add(obj._trace_x[x], obj.x_step, obj.x_unit);
+
+ if (obj._start_correction)
+ event_options.start_date = new Date(event_options.start_date*1 + obj._start_correction);
+ if (obj._end_correction)
+ event_options.end_date = new Date(event_options.end_date - obj._end_correction);
+
+ event_options[obj.y_property] = obj.y_unit[y].key;
+ scheduler.addEventNow(event_options, null, event);
+});
+
+scheduler.attachEvent("onBeforeDrag", function (event_id, mode, native_event_object){
+ return !scheduler._isRender("cell");
+});
+scheduler.attachEvent("onEventChanged", function(id, ev) {
+ ev._timed = this.isOneDayEvent(ev);
+});
+var old_render_marked_timespan = scheduler._render_marked_timespan;
+scheduler._render_marked_timespan = function(options, area, unit_id, min_date, max_date) {
+ if (!scheduler.config.display_marked_timespans)
+ return [];
+
+ if (scheduler.matrix && scheduler.matrix[scheduler._mode]) {
+ if (scheduler._isRender('cell'))
+ return;
+
+ var view_opts = scheduler._lame_copy({}, scheduler.matrix[scheduler._mode]);
+ //timespans must always use actual position, not rounded
+ view_opts.round_position = false;
+ var blocks = [];
+
+ var units = [];
+ var areas = [];
+ var section = options.sections ? (options.sections.units || options.sections.timeline) : null;
+ if (!unit_id) { // should draw for every unit...
+ var order = view_opts.order;
+ if (section) { // ...or for only section if mentioned in configuration of timespan
+ if (order.hasOwnProperty(section)) {
+ units.push(section);
+ areas.push(view_opts._scales[section]);
+ }
+ }else{
+ for (var key in order) {
+ if (order.hasOwnProperty(key)) {
+ units.push(key);
+ areas.push(view_opts._scales[key]);
+ }
+ }
+ }
+ } else {
+ areas = [area];
+ units = [unit_id];
+ }
+
+ var min_date = min_date ? new Date(min_date) : scheduler._min_date;
+ var max_date = max_date ? new Date(max_date) : scheduler._max_date;
+ var dates = [];
+
+ if (options.days > 6) {
+ var specific_date = new Date(options.days);
+ if (scheduler.date.date_part(new Date(min_date)) <= +specific_date && +max_date >= +specific_date)
+ dates.push(specific_date);
+ } else {
+ dates.push.apply(dates, scheduler._get_dates_by_index(options.days));
+ }
+
+ var zones = options.zones;
+ var css_classes = scheduler._get_css_classes_by_config(options);
+
+ for (var j=0; j<units.length; j++) {
+ area = areas[j];
+ unit_id = units[j];
+
+ for (var i=0; i<dates.length; i++) {
+ var date = dates[i];
+ for (var k=0; k<zones.length; k += 2) {
+ var zone_start = zones[k];
+ var zone_end = zones[k+1];
+ var start_date = new Date(+date + zone_start*60*1000);
+ var end_date = new Date(+date + zone_end*60*1000);
+
+ if (!(min_date < end_date && max_date > start_date))
+ continue;
+
+ var block = scheduler._get_block_by_config(options);
+ block.className = css_classes;
+
+ var start_pos = _getX({start_date: start_date}, false, view_opts)-1;
+ var end_pos = _getX({start_date: end_date}, false, view_opts)-1;
+ var width = Math.max(1, end_pos - start_pos - 1);
+ var height = view_opts._section_height[unit_id]-1;
+
+ block.style.cssText = "height: "+height+"px; left: "+start_pos+"px; width: "+width+"px; top: 0;";
+
+ area.insertBefore(block, area.firstChild);
+ blocks.push(block);
+ }
+ }
+ }
+
+ return blocks;
+
+ } else {
+ return old_render_marked_timespan.apply(scheduler, [options, area, unit_id]);
+ }
+};
+
+var old_append_mark_now = scheduler._append_mark_now;
+scheduler._append_mark_now = function(day_index, now) {
+ if (scheduler.matrix && scheduler.matrix[scheduler._mode]) {
+ var n_date = scheduler._currentDate();
+ var zone_start = scheduler._get_zone_minutes(n_date);
+ var options = {
+ days: +scheduler.date.date_part(n_date),
+ zones: [zone_start, zone_start+1],
+ css: "dhx_matrix_now_time",
+ type: "dhx_now_time"
+ };
+ return scheduler._render_marked_timespan(options);
+ } else {
+ return old_append_mark_now.apply(scheduler, [day_index, now]);
+ }
+};
+
+scheduler.attachEvent("onScaleAdd", function(scale, unit_key) {
+ var timespans = scheduler._marked_timespans;
+
+ if (timespans && scheduler.matrix && scheduler.matrix[scheduler._mode]) {
+ var mode = scheduler._mode;
+
+ var min_date = scheduler._min_date;
+ var max_date = scheduler._max_date;
+ var global_data = timespans["global"];
+
+ for (var t_date = scheduler.date.date_part(new Date(min_date)); t_date < max_date; t_date = scheduler.date.add(t_date, 1, "day")) {
+ var day_value = +t_date;
+ var day_index = t_date.getDay();
+ var r_configs = [];
+
+ var day_types = global_data[day_value]||global_data[day_index];
+ r_configs.push.apply(r_configs, scheduler._get_configs_to_render(day_types));
+
+ if (timespans[mode] && timespans[mode][unit_key]) {
+ var z_config = [];
+ var unit_types = scheduler._get_types_to_render(timespans[mode][unit_key][day_index], timespans[mode][unit_key][day_value]);
+ z_config.push.apply(z_config, scheduler._get_configs_to_render(unit_types));
+ if(z_config.length)
+ r_configs = z_config;
+ }
+
+ for (var i=0; i<r_configs.length; i++) {
+ var config = r_configs[i];
+ var day = config.days;
+ if (day < 7) {
+ day = day_value;
+ //specify min/max timespan dates, otherwise it can be rendered multiple times in some configurations
+ scheduler._render_marked_timespan(config, scale, unit_key, t_date, scheduler.date.add(t_date, 1, "day"));
+ day = day_index;
+ } else {
+ scheduler._render_marked_timespan(config, scale, unit_key, t_date, scheduler.date.add(t_date, 1, "day"));
+ }
+ }
+ }
+ }
+});
+
+scheduler._resolve_timeline_section = function(view, pos){
+ var yind = 0;
+ var summ = 0;
+ for (yind; yind < this._colsS.heights.length; yind++) {
+ summ += this._colsS.heights[yind];
+ if (summ > pos.y)
+ break;
+ }
+
+ if(!view.y_unit[yind]) {
+ yind=view.y_unit.length-1;
+ }
+ if(this._drag_event && !this._drag_event._orig_section){
+ this._drag_event._orig_section = view.y_unit[yind].key;
+ }
+
+ pos.fields = {};
+ if (yind >= 0 && view.y_unit[yind]) {
+ pos.section = pos.fields[view.y_property] = view.y_unit[yind].key;
+ }
+};
+scheduler._update_timeline_section = function(action){
+ var view = action.view,
+ event = action.event,
+ pos = action.pos;
+
+ if (event) {
+ if(event[view.y_property] != pos.section){
+ var line_height = this._get_timeline_event_height(event, view);
+ event._sorder = this._get_dnd_order(event._sorder, line_height, view._section_height[pos.section]);
+ }
+ event[view.y_property] = pos.section;
+ }
+};
+scheduler._get_date_index=function(config, date) {
+ var index = 0;
+ var trace_x = config._trace_x;
+ while (index < trace_x.length-1 && +date >= +trace_x[index+1]) {
+ index++;
+ }
+ return index;
+};
+
+scheduler.attachEvent("onBeforeTodayDisplayed", function() {
+ for(var i in scheduler.matrix){
+ var obj = scheduler.matrix[i];
+ obj.x_start = obj._original_x_start;
+ }
+ return true;
+});
+
+scheduler.attachEvent("onOptionsLoad",function(){
+ for(var i in scheduler.matrix){
+ var obj = scheduler.matrix[i];
+
+ obj.order = {};
+ scheduler.callEvent('onOptionsLoadStart', []);
+ for(var i=0; i<obj.y_unit.length;i++)
+ obj.order[obj.y_unit[i].key]=i;
+ scheduler.callEvent('onOptionsLoadFinal', []);
+ if (scheduler._date && obj.name == scheduler._mode)
+ scheduler.setCurrentView(scheduler._date, scheduler._mode);
+ }
+});
+
+scheduler.attachEvent("onSchedulerResize",function(){
+ if (scheduler.matrix[this._mode]){
+ var obj = scheduler.matrix[this._mode];
+ scheduler._renderMatrix.call(obj, true, true);
+ return false;
+ }
+ return true;
+});
+
+scheduler.attachEvent("onBeforeDrag",function(id, drag_mode, e){
+ if(drag_mode == 'resize'){
+ var trg = e.target || e.srcElement;
+ if((trg.className||"").indexOf("dhx_event_resize_end") < 0){
+ scheduler._drag_from_start = true;
+ }else{
+ scheduler._drag_from_start = false;
+ }
+ }
+
+ return true;
+});
+
+};
+scheduler._temp_matrix_scope();
diff --git a/codebase/sources/ext/dhtmlxscheduler_timeline.js.map b/codebase/sources/ext/dhtmlxscheduler_timeline.js.map
new file mode 100644
index 0000000..62bc255
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_timeline.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_timeline.js.map","sources":["dhtmlxscheduler_timeline.js"],"names":["scheduler","_temp_matrix_scope","trace_events","evs","get_visible_events","matrix","i","this","y_unit","length","y","order","y_property","x","_trace_x","start_date","end_date","push","_getX","ev","isEndPoint","config","step","_step","round_position","column_offset","date","valueOf","_max_date","delta","_min_date_timeline","index","_get_date_index","_ignores","_cols","column_date","add","_mode","x_step","x_unit","first_hour","last_hour","_start_correction","Math","round","get_rounded_date","isEndDate","rounded_date","Date","get_events_html","html","render","sort","a","b","id","stack","evs_length","j","_inner","ev_start_date","apply","stack_ev","splice","sorderSet","p","t_ev","_sorder","h","_is_sorder","t","_max_sorder","w","max_count","_count","m","v","render_timeline_event","call","y_scale","d","_load_mode","_load","tevs","tev","tev_section","show_unassigned","key","hasOwnProperty","clone","_lame_copy","summ","realcount","_ignores_detected","_end_correction","_summ","heights","_colsS","_events_height","_section_height","stats","_logic","_merge","height","dy","section_autoheight","offsetHeight","max","floor","tr_className","style_height","style_width","dx","td_className","templates","name","label","td_content","summ_width","table_className","events_html","fit_events","rendered_height","_matrix","innerHTML","_rendered","divs","_obj","getElementsByTagName","getAttribute","_scales","firstChild","rows","unit_key","scale","_isRender","childNodes","callEvent","x_scale","current_sh","xy","scale_height","original_sh","_header_resized","_x","scroll_width","left","header","_els","style","width","_min_date","preserve","preserve_scale_length","start","_process_ignores","x_size","size","k","second_scale","mode","control_dates","second_cols","second_left","t_index","l","res","is_new_interval","top","bottom","lastChild","position","tdate","scs","head","document","createElement","className","set_xy","appendChild","_render_x_header","cs","trace","onclick","e","pos","locate_hcell","event","ondblclick","control_date","getHours","getDate","getMonth","getFullYear","getISOWeek","set_full_view","set_sizes","_init_matrix_tooltip","temp","_mark_now","hideToolTip","_tooltip","display","showToolTip","obj","offset","mark","body","_click","dhx_cal_data","bg_color","color","textColor","_timed","event_date","offsetWidth","src","html_index","el","parentNode","trg","target","srcElement","tagName","split","c","createTimelineView","_skin_init","y_step","x_start","y_start","y_size","event_dy","bar_height","event_min_dy","resize_events","render_name","timeline","checkEvent","_original_x_start","old","render_data","arguments","clear_event","_renderMatrix","ar","section_id","section_label","text","datea","dateb","getDay","date_part","getMinutes","day_date","week_date","date_to_str","x_date","hour_date","resulting_date","x_length","converted_step","total_steps","steps_offset","func","day_start","temp_date","_drag_event","_drag_id","getEvent","_dhx_changed","ratio","column_width","xind","edge","getState","drag_mode","force_redraw","custom","timestamp_diff","_drag_mode","drag_event","_move_delta","preserve_length","_get_real_event_length","_event_length","current_back_shift","_get_fictional_event_length","_drag_from_start","resize_from_start","_resize_from_start","undefined","_resolve_timeline_section","section","_update_timeline_section","view","time_step","shift","_get_timeline_event_height","event_height","_get_timeline_event_y","sorder","cascade_event_display","cascade_event_margin","attach","x_end","hb","section_height","event_class","event_bar_text","_text_style","drag_resize","readonly","dhx_event_resize","ind","parent","cells","_matrix_tooltip_handler","_locate_cell_timeline","getOffset","_detachDomEvent","dhtmlxEvent","refresh","scrollTop","_date","_table_view","replace","getActionData","diff","isScale","old_click","dhx_marked_timespan","ret","dblclick_dhx_matrix_cell","old_dblclick_marked_timespan","dblclick_dhx_marked_timespan","dblclick_dhx_matrix_scell","attachEvent","type","dblclick_create","event_options","addEventNow","isOneDayEvent","old_render_marked_timespan","_render_marked_timespan","options","area","unit_id","min_date","max_date","display_marked_timespans","view_opts","blocks","units","areas","sections","dates","days","specific_date","_get_dates_by_index","zones","css_classes","_get_css_classes_by_config","zone_start","zone_end","block","_get_block_by_config","start_pos","end_pos","cssText","insertBefore","old_append_mark_now","_append_mark_now","day_index","now","n_date","_currentDate","_get_zone_minutes","css","timespans","_marked_timespans","global_data","t_date","day_value","r_configs","day_types","_get_configs_to_render","z_config","unit_types","_get_types_to_render","day","yind","_orig_section","fields","action","line_height","_get_dnd_order","trace_x","setCurrentView","indexOf"],"mappings":"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"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_tooltip.js b/codebase/sources/ext/dhtmlxscheduler_tooltip.js
new file mode 100644
index 0000000..1dbad28
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_tooltip.js
@@ -0,0 +1,223 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+window.dhtmlXTooltip = scheduler.dhtmlXTooltip = window.dhtmlxTooltip = {};
+
+dhtmlXTooltip.config = {
+ className: 'dhtmlXTooltip tooltip',
+ timeout_to_display: 50,
+ timeout_to_hide: 50,
+ delta_x: 15,
+ delta_y: -20
+};
+
+dhtmlXTooltip.tooltip = document.createElement('div');
+dhtmlXTooltip.tooltip.className = dhtmlXTooltip.config.className;
+
+dhtmlXTooltip.show = function(event, text) { //browser event, text to display
+ if (scheduler.config.touch && !scheduler.config.touch_tooltip) return;
+
+ var dhxTooltip = dhtmlXTooltip;
+ var tooltip_div = this.tooltip;
+ var tooltip_div_style = tooltip_div.style;
+ dhxTooltip.tooltip.className = dhxTooltip.config.className;
+ var pos = this.position(event);
+
+ var target = event.target || event.srcElement;
+ // if we are over tooltip -- do nothing, just return (so tooltip won't move)
+ if (this.isTooltip(target)) {
+ return;
+ }
+
+ var actual_x = pos.x + (dhxTooltip.config.delta_x || 0);
+ var actual_y = pos.y - (dhxTooltip.config.delta_y || 0);
+
+ tooltip_div_style.visibility = "hidden";
+
+ if (tooltip_div_style.removeAttribute) {
+ tooltip_div_style.removeAttribute("right");
+ tooltip_div_style.removeAttribute("bottom");
+ } else {
+ tooltip_div_style.removeProperty("right");
+ tooltip_div_style.removeProperty("bottom");
+ }
+
+ tooltip_div_style.left = "0";
+ tooltip_div_style.top = "0";
+
+ this.tooltip.innerHTML = text;
+ document.body.appendChild(this.tooltip);
+
+ var tooltip_width = this.tooltip.offsetWidth;
+ var tooltip_height = this.tooltip.offsetHeight;
+
+ if ((document.body.offsetWidth - actual_x - tooltip_width) < 0) { // tooltip is out of the right page bound
+ if(tooltip_div_style.removeAttribute)
+ tooltip_div_style.removeAttribute("left");
+ else
+ tooltip_div_style.removeProperty("left");
+ tooltip_div_style.right = (document.body.offsetWidth - actual_x + 2 * (dhxTooltip.config.delta_x||0)) + "px";
+ } else {
+ if (actual_x < 0) {
+ // tooltips is out of the left page bound
+ tooltip_div_style.left = (pos.x + Math.abs(dhxTooltip.config.delta_x||0)) + "px";
+ } else {
+ // normal situation
+ tooltip_div_style.left = actual_x + "px";
+ }
+ }
+
+ if ((document.body.offsetHeight - actual_y - tooltip_height) < 0) { // tooltip is below bottom of the page
+ if(tooltip_div_style.removeAttribute)
+ tooltip_div_style.removeAttribute("top");
+ else
+ tooltip_div_style.removeProperty("top");
+ tooltip_div_style.bottom = (document.body.offsetHeight - actual_y - 2 * (dhxTooltip.config.delta_y||0)) + "px";
+ } else {
+ if (actual_y < 0) {
+ // tooltip is higher then top of the page
+ tooltip_div_style.top = (pos.y + Math.abs(dhxTooltip.config.delta_y||0)) + "px";
+ } else {
+ // normal situation
+ tooltip_div_style.top = actual_y + "px";
+ }
+ }
+
+ tooltip_div_style.visibility = "visible";
+ this.tooltip.onmouseleave = function(e){
+ /*
+ A rare but reported scenario, when tooltip appears at the edge of the scheduler (e.g. left part inside cal, right part - outside).
+ User moves mouse from the scheduler into the tooltip, and then from the tooltip to the page outside the calendar.
+ As a result - tooltip freezes and no longer reacts until mouse reenters the calendar.
+ */
+ var tooltip = scheduler.dhtmlXTooltip;
+
+ var node = e.relatedTarget;
+ while (node != scheduler._obj && node) {
+ node = node.parentNode;
+ }
+
+ if(node != scheduler._obj)
+ tooltip.delay(tooltip.hide, tooltip, [], tooltip.config.timeout_to_hide);
+ };
+
+ scheduler.callEvent("onTooltipDisplayed", [this.tooltip, this.tooltip.event_id]);
+};
+dhtmlXTooltip._clearTimeout = function(){
+ if(this.tooltip._timeout_id) {
+ window.clearTimeout(this.tooltip._timeout_id);
+ }
+};
+
+dhtmlXTooltip.hide = function() {
+ if (this.tooltip.parentNode) {
+ var event_id = this.tooltip.event_id;
+ this.tooltip.event_id = null;
+ this.tooltip.onmouseleave = null;
+ this.tooltip.parentNode.removeChild(this.tooltip);
+ scheduler.callEvent("onAfterTooltip", [event_id]);
+ }
+ this._clearTimeout();
+};
+dhtmlXTooltip.delay = function(method, object, params, delay) {
+ this._clearTimeout();
+ this.tooltip._timeout_id = setTimeout(function() {
+ var ret = method.apply(object, params);
+ method = object = params = null;
+ return ret;
+ }, delay || this.config.timeout_to_display);
+};
+
+dhtmlXTooltip.isTooltip = function(node) {
+ var res = false;
+ if (node.className.split(" ")[0] == "dhtmlXTooltip") {
+ //debugger;
+ }
+ while (node && !res) {
+ res = (node.className == this.tooltip.className);
+ node = node.parentNode;
+ }
+ return res;
+};
+
+dhtmlXTooltip.position = function(ev) {
+ ev = ev || window.event;
+ if (ev.pageX || ev.pageY) //FF, KHTML
+ return {x:ev.pageX, y:ev.pageY};
+ //IE
+ var d = ((window._isIE) && (document.compatMode != "BackCompat")) ? document.documentElement : document.body;
+ return {
+ x:ev.clientX + d.scrollLeft - d.clientLeft,
+ y:ev.clientY + d.scrollTop - d.clientTop
+ };
+};
+
+scheduler.attachEvent("onMouseMove", function(event_id, e) { // (scheduler event_id, browser event)
+ var ev = window.event || e;
+ var target = ev.target || ev.srcElement;
+ var dhxTooltip = dhtmlXTooltip;
+
+ var is_tooltip = dhxTooltip.isTooltip(target);
+ var is_tooltip_target = (dhxTooltip.isTooltipTarget && dhxTooltip.isTooltipTarget(target));
+
+ // if we are over event or tooltip or custom target for tooltip
+ if (event_id || is_tooltip || is_tooltip_target) {
+ var text;
+
+ if (event_id || dhxTooltip.tooltip.event_id) {
+ var event = scheduler.getEvent(event_id) || scheduler.getEvent(dhxTooltip.tooltip.event_id);
+ if (!event)
+ return;
+
+ dhxTooltip.tooltip.event_id = event.id;
+ text = scheduler.templates.tooltip_text(event.start_date, event.end_date, event);
+ if (!text)
+ return dhxTooltip.hide();
+ }
+ if (is_tooltip_target) {
+ text = "";
+ }
+
+ var evt;
+ if (_isIE) {
+ //make a copy of event, will be used in timed call
+
+ evt = {'pageX':undefined,
+ 'pageY':undefined,
+ 'clientX':undefined,
+ 'clientY':undefined,
+ 'target':undefined,
+ 'srcElement':undefined
+ };
+ for(var i in evt){
+ evt[i] = ev[i];
+ }
+ }
+
+ if (!scheduler.callEvent("onBeforeTooltip", [event_id]) || !text)
+ return;
+
+ dhxTooltip.delay(dhxTooltip.show, dhxTooltip, [(evt || ev), text]); // showing tooltip
+ } else {
+ dhxTooltip.delay(dhxTooltip.hide, dhxTooltip, [], dhxTooltip.config.timeout_to_hide);
+ }
+});
+scheduler.attachEvent("onBeforeDrag", function() {
+ dhtmlXTooltip.hide();
+ return true;
+});
+scheduler.attachEvent("onEventDeleted", function() {
+ dhtmlXTooltip.hide();
+ return true;
+});
+
+/* Could be redifined */
+scheduler.templates.tooltip_date_format = scheduler.date.date_to_str("%Y-%m-%d %H:%i");
+
+scheduler.templates.tooltip_text = function(start, end, event) {
+ return "<b>Event:</b> " + event.text + "<br/><b>Start date:</b> " + scheduler.templates.tooltip_date_format(start) + "<br/><b>End date:</b> " + scheduler.templates.tooltip_date_format(end);
+};
diff --git a/codebase/sources/ext/dhtmlxscheduler_tooltip.js.map b/codebase/sources/ext/dhtmlxscheduler_tooltip.js.map
new file mode 100644
index 0000000..76751fa
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_tooltip.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_tooltip.js.map","sources":["dhtmlxscheduler_tooltip.js"],"names":["window","dhtmlXTooltip","scheduler","dhtmlxTooltip","config","className","timeout_to_display","timeout_to_hide","delta_x","delta_y","tooltip","document","createElement","show","event","text","touch","touch_tooltip","dhxTooltip","tooltip_div","this","tooltip_div_style","style","pos","position","target","srcElement","isTooltip","actual_x","x","actual_y","y","visibility","removeAttribute","removeProperty","left","top","innerHTML","body","appendChild","tooltip_width","offsetWidth","tooltip_height","offsetHeight","right","Math","abs","bottom","onmouseleave","e","node","relatedTarget","_obj","parentNode","delay","hide","callEvent","event_id","_clearTimeout","_timeout_id","clearTimeout","removeChild","method","object","params","setTimeout","ret","apply","res","split","ev","pageX","pageY","d","compatMode","documentElement","clientX","scrollLeft","clientLeft","clientY","scrollTop","clientTop","attachEvent","is_tooltip","is_tooltip_target","isTooltipTarget","getEvent","id","templates","tooltip_text","start_date","end_date","evt","_isIE","undefined","i","tooltip_date_format","date","date_to_str","start","end"],"mappings":"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"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_treetimeline.js b/codebase/sources/ext/dhtmlxscheduler_treetimeline.js
new file mode 100644
index 0000000..706e1bd
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_treetimeline.js
@@ -0,0 +1,313 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+scheduler.attachEvent("onTimelineCreated", function (obj){
+
+ if(obj.render == "tree") {
+ obj.y_unit_original = obj.y_unit;
+ obj.y_unit = scheduler._getArrayToDisplay(obj.y_unit_original);
+
+ scheduler.attachEvent('onOptionsLoadStart', function(){
+ obj.y_unit = scheduler._getArrayToDisplay(obj.y_unit_original);
+ });
+
+ scheduler.form_blocks[obj.name]={
+ render:function(sns) {
+ var _result = "<div class='dhx_section_timeline' style='overflow: hidden; height: "+sns.height+"px'></div>";
+ return _result;
+ },
+ set_value:function(node,value,ev,config){
+ var options = scheduler._getArrayForSelect(scheduler.matrix[config.type].y_unit_original, config.type);
+ node.innerHTML = '';
+ var temp_select = document.createElement('select');
+ node.appendChild(temp_select);
+
+ var select = node.getElementsByTagName('select')[0];
+
+ if (!select._dhx_onchange && config.onchange) {
+ select.onchange = config.onchange;
+ select._dhx_onchange = true;
+ }
+
+ for (var i = 0; i < options.length; i++) {
+ var temp_option = document.createElement('option');
+ temp_option.value = options[i].key;
+ if(temp_option.value == ev[scheduler.matrix[config.type].y_property])
+ temp_option.selected = true;
+ temp_option.innerHTML = options[i].label;
+ select.appendChild(temp_option);
+ }
+ },
+ get_value:function(node,ev,config){
+ return node.firstChild.value;
+ },
+ focus:function(node){
+ }
+ };
+
+
+ }
+});
+
+scheduler.attachEvent("onBeforeSectionRender", function (render_name, y_unit, timeline){
+ var res = {};
+ if(render_name == "tree"){
+ var height;
+ // section 1
+ var tr_className, style_height, td_className;
+ var div_expand;
+ // section 3
+ var table_className;
+ if(y_unit.children) {
+ height = timeline.folder_dy||timeline.dy;
+ if(timeline.folder_dy && !timeline.section_autoheight) {
+ style_height = "height:"+timeline.folder_dy+"px;";
+ }
+ tr_className = "dhx_row_folder";
+ td_className = "dhx_matrix_scell folder";
+ div_expand = "<div class='dhx_scell_expand'>"+((y_unit.open)?'-':'+')+"</div>";
+ table_className = (timeline.folder_events_available)?"dhx_data_table folder_events":"dhx_data_table folder";
+ } else {
+ height = timeline.dy;
+ tr_className = "dhx_row_item";
+ td_className = "dhx_matrix_scell item"+(scheduler.templates[timeline.name+"_scaley_class"](y_unit.key, y_unit.label, y_unit) ?
+ " "+scheduler.templates[timeline.name+"_scaley_class"](y_unit.key, y_unit.label, y_unit) : '');
+ div_expand = '';
+ table_className = "dhx_data_table";
+ }
+ var td_content = "<div class='dhx_scell_level"+y_unit.level+"'>"+div_expand+"<div class='dhx_scell_name'>"+(scheduler.templates[timeline.name+'_scale_label'](y_unit.key, y_unit.label, y_unit)||y_unit.label)+"</div></div>";
+
+ res = {
+ height: height,
+ style_height: style_height,
+ //section 1
+ tr_className: tr_className,
+ td_className: td_className,
+ td_content: td_content,
+ //section 3
+ table_className: table_className
+ };
+ }
+ return res;
+});
+
+var section_id_before; // section id of the event before dragging (to bring it back if user drop's event on folder without folder_events_available)
+
+scheduler.attachEvent("onBeforeEventChanged", function(event_object, native_event, is_new) {
+ if (scheduler._isRender("tree")) { // if mode's render == tree
+ var section = scheduler.getSection(event_object[scheduler.matrix[scheduler._mode].y_property]);
+ if (section && typeof section.children != 'undefined' && !scheduler.matrix[scheduler._mode].folder_events_available) { // section itself could be not defined in case of new event (addEventNow)
+ if (!is_new) { //if old - move back
+ event_object[scheduler.matrix[scheduler._mode].y_property] = section_id_before;
+ }
+ return false;
+ }
+ }
+ return true;
+});
+
+scheduler.attachEvent("onBeforeDrag", function (event_id, mode, native_event_object){
+ if(scheduler._isRender("tree")) {
+ var cell = scheduler._locate_cell_timeline(native_event_object);
+ var section_id;
+ if(cell) {
+ section_id = scheduler.matrix[scheduler._mode].y_unit[cell.y].key;
+ if(typeof scheduler.matrix[scheduler._mode].y_unit[cell.y].children != "undefined" && !scheduler.matrix[scheduler._mode].folder_events_available) {
+ return false;
+ }
+ }
+
+ var ev = scheduler.getEvent(event_id);
+ section_id_before = section_id||ev[scheduler.matrix[scheduler._mode].y_property]; // either event id or section_id will be available
+ }
+ return true;
+});
+
+scheduler._getArrayToDisplay = function(array){ // function to flatten out hierarhical array, used for tree view
+ var result = [];
+ var fillResultArray = function(array, lvl){
+ var level = lvl||0;
+ for(var i=0; i<array.length; i++) {
+ array[i].level = level;
+ if(typeof array[i].children != "undefined" && typeof array[i].key == "undefined")
+ array[i].key=scheduler.uid();
+ result.push(array[i]);
+ if(array[i].open && array[i].children) {
+ fillResultArray(array[i].children, level+1);
+ }
+ }
+ };
+ fillResultArray(array);
+ return result;
+};
+
+
+scheduler._getArrayForSelect = function(array, mode){ // function to flatten out hierarhical array, used for tree view
+ var result = [];
+ var fillResultArray = function(array){
+ for(var i=0; i<array.length; i++) {
+ if(scheduler.matrix[mode].folder_events_available) {
+ result.push(array[i]);
+ }
+ else {
+ if(typeof array[i].children == "undefined") {
+ result.push(array[i]);
+ }
+ }
+ if(array[i].children)
+ fillResultArray(array[i].children, mode);
+ }
+ };
+ fillResultArray(array);
+ return result;
+};
+
+
+/*
+scheduler._toggleFolderDisplay(4) -- toggle display of the section with key 4 (closed -> open)
+scheduler._toggleFolderDisplay(4, true) -- open section with the key 4 (doesn't matter what status was before). False - close.
+scheduler._toggleFolderDisplay(4, false, true) -- close ALL sections. Key is not used in such condition.
+*/
+scheduler._toggleFolderDisplay = function(key, status, all_sections){ // used for tree view
+ var marked;
+ var toggleElement = function(key, array, status, all_sections) {
+ for (var i=0; i<array.length; i++) {
+ if((array[i].key == key || all_sections) && array[i].children) {
+ array[i].open = (typeof status != "undefined") ? status : !array[i].open;
+ marked = true;
+ if(!all_sections && marked)
+ break;
+ }
+ if(array[i].children) {
+ toggleElement(key,array[i].children, status, all_sections);
+ }
+ }
+ };
+ var section = scheduler.getSection(key);
+
+ if((typeof status == "undefined") && !all_sections){
+ //toggle
+ status = !section.open;
+ }
+ if (scheduler.callEvent("onBeforeFolderToggle", [section, status, all_sections])) {
+ toggleElement(key,scheduler.matrix[scheduler._mode].y_unit_original, status, all_sections);
+ scheduler.matrix[scheduler._mode].y_unit = scheduler._getArrayToDisplay(scheduler.matrix[scheduler._mode].y_unit_original);
+ scheduler.callEvent("onOptionsLoad",[]);
+ scheduler.callEvent("onAfterFolderToggle", [section, status, all_sections]);
+ }
+};
+
+scheduler.attachEvent("onCellClick", function (x, y, a, b, event){
+ if(scheduler._isRender("tree")) {
+ if(!scheduler.matrix[scheduler._mode].folder_events_available) {
+ if(typeof scheduler.matrix[scheduler._mode].y_unit[y] != "undefined" &&
+ typeof scheduler.matrix[scheduler._mode].y_unit[y].children != "undefined") {
+ scheduler._toggleFolderDisplay(scheduler.matrix[scheduler._mode].y_unit[y].key);
+ }
+ }
+ }
+});
+
+scheduler.attachEvent("onYScaleClick", function (index, value, event){
+ if(scheduler._isRender("tree")) {
+ if(typeof value.children != "undefined") {
+ scheduler._toggleFolderDisplay(value.key);
+ }
+ }
+});
+
+scheduler.getSection = function(id){
+ if(scheduler._isRender("tree")) {
+ var obj;
+ var findElement = function(key, array) {
+ for (var i=0; i<array.length; i++) {
+ if(array[i].key == key)
+ obj = array[i];
+ if(array[i].children)
+ findElement(key,array[i].children);
+ }
+ };
+ findElement(id, scheduler.matrix[scheduler._mode].y_unit_original);
+ return obj||null;
+ }
+};
+
+scheduler.deleteSection = function(id){
+ if(scheduler._isRender("tree")) {
+ var result = false;
+ var deleteElement = function(key, array) {
+ for (var i=0; i<array.length; i++) {
+ if(array[i].key == key) {
+ array.splice(i,1);
+ result = true;
+ }
+ if(result)
+ break;
+ if(array[i].children)
+ deleteElement(key,array[i].children);
+ }
+ };
+ deleteElement(id, scheduler.matrix[scheduler._mode].y_unit_original);
+ scheduler.matrix[scheduler._mode].y_unit = scheduler._getArrayToDisplay(scheduler.matrix[scheduler._mode].y_unit_original);
+ scheduler.callEvent("onOptionsLoad",[]);
+ return result;
+ }
+};
+
+scheduler.deleteAllSections = function(){
+ if(scheduler._isRender("tree")) {
+ scheduler.matrix[scheduler._mode].y_unit_original = [];
+ scheduler.matrix[scheduler._mode].y_unit = scheduler._getArrayToDisplay(scheduler.matrix[scheduler._mode].y_unit_original);
+ scheduler.callEvent("onOptionsLoad",[]);
+ }
+};
+
+scheduler.addSection = function(obj, parent_id){
+ if(scheduler._isRender("tree")) {
+ var result = false;
+ var addElement = function(obj, parent_key, array) {
+ if(!parent_id) {
+ array.push(obj);
+ result = true;
+ }
+ else {
+ for (var i=0; i<array.length; i++) {
+ if(array[i].key == parent_key && typeof array[i].children != "undefined") {
+ array[i].children.push(obj);
+ result = true;
+ }
+ if(result)
+ break;
+ if(array[i].children)
+ addElement(obj,parent_key,array[i].children);
+ }
+ }
+ };
+ addElement(obj, parent_id, scheduler.matrix[scheduler._mode].y_unit_original);
+ scheduler.matrix[scheduler._mode].y_unit = scheduler._getArrayToDisplay(scheduler.matrix[scheduler._mode].y_unit_original);
+ scheduler.callEvent("onOptionsLoad",[]);
+ return result;
+ }
+};
+
+
+scheduler.openAllSections = function() {
+ if(scheduler._isRender("tree"))
+ scheduler._toggleFolderDisplay(1, true, true);
+};
+scheduler.closeAllSections = function() {
+ if(scheduler._isRender("tree"))
+ scheduler._toggleFolderDisplay(1, false, true);
+};
+scheduler.openSection = function(section_id){
+ if(scheduler._isRender("tree"))
+ scheduler._toggleFolderDisplay(section_id, true);
+};
+scheduler.closeSection = function(section_id){
+ if(scheduler._isRender("tree"))
+ scheduler._toggleFolderDisplay(section_id, false);
+};
diff --git a/codebase/sources/ext/dhtmlxscheduler_treetimeline.js.map b/codebase/sources/ext/dhtmlxscheduler_treetimeline.js.map
new file mode 100644
index 0000000..fa99384
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_treetimeline.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_treetimeline.js.map","sources":["dhtmlxscheduler_treetimeline.js"],"names":["scheduler","attachEvent","obj","render","y_unit_original","y_unit","_getArrayToDisplay","form_blocks","name","sns","_result","height","set_value","node","value","ev","config","options","_getArrayForSelect","matrix","type","innerHTML","temp_select","document","createElement","appendChild","select","getElementsByTagName","_dhx_onchange","onchange","i","length","temp_option","key","y_property","selected","label","get_value","firstChild","focus","render_name","timeline","res","tr_className","style_height","td_className","div_expand","table_className","children","folder_dy","dy","section_autoheight","templates","td_content","level","section_id_before","event_object","native_event","is_new","_isRender","section","getSection","_mode","folder_events_available","event_id","mode","native_event_object","section_id","cell","_locate_cell_timeline","y","getEvent","array","result","fillResultArray","lvl","uid","push","open","_toggleFolderDisplay","status","all_sections","marked","toggleElement","callEvent","x","index","id","findElement","deleteSection","deleteElement","splice","deleteAllSections","addSection","parent_id","addElement","parent_key","openAllSections","closeAllSections","openSection","closeSection"],"mappings":"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"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_units.js b/codebase/sources/ext/dhtmlxscheduler_units.js
new file mode 100644
index 0000000..c6a94d3
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_units.js
@@ -0,0 +1,259 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+scheduler._props = {};
+scheduler.createUnitsView=function(name,property,list,size,step,skip_incorrect){
+ if (typeof name == "object"){
+ list = name.list;
+ property = name.property;
+ size = name.size||0;
+ step = name.step||1;
+ skip_incorrect = name.skip_incorrect;
+ name = name.name;
+ }
+
+ scheduler._props[name]={map_to:property, options:list, step:step, position:0 };
+ if(size>scheduler._props[name].options.length){
+ scheduler._props[name]._original_size = size;
+ size = 0;
+ }
+ scheduler._props[name].size = size;
+ scheduler._props[name].skip_incorrect = skip_incorrect||false;
+
+ scheduler.date[name+"_start"]= scheduler.date.day_start;
+ scheduler.templates[name+"_date"] = function(date){
+ return scheduler.templates.day_date(date);
+ };
+
+ scheduler._get_unit_index = function(unit_view, date) {
+ var original_position = unit_view.position || 0;
+ var date_position = Math.floor((scheduler._correct_shift(+date, 1) - +scheduler._min_date) / (60 * 60 * 24 * 1000));
+ return original_position + date_position;
+ };
+ scheduler.templates[name + "_scale_text"] = function(id, label, option) {
+ if (option.css) {
+ return "<span class='" + option.css + "'>" + label + "</span>";
+ } else {
+ return label;
+ }
+ };
+ scheduler.templates[name+"_scale_date"] = function(date) {
+ var unit_view = scheduler._props[name];
+ var list = unit_view.options;
+ if (!list.length) return "";
+ var index = scheduler._get_unit_index(unit_view, date);
+ var option = list[index];
+ return scheduler.templates[name + "_scale_text"](option.key, option.label, option);
+ };
+
+ scheduler.date["add_"+name]=function(date,inc){ return scheduler.date.add(date,inc,"day"); };
+ scheduler.date["get_"+name+"_end"]=function(date){
+ return scheduler.date.add(date,scheduler._props[name].size||scheduler._props[name].options.length,"day");
+ };
+
+ scheduler.attachEvent("onOptionsLoad",function(){
+ var pr = scheduler._props[name];
+ var order = pr.order = {};
+ var list = pr.options;
+ for(var i=0; i<list.length;i++)
+ order[list[i].key]=i;
+ if(pr._original_size && pr.size===0){
+ pr.size = pr._original_size;
+ delete pr.original_size;
+ }
+ if(pr.size > list.length) {
+ pr._original_size = pr.size;
+ pr.size = 0;
+ }
+ else
+ pr.size = pr._original_size||pr.size;
+ if (scheduler._date && scheduler._mode == name)
+ scheduler.setCurrentView(scheduler._date, scheduler._mode);
+ });
+
+ scheduler["mouse_"+ name] = function(pos){ //mouse_coord handler
+ var pr = scheduler._props[this._mode];
+
+ if (pr){
+ pos = this._week_indexes_from_pos(pos);
+ if(!this._drag_event) this._drag_event = {};
+
+ if (this._drag_id && this._drag_mode){
+ this._drag_event._dhx_changed = true;
+ }
+ var unit_ind = Math.min(pos.x+pr.position,pr.options.length-1);
+ pos.section = (pr.options[unit_ind]||{}).key;
+ pos.x = 0;
+
+ var ev = this.getEvent(this._drag_id);
+ this._update_unit_section({view:pr, event:ev, pos:pos});
+ }
+ pos.force_redraw = true;
+
+ return pos;
+ };
+
+
+
+ scheduler.callEvent("onOptionsLoad",[]);
+};
+
+scheduler._update_unit_section = function(action){
+ var view = action.view,
+ event = action.event,
+ pos = action.pos;
+ if(event) {
+ event[view.map_to] = pos.section;
+ }
+};
+
+scheduler.scrollUnit=function(step){
+ var pr = scheduler._props[this._mode];
+ if (pr){
+ pr.position=Math.min(Math.max(0,pr.position+step),pr.options.length-pr.size);
+ this.update_view();
+ }
+};
+(function(){
+ var _removeIncorrectEvents = function(evs) {
+ var pr = scheduler._props[scheduler._mode];
+ if(pr && pr.order && pr.skip_incorrect) {
+ var correct_events = [];
+ for(var i=0; i<evs.length; i++) {
+ if(typeof pr.order[evs[i][pr.map_to]] != "undefined") {
+ correct_events.push(evs[i]);
+ }
+ }
+ evs.splice(0,evs.length);
+ evs.push.apply(evs,correct_events);
+ }
+ return evs;
+ };
+ var old_pre_render_events_table = scheduler._pre_render_events_table;
+ scheduler._pre_render_events_table=function(evs,hold) {
+ evs = _removeIncorrectEvents(evs);
+ return old_pre_render_events_table.apply(this, [evs, hold]);
+ };
+ var old_pre_render_events_line = scheduler._pre_render_events_line;
+ scheduler._pre_render_events_line = function(evs,hold){
+ evs = _removeIncorrectEvents(evs);
+ return old_pre_render_events_line.apply(this, [evs, hold]);
+ };
+ var fix_und=function(pr,ev){
+ if (pr && typeof pr.order[ev[pr.map_to]] == "undefined"){
+ var s = scheduler;
+ var dx = 24*60*60*1000;
+ var ind = Math.floor((ev.end_date - s._min_date)/dx);
+ //ev.end_date = new Date(s.date.time_part(ev.end_date)*1000+s._min_date.valueOf());
+ //ev.start_date = new Date(s.date.time_part(ev.start_date)*1000+s._min_date.valueOf());
+ ev[pr.map_to] = pr.options[Math.min(ind+pr.position,pr.options.length-1)].key;
+ return true;
+ }
+ };
+ var t = scheduler._reset_scale;
+
+ var oldive = scheduler.is_visible_events;
+ scheduler.is_visible_events = function(e){
+ var res = oldive.apply(this,arguments);
+ if (res){
+ var pr = scheduler._props[this._mode];
+ if (pr && pr.size){
+ var val = pr.order[e[pr.map_to]];
+ if (val < pr.position || val >= pr.size+pr.position )
+ return false;
+ }
+ }
+ return res;
+ };
+ scheduler._reset_scale = function(){
+ var pr = scheduler._props[this._mode];
+ var ret = t.apply(this,arguments);
+ if (pr){
+ this._max_date=this.date.add(this._min_date,1,"day");
+
+ var d = this._els["dhx_cal_data"][0].childNodes;
+ for (var i=0; i < d.length; i++)
+ d[i].className = d[i].className.replace("_now",""); //clear now class
+
+ if (pr.size && pr.size < pr.options.length){
+
+ var h = this._els["dhx_cal_header"][0];
+ var arrow = document.createElement("DIV");
+ if (pr.position){
+ arrow.className = "dhx_cal_prev_button";
+ arrow.style.cssText="left:1px;top:2px;position:absolute;";
+ arrow.innerHTML = "&nbsp;";
+ h.firstChild.appendChild(arrow);
+ arrow.onclick=function(){
+ scheduler.scrollUnit(pr.step*-1);
+ };
+ }
+ if (pr.position+pr.size<pr.options.length){
+ arrow = document.createElement("DIV");
+ arrow.className = "dhx_cal_next_button";
+ arrow.style.cssText="left:auto; right:0px;top:2px;position:absolute;";
+ arrow.innerHTML = "&nbsp;";
+ h.lastChild.appendChild(arrow);
+ arrow.onclick=function(){
+ scheduler.scrollUnit(pr.step);
+ };
+ }
+ }
+ }
+ return ret;
+
+ };
+ var r = scheduler._get_event_sday;
+ scheduler._get_event_sday=function(ev){
+ var pr = scheduler._props[this._mode];
+ if (pr){
+ fix_und(pr,ev);
+ return pr.order[ev[pr.map_to]]-pr.position;
+ }
+ return r.call(this,ev);
+ };
+ var l = scheduler.locate_holder_day;
+ scheduler.locate_holder_day=function(a,b,ev){
+ var pr = scheduler._props[this._mode];
+ if (pr && ev) {
+ fix_und(pr,ev);
+ return pr.order[ev[pr.map_to]]*1+(b?1:0)-pr.position;
+ }
+ return l.apply(this,arguments);
+ };
+
+ var o = scheduler._time_order;
+ scheduler._time_order = function(evs){
+ var pr = scheduler._props[this._mode];
+ if (pr){
+ evs.sort(function(a,b){
+ return pr.order[a[pr.map_to]]>pr.order[b[pr.map_to]]?1:-1;
+ });
+ } else
+ o.apply(this,arguments);
+ };
+ scheduler.attachEvent("onEventAdded",function(id,ev){
+ if (this._loading) return true;
+ for (var a in scheduler._props){
+ var pr = scheduler._props[a];
+ if (typeof ev[pr.map_to] == "undefined")
+ ev[pr.map_to] = pr.options[0].key;
+ }
+ return true;
+ });
+ scheduler.attachEvent("onEventCreated",function(id,n_ev){
+ var pr = scheduler._props[this._mode];
+ if (pr && n_ev){
+ var ev = this.getEvent(id);
+ var pos = this._mouse_coords(n_ev);
+ this._update_unit_section({view:pr, event:ev, pos:pos});
+ fix_und(pr,ev);
+ this.event_updated(ev);
+ }
+ return true;
+ });
+})();
diff --git a/codebase/sources/ext/dhtmlxscheduler_units.js.map b/codebase/sources/ext/dhtmlxscheduler_units.js.map
new file mode 100644
index 0000000..b53e25b
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_units.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_units.js.map","sources":["dhtmlxscheduler_units.js"],"names":["scheduler","_props","createUnitsView","name","property","list","size","step","skip_incorrect","map_to","options","position","length","_original_size","date","day_start","templates","day_date","_get_unit_index","unit_view","original_position","date_position","Math","floor","_correct_shift","_min_date","id","label","option","css","index","key","inc","add","attachEvent","pr","order","i","original_size","_date","_mode","setCurrentView","pos","this","_week_indexes_from_pos","_drag_event","_drag_id","_drag_mode","_dhx_changed","unit_ind","min","x","section","ev","getEvent","_update_unit_section","view","event","force_redraw","callEvent","action","scrollUnit","max","update_view","_removeIncorrectEvents","evs","correct_events","push","splice","apply","old_pre_render_events_table","_pre_render_events_table","hold","old_pre_render_events_line","_pre_render_events_line","fix_und","s","dx","ind","end_date","t","_reset_scale","oldive","is_visible_events","e","res","arguments","val","ret","_max_date","d","_els","childNodes","className","replace","h","arrow","document","createElement","style","cssText","innerHTML","firstChild","appendChild","onclick","lastChild","r","_get_event_sday","call","l","locate_holder_day","a","b","o","_time_order","sort","_loading","n_ev","_mouse_coords","event_updated"],"mappings":"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"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_url.js b/codebase/sources/ext/dhtmlxscheduler_url.js
new file mode 100644
index 0000000..2a98978
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_url.js
@@ -0,0 +1,37 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+scheduler.attachEvent("onTemplatesReady",function(){
+ var first = true;
+ var s2d = scheduler.date.str_to_date("%Y-%m-%d");
+ var d2s = scheduler.date.date_to_str("%Y-%m-%d");
+ scheduler.attachEvent("onBeforeViewChange",function(om,od,m,d){
+ if (first){
+ first = false;
+ var p={};
+ var data=(document.location.hash||"").replace("#","").split(",");
+ for (var i=0; i < data.length; i++) {
+ var s = data[i].split("=");
+ if (s.length==2)
+ p[s[0]]=s[1];
+ }
+
+ if (p.date || p.mode){
+ try{
+ this.setCurrentView((p.date?s2d(p.date):null),(p.mode||null));
+ } catch(e){
+ //assuming that mode is not available anymore
+ this.setCurrentView((p.date?s2d(p.date):null),m);
+ }
+ return false;
+ }
+ }
+ var text = "#date="+d2s(d||od)+",mode="+(m||om);
+ document.location.hash = text;
+ return true;
+ });
+}); \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_url.js.map b/codebase/sources/ext/dhtmlxscheduler_url.js.map
new file mode 100644
index 0000000..6814ae0
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_url.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_url.js.map","sources":["dhtmlxscheduler_url.js"],"names":["scheduler","attachEvent","first","s2d","date","str_to_date","d2s","date_to_str","om","od","m","d","p","data","document","location","hash","replace","split","i","length","s","mode","this","setCurrentView","e","text"],"mappings":"AAAAA,UAAUC,YAAY,mBAAmB,WACtC,GAAIC,IAAQ,EACRC,EAAMH,UAAUI,KAAKC,YAAY,YACjCC,EAAMN,UAAUI,KAAKG,YAAY,WACrCP,WAAUC,YAAY,qBAAqB,SAASO,EAAGC,EAAGC,EAAEC,GACzD,GAAIT,EAAM,CACPA,GAAQ,CAGR,KAAK,GAFDU,MACAC,GAAMC,SAASC,SAASC,MAAM,IAAIC,QAAQ,IAAI,IAAIC,MAAM,KACnDC,EAAE,EAAGA,EAAIN,EAAKO,OAAQD,IAAK,CACnC,GAAIE,GAAIR,EAAKM,GAAGD,MAAM,IACR,IAAVG,EAAED,SACNR,EAAES,EAAE,IAAIA,EAAE,IAGX,GAAIT,EAAER,MAAQQ,EAAEU,KAAK,CACpB,IACGC,KAAKC,eAAgBZ,EAAER,KAAKD,EAAIS,EAAER,MAAM,KAAOQ,EAAEU,MAAM,MACzD,MAAMG,GAEPF,KAAKC,eAAgBZ,EAAER,KAAKD,EAAIS,EAAER,MAAM,KAAMM,GAE5C,OAAO,GAGb,GAAIgB,GAAO,SAASpB,EAAIK,GAAGF,GAAI,UAAUC,GAAGF,EAE5C;MADAM,UAASC,SAASC,KAAOU,GAClB"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_week_agenda.js b/codebase/sources/ext/dhtmlxscheduler_week_agenda.js
new file mode 100644
index 0000000..fad882e
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_week_agenda.js
@@ -0,0 +1,261 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+scheduler._wa = {};
+scheduler.xy.week_agenda_scale_height = 20;
+scheduler.templates.week_agenda_event_text = function(start_date, end_date, event, date) {
+ return scheduler.templates.event_date(start_date) + " " + event.text;
+};
+scheduler.date.week_agenda_start = scheduler.date.week_start;
+scheduler.date.week_agenda_end = function(date) {
+ return scheduler.date.add(date, 7, "day");
+};
+scheduler.date.add_week_agenda = function(date, inc) {
+ return scheduler.date.add(date, inc * 7, "day");
+};
+
+scheduler.attachEvent("onSchedulerReady", function() {
+ var t = scheduler.templates;
+ if (!t.week_agenda_date)
+ t.week_agenda_date = t.week_date;
+});
+
+(function() {
+ var scale_date_format = scheduler.date.date_to_str("%l, %F %d");
+ scheduler.templates.week_agenda_scale_date = function(date) {
+ return scale_date_format(date);
+ };
+})();
+
+scheduler.attachEvent("onTemplatesReady", function() {
+
+ scheduler.attachEvent("onSchedulerResize", function() {
+ if (this._mode == "week_agenda") {
+ this.week_agenda_view(true);
+ return false;
+ }
+ return true;
+ });
+
+ var old = scheduler.render_data;
+ scheduler.render_data = function(evs) {
+ if (this._mode == "week_agenda") {
+ scheduler.week_agenda_view(true);
+ } else
+ return old.apply(this, arguments);
+ };
+
+ var getColumnSizes = function() {
+ // widths
+ scheduler._cols = [];
+ var twidth = parseInt(scheduler._els['dhx_cal_data'][0].style.width);
+ scheduler._cols.push(Math.floor(twidth / 2));
+ scheduler._cols.push(twidth - scheduler._cols[0] - 1); // To add border between columns
+
+ // heights
+ scheduler._colsS = {
+ 0: [],
+ 1: []
+ };
+ var theight = parseInt(scheduler._els['dhx_cal_data'][0].style.height);
+ for (var i = 0; i < 3; i++) {
+ scheduler._colsS[0].push(Math.floor(theight / (3 - scheduler._colsS[0].length)));
+ theight -= scheduler._colsS[0][i];
+ }
+ scheduler._colsS[1].push(scheduler._colsS[0][0]);
+ scheduler._colsS[1].push(scheduler._colsS[0][1]);
+ // last two days
+ theight = scheduler._colsS[0][scheduler._colsS[0].length - 1];
+ scheduler._colsS[1].push(Math.floor(theight / 2));
+ scheduler._colsS[1].push(theight - scheduler._colsS[1][scheduler._colsS[1].length - 1]);
+ };
+ var fillWeekAgendaTab = function() {
+ getColumnSizes();
+ scheduler._els["dhx_cal_data"][0].innerHTML = '';
+ scheduler._rendered = [];
+ var html = '';
+ for (var i = 0; i < 2; i++) {
+ var width = scheduler._cols[i];
+ var column_css = 'dhx_wa_column';
+ if (i == 1)
+ column_css += ' dhx_wa_column_last';
+ html += "<div class='" + column_css + "' style='width: " + width + "px;'>";
+ for (var k = 0; k < scheduler._colsS[i].length; k++) {
+ var scale_height = scheduler.xy.week_agenda_scale_height - 2;
+ var height = scheduler._colsS[i][k] - scale_height - 2;
+ var day = Math.min(6, k * 2 + i);
+ html += "<div class='dhx_wa_day_cont'><div style='height:" + scale_height + "px; line-height:" + scale_height + "px;' class='dhx_wa_scale_bar'></div><div style='height:" + height + "px;' class='dhx_wa_day_data' day='" + day + "'></div></div>";
+ }
+ html += "</div>";
+ }
+ scheduler._els["dhx_cal_date"][0].innerHTML = scheduler.templates[scheduler._mode + "_date"](scheduler._min_date, scheduler._max_date, scheduler._mode);
+ scheduler._els["dhx_cal_data"][0].innerHTML = html;
+ var all_divs = scheduler._els["dhx_cal_data"][0].getElementsByTagName('div');
+ var day_divs = [];
+ for (var i = 0; i < all_divs.length; i++) {
+ if (all_divs[i].className == 'dhx_wa_day_cont')
+ day_divs.push(all_divs[i]);
+ }
+ scheduler._wa._selected_divs = [];
+ var events = scheduler.get_visible_events(); // list of events to be displayed in current week
+ var tstart = scheduler.date.week_start(scheduler._date);
+ var tend = scheduler.date.add(tstart, 1, "day");
+ for (var i = 0; i < 7; i++) {
+ day_divs[i]._date = tstart;
+ var scale_bar = day_divs[i].childNodes[0];
+ var events_div = day_divs[i].childNodes[1];
+ scale_bar.innerHTML = scheduler.templates.week_agenda_scale_date(tstart);
+ var evs = []; // events which will be displayed in the current day
+ for (var j = 0; j < events.length; j++) {
+ var tev = events[j];
+ if (tev.start_date < tend && tev.end_date > tstart)
+ evs.push(tev);
+ }
+ evs.sort(function(a, b) {
+ if (a.start_date.valueOf() == b.start_date.valueOf())
+ return a.id > b.id ? 1 : -1;
+ return a.start_date > b.start_date ? 1 : -1;
+ });
+ for (var k = 0; k < evs.length; k++) {
+ var ev = evs[k];
+ var ev_div = document.createElement('div');
+ scheduler._rendered.push(ev_div);
+ var ev_class = scheduler.templates.event_class(ev.start_date, ev.end_date, ev);
+ ev_div.className = 'dhx_wa_ev_body' + (ev_class ? (' ' + ev_class) : '');
+ if (ev._text_style)
+ ev_div.style.cssText = ev._text_style;
+ if (ev.color)
+ ev_div.style.background = ev.color;
+ if (ev.textColor)
+ ev_div.style.color = ev.textColor;
+ if (scheduler._select_id && ev.id == scheduler._select_id && !(!scheduler.config.week_agenda_select && scheduler.config.week_agenda_select !== undefined)) {
+ ev_div.className += " dhx_cal_event_selected";
+ scheduler._wa._selected_divs.push(ev_div);
+ }
+ var position = "";
+ if (!ev._timed) {
+ position = "middle";
+ if (ev.start_date.valueOf() >= tstart.valueOf() && ev.start_date.valueOf() <= tend.valueOf())
+ position = "start";
+ if (ev.end_date.valueOf() >= tstart.valueOf() && ev.end_date.valueOf() <= tend.valueOf())
+ position = "end";
+ }
+ ev_div.innerHTML = scheduler.templates.week_agenda_event_text(ev.start_date, ev.end_date, ev, tstart, position);
+ ev_div.setAttribute('event_id', ev.id);
+ events_div.appendChild(ev_div);
+ }
+ tstart = scheduler.date.add(tstart, 1, "day");
+ tend = scheduler.date.add(tend, 1, "day");
+ }
+ };
+ scheduler.week_agenda_view = function(mode) {
+ scheduler._min_date = scheduler.date.week_start(scheduler._date);
+ scheduler._max_date = scheduler.date.add(scheduler._min_date, 1, "week");
+ scheduler.set_sizes();
+ if (mode) { // mode enabled
+ scheduler._table_view = scheduler._allow_dnd = true;
+
+ // hiding default top border from dhx_cal_data
+ scheduler._wa._prev_data_border = scheduler._els['dhx_cal_data'][0].style.borderTop;
+ scheduler._els['dhx_cal_data'][0].style.borderTop = 0;
+ scheduler._els['dhx_cal_data'][0].style.overflowY = 'hidden';
+
+ // cleaning dhx_cal_date from the previous date
+ scheduler._els['dhx_cal_date'][0].innerHTML = "";
+
+ // 1 to make navline to be over data
+ scheduler._els['dhx_cal_data'][0].style.top = (parseInt(scheduler._els['dhx_cal_data'][0].style.top) - 20 - 1) + 'px';
+ scheduler._els['dhx_cal_data'][0].style.height = (parseInt(scheduler._els['dhx_cal_data'][0].style.height) + 20 + 1) + 'px';
+
+ scheduler._els['dhx_cal_header'][0].style.display = 'none';
+ fillWeekAgendaTab();
+ } else { // leaving week_agenda mode
+ scheduler._table_view = scheduler._allow_dnd = false;
+
+ // restoring default top border to dhx_cal_data
+ if (scheduler._wa._prev_data_border)
+ scheduler._els['dhx_cal_data'][0].style.borderTop = scheduler._wa._prev_data_border;
+
+ scheduler._els['dhx_cal_data'][0].style.overflowY = 'auto';
+ scheduler._els['dhx_cal_data'][0].style.top = (parseInt(scheduler._els['dhx_cal_data'][0].style.top) + 20) + 'px';
+ scheduler._els['dhx_cal_data'][0].style.height = (parseInt(scheduler._els['dhx_cal_data'][0].style.height) - 20) + 'px';
+ scheduler._els['dhx_cal_header'][0].style.display = 'block';
+ }
+ };
+ scheduler.mouse_week_agenda = function(pos) {
+ var native_event = pos.ev;
+ var src = native_event.srcElement || native_event.target;
+ var date;
+ while (src.parentNode) {
+ if (src._date)
+ date = src._date;
+ src = src.parentNode;
+ }
+ if (!date)
+ return pos;
+ pos.x = 0;
+ var diff = date.valueOf() - scheduler._min_date.valueOf();
+ pos.y = Math.ceil(( diff / (1000 * 60) ) / this.config.time_step);
+ if (this._drag_mode == 'move') {
+ var event_div;
+ this._drag_event._dhx_changed = true;
+ this._select_id = this._drag_id;
+ for (var i = 0; i < scheduler._rendered.length; i++) {
+ if (scheduler._drag_id == this._rendered[i].getAttribute('event_id'))
+ event_div = this._rendered[i];
+ }
+ if (!scheduler._wa._dnd) {
+ var div = event_div.cloneNode(true);
+ this._wa._dnd = div;
+ div.className = event_div.className;
+ div.id = 'dhx_wa_dnd';
+ div.className += ' dhx_wa_dnd';
+ document.body.appendChild(div);
+ }
+ var dnd_div = document.getElementById('dhx_wa_dnd');
+ dnd_div.style.top = ((native_event.pageY || native_event.clientY) + 20) + "px";
+ dnd_div.style.left = ((native_event.pageX || native_event.clientX) + 20) + "px";
+ }
+ return pos;
+ };
+ scheduler.attachEvent('onBeforeEventChanged', function(event_object, native_event, is_new) {
+ if (this._mode == 'week_agenda') {
+ if (this._drag_mode == 'move') {
+ var dnd = document.getElementById('dhx_wa_dnd');
+ dnd.parentNode.removeChild(dnd);
+ scheduler._wa._dnd = false;
+ }
+ }
+ return true;
+ });
+
+ scheduler.attachEvent("onEventSave", function(id, data, is_new_event) {
+ if (is_new_event && this._mode == 'week_agenda')
+ this._select_id = id;
+ return true;
+ });
+
+ scheduler._wa._selected_divs = [];
+
+ scheduler.attachEvent("onClick", function(event_id, native_event_object) {
+ if (this._mode == 'week_agenda' && !(!scheduler.config.week_agenda_select && scheduler.config.week_agenda_select !== undefined)) {
+ if (scheduler._wa._selected_divs) {
+ for (var i = 0; i < this._wa._selected_divs.length; i++) {
+ var div = this._wa._selected_divs[i];
+ div.className = div.className.replace(/ dhx_cal_event_selected/, '');
+ }
+ }
+ this.for_rendered(event_id, function(event_div) {
+ event_div.className += " dhx_cal_event_selected";
+ scheduler._wa._selected_divs.push(event_div);
+ });
+ scheduler.select(event_id);
+ return false;
+ }
+ return true;
+ });
+});
diff --git a/codebase/sources/ext/dhtmlxscheduler_week_agenda.js.map b/codebase/sources/ext/dhtmlxscheduler_week_agenda.js.map
new file mode 100644
index 0000000..696e0d2
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_week_agenda.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_week_agenda.js.map","sources":["dhtmlxscheduler_week_agenda.js"],"names":["scheduler","_wa","xy","week_agenda_scale_height","templates","week_agenda_event_text","start_date","end_date","event","event_date","text","date","week_agenda_start","week_start","week_agenda_end","add","add_week_agenda","inc","attachEvent","t","week_agenda_date","week_date","scale_date_format","date_to_str","week_agenda_scale_date","this","_mode","week_agenda_view","old","render_data","apply","arguments","getColumnSizes","_cols","twidth","parseInt","_els","style","width","push","Math","floor","_colsS",1,"theight","height","i","length","fillWeekAgendaTab","innerHTML","_rendered","html","column_css","k","scale_height","day","min","_min_date","_max_date","all_divs","getElementsByTagName","day_divs","className","_selected_divs","events","get_visible_events","tstart","_date","tend","scale_bar","childNodes","events_div","evs","j","tev","sort","a","b","valueOf","id","ev","ev_div","document","createElement","ev_class","event_class","_text_style","cssText","color","background","textColor","_select_id","config","week_agenda_select","undefined","position","_timed","setAttribute","appendChild","mode","set_sizes","_table_view","_allow_dnd","_prev_data_border","borderTop","overflowY","top","display","mouse_week_agenda","pos","native_event","src","srcElement","target","parentNode","x","diff","y","ceil","time_step","_drag_mode","event_div","_drag_event","_dhx_changed","_drag_id","getAttribute","_dnd","div","cloneNode","body","dnd_div","getElementById","pageY","clientY","left","pageX","clientX","dnd","removeChild","data","is_new_event","event_id","replace","for_rendered","select"],"mappings":"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"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_wp.js b/codebase/sources/ext/dhtmlxscheduler_wp.js
new file mode 100644
index 0000000..89da447
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_wp.js
@@ -0,0 +1,20 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+scheduler.attachEvent("onLightBox",function(){
+ if (this._cover){
+ try{
+ this._cover.style.height = this.expanded ? "100%" : ((document.body.parentNode||document.body).scrollHeight+"px");
+ } catch(e) {}
+ }
+});
+
+scheduler.form_blocks.select.set_value=function(node,value,ev){
+ if (typeof value == "undefined" || value === "")
+ value = (node.firstChild.options[0]||{}).value;
+ node.firstChild.value=value||"";
+}; \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_wp.js.map b/codebase/sources/ext/dhtmlxscheduler_wp.js.map
new file mode 100644
index 0000000..1175527
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_wp.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_wp.js.map","sources":["dhtmlxscheduler_wp.js"],"names":["scheduler","attachEvent","this","_cover","style","height","expanded","document","body","parentNode","scrollHeight","e","form_blocks","select","set_value","node","value","firstChild","options"],"mappings":"AAAAA,UAAUC,YAAY,aAAa,WAClC,GAAIC,KAAKC,OACR,IACCD,KAAKC,OAAOC,MAAMC,OAASH,KAAKI,SAAW,QAAWC,SAASC,KAAKC,YAAYF,SAASC,MAAME,aAAa,KAC3G,MAAMC,OAIVX,UAAUY,YAAYC,OAAOC,UAAU,SAASC,EAAKC,IAChC,mBAATA,IAAkC,KAAVA,KAClCA,GAASD,EAAKE,WAAWC,QAAQ,QAAQF,OAC1CD,EAAKE,WAAWD,MAAMA,GAAO"} \ No newline at end of file
diff --git a/codebase/sources/ext/dhtmlxscheduler_year_view.js b/codebase/sources/ext/dhtmlxscheduler_year_view.js
new file mode 100644
index 0000000..ca2f5a4
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_year_view.js
@@ -0,0 +1,391 @@
+/*
+dhtmlxScheduler v.4.1.0 Stardard
+
+This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited.
+
+(c) Dinamenta, UAB.
+*/
+scheduler.config.year_x = 4;
+scheduler.config.year_y = 3;
+scheduler.xy.year_top = 0;
+
+scheduler.templates.year_date = function(date) {
+ return scheduler.date.date_to_str(scheduler.locale.labels.year_tab + " %Y")(date);
+};
+scheduler.templates.year_month = scheduler.date.date_to_str("%F");
+scheduler.templates.year_scale_date = scheduler.date.date_to_str("%D");
+scheduler.templates.year_tooltip = function(s, e, ev) {
+ return ev.text;
+};
+
+(function() {
+ var is_year_mode = function() {
+ return scheduler._mode == "year";
+ };
+
+ scheduler.dblclick_dhx_month_head = function(e) {
+ if (is_year_mode()) {
+ var t = (e.target || e.srcElement);
+ if (t.parentNode.className.indexOf("dhx_before") != -1 || t.parentNode.className.indexOf("dhx_after") != -1) return false;
+ var start = this.templates.xml_date(t.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.getAttribute("date"));
+ start.setDate(parseInt(t.innerHTML, 10));
+ var end = this.date.add(start, 1, "day");
+ if (!this.config.readonly && this.config.dblclick_create)
+ this.addEventNow(start.valueOf(), end.valueOf(), e);
+ }
+ };
+
+ var chid = scheduler.changeEventId;
+ scheduler.changeEventId = function() {
+ chid.apply(this, arguments);
+ if (is_year_mode())
+ this.year_view(true);
+ };
+
+
+ var old = scheduler.render_data;
+ var to_attr = scheduler.date.date_to_str("%Y/%m/%d");
+ var from_attr = scheduler.date.str_to_date("%Y/%m/%d");
+ scheduler.render_data = function(evs) {
+ if (!is_year_mode()) return old.apply(this, arguments);
+ for (var i = 0; i < evs.length; i++)
+ this._year_render_event(evs[i]);
+ };
+
+ var clear = scheduler.clear_view;
+ scheduler.clear_view = function() {
+ if (!is_year_mode()) return clear.apply(this, arguments);
+ var dates = scheduler._year_marked_cells,
+ div = null;
+ for (var date in dates) {
+ if (dates.hasOwnProperty(date)) {
+ div = dates[date];
+ div.className = "dhx_month_head";
+ div.setAttribute("date", "");
+ }
+ }
+ scheduler._year_marked_cells = {};
+ };
+
+ scheduler._hideToolTip = function() {
+ if (this._tooltip) {
+ this._tooltip.style.display = "none";
+ this._tooltip.date = new Date(9999, 1, 1);
+ }
+ };
+
+ scheduler._showToolTip = function(date, pos, e, src) {
+ if (this._tooltip) {
+ if (this._tooltip.date.valueOf() == date.valueOf()) return;
+ this._tooltip.innerHTML = "";
+ } else {
+ var t = this._tooltip = document.createElement("DIV");
+ t.className = "dhx_year_tooltip";
+ document.body.appendChild(t);
+ t.onclick = scheduler._click.dhx_cal_data;
+ }
+ var evs = this.getEvents(date, this.date.add(date, 1, "day"));
+ var html = "";
+
+ for (var i = 0; i < evs.length; i++) {
+ var ev = evs[i];
+ if(!this.filter_event(ev.id, ev))
+ continue;
+
+ var bg_color = (ev.color ? ("background:" + ev.color + ";") : "");
+ var color = (ev.textColor ? ("color:" + ev.textColor + ";") : "");
+
+ html += "<div class='dhx_tooltip_line' style='" + bg_color + "" + color + "' event_id='" + evs[i].id + "'>";
+ html += "<div class='dhx_tooltip_date' style='" + bg_color + "" + color + "'>" + (evs[i]._timed ? this.templates.event_date(evs[i].start_date) : "") + "</div>";
+ html += "<div class='dhx_event_icon icon_details'>&nbsp;</div>";
+ html += this.templates.year_tooltip(evs[i].start_date, evs[i].end_date, evs[i]) + "</div>";
+ }
+
+ this._tooltip.style.display = "";
+ this._tooltip.style.top = "0px";
+
+
+ if (document.body.offsetWidth - pos.left - this._tooltip.offsetWidth < 0)
+ this._tooltip.style.left = pos.left - this._tooltip.offsetWidth + "px";
+ else
+ this._tooltip.style.left = pos.left + src.offsetWidth + "px";
+
+ this._tooltip.date = date;
+ this._tooltip.innerHTML = html;
+
+ if (document.body.offsetHeight - pos.top - this._tooltip.offsetHeight < 0)
+ this._tooltip.style.top = pos.top - this._tooltip.offsetHeight + src.offsetHeight + "px";
+ else
+ this._tooltip.style.top = pos.top + "px";
+ };
+
+ scheduler._year_view_tooltip_handler = function(e){
+ if (!is_year_mode()) return;
+
+ var e = e || event;
+ var src = e.target || e.srcElement;
+ if (src.tagName.toLowerCase() == 'a') // fix for active links extension (it adds links to the date in the cell)
+ src = src.parentNode;
+ if ((src.className || "").indexOf("dhx_year_event") != -1)
+ scheduler._showToolTip(from_attr(src.getAttribute("date")), getOffset(src), e, src);
+ else
+ scheduler._hideToolTip();
+ };
+ scheduler._init_year_tooltip = function() {
+ scheduler._detachDomEvent(scheduler._els["dhx_cal_data"][0], "mouseover", scheduler._year_view_tooltip_handler);
+ dhtmlxEvent(scheduler._els["dhx_cal_data"][0], "mouseover", scheduler._year_view_tooltip_handler);
+ };
+
+ scheduler.attachEvent("onSchedulerResize", function() {
+ if (is_year_mode()) {
+ this.year_view(true);
+ return false;
+ }
+ return true;
+ });
+ scheduler._get_year_cell = function(d) {
+ //there can be more than 1 year in view
+ //year can start not from January
+ var m = d.getMonth() + 12 * (d.getFullYear() - this._min_date.getFullYear()) - this.week_starts._month;
+ var t = this._els["dhx_cal_data"][0].childNodes[m];
+ var d = this.week_starts[m] + d.getDate() - 1;
+
+
+ return t.childNodes[2].firstChild.rows[Math.floor(d / 7)].cells[d % 7].firstChild;
+ };
+
+ scheduler._year_marked_cells = {};
+ scheduler._mark_year_date = function(d, ev) {
+ var date = to_attr(d);
+ var c = this._get_year_cell(d);
+ var ev_class = this.templates.event_class(ev.start_date, ev.end_date, ev);
+ if (!scheduler._year_marked_cells[date]) {
+ c.className = "dhx_month_head dhx_year_event";
+ c.setAttribute("date", date);
+ scheduler._year_marked_cells[date] = c;
+ }
+ c.className += (ev_class) ? (" "+ev_class) : "";
+ };
+ scheduler._unmark_year_date = function(d) {
+ this._get_year_cell(d).className = "dhx_month_head";
+ };
+ scheduler._year_render_event = function(ev) {
+ var d = ev.start_date;
+ if (d.valueOf() < this._min_date.valueOf())
+ d = this._min_date;
+ else d = this.date.date_part(new Date(d));
+
+ while (d < ev.end_date) {
+ this._mark_year_date(d, ev);
+ d = this.date.add(d, 1, "day");
+ if (d.valueOf() >= this._max_date.valueOf())
+ return;
+ }
+ };
+
+ scheduler.year_view = function(mode) {
+ var temp;
+ if (mode) {
+ temp = scheduler.xy.scale_height;
+ scheduler.xy.scale_height = -1;
+ }
+
+ scheduler._els["dhx_cal_header"][0].style.display = mode ? "none" : "";
+ scheduler.set_sizes();
+
+ if (mode)
+ scheduler.xy.scale_height = temp;
+
+
+ scheduler._table_view = mode;
+ if (this._load_mode && this._load()) return;
+
+ if (mode) {
+ scheduler._init_year_tooltip();
+ scheduler._reset_year_scale();
+ if (scheduler._load_mode && scheduler._load()){
+ scheduler._render_wait = true;
+ return;
+ }
+ scheduler.render_view_data();
+ } else {
+ scheduler._hideToolTip();
+ }
+ };
+ scheduler._reset_year_scale = function() {
+ this._cols = [];
+ this._colsS = {};
+ var week_starts = []; //start day of first week in each month
+ var b = this._els["dhx_cal_data"][0];
+
+ var c = this.config;
+ b.scrollTop = 0; //fix flickering in FF
+ b.innerHTML = "";
+
+ var dx = Math.floor(parseInt(b.style.width) / c.year_x);
+ var dy = Math.floor((parseInt(b.style.height) - scheduler.xy.year_top) / c.year_y);
+ if (dy < 190) {
+ dy = 190;
+ dx = Math.floor((parseInt(b.style.width) - scheduler.xy.scroll_width) / c.year_x);
+ }
+
+ var summ = dx - 11;
+ var left = 0;
+ var week_template = document.createElement("div");
+ var dummy_date = this.date.week_start(scheduler._currentDate());
+ for (var i = 0; i < 7; i++) {
+ this._cols[i] = Math.floor(summ / (7 - i));
+ this._render_x_header(i, left, dummy_date, week_template);
+ dummy_date = this.date.add(dummy_date, 1, "day");
+ summ -= this._cols[i];
+ left += this._cols[i];
+ }
+ week_template.lastChild.className += " dhx_scale_bar_last";
+
+ var sd = this.date[this._mode + "_start"](this.date.copy(this._date));
+ var ssd = sd;
+ var d = null;
+ for (var i = 0; i < c.year_y; i++)
+ for (var j = 0; j < c.year_x; j++) {
+ d = document.createElement("DIV");
+ d.style.cssText = "position:absolute;";
+ d.setAttribute("date", this.templates.xml_format(sd));
+ d.innerHTML = "<div class='dhx_year_month'></div><div class='dhx_year_week'>" + week_template.innerHTML + "</div><div class='dhx_year_body'></div>";
+ d.childNodes[0].innerHTML = this.templates.year_month(sd);
+
+ var dd = this.date.week_start(sd);
+ var ed = this._reset_month_scale(d.childNodes[2], sd, dd);
+
+ var r = d.childNodes[2].firstChild.rows;
+ for (var k=r.length; k<6; k++) {
+ r[0].parentNode.appendChild(r[0].cloneNode(true));
+ for (var ri= 0, len = r[k].childNodes.length; ri < len; ri++) {
+ r[k].childNodes[ri].className = "dhx_after";
+ r[k].childNodes[ri].firstChild.innerHTML = scheduler.templates.month_day(ed);
+ ed = scheduler.date.add(ed,1,"day");
+ }
+ }
+ b.appendChild(d);
+
+ d.childNodes[1].style.height = d.childNodes[1].childNodes[0].offsetHeight + "px"; // dhx_year_week should have height property so that day dates would get correct position. dhx_year_week height = height of it's child (with the day name)
+ var dt = Math.round((dy - 190) / 2);
+ d.style.marginTop = dt + "px";
+ this.set_xy(d, dx - 10, dy - dt - 10, dx * j + 5, dy * i + 5 + scheduler.xy.year_top);
+
+ week_starts[i * c.year_x + j] = (sd.getDay() - (this.config.start_on_monday ? 1 : 0) + 7) % 7;
+ sd = this.date.add(sd, 1, "month");
+
+ }
+ this._els["dhx_cal_date"][0].innerHTML = this.templates[this._mode + "_date"](ssd, sd, this._mode);
+ this.week_starts = week_starts;
+ week_starts._month = ssd.getMonth();
+ this._min_date = ssd;
+ this._max_date = sd;
+ };
+
+ var getActionData = scheduler.getActionData;
+ scheduler.getActionData = function(n_ev) {
+ if(!is_year_mode())
+ return getActionData.apply(scheduler, arguments);
+
+ var trg = n_ev?n_ev.target:event.srcElement;
+ var date = scheduler._get_year_month_date(trg);
+
+ var day = scheduler._get_year_month_cell(trg);
+ var pos = scheduler._get_year_day_indexes(day);
+
+ if(pos && date){
+ date = scheduler.date.add(date, pos.week, "week");
+ date = scheduler.date.add(date, pos.day, "day");
+ }else{
+ date = null;
+ }
+
+ return {
+ date:date,
+ section:null
+ };
+
+ };
+ scheduler._get_year_day_indexes = function(targetCell){
+ var month = scheduler._locate_year_month_table(targetCell);
+ if(!month)
+ return null;
+
+ var week = 0, day = 0;
+ for(var week = 0, weeks = month.rows.length; week < weeks;week ++){
+ var w = month.rows[week].getElementsByTagName("td");
+ for(var day = 0, days = w.length; day < days; day++){
+ if(w[day] == targetCell)
+ break;
+ }
+ if(day < days)
+ break;
+ }
+
+ if(week < weeks)
+ return {day:day, week:week};
+ else
+ return null;
+ };
+ scheduler._get_year_month_date = function (node){
+ var node = scheduler._locate_year_month_root(node);
+ if(!node)
+ return null;
+
+ var date = node.getAttribute("date");
+ if(!date)
+ return null;
+
+ return scheduler.date.week_start(scheduler.templates.xml_date(date));
+ };
+ scheduler._locate_year_month_day = function(n){
+ return n.className && n.className.indexOf("dhx_year_event") != -1 && n.hasAttribute && n.hasAttribute("date");
+ };
+
+ var locateEvent = scheduler._locate_event;
+ scheduler._locate_event = function(node) {
+ var id = locateEvent.apply(scheduler, arguments);
+ if(!id){
+ var day = scheduler._get_year_el_node(node, scheduler._locate_year_month_day);
+
+ if(!day || !day.hasAttribute("date")) return null;
+
+ var dat = scheduler.templates.xml_date(day.getAttribute("date"));
+ var evs = scheduler.getEvents(dat, scheduler.date.add(dat, 1, "day"));
+ if(!evs.length) return null;
+
+ //can be multiple events in the cell, return any single one
+ id = evs[0].id;
+ }
+ return id;
+ };
+ scheduler._locate_year_month_cell = function(n){
+ return n.nodeName.toLowerCase() == "td";
+ };
+ scheduler._locate_year_month_table = function(n){
+ return n.nodeName.toLowerCase() == "table";
+ };
+ scheduler._locate_year_month_root = function(n){
+ return n.hasAttribute && n.hasAttribute("date");
+ };
+
+ scheduler._get_year_month_cell = function(node){
+ return this._get_year_el_node(node, this._locate_year_month_cell);
+ };
+
+ scheduler._get_year_month_table = function(node){
+ return this._get_year_el_node (node, this._locate_year_month_table);
+ };
+ scheduler._get_year_month_root = function(node){
+ return this._get_year_el_node(this._get_year_month_table(node), this._locate_year_month_root);
+ };
+ scheduler._get_year_el_node = function(node, condition){
+ while(node && !condition(node)){
+ node = node.parentNode;
+ }
+ return node;
+ };
+
+
+})();
diff --git a/codebase/sources/ext/dhtmlxscheduler_year_view.js.map b/codebase/sources/ext/dhtmlxscheduler_year_view.js.map
new file mode 100644
index 0000000..303c604
--- /dev/null
+++ b/codebase/sources/ext/dhtmlxscheduler_year_view.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dhtmlxscheduler_year_view.js.map","sources":["dhtmlxscheduler_year_view.js"],"names":["scheduler","config","year_x","year_y","xy","year_top","templates","year_date","date","date_to_str","locale","labels","year_tab","year_month","year_scale_date","year_tooltip","s","e","ev","text","is_year_mode","_mode","dblclick_dhx_month_head","t","target","srcElement","parentNode","className","indexOf","start","this","xml_date","getAttribute","setDate","parseInt","innerHTML","end","add","readonly","dblclick_create","addEventNow","valueOf","chid","changeEventId","apply","arguments","year_view","old","render_data","to_attr","from_attr","str_to_date","evs","i","length","_year_render_event","clear","clear_view","dates","_year_marked_cells","div","hasOwnProperty","setAttribute","_hideToolTip","_tooltip","style","display","Date","_showToolTip","pos","src","document","createElement","body","appendChild","onclick","_click","dhx_cal_data","getEvents","html","filter_event","id","bg_color","color","textColor","_timed","event_date","start_date","end_date","top","left","offsetWidth","offsetHeight","_year_view_tooltip_handler","event","tagName","toLowerCase","getOffset","_init_year_tooltip","_detachDomEvent","_els","dhtmlxEvent","attachEvent","_get_year_cell","d","m","getMonth","getFullYear","_min_date","week_starts","_month","childNodes","getDate","firstChild","rows","Math","floor","cells","_mark_year_date","c","ev_class","event_class","_unmark_year_date","date_part","_max_date","mode","temp","scale_height","set_sizes","_table_view","_load_mode","_load","_reset_year_scale","_render_wait","render_view_data","_cols","_colsS","b","scrollTop","dx","width","dy","height","scroll_width","summ","week_template","dummy_date","week_start","_currentDate","_render_x_header","lastChild","sd","copy","_date","ssd","j","cssText","xml_format","dd","ed","_reset_month_scale","r","k","cloneNode","ri","len","month_day","dt","round","marginTop","set_xy","getDay","start_on_monday","getActionData","n_ev","trg","_get_year_month_date","day","_get_year_month_cell","_get_year_day_indexes","week","section","targetCell","month","_locate_year_month_table","weeks","w","getElementsByTagName","days","node","_locate_year_month_root","_locate_year_month_day","n","hasAttribute","locateEvent","_locate_event","_get_year_el_node","dat","_locate_year_month_cell","nodeName","_get_year_month_table","_get_year_month_root","condition"],"mappings":"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"} \ No newline at end of file