/* Copyright 2005 - 2015 Annpoint, s.r.o. Use of this software is subject to license terms. http://www.daypilot.org/ */ if (typeof DayPilot === 'undefined') { var DayPilot = {}; } if (typeof DayPilot.Global === 'undefined') { DayPilot.Global = {}; } // compatibility with 5.9.2029 and previous if (typeof DayPilotCalendar === 'undefined') { var DayPilotCalendar = DayPilot.CalendarVisible = {}; } (function() { if (typeof DayPilot.Calendar !== 'undefined') { return; } DayPilot.Calendar = function(id, options) { this.v = '1658'; var isConstructor = false; if (this instanceof DayPilot.Calendar && !this.__constructor) { isConstructor = true; this.__constructor = true; } if (!isConstructor) { throw "DayPilot.Calendar() is a constructor and must be called as 'var c = new DayPilot.Calendar(id);'"; } var calendar = this; this.uniqueID = null; this.id = id; this.isCalendar = true; this.api = 2; this.clientName = id; this.clientState = {}; this._cache = {}; this._cache.pixels = {}; this._cache.events = []; this.elements = {}; this.elements.events = []; this.elements.separators = []; this.nav = {}; this.events = {}; this.hideUntilInit = true; // potentially leaking a bit but significantly faster in IE this._fasterDispose = true; this.allDayEventBorderColor = "#000000"; this.allDayEventFontFamily = 'Tahoma'; this.allDayEventFontSize = '8pt'; this.allDayEventFontColor = "#000000"; this.allDayEventHeight = 25; this.allowEventOverlap = true; this.allowMultiSelect = true; this.autoRefreshCommand = 'refresh'; this.autoRefreshEnabled = false; this.autoRefreshInterval = 60; this.autoRefreshMaxCount = 20; this.borderColor = "#000000"; this.businessBeginsHour = 9; this.businessEndsHour = 18; this.cellBackColor = "#FFFFD5"; this.cellBackColorNonBusiness = "#FFF4BC"; this.cellBorderColor = "#999999"; this.cellHeight = 20; this.cellDuration = 30; this.columnMarginRight = 5; this.columnWidth = 200; this.columnWidthSpec = "Auto"; this.cornerBackColor = "#ECE9D8"; this.cornerHtml = ''; this.crosshairColor = 'transparent'; this.crosshairOpacity = 20; this.crosshairType = "Header"; this.cssOnly = true; this.dayBeginsHour = 0; this.dayEndsHour = 24; this.days = 1; this.deleteImageUrl = null; // todo this.durationBarColor = 'blue'; this.durationBarVisible = true; this.durationBarWidth = 5; this.durationBarImageUrl = null; // todo this.eventArrangement = "SideBySide"; this.eventBackColor = '#ffffff'; this.eventBorderColor = "#000000"; this.eventFontFamily = 'Tahoma'; this.eventFontSize = '8pt'; this.eventFontColor = "#000000"; this.eventSelectColor = 'blue'; this.headerFontSize = '10pt'; this.headerFontFamily = 'Tahoma'; this.headerFontColor = "#000000"; this.headerHeight = 20; this.headerLevels = 1; this.height = 300; this.heightSpec = 'BusinessHours'; this.hideFreeCells = false; this.headerDateFormat = null; // uses locale.dateFormat by default this.hourHalfBorderColor = "#F3E4B1"; this.hourBorderColor = "#EAD098"; this.hourFontColor = "#000000"; this.hourFontFamily = "Tahoma"; this.hourFontSize = "16pt"; this.hourNameBackColor = "#ECE9D8"; this.hourNameBorderColor = "#ACA899"; this.hourWidth = 45; this.initScrollPos = null; this.loadingLabelText = "Loading..."; this.loadingLabelVisible = true; this.loadingLabelBackColor = "orange"; this.loadingLabelFontColor = "#ffffff"; this.loadingLabelFontFamily = "Tahoma"; this.loadingLabelFontSize = "10pt"; this.locale = "en-us"; this.messageHideAfter = 5000; this.moveBy = "Full"; this.notifyCommit = 'Immediate'; // or 'Queue' this.numberFormat = "0.00"; this.roundedCorners = false; this.rtl = false; this.scrollLabelsVisible = false; this.selectedColor = "#316AC5"; this.shadow = 'Fill'; this.showToolTip = true; this.showAllDayEvents = false; this.showAllDayEventStartEnd = true; this.showEventStartEnd = false; this.showHeader = true; this.showHours = true; this.showCurrentTime = true; this.startDate = new DayPilot.Date().getDatePart(); this.cssClassPrefix = "calendarview"; this.tapAndHoldTimeout = 500; this.timeFormat = 'Auto'; this.timeHeaderCellDuration = 60; this.useEventBoxes = 'Always'; this.useEventSelectionBars = false; this.viewType = 'Days'; this.visible = true; this.eventClickHandling = 'Enabled'; this.eventDoubleClickHandling = 'Enabled'; this.eventRightClickHandling = 'ContextMenu'; this.eventDeleteHandling = 'Disabled'; this.eventEditHandling = 'Update'; this.eventHoverHandling = 'Bubble'; this.eventResizeHandling = 'Update'; this.eventMoveHandling = 'Update'; this.eventSelectHandling = 'Update'; this.eventTapAndHoldHandling = 'Move'; this.headerClickHandling = 'Enabled'; this.timeRangeTapAndHoldHandling = 'Select'; this.timeRangeSelectedHandling = 'Enabled'; this.timeRangeDoubleClickHandling = "Enabled"; this._separateEventsTable = true; this._initialized = false; this.autoRefreshCount = 0; this.doubleClickTimeout = 300; this.members = {}; this.members.obsolete = [ "Init", "cleanSelection", "cssClassPrefix" ]; this.members.ignore = [ "internal", "nav", "debug", "temp", "elements", "members" ]; this.members.noCssOnly = [ "allDayEventBorderColor", "allDayEventFontColor", "allDayEventFontFamily", "allDayEventFontSize", "borderColor", "cellBackColor", "cellBackColorNonBusiness", "cellBorderColor", "cornerBackColor", "durationBarColor", "eventBackColor", "eventBorderColor", "eventFontColor", "eventFontFamily", "eventFontSize", "eventSelectColor", "headerFontColor", "headerFontFamily", "headerFontSize", "hourBorderColor", "hourFontColor", "hourFontFamily", "hourFontSize", "hourHalfBorderColor", "hourNameBackColor", "hourNameBorderColor", "loadingLabelBackColor", "loadingLabelFontColor", "loadingLabelFontFamily", "loadingLabelFontSize", "selectedColor", "useEventSelectionBars" ]; this._browser = {}; this._browser.ie = (navigator && navigator.userAgent && navigator.userAgent.indexOf("MSIE") !== -1); // IE this._browser.ie9 = (navigator && navigator.userAgent && navigator.userAgent.indexOf("MSIE 9") !== -1); // IE this._browser.ielt9 = (function() { var div = document.createElement("div"); div.innerHTML = ""; var isIeLessThan9 = (div.getElementsByTagName("i").length === 1); return isIeLessThan9; })(); this._browser.ff = (navigator && navigator.userAgent && navigator.userAgent.indexOf("Firefox") !== -1); this._browser.opera105 = (function() { if (/Opera[\/\s](\d+\.\d+)/.test(navigator.userAgent)) { var v = new Number(RegExp.$1); return v >= 10.5; } return false; })(); this._browser.webkit522 = (function() { if (/AppleWebKit[\/\s](\d+\.\d+)/.test(navigator.userAgent)) { var v = new Number(RegExp.$1); return v >= 522; } return false; })(); this.clearSelection = function() { if (!this.selectedCells) { this.selectedCells = []; return; } this._hideSelection(); this.selectedCells = []; }; this._hideSelection = function() { if (!this.selectedCells) { return; } for (var j = 0; j < this.selectedCells.length; j++) { var cell = this.selectedCells[j]; if (cell) { //cell.style.backgroundColor = cell.originalColor; //cell.selected = false; //cell.oncontextmenu = null; if (cell.selected) { cell.removeChild(cell.selected); cell.firstChild.style.display = ''; cell.selected = null; } } } }; this.cleanSelection = this.clearSelection; this._postBack2 = function(action, data, parameters) { var envelope = {}; envelope.action = action; envelope.parameters = parameters; envelope.data = data; envelope.header = this._getCallBackHeader(); var commandstring = "JSON" + DayPilot.JSON.stringify(envelope); __doPostBack(calendar.uniqueID, commandstring); }; this._callBack2 = function(action, parameters, data, type) { if (!this._serverBased()) { calendar.debug.message("Callback invoked without the server-side backend specified. Callback canceled.", "warning"); return; } if (this.callbackTimeout) { window.clearTimeout(this.callbackTimeout); } if (typeof type === 'undefined') { type = "CallBack"; } this.callbackTimeout = window.setTimeout(function() { calendar._loadingStart(); }, 100); var envelope = {}; envelope.action = action; envelope.type = type; envelope.parameters = parameters; envelope.data = data; envelope.header = this._getCallBackHeader(); var commandstring = "JSON" + DayPilot.JSON.stringify(envelope); if (this.backendUrl) { DayPilot.request(this.backendUrl, this._callBackResponse, commandstring, this._ajaxError); } else if (typeof WebForm_DoCallback === 'function') { WebForm_DoCallback(this.uniqueID, commandstring, this._updateView, this.clientName, this.onCallbackError, true); } }; this._serverBased = function() { if (this.backendUrl) { // ASP.NET MVC, Java return true; } if (typeof WebForm_DoCallback === 'function' && this.uniqueID) { // ASP.NET WebForms return true; } return false; }; this._ajaxError = function(req) { if (typeof calendar.onAjaxError === 'function') { var args = {}; args.request = req; calendar.onAjaxError(args); } else if (typeof calendar.ajaxError === 'function') { // backwards compatibility calendar.ajaxError(req); } }; this.dispose = function() { //var start = new Date(); var c = calendar; if (!c.nav.top) { return; } c._pauseAutoRefresh(); c._deleteEvents(); if (c.nav.messageClose) { c.nav.messageClose.onclick = null; } if (c.nav.hourTable) c.nav.hourTable.oncontextmenu = null; if (c.nav.hourTable) c.nav.hourTable.onmousemove = null; if (c.nav.header) c.nav.header.oncontextmenu = null; if (c.nav.corner) c.nav.corner.oncontextmenu = null; c.nav.zoom.onmousemove = null; c.nav.scroll.onscroll = null; c.nav.scroll.root = null; DayPilot.pu(c.nav.loading); c._disposeMain(); c._disposeHeader(); c.nav.select = null; c.nav.cornerRight = null; c.nav.scrollable = null; c.nav.bottomLeft = null; c.nav.bottomRight = null; c.nav.allday = null; c.nav.zoom = null; c.nav.loading = null; c.nav.events = null; c.nav.header = null; c.nav.hourTable = null; c.nav.scrolltop = null; c.nav.scroll = null; c.nav.vsph = null; c.nav.main = null; c.nav.message = null; c.nav.messageClose = null; c.nav.top.removeAttribute("style"); c.nav.top.removeAttribute("class"); c.nav.top.innerHTML = ''; c.nav.top.dp = null; c.nav.top = null; DayPilot.ue(window, 'resize', c._onResize); DayPilotCalendar.unregister(c); //var end = new Date(); }; // not sure about this one this._registerDispose = function() { this.nav.top.dispose = this.dispose; /* var root = document.getElementById(id); root.dispose = this.dispose;*/ }; this._callBackResponse = function(response) { calendar._updateView(response.responseText); }; this._getCallBackHeader = function() { var h = {}; h.v = this.v; h.control = "dpc"; h.id = this.id; h.clientState = calendar.clientState; h.columns = this._getTreeState(); h.days = calendar.days; h.startDate = calendar.startDate; h.cellDuration = calendar.cellDuration; h.cssOnly = calendar.cssOnly; h.cssClassPrefix = calendar.cssClassPrefix; h.heightSpec = calendar.heightSpec; h.businessBeginsHour = calendar.businessBeginsHour; h.businessEndsHour = calendar.businessEndsHour; h.viewType = calendar.viewType; h.dayBeginsHour = calendar.dayBeginsHour; h.dayEndsHour = calendar.dayEndsHour; h.headerLevels = calendar.headerLevels; h.backColor = calendar.cellBackColor; h.nonBusinessBackColor = calendar.cellBackColorNonBusiness; h.eventHeaderVisible = calendar.eventHeaderVisible; h.timeFormat = calendar.timeFormat; h.timeHeaderCellDuration = calendar.timeHeaderCellDuration; h.locale = calendar.locale; h.scrollY = calendar.scrollPos; h.showAllDayEvents = calendar.showAllDayEvents; h.tagFields = calendar.tagFields; h.weekStarts = calendar.weekStarts; // required for custom hour header rendering h.hourNameBackColor = calendar.hourNameBackColor; h.hourFontFamily = calendar.hourFontFamily; h.hourFontSize = calendar.hourFontSize; h.hourFontColor = calendar.hourFontColor; h.selected = calendar.multiselect.events(); // special h.hashes = calendar.hashes; return h; }; this._out = function() { this._crosshairHide(); // clear active areas DayPilot.Areas.hideAll(); //this.stopScroll(); }; this._getTreeState = function() { var tree = []; tree.ignoreToJSON = true; // preventing Gaia and prototype to mess up with Array serialization if (!this.columns) { return tree; } for (var i = 0; i < this.columns.length; i++) { var column = this.columns[i]; var node = this._getNodeState(column); tree.push(node); } return tree; }; this._getNodeState = function(column) { //var row = this.rows[i]; var node = {}; node.Value = column.id; node.Name = column.name; node.ToolTip = column.toolTip; node.Date = column.start; node.Children = this._getNodeChildren(column.children); return node; }; this._getNodeChildren = function(array) { var children = []; children.ignoreToJSON = true; // preventing Gaia to mess up with Array serialization if (!array) { return children; } for (var i = 0; i < array.length; i++) { children.push(this._getNodeState(array[i])); } return children; }; /* // adds a listener this.listener = function(object) { if (!this.listeners) { this.listeners = []; } this.listeners.push(object); }; this.callListeners = function(action, data) { if (!this.listeners) { return; } for (var i = 0; i < this.listeners.length; i++) { this.listeners[i](); } }; */ this._updateView = function(result, context) { //var start = new Date(); var result = DayPilot.Util.parseJSON(result); if (result.BubbleGuid) { var guid = result.BubbleGuid; var bubble = this.bubbles[guid]; delete this.bubbles[guid]; calendar._loadingStop(); if (typeof result.Result.BubbleHTML !== 'undefined') { bubble.updateView(result.Result.BubbleHTML, bubble); } return; } if (result.CallBackRedirect) { document.location.href = result.CallBackRedirect; return; } if (typeof result.ClientState !== 'undefined') { calendar.clientState = result.ClientState; } if (result.UpdateType === "None") { calendar._loadingStop(); calendar._fireAfterRenderDetached(result.CallBackData, true); //calendar.afterRender(result.CallBackData, true); if (result.Message) { calendar.message(result.Message); } return; } // viewstate update if (result.VsUpdate) { var vsph = document.createElement("input"); vsph.type = 'hidden'; vsph.name = calendar.id + "_vsupdate"; vsph.id = vsph.name; vsph.value = result.VsUpdate; calendar.nav.vsph.innerHTML = ''; calendar.nav.vsph.appendChild(vsph); } calendar._deleteEvents(); calendar.multiselect.clear(true); calendar.multiselect._initList = result.SelectedEvents; if (typeof result.TagFields !== 'undefined') { calendar.tagFields = result.TagFields; } if (typeof result.SortDirections !== 'undefined') { calendar.sortDirections = result.SortDirections; } if (result.UpdateType === "Full") { // generated calendar.colors = result.Colors; calendar.palette = result.Palette; calendar.dirtyColors = result.DirtyColors; calendar.cellProperties = result.CellProperties; calendar.cellConfig = result.CellConfig; calendar.columns = result.Columns; // state // selectedeventvalue // properties calendar.days = result.Days; // calendar.startDate = new DayPilot.Date(result.StartDate).getDatePart(); // calendar.cellDuration = result.CellDuration; // calendar.heightSpec = result.HeightSpec ? result.HeightSpec : calendar.heightSpec; calendar.businessBeginsHour = result.BusinessBeginsHour ? result.BusinessBeginsHour : calendar.businessBeginsHour; calendar.businessEndsHour = result.BusinessEndsHour ? result.BusinessEndsHour : calendar.businessEndsHour; calendar.viewType = result.ViewType; // calendar.headerLevels = result.HeaderLevels; // calendar.backColor = result.BackColor ? result.BackColor : calendar.backColor; calendar.nonBusinessBackColor = result.NonBusinessBackColor ? result.NonBusinessBackColor : calendar.nonBusinessBackColor; calendar.eventHeaderVisible = result.EventHeaderVisible ? result.EventHeaderVisible : calendar.eventHeaderVisible; calendar.timeFormat = result.TimeFormat ? result.TimeFormat : calendar.timeFormat; calendar.timeHeaderCellDuration = typeof result.TimeHeaderCellDuration !== 'undefined' ? result.TimeHeaderCellDuration : calendar.timeHeaderCellDuration; calendar.locale = result.Locale ? result.Locale : calendar.locale; calendar.dayBeginsHour = typeof result.DayBeginsHour !== 'undefined' ? result.DayBeginsHour : calendar.dayBeginsHour; calendar.dayEndsHour = typeof result.DayEndsHour !== 'undefined' ? result.DayEndsHour : calendar.dayEndsHour; // corner calendar.cornerBackColor = result.CornerBackColor; calendar.cornerHtml = result.CornerHTML; // hours calendar.hours = result.Hours; calendar._prepareColumns(); calendar._expandCellProperties(); } // hashes if (result.Hashes) { for (var key in result.Hashes) { calendar.hashes[key] = result.Hashes[key]; } //calendar.hashes = result.Hashes; } calendar._loadEvents(result.Events); calendar._updateHeaderHeight(); if (result.UpdateType === "Full" || calendar.hideFreeCells) { calendar._drawHeader(); calendar._autoHeaderHeight(); calendar._deleteScrollLabels(); calendar._updateMessagePosition(); calendar._drawMain(); calendar._drawHourTable(); calendar._updateHeight(); calendar._fixScrollHeader(); calendar.clearSelection(); if (typeof result.ScrollY !== "undefined") { calendar.scrollToY(result.ScrollY); } else { calendar.scrollToY(calendar.initScrollPos); } } calendar._showCurrentTime(); calendar._show(); // if not visible calendar._drawEvents(); calendar._drawEventsAllDay(); if (calendar.heightSpec === "Parent100Pct") { calendar._onResize(); } if (calendar.timeRangeSelectedHandling !== "HoldForever") { calendar.clearSelection(); } calendar._updateScrollLabels(); if (calendar.todo) { if (calendar.todo.del) { var del = calendar.todo.del; del.parentNode.removeChild(del); calendar.todo.del = null; } } calendar._fireAfterRenderDetached(result.CallBackData, true); calendar._loadingStop(); calendar._startAutoRefresh(); if (result.Message) { calendar.message(result.Message); } }; this._fireAfterRenderDetached = function(data, isCallBack) { var afterRenderDelayed = function(data, isc) { return function() { if (calendar._api2()) { if (typeof calendar.onAfterRender === 'function') { var args = {}; args.isCallBack = isc; args.data = data; calendar.onAfterRender(args); } } else { if (calendar.afterRender) { calendar.afterRender(data, isc); } } }; }; window.setTimeout(afterRenderDelayed(data, isCallBack), 0); }; this._createShadow = function(object, copyText, type) { var main = calendar.nav.events; var colWidth = main.clientWidth / main.rows[0].cells.length; //var i = Math.floor((calendar.coords.x - 45) / colWidth); var i = Math.floor(calendar.coords.x / colWidth); if (i < 0) { i = 0; } if (calendar.rtl) { i = calendar._columnsBottom.length - i - 1; } var column = main.rows[0].cells[i]; var _startOffset = 0; var height = 0; var top = 0; if (typeof object.duration !== 'undefined') { // external drag&drop var duration = object.duration; top = Math.floor(((calendar.coords.y - _startOffset) + calendar.cellHeight / 2) / calendar.cellHeight) * calendar.cellHeight + _startOffset; height = duration * calendar.cellHeight / (60 * calendar.cellDuration); height = Math.max(height, calendar.cellHeight); } else { var e = object.event; //var data = object.data; height = e.part.height; top = e.part.top; } var shadow = document.createElement('div'); shadow.setAttribute('unselectable', 'on'); shadow.style.position = 'absolute'; shadow.style.width = '100%'; shadow.style.height = height + 'px'; shadow.style.left = '0px'; shadow.style.top = top + 'px'; shadow.style.zIndex = 101; shadow.exclude = true; // trying to fix the IE flickering issue //shadow.oncontextmenu = function(ev) { ev.preventDefault(); return false; }; var inner = document.createElement("div"); shadow.appendChild(inner); if (this.cssOnly) { shadow.className = calendar._prefixCssClass("_shadow"); inner.className = this._prefixCssClass("_shadow_inner"); } if (!this.cssOnly) { inner.style.position = "absolute"; inner.style.top = "0px"; inner.style.bottom = "0px"; inner.style.left = "0px"; inner.style.right = "0px"; if (type === 'Fill') { // transparent inner.style.backgroundColor = "#aaaaaa"; inner.style.opacity = 0.5; inner.style.filter = "alpha(opacity=50)"; inner.style.border = '2px solid #aaaaaa'; } else { inner.style.border = '2px dotted #666666'; } if (this.roundedCorners) { inner.style.MozBorderRadius = "5px"; inner.style.webkitBorderRadius = "5px"; inner.style.borderRadius = "5px"; } } column.events.appendChild(shadow); return shadow; }; this._durationHours = function() { return this._duration() / (3600 * 1000); }; this._businessHoursSpan = function() { if (this.businessBeginsHour > this.businessEndsHour) { return 24 - this.businessBeginsHour + this.businessEndsHour; } else { return this.businessEndsHour - this.businessBeginsHour; } }; this._dayHoursSpan = function() { if (this.dayBeginsHour >= this.dayEndsHour) { return 24 - this.dayBeginsHour + this.dayEndsHour; } else { return this.dayEndsHour - this.dayBeginsHour; } }; // in ticks this._duration = function(max) { var dHours = 0; if (this.heightSpec === 'BusinessHoursNoScroll') { dHours = this._businessHoursSpan(); } else if (this.hideFreeCells && !max) { var addMinutes = (this._maxEnd - 1) * this.cellDuration / this.cellHeight; var addHours = Math.ceil(addMinutes / 60); var businessEnds = this.businessBeginsHour > this.businessEndsHour ? this.businessEndsHour + 24 : this.businessEndsHour; dHours = Math.max(this.dayBeginsHour + addHours, businessEnds) - this._visibleStart(); //dHours = Math.max(this.dayBeginsHour + addHours, this.businessEndsHour) - this._visibleStart(); } else { dHours = this._dayHoursSpan(); } return dHours * 60 * 60 * 1000; // return ticks }; this.message = function(html, delay, foreColor, backColor) { if (!html) { return; } var delay = delay || this.messageHideAfter || 2000; var foreColor = foreColor || "#ffffff"; var backColor = backColor || "#000000"; var opacity = 0.8; var div; var top = this._totalHeaderHeight(); var left = this.showHours ? this.hourWidth : 0; var right = DayPilot.sw(calendar._scrollElement()); if (!this.cssOnly) { top += 1; left += 2; right -= 2; } if (calendar.rtl) { var temp = left; left = right; right = temp; } if (!this.nav.message) { div = document.createElement("div"); div.style.position = "absolute"; //div.style.width = "100%"; div.style.left = (left) + "px"; div.style.top = (top) + "px"; div.style.right = "0px"; div.style.display = 'none'; //div.style.paddingLeft = (left) + "px"; div.onmousemove = function() { if (div.messageTimeout && !div.status) { clearTimeout(div.messageTimeout); } }; div.onmouseout = function() { if (calendar.nav.message.style.display !== 'none') { div.messageTimeout = setTimeout(calendar._hideMessage, 500); } }; var inner = document.createElement("div"); inner.onclick = function() { calendar.nav.message.style.display = 'none'; }; if (!this.cssOnly) { inner.style.padding = "5px"; inner.style.opacity = opacity; inner.style.filter = "alpha(opacity=" + (opacity * 100) + ")"; } else { inner.className = this._prefixCssClass("_message"); } div.appendChild(inner); var close = document.createElement("div"); close.style.position = "absolute"; if (!this.cssOnly) { close.style.top = "5px"; close.style.right = (DayPilot.sw(calendar._scrollElement()) + 5) + "px"; close.style.color = foreColor; close.style.lineHeight = "100%"; close.style.cursor = "pointer"; close.style.fontWeight = "bold"; close.innerHTML = "X"; } else { close.className = this._prefixCssClass("_message_close"); } close.onclick = function() { calendar.nav.message.style.display = 'none'; }; div.appendChild(close); //this.nav.top.appendChild(div); this.nav.top.insertBefore(div, this.nav.loading); this.nav.message = div; this.nav.messageClose = close; } else { div = calendar.nav.message; this.nav.message.style.top = top + "px"; } if (this.nav.cornerRight) { this.nav.message.style.right = right + "px"; } else { this.nav.message.style.right = "0px"; } var showNow = function() { //calendar.nav.message.style.opacity = opacity; if (!calendar.nav.message) { // UpdatePanel refresh return; } var inner = calendar.nav.message.firstChild; if (!calendar.cssOnly) { inner.style.padding = "5px"; inner.style.opacity = opacity; inner.style.backgroundColor = backColor; inner.style.color = foreColor; } inner.innerHTML = html; var end = function() { div.messageTimeout = setTimeout(calendar._hideMessage, delay); }; DayPilot.fade(calendar.nav.message, 0.2, end); }; clearTimeout(div.messageTimeout); // another message was visible if (this.nav.message.style.display !== 'none') { DayPilot.fade(calendar.nav.message, -0.2, showNow); } else { showNow(); } }; this.message.show = function(html) { calendar.message(html); }; this.message.hide = function() { calendar._hideMessage(); }; this._hideMessage = function() { var end = function() { calendar.nav.message.style.display = 'none'; }; DayPilot.fade(calendar.nav.message, -0.2, end); }; /* this._hideMessageNow = function() { if (this.nav.message) { this.nav.message.style.display = 'none'; } }; */ this._updateMessagePosition = function() { if (this.nav.message) { this.nav.message.style.top = (this._totalHeaderHeight()) + "px"; } }; this._rowCount = function() { return this._duration() / (60 * 1000 * this.cellDuration); }; this.eventClickPostBack = function(e, data) { this._postBack2('EventClick', data, e); }; this.eventClickCallBack = function(e, data) { this._callBack2('EventClick', e, data); }; this._eventClickDispatch = function(e) { var div = this; var e = e || window.event; var ctrlKey = e.ctrlKey; var metaKey = e.metaKey; if (typeof (DayPilot.Bubble) !== 'undefined') { DayPilot.Bubble.hideActive(); } if (calendar.eventDoubleClickHandling === 'Disabled') { calendar._eventClickSingle(div, ctrlKey, metaKey); return; } if (!calendar.timeouts) { calendar.timeouts = []; } else { for (var toid in calendar.timeouts) { window.clearTimeout(calendar.timeouts[toid]); } calendar.timeouts = []; } var eventClickDelayed = function(div, ctrlKey, metaKey) { return function() { calendar._eventClickSingle(div, ctrlKey, metaKey, e); }; }; calendar.timeouts.push(window.setTimeout(eventClickDelayed(this, ctrlKey, metaKey), calendar.doubleClickTimeout)); }; this._eventClickSingle = function(thisDiv, ctrlKey, metaKey, originalEvent) { //var ev = ev || window.event; var e = thisDiv.event; if (!e.client.clickEnabled()) { return; } if (calendar._api2()) { var args = {}; args.div = thisDiv; args.originalEvent = originalEvent; args.e = e; args.ctrl = ctrlKey; args.meta = metaKey; args.preventDefault = function() { this.preventDefault.value = true; }; if (typeof calendar.onEventClick === 'function') { calendar.onEventClick(args); if (args.preventDefault.value) { return; } } switch (calendar.eventClickHandling) { case 'PostBack': calendar.eventClickPostBack(e); break; case 'CallBack': calendar.eventClickCallBack(e); break; case 'Edit': calendar._divEdit(thisDiv); break; case 'Select': calendar._eventSelect(thisDiv, e, ctrlKey, metaKey); break; case 'Bubble': if (calendar.bubble) { calendar.bubble.showEvent(e); } break; case 'ContextMenu': var menu = e.client.contextMenu(); if (menu) { menu.show(e); } else { if (calendar.contextMenu) { calendar.contextMenu.show(e); } } break; } if (typeof calendar.onEventClicked === 'function') { calendar.onEventClicked(args); } } else { switch (calendar.eventClickHandling) { case 'PostBack': calendar.eventClickPostBack(e); break; case 'CallBack': calendar.eventClickCallBack(e); break; case 'JavaScript': calendar.onEventClick(e); break; case 'Edit': calendar._divEdit(thisDiv); break; case 'Select': calendar._eventSelect(thisDiv, e, ctrlKey, metaKey); break; case 'Bubble': if (calendar.bubble) { calendar.bubble.showEvent(e); } break; case 'ContextMenu': var menu = e.client.contextMenu(); if (menu) { menu.show(e); } else { if (calendar.contextMenu) { calendar.contextMenu.show(e); } } break; } } }; this.eventDoubleClickPostBack = function(e, data) { this._postBack2('EventDoubleClick', data, e); }; this.eventDoubleClickCallBack = function(e, data) { this._callBack2('EventDoubleClick', e, data); }; this._eventDoubleClickDispatch = function(ev) { if (typeof (DayPilotBubble) !== 'undefined') { DayPilotBubble.hideActive(); } if (calendar.timeouts) { for (var toid in calendar.timeouts) { window.clearTimeout(calendar.timeouts[toid]); } calendar.timeouts = null; } // choose the action var e = this.event; var ev = ev || window.event; /* if (!e.clickingAllowed()) { return; }*/ if (calendar._api2()) { var args = {}; args.e = e; args.preventDefault = function() { this.preventDefault.value = true; }; if (typeof calendar.onEventDoubleClick === 'function') { calendar.onEventDoubleClick(args); if (args.preventDefault.value) { return; } } switch (calendar.eventDoubleClickHandling) { case 'PostBack': calendar.eventDoubleClickPostBack(e); break; case 'CallBack': calendar.eventDoubleClickCallBack(e); break; case 'Edit': if (!e.allday()) { calendar._divEdit(this); } break; case 'Select': if (!e.allday()) { calendar._eventSelect(this, e, ev.ctrlKey); } break; case 'Bubble': if (calendar.bubble) { calendar.bubble.showEvent(e); } break; } if (typeof calendar.onEventDoubleClicked === 'function') { calendar.onEventDoubleClicked(args); } } else { switch (calendar.eventDoubleClickHandling) { case 'PostBack': calendar.eventDoubleClickPostBack(e); break; case 'CallBack': calendar.eventDoubleClickCallBack(e); break; case 'JavaScript': calendar.onEventDoubleClick(e); break; case 'Edit': if (!e.allday()) { calendar._divEdit(this); } break; case 'Select': if (!e.allday()) { calendar._eventSelect(this, e, ev.ctrlKey); } break; case 'Bubble': if (calendar.bubble) { calendar.bubble.showEvent(e); } break; } } /* switch (calendar.eventDoubleClickHandling) { case 'PostBack': calendar.eventDoubleClickPostBack(e); break; case 'CallBack': calendar.eventDoubleClickCallBack(e); break; case 'JavaScript': calendar.onEventDoubleClick(e); break; case 'Edit': if (!e.allday()) { calendar._divEdit(this); } break; case 'Select': if (!e.allday()) { calendar._eventSelect(this); } break; case 'Bubble': if (calendar.bubble) { calendar.bubble.showEvent(e); } break; } */ }; this.eventRightClickPostBack = function(e, data) { this._postBack2('EventRightClick', data, e); }; this.eventRightClickCallBack = function(e, data) { this._callBack2('EventRightClick', e, data); }; this._eventRightClickDispatch = function(ev) { var e = this.event; if (!e.client.rightClickEnabled()) { return false; } if (calendar._api2()) { var args = {}; args.e = e; args.preventDefault = function() { this.preventDefault.value = true; }; if (typeof calendar.onEventRightClick === 'function') { calendar.onEventRightClick(args); if (args.preventDefault.value) { return; } } switch (calendar.eventRightClickHandling) { case 'PostBack': calendar.eventRightClickPostBack(e); break; case 'CallBack': calendar.eventRightClickCallBack(e); break; case 'ContextMenu': var menu = e.client.contextMenu(); if (menu) { menu.show(e); } else { if (calendar.contextMenu) { calendar.contextMenu.show(this.event); } } break; case 'Bubble': if (calendar.bubble) { calendar.bubble.showEvent(e); } break; } if (typeof calendar.onEventRightClicked === 'function') { calendar.onEventRightClicked(args); } } else { switch (calendar.eventRightClickHandling) { case 'PostBack': calendar.eventRightClickPostBack(e); break; case 'CallBack': calendar.eventRightClickCallBack(e); break; case 'JavaScript': calendar.onEventRightClick(e); break; case 'ContextMenu': var menu = e.client.contextMenu(); if (menu) { menu.show(e); } else { if (calendar.contextMenu) { calendar.contextMenu.show(this.event); } } break; case 'Bubble': if (calendar.bubble) { calendar.bubble.showEvent(e); } break; } } if (ev.preventDefault) { ev.preventDefault(); } return false; }; this.headerClickPostBack = function(c, data) { this._postBack2('HeaderClick', data, c); }; this.headerClickCallBack = function(c, data) { this._callBack2('HeaderClick', c, data); }; this._headerClickDispatch = function(object) { var data = this.data; var c = new DayPilotCalendar.Column(data.id, data.name, data.start); // check if allowed if (calendar._api2()) { var args = {}; args.header = {}; args.header.id = data.id; args.header.name = data.name; args.header.start = data.start; args.preventDefault = function() { this.preventDefault.value = true; }; if (typeof calendar.onHeaderClick === 'function') { calendar.onHeaderClick(args); if (args.preventDefault.value) { return; } } switch (calendar.headerClickHandling) { case 'PostBack': calendar.headerClickPostBack(c); break; case 'CallBack': calendar.headerClickCallBack(c); break; } if (typeof calendar.onHeaderClicked === 'function') { calendar.onHeaderClicked(args); } } else { switch (calendar.headerClickHandling) { case 'PostBack': calendar.headerClickPostBack(c); break; case 'CallBack': calendar.headerClickCallBack(c); break; case 'JavaScript': calendar.onHeaderClick(c); break; } } /* switch (calendar.headerClickHandling) { case 'PostBack': calendar.headerClickPostBack(c); break; case 'CallBack': calendar.headerClickCallBack(c); break; case 'JavaScript': calendar.onHeaderClick(c); break; } */ }; this._headerMouseMove = function() { if (typeof (DayPilotBubble) !== 'undefined' && calendar.columnBubble) { if (calendar.viewType === "Resources") { var res = {}; res.calendar = calendar; res.id = this.data.id; res.toJSON = function() { var json = {}; json.id = this.id; return json; }; calendar.columnBubble.showResource(res); } else { var start = new DayPilot.Date(this.data.start); var end = start.addDays(1); var time = {}; time.calendar = calendar; time.start = start; time.end = end; time.toJSON = function() { var json = {}; json.start = this.start; json.end = this.end; return json; }; calendar.columnBubble.showTime(time); } } var cell = this; var div = cell.firstChild; // rowheader if (!div.active) { //div.data = calendar.rows[td.index]; // TODO replace with custom object var data = cell.data; var c = new DayPilotCalendar.Column(data.id, data.name, data.start); c.areas = cell.data.areas; DayPilot.Areas.showAreas(div, c); } }; this._headerMouseOut = function(ev) { if (typeof (DayPilotBubble) !== 'undefined' && calendar.columnBubble) { calendar.columnBubble.hideOnMouseOut(); } DayPilot.Areas.hideAreas(this.firstChild, ev); }; this.eventDeletePostBack = function(e, data) { this._postBack2('EventDelete', data, e); }; this.eventDeleteCallBack = function(e, data) { this._callBack2('EventDelete', e, data); }; this._eventDeleteDispatch = function(object) { var e; if (object && object.isEvent) { e = object; } else { e = object.parentNode.parentNode.event; } if (calendar._api2()) { var args = {}; args.e = e; args.preventDefault = function() { this.preventDefault.value = true; }; if (typeof calendar.onEventDelete === 'function') { calendar.onEventDelete(args); if (args.preventDefault.value) { return; } } switch (calendar.eventDeleteHandling) { case 'PostBack': calendar.eventDeletePostBack(e); break; case 'CallBack': calendar.eventDeleteCallBack(e); break; case 'Update': calendar.events.remove(e); break; } if (typeof calendar.onEventDeleted === 'function') { calendar.onEventDeleted(args); } } else { switch (calendar.eventDeleteHandling) { case 'PostBack': calendar.eventDeletePostBack(e); break; case 'CallBack': calendar.eventDeleteCallBack(e); break; case 'JavaScript': calendar.onEventDelete(e); break; } } }; this.eventResizePostBack = function(e, newStart, newEnd, data) { if (!newStart) { throw 'newStart is null'; } if (!newEnd) { throw 'newEnd is null'; } var params = {}; params.e = e; params.newStart = newStart; params.newEnd = newEnd; this._postBack2('EventResize', data, params); }; this.eventResizeCallBack = function(e, newStart, newEnd, data) { if (!newStart) throw 'newStart is null'; if (!newEnd) throw 'newEnd is null'; var params = {}; params.e = e; params.newStart = newStart; params.newEnd = newEnd; this._callBack2('EventResize', params, data); }; this._invokeEvent = function(type, action, params, data) { if (type === 'PostBack') { calendar.postBack2(action, params, data); } else if (type === 'CallBack') { calendar._callBack2(action, params, data, "CallBack"); } else if (type === 'Immediate') { calendar._callBack2(action, params, data, "Notify"); } else if (type === 'Queue') { calendar.queue.add(new DayPilot.Action(this, action, params, data)); } else if (type === 'Notify') { if (resolved.notifyType() === 'Notify') { calendar._callBack2(action, params, data, "Notify"); } else { calendar.queue.add(new DayPilot.Action(calendar, action, params, data)); } } else { throw "Invalid event invocation type"; } }; // just hours (int) this._visibleStart = function(max) { if (this.heightSpec === 'BusinessHoursNoScroll') { return this.businessBeginsHour; } else if (this.hideFreeCells && !max) { var addMinutes = (this._minStart) * this.cellDuration / this.cellHeight; var addHours = Math.floor(addMinutes / 60); addHours = Math.max(0, addHours); return Math.min(this.dayBeginsHour + addHours, this.businessBeginsHour); } else { return this.dayBeginsHour; } }; this.visibleStart = function() { return this._columnsBottom[0].start; }; this.visibleEnd = function() { var columns = this._columnsBottom; var max = columns.length - 1; return columns[max].start.addDays(1); }; this._api2 = function() { return calendar.api === 2; }; this._eventResizeDispatch = function(e, shadowHeight, shadowTop, border) { if (this.eventResizeHandling === 'Disabled') { return; } var _startOffset = 0; var newStart = new Date(); var newEnd = new Date(); var start = e.start(); var end = e.end(); var cellSize = calendar.cellDuration; // should be integer //var day = new Date(); var day = calendar._columnsBottom[e.part.dayIndex].start; if (border === 'top') { var day = start.getDatePart(); var step = Math.floor((shadowTop - _startOffset) / calendar.cellHeight); var minutes = step * cellSize; var ts = minutes * 60 * 1000; var visibleStartOffset = calendar._visibleStart() * 60 * 60 * 1000; newStart = day.addTime(ts + visibleStartOffset); newEnd = e.end(); } else if (border === 'bottom') { //var day = end.getDatePart(); var step = Math.floor((shadowTop + shadowHeight - _startOffset) / calendar.cellHeight); var minutes = step * cellSize; var ts = minutes * 60 * 1000; var visibleStartOffset = calendar._visibleStart() * 60 * 60 * 1000; newStart = start; newEnd = day.addTime(ts + visibleStartOffset); } if (calendar._api2()) { // API v2 var args = {}; args.e = e; args.newStart = newStart; args.newEnd = newEnd; args.preventDefault = function() { this.preventDefault.value = true; }; if (typeof calendar.onEventResize === 'function') { calendar.onEventResize(args); if (args.preventDefault.value) { return; } } switch (calendar.eventResizeHandling) { case 'PostBack': calendar.eventResizePostBack(e, newStart, newEnd); break; case 'CallBack': calendar.eventResizeCallBack(e, newStart, newEnd); break; case 'Notify': calendar.eventResizeNotify(e, newStart, newEnd); break; case 'Update': e.start(newStart); e.end(newEnd); calendar.events.update(e); break; } if (typeof calendar.onEventResized === 'function') { calendar.onEventResized(args); } } else { switch (calendar.eventResizeHandling) { case 'PostBack': calendar.eventResizePostBack(e, newStart, newEnd); break; case 'CallBack': calendar.eventResizeCallBack(e, newStart, newEnd); break; case 'JavaScript': calendar.onEventResize(e, newStart, newEnd); break; case 'Notify': calendar.eventResizeNotify(e, newStart, newEnd); break; } } }; this.eventResizeNotify = function(e, newStart, newEnd, data) { var old = new DayPilot.Event(e.copy(), this); e.start(newStart); e.end(newEnd); e.commit(); calendar.update(); this._invokeEventResize("Notify", old, newStart, newEnd, data); }; this._invokeEventResize = function(type, e, newStart, newEnd, data) { var params = {}; params.e = e; params.newStart = newStart; params.newEnd = newEnd; this._invokeEvent(type, "EventResize", params, data); }; this.eventMovePostBack = function(e, newStart, newEnd, newResource, data) { if (!newStart) throw 'newStart is null'; if (!newEnd) throw 'newEnd is null'; var params = {}; params.e = e; params.newStart = newStart; params.newEnd = newEnd; params.newResource = newResource; this._postBack2('EventMove', data, params); }; this.eventMoveCallBack = function(e, newStart, newEnd, newResource, data) { if (!newStart) throw 'newStart is null'; if (!newEnd) throw 'newEnd is null'; var params = {}; params.e = e; params.newStart = newStart; params.newEnd = newEnd; params.newResource = newResource; this._callBack2('EventMove', params, data); }; this._eventMoveDispatch = function(e, newColumnIndex, shadowTop, ev, drag) { if (calendar.eventMoveHandling === 'Disabled') { return; } var _startOffset = 0; var step = Math.floor((shadowTop - _startOffset) / calendar.cellHeight); var cellSize = calendar.cellDuration; // should be integer var boxStart = step * cellSize * 60 * 1000; var start = e.start(); var end = e.end(); var day = new Date(); if (start.isDayPilotDate) { start = start.d; } day.setTime(Date.UTC(start.getUTCFullYear(), start.getUTCMonth(), start.getUTCDate())); var startOffset = (calendar.useEventBoxes !== 'Never') ? start.getTime() - (day.getTime() + start.getUTCHours() * 3600 * 1000 + Math.floor(start.getUTCMinutes() / cellSize) * cellSize * 60 * 1000) : 0; var length = end.getTime() - start.getTime(); var visibleStartOffset = calendar._visibleStart() * 3600 * 1000; var newColumn = this._columnsBottom[newColumnIndex]; var date = newColumn.start.getTime(); var newStartUTC = new Date(); newStartUTC.setTime(date + boxStart + startOffset + visibleStartOffset); var newStart = new DayPilot.Date(newStartUTC); var newEnd = newStart.addTime(length); var external = !!drag; var newResource = newColumn.id; if (calendar._api2()) { // API v2 var args = {}; args.e = e; args.newStart = newStart; args.newEnd = newEnd; args.newResource = newResource; args.external = external; args.ctrl = false; if (ev) { args.ctrl = ev.ctrlKey; } args.shift = false; if (ev) { args.shift = ev.shiftKey; } args.preventDefault = function() { this.preventDefault.value = true; }; if (typeof calendar.onEventMove === 'function') { calendar.onEventMove(args); if (args.preventDefault.value) { return; } } switch (calendar.eventMoveHandling) { case 'PostBack': calendar.eventMovePostBack(e, newStart, newEnd, newResource); break; case 'CallBack': calendar.eventMoveCallBack(e, newStart, newEnd, newResource); break; case 'Notify': calendar.eventMoveNotify(e, newStart, newEnd, newResource); break; case 'Update': e.start(newStart); e.end(newEnd); e.resource(newResource); if (external) { e.commit(); calendar.events.add(e); } else { calendar.events.update(e); } calendar._deleteDragSource(); break; } if (typeof calendar.onEventMoved === 'function') { calendar.onEventMoved(args); } } else { switch (calendar.eventMoveHandling) { case 'PostBack': calendar.eventMovePostBack(e, newStart, newEnd, newResource); break; case 'CallBack': calendar.eventMoveCallBack(e, newStart, newEnd, newResource); break; case 'JavaScript': calendar.onEventMove(e, newStart, newEnd, newResource, external, ev ? ev.ctrlKey : false, ev ? ev.shiftKey : false); break; case 'Notify': calendar.eventMoveNotify(e, newStart, newEnd, newResource, null); break; } } }; this.eventMoveNotify = function(e, newStart, newEnd, newResource, data) { var old = new DayPilot.Event(e.copy(), this); e.start(newStart); e.end(newEnd); e.resource(newResource); e.commit(); calendar.update(); this._invokeEventMove("Notify", old, newStart, newEnd, newResource, data); }; this._invokeEventMove = function(type, e, newStart, newEnd, newResource, data) { var params = {}; params.e = e; params.newStart = newStart; params.newEnd = newEnd; params.newResource = newResource; this._invokeEvent(type, "EventMove", params, data); }; this._deleteDragSource = function() { if (calendar.todo) { if (calendar.todo.del) { var del = calendar.todo.del; del.parentNode.removeChild(del); calendar.todo.del = null; } } }; /* this._eventBubbleCallBack = function(e, bubble) { var guid = DayPilot.guid(); if (!this.bubbles) { this.bubbles = []; } this.bubbles[guid] = bubble; var params = {}; params.e = e; params.guid = guid; this._callBack2("EventBubble", null, params); }; */ // called by DayPilot.Bubble this._bubbleCallBack = function(args, bubble) { var guid = calendar._recordBubbleCall(bubble); var params = {}; params.args = args; params.guid = guid; calendar._callBack2("Bubble", params); }; this._recordBubbleCall = function(bubble) { var guid = DayPilot.guid(); if (!this.bubbles) { this.bubbles = []; } this.bubbles[guid] = bubble; return guid; }; this.eventMenuClickPostBack = function(e, command, data) { var params = {}; params.e = e; params.command = command; this._postBack2('EventMenuClick', data, params); }; this.eventMenuClickCallBack = function(e, command, data) { var params = {}; params.e = e; params.command = command; this._callBack2('EventMenuClick', params, data); }; // called by DayPilot.Menu this._eventMenuClick = function(command, e, handling) { switch (handling) { case 'PostBack': calendar.eventMenuClickPostBack(e, command); break; case 'CallBack': calendar.eventMenuClickCallBack(e, command); break; } }; this.timeRangeMenuClickPostBack = function(e, command, data) { // this.postBack('TRM:', e.start, e.end, e.resource, command); var params = {}; params.selection = e; params.command = command; this._postBack2("TimeRangeMenuClick", data, params); }; this.timeRangeMenuClickCallBack = function(e, command, data) { var params = {}; params.selection = e; params.command = command; this._callBack2("TimeRangeMenuClick", params, data); }; // called by DayPilot.Menu this._timeRangeMenuClick = function(command, e, handling) { switch (handling) { case 'PostBack': calendar.timeRangeMenuClickPostBack(e, command); break; case 'CallBack': calendar.timeRangeMenuClickCallBack(e, command); break; } }; this.timeRangeSelectedPostBack = function(start, end, resource, data) { //this.postBack('FRE:', start, end, column); var range = {}; range.start = start; range.end = end; range.resource = resource; this._postBack2('TimeRangeSelected', data, range); }; this.timeRangeSelectedCallBack = function(start, end, resource, data) { var range = {}; range.start = start; range.end = end; range.resource = resource; this._callBack2('TimeRangeSelected', range, data); }; this._timeRangeSelectedDispatch = function(start, end, column) { // make sure it's DayPilot.Date if (!start.isDayPilotDate) { start = new DayPilot.Date(start); } if (!end.isDayPilotDate) { end = new DayPilot.Date(end); } var resource = column; if (calendar._api2()) { var args = {}; args.start = start; args.end = end; args.resource = resource; args.preventDefault = function() { this.preventDefault.value = true; }; if (typeof calendar.onTimeRangeSelect === 'function') { calendar.onTimeRangeSelect(args); if (args.preventDefault.value) { return; } } // now perform the default builtin action switch (calendar.timeRangeSelectedHandling) { case 'PostBack': calendar.timeRangeSelectedPostBack(start, end, resource); break; case 'CallBack': calendar.timeRangeSelectedCallBack(start, end, resource); break; } if (typeof calendar.onTimeRangeSelected === 'function') { calendar.onTimeRangeSelected(args); } } else { switch (calendar.timeRangeSelectedHandling) { case 'PostBack': calendar.timeRangeSelectedPostBack(start, end, column); break; case 'CallBack': calendar.timeRangeSelectedCallBack(start, end, column); break; case 'JavaScript': calendar.onTimeRangeSelected(start, end, column); break; } } }; this.timeRangeDoubleClickPostBack = function(start, end, column, data) { var range = {}; range.start = start; range.end = end; range.resource = column; this._postBack2('TimeRangeDoubleClick', data, range); // this.postBack('TRD:', start, end, column); }; this.timeRangeDoubleClickCallBack = function(start, end, column, data) { var range = {}; range.start = start; range.end = end; range.resource = column; this._callBack2('TimeRangeDoubleClick', range, data); }; this._timeRangeDoubleClickDispatch = function(start, end, column) { if (calendar._api2()) { var resource = column; var args = {}; args.start = start; args.end = end; args.resource = resource; args.preventDefault = function() { this.preventDefault.value = true; }; if (typeof calendar.onTimeRangeDoubleClick === 'function') { calendar.onTimeRangeDoubleClick(args); if (args.preventDefault.value) { return; } } switch (calendar.timeRangeDoubleClickHandling) { case 'PostBack': calendar.timeRangeDoubleClickPostBack(start, end, resource); break; case 'CallBack': calendar.timeRangeDoubleClickCallBack(start, end, resource); break; } if (typeof calendar.onTimeRangeDoubleClicked === 'function') { calendar.onTimeRangeDoubleClicked(args); } } else { switch (calendar.timeRangeDoubleClickHandling) { case 'PostBack': calendar.timeRangeDoubleClickPostBack(start, end, column); break; case 'CallBack': calendar.timeRangeDoubleClickCallBack(start, end, column); break; case 'JavaScript': calendar.onTimeRangeDoubleClick(start, end, column); break; } } }; this.eventEditPostBack = function(e, newText, data) { var params = {}; params.e = e; params.newText = newText; this._postBack2("EventEdit", data, params); }; this.eventEditCallBack = function(e, newText, data) { var params = {}; params.e = e; params.newText = newText; this._callBack2("EventEdit", params, data); }; this._eventEditDispatch = function(e, newText) { if (calendar._api2()) { var args = {}; args.e = e; args.newText = newText; args.preventDefault = function() { this.preventDefault.value = true; }; if (typeof calendar.onEventEdit === 'function') { calendar.onEventEdit(args); if (args.preventDefault.value) { return; } } switch (calendar.eventEditHandling) { case 'PostBack': calendar.eventEditPostBack(e, newText); break; case 'CallBack': calendar.eventEditCallBack(e, newText); break; case 'Update': e.text(newText); calendar.events.update(e); break; } if (typeof calendar.onEventEdited === 'function') { calendar.onEventEdited(args); if (args.preventDefault.value) { return; } } } else { switch (calendar.eventEditHandling) { case 'PostBack': calendar.eventEditPostBack(e, newText); break; case 'CallBack': calendar.eventEditCallBack(e, newText); break; case 'JavaScript': calendar.onEventEdit(e, newText); break; } } /* switch (calendar.eventEditHandling) { case 'PostBack': calendar.eventEditPostBack(e, newText); break; case 'CallBack': calendar.eventEditCallBack(e, newText); break; case 'JavaScript': calendar.onEventEdit(e, newText); break; }*/ }; this.eventSelectPostBack = function(e, change, data) { var params = {}; params.e = e; params.change = change; this._postBack2('EventSelect', data, params); }; this.eventSelectCallBack = function(e, change, data) { var params = {}; params.e = e; params.change = change; this._callBack2('EventSelect', params, data); }; this._eventSelectDispatch = function(div, e, ctrlKey, metaKey) { var m = calendar.multiselect; var allowDeselect = false; var isSelected = m.isSelected(e); var ctrlOrMeta = ctrlKey || metaKey; if (!ctrlOrMeta && isSelected && !allowDeselect && m.list.length === 1) { return; } if (calendar._api2()) { m.previous = m.events(); var args = {}; args.e = e; args.selected = m.isSelected(e); args.ctrl = ctrlKey; args.meta = metaKey; args.preventDefault = function() { this.preventDefault.value = true; }; if (typeof calendar.onEventSelect === 'function') { calendar.onEventSelect(args); if (args.preventDefault.value) { return; } } switch (calendar.eventSelectHandling) { case 'PostBack': calendar.eventSelectPostBack(e, change); break; case 'CallBack': if (typeof WebForm_InitCallback !== 'undefined') { window.__theFormPostData = ""; window.__theFormPostCollection = []; WebForm_InitCallback(); } calendar.eventSelectCallBack(e, change); break; case 'Update': m._toggleDiv(div, ctrlKey); break; } if (typeof calendar.onEventSelected === 'function') { args.change = m.isSelected(e) ? "selected" : "deselected"; args.selected = m.isSelected(e); calendar.onEventSelected(args); } } else { m.previous = m.events(); m._toggleDiv(div, ctrlKey); var change = m.isSelected(e) ? "selected" : "deselected"; switch (calendar.eventSelectHandling) { case 'PostBack': calendar.eventSelectPostBack(e, change); break; case 'CallBack': if (typeof WebForm_InitCallback !== 'undefined') { window.__theFormPostData = ""; window.__theFormPostCollection = []; WebForm_InitCallback(); } calendar.eventSelectCallBack(e, change); break; case 'JavaScript': calendar.onEventSelect(e, change); break; } } /* switch (calendar.eventSelectHandling) { case 'PostBack': calendar.eventSelectPostBack(e, change); break; case 'CallBack': __theFormPostData = ""; __theFormPostCollection = []; if (WebForm_InitCallback) { WebForm_InitCallback(); } calendar.eventSelectCallBack(e, change); break; case 'JavaScript': calendar.onEventSelect(e, change); break; } */ }; this.commandCallBack = function(command, data) { this._pauseAutoRefresh(); var params = {}; params.command = command; this._callBack2('Command', params, data); }; this._onCellMouseDown = function(ev) { if (touch.active || touch.using) { //ev.preventDefault(); return; } clearTimeout(DayPilotCalendar.selectedTimeout); if (DayPilotCalendar.selecting) { return; } if (DayPilotCalendar.editing) { DayPilotCalendar.editing.blur(); return; } // if double click is active, check if the click was inside if (calendar.selectedCells && calendar.timeRangeDoubleClickHandling !== 'Disabled') { // only if the click is on an active cell for (var i = 0; i < calendar.selectedCells.length; i++) { if (this === calendar.selectedCells[i]) { return; } } } if (calendar.timeRangeSelectedHandling === "Disabled") { return; } //var button = (window.event) ? window.event.button : ev.which; var button = DayPilot.Util.mouseButton(ev); if (!button.left) { return; } DayPilotCalendar.firstMousePos = DayPilot.mc(ev || window.event); calendar.clearSelection(); // initializes selectedCells if necessary DayPilotCalendar.topSelectedCell = this; DayPilotCalendar.bottomSelectedCell = this; DayPilotCalendar.column = DayPilotCalendar.getColumn(this); calendar.selectedCells.push(this); DayPilotCalendar.firstSelected = this; }; this._activateSelection = function() { var selection = this.getSelection(); if (!selection) { return; } if (!calendar.selectedCells) { return; } // color them for (var j = 0; j < calendar.selectedCells.length; j++) { var cell = calendar.selectedCells[j]; if (cell && !cell.selected) { //cell.style.backgroundColor = calendar.selectedColor; //cell.selected = true; var div = document.createElement("div"); //div.style.position = "absolute"; //div.style.top = "0px"; //div.style.left = "0px"; //div.style.right = "0px"; //div.style.backgroundColor = calendar.selectedColor; div.style.height = (calendar.cellHeight) + "px"; div.className = calendar._prefixCssClass("_selected_cell"); if (j === 0) { div.className += " " + calendar._prefixCssClass("_selected_last_cell"); } else if (j === calendar.selectedCells.length - 1) { div.className += " " + calendar._prefixCssClass("_selected_first_cell"); } else { div.className += " " + calendar._prefixCssClass("_selected_middle_cell"); } cell.firstChild.style.display = "none"; cell.insertBefore(div, cell.firstChild); cell.selected = div; } } }; this._onCellMouseOut = function(ev) { if (typeof (DayPilotBubble) !== 'undefined' && calendar.cellBubble) { calendar.cellBubble.hideOnMouseOut(); } }; this._onCellMouseMove = function(ev) { if (typeof (DayPilotCalendar) === 'undefined') { return; } if (touch.active || touch.using) { return; } if (typeof (DayPilotBubble) !== 'undefined' && calendar.cellBubble) { var column = DayPilotCalendar.getColumn(this); var res = calendar._columnsBottom[column].id; var cell = {}; cell.calendar = calendar; cell.start = this.start; cell.end = this.end; cell.resource = res; cell.toJSON = function() { var json = {}; json.start = this.start; json.end = this.end; json.resource = this.resource; return json; }; calendar.cellBubble.showCell(cell); } // activate selecting on first move if (DayPilotCalendar.firstMousePos) { var first = DayPilotCalendar.firstMousePos; var now = DayPilot.mc(ev || window.event); if (first.x !== now.x || first.y !== now.y) { DayPilotCalendar.selecting = true; calendar.clearSelection(); calendar._activateSelection(); } } if (!DayPilotCalendar.selecting) { return; } var mousePos = DayPilot.mc(ev || window.event); var thisColumn = DayPilotCalendar.getColumn(this); if (thisColumn !== DayPilotCalendar.column) { return; } // clean calendar.clearSelection(); // new selected cells if (mousePos.y < DayPilotCalendar.firstMousePos.y) { calendar.selectedCells = DayPilotCalendar.getCellsBelow(this); DayPilotCalendar.topSelectedCell = calendar.selectedCells[0]; DayPilotCalendar.bottomSelectedCell = DayPilotCalendar.firstSelected; } else { calendar.selectedCells = DayPilotCalendar.getCellsAbove(this); DayPilotCalendar.topSelectedCell = DayPilotCalendar.firstSelected; DayPilotCalendar.bottomSelectedCell = calendar.selectedCells[0]; } calendar._activateSelection(); }; this.getSelection = function() { if (!DayPilotCalendar.topSelectedCell) { return null; } if (!DayPilotCalendar.bottomSelectedCell) { return null; } var start = DayPilotCalendar.topSelectedCell.start; var end = DayPilotCalendar.bottomSelectedCell.end; var columnId = DayPilotCalendar.topSelectedCell.resource; return new DayPilot.Selection(start, end, columnId, calendar); }; this._onMainMouseUp = function(ev) { if (DayPilotCalendar.firstMousePos) { var fire = function() { // make sure it's visible DayPilotCalendar.selecting = true; //calendar.clearSelection(); calendar._activateSelection(); DayPilotCalendar.firstMousePos = null; DayPilotCalendar.selecting = false; var sel = calendar.getSelection(); calendar._timeRangeSelectedDispatch(sel.start, sel.end, sel.resource); }; if (DayPilotCalendar.selecting && DayPilotCalendar.topSelectedCell !== null) { fire(); } else { // delayed //DayPilotCalendar.selectedTimeout = setTimeout(fire, calendar.doubleClickTimeout); DayPilotCalendar.selectedTimeout = setTimeout(fire, 100); } } else { DayPilotCalendar.selecting = false; } }; this._scroll = function(ev) { var scrolling = calendar.columnWidthSpec === "Fixed"; if (scrolling || calendar._unifiedScrollable) { if (!calendar.nav.bottomLeft) { return; } calendar.nav.bottomLeft.scrollTop = calendar.nav.bottomRight.scrollTop; calendar.nav.upperRight.scrollLeft = calendar.nav.bottomRight.scrollLeft; } var scroll = calendar._scrollDiv(); calendar.scrollPos = scroll.scrollTop; calendar.scrollHeight = scroll.clientHeight; calendar.nav.scrollpos.value = calendar.scrollPos; calendar._updateScrollLabels(); }; this._updateScrollLabels = function() { if (!this.scrollLabelsVisible) { return; } if (!this._scrollLabels) { return; } var required = this.nav && this.nav.main && this.nav.main.rows && this.nav.main.rows.length > 0 && this.nav.main.rows[0].cells.length > 0; if (!required) { return; } // update horizontal position var columns = this._columnsBottom; var hoursWidth = (this.showHours ? this.hourWidth : 0); //var colWidth = (this.nav.scroll.clientWidth - hoursWidth) / columns.length; var colWidth = this.nav.main.rows[0].cells[0].clientWidth; var iw = 10; var offset = 1; for (var i = 0; i < this.nav.scrollUp.length; i++) { var scrollUp = this.nav.scrollUp[i]; var scrollDown = this.nav.scrollDown[i]; var left = Math.floor(hoursWidth + i * colWidth + colWidth / 2 - (iw / 2) + offset); if (left < 0) { // check for invalid value left = 0; } if (scrollUp && scrollUp.style) { scrollUp.style.left = left + "px"; } if (scrollDown && scrollDown.style) { scrollDown.style.left = left + "px"; } } var hiddenPixels = this._autoHiddenPixels(); // update vertical position for (var i = 0; i < this.nav.scrollUp.length; i++) { var up = this.nav.scrollUp[i]; var down = this.nav.scrollDown[i]; var minEnd = this._scrollLabels[i].minEnd - hiddenPixels; var maxStart = this._scrollLabels[i].maxStart - hiddenPixels; if (up && down) { if (minEnd <= calendar.scrollPos) { up.style.top = (this._totalHeaderHeight()) + "px"; up.style.display = ''; } else { up.style.display = 'none'; } if (maxStart >= calendar.scrollPos + calendar.scrollHeight) { // scrollHeight is updated on scrolling down.style.top = (this._totalHeaderHeight() + this.scrollHeight - 10) + "px"; down.style.display = ''; } else { down.style.display = 'none'; } } } }; this._createEdit = function(object) { var parentTd = object.parentNode; while (parentTd && parentTd.tagName !== "TD") { parentTd = parentTd.parentNode; } var left = 0; var top = object.offsetTop; var width = object.parentNode.offsetWidth; var height = object.offsetHeight; if (object.event.allday()) { left = object.offsetLeft; width = object.offsetWidth; } var edit = document.createElement('textarea'); edit.style.boxSizing = "border-box"; edit.style.position = 'absolute'; edit.style.width = width + 'px'; edit.style.height = height + 'px'; //offsetHeight var fontFamily = DayPilot.gs(object, 'fontFamily'); if (!fontFamily) fontFamily = DayPilot.gs(object, 'font-family'); edit.style.fontFamily = fontFamily; var fontSize = DayPilot.gs(object, 'fontSize'); if (!fontSize) fontSize = DayPilot.gs(object, 'font-size'); edit.style.fontSize = fontSize; edit.style.left = left + 'px'; edit.style.top = top + 'px'; edit.style.border = '1px solid black'; edit.style.padding = '0px'; edit.style.marginTop = '0px'; edit.style.backgroundColor = 'white'; edit.value = DayPilot.tr(object.event.text()); edit.event = object.event; parentTd.firstChild.appendChild(edit); return edit; }; this._eventSelect = function(div, e, ctrlKey, metaKey) { calendar._eventSelectDispatch(div, e, ctrlKey, metaKey); }; // internal methods for handling event selection this.multiselect = {}; this.multiselect._initList = []; this.multiselect._list = []; this.multiselect._divs = []; this.multiselect._previous = []; // not used at the moment this.multiselect._serialize = function() { var m = calendar.multiselect; return DayPilot.JSON.stringify(m.events()); }; this.multiselect.events = function() { var m = calendar.multiselect; var events = []; events.ignoreToJSON = true; for (var i = 0; i < m._list.length; i++) { events.push(m._list[i]); } return events; }; this.multiselect._updateHidden = function() { var h = calendar.nav.select; h.value = calendar.multiselect._serialize(); }; this.multiselect._toggleDiv = function(div, ctrl) { var m = calendar.multiselect; if (m.isSelected(div.event)) { if (calendar.allowMultiSelect) { if (ctrl) { m.remove(div.event, true); } else { var count = m._list.length; m.clear(true); if (count > 1) { m.add(div.event, true); } } } else { // clear all m.clear(true); } } else { if (calendar.allowMultiSelect) { if (ctrl) { m.add(div.event, true); } else { m.clear(true); m.add(div.event, true); } } else { m.clear(true); m.add(div.event, true); } } m.redraw(); m._updateHidden(); }; // compare event with the init select list this.multiselect._shouldBeSelected = function(ev) { var m = calendar.multiselect; return m._isInList(ev, m._initList); }; this.multiselect._alert = function() { var m = calendar.multiselect; var list = []; for (var i = 0; i < m._list.length; i++) { var event = m._list[i]; list.push(event.value()); } alert(list.join("\n")); }; this.multiselect.add = function(ev, dontRedraw) { var m = calendar.multiselect; if (m._indexOf(ev) === -1) { m._list.push(ev); } m._updateHidden(); if (dontRedraw) { return; } m.redraw(); }; this.multiselect.remove = function(ev, dontRedraw) { var m = calendar.multiselect; var i = m._indexOf(ev); if (i !== -1) { m._list.splice(i, 1); } m._updateHidden(); if (dontRedraw) { return; } m.redraw(); }; this.multiselect.clear = function(dontRedraw) { var m = calendar.multiselect; m._list = []; m._updateHidden(); if (dontRedraw) { return; } m.redraw(); }; this.multiselect.redraw = function() { var m = calendar.multiselect; for (var i = 0; i < calendar.elements.events.length; i++) { var div = calendar.elements.events[i]; if (m.isSelected(div.event)) { m._divSelect(div); } else { m._divDeselect(div); } } }; this.multiselect._divSelect = function(div) { var m = calendar.multiselect; var cn = calendar.cssOnly ? calendar._prefixCssClass("_selected") : calendar._prefixCssClass("selected"); var c = m._findContentDiv(div); DayPilot.Util.addClass(c, cn); if (calendar.useEventSelectionBars) { m._divSelectTraditional(div); } m._divs.push(div); }; this.multiselect._findContentDiv = function(div) { if (calendar.cssOnly) { return div; } for (var i = 0; i < div.childNodes.length; i++) { var c = div.childNodes[i]; if (c.getAttribute("c") === "1") { // hack return c; } } return null; }; this.multiselect._divDeselectAll = function() { var m = calendar.multiselect; for (var i = 0; i < m._divs.length; i++) { var div = m._divs[i]; m._divDeselect(div, true); } m._divs = []; }; this.multiselect._divDeselect = function(div, dontRemoveFromCache) { var m = calendar.multiselect; var cn = calendar.cssOnly ? calendar._prefixCssClass("_selected") : calendar._prefixCssClass("selected"); var c = m._findContentDiv(div); DayPilot.Util.removeClass(c, cn); if (calendar.useEventSelectionBars) { m._divDeselectTraditional(div); } if (dontRemoveFromCache) { return; } var i = DayPilot.indexOf(m._divs, div); if (i !== -1) { m._divs.splice(i, 1); } }; this.multiselect.isSelected = function(ev) { return calendar.multiselect._isInList(ev, calendar.multiselect._list); }; this.multiselect._indexOf = function(ev) { return DayPilot.indexOf(calendar.multiselect._list, ev); }; this.multiselect._isInList = function(e, list) { if (!list) { return false; } for (var i = 0; i < list.length; i++) { var ei = list[i]; if (e === ei) { return true; } if (typeof ei.value === 'function') { if (ei.value() !== null && e.value() !== null && ei.value() === e.value()) { return true; } if (ei.value() === null && e.value() === null && ei.recurrentMasterId() === e.recurrentMasterId() && e.start().toStringSortable() === ei.start()) { return true; } } else { if (ei.value !== null && e.value() !== null && ei.value === e.value()) { return true; } if (ei.value === null && e.value() === null && ei.recurrentMasterId === e.recurrentMasterId() && e.start().toStringSortable() === ei.start) { return true; } } } return false; }; this.multiselect._divSelectTraditional = function(obj) { var w = 5; if (!obj.top) { var top = document.createElement("div"); top.setAttribute("unselectable", "on"); top.style.position = 'absolute'; top.style.left = obj.offsetLeft + 'px'; top.style.width = obj.offsetWidth + 'px'; top.style.top = (obj.offsetTop - w) + 'px'; top.style.height = w + 'px'; top.style.backgroundColor = calendar.eventSelectColor; top.style.zIndex = 100; obj.parentNode.appendChild(top); obj.top = top; } if (!obj.bottom) { var bottom = document.createElement("div"); bottom.setAttribute("unselectable", "on"); bottom.style.position = 'absolute'; bottom.style.left = obj.offsetLeft + 'px'; bottom.style.width = obj.offsetWidth + 'px'; bottom.style.top = (obj.offsetTop + obj.offsetHeight) + 'px'; bottom.style.height = w + 'px'; bottom.style.backgroundColor = calendar.eventSelectColor; bottom.style.zIndex = 100; obj.parentNode.appendChild(bottom); obj.bottom = bottom; } }; this.multiselect._divDeselectTraditional = function(obj) { if (obj.top) { obj.parentNode.removeChild(obj.top); obj.top = null; } if (obj.bottom) { obj.parentNode.removeChild(obj.bottom); obj.bottom = null; } }; /* this.selectedEvent = function() { var a = calendar.multiselect._list; if (a.length <= 0) { return null; } if (a.length === 1) { return a[0]; } //multiselect not supported yet return null; }; */ this._divEdit = function(object) { if (DayPilotCalendar.editing) { DayPilotCalendar.editing.blur(); return; } var edit = this._createEdit(object); DayPilotCalendar.editing = edit; edit.onblur = function() { var id = object.event.value(); var tag = object.event.tag(); var oldText = object.event.text(); var newText = edit.value; DayPilotCalendar.editing = null; edit.parentNode.removeChild(edit); if (oldText === newText) { return; } object.style.display = 'none'; calendar._eventEditDispatch(object.event, newText); }; edit.onkeypress = function(e) { var keynum = (window.event) ? event.keyCode : e.keyCode; if (keynum === 13) { this.onblur(); return false; } else if (keynum === 27) { edit.parentNode.removeChild(edit); DayPilotCalendar.editing = false; } return true; }; edit.select(); edit.focus(); }; this._generateColumns = function() { if (calendar.viewType === "Resources") { return false; } if (calendar.columns && calendar._serverBased()) { return false; } return true; }; this._prepareColumns = function() { var generateColumns = calendar._generateColumns(); if (generateColumns) { this._columnsBottom = this._createDaysViewColumns(); this._activateColumnCollection(this._columnsBottom); } else { if (!this.columns) { this.columns = []; } this._activateColumnCollection(this.columns); this._columnsBottom = this._getColumns(this.headerLevels, true); } }; this._getVisibleRange = function() { var start = this.startDate.getDatePart(); var days = this.days; switch (this.viewType) { case "Day": days = 1; break; case "Week": days = 7; // TODO let weekStarts property override it? start = start.firstDayOfWeek(resolved.weekStarts()); break; case "WorkWeek": days = 5; start = start.firstDayOfWeek(1); // Monday break; } var end = start.addDays(days); var result = {}; result.start = start; result.end = end; result.days = days; return result; }; this._createDaysViewColumns = function() { var columns = []; var visible = this._getVisibleRange(); var start = visible.start; var days = visible.days; /* if (this.heightSpec === 'BusinessHoursNoScroll') { start = start.addHours(this.businessBeginsHour); } */ for (var i = 0; i < days; i++) { var column = {}; column.start = start.addDays(i); var pattern = resolved.locale().datePattern; if (calendar.headerDateFormat) { pattern = calendar.headerDateFormat; } column.name = column.start.toString(pattern); column.html = column.name; columns.push(column); } return columns; }; this._activateColumn = function(column) { if (column.Start) { // detect the old mode /* * Value * Name * Start * * InnerHTML * ToolTip * BackColor * Areas * Children */ column.id = column.Value; column.start = column.Start; column.name = column.Name; column.html = column.InnerHTML; column.toolTip = column.ToolTip; column.backColor = column.BackColor; column.areas = column.Areas; column.children = column.Children; delete column.Value; delete column.Start; delete column.Name; delete column.InnerHTML; delete column.ToolTip; delete column.BackColor; delete column.Areas; delete column.Children; } column.start = column.start || calendar.startDate; // use default value column.start = new DayPilot.Date(column.start); column.html = column.html || column.name; column.getChildren = function(level, inherit) { var list = []; if (level <= 1) { list.push(this); return list; } if (!this.children || this.children.length === 0) { if (inherit) { list.push(this); } else { list.push("empty"); } return list; } for (var i = 0; i < this.children.length; i++) { var child = this.children[i]; var subChildren = child.getChildren(level - 1, inherit); for (var j = 0; j < subChildren.length; j++) { list.push(subChildren[j]); } } return list; }; column.getChildrenCount = function(level) { var count = 0; if (!this.children || this.children.length <= 0 || level <= 1) { return 1; } for (var i = 0; i < this.children.length; i++) { count += this.children[i].getChildrenCount(level - 1); } return count; }; column.putIntoBlock = function(ep) { for (var i = 0; i < this.blocks.length; i++) { var block = this.blocks[i]; if (block.overlapsWith(ep.part.top, ep.part.height)) { //block.putIntoLine(ep); block.events.push(ep); block.min = Math.min(block.min, ep.part.top); block.max = Math.max(block.max, ep.part.top + ep.part.height); return i; } } // no suitable block found, create a new one var block = []; block.lines = []; block.events = []; block.overlapsWith = function(start, width) { var end = start + width - 1; if (!(end < this.min || start > this.max - 1)) { return true; } return false; }; block.putIntoLine = function(ep) { var thisCol = this; for (var i = 0; i < this.lines.length; i++) { var line = this.lines[i]; if (line.isFree(ep.part.top, ep.part.height)) { line.push(ep); return i; } } var line = []; line.isFree = function(start, width) { //var free = true; var end = start + width - 1; var max = this.length; for (var i = 0; i < max; i++) { var e = this[i]; if (!(end < e.part.top || start > e.part.top + e.part.height - 1)) { return false; } } return true; }; line.push(ep); this.lines.push(line); return this.lines.length - 1; }; //block.putIntoLine(ep); block.events.push(ep); block.min = ep.part.top; block.max = ep.part.top + ep.part.height; this.blocks.push(block); return this.blocks.length - 1; }; column.putIntoLine = function(ep) { var thisCol = this; for (var i = 0; i < this.lines.length; i++) { var line = this.lines[i]; if (line.isFree(ep.part.top, ep.part.height)) { line.push(ep); return i; } } var line = []; line.isFree = function(start, width) { //var free = true; var end = start + width - 1; var max = this.length; for (var i = 0; i < max; i++) { var e = this[i]; if (!(end < e.part.top || start > e.part.top + e.part.height - 1)) { return false; } } return true; }; line.push(ep); this.lines.push(line); return this.lines.length - 1; }; if (column.children) { this._activateColumnCollection(column.children); } }; this._activateColumnCollection = function(cc) { DayPilot.list(cc).each(function(item) { calendar._activateColumn(item); }); /* for (var i = 0; i < cc.length; i++) { this._activateColumn(cc[i]); } */ /* cc.getColumnCount = function(level) { var count = 0; for (var i = 0; i < this.length; i++) { count += this[i].getChildrenCount(level); } return count; }; */ }; this._getColumns = function(level, inherit) { var source = this._generateColumns() ? this._columnsBottom : this.columns; //var source = this.viewType === "Resources" || this._serverBased() ? this.columns : this._columnsBottom; //var source = this._columns ? this.columns : this._columnsBottom; var list = []; for (var i = 0; i < source.length; i++) { var children = source[i].getChildren(level, inherit); for (var j = 0; j < children.length; j++) { list.push(children[j]); } //list.concat(children); } return list; }; this._drawEventsAllDay = function() { if (!this.showAllDayEvents) { return; } var header = this.nav.header; if (!header) { return; } header.style.display = 'none'; var columns = this._columnsBottom.length; for (var j = 0; j < this._allDay.lines.length; j++) { var line = this._allDay.lines[j]; for (var i = 0; i < line.length; i++) { //var data = this.eventsAllDay[i]; var data = line[i]; var div = document.createElement("div"); div.event = data; div.setAttribute("unselectable", "on"); div.style.position = 'absolute'; if (calendar.rtl) { div.style.right = (100.0 * data.part.colStart / columns) + "%"; } else { div.style.left = (100.0 * data.part.colStart / columns) + "%"; } div.style.width = (100.0 * data.part.colWidth / columns) + "%"; div.style.height = resolved.allDayEventHeight() + 'px'; if (!this.cssOnly) { div.style.top = (3 + this.headerLevels * resolved.headerHeight() + j * (resolved.allDayEventHeight() + 2)) + "px"; } else { div.className = this._prefixCssClass("_alldayevent"); div.style.top = (this.headerLevels * resolved.headerHeight() + j * (resolved.allDayEventHeight())) + "px"; } // prevention of global alignment changes div.style.textAlign = 'left'; div.style.lineHeight = "1.2"; if (data.client.clickEnabled()) { div.onclick = this._eventClickDispatch; } if (data.client.doubleClickEnabled()) { div.ondblclick = this._eventDoubleClickDispatch; } if (data.client.clickEnabled() || data.client.doubleClickEnabled()) { div.style.cursor = "pointer"; } else { div.style.cursor = "default"; } //div.addEventListener("contextmenu", this._eventRightClickDispatch, false); //div.oncontextmenu = this._eventRightClickDispatch; DayPilot.re(div, "contextmenu", this._eventRightClickDispatch); div.onmousemove = function(ev) { var div = this; if (!div.active) { var areas = []; if (data.client.deleteEnabled()) { areas.push({"action":"JavaScript","v":"Hover","w":17,"h":17,"top":3,"right":3, "css": calendar._prefixCssClass("_event_delete"),"js":function(e) { calendar._eventDeleteDispatch(e); } }); } var list = div.event.cache ? div.event.cache.areas : div.event.data.areas; if (list && list.length > 0) { areas = areas.concat(list); } DayPilot.Areas.showAreas(div, div.event, null, areas); if (calendar.cssOnly) { DayPilot.Util.addClass(div, calendar._prefixCssClass("_alldayevent_hover")); } //DayPilot.Areas.showAreas(div, this.event); } if (typeof (DayPilotBubble) !== 'undefined' && calendar.bubble && calendar.eventHoverHandling !== 'Disabled') { calendar.bubble.showEvent(this.event); } }; div.onmouseout = function(ev) { var div = this; if (calendar.cssOnly) { DayPilot.Util.removeClass(div, calendar._prefixCssClass("_alldayevent_hover")); } DayPilot.Areas.hideAreas(this, ev); if (calendar.bubble) { calendar.bubble.hideOnMouseOut(); } }; if (this.showToolTip && !this.bubble) { div.setAttribute("title", data.client.toolTip()); } var startsHere = data.start().getTime() === data.part.start.getTime(); var endsHere = data.end().getTime() === data.part.end.getTime(); var back = data.data.backColor; if (!this.cssOnly) { var inner = document.createElement("div"); inner.setAttribute("unselectable", "on"); inner.style.marginLeft = '2px'; inner.style.marginRight = '3px'; inner.style.paddingLeft = '2px'; //inner.style.paddingRight = '1px'; inner.style.height = (resolved.allDayEventHeight() - 2) + 'px'; inner.style.border = '1px solid ' + this.allDayEventBorderColor; inner.style.overflow = 'hidden'; inner.style.position = 'relative'; inner.style.backgroundColor = back; inner.className = this._prefixCssClass("alldayevent"); //inner.style.backgroundColor = "red"; if (this.roundedCorners) { inner.style.MozBorderRadius = "5px"; inner.style.webkitBorderRadius = "5px"; inner.style.borderRadius = "5px"; } var inside = []; // display properties var textOnTop = true; var textLeft = this.showAllDayEventStartEnd; var textRight = this.showAllDayEventStartEnd; var textAlign = "Center"; var textIndent = 0; // left if (textLeft) { if (textAlign === 'Left') { inside.push("
"); if (startsHere) { if (data.start().getDatePart().getTime() !== data.start().getTime()) { inside.push(DayPilot.Date.hours(data.start().d, this._resolved.timeFormat() === 'Clock12Hours')); } } else { inside.push("~"); } inside.push("
"); } // right //if (textRight && (DayPilot.Date.getTime(ev.End) != 0 || !eventPart.endsHere)) { if (textRight) { inside.push("
"); if (endsHere) { if (data.end().getDatePart().getTime() !== data.end().getTime()) { inside.push(DayPilot.Date.hours(data.end().d, this._resolved.timeFormat() === 'Clock12Hours')); } } else { inside.push("~"); } inside.push("
"); } // fix box if (textAlign === 'Left') { var left = textLeft ? textIndent : 0; inside.push("
"); if (data.client.innerHTML()) { inside.push(data.client.innerHTML()); } else { inside.push(data.text()); } inside.push("
"); } else if (textAlign === 'Center') { if (textOnTop) { // alternate elements order: text on top inside.push("
"); inside.push(""); if (data.client.innerHTML()) { inside.push(data.client.innerHTML()); } else { inside.push(data.text()); } inside.push(""); inside.push("
"); } else { inside.push("
"); if (data.client.innerHTML()) { inside.push(data.client.innerHTML()); } else { inside.push(data.text()); } inside.push("
"); } } inner.innerHTML = inside.join(''); div.appendChild(inner); } else { var inner = document.createElement("div"); inner.setAttribute("unselectable", "on"); inner.className = this._prefixCssClass("_alldayevent_inner"); if (back) { inner.style.background = back; } if (calendar.rtl) { if (!startsHere) { DayPilot.Util.addClass(div, this._prefixCssClass("_alldayevent_continueright")); } if (!endsHere) { DayPilot.Util.addClass(div, this._prefixCssClass("_alldayevent_continueleft")); } } else { if (!startsHere) { DayPilot.Util.addClass(div, this._prefixCssClass("_alldayevent_continueleft")); } if (!endsHere) { DayPilot.Util.addClass(div, this._prefixCssClass("_alldayevent_continueright")); } } if (data.client.innerHTML()) { inner.innerHTML = data.client.innerHTML(); } else { inner.innerHTML = data.text(); } div.appendChild(inner); } if (calendar._api2()) { if (typeof calendar.onAfterEventRender === 'function') { var args = {}; args.e = div.event; args.div = div; calendar.onAfterEventRender(args); } } else { if (calendar.afterEventRender) { calendar.afterEventRender(div.event, div); } } this.nav.allday.appendChild(div); //new DayPilot.Event(div, calendar); this.elements.events.push(div); } } header.style.display = ''; }; this._deleteEvents = function(allDayOnly) { calendar.multiselect._divDeselectAll(); //var start = new Date(); if (this.elements.events) { //DayPilot.pu(maind); for (var i = 0; i < this.elements.events.length; i++) { var div = this.elements.events[i]; var object = div.event; if (object && allDayOnly && !object.allday()) { continue; } if (object) { object.div = null; object.root = null; } div.onclick = null; div.onclickSave = null; div.ondblclick = null; div.oncontextmenu = null; div.onmouseover = null; div.onmouseout = null; div.onmousemove = null; div.onmousedown = null; if (div.firstChild && div.firstChild.firstChild && div.firstChild.firstChild.tagName && div.firstChild.firstChild.tagName.toUpperCase() === 'IMG') { var img = div.firstChild.firstChild; img.onmousedown = null; img.onmousemove = null; img.onclick = null; } div.helper = null; div.event = null; DayPilot.de(div); } } //this.events.innerHTML = ''; this.elements.events = []; }; this._drawEvent = function(data) { var main = this.nav.events; var rounded = this.roundedCorners; var radius = this.roundedCorners && (this._browser.ff || this._browser.opera105 || this._browser.webkit522 || !this._browser.ielt9); var pixels = this.roundedCorners && !radius; var cache = data.cache || data.data; var borderColor = cache.borderColor || this.eventBorderColor; var div = document.createElement("div"); //div.data = data; div.setAttribute("unselectable", "on"); div.style.MozUserSelect = 'none'; div.style.KhtmlUserSelect = 'none'; div.style.WebkitUserSelect = 'none'; div.style.position = 'absolute'; if (!this.cssOnly) { div.style.fontFamily = this.eventFontFamily; div.style.fontSize = this.eventFontSize; div.style.color = cache.fontColor || this.eventFontColor; if (!rounded) { div.style.backgroundColor = borderColor; } } else { div.className = this._prefixCssClass("_event"); } div.style.left = data.part.left + '%'; div.style.top = (data.part.top - this._autoHiddenPixels()) + 'px'; div.style.width = data.part.width + '%'; div.style.height = Math.max(data.part.height, 2) + 'px'; div.style.overflow = 'hidden'; div.isFirst = data.part.start.getTime() === data.start().getTime(); div.isLast = data.part.end.getTime() === data.end().getTime(); if (data.client.clickEnabled()) { div.onclick = this._eventClickDispatch; } if (data.client.doubleClickEnabled()) { div.ondblclick = this._eventDoubleClickDispatch; } //div.addEventListener("contextmenu", this._eventRightClickDispatch, false); //div.oncontextmenu = this._eventRightClickDispatch; DayPilot.re(div, "contextmenu", this._eventRightClickDispatch); div.onmousemove = this._onEventMouseMove; div.onmouseout = this._onEventMouseOut; div.onmousedown = this._onEventMouseDown; //div.addEventListener(DayPilot.touch.start, this._touch.onEventTouchStart, false); //div.addEventListener(DayPilot.touch.move, this._touch.onEventTouchMove, false); //div.addEventListener(DayPilot.touch.end, this._touch.onEventTouchEnd, false); DayPilot.re(div, DayPilot.touch.start, this._touch.onEventTouchStart); DayPilot.re(div, DayPilot.touch.move, this._touch.onEventTouchMove); DayPilot.re(div, DayPilot.touch.end, this._touch.onEventTouchEnd); // inner divs var inside = []; if (!this.cssOnly) { if (this.eventDeleteHandling !== 'Disabled' && data.client.deleteEnabled()) { inside.push("
0"); inside.push(") { DayPilotBubble.hideActive(); event.cancelBubble = true; }\" onmousedown=\"this.parentNode.parentNode.style.cursor='default';\" onclick='"); inside.push(this.clientName); inside.push(".internal.eventDeleteDispatch(this); event.cancelBubble = true; if (event.stopPropagation) event.stopPropagation();' >
"); } if (pixels) { // top line inside.push("
"); inside.push("
 
"); inside.push("
"); // wrapper inside.push("
"); inside.push("
"); inside.push(" 
"); inside.push("
"); } else if (!radius) { inside.push("
 
"); } // fix box inside.push(""); if (this.durationBarVisible) { var barColor = data.client.barColor() || calendar.durationBarColor; // white space top inside.push("
"); // white space bottom inside.push("
"); // duration bar inside.push("
"); } var headerHeight = data.client.header() ? this.eventHeaderHeight : 0; if (data.client.header()) { inside.push("
"); inside.push(data.client.header()); inside.push("
"); } // space - TODO replace? //inside.push("
"); if (this.durationBarVisible) { //inside.push("
"); inside.push(data.client.innerHTML()); inside.push("
"); if (pixels) { // bottom line inside.push("
"); inside.push("
"); inside.push("
"); // wrapper inside.push("
"); // lower-right corner // wrapper inside.push("
"); // line 1 inside.push("
"); inside.push("
"); // lower-right wrapper // wrapper inside.push("
"); // wrapper inside.push("
"); } div.innerHTML = inside.join(''); } else { if (cache.cssClass) { DayPilot.Util.addClass(div, cache.cssClass); } if (this.showToolTip && !this.bubble) { div.setAttribute("title", data.client.toolTip()); } var inner = document.createElement("div"); inner.setAttribute("unselectable", "on"); inner.className = calendar._prefixCssClass("_event_inner"); if (data.data.additionalClassName) { inner.className += " " + data.data.additionalClassName; } if (data.data.collisionCount) { inner.setAttribute("collision-count", data.data.collisionCount); } inner.innerHTML = data.client.innerHTML(); if (cache.fontColor) { inner.style.color = cache.fontColor; } if (cache.backColor) { inner.style.background = cache.backColor; if (DayPilot.browser.ie9 || DayPilot.browser.ielt9) { inner.style.filter = ''; } } if (cache.borderColor) { inner.style.borderColor = cache.borderColor; } if (cache.backgroundImage) { inner.style.backgroundImage = "url(" + cache.backgroundImage + ")"; if (cache.backgroundRepeat) { inner.style.backgroundRepeat = cache.backgroundRepeat; } } div.appendChild(inner); // TODO if (data.client.barVisible()) { var height = data.part.height - 2; //var barLeft = 100 * data.part.barLeft / (width); // % //var barWidth = Math.ceil(100 * data.part.barWidth / (width)); // % var barTop = 100 * data.part.barTop / height; // % var barHeight = Math.ceil(100 * data.part.barHeight / height); // % if (this.durationBarMode === "PercentComplete") { barTop = 0; barHeight = cache.complete; } var bar = document.createElement("div"); bar.setAttribute("unselectable", "on"); bar.className = this._prefixCssClass("_event_bar"); bar.style.position = "absolute"; if (cache.barBackColor) { bar.style.backgroundColor = cache.barBackColor; } var barInner = document.createElement("div"); barInner.setAttribute("unselectable", "on"); barInner.className = this._prefixCssClass("_event_bar_inner"); barInner.style.top = barTop + "%"; //barInner.setAttribute("barWidth", data.part.barWidth); // debug if (0 < barHeight && barHeight <= 1) { barInner.style.height = "1px"; } else { barInner.style.height = barHeight + "%"; } if (cache.barColor) { barInner.style.backgroundColor = cache.barColor; } bar.appendChild(barInner); div.appendChild(bar); } } if (cache.areas) { for (var i = 0; i < cache.areas.length; i++) { var area = cache.areas[i]; if (area.v !== 'Visible') { continue; } var a = DayPilot.Areas.createArea(div, data, area); div.appendChild(a); } } if (main.rows[0].cells[data.part.dayIndex]) { // temporary fix for multirow header, but won't hurt later var wrapper = main.rows[0].cells[data.part.dayIndex].events; wrapper.appendChild(div); calendar._makeChildrenUnselectable(div); //var e = new DayPilot.Event(data, calendar); div.event = data; if (calendar.multiselect._shouldBeSelected(data)) { calendar.multiselect.add(div.event, true); } if (calendar._api2()) { if (typeof calendar.onAfterEventRender === 'function') { var args = {}; args.e = div.event; args.div = div; calendar.onAfterEventRender(args); } } else { if (calendar.afterEventRender) { calendar.afterEventRender(div.event, div); } } /* if (calendar.afterEventRender) { calendar.afterEventRender(data, div); }*/ } calendar.elements.events.push(div); }; /* this.relativizeChildren = function(el) { var c = (el && el.childNodes) ? el.childNodes.length : 0; for (var i = 0; i < c; i++) { var child = el.childNodes[i]; if (child.style.position === '') { child.style.position = 'relative'; } this.relativizeChildren(child); } }; */ this._makeChildrenUnselectable = function(el) { var c = (el && el.childNodes) ? el.childNodes.length : 0; for (var i = 0; i < c; i++) { try { var child = el.childNodes[i]; if (child.nodeType === 1) { child.setAttribute("unselectable", "on"); this._makeChildrenUnselectable(child); } } catch (e) { //alert(e + " " + child.type); } } }; this._drawEvents = function() { this.multiselect._list = []; var start = new Date(); for (var i = 0; i < this._columnsBottom.length; i++) { var col = this._columnsBottom[i]; if (!col.blocks) { continue; } for (var m = 0; m < col.blocks.length; m++) { var block = col.blocks[m]; for (var j = 0; j < block.lines.length; j++) { var line = block.lines[j]; for (var k = 0; k < line.length; k++) { var e = line[k]; e.part.width = 100 / block.lines.length; e.part.left = e.part.width * j; if (this.eventArrangement === 'Cascade') { var isLastBlock = (j === block.lines.length - 1); if (!isLastBlock) { e.part.width = e.part.width * 1.5; } } if (this.eventArrangement === 'Full') { e.part.left = e.part.left / 2; e.part.width = 100 - e.part.left; } if (!e.allday()) { this._drawEvent(e); } } } } } this.multiselect.redraw(); var end = new Date(); var diff = end.getTime() - start.getTime(); }; this._drawEventsFromLines = function() { //return; this.multiselect._list = []; for (var i = 0; i < this._columnsBottom.length; i++) { var col = this._columnsBottom[i]; for (var j = 0; j < col.lines.length; j++) { var line = col.lines[j]; for (var k = 0; k < line.length; k++) { var e = line[k]; e.part.width = 100 / col.lines.length; e.part.left = e.Width * j; if (!e.allday()) { this._drawEvent(e); } } } } }; this._prefixCssClass = function(part) { var prefix = this.theme || this.cssClassPrefix; if (prefix) { return prefix + part; } else { return ""; } }; this._show = function() { if (this.nav.top.style.visibility === 'hidden') { this.nav.top.style.visibility = 'visible'; } }; this._totalHeight = function() { var height = this._totalHeaderHeight() + this._getScrollableHeight(); calendar.debug.message("Getting totalHeight, headerHeight: " + this._totalHeaderHeight() + " scrollable: " + this._getScrollableHeight()); if (height < 0) { return 0; } return height; }; this._drawTop = function() { //this.nav.top = document.getElementById(this.id); this.nav.top.dp = this; this.nav.top.innerHTML = ''; this.nav.top.style.MozUserSelect = 'none'; this.nav.top.style.KhtmlUserSelect = 'none'; this.nav.top.style.WebkitUserSelect = 'none'; this.nav.top.style.WebkitTapHighlightColor = "rgba(0,0,0,0)"; this.nav.top.style.WebkitTouchCallout = "none"; this.nav.top.style.position = 'relative'; if (this.width) { this.nav.top.style.width = this.width; } if (this.rtl) { this.nav.top.style.direction = "rtl"; } //this.nav.top.style.width = this.width ? this.width : '100%'; if (!this.cssOnly) { this.nav.top.style.lineHeight = "1.2"; this.nav.top.style.textAlign = "left"; } if (this.heightSpec === "Parent100Pct") { this.nav.top.style.height = "100%"; } else { this.nav.top.style.height = this._totalHeight() + "px"; } if (this.hideUntilInit) { this.nav.top.style.visibility = 'hidden'; } if (!this.visible) { this.nav.top.style.display = "none"; } this.nav.scroll = document.createElement("div"); this.nav.scroll.style.height = this._getScrollableHeight() + "px"; if (this.cssOnly) { DayPilot.Util.addClass(this.nav.top, this._prefixCssClass("_main")); } this.nav.scroll.style.position = "relative"; if (!this.cssOnly) { this.nav.scroll.style.border = "1px solid " + this.borderColor; this.nav.scroll.style.backgroundColor = this.hourNameBackColor; } // this muse be called after setting overflow on this.nav.scroll because it's used to detect the scrollbar if (this.showHeader) { var header = this._drawTopHeaderDiv(); this.nav.top.appendChild(header); } // fixing the column alignment bug // solved thanks to http://stackoverflow.com/questions/139000/div-with-overflowauto-and-a-100-wide-table-problem this.nav.scroll.style.zoom = 1; this.nav.scroll.setAttribute("data-id", "nav.scroll"); this.nav.scroll.style.position = "absolute"; this.nav.scroll.style.left = "0px"; this.nav.scroll.style.right = "0px"; this.nav.scroll.style.top = this._totalHeaderHeight() + "px"; var wrap = this._drawScrollable(); this.nav.scrollable = wrap.firstChild; this.nav.scroll.appendChild(wrap); this.nav.top.appendChild(this.nav.scroll); this.nav.vsph = document.createElement("div"); this.nav.vsph.style.display = "none"; this.nav.top.appendChild(this.nav.vsph); this.nav.scrollpos = document.createElement("input"); this.nav.scrollpos.type = "hidden"; this.nav.scrollpos.id = calendar.id + "_scrollpos"; this.nav.scrollpos.name = this.nav.scrollpos.id; this.nav.top.appendChild(this.nav.scrollpos); this.nav.select = document.createElement("input"); this.nav.select.type = "hidden"; this.nav.select.id = calendar.id + "_select"; this.nav.select.name = this.nav.select.id; this.nav.select.value = null; // used to be selectedEventValue on the server side this.nav.top.appendChild(this.nav.select); this.nav.scrollLayer = document.createElement("div"); this.nav.scrollLayer.style.position = 'absolute'; this.nav.scrollLayer.style.top = '0px'; this.nav.scrollLayer.style.left = '0px'; this.nav.top.appendChild(this.nav.scrollLayer); this.nav.scrollUp = []; this.nav.scrollDown = []; this.nav.loading = document.createElement("div"); this.nav.loading.style.position = 'absolute'; //this.nav.loading.style.left = '0px'; this.nav.loading.style.top = '0px'; this.nav.loading.style.left = (this.hourWidth + 5) + "px"; // top assigned in loadingStart() this.nav.loading.style.backgroundColor = this.loadingLabelBackColor; this.nav.loading.style.fontSize = this.loadingLabelFontSize; this.nav.loading.style.fontFamily = this.loadingLabelFontFamily; this.nav.loading.style.color = this.loadingLabelFontColor; this.nav.loading.style.padding = '2px'; this.nav.loading.innerHTML = this.loadingLabelText; this.nav.loading.style.display = 'none'; this.nav.top.appendChild(this.nav.loading); }; this._updateRowWidths = function() { var scrolling = this.columnWidthSpec === 'Fixed'; var headerRow = this.nav.header.rows[this.nav.header.rows.length - 1]; // last var eventsRow = this.nav.events.rows[0]; for (var i = 0; i < calendar._columnsBottom.length; i++) { var headerCell = headerRow.cells[i]; var eventsCell = eventsRow.cells[i]; var headerDiv = headerCell.firstChild; var data = calendar._columnsBottom[i]; if (scrolling) { var width = data.width ? data.width : calendar.columnWidth; headerDiv.style.width = width + "px"; if (eventsCell) { eventsCell.style.width = width + "px"; } } else { headerDiv.style.width = null; if (eventsCell) { eventsCell.style.width = null; } } } }; this._scrollElement = function() { return this._unifiedScrollable ? calendar.nav.bottomRight : calendar.nav.scroll; }; this._updateColumnWidthSpec = function() { var scrolling = this.columnWidthSpec === 'Fixed'; if (!scrolling) { var element = calendar._scrollElement(); if (this.heightSpec === "Fixed") { element.style.overflowY = "scroll"; } else if (this.heightSpec === 'BusinessHours' && this._durationHours() <= this.businessEndsHour - this.businessBeginsHour) { element.style.overflow = "hidden"; } else if (this.heightSpec !== "Full" && this.heightSpec !== "BusinessHoursNoScroll") { element.style.overflow = "auto"; } else { element.style.overflowX = "auto"; element.style.overflowY = "hidden"; } } if (scrolling) { var scrollbarSpace = 0; var w = this._columnsBottom.length * this.columnWidth; var scrollDiv = calendar._scrollDiv(); if (w > scrollDiv.clientWidth) { scrollbarSpace = DayPilot.sw(calendar.nav.bottomRight); } calendar.nav.headerParent.style.width = (w + scrollbarSpace) + "px"; calendar.nav.main.style.width = w + "px"; calendar.nav.events.style.width = w + "px"; calendar.nav.crosshair.style.width = w + "px"; } else { calendar.nav.headerParent.style.width = "100%"; calendar.nav.main.style.width = "100%"; calendar.nav.events.style.width = "100%"; calendar.nav.crosshair.style.width = "100%"; } this._updateRowWidths(); }; // used during full update this._drawHourTable = function() { // clear old hour table if (!this._fasterDispose) { DayPilot.pu(this.nav.hourTable); } else { this._disposeHourTable(); } if (this.nav.hoursPlaceholder) { this.nav.hoursPlaceholder.innerHTML = ''; this.nav.hourTable = this._createHourTable(); this.nav.hoursPlaceholder.appendChild(this.nav.hourTable); } }; this._disposeHourTable = function() { if (!this.nav.hourTable) { return; } for (var i = 0; i < this.nav.hourTable.rows.length; i++) { var row = this.nav.hourTable.rows[i]; var div = row.cells[0].firstChild; div.data = null; div.onmousemove = null; div.onmouseout = null; } }; // used during initial load only this._drawScrollable = function() { var zoom = document.createElement("div"); zoom.style.zoom = 1; zoom.style.position = 'relative'; zoom.onmousemove = this._onMainMouseMove; //zoom.addEventListener(DayPilot.touch.start, this._touch.onMainTouchStart, false); //zoom.addEventListener(DayPilot.touch.move, this._touch.onMainTouchMove, false); //zoom.addEventListener(DayPilot.touch.end, this._touch.onMainTouchEnd, false); //zoom.addEventListener("contextmenu", function(ev) { ev.preventDefault(); }, false); // ie/touch DayPilot.re(zoom, DayPilot.touch.start, this._touch.onMainTouchStart); DayPilot.re(zoom, DayPilot.touch.move, this._touch.onMainTouchMove); DayPilot.re(zoom, DayPilot.touch.end, this._touch.onMainTouchEnd); DayPilot.re(zoom, "contextmenu", function(ev) { var ev = ev || window.event; ev.preventDefault ? ev.preventDefault() : ev.returnValue = false; }); if (navigator.msPointerEnabled) { zoom.style.msTouchAction = "none"; zoom.style.touchAction = "none"; } //zoom.ontouchmove = this._touch.onMainTouchMove; //zoom.ontouchend = this._touch.onMainTouchEnd; // required for detection of calendar under touch position zoom.daypilotMainD = true; zoom.calendar = this; var bottomLeft = null; var bottomRight = null; var hoursPlaceholder = null; var scrolling = this.columnWidthSpec === 'Fixed'; if (scrolling || this._unifiedScrollable) { if (this.showHours) { var left = document.createElement("div"); left.style.cssFloat = "left"; left.style.styleFloat = "left"; // IE7 left.style.width = (this.hourWidth) + "px"; left.style.height = this._getScrollableHeight() + "px"; left.style.overflow = "hidden"; zoom.appendChild(left); bottomLeft = left; var scrollbarSpace = 30; var height = (this._duration() * this.cellHeight) / (60000 * this.cellDuration) + scrollbarSpace; hoursPlaceholder = document.createElement("div"); hoursPlaceholder.style.height = (height) + "px"; left.appendChild(hoursPlaceholder); } var right = document.createElement("div"); //right.style.width = "500px"; right.style.height = this._getScrollableHeight() + "px"; if (this.showHours) { right.style.marginLeft = (this.hourWidth) + "px"; } //right.style.backgroundColor = "red"; right.style.position = "relative"; right.style.overflow = "auto"; /* right.onscroll = function() { calendar.nav.bottomLeft.scrollTop = calendar.nav.bottomRight.scrollTop; calendar.nav.upperRight.scrollLeft = calendar.nav.bottomRight.scrollLeft; }; */ zoom.appendChild(right); bottomRight = right; } else { var table = document.createElement("table"); table.cellSpacing = "0"; table.cellPadding = "0"; table.border = "0"; table.style.border = "0px none"; table.style.width = "100%"; // absolute position causing problems in Chrome (not full width sometimes) table.style.position = 'relative'; var r = table.insertRow(-1); var c; if (this.showHours) { c = r.insertCell(-1); //c.valign = "top"; c.style.verticalAlign = "top"; c.style.padding = '0px'; c.style.border = '0px none'; hoursPlaceholder = c; } c = r.insertCell(-1); //c.setAttribute("valign", "top"); //c.valign = "top"; c.width = "100%"; c.style.padding = '0px'; c.style.border = '0px none'; c.style.verticalAlign = "top"; if (!this.cssOnly) { c.style.borderLeft = "1px solid " + this.borderColor; } bottomRight = c; zoom.appendChild(table); } if (hoursPlaceholder) { this.nav.hourTable = this._createHourTable(); hoursPlaceholder.appendChild(this.nav.hourTable); } if (!this.cssOnly && !this._separateEventsTable) { bottomRight.appendChild(this._createEventsAndCells()); } else { var parent = document.createElement("div"); parent.style.height = "0px"; parent.style.position = "relative"; parent.appendChild(this._createEventsAndCells()); var crosshair = document.createElement("div"); crosshair.style.position = "absolute"; crosshair.style.top = "0px"; crosshair.style.left = "0px"; //crosshair.style.right = "0px"; crosshair.style.width = "100%"; crosshair.style.height = "0px"; parent.appendChild(crosshair); this.nav.crosshair = crosshair; parent.appendChild(this._createEventsTable()); bottomRight.appendChild(parent); } this.nav.zoom = zoom; this.nav.bottomLeft = bottomLeft; this.nav.bottomRight = bottomRight; this.nav.hoursPlaceholder = hoursPlaceholder; return zoom; }; this._createEventsAndCells = function() { var table = document.createElement("table"); table.cellPadding = "0"; table.cellSpacing = "0"; table.border = "0"; var scrolling = this.columnWidthSpec === 'Fixed'; if (!scrolling) { table.style.width = "100%"; } table.style.border = "0px none"; if (!this.cssOnly) { // table.style.borderLeft = "1px solid " + this.borderColor; } table.style.tableLayout = 'fixed'; this.nav.main = table; this.nav.events = table; return table; }; this._getTotalScrollableWidth = function() { var scrolling = this.columnWidthSpec === 'Fixed'; if (!scrolling) { return "100%"; } else { var total = 0; for (var i = 0; i < calendar._columnsBottom.length; i++) { var column = calendar._columnsBottom[i]; if (column.width) { total += column.width; } else { total += calendar.columnWidth; } } return total + "px"; } }; this._createEventsTable = function() { var table = document.createElement("table"); table.style.position = "absolute"; table.style.top = "0px"; table.cellPadding = "0"; table.cellSpacing = "0"; table.border = "0"; table.style.width = calendar._getTotalScrollableWidth(); table.style.border = "0px none"; table.style.tableLayout = 'fixed'; this.nav.events = table; var create = true; var columns = this._columnsBottom; var cl = columns.length; var r = (create) ? table.insertRow(-1) : table.rows[0]; for (var j = 0; j < cl; j++) { var c = (create) ? r.insertCell(-1) : r.cells[j]; if (create) { c.style.padding = '0px'; c.style.border = '0px none'; c.style.height = '0px'; c.style.overflow = 'visible'; if (!calendar.rtl) { c.style.textAlign = 'left'; } /* if (calendar.columnWidthSpec === "Fixed") { if (columns[j].width) { c.style.width = columns[j].width + "px"; } else { c.style.width = calendar.columnWidth + "px"; } } */ calendar._initializeEventCell(c); } } return table; }; this._createHourTable = function() { var table = document.createElement("table"); table.cellSpacing = "0"; table.cellPadding = "0"; table.border = "0"; table.style.border = '0px none'; table.style.width = this.hourWidth + "px"; table.oncontextmenu = function() { return false; }; table.onmousemove = function() { calendar._crosshairHide(); }; var hours = this._duration() / (this.timeHeaderCellDuration * 60 * 1000); // duration in ticks for (var i = 0; i < hours; i++) { this._createHourRow(table, i); } return table; }; this._autoHiddenRows = function() { return (this._visibleStart() - this._visibleStart(true)) * (60 / this.cellDuration); }; this._autoHiddenHours = function() { return (this._visibleStart() - this._visibleStart(true)); }; this._autoHiddenPixels = function() { return this._autoHiddenRows() * this.cellHeight; }; this._createHourRow = function(table, i) { var height = (this.cellHeight * 60 / this.cellDuration) / (60 / this.timeHeaderCellDuration); var r = table.insertRow(-1); r.style.height = height + "px"; var c = r.insertCell(-1); c.valign = "bottom"; c.setAttribute("unselectable", "on"); if (!this.cssOnly) { c.className = this._prefixCssClass("rowheader"); c.style.backgroundColor = this.hourNameBackColor; c.style.cursor = "default"; } c.style.padding = '0px'; c.style.border = '0px none'; var frame = document.createElement("div"); if (this.cssOnly) { frame.className = this._prefixCssClass("_rowheader"); } frame.style.position = "relative"; frame.style.width = this.hourWidth + "px"; frame.style.height = (height) + "px"; frame.style.overflow = 'hidden'; frame.setAttribute("unselectable", "on"); var block = document.createElement("div"); if (this.cssOnly) { block.className = this._prefixCssClass("_rowheader_inner"); } block.setAttribute("unselectable", "on"); //block.style.display = "block"; if (!this.cssOnly) { block.style.borderBottom = "1px solid " + this.hourNameBorderColor; block.style.textAlign = "right"; block.style.height = (height - 1) + "px"; } var html = null; var data = null; if (this.hours) { var index = i + this._autoHiddenHours(); data = this.hours[index]; html = data.html; } var cellDuration = this.timeHeaderCellDuration; var start = this.startDate.addMinutes(cellDuration * i + 60*this._visibleStart()); var hour = start.getHours(); if (!html) { var text = document.createElement("div"); text.setAttribute("unselectable", "on"); if (!this.cssOnly) { text.style.padding = "2px"; text.style.fontFamily = this.hourFontFamily; text.style.fontSize = this.hourFontSize; text.style.color = this.hourFontColor; } var am = hour < 12; if (this._resolved.timeFormat() === "Clock12Hours") { hour = hour % 12; if (hour === 0) { hour = 12; } } if (this.timeHeaderCellDuration !== 60) { hour += ":" + start.toString("mm"); } text.innerHTML = hour; var span = document.createElement("span"); span.setAttribute("unselectable", "on"); if (!this.cssOnly) { span.style.fontSize = "10px"; span.style.verticalAlign = "super"; } else { span.className = this._prefixCssClass("_rowheader_minutes"); } var sup; if (this._resolved.timeFormat() === "Clock12Hours") { if (am) { sup = "AM"; } else { sup = "PM"; } } else { sup = "00"; } if (!this.cssOnly) { span.innerHTML = " " + sup; } else { span.innerHTML = sup; } text.appendChild(span); html = text.outerHTML; } if (typeof calendar.onBeforeTimeHeaderRender === 'function') { var args = {}; args.header = {}; args.header.hours = hour; args.header.minutes = start.getMinutes(); args.header.start = start.toString("HH:mm"); args.header.html = html; args.header.areas = data ? data.areas : null; calendar.onBeforeTimeHeaderRender(args); if (args.header.html !== null) { html = args.header.html; } data = args.header; } if (data) { frame.data = data; frame.onmousemove = calendar._onTimeHeaderMouseMove; frame.onmouseout = calendar._onTimeHeaderMouseOut; } block.innerHTML = html; /* if (html) { block.innerHTML = html; } else { block.appendChild(text); } */ frame.appendChild(block); c.appendChild(frame); }; this._onTimeHeaderMouseMove = function(ev) { calendar._crosshairHide(); var div = this; if (!div.active) { DayPilot.Areas.showAreas(div, div.data); } }; this._onTimeHeaderMouseOut = function(ev) { DayPilot.Areas.hideAreas(this, ev); }; this._getScrollableHeight = function() { switch (this.heightSpec) { case "Fixed": return this.height; case "Parent100Pct": return this.height; case "Full": return (this._duration() * this.cellHeight) / (60000 * this.cellDuration); case "BusinessHours": case "BusinessHoursNoScroll": var dHours = this._businessHoursSpan(); return dHours * this.cellHeight * 60 / this.cellDuration; default: throw "DayPilot.Calendar: Unexpected 'heightSpec' value."; } }; this._totalHeaderHeight = function() { if (!this.showHeader) { return 0; } var headerRowsHeight = this.headerLevels * resolved.headerHeight() + this.headerLevels - 1; if (this.showAllDayEvents && resolved.allDayHeaderHeight()) { if (!this.cssOnly) { return headerRowsHeight + resolved.allDayHeaderHeight(); } else { return headerRowsHeight + resolved.allDayHeaderHeight(); } } else { return headerRowsHeight; } }; this._autoHeaderHeight = function() { if (!this.headerHeightAutoFit) { return; } if (this.headerLevels > 1) { throw "Header height can't be adjusted for HeaderLevels > 1 (not implemented yet)."; return; } var max = 0; for (var i = 0; i < this._columnsBottom.length; i++) { var cell = this.nav.header.rows[this.headerLevels - 1].cells[i]; var div = cell.firstChild; var inner = div.firstChild; var oldHeight = div.style.height; div.style.height = "auto"; inner.style.position = "static"; var h = div.offsetHeight; div.style.height = oldHeight; inner.style.position = ''; max = Math.max(max, h); } if (max > this.headerHeight) { this._cache.headerHeight = max; this._updateHeaderHeight(); this._drawHeader(); } }; this._unifiedScrollable = true; this._scrollbarVisible = function() { var element = this._unifiedScrollable ? calendar.nav.bottomRight : calendar.nav.scroll; if (this.cssOnly) { return DayPilot.sw(element) > 0; } else { return DayPilot.sw(element) > 2; //borders } /* if (this.heightSpec === 'Parent100Pct') { var inner = (this._duration() * this.cellHeight) / (60000 * this.cellDuration); return inner > this.height; } return this.nav.scroll.style.overflow !== 'hidden'; */ }; this._drawTopHeaderDiv = function() { var header = document.createElement("div"); //header.setAttribute("data-id", "header-div"); if (!this.cssOnly) { header.style.borderLeft = "1px solid " + this.borderColor; header.style.borderRight = "1px solid " + this.borderColor; } var scrolling = this.columnWidthSpec === 'Fixed'; if (!scrolling) { header.style.overflow = "auto"; } header.style.position = "absolute"; header.style.left = "0px"; header.style.right = "0px"; // to match main grid structure var zoom = document.createElement("div"); zoom.style.position = "relative"; zoom.style.zoom = "1"; var relative = null; var scrolling = this.columnWidthSpec === 'Fixed'; if (scrolling || this._unifiedScrollable) { var left = document.createElement("div"); left.style.cssFloat = "left"; left.style.styleFloat = "left"; // IE7 left.style.width = (this.hourWidth) + "px"; if (this.showHours) { var corner = this._drawCorner(); this.nav.corner = corner; left.appendChild(corner); zoom.appendChild(left); this.nav.upperLeft = left; } var right = document.createElement("div"); if (this.showHours) { right.style.marginLeft = (this.hourWidth) + "px"; } right.style.position = "relative"; right.style.overflow = "hidden"; right.style.height = this._totalHeaderHeight() + "px"; zoom.appendChild(right); this.nav.upperRight = right; relative = document.createElement("div"); relative.style.position = "relative"; /* moved to updateColumnWidthSpec if (scrolling) { relative.style.width = (this._columnsBottom.length * this.columnWidth + scrollbarSpace) + "px"; } else { relative.style.width = "100%"; } */ right.appendChild(relative); } else { var table = document.createElement("table"); table.cellPadding = "0"; table.cellSpacing = "0"; table.border = "0"; table.style.width = "100%"; table.style.borderCollapse = 'separate'; //table.style.position = "absolute"; table.style.border = "0px none"; var r = table.insertRow(-1); this.nav.fullHeader = table; if (this.showHours) { // corner var c = r.insertCell(-1); c.style.padding = '0px'; c.style.border = '0px none'; var corner = this._drawCorner(); c.appendChild(corner); this.nav.corner = corner; } // top header c = r.insertCell(-1); //var mid = c; c.style.width = "100%"; if (!this.cssOnly) { c.style.backgroundColor = this.hourNameBackColor; } c.valign = "top"; c.style.position = 'relative'; // ref point c.style.padding = '0px'; c.style.border = '0px none'; relative = document.createElement("div"); //relative.setAttribute("data-id", "nav.mid"); relative.style.position = "relative"; relative.style.height = this._totalHeaderHeight() + "px"; relative.style.overflow = "hidden"; c.appendChild(relative); this.nav.mid = relative; zoom.appendChild(table); } this.nav.headerParent = relative; this._createNavHeader(); var scrollbar = this._scrollbarVisible(); // above the vertical scrollbar //if (this.heightSpec !== "Full" && this.heightSpec !== "BusinessHoursNoScroll") { var scrolling = this.columnWidthSpec === 'Fixed'; if (scrollbar && !scrolling) { this._createCornerRightTd(); } header.appendChild(zoom); return header; }; this._createNavHeader = function() { this.nav.unifiedCornerRight = null; this.nav.header = document.createElement("table"); this.nav.header.cellPadding = "0"; this.nav.header.cellSpacing = "0"; //this.nav.header.border = "0"; var scrolling = this.columnWidthSpec === 'Fixed'; if (!scrolling) { this.nav.header.width = "100%"; } this.nav.header.style.tableLayout = "fixed"; if (!this.cssOnly) { this.nav.header.style.borderBottom = "0px none #000000"; this.nav.header.style.borderLeft = "1px solid " + this.borderColor; //this.nav.header.style.borderRight = "1px solid " + this.borderColor; this.nav.header.style.borderTop = "1px solid " + this.borderColor; } //this.nav.header.style.borderCollapse = 'separate'; this.nav.header.oncontextmenu = function() { return false; }; var scrollbar = this._scrollbarVisible(); //var scrollbar = DayPilot.sw(this.nav.scroll) > 0; if (!this.cssOnly) { if (scrollbar) { this.nav.header.style.borderRight = "1px solid " + this.borderColor; } } this.nav.headerParent.appendChild(this.nav.header); if (this.nav.allday) { DayPilot.de(this.nav.allday); } if (this.showAllDayEvents) { // caused problems in IE7 compatibility mode var allday = document.createElement("div"); allday.style.position = 'absolute'; allday.style.top = "0px"; allday.style.height = "0px"; var scrolling = this.columnWidthSpec === 'Fixed'; if (!scrolling) { allday.style.left = "0px"; allday.style.right = "0px"; //allday.style.width = "100%"; } else { allday.style.width = (this._columnsBottom.length * this.columnWidth) + "px"; } this.nav.allday = allday; this.nav.headerParent.appendChild(allday); } }; this._createCornerRightTd = function() { if (!this.nav.fullHeader) { return; } var r = this.nav.fullHeader.rows[0]; var c = r.insertCell(-1); if (!this.cssOnly) { c.className = this._prefixCssClass('cornerright'); c.style.backgroundColor = this.hourNameBackColor; c.style.borderBottom = "0px none"; c.style.borderLeft = "1px solid " + this.borderColor; c.style.borderRight = "0px none"; } c.style.padding = '0px'; c.style.verticalAlign = 'top'; c.setAttribute("unselectable", "on"); //c.innerHTML = " "; var inside = document.createElement("div"); inside.setAttribute("unselectable", "on"); if (this.cssOnly) { inside.className = this._prefixCssClass('_cornerright'); } inside.style.overflow = "hidden"; inside.style.position = "relative"; inside.style.width = "16px"; inside.style.height = this._totalHeaderHeight() + "px"; var inner = document.createElement("div"); if (this.cssOnly) { inner.className = this._prefixCssClass('_cornerright_inner'); } else { inner.style.borderTop = "1px solid " + this.borderColor; } inside.appendChild(inner); c.appendChild(inside); this.nav.cornerRight = inside; }; this._drawCorner = function() { var wrap = document.createElement("div"); wrap.style.position = 'relative'; if (!this.cssOnly) { wrap.style.backgroundColor = this.cornerBackColor; wrap.style.fontFamily = this.headerFontFamily; wrap.style.fontSize = this.headerFontSize; wrap.style.color = this.headerFontColor; wrap.className = this._prefixCssClass("corner"); } else { wrap.className = this._prefixCssClass("_corner"); } wrap.style.width = this.hourWidth + "px"; wrap.style.height = this._totalHeaderHeight() + "px"; wrap.style.overflow = "hidden"; wrap.oncontextmenu = function() { return false; }; var corner = document.createElement("div"); if (this.cssOnly) { corner.className = this._prefixCssClass("_corner_inner"); } else { corner.style.borderTop = "1px solid " + this.borderColor; } corner.setAttribute("unselectable", "on"); var html = this.cornerHTML || this.cornerHtml; corner.innerHTML = html ? html : ''; wrap.appendChild(corner); if (!this.numberFormat) return wrap; return wrap; }; this._disposeMain = function() { var table = this.nav.main; table.root = null; table.onmouseup = null; for (var y = 0; y < table.rows.length; y++) { var r = table.rows[y]; for (var x = 0; x < r.cells.length; x++) { var c = r.cells[x]; c.root = null; c.onmousedown = null; c.onmousemove = null; c.onmouseout = null; c.onmouseup = null; c.onclick = null; c.ondblclick = null; c.oncontextmenu = null; } } if (!this._fasterDispose) DayPilot.pu(table); }; this._deleteScrollLabels = function() { for (var i = 0; this.nav.scrollUp && i < this.nav.scrollUp.length; i++) { this.nav.scrollLayer.removeChild(this.nav.scrollUp[i]); } for (var i = 0; this.nav.scrollDown && i < this.nav.scrollDown.length; i++) { this.nav.scrollLayer.removeChild(this.nav.scrollDown[i]); } this.nav.scrollUp = []; this.nav.scrollDown = []; }; this._initializeEventCell = function(c) { var div = document.createElement("div"); div.style.marginRight = calendar.columnMarginRight + "px"; div.style.position = 'relative'; div.style.height = '1px'; if (!this.cssOnly) { div.style.fontSize = '1px'; div.style.lineHeight = '1.2'; } div.style.marginTop = '-1px'; c.events = div; var sep = document.createElement("div"); sep.style.position = "relative"; div.style.height = "1px"; div.style.marginTop = "-1px"; c.separators = sep; c.appendChild(sep); c.appendChild(div); }; // draw time cells this._drawMain = function() { //this._updateColumnWidthSpec(); var table = this.nav.main; var step = this.cellDuration * 60 * 1000; var rowCount = this._rowCount(); var autoHiddenCells = this._autoHiddenHours() * (60/this.cellDuration); var columns = calendar._columnsBottom; var create = !this._tableCreated || table.rows.length === 0 || columns.length !== table.rows[0].cells.length || rowCount !== table.rows.length; // redraw only if number of columns changes if (table) { this._disposeMain(); if (calendar._browser.ielt9 && create) { DayPilot.de(this.nav.scrollable.parentNode); var wrap = this._drawScrollable(); this.nav.scrollable = wrap.firstChild; this.nav.scroll.appendChild(wrap); //this._drawScrollable(); table = this.nav.main; /* var parent = table.parentNode; DayPilot.de(table); parent.appendChild(this._createEventsAndCells()); table = this.nav.main;*/ } } this.nav.scrollable.daypilotMainD = true; this.nav.scrollable.calendar = this; //var i = 0; while (table && table.rows && table.rows.length > 0 && create) { if (!this._fasterDispose) DayPilot.pu(table.rows[0]); /* var row = table.rows[0]; while (calendar._browser.ie && row.cells && row.cells.length > 0) { row.deleteCell(0); }*/ table.deleteRow(0); } this._tableCreated = true; // scroll labels if (this.scrollLabelsVisible) { var columns = this._columnsBottom; var hoursWidth = (this.showHours ? this.hourWidth : 0); var colWidth = (this.nav.scroll.clientWidth - hoursWidth) / columns.length; for (var i = 0; i < columns.length; i++) { var scrollUp = document.createElement("div"); scrollUp.style.position = 'absolute'; scrollUp.style.top = '0px'; scrollUp.style.left = (hoursWidth + 2 + i * colWidth + colWidth / 2) + "px"; scrollUp.style.display = 'none'; var img = document.createElement("div"); img.style.height = '10px'; img.style.width = '10px'; if (this.cssOnly) { img.className = this._prefixCssClass("_scroll_up"); } else { img.style.backgroundRepeat = "no-repeat"; if (this.scrollUpUrl) { img.style.backgroundImage = "url('" + this.scrollUpUrl + "')"; } img.className = this._prefixCssClass("scroll_up"); } scrollUp.appendChild(img); this.nav.scrollLayer.appendChild(scrollUp); this.nav.scrollUp.push(scrollUp); var scrollDown = document.createElement("div"); scrollDown.style.position = 'absolute'; scrollDown.style.top = '0px'; scrollDown.style.left = (hoursWidth + 2 + i * colWidth + colWidth / 2) + "px"; scrollDown.style.display = 'none'; var img = document.createElement("div"); img.style.height = '10px'; img.style.width = '10px'; if (this.cssOnly) { img.className = this._prefixCssClass("_scroll_down"); } else { img.style.backgroundRepeat = "no-repeat"; if (this.scrollDownUrl) { img.style.backgroundImage = "url('" + this.scrollDownUrl + "')"; } img.className = this._prefixCssClass("scroll_down"); } scrollDown.appendChild(img); this.nav.scrollLayer.appendChild(scrollDown); this.nav.scrollDown.push(scrollDown); } } var cl = columns.length; // CssOnly mode, event table is separate if (this.cssOnly || this._separateEventsTable) { var events = this.nav.events; while (events && events.rows && events.rows.length > 0 && create) { if (!this._fasterDispose) DayPilot.pu(events.rows[0]); events.deleteRow(0); } // TODO identical code is in createEventsTable, merge var r = (create) ? events.insertRow(-1) : events.rows[0]; for (var j = 0; j < cl; j++) { var c = (create) ? r.insertCell(-1) : r.cells[j]; if (create) { c.style.padding = '0px'; c.style.border = '0px none'; c.style.height = '1px'; c.style.overflow = 'visible'; var scrolling = this.columnWidthSpec === 'Fixed'; if (scrolling) { if (columns[j].width) { c.style.width = columns[j].width + "px"; } else { c.style.width = this.columnWidth + "px"; } } if (!calendar.rtl) { c.style.textAlign = 'left'; } calendar._initializeEventCell(c); } } } for (var i = 0; i < rowCount; i++) { var r = (create) ? table.insertRow(-1) : table.rows[i]; var y = i + autoHiddenCells; if (create) { r.style.MozUserSelect = 'none'; r.style.KhtmlUserSelect = 'none'; r.style.WebkitUserSelect = 'none'; } for (var j = 0; j < cl; j++) { var col = this._columnsBottom[j]; var c = (create) ? r.insertCell(-1) : r.cells[j]; // always update //c.start = col.start.addTime(i * step).addHours(this._visibleStart()).addHours(-this._autoHiddenHours()); c.start = col.start.addTime(y * step).addHours(this._visibleStart()); c.end = c.start.addTime(step); c.resource = col.id; if (typeof this.onBeforeCellRender === 'function') { if (!this.cellProperties) { this.cellProperties = {}; } var cell = {}; cell.resource = c.resource; cell.start = c.start; cell.end = c.end; var index = j + "_" + y; cell.cssClass = null; cell.html = null; cell.backImage = null; cell.backRepeat = null; cell.backColor = null; cell.business = this._isBusinessCell(c.start, c.end); if (this.cellProperties[index]) { DayPilot.Util.copyProps(this.cellProperties[index], cell, ['cssClass', 'html', 'backImage', 'backRepeat', 'backColor', 'business']); } var args = {}; args.cell = cell; this.onBeforeCellRender(args); this.cellProperties[index] = cell; } var props = calendar._getProperties(j, y); if (create) { c.root = this; c.style.padding = '0px'; c.style.border = '0px none'; c.style.verticalAlign = 'top'; c.style.height = calendar.cellHeight + 'px'; c.style.overflow = 'hidden'; c.setAttribute("unselectable", "on"); if (!this.cssOnly) { var content = document.createElement("div"); content.style.height = (calendar.cellHeight - 1) + "px"; content.style.width = '100%'; content.style.overflow = 'hidden'; content.setAttribute("unselectable", "on"); c.appendChild(content); var div = document.createElement("div"); div.setAttribute("unselectable", "on"); div.style.fontSize = '1px'; div.style.height = '0px'; c.appendChild(div); if ((!calendar.rtl && j !== cl - 1) || calendar.rtl) { c.style.borderRight = '1px solid ' + calendar.cellBorderColor; } // hack, no multiplying var endHour = (c.end.getMinutes() + c.end.getSeconds() + c.end.getMilliseconds()) > 0; if (endHour) { if (calendar.hourHalfBorderColor !== '') { div.style.borderBottom = '1px solid ' + calendar.hourHalfBorderColor; // HourHalfBorderColor } div.className = calendar._prefixCssClass("hourhalfcellborder"); } else { if (calendar.hourBorderColor !== '') { div.style.borderBottom = '1px solid ' + calendar.hourBorderColor; // HourBorderColor } div.className = calendar._prefixCssClass("hourcellborder"); } } else { // cssonly var content = document.createElement("div"); content.className = calendar._prefixCssClass("_cell"); content.style.position = "relative"; content.style.height = (calendar.cellHeight) + "px"; //content.style.width = '100%'; content.style.overflow = 'hidden'; content.setAttribute("unselectable", "on"); var inner = document.createElement("div"); inner.className = calendar._prefixCssClass("_cell_inner"); content.appendChild(inner); c.appendChild(content); } } else { content = c.firstChild; content.className = calendar._prefixCssClass("_cell"); // must be reset } c.onmousedown = this._onCellMouseDown; c.onmousemove = this._onCellMouseMove; c.onmouseout = this._onCellMouseOut; //c.addEventListener(DayPilot.touch.start, this._touch.onCellTouchStart, false); //c.addEventListener(DayPilot.touch.move, this._touch.onCellTouchMove, false); //c.addEventListener(DayPilot.touch.end, this._touch.onCellTouchEnd, false); DayPilot.re(c, DayPilot.touch.end, this._touch.onCellTouchEnd); c.onmouseup = function() { return false; }; c.onclick = function() { return false; }; c.ondblclick = function() { DayPilotCalendar.firstMousePos = null; calendar._activateSelection(); clearTimeout(DayPilotCalendar.selectedTimeout); if (calendar.timeRangeDoubleClickHandling === 'Disabled') { return; } var sel = calendar.getSelection(); calendar._timeRangeDoubleClickDispatch(sel.start, sel.end, sel.resource); }; c.oncontextmenu = function() { if (!this.selected) { //if (DayPilotCalendar.selectedCells) { calendar.clearSelection(); // DayPilotCalendar.selectedCells = []; //} DayPilotCalendar.column = DayPilotCalendar.getColumn(this); calendar.selectedCells.push(this); DayPilotCalendar.firstSelected = this; DayPilotCalendar.topSelectedCell = this; DayPilotCalendar.bottomSelectedCell = this; calendar._activateSelection(); } if (calendar.contextMenuSelection) { calendar.contextMenuSelection.show(calendar.getSelection()); } return false; }; var backColor = calendar._getColor(j, y); // = c.style.backgroundColor content = c.firstChild; var scrolling = this.columnWidthSpec === 'Fixed'; if (scrolling) { if (col.width) { content.style.width = col.width + "px"; } else { content.style.width = this.columnWidth + "px"; } } if (backColor) { if (this.cssOnly) { content.firstChild.style.background = backColor; } else { content.style.background = backColor; } } var business = props ? props.business : this._isBusinessCell(c.start, c.end); if (business && this.cssOnly) { DayPilot.Util.addClass(content, calendar._prefixCssClass("_cell_business")); } var html = this.cssOnly ? content.firstChild : content; // reset custom properties if (html) { html.innerHTML = ''; // reset } content.style.backgroundImage = ""; content.style.backgroundRepeat = ""; if (props) { if (props.html) { html.innerHTML = props.html; } if (props.cssClass) { if (this.cssOnly) { DayPilot.Util.addClass(content, props.cssClass); } else { DayPilot.Util.addClass(c, calendar._prefixCssClass(props.cssClass)); } } if (props.backImage) { content.style.backgroundImage = "url('" + props.backImage + "')"; } if (props.backRepeat) { content.style.backgroundRepeat = props.backRepeat; } } if (!this.cssOnly) { DayPilot.Util.addClass(c, calendar._prefixCssClass("cellbackground")); //c.className = calendar._prefixCssClass("cellbackground"); } } } table.onmouseup = this._onMainMouseUp; table.root = this; calendar.nav.scrollable.style.display = ''; }; this._isBusinessCell = function(start, end) { if (this.businessBeginsHour < this.businessEndsHour) { return !(start.getHours() < this.businessBeginsHour || start.getHours() >= this.businessEndsHour || start.getDayOfWeek() === 6 || start.getDayOfWeek() === 0); } if (start.getHours() >= this.businessBeginsHour) { return true; } if (start.getHours() < this.businessEndsHour) { return true; } return false; }; this._onMainMouseMove = function(ev) { ev = ev || window.event; ev.insideMainD = true; if (window.event) { window.event.srcElement.inside = true; } DayPilotCalendar.activeCalendar = this; // required for moving var ref = calendar.nav.main; // changed from this.nav.scrollable calendar.coords = DayPilot.mo3(ref, ev); var mousePos = DayPilot.mc(ev); var crosshair = calendar.crosshairType && calendar.crosshairType !== "Disabled"; var inTimeHeader = calendar.coords.x < calendar.hourWidth; if (DayPilot.Global.moving || DayPilot.Global.resizing || DayPilotCalendar.selecting || inTimeHeader) { calendar._crosshairHide(); } else if (crosshair) { calendar._crosshair(); } if (DayPilot.Global.resizing) { if (!DayPilot.Global.resizing.event) { // UpdatePanel refresh DayPilot.Global.resizing = null; DayPilot.de(DayPilotCalendar.resizingShadow); DayPilotCalendar.resizingShadow = null; return; } if (!DayPilotCalendar.resizingShadow) { //DayPilotCalendar.deleteShadow(DayPilotCalendar.resizingShadow); DayPilotCalendar.resizingShadow = calendar._createShadow(DayPilot.Global.resizing, false, calendar.shadow); } // make sure the cursor is correct //DayPilotCalendar.resizingShadow.style.cursor = 'n-resize'; //DayPilotCalendar.resizing.dirty = true; var _step = DayPilot.Global.resizing.event.calendar.cellHeight; var _startOffset = 0; var delta = (mousePos.y - DayPilotCalendar.originalMouse.y); if (DayPilot.Global.resizing.dpBorder === 'bottom') { //var newHeight = Math.floor( ((DayPilotCalendar.originalHeight + delta) + _step/2) / _step ) * _step; var newHeight = Math.floor(((DayPilotCalendar.originalHeight + DayPilotCalendar.originalTop + delta) + _step / 2) / _step) * _step - DayPilotCalendar.originalTop + _startOffset; if (newHeight < _step) newHeight = _step; var max = DayPilot.Global.resizing.event.calendar.nav.main.clientHeight; if (DayPilotCalendar.originalTop + newHeight > max) { newHeight = max - DayPilotCalendar.originalTop; } DayPilotCalendar.resizingShadow.style.height = (newHeight) + 'px'; } else if (DayPilot.Global.resizing.dpBorder === 'top') { var newTop = Math.floor(((DayPilotCalendar.originalTop + delta - _startOffset) + _step / 2) / _step) * _step + _startOffset; if (newTop < _startOffset) { newTop = _startOffset; } if (newTop > DayPilotCalendar.originalTop + DayPilotCalendar.originalHeight - _step) { newTop = DayPilotCalendar.originalTop + DayPilotCalendar.originalHeight - _step; } var newHeight = DayPilotCalendar.originalHeight - (newTop - DayPilotCalendar.originalTop); if (newHeight < _step) { newHeight = _step; } else { DayPilotCalendar.resizingShadow.style.top = newTop + 'px'; } DayPilotCalendar.resizingShadow.style.height = (newHeight) + 'px'; } } else if (DayPilot.Global.moving) { if (!DayPilot.Global.moving.helper) { DayPilotCalendar.movingShadow = null; return; } if (!DayPilotCalendar.movingShadow) { // don't start dragging unless a minimal move has been performed var distance = 3; if (DayPilot.distance(mousePos, DayPilotCalendar.originalMouse) > distance) { // fixes the ie8 bug (incorrect offsetX and offsetY cause flickering during move if there are inline elements in the event DayPilotCalendar.movingShadow = calendar._createShadow(DayPilot.Global.moving, !calendar._browser.ie, calendar.shadow); DayPilotCalendar.movingShadow.style.width = (DayPilotCalendar.movingShadow.parentNode.offsetWidth + 1) + 'px'; } else { return; } } if (!calendar.coords) { return; } var _step = calendar.cellHeight; var _startOffset = 0; var offset = DayPilotCalendar.moveOffsetY; if (!offset) { offset = _step / 2; // for external drag } if (this.moveBy === "Top") { offset = 0; } var newTop = Math.floor(((calendar.coords.y - offset - _startOffset) + _step / 2) / _step) * _step + _startOffset; if (newTop < _startOffset) { newTop = _startOffset; } var main = calendar.nav.main; var max = main.clientHeight; var height = parseInt(DayPilotCalendar.movingShadow.style.height); // DayPilotCalendar.moving.data.height if (newTop + height > max) { newTop = max - height; } //DayPilotCalendar.movingShadow.parentNode.style.display = 'none'; DayPilotCalendar.movingShadow.style.top = newTop + 'px'; //DayPilotCalendar.movingShadow.parentNode.style.display = ''; var colWidth = main.clientWidth / main.rows[0].cells.length; //var column = Math.floor((calendar.coords.x - calendar.hourWidth) / colWidth); var column = Math.floor((calendar.coords.x) / colWidth); if (column < 0) { column = 0; } if (calendar.rtl) { column = calendar._columnsBottom.length - column - 1; } var events = calendar.nav.events; if (column < events.rows[0].cells.length && column >= 0 && DayPilotCalendar.movingShadow.column !== column) { DayPilotCalendar.movingShadow.column = column; DayPilotCalendar.moveShadow(events.rows[0].cells[column]); } } if (DayPilotCalendar.drag) { // drag detected if (DayPilotCalendar.gShadow) { document.body.removeChild(DayPilotCalendar.gShadow); } DayPilotCalendar.gShadow = null; if (!DayPilotCalendar.movingShadow && calendar.coords) { var shadow = calendar._createShadow(DayPilotCalendar.drag, false, DayPilotCalendar.drag.shadowType); if (shadow) { DayPilotCalendar.movingShadow = shadow; var now = new DayPilot.Date().getDatePart(); var ev = { 'value': DayPilotCalendar.drag.id, 'start': now, 'end': now.addSeconds(DayPilotCalendar.drag.duration), 'text': DayPilotCalendar.drag.text }; var event = new DayPilot.Event(ev, calendar); //event.calendar = calendar; //event.root = calendar; event.external = true; DayPilot.Global.moving = {}; DayPilot.Global.moving.event = event; DayPilot.Global.moving.helper = {}; } } ev.cancelBubble = true; } }; this.temp = {}; this.temp.getPosition = function() { var coords = calendar._table.getCellCoords(); if (!coords) { return null; } //var td = calendar.nav.main.rows[cellCoords.y + extraCells].cells[cellCoords.x]; var column = calendar._columnsBottom[coords.x]; var cell = {}; cell.resource = column.id; cell.start = new DayPilot.Date(column.start).addHours(calendar._visibleStart(true)).addMinutes(coords.y*calendar.cellDuration); cell.end = cell.start.addMinutes(calendar.cellDuration); return cell; }; this._table = {}; this._table.getCellCoords = function() { var result = {}; result.x = 0; result.y = 0; if (!calendar.coords) { return null; } var main = calendar.nav.main; var relativeX = calendar.coords.x; var i = 0; var col = this.col(main, i); while (col && relativeX > col.left) { i += 1; col = this.col(main, i); } result.x = i - 1; var _startOffset = 0; var row = Math.floor((calendar.coords.y - _startOffset) / calendar.cellHeight); result.y = row; if (result.x < 0) { return null; } return result; }; this._table.col = function(table, x) { var result = {}; result.left = 0; result.width = 0; if (!table) { return null; } if (!table.rows) { return null; } if (table.rows.length === 0) { return null; } if (table.rows[0].cells.length == 0) { return null; } var cell = table.rows[0].cells[x]; if (!cell) { return null; } var t = DayPilot.abs(table); var c = DayPilot.abs(cell); result.left = c.x - t.x; result.width = cell.offsetWidth; return result; }; this._crosshair = function() { this._crosshairHide(); if (!this.elements.crosshair) { this.elements.crosshair = []; } var cellCoords = this._table.getCellCoords(); if (!cellCoords) { return; } var column = cellCoords.x; var y = Math.floor(cellCoords.y / (60 / calendar.cellDuration) * (60 / calendar.timeHeaderCellDuration)); if (y < 0) { return; } if (this.nav.hourTable) { // not accessible when ShowHours = true if (y >= this.nav.hourTable.rows.length) { return; } var vertical = document.createElement("div"); vertical.style.position = "absolute"; vertical.style.left = "0px"; vertical.style.right = "0px"; vertical.style.top = "0px"; vertical.style.bottom = "0px"; vertical.style.opacity = .5; vertical.style.backgroundColor = this.crosshairColor; vertical.style.opacity = this.crosshairOpacity / 100; vertical.style.filter = "alpha(opacity=" + this.crosshairOpacity + ")"; this.nav.hourTable.rows[y].cells[0].firstChild.appendChild(vertical); this.elements.crosshair.push(vertical); } if (this.nav.header) { var horizontal = document.createElement("div"); horizontal.style.position = "absolute"; horizontal.style.left = "0px"; horizontal.style.right = "0px"; horizontal.style.top = "0px"; horizontal.style.bottom = "0px"; horizontal.style.opacity = .5; horizontal.style.backgroundColor = this.crosshairColor; horizontal.style.opacity = this.crosshairOpacity / 100; horizontal.style.filter = "alpha(opacity=" + this.crosshairOpacity + ")"; var row = this.nav.header.rows[this.headerLevels - 1]; if (row.cells[column]) { row.cells[column].firstChild.appendChild(horizontal); this.elements.crosshair.push(horizontal); } } if (this.crosshairType === "Header") { return; } var layer = this.nav.crosshair; var _startOffset = 0; var top = Math.floor(((calendar.coords.y - _startOffset)) / calendar.cellHeight) * calendar.cellHeight + _startOffset; //var height = duration * calendar.cellHeight / (60 * calendar.cellDuration); var height = calendar.cellHeight; var fullh = document.createElement("div"); fullh.style.position = "absolute"; fullh.style.left = "0px"; fullh.style.right = "0px"; fullh.style.top = top + "px"; fullh.style.height = height + "px"; fullh.style.backgroundColor = this.crosshairColor; fullh.style.opacity = this.crosshairOpacity / 100; fullh.style.filter = "alpha(opacity=" + this.crosshairOpacity + ")"; fullh.onmousedown = this._onCrosshairMouseDown; layer.appendChild(fullh); this.elements.crosshair.push(fullh); var col = this._table.col(this.nav.main, column); height = this.nav.main.clientHeight; if (col) { var fullv = document.createElement("div"); fullv.style.position = "absolute"; fullv.style.left = col.left + "px"; fullv.style.width = col.width + "px"; fullv.style.top = "0px"; fullv.style.height = height + "px"; fullv.style.backgroundColor = this.crosshairColor; fullv.style.opacity = this.crosshairOpacity / 100; fullv.style.filter = "alpha(opacity=" + this.crosshairOpacity + ")"; fullv.onmousedown = this._onCrosshairMouseDown; layer.appendChild(fullv); this.elements.crosshair.push(fullv); } }; this._onCrosshairMouseDown = function(ev) { calendar._crosshairHide(); var cellCoords = calendar._table.getCellCoords(); var extraCells = 0; // events var cell = calendar.nav.main.rows[cellCoords.y + extraCells].cells[cellCoords.x]; calendar._onCellMouseDown.apply(cell, [ev]); }; this._crosshairHide = function() { if (!this.elements.crosshair || this.elements.crosshair.length === 0) { return; } for (var i = 0; i < this.elements.crosshair.length; i++) { var e = this.elements.crosshair[i]; if (e && e.parentNode) { e.parentNode.removeChild(e); } } this.elements.crosshair = []; }; this._expandCellProperties = function() { if (!this.cellConfig) { return; } var config = this.cellConfig; if (config.vertical) { for (var x = 0; x < config.x; x++) { var def = this.cellProperties[x + "_0"]; for (var y = 1; y < config.y; y++) { this.cellProperties[x + "_" + y] = def; } } } if (config.horizontal) { for (var y = 0; y < config.y; y++) { var def = this.cellProperties["0_" + y]; for (var x = 1; x < config.x; x++) { this.cellProperties[x + "_" + y] = def; } } } if (config["default"]) { var def = config["default"]; for (var y = 0; y < config.y; y++) { for (var x = 0; x < config.x; x++) { if (!this.cellProperties[x + "_" + y]) { this.cellProperties[x + "_" + y] = def; } } } } }; this._getProperties = function(x, y) { if (!this.cellProperties) { return null; } return this.cellProperties[x + "_" + y]; }; this._isBusiness = function(x, y) { var index = x + '_' + y; if (this.cellProperties && this.cellProperties[index]) { return this.cellProperties[index].business; } return false; }; this._getColor = function(x, y) { var index = x + '_' + y; if (this.cellProperties && this.cellProperties[index]) { return this.cellProperties[index].backColor; } return null; }; this._disposeHeader = function() { var table = this.nav.header; if (table && table.rows) { for (var y = 0; y < table.rows.length; y++) { var r = table.rows[y]; for (var x = 0; x < r.cells.length; x++) { var c = r.cells[x]; c.onclick = null; c.onmousemove = null; c.onmouseout = null; } } } if (!this._fasterDispose) DayPilot.pu(table); }; this._drawHeaderRow = function(level, create) { // column headers var r = (create) ? this.nav.header.insertRow(-1) : this.nav.header.rows[level - 1]; var columns = this._getColumns(level); var len = columns.length; var lastRow = (level === calendar.headerLevels); for (var i = 0; i < len; i++) { var data = columns[i]; if (calendar._api2()) { if (typeof calendar.onBeforeHeaderRender === 'function') { var args = {}; args.header = {}; // TODO deep copy of children, areas? DayPilot.Util.copyProps(data, args.header, ['id', 'start', 'name', 'html', 'backColor', 'toolTip', 'areas', 'children']); this.onBeforeHeaderRender(args); DayPilot.Util.copyProps(args.header, data, ['html', 'backColor', 'toolTip', 'areas']); } } var nonEmpty = data.getChildren ? true : false; var cell = (create) ? r.insertCell(-1) : r.cells[i]; cell.data = data; if (lastRow) { // use the width spec only for the last row, otherwise use colspan } else { var colspan = 1; if (nonEmpty) { colspan = data.getChildrenCount(calendar.headerLevels - level + 1); } cell.colSpan = colspan; } if (nonEmpty) { cell.onclick = this._headerClickDispatch; cell.onmousemove = this._headerMouseMove; cell.onmouseout = this._headerMouseOut; if (data.toolTip) { cell.title = data.toolTip; } } cell.style.overflow = 'hidden'; cell.style.padding = '0px'; cell.style.border = '0px none'; cell.style.height = (resolved.headerHeight()) + "px"; if (!this.cssOnly) { cell.style.borderLeft = "0px none"; if (i !== len - 1) { // last one cell.style.borderRight = "1px solid " + this.borderColor; } } var div = (create) ? document.createElement("div") : cell.firstChild; /* var scrolling = this.columnWidthSpec === 'Fixed'; if (scrolling && lastRow) { if (data.width) { div.style.width = data.width + "px"; } else { div.style.width = calendar.columnWidth + "px"; } } */ if (create) { div.setAttribute("unselectable", "on"); div.style.MozUserSelect = 'none'; div.style.KhtmlUserSelect = 'none'; div.style.WebkitUserSelect = 'none'; div.style.position = 'relative'; div.style.height = resolved.headerHeight() + "px"; if (!this.cssOnly) { div.className = calendar._prefixCssClass('colheader'); div.style.cursor = 'default'; div.style.fontFamily = this.headerFontFamily; div.style.fontSize = this.headerFontSize; div.style.color = this.headerFontColor; div.style.backgroundColor = data.backColor; div.style.textAlign = 'center'; var text = document.createElement("div"); text.style.position = 'absolute'; text.style.left = '0px'; text.style.right = '0px'; text.style.top = "0px"; text.style.bottom = "0px"; text.style.padding = "2px"; text.setAttribute("unselectable", "on"); if (level !== 1) { text.style.borderTop = '1px solid ' + this.borderColor; } if (this.headerClickHandling !== "Disabled") { text.style.cursor = 'pointer'; } div.appendChild(text); } else { div.className = calendar._prefixCssClass('_colheader'); var inner = document.createElement("div"); inner.className = calendar._prefixCssClass('_colheader_inner'); if (data.backColor) { inner.style.background = data.backColor; } div.appendChild(inner); } cell.appendChild(div); } else { div.style.height = resolved.headerHeight() + "px"; } this._updateHeaderActiveAreas(div, data); if (nonEmpty) { div.firstChild.innerHTML = data.html; } } }; this._updateHeaderActiveAreas = function(div, data) { // delete active areas var tobedeleted = []; for (var j = 0; j < div.childNodes.length; j++) { var node = div.childNodes[j]; if (node.isActiveArea) { tobedeleted.push(node); } } for (var j = 0; j < tobedeleted.length; j++) { var node = tobedeleted[j]; DayPilot.de(node); } // areas (permanently visible) if (data.areas) { var areas = data.areas; for (var j = 0; j < areas.length; j++) { var area = areas[j]; if (area.v !== 'Visible') { continue; } var o = new DayPilotCalendar.Column(data.id, data.name, data.start); var a = DayPilot.Areas.createArea(div, o, area); div.appendChild(a); } } }; /* this._widthUnit = function() { if (this.width && this.width.indexOf("px") !== -1) { return "Pixel"; } return "Percentage"; }; */ this._drawHeader = function() { if (!this.showHeader) { return; } var header = this.nav.header; var create = true; var columns = this._getColumns(calendar.headerLevels, true); var len = columns.length; // always create /* if (this._headerCreated && header && header.rows && header.rows.length > 0) { create = header.rows[header.rows.length - 1].cells.length !== len; } */ //if (calendar._browser.ielt9 && create) { if (this._headerCreated && calendar._browser.ielt9 && create) { DayPilot.de(this.nav.header); this._createNavHeader(); //header = this._drawTopHeaderDiv(); //this.nav.header = header; //this.nav.top.appendChild(header); } while (this._headerCreated && header && header.rows && header.rows.length > 0 && create) { if (!this._fasterDispose) DayPilot.pu(header.rows[0]); header.deleteRow(0); } this._headerCreated = true; var html = calendar.cornerHTML || calendar.cornerHtml; if (!create) { // corner var corner = calendar.nav.corner; if (corner) { if (!this.cssOnly) { if (calendar.cornerBackColor) { corner.style.backgroundColor = calendar.cornerBackColor; } else { corner.style.backgroundColor = calendar.hourBackColor; } } if (!this._fasterDispose) DayPilot.pu(corner.firstChild); corner.firstChild.innerHTML = html ? html : ''; } } for (var i = 0; i < calendar.headerLevels; i++) { this._drawHeaderRow(i + 1, create); } if (!this.showAllDayEvents) { return; } // all day events var r = (create) ? this.nav.header.insertRow(-1) : this.nav.header.rows[calendar.headerLevels]; for (var i = 0; i < len; i++) { var data = columns[i]; var cell = (create) ? r.insertCell(-1) : r.cells[i]; cell.data = data; cell.style.padding = '0px'; cell.style.border = '0px none'; cell.style.overflow = 'hidden'; if (!this.cssOnly) { cell.style.lineHeight = '1.2'; } var div = (create) ? document.createElement("div") : cell.firstChild; if (create) { div.setAttribute("unselectable", "on"); div.style.MozUserSelect = 'none'; div.style.KhtmlUserSelect = 'none'; div.style.WebkitUserSelect = 'none'; div.style.overflow = 'hidden'; div.style.position = "relative"; div.style.height = resolved.allDayHeaderHeight() + "px"; if (!this.cssOnly) { div.className = this._prefixCssClass("alldayheader"); div.style.textAlign = 'center'; div.style.backgroundColor = data.backColor; div.style.cursor = 'default'; var text = document.createElement("div"); text.style.position = "absolute"; text.style.left = '0px'; text.style.right = '0px'; text.style.top = "0px"; text.style.bottom = "0px"; text.setAttribute("unselectable", "on"); text.style.borderTop = '1px solid ' + this.borderColor; div.appendChild(text); if (calendar.rtl) { if (i === len - 1) { // last one text.style.borderLeft = "1px solid " + data.backColor; } else { text.style.borderLeft = "1px solid " + this.borderColor; } } else { if (i !== len - 1) { // last one text.style.borderRight = "1px solid " + this.borderColor; } } } else { div.className = this._prefixCssClass("_alldayheader"); var inner = document.createElement("div"); inner.className = this._prefixCssClass("_alldayheader_inner"); div.appendChild(inner); } cell.appendChild(div); } div.style.height = resolved.allDayHeaderHeight() + "px"; } }; this._loadingStart = function() { if (this.loadingLabelVisible && this.nav.loading) { this.nav.loading.innerHTML = this.loadingLabelText; this.nav.loading.style.top = (this._totalHeaderHeight() + 5) + "px"; this.nav.loading.style.display = ''; } }; this._loadingStop = function() { if (this.callbackTimeout) { window.clearTimeout(this.callbackTimeout); } if (this.nav.loading) { this.nav.loading.style.display = 'none'; } }; this._enableScrolling = function() { var scrollDiv = this._scrollDiv(); var scrollPos = this.initScrollPos; if (!scrollPos) { var hour = this.businessBeginsHour; scrollPos = hour * (60/calendar.cellDuration) * calendar.cellHeight; } scrollDiv.root = this; scrollDiv.onscroll = this._scroll; // initial position if (scrollDiv.scrollTop === 0) { scrollDiv.scrollTop = scrollPos - this._autoHiddenPixels(); } else { this._scroll(); } }; this._visible = function() { var el = calendar.nav.top; return el.offsetWidth > 0 && el.offsetHeight > 0; }; this._waitForVisibility = function() { var visible = calendar._visible; if (!visible()) { calendar._visibilityInterval = setInterval(function() { if (visible()) { calendar._enableScrolling(); calendar._fixScrollHeader(); clearInterval(calendar._visibilityInterval); } }, 100); } }; this.scrollToY = function(pixels) { var scrollDiv = this._scrollDiv(); scrollDiv.scrollTop = pixels; }; this.scrollToHour = function(hour) { var scrollDiv = this._scrollDiv(); var pixels = hour * (60/calendar.cellDuration) * calendar.cellHeight; scrollDiv.scrollTop = pixels - this._autoHiddenPixels(); }; this._scrollDiv = function() { var scrolling = this.columnWidthSpec === 'Fixed'; return scrolling || this._unifiedScrollable ? this.nav.bottomRight : this.nav.scroll; }; this.onCallbackError = function(result, context) { alert("Error!\r\nResult: " + result + "\r\nContext:" + context); }; this.scrollbarVisible = this._scrollbarVisible; this._fixScrollHeader = function() { var show = this._scrollbarVisible(); var visible = !!this.nav.cornerRight; if (this._unifiedScrollable) { if (this.nav.unifiedCornerRight) { DayPilot.de(this.nav.unifiedCornerRight); } var fullw = this._getTotalScrollableWidth(); if (fullw != "100%" && parseInt(fullw) < this._scrollDiv().clientWidth) { return; } var w = DayPilot.sw(this.nav.bottomRight); // corner right this.nav.unifiedCornerRight = this.nav.header.rows[0].insertCell(-1); var c = this.nav.unifiedCornerRight; c.rowSpan = this.nav.header.rows.length; c.style.width = w + "px"; var corner = document.createElement("div"); corner.setAttribute("unselectable", "on"); if (this.cssOnly) { corner.className = this._prefixCssClass('_cornerright'); } corner.style.overflow = "hidden"; corner.style.height = this._totalHeaderHeight() + "px"; corner.style.position = "relative"; var inner = document.createElement("div"); if (this.cssOnly) { inner.className = this._prefixCssClass('_cornerright_inner'); } corner.appendChild(inner); c.appendChild(corner); var scrollable = this.columnWidthSpec === "Fixed"; // all-day wrapper if (!scrollable && this.nav.allday) { this.nav.allday.style.right = w + "px"; } return; } if (show !== visible) { // change required if (show) { // show it this._createCornerRightTd(); } else { // hide it if (this.nav.fullHeader && this.nav.fullHeader.rows[0].cells.length === 3) { var c = this.nav.fullHeader.rows[0].cells[2]; if (c.parentNode) { c.parentNode.removeChild(c); } } this.nav.cornerRight = null; } } // now fix the width var d = this.nav.cornerRight; if (!d) { return; } var w = DayPilot.sw(calendar._scrollElement()); if (!this.cssOnly) { if (w >= 3) { d.style.width = (w - 3) + 'px'; // -2 borders, -1 correction } } else { if (d) { d.style.width = (w) + 'px'; } } return w; }; // interval defined in seconds, minimum 30 seconds this._startAutoRefresh = function(forceEnabled) { if (forceEnabled) { this.autoRefreshEnabled = true; } if (!this.autoRefreshEnabled) { return; } if (this.autoRefreshCount >= this.autoRefreshMaxCount) { return; } //this.autoRefreshCount = 0; // reset this._pauseAutoRefresh(); var interval = this.autoRefreshInterval; if (!interval || interval < 10) { throw "The minimum autoRefreshInterval is 10 seconds"; } //this.autoRefresh = interval * 1000; this.autoRefreshTimeout = window.setTimeout(function() { calendar._doRefresh(); }, this.autoRefreshInterval * 1000); }; this._pauseAutoRefresh = function() { if (this.autoRefreshTimeout) { window.clearTimeout(this.autoRefreshTimeout); } }; this._doRefresh = function() { if (!DayPilot.Global.resizing && !DayPilot.Global.moving && !DayPilotCalendar.drag && !DayPilotCalendar.selecting) { var skip = false; if (typeof this.onAutoRefresh === 'function') { var args = {}; args.i = this.autoRefreshCount; args.preventDefault = function() { this.preventDefault.value = true; }; calendar.onAutoRefresh(args); if (args.preventDefault.value) { skip = true; } } if (!skip && this._serverBased()) { this.commandCallBack(this.autoRefreshCommand); } this.autoRefreshCount++; /* this.autoRefreshCount++; this.commandCallBack(this.autoRefreshCommand); */ } if (this.autoRefreshCount < this.autoRefreshMaxCount) { this.autoRefreshTimeout = window.setTimeout(function() { calendar._doRefresh(); }, this.autoRefreshInterval * 1000); } }; this._onResize = function() { if (calendar.heightSpec === "Parent100Pct") { calendar.setHeight(parseInt(calendar.nav.top.clientHeight, 10)); } calendar._updateHeight(); calendar._updateScrollLabels(); }; this._registerGlobalHandlers = function() { if (!DayPilotCalendar.globalHandlers) { DayPilotCalendar.globalHandlers = true; DayPilot.re(document, 'mousemove', DayPilotCalendar.gMouseMove); DayPilot.re(document, 'mouseup', DayPilotCalendar.gMouseUp); DayPilot.re(document, DayPilot.touch.move, DayPilotCalendar.gTouchMove); DayPilot.re(document, DayPilot.touch.end, DayPilotCalendar.gTouchEnd); //DayPilot.re(window, 'unload', DayPilotCalendar.gUnload); } DayPilot.re(window, 'resize', this._onResize); }; this._onEventMouseDown = function(ev) { if (touch.active || touch.using) { // ie return; } ev = ev || window.event; var button = DayPilot.Util.mouseButton(ev); if (typeof (DayPilotBubble) !== 'undefined') { DayPilotBubble.hideActive(); } if ((this.style.cursor === 'n-resize' || this.style.cursor === 's-resize') && button.left) { // set DayPilot.Global.resizing = this; DayPilotCalendar.originalMouse = DayPilot.mc(ev); DayPilotCalendar.originalHeight = this.offsetHeight; DayPilotCalendar.originalTop = this.offsetTop; // shadow // 1 line, moved to scroll.mousemove //DayPilotCalendar.resizingShadow = DayPilotCalendar.createShadow(this, false, calendar.shadow); // cursor //document.body.style.cursor = this.style.cursor; calendar.nav.top.style.cursor = this.style.cursor; // disabled, causes problems, maybe even leaks //this.onclickSave = this.onclick; //this.onclick = null; } else if ((this.style.cursor === 'move' || (calendar.moveBy === 'Full' && this.event.client.moveEnabled())) && button.left) { DayPilot.Global.moving = this; var helper = DayPilot.Global.moving.helper = {}; helper.oldColumn = calendar._columnsBottom[this.event.part.dayIndex].id; DayPilotCalendar.originalMouse = DayPilot.mc(ev); DayPilotCalendar.originalTop = this.offsetTop; var offset = DayPilot.mo3(this, ev); if (offset) { DayPilotCalendar.moveOffsetY = offset.y; } else { DayPilotCalendar.moveOffsetY = 0; } calendar.nav.top.style.cursor = this.style.cursor; } return false; }; this._doBeforeEventRender = function(i) { var cache = this._cache.events; var data = this.events.list[i]; var evc = {}; // make a copy for (var name in data) { evc[name] = data[name]; } if (calendar.showEventStartEnd) { var sameday = data.start.getDatePart().getTime() === data.end.getDatePart().getTime(); var pattern = sameday ? resolved.locale().timePattern : resolved.locale().dateTimePattern; var startTime = data.start.toString(pattern); var endTime = data.end.toString(pattern); evc.html = evc.text + " (" + startTime + " - " + endTime + ")"; } /* string startTime = e.Start.ToShortTimeString(); string endTime = e.End.ToShortTimeString(); if (e.Start.Date != e.End.Date) { startTime = e.Start.ToShortDateString() + " " + startTime; endTime = e.End.ToShortDateString() + " " + endTime; } */ if (typeof this.onBeforeEventRender === 'function') { var args = {}; args.e = evc; this.onBeforeEventRender(args); } cache[i] = evc; }; this._touch = {}; var touch = calendar._touch; touch.active = false; touch.start = null; touch.timeout = null; touch.startcell = null; this._touch.getCellCoords = function(ev) { var x, y; if (ev.touches) { x = ev.touches[0].pageX; y = ev.touches[0].pageY; } else { x = ev.pageX; y = ev.pageY; } var abs = DayPilot.abs(calendar.nav.main); var pos = {x: x - abs.x, y: y - abs.y}; var w = (calendar.nav.main.clientWidth / calendar._columnsBottom.length); var coords = { "pageX": x, "pageY": y, "x": Math.floor(pos.x / w), "y": Math.floor(pos.y / calendar.cellHeight), "toString" : function() { return "x: " + this.x + " y:" + this.y; } }; return coords; }; this._touch.startSelecting = function(coords) { var cell = calendar.nav.main.rows[coords.y].cells[coords.x]; touch.startcell = coords; calendar.clearSelection(); // don't use this flag, it's for mouse cursor // DayPilotCalendar.selecting = true; DayPilotCalendar.column = DayPilotCalendar.getColumn(cell); calendar.selectedCells.push(cell); DayPilotCalendar.firstSelected = cell; DayPilotCalendar.topSelectedCell = cell; DayPilotCalendar.bottomSelectedCell = cell; calendar._activateSelection(); }; this._touch.extendSelection = function(coords) { var cell = calendar.nav.main.rows[coords.y].cells[coords.x]; calendar.clearSelection(); // new selected cells if (coords.y < touch.startcell.y) { calendar.selectedCells = DayPilotCalendar.getCellsBelow(cell); DayPilotCalendar.topSelectedCell = calendar.selectedCells[0]; DayPilotCalendar.bottomSelectedCell = DayPilotCalendar.firstSelected; } else { calendar.selectedCells = DayPilotCalendar.getCellsAbove(cell); DayPilotCalendar.topSelectedCell = DayPilotCalendar.firstSelected; DayPilotCalendar.bottomSelectedCell = calendar.selectedCells[0]; } calendar._activateSelection(); }; /* this._touch.onCellTouchStart = function(ev) { if (touch.active) { return; } touch.using = true; var coords = touch.getCellCoords(ev); var holdfor = 500; touch.timeout = window.setTimeout(function() { touch.active = true; switch (calendar.timeRangeTapAndHoldHandling) { case "Select": touch.startSelecting(coords); break; case "ContextMenu": // TODO select it touch.startSelecting(coords); touch.active = false; // prevent the default selection action // invoke menu if (calendar.contextMenuSelection) { calendar.contextMenuSelection.show(calendar.getSelection()); } break; } }, holdfor); }; */ this._touch.onMainTouchStart = function(ev) { if (DayPilot.Util.isMouseEvent(ev)) { return; } if (touch.active) { return; } touch.using = true; var coords = touch.getCellCoords(ev); touch.startCoords = coords; var holdfor = calendar.tapAndHoldTimeout; touch.timeout = window.setTimeout(function() { ev.preventDefault(); touch.active = true; switch (calendar.timeRangeTapAndHoldHandling) { case "Select": touch.startSelecting(coords); break; case "ContextMenu": // TODO select it touch.startSelecting(coords); touch.active = false; // prevent the default selection action // invoke menu if (calendar.contextMenuSelection) { calendar.contextMenuSelection.show(calendar.getSelection()); } break; } }, holdfor); }; this._touch.onCellTouchMove = function(ev) { /* // regular move if (!touch.active) { window.clearTimeout(touch.timeout); return; } ev.preventDefault(); if (!ev.touches[0]) { return; } //var x = ev.touches[0].pageX; //var y = ev.touches[0].pageY; var coords = touch.getCellCoords(ev); $("#touch").html(new DayPilot.Date() + " Extending selection to: " + coords); touch.extendSelection(coords); */ }; this._touch.onCellTouchEnd = function(ev) { if (!touch.active) { window.clearTimeout(touch.timeout); // not sure return; } ev.preventDefault(); touch.startcell = null; var sel = calendar.getSelection(); sel.toString = function() { return "start: " + this.start + "\nend: " + this.end; }; calendar._timeRangeSelectedDispatch(sel.start, sel.end, sel.resource); // prevent alert-initiated touchstart on iOS window.setTimeout(function() { touch.active = false; }, 500); }; this._touch.startMoving = function(div, coords) { //document.title = "startMoving/div.event.id(): " + div.event.id(); DayPilot.Global.moving = div; var helper = DayPilot.Global.moving.helper = {}; helper.oldColumn = calendar._columnsBottom[div.event.part.dayIndex].id; DayPilotCalendar.originalMouse = coords; DayPilotCalendar.originalTop = this.offsetTop; var abs = DayPilot.abs(div); DayPilotCalendar.moveOffsetY = coords.y - abs.y; //document.title = "moveOffsetY:" + DayPilotCalendar.moveOffsetY; if (!DayPilotCalendar.movingShadow) { DayPilotCalendar.movingShadow = calendar._createShadow(DayPilot.Global.moving, !calendar._browser.ie, calendar.shadow); DayPilotCalendar.movingShadow.style.width = (DayPilotCalendar.movingShadow.parentNode.offsetWidth + 1) + 'px'; } }; // coords relative to main this._touch.updateMoving = function() { var coords = calendar.coords; var _step = calendar.cellHeight; var _startOffset = 0; var offset = DayPilotCalendar.moveOffsetY; if (!offset) { offset = _step / 2; // for external drag } var newTop = Math.floor(((coords.y - offset - _startOffset) + _step / 2) / _step) * _step + _startOffset; if (newTop < _startOffset) { newTop = _startOffset; } var main = calendar.nav.main; var max = main.clientHeight; var height = parseInt(DayPilotCalendar.movingShadow.style.height); // DayPilotCalendar.moving.data.height if (newTop + height > max) { newTop = max - height; } DayPilotCalendar.movingShadow.style.top = newTop + 'px'; var colWidth = main.clientWidth / main.rows[0].cells.length; var column = Math.floor(coords.x / colWidth); if (column < 0) { column = 0; } var events = calendar.nav.events; if (column < events.rows[0].cells.length && column >= 0 && DayPilotCalendar.movingShadow.column !== column) { DayPilotCalendar.movingShadow.column = column; DayPilotCalendar.moveShadow(events.rows[0].cells[column]); } }; this._touch.onEventTouchStart = function(ev) { if (touch.active) { return; } if (DayPilot.Util.isMouseEvent(ev)) { return; } ev.stopPropagation(); touch.preventEventTap = false; touch.using = true; // ie touch.startCoords = touch.getCellCoords(ev); var div = this; var x = ev.touches ? ev.touches[0].pageX : ev.pageX; var y = ev.touches ? ev.touches[0].pageY : ev.pageY; var coords = { x: x, y: y, div: this}; // nav.scrollable is a wrong reference //var abs = DayPilot.abs(calendar.nav.scrollable); calendar.coords = touch.relativeCoords(ev); var holdfor = calendar.tapAndHoldTimeout; touch.timeout = window.setTimeout(function() { touch.active = true; switch (calendar.eventTapAndHoldHandling) { case "Move": touch.startMoving(div, coords); break; case "ContextMenu": var e = div.event; var menu = e.client.contextMenu(); if (DayPilot.Menu) { DayPilot.Menu.touchPosition(ev); } if (menu) { menu.show(e); } else { if (calendar.contextMenu) { calendar.contextMenu.show(e); } } break; } }, holdfor); }; this._touch.onMainTouchMove = function(ev) { if (DayPilot.Util.isMouseEvent(ev)) { return; } if (touch.timeout) { var coords = touch.getCellCoords(ev); if (coords && touch.startCoords) { if (coords.pageX !== touch.startCoords.pageX || coords.pageY !== touch.startCoords.pageY) { window.clearTimeout(calendar._touch.timeout); } } } if (DayPilot.Global.moving && DayPilotCalendar.movingShadow) { ev.preventDefault(); calendar.coords = touch.relativeCoords(ev); touch.updateMoving(); return; } else if (touch.startcell) { ev.preventDefault(); if (!touch.active) { window.clearTimeout(touch.timeout); return; } var coords = touch.getCellCoords(ev); touch.extendSelection(coords); } touch.preventEventTap = true; }; this._touch.relativeCoords = function(ev) { var ref = calendar.nav.main; var x = ev.touches ? ev.touches[0].pageX : ev.pageX; var y = ev.touches ? ev.touches[0].pageY : ev.pageY; var abs = DayPilot.abs(ref); var coords = {x: x - abs.x, y: y - abs.y, "toString": function() { return "x: " + this.x + ", y:" + this.y; } }; return coords; }; this._touch.onMainTouchEnd = function(ev) { if (DayPilot.Util.isMouseEvent(ev)) { return; } if (DayPilot.Global.moving) { touch.active = false; // testing: disabled ev.preventDefault(); ev.stopPropagation(); var top = DayPilotCalendar.movingShadow.offsetTop; DayPilotCalendar.deleteShadow(DayPilotCalendar.movingShadow); var dpEvent = DayPilot.Global.moving.event; var newColumnIndex = DayPilotCalendar.movingShadow.column; // stop moving on the client DayPilot.Global.moving = null; DayPilotCalendar.movingShadow = null; dpEvent.calendar._eventMoveDispatch(dpEvent, newColumnIndex, top, ev, DayPilotCalendar.drag); } else if (touch.startcell) { if (!touch.active) { window.clearTimeout(touch.timeout); // not sure return; } ev.preventDefault(); touch.startcell = null; var sel = calendar.getSelection(); sel.toString = function() { return "start: " + this.start + "\nend: " + this.end; }; calendar._timeRangeSelectedDispatch(sel.start, sel.end, sel.resource); // prevent alert-initiated touchstart on iOS window.setTimeout(function() { touch.active = false; }, 500); } }; this._touch.onEventTouchMove = function(ev) { // don't call ev.stopPropagation() here, it would prevent moving the event shadow touch.preventEventTap = true; }; this._touch.onEventTouchEnd = function(ev) { if (DayPilot.Util.isMouseEvent(ev)) { return; } // quick tap if (!touch.active) { if (touch.preventEventTap) { return; } ev.preventDefault(); window.clearTimeout(touch.timeout); calendar._eventClickSingle(this, false); return; } touch.active = false; if (touch.timeout) { window.clearTimeout(touch.timeout); return; } ev.preventDefault(); }; this._onEventMouseMove = function(ev) { // const var resizeMargin = 5; var moveMargin = Math.max(calendar.durationBarWidth, 10); var w = 5; var header = (calendar.moveBy === 'Top'); if (typeof (DayPilotCalendar) === 'undefined') { return; } // position var offset = DayPilot.mo3(this, ev); if (!offset) { return; } var div = this; if (!div.active) { var areas = []; if (div.event.client.deleteEnabled()) { areas.push({"action":"JavaScript","v":"Hover","w":17,"h":17,"top":2,"right":2, "css": calendar._prefixCssClass("_event_delete"),"js":function(e) { calendar._eventDeleteDispatch(e); } }); } var list = div.event.cache ? div.event.cache.areas : div.event.data.areas; if (list && list.length > 0) { areas = areas.concat(list); } DayPilot.Areas.showAreas(div, div.event, null, areas); if (calendar.cssOnly) { DayPilot.Util.addClass(div, calendar._prefixCssClass("_event_hover")); } //DayPilot.Areas.showAreas(div, this.event); } if (DayPilot.Global.resizing || DayPilot.Global.moving) { return; } var isFirstPart = this.isFirst; var isLastPart = this.isLast; if (calendar.moveBy === "Disabled" || calendar.moveBy === "None") { return; } if (!header && offset.x <= moveMargin && this.event.client.moveEnabled()) { if (isFirstPart) { this.style.cursor = 'move'; } else { this.style.cursor = 'not-allowed'; } } else if (!header && offset.y <= resizeMargin && this.event.client.resizeEnabled()) { if (isFirstPart) { this.style.cursor = "n-resize"; this.dpBorder = 'top'; } else { this.style.cursor = 'not-allowed'; } } else if (header && offset.y <= moveMargin && this.event.client.moveEnabled()) { this.style.cursor = "move"; } else if (this.offsetHeight - offset.y <= resizeMargin && this.event.client.resizeEnabled()) { if (isLastPart) { this.style.cursor = "s-resize"; this.dpBorder = 'bottom'; } else { this.style.cursor = 'not-allowed'; } } else if (!DayPilot.Global.resizing && !DayPilot.Global.moving) { if (this.event.client.clickEnabled()) this.style.cursor = 'pointer'; else this.style.cursor = 'default'; } if (typeof (DayPilotBubble) !== 'undefined' && calendar.bubble && calendar.eventHoverHandling !== 'Disabled') { if (this.style.cursor === 'default' || this.style.cursor === 'pointer') { var notMoved = this._lastOffset && offset.x === this._lastOffset.x && offset.y === this._lastOffset.y; if (!notMoved) { this._lastOffset = offset; calendar.bubble.showEvent(this.event); } //calendar.bubble.showEvent(this.event); } else { // disabled, hiding on click //DayPilotBubble.hideActive(); } } }; this._onEventMouseOut = function(ev) { if (calendar.cssOnly) { DayPilot.Util.removeClass(this, calendar._prefixCssClass("_event_hover")); } if (calendar.bubble) { calendar.bubble.hideOnMouseOut(); } DayPilot.Areas.hideAreas(this, ev); }; this._currentTimeTimeout = null; this._showCurrentTime = function() { if (this.showCurrentTime) { this._clearSeparators(); this._drawSeparator(new DayPilot.Date()); if (this.nav.events && !this._currentTimeTimeout) { // not disposed var refreshIntervalSeconds = 30; this._currentTimeTimeout = setTimeout(function() { calendar._currentTimeTimeout = null; calendar._showCurrentTime(); }, refreshIntervalSeconds * 1000); } } }; this._clearSeparators = function() { DayPilot.de(calendar.elements.separators); calendar.elements.separators = []; }; this._drawSeparator = function(date) { var ticks = date.getTime(); var main = calendar.nav.events; if (!main) { return; } for(var i = 0; i < calendar._columnsBottom.length; i++) { var col = calendar._columnsBottom[i]; var duration = calendar._duration(true); var colStart = new DayPilot.Date(col.start).addHours(this._visibleStart(true)); var colStartTicks = colStart.getTime(); var colEnd = colStart.addTime(duration); var colEndTicks = colEnd.getTime(); if (colStartTicks <= ticks && ticks <= colEndTicks) { var partStartPixels = this._getPixels(date, col.start).top - 1; var cell = main.rows[0].cells[i]; var wrap = cell.separators; var div = document.createElement("div"); div.style.position = "absolute"; div.style.top = partStartPixels + "px"; div.style.height = "1px"; div.style.left = "0px"; div.style.right = "0px"; div.className = calendar._prefixCssClass("_now"); wrap.insertBefore(div, wrap.firstChild); calendar.elements.separators.push(div); } } }; this._loadEvents = function(events) { if (!events) { events = this.events.list; } else { this.events.list = events; } if (!events) { return; } this._allDay = {}; this._allDay.events = []; this._allDay.lines = []; var length = events.length; var duration = this._duration(true); this._cache.pixels = {}; var loadCache = []; this._scrollLabels = []; this._minStart = 10000; this._maxEnd = 0; // make sure it's DayPilot.Date this.startDate = new DayPilot.Date(this.startDate); for (var i = 0; i < length; i++) { var e = events[i]; e.start = new DayPilot.Date(e.start); e.end = new DayPilot.Date(e.end); } if (typeof this.onBeforeEventRender === 'function' || calendar.showEventStartEnd) { // make sure .html is pregenerated for showEventStartEnd for (var i = 0; i < length; i++) { //var e = events[i]; this._doBeforeEventRender(i); } } var isResourcesView = this.viewType === 'Resources'; var visible = this._getVisibleRange(); var allStart = visible.start; var allEnd = visible.end; //calendar.debug.message("allStart: " + allStart); for (var i = 0; i < this._columnsBottom.length; i++) { var scroll = {}; scroll.minEnd = 1000000; scroll.maxStart = -1; this._scrollLabels.push(scroll); var col = this._columnsBottom[i]; col.events = []; col.lines = []; col.blocks = []; var colStart = new DayPilot.Date(col.start).addHours(this._visibleStart(true)); var colStartTicks = colStart.getTime(); var colEnd = colStart.addTime(duration); var colEndTicks = colEnd.getTime(); if (isResourcesView) { allStart = colStart.getDatePart(); allEnd = colEnd.getDatePart(); } for (var j = 0; j < length; j++) { if (loadCache[j]) { continue; } var e = events[j]; var start = e.start; var end = e.end; var startTicks = start.getTime(); var endTicks = end.getTime(); if (endTicks < startTicks) { // skip invalid events continue; } if (e.allday) { var belongsHere = false; if (calendar.allDayEnd === 'Date') { belongsHere = !(endTicks < allStart.getTime() || startTicks >= allEnd.getTime()); } else { belongsHere = !(endTicks <= allStart.getTime() || startTicks >= allEnd.getTime()); } if (isResourcesView) { belongsHere = belongsHere && (e.resource === col.id || col.id === "*"); } if (belongsHere) { var ep = new DayPilot.Event(e, this); ep.part.start = allStart.getTime() < startTicks ? start : allStart; ep.part.end = allEnd.getTime() > endTicks ? end : allEnd; ep.part.colStart = DayPilot.Date.daysDiff(allStart.d, ep.part.start.d); ep.part.colWidth = DayPilot.Date.daysSpan(ep.part.start.d, ep.part.end.d) + 1; if (isResourcesView) { ep.part.colStart = i; ep.part.colWidth = 1; } this._allDay.events.push(ep); if (typeof this.onBeforeEventRender === 'function' || calendar.showEventStartEnd) { ep.cache = this._cache.events[j]; } // always put into cache, it can have just one box loadCache[j] = true; if (isResourcesView && (ep.part.start.getTime() !== startTicks || ep.part.end.getTime() !== endTicks)) { loadCache[j] = false; } } continue; } // belongs here var belongsHere = false; if (isResourcesView) { belongsHere = (col.id === e.resource) && !(endTicks <= colStartTicks || startTicks >= colEndTicks); } else { belongsHere = !(endTicks <= colStartTicks || startTicks >= colEndTicks) || (endTicks === startTicks && startTicks === colStartTicks); } if (belongsHere) { var ep = new DayPilot.Event(e, calendar); ep.part.dayIndex = i; ep.part.start = colStartTicks < startTicks ? start : colStart; ep.part.end = colEndTicks > endTicks ? end : colEnd; var partStartPixels = this._getPixels(ep.part.start, col.start); var partEndPixels = this._getPixels(ep.part.end, col.start); var top = partStartPixels.top; var bottom = partEndPixels.top; // events in the hidden areas if (top === bottom && (partStartPixels.cut || partEndPixels.cut)) { continue; } ep.part.box = resolved.useBox(endTicks - startTicks); var _startOffset = 0; // continue here ************************** if (ep.part.box) { var boxBottom = partEndPixels.boxBottom; ep.part.top = Math.floor(top / this.cellHeight) * this.cellHeight + _startOffset; //ep.Height = Math.max(Math.ceil(boxBottom / this.cellHeight) * this.cellHeight - ep.Top, this.cellHeight - 1) + 1; ep.part.height = Math.max(Math.ceil(boxBottom / this.cellHeight) * this.cellHeight - ep.part.top, this.cellHeight - 1); ep.part.barTop = Math.max(top - ep.part.top - 1, 0); // minimum 0 ep.part.barHeight = Math.max(bottom - top - 2, 1); // minimum 1 } else { ep.part.top = top + _startOffset; ep.part.height = Math.max(bottom - top, 0); ep.part.barTop = 0; ep.part.barHeight = Math.max(bottom - top - 2, 1); } var start = ep.part.top; var end = ep.part.top + ep.part.height; if (start > scroll.maxStart) { scroll.maxStart = start; } if (end < scroll.minEnd) { scroll.minEnd = end; } if (start < this._minStart) { this._minStart = start; } if (end > this._maxEnd) { this._maxEnd = end; } col.events.push(ep); if (typeof this.onBeforeEventRender === 'function' || calendar.showEventStartEnd) { ep.cache = this._cache.events[j]; } if (ep.part.start.getTime() === startTicks && ep.part.end.getTime() === endTicks) { loadCache[j] = true; } } } } // sort events inside columns for (var i = 0; i < this._columnsBottom.length; i++) { var col = this._columnsBottom[i]; col.events.sort(this._eventComparer); // put into lines for (var j = 0; j < col.events.length; j++) { var e = col.events[j]; col.putIntoBlock(e); } for (var j = 0; j < col.blocks.length; j++) { var block = col.blocks[j]; block.events.sort(this._eventComparerCustom); for (var k = 0; k < block.events.length; k++) { var e = block.events[k]; block.putIntoLine(e); } } } // sort allday events this._allDay.events.sort(this._eventComparerCustom); this._allDay.putIntoLine = function(ep) { var thisCol = this; for (var i = 0; i < this.lines.length; i++) { var line = this.lines[i]; if (line.isFree(ep.part.colStart, ep.part.colWidth)) { line.push(ep); return i; } } var line = []; line.isFree = function(start, width) { //var free = true; var end = start + width - 1; var max = this.length; for (var i = 0; i < max; i++) { var e = this[i]; if (!(end < e.part.colStart || start > e.part.colStart + e.part.colWidth - 1)) { return false; } } return true; }; line.push(ep); this.lines.push(line); return this.lines.length - 1; }; for (var i = 0; i < this._allDay.events.length; i++) { var e = this._allDay.events[i]; this._allDay.putIntoLine(e); } var lines = Math.max(this._allDay.lines.length, 1); this._cache.allDayHeaderHeight = lines * (resolved.allDayEventHeight() + 2) + 2; // overriding }; this._eventComparer = function(a, b) { if (!a || !b || !a.start || !b.start) { return 0; // no sorting, invalid arguments } var byStart = a.start().ticks - b.start().ticks; if (byStart !== 0) { return byStart; } var byEnd = b.end().ticks - a.end().ticks; // desc return byEnd; }; this._eventComparerCustom = function(a, b) { if (!a || !b) { //calendar.debug("no sorting, invalid arguments"); return 0; // no sorting, invalid arguments } if (!a.data || !b.data || !a.data.sort || !b.data.sort || a.data.sort.length === 0 || b.data.sort.length === 0) { // no custom sorting, using default sorting (start asc, end asc); //calendar.debug("using default comparer: " + a.Sort + ' ' + b.Sort); return calendar._eventComparer(a, b); } //calendar.debug("using custom comparer"); var result = 0; var i = 0; while (result === 0 && a.data.sort[i] && b.data.sort[i]) { if (a.data.sort[i] === b.data.sort[i]) { result = 0; } else { result = calendar._stringComparer(a.data.sort[i], b.data.sort[i], calendar.sortDirections[i]); } i++; } return result; }; this._stringComparer = function(a, b, direction) { var asc = (direction !== "desc"); var aFirst = asc ? -1 : 1; var bFirst = -aFirst; if (a === null && b === null) { return 0; } // nulls first if (b === null) { // b is smaller return bFirst; } if (a === null) { return aFirst; } //return asc ? a.localeCompare(a, b) : -a.localeCompare(a, b); var ar = []; ar[0] = a; ar[1] = b; ar.sort(); return a === ar[0] ? aFirst : bFirst; }; this._findEventDiv = function(e) { for (var i = 0; i < calendar.elements.events.length; i++) { var div = calendar.elements.events[i]; if (div.event === e || div.event.data === e.data) { return div; } } return null; }; this.events.find = function(id) { if (!calendar.events.list || typeof calendar.events.list.length === 'undefined') { return null; } var len = calendar.events.list.length; for (var i = 0; i < len; i++) { if (calendar.events.list[i].id === id) { return new DayPilot.Event(calendar.events.list[i], calendar); } } return null; }; this.events.findRecurrent = function(masterId, time) { if (!calendar.events.list || typeof calendar.events.list.length === 'undefined') { return null; } var len = calendar.events.list.length; for (var i = 0; i < len; i++) { if (calendar.events.list[i].recurrentMasterId === masterId && calendar.events.list[i].start.getTime() === time.getTime()) { return new DayPilot.Event(calendar.events.list[i], calendar); } } return null; }; this.events.update = function(e, data) { var params = {}; params.oldEvent = new DayPilot.Event(e.copy(), calendar); params.newEvent = new DayPilot.Event(e.temp(), calendar); var action = new DayPilot.Action(calendar, "EventUpdate", params, data); e.commit(); if (calendar._initialized) { calendar.update(); } calendar._angular.notify(); return action; }; this.events.remove = function(e, data) { var params = {}; params.e = new DayPilot.Event(e.data, calendar); var action = new DayPilot.Action(calendar, "EventRemove", params, data); var index = DayPilot.indexOf(calendar.events.list, e.data); calendar.events.list.splice(index, 1); if (calendar._initialized) { calendar.update(); } calendar._angular.notify(); return action; }; this.events.add = function(e, data) { e.calendar = calendar; if (!calendar.events.list) { calendar.events.list = []; } calendar.events.list.push(e.data); var params = {}; params.e = e; var action = new DayPilot.Action(calendar, "EventAdd", params, data); if (calendar._initialized) { calendar.update(); } calendar._angular.notify(); return action; }; this.queue = {}; this.queue.list = []; this.queue.list.ignoreToJSON = true; this.queue.add = function(action) { if (!action) { return; } if (action.isAction) { calendar.queue.list.push(action); } else { throw "DayPilot.Action object required for queue.add()"; } }; this.queue.notify = function(data) { var params = {}; params.actions = calendar.queue.list; calendar._callBack2('Notify', params, data, "Notify"); calendar.queue.list = []; }; this.queue.clear = function() { calendar.queue.list = []; }; this.queue.pop = function() { return calendar.queue.list.pop(); }; this._update = function(args) { if (!this._initialized || !this._columnsBottom) { // not initialized yet, don't update return; } var args = args || {}; var full = !args.eventsOnly; if (!calendar.cssOnly) { calendar.cssOnly = true; DayPilot.Util.log("DayPilot: cssOnly = false mode is not supported since DayPilot Pro 8.0."); } if (full) { //this.columns = null; // make sure it's created from scratch calendar._deleteEvents(); this._prepareVariables(); this._prepareColumns(); this._loadEvents(); calendar._drawHeader(); calendar._autoHeaderHeight(); calendar._deleteScrollLabels(); calendar._updateMessagePosition(); calendar._hideSelection(); calendar._drawMain(); calendar._activateSelection(); calendar._drawHourTable(); calendar._updateHeight(); calendar._fixScrollHeader(); calendar._updateColumnWidthSpec(); this._drawEvents(); this._drawEventsAllDay(); this._showCurrentTime(); calendar._updateScrollLabels(); } else { // events only calendar._deleteEvents(); calendar._loadEvents(); calendar._updateHeaderHeight(); calendar._drawEvents(); calendar._drawEventsAllDay(); calendar._updateScrollLabels(); } if (this.visible) { this.show(); } else { this.hide(); } }; this.update = function() { this._update(); }; this.show = function() { calendar.visible = true; calendar.nav.top.style.display = ''; calendar._onResize(); calendar._fixScrollHeader(); }; this.hide = function() { calendar.visible = false; calendar.nav.top.style.display = 'none'; }; this._angular = {}; this._angular.scope = null; this._angular.notify = function() { if (calendar._angular.scope) { calendar._angular.scope["$apply"](); } }; this.debug = new DayPilot.Debug(this); this._getPixels = function(date, start) { if (!start) start = this.startDate; var startTicks = start.getTime(); var ticks = date.getTime(); var cache = this._cache.pixels[ticks + "_" + startTicks]; if (cache) { return cache; } startTicks = start.addHours(this._visibleStart(true)).getTime(); var boxTicks = this.cellDuration * 60 * 1000; var topTicks = ticks - startTicks; var boxOffsetTicks = topTicks % boxTicks; var boxStartTicks = topTicks - boxOffsetTicks; var boxEndTicks = boxStartTicks + boxTicks; if (boxOffsetTicks === 0) { boxEndTicks = boxStartTicks; } // it's linear scale so far var result = {}; result.cut = false; result.top = this._ticksToPixels(topTicks); result.boxTop = this._ticksToPixels(boxStartTicks); result.boxBottom = this._ticksToPixels(boxEndTicks); this._cache.pixels[ticks + "_" + startTicks] = result; return result; }; this._ticksToPixels = function(ticks) { return Math.floor((this.cellHeight * ticks) / (1000 * 60 * this.cellDuration)); }; this._prepareVariables = function() { this.startDate = new DayPilot.Date(this.startDate).getDatePart(); this.allDayHeaderHeight = resolved.allDayEventHeight() + 4; }; this._updateHeaderHeight = function() { var header = this._totalHeaderHeight(); var total = this._totalHeight(); //var scroll = total - header; if (this.nav.corner) { this.nav.corner.style.height = header + "px"; } if (this.nav.cornerRight) { this.nav.cornerRight.style.height = header + "px"; } if (this.nav.mid) { this.nav.mid.style.height = header + "px"; } if (this.showAllDayEvents && this.nav.header) { var row = this.nav.header.rows[this.nav.header.rows.length - 1]; for (var i = 0; i < row.cells.length; i++) { var column = row.cells[i]; column.firstChild.style.height = resolved.allDayHeaderHeight() + "px"; } } if (this.nav.upperRight) { this.nav.upperRight.style.height = header + "px"; } this.nav.scroll.style.top = header + "px"; this.nav.top.style.height = total + "px"; /* if (this.heightSpec === "Parent100Pct") { this.nav.scroll.style.height = scroll + "px"; }*/ }; this._updateHeight = function() { var sh = this._getScrollableHeight(); if (this.nav.scroll && sh > 0) { this.nav.scroll.style.height = sh + "px"; this.scrollHeight = calendar.nav.scroll.clientHeight; // scrolling if (this.nav.bottomLeft) { this.nav.bottomLeft.style.height = sh + "px"; } if (this.nav.bottomRight) { this.nav.bottomRight.style.height = sh + "px"; } } if (this.heightSpec === "Parent100Pct") { this.nav.top.style.height = "100%"; } else { this.nav.top.style.height = this._totalHeight() + "px"; } }; this.setHeight = function(pixels) { if (this.heightSpec !== "Parent100Pct") { this.heightSpec = "Fixed"; } if (this.cssOnly) { this.height = pixels - (this._totalHeaderHeight()); } else { this.height = pixels - (this._totalHeaderHeight() + 3); // guess value } this._updateHeight(); }; this._getDimensionsFromCss = function(className) { var div = document.createElement("div"); div.style.position = "absolute"; div.style.top = "-2000px"; div.style.left = "-2000px"; div.className = this._prefixCssClass(className); document.body.appendChild(div); var height = div.offsetHeight; var width = div.offsetWidth; document.body.removeChild(div); var result = {}; result.height = height; result.width = width; return result; }; this._resolved = {}; var resolved = this._resolved; resolved.locale = function() { return DayPilot.Locale.find(calendar.locale); }; resolved.weekStarts = function() { if (typeof calendar.weekStarts !== 'undefined') { return calendar.weekStarts; } else { return resolved.locale().weekStarts; // Monday } }; resolved.timeFormat = function() { if (calendar.timeFormat !== 'Auto') { return calendar.timeFormat; } return this.locale().timeFormat; }; resolved.useBox = function(durationTicks) { if (calendar.useEventBoxes === 'Always') { return true; } if (calendar.useEventBoxes === 'Never') { return false; } return durationTicks < calendar.cellDuration * 60 * 1000; }; resolved.notifyType = function() { var type; if (calendar.notifyCommit === 'Immediate') { type = "Notify"; } else if (calendar.notifyCommit === 'Queue') { type = "Queue"; } else { throw "Invalid notifyCommit value: " + calendar.notifyCommit; } return type; }; resolved.allDayEventHeight = function() { if (calendar._cache.allDayEventHeight) { return calendar._cache.allDayEventHeight; } var height = calendar._getDimensionsFromCss("_alldayevent_height").height; if (!height) { height = calendar.allDayEventHeight; } calendar._cache.allDayEventHeight = height; return height; }; resolved.allDayHeaderHeight = function() { if (calendar._cache.allDayHeaderHeight) { return calendar._cache.allDayHeaderHeight; } var height = calendar.allDayHeaderHeight; calendar._cache.allDayHeaderHeight = height; return height; }; resolved.headerHeight = function() { if (calendar._cache.headerHeight) { return calendar._cache.headerHeight; } var height = calendar._getDimensionsFromCss("_header_height").height; if (!height) { height = calendar.headerHeight; } calendar._cache.headerHeight = height; return height; }; this._isShortInit = function() { // make sure it has a place to ask if (this.backendUrl) { return (typeof calendar.events.list === 'undefined') || (!calendar.events.list); } else { return false; } }; this._loadTop = function() { if (this.id && this.id.tagName) { this.nav.top = this.id; } else if (typeof this.id === "string") { this.nav.top = document.getElementById(this.id); if (!this.nav.top) { throw "DayPilot.Calendar: The placeholder element not found: '" + id + "'."; } } else { throw "DayPilot.Calendar() constructor requires the target element or its ID as a parameter"; } }; this._initShort = function() { this._loadTop(); this._prepareVariables(); this._prepareColumns(); this._drawTop(); this._drawHeader(); this._autoHeaderHeight(); this._drawMain(); this._fixScrollHeader(); this._enableScrolling(); this._registerGlobalHandlers(); this._registerDispose(); DayPilotCalendar.register(this); this._onResize(); // adjust the height if 100% this._showCurrentTime(); this._waitForVisibility(); this._startAutoRefresh(); this._callBack2('Init'); }; this.init = function() { this._loadTop(); if (this.nav.top.dp) { return; } var loadFromServer = this._isShortInit(); if (!calendar.cssOnly) { calendar.cssOnly = true; DayPilot.Util.log("DayPilot: cssOnly = false mode is not supported since DayPilot Pro 8.0."); } if (loadFromServer) { this._initShort(); this._initialized = true; return; } this._prepareVariables(); this._prepareColumns(); this._expandCellProperties(); if (this.events.list) { // are events available? this._loadEvents(); } this._drawTop(); this._drawHeader(); this._autoHeaderHeight(); this._drawMain(); this._show(); this._updateColumnWidthSpec(); this._fixScrollHeader(); this._enableScrolling(); this._registerGlobalHandlers(); this._registerDispose(); DayPilotCalendar.register(this); if (this.events.list) { // are events available? this._updateHeaderHeight(); this._drawEvents(); this._drawEventsAllDay(); } this._onResize(); // adjust the height if 100% if (this.messageHTML) { this.message(this.messageHTML); } this._showCurrentTime(); this._fireAfterRenderDetached(null, false); this._waitForVisibility(); this._startAutoRefresh(); this._initialized = true; this._postInit(); }; this._specialHandling = null; this._loadOptions = function(options) { var specialHandling = { "events": { "preInit": function() { var events = this.data; if (!events) { return; } if (DayPilot.isArray(events.list)) { calendar.events.list = events.list; } else { calendar.events.list = events; } } }, "scrollToHour": { "postInit": function() { if (typeof this.data !== 'undefined') { calendar.scrollToHour(this.data); } } } }; this._specialHandling = specialHandling; for (var name in options) { if (specialHandling[name]) { var item = specialHandling[name]; item.data = options[name]; if (item.preInit) { item.preInit(); } } else { calendar[name] = options[name]; } } }; this._postInit = function() { var specialHandling = this._specialHandling; for (var name in specialHandling) { var item = specialHandling[name]; if (item.postInit) { item.postInit(); } } }; // communication between components this.internal = {}; // ASP.NET this.internal.initialized = function() { return calendar._initialized; }; // DayPilot.Action this.internal.invokeEvent = this._invokeEvent; // DayPilot.Menu this.internal.eventMenuClick = this._eventMenuClick; this.internal.timeRangeMenuClick = this._timeRangeMenuClick; // DayPilot.Bubble this.internal.bubbleCallBack = this._bubbleCallBack; this.internal.findEventDiv = this._findEventDiv; this.internal.eventDeleteDispatch = this._eventDeleteDispatch; this.internal.touch = this._touch; this.Init = this.init; this._loadOptions(options); }; var DayPilotCalendar = {}; // internal selecting //DayPilotCalendar.selectedCells = null; DayPilotCalendar.topSelectedCell = null; DayPilotCalendar.bottomSelectedCell = null; DayPilotCalendar.selecting = false; DayPilotCalendar.column = null; DayPilotCalendar.firstSelected = null; DayPilotCalendar.firstMousePos = null; // internal resizing DayPilotCalendar.originalMouse = null; DayPilotCalendar.originalHeight = null; DayPilotCalendar.originalTop = null; //DayPilotCalendar.resizing = null; DayPilotCalendar.globalHandlers = false; // internal moving //DayPilotCalendar.moving = null; //DayPilotCalendar.originalLeft = null; // internal editing DayPilotCalendar.editing = false; DayPilotCalendar.originalText = null; // scrollbar width //DayPilotCalendar.scrollWidth = null; // helpers DayPilotCalendar.register = function(calendar) { if (!DayPilotCalendar.registered) { DayPilotCalendar.registered = []; } var r = DayPilotCalendar.registered; for (var i = 0; i < r.length; i++) { if (r[i] === calendar) { return; } } r.push(calendar); }; /* DayPilotCalendar.unregister = function(calendar) { var a = DayPilotCalendar.registered; if (!a) { return; } var i = DayPilot.indexOf(a, calendar); if (i === -1) { return; } a.splice(i, 1); }; */ DayPilotCalendar.unregister = function(calendar) { var a = DayPilotCalendar.registered; if (a) { var i = DayPilot.indexOf(a, calendar); if (i !== -1) { a.splice(i, 1); } if (a.length === 0) { a = null; } } if (!a) { DayPilot.ue(document, 'mousemove', DayPilotCalendar.gMouseMove); DayPilot.ue(document, 'mouseup', DayPilotCalendar.gMouseUp); DayPilot.ue(document, 'touchmove', DayPilotCalendar.gTouchMove); DayPilot.ue(document, 'touchend', DayPilotCalendar.gTouchEnd); //DayPilot.ue(window, 'unload', DayPilotCalendar.gUnload); DayPilotCalendar.globalHandlers = false; } }; DayPilotCalendar.getCellsAbove = function(cell) { var array = []; var c = DayPilotCalendar.getColumn(cell); var tr = cell.parentNode; var select = null; while (tr && select !== DayPilotCalendar.firstSelected) { select = tr.getElementsByTagName("td")[c]; array.push(select); tr = tr.previousSibling; while (tr && tr.tagName !== "TR") { tr = tr.previousSibling; } } return array; }; DayPilotCalendar.getCellsBelow = function(cell) { var array = []; var c = DayPilotCalendar.getColumn(cell); var tr = cell.parentNode; var select = null; while (tr && select !== DayPilotCalendar.firstSelected) { select = tr.getElementsByTagName("td")[c]; array.push(select); tr = tr.nextSibling; while (tr && tr.tagName !== "TR") { tr = tr.nextSibling; } } return array; }; DayPilotCalendar.getColumn = function(cell) { var i = 0; while (cell.previousSibling) { cell = cell.previousSibling; if (cell.tagName === "TD") { i++; } } return i; }; DayPilotCalendar.getShadowColumn = function(object) { if (!object) { return null; } var parentTd = object.parentNode; while (parentTd && parentTd.tagName !== "TD") { parentTd = parentTd.parentNode; } return parentTd; }; DayPilotCalendar.gTouchMove = function(ev) { if (DayPilot.Util.isMouseEvent(ev)) { return; } if (DayPilotCalendar.drag) { ev.preventDefault(); var x = ev.touches ? ev.touches[0].pageX : ev.pageX; var y = ev.touches ? ev.touches[0].pageY : ev.pageY; var mousePos = {}; mousePos.x = x; mousePos.y = y; var calendar = (function() { var clientX = ev.touches ? ev.touches[0].clientX : ev.clientX; var clientY = ev.touches ? ev.touches[0].clientY : ev.clientY; var el = document.elementFromPoint(clientX, clientY); while (el && el.parentNode) { el = el.parentNode; if (el.daypilotMainD) { return el.calendar; } } return false; })(); if (calendar) { // hide the global shadow if (DayPilotCalendar.gShadow) { document.body.removeChild(DayPilotCalendar.gShadow); } DayPilotCalendar.gShadow = null; calendar.coords = calendar._touch.relativeCoords(ev); // copied from onmainmousemove if (!DayPilotCalendar.movingShadow && calendar.coords) { var shadow = calendar._createShadow(DayPilotCalendar.drag, false, DayPilotCalendar.drag.shadowType); if (shadow) { DayPilotCalendar.movingShadow = shadow; var now = new DayPilot.Date().getDatePart(); var ev = { 'value': DayPilotCalendar.drag.id, 'start': now, 'end': now.addSeconds(DayPilotCalendar.drag.duration), 'text': DayPilotCalendar.drag.text }; var event = new DayPilot.Event(ev, calendar); //event.calendar = calendar; //event.root = calendar; event.external = true; DayPilot.Global.moving = {}; DayPilot.Global.moving.event = event; DayPilot.Global.moving.helper = {}; } } if (DayPilot.Global.moving) { calendar._touch.updateMoving(); } } else { // hide the local shadow DayPilot.de(DayPilotCalendar.movingShadow); DayPilot.Global.moving = null; DayPilotCalendar.movingShadow = null; if (!DayPilotCalendar.gShadow) { DayPilotCalendar.gShadow = DayPilotCalendar.createGShadow(DayPilotCalendar.drag.shadowType); } var shadow = DayPilotCalendar.gShadow; shadow.style.left = mousePos.x + 'px'; shadow.style.top = mousePos.y + 'px'; } } }; DayPilotCalendar.gTouchEnd = function(ev) { if (DayPilot.Util.isMouseEvent(ev)) { return; } DayPilotCalendar.gMouseUp(ev); }; DayPilotCalendar.gMouseMove = function(ev) { if (typeof (DayPilotCalendar) === 'undefined') { return; } // quick and dirty inside detection // hack, but faster then recursing through the parents if (ev.insideMainD) { // FF return; } else if (ev.srcElement) { // IE if (ev.srcElement.inside) { return; } } var mousePos = DayPilot.mc(ev); if (DayPilotCalendar.drag) { document.body.style.cursor = 'move'; if (!DayPilotCalendar.gShadow) { DayPilotCalendar.gShadow = DayPilotCalendar.createGShadow(DayPilotCalendar.drag.shadowType); } //if (!DayPilotCalendar.dragInside) { var shadow = DayPilotCalendar.gShadow; shadow.style.left = mousePos.x + 'px'; shadow.style.top = mousePos.y + 'px'; //} DayPilot.Global.moving = null; DayPilotCalendar.deleteShadow(DayPilotCalendar.movingShadow); DayPilotCalendar.movingShadow = null; } for (var i = 0; i < DayPilotCalendar.registered.length; i++) { if (DayPilotCalendar.registered[i]._out) { DayPilotCalendar.registered[i]._out(); } } }; DayPilotCalendar.gUnload = function(ev) { if (!DayPilotCalendar.registered) { return; } var r = DayPilotCalendar.registered; for (var i = 0; i < r.length; i++) { var c = r[i]; //c.dispose(); DayPilotCalendar.unregister(c); } }; DayPilotCalendar.gMouseUp = function(e) { var e = e || window.event; /* if (e.preventDefault) { e.preventDefault(); } else { e.returnValue = false; } e.cancelBubble = true; if (e.stopPropagation) { e.stopPropagation(); }*/ if (DayPilot.Global.resizing) { if (!DayPilotCalendar.resizingShadow) { DayPilot.Global.resizing.style.cursor = 'default'; //document.body.style.cursor = 'default'; DayPilot.Global.resizing.event.calendar.nav.top.style.cursor = 'auto'; DayPilot.Global.resizing = null; return; } var dpEvent = DayPilot.Global.resizing.event; var border = DayPilot.Global.resizing.dpBorder; var height = DayPilotCalendar.resizingShadow.clientHeight; var top = DayPilotCalendar.resizingShadow.offsetTop; // stop resizing on the client DayPilotCalendar.deleteShadow(DayPilotCalendar.resizingShadow); DayPilotCalendar.resizingShadow = null; DayPilot.Global.resizing.style.cursor = 'default'; dpEvent.calendar.nav.top.style.cursor = 'auto'; //document.body.style.cursor = 'default'; DayPilot.Global.resizing.onclick = null; // trying to prevent onclick, the event should be always recreated DayPilot.Global.resizing = null; if (dpEvent.calendar.overlap) { // event overlap return; } // action here //if (dirty) { dpEvent.calendar._eventResizeDispatch(dpEvent, height, top, border); //} } else if (DayPilot.Global.moving) { if (!DayPilot.Global.moving.helper) { // UpdatePanel refreshed during moving DayPilotCalendar.deleteShadow(DayPilotCalendar.movingShadow); DayPilot.Global.moving = null; DayPilotCalendar.movingShadow = null; return; } if (!DayPilotCalendar.movingShadow) { DayPilot.Global.moving.event.calendar.nav.top.style.cursor = 'auto'; DayPilot.Global.moving = null; return; } var oldColumn = DayPilot.Global.moving.helper.oldColumn; //var newColumn = DayPilotCalendar.getShadowColumn(DayPilotCalendar.movingShadow).getAttribute("dpColumn"); //var newColumnDate = DayPilotCalendar.getShadowColumn(DayPilotCalendar.movingShadow).getAttribute("dpColumnDate"); var top = DayPilotCalendar.movingShadow.offsetTop; DayPilotCalendar.deleteShadow(DayPilotCalendar.movingShadow); var dpEvent = DayPilot.Global.moving.event; var newColumnIndex = DayPilotCalendar.movingShadow.column; var drag = DayPilotCalendar.drag; DayPilot.Global.moving.event.calendar.nav.top.style.cursor = 'auto'; // stop moving on the client //DayPilotCalendar.drag = null; // will be reset below DayPilot.Global.moving = null; DayPilotCalendar.movingShadow = null; if (drag) { if (!dpEvent.calendar.todo) { dpEvent.calendar.todo = {}; } dpEvent.calendar.todo.del = drag.element; } if (dpEvent.calendar.overlap) { // event overlap return; } //if (dirty) { var ev = e || window.event; dpEvent.calendar._eventMoveDispatch(dpEvent, newColumnIndex, top, ev, drag); //} } // clean up external drag helpers if (DayPilotCalendar.drag) { DayPilotCalendar.drag = null; document.body.style.cursor = ''; } if (DayPilotCalendar.gShadow) { document.body.removeChild(DayPilotCalendar.gShadow); DayPilotCalendar.gShadow = null; } DayPilotCalendar.moveOffsetY = null; // clean for next external drag }; DayPilotCalendar.dragStart = function(element, duration, id, text, type) { DayPilot.us(element); var drag = DayPilotCalendar.drag = {}; drag.element = element; drag.duration = duration; drag.text = text; drag.id = id; drag.shadowType = type ? type : 'Fill'; // default value return false; }; /* * options: { * element: dom element, * duration: duration in minutes, * text: event text, * id: id, * keepElement: whether to keep the original element * } */ DayPilot.Calendar.makeDraggable = function(options) { var element = options.element; var removeElement = options.keepElement ? null : element; var duration = options.duration || 1; if (navigator.msPointerEnabled) { element.style.msTouchAction = "none"; element.style.touchAction = "none"; } DayPilot.us(element); // make it unselectable DayPilot.re(element, "mousedown", function(ev) { DayPilotCalendar.dragStart(removeElement, duration, options.id, options.text); var element = (ev.target || ev.srcElement); if(element.tagName) { var tagname = element.tagName.toLowerCase(); if(tagname === "textarea" || tagname === "select" || tagname === "input") { return false; } } ev.preventDefault && ev.preventDefault(); return false; /* var ev = ev || window.event; ev.preventDefault ? ev.preventDefault() : ev.returnValue = false; return false; */ }); var touchstart = function(ev) { if (DayPilot.Util.isMouseEvent(ev)) { return; } var holdfor = 0; window.setTimeout(function() { var drag = DayPilotCalendar.drag = {}; drag.element = removeElement; // TODO create drag.event = new DayPilot.Event() here drag.id = options.id; drag.text = options.text || ""; drag.duration = duration; drag.shadowType = "Fill"; DayPilotCalendar.gTouchMove(ev); ev.preventDefault(); }, holdfor); ev.preventDefault(); }; //element.addEventListener(DayPilot.touch.start, touchstart, false); DayPilot.re(element, DayPilot.touch.start, touchstart); }; DayPilotCalendar.deleteShadow = function(shadow) { if (!shadow) { return; } if (!shadow.parentNode) { return; } //DayPilot.pu(shadow); shadow.parentNode.removeChild(shadow); }; DayPilotCalendar.createGShadow = function(type) { var shadow = document.createElement('div'); shadow.setAttribute('unselectable', 'on'); shadow.style.position = 'absolute'; shadow.style.width = '100px'; shadow.style.height = '20px'; shadow.style.border = '2px dotted #666666'; shadow.style.zIndex = 101; shadow.style.pointerEvents = "none"; if (type === 'Fill') { // transparent shadow.style.backgroundColor = "#aaaaaa"; shadow.style.opacity = 0.5; shadow.style.filter = "alpha(opacity=50)"; shadow.style.border = '2px solid #aaaaaa'; } document.body.appendChild(shadow); return shadow; }; DayPilotCalendar.moveShadow = function(column) { var shadow = DayPilotCalendar.movingShadow; //var parent = shadow.parentNode; //parent.style.display = 'none'; if (shadow.parentNode) { shadow.parentNode.removeChild(shadow); } column.firstChild.appendChild(shadow); shadow.style.left = '0px'; shadow.style.width = (DayPilotCalendar.movingShadow.parentNode.offsetWidth) + 'px'; }; DayPilotCalendar.Column = function(value, name, date) { this.value = value; this.id = value; this.name = name; this.date = new DayPilot.Date(date); }; // publish the API // (backwards compatibility) DayPilot.CalendarVisible.dragStart = DayPilotCalendar.dragStart; DayPilot.CalendarVisible.Calendar = DayPilotCalendar.Calendar; // experimental jQuery bindings if (typeof jQuery !== 'undefined') { (function($) { $.fn.daypilotCalendar = function(options) { var first = null; var j = this.each(function() { if (this.daypilot) { // already initialized return; }; var daypilot = new DayPilot.Calendar(this.id, options); daypilot.init(); this.daypilot = daypilot; /* for (var name in options) { daypilot[name] = options[name]; }*/ if (!first) { first = daypilot; } }); if (this.length === 1) { return first; } else { return j; } }; })(jQuery); } (function registerAngularModule() { var app = DayPilot.am(); if (!app) { return; } app.directive("daypilotCalendar", function() { return { "restrict": "E", "template": "
", "replace": true, "link": function (scope, element, attrs) { var calendar = new DayPilot.Calendar(element[0]); calendar._angular.scope = scope; calendar.init(); var oattr = attrs["id"]; if (oattr) { scope[oattr] = calendar; } var watch = scope["$watch"]; watch.call(scope, attrs["daypilotConfig"], function (value) { for (var name in value) { calendar[name] = value[name]; } calendar.update(); }); watch.call(scope, attrs["daypilotEvents"], function(value) { //var calendar = element.data("calendar"); calendar.events.list = value; calendar._update({"eventsOnly": true}); }, true); } }; }); })(); if (typeof Sys !== 'undefined' && Sys.Application && Sys.Application.notifyScriptLoaded) { Sys.Application.notifyScriptLoaded(); } })();