diff options
Diffstat (limited to 'sources/ext/dhtmlxscheduler_collision.js')
-rw-r--r-- | sources/ext/dhtmlxscheduler_collision.js | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/sources/ext/dhtmlxscheduler_collision.js b/sources/ext/dhtmlxscheduler_collision.js new file mode 100644 index 0000000..13bd178 --- /dev/null +++ b/sources/ext/dhtmlxscheduler_collision.js @@ -0,0 +1,131 @@ +/* +This software is allowed to use under GPL or you need to obtain Commercial or Enterise License +to use it in non-GPL project. Please contact sales@dhtmlx.com for details +*/ +(function(){ + +var temp_section; +var before; + +scheduler.config.collision_limit = 1; + +function _setTempSection(event_id) { // for custom views (matrix, timeline, units) + var pr = scheduler._props?scheduler._props[scheduler._mode]:null; + var matrix = scheduler.matrix?scheduler.matrix[scheduler._mode]:null; + var checked_mode = pr||matrix; // units or matrix mode + if(pr) + var map_to = checked_mode.map_to; + if(matrix) + var map_to = checked_mode.y_property; + if ((checked_mode) && event_id){ + temp_section = scheduler.getEvent(event_id)[map_to]; + } +} + +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) 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.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 pr = scheduler._props?scheduler._props[scheduler._mode]:null; + var matrix = scheduler.matrix?scheduler.matrix[scheduler._mode]:null; + + var checked_mode = pr||matrix; + if(pr) + var map_to = checked_mode.map_to; + if(matrix) + var map_to = checked_mode.y_property; + + var single = true; + if (checked_mode) { // custom view + var count = 0; + + for (var i = 0; i < evs.length; i++) + + if (evs[i][map_to] == ev[map_to] && evs[i].id != ev.id) + 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; + +} + +})(); |