/*
@license
dhtmlxScheduler v.4.4.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;
scheduler.config.min_grid_size = 25;
scheduler.config.min_map_size = 400;
var old_pre_render_event = scheduler._pre_render_events;
//need for temporary disabling without modifying public config
var active = true;
var total_height = 0;
var multiday_height = 0;
scheduler._pre_render_events = function(evs, hold) {
if (!(scheduler.config.container_autoresize && active)) {
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); // +1 so multiday events would have 2px from top and 2px from bottom by default
if(multiday_height != dh + 1) {
this._obj.style.height = (total_height - multiday_height + dh - 1) + "px";
}
dh += "px";
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) {
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 - 1 : 0;
multiday_height = height;
break;
case "dhx_cal_data":
var mode = scheduler.getState().mode;
if(checked_div.childNodes[1] && mode != "month") {
height = checked_div.childNodes[1].offsetHeight;
}
else {
height = Math.max(checked_div.offsetHeight - 1, checked_div.scrollHeight);
}
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";
}
}
else if (mode == "year"){
height = 190 * scheduler.config.year_y;
}
else if(mode == "agenda"){
height = 0;
if(checked_div.childNodes && checked_div.childNodes.length){
for(var j = 0; j < checked_div.childNodes.length; j++){
height += checked_div.childNodes[j].offsetHeight;
}
}
if(height + 2 < scheduler.config.min_grid_size){
height = scheduler.config.min_grid_size;
}
else{
height += 2;
}
}
else if (mode == "week_agenda"){
var min_height = scheduler.xy.week_agenda_scale_height + scheduler.config.min_grid_size,
cur_height;
var column;
for(var k = 0; k < checked_div.childNodes.length; k++){
column = checked_div.childNodes[k];
for(var j = 0; j < column.childNodes.length; j++) {
var innerHeight = 0,
eventsContainer = column.childNodes[j].childNodes[1];
for(var g =0; g < eventsContainer.childNodes.length; g++){
innerHeight += eventsContainer.childNodes[g].offsetHeight;
}
cur_height = innerHeight + scheduler.xy.week_agenda_scale_height;
cur_height = (k == 1 && (j == 2 || j == 3)) ? cur_height * 2 : cur_height; // for last two cells;
if (cur_height > min_height) {
min_height = cur_height;
}
}
}
height = min_height * 3;
}
else if(mode == "map") {
height = 0;
var evs = checked_div.querySelectorAll(".dhx_map_line");
for (var j = 0; j < evs.length; j++) {
height += evs[j].offsetHeight;
}
if (height + 2 < scheduler.config.min_map_size) {
height = scheduler.config.min_map_size;
}
else {
height += 2;
}
}
else if(scheduler._gridView) {
height = 0;
if (checked_div.childNodes[1].childNodes[0].childNodes && checked_div.childNodes[1].childNodes[0].childNodes.length) {
var evs = checked_div.childNodes[1].childNodes[0].childNodes[0].childNodes;
for (var j = 0; j < evs.length; j++) {
height += evs[j].offsetHeight;
}
height += 2;
if(height < scheduler.config.min_grid_size){
height = scheduler.config.min_grid_size;
}
}
else{
height = scheduler.config.min_grid_size;
}
}
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" || (scheduler._props && scheduler._props[mode])) {
height += 2;
}
break;
}
total_height += height;
}
scheduler._obj.style.height = (total_height) + "px";
if (!is_repaint)
scheduler.updateView();
};
var conditionalUpdateContainerHeight = function() {
if(!(scheduler.config.container_autoresize && active))
return true;
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);
//disable container autoresize when expanded
scheduler.attachEvent("onBeforeExpand", function(){
active = false;
return true;
});
scheduler.attachEvent("onBeforeCollapse", function(){
active = true;
return true;
});
})();