/* Product Name: dhtmlxSuite Version: 4.0.3 Edition: Professional License: content of this file is covered by DHTMLX Commercial or Enterprise license. Usage without proper license is prohibited. To obtain it contact sales@dhtmlx.com Copyright UAB Dinamenta http://www.dhtmlx.com */ function dhtmlXPopup(conf) { var that = this; this.conf = conf||{}; conf = null; this.mode = (this.conf.mode||"bottom"); // popup position related to caller element this.conf.zi = window.dhx4.newId(); this.conf.isIE = (navigator.userAgent.indexOf("MSIE")>=0); this.p = document.createElement("DIV"); this.p.style.display = "none"; this.p.innerHTML = "
"+ "
"+ "
"+ "
"; document.body.appendChild(this.p); this.skinParams = { dhx_terrace: { t0: 19, // minimal top offset for polygon, i.e. space between polygon top and arrow top t1: 9, // if no more space at top, and "t0 allowed" - move top polygon position a bit to bottom, t1 = offset for empty space at top t2: 19, // same as t0, for width t3: 9 // same as t1, for width }, dhx_skyblue: {t0: 12, t1: 9, t2: 12, t3: 9}, dhx_web: {t0: 12, t1: 9, t2: 12, t3: 9} }; this.p.onclick = function(e) { e = e||event; that._clearClick = true; if (that._nodeObj != null) { that.callEvent("onContentClick",[]); return true; } var t = (e.target||e.srcElement); var id = null; while (t != that.p && t != null) { if (typeof(t._idd) != "undefined" && !t._isSeparator) { id = t._idd; t = null; } else { t = t.parentNode; } } t = null; if (id != null) { that.callEvent("onClick",[id]); if (that != null && that.isVisible != null && that.isVisible() && that.callEvent("onBeforeHide",["select",e,id]) === true) { e.cancelBubble = true; that.hide(); } } } this.separator = "DHXSEP_"+window.dhx4.newId(); this.tpl = []; this._setTemplate = function(t) { this.tpl = t.split(","); } this.show = function(id) { // 4 coords for custom object, x, y, width, height var p = null; if (arguments.length == 1) { // if id not specified show on first if (!id) { id = this.conf.id[0]; } else { if (!this._idExists(id)) return; } if (this.conf.toolbar) { p = this.conf.toolbar._getItemDim(id); } if (this.conf.ribbon) { p = this.conf.ribbon._getItemDim(id); } if (this.conf.form) { p = this.conf.form._getItemDim(id); } } else if (arguments.length == 4) { this._clearClick = true; // show for custom object, 4 coords p = { left: arguments[0], top: arguments[1], width: arguments[2], height: arguments[3] } id = null; } if (!p) return; this.p.style.visibility = "hidden"; this.p.style.display = ""; this._setPos(p); this.p.style.zIndex = window.dhx4.zim.reserve(this.conf.zi); this.p.style.visibility = "visible"; this._lastId = id; this.callEvent("onShow",[id]); } this._setPos = function(p, state) { var x = p.left; var y = p.top; var w = p.width; var h = p.height; this._posData = { left: x, top: y, width: w, height: h }; var d = window.dhx4.screenDim(); var mode = state||this.mode; if (typeof(state) == "undefined") state = false; // avail space form each side, negative value = no-space var availSpace = { top: (y-this.p.offsetHeight)-d.top, bottom: d.bottom-(y+h+this.p.offsetHeight), left: x-this.p.offsetWidth-d.left, right: d.right-(x+w+this.p.offsetWidth) }; if (!state && availSpace[mode] < 0) { var k = this._getAvailPos(mode, availSpace); if (k !== false) { this._setPos(p, k); return; } } if (mode == "top" || mode == "bottom") { var t0 = this.skinParams[this.conf.skin].t2; var t1 = this.skinParams[this.conf.skin].t3; var pw2 = Math.round(this.p.offsetWidth/2); // 1/2 polygon width var aw2 = Math.round(this.p.lastChild.offsetWidth/2); // 1/2 arrow width // define max left and right position of input including rendering [d.left..d.right] area if (x < d.left) { var x1 = Math.min(x+w, d.left); w = x+w-x1; x = x1; } // left if (x+w > d.right) w = d.right-x; // right // arrow position var ta = Math.round(x+w/2); // polygon top var left = ta - pw2; var maxLeft = ta - t0 - aw2; var maxLeftRight = ta+aw2+t0-this.p.offsetWidth; if (left < d.left-t1) { // left left = Math.min(d.left-t1, maxLeft); } else if (left+this.p.offsetWidth > d.right+t1) { // right left = Math.max(maxLeftRight, d.right+t1-this.p.offsetWidth); // -scrollWidth here? } // draw polygon this.p.style.left = left+"px"; this.p.style.top = (mode=="top"?y-this.p.offsetHeight:y+h)+"px"; // fix arrow offset (it inside polygon) ta = ta-left-aw2; // draw arrow this.p.lastChild.className = "dhx_popup_arrow dhx_popup_arrow_"+mode; this.p.lastChild.style.top = (mode=="top"?this.p.offsetHeight-this.p.lastChild.offsetHeight:0)+"px"; this.p.lastChild.style.left = ta+"px"; } if (mode == "left" || mode == "right") { var t0 = this.skinParams[this.conf.skin].t0; var t1 = this.skinParams[this.conf.skin].t1; var ph2 = Math.round(this.p.offsetHeight/2); // 1/2 polygon height var ah2 = Math.round(this.p.lastChild.offsetHeight/2); // 1/2 arrow height // define max top and bottom position of input including rendering [d.top..d.bottom] area if (y < d.top) { var y1 = Math.min(y+h, d.top); h = y+h-y1; y = y1; } // top if (y+h > d.bottom) h = d.bottom-y; // bottom // arrow position var ta = Math.round(y+h/2); // polygon top var top = ta - ph2; var maxTop = ta - t0 - ah2; var maxTopBottom = ta+ah2+t0-this.p.offsetHeight; if (top < d.top-t1) { // top top = Math.min(d.top-t1, maxTop); } else if (top+this.p.offsetHeight > d.bottom+t1) { // bottom top = Math.max(maxTopBottom, d.bottom+t1-this.p.offsetHeight); } // draw polygon this.p.style.left = (mode=="left"?x-this.p.offsetWidth:x+w)+"px"; this.p.style.top = top+"px"; // fix arrow offset (it inside polygon) ta = ta-top-ah2; // draw arrow this.p.lastChild.className = "dhx_popup_arrow dhx_popup_arrow_"+mode; this.p.lastChild.style.left = (mode=="left"?this.p.offsetWidth-this.p.lastChild.offsetWidth:0)+"px"; this.p.lastChild.style.top = ta+"px"; } if (this._IEDisp && this._nodeId != null) { var t = document.getElementById(this._nodeId); //t.style.visibility = "hidden"; window.setTimeout(function(){ t.style.visibility = "visible"; t = null; },1); } } this._getAvailPos = function(mode, data) { var seq = { top: ["bottom","right","left"], bottom: ["top","right","left"], left: ["right", "bottom", "top"], right: ["left", "bottom", "top"] }; var dir = null; // check "next" with avail space for (var q=0; q 0) dir = seq[mode][q]; } // define which side have more space if (dir == null) { dir = "bottom"; for (var a in data) if (data[a] > data[dir]) dir = a; } if (dir == mode) return false; return dir; } this._repaint = function() { if (this.isVisible()) this._setPos(this._posData); } this.clear = function() { if (this._nodeObj) { if (this.conf.isIE && typeof(dhtmlXLayoutObject) != "undefined" && this._nodeObj instanceof dhtmlXLayoutObject) { this.p.onmousedown = null; } if (this._nodeObj.unload) { this._nodeObj.unload(); } else if (this._nodeObj.destruct) { this._nodeObj.destruct(); } this._nodeObj = this._nodeId = null; // events if any if (this._nodeObjEv != null) { for (var q=0; qtbody while (r.childNodes.length > 0) r.removeChild(r.lastChild); r = null; this.itemData = {}; } this.hide = function() { if (this.p.style.display != "none") { this.p.style.display = "none"; window.dhx4.zim.clear(this.conf.zi); var id = this._lastId; this._lastId = null; this.callEvent("onHide",[id]); } } this.isVisible = function() { return (this.p.style.display == ""); } this.itemData = {}; this.getItemData = function(id) { if (!id) return this.itemData; if (this.itemData[id]) return this.itemData[id]; return {}; } this.setSkin = function(skin) { this.conf.skin = skin; this.p.className = "dhx_popup_"+this.conf.skin; if (this._nodeObj != null && typeof(this._nodeObj.setSkin) == "function") this._nodeObj.setSkin(this.conf.skin); this._repaint(); } this.attachList = function(template, data) { this._setTemplate(template); this.clear(); var r = this.p.firstChild.firstChild.firstChild; // table->tbody for (var q=0; qtbody var tr = document.createElement("TR"); tr.className = "dhxnode"; r.appendChild(tr); var td = document.createElement("TD"); td.className = "dhx_popup_td"; td.innerHTML = "
"; if (data.width) td.firstChild.style.width = data.width+"px"; if (data.height) td.firstChild.style.height = data.height+"px"; tr.appendChild(td); td = tr = r = null; if (typeof(this["_attach_init_"+mode]) == "function") { this["_attach_init_"+mode](data); this._enableIEVFix(); } this._repaint(); return this._nodeObj; } this.unload = function() { if (typeof(window.addEventListener) == "function") { window.removeEventListener("click", this._doOnClick, false); window.removeEventListener("keyup", this._doOnKeyUp, false); window.removeEventListener("unload", this._doOnUnload, false); } else { document.body.detachEvent("onclick", this._doOnClick, false); document.body.detachEvent("onkeyup", this._doOnKeyUp, false); document.body.detachEvent("onunload", this._doOnUnload, false); } this.clear(); this._doOnClick = null; this._doOnUnload = null; this._doOnKeyUp = null; if (this.conf.toolbarEvent != null && this.conf.toolbar != null) { if (this.conf.toolbar.detachEvent != null) { // make sure toolbar wasn't unloaded this.conf.toolbar.detachEvent(this.conf.toolbarEvent); } else { this.conf.toolbar._getItemDim = null; } } if (this.conf.ribbonEvent != null && this.conf.ribbon != null) { if (this.conf.ribbon.detachEvent != null) { this.conf.ribbon.detachEvent(this.conf.ribbonEvent); } else { this.conf.ribbon._getItemDim = null; } } if (this.conf.slider) { for (var q=0; q= 0) { if (t.parentNode != null && t.parentNode.parentNode != null && t.parentNode.parentNode._idd != null) { id = t.parentNode.parentNode._idd; if (t.parentNode.parentNode._type == "ra") id = [t.parentNode.parentNode._group, t.parentNode.parentNode._value]; } } else { // check if button, editor or combo var k = true; var f = false; while (k && !f) { var p = (t.className||"").toLowerCase(); if (p.length > 0) f = (p == "dhxform_btn" || p.search(/dhxeditor_inside/gi) >= 0 || p == "dhxcombo_input" || p.search(/dhxcombolist/gi) >=0); t = t.parentNode; k = (t != null); } if (f) return; } t = null; if (id != null && that._idExists(id)) return; } if (that.isVisible() && that.callEvent("onBeforeHide",["click",e]) === true) { that.hide(); } } this._doOnKeyUp = function(e) { e = e||event; if (e.keyCode == 27) { if (that.isVisible() && that.callEvent("onBeforeHide",["esc",e]) === true) { that.hide(); } } } this._doOnUnload = function() { that.unload(); } if (typeof(window.addEventListener) == "function") { window.addEventListener("click", this._doOnClick, false); window.addEventListener("keyup", this._doOnKeyUp, false); window.addEventListener("unload", this._doOnUnload, false); } else { document.body.attachEvent("onclick", this._doOnClick, false); document.body.attachEvent("onkeyup", this._doOnKeyUp, false); document.body.attachEvent("onunload", this._doOnUnload, false); } this._idExists = function(id) { var r = false; for (var q=0; q=0 || document.compatMode != "CSS1Compat")); // IE6 hover functionality this._IEHover = (this.conf.isIE && navigator.userAgent.search("MSIE 6.0")>=0); if (this._IEHover) { this._IEHoverInit = function() { this.p.onmouseover = function() { var t = event.srcElement; while (t != this && t._IEHover != true) t = t.parentNode; if (t._IEHover) { if (that._IEHoverTM) window.clearTimeout(that._IEHoverTM); if (that._lastIEHover == t) return; that._IEHoverRender(t); t = null; } } this.p.onmouseout = function() { if (that._IEHoverTM) window.clearTimeout(that._IEHoverTM); that._IEHoverTM = window.setTimeout(function(){that._IEHoverRender(null);},1); } this._IEHoverRender = function(t) { if (this._lastIEHover != null) { if (this._lastIEHover.className.search(/tr_hover/gi) >= 0) { this._lastIEHover.className = this._lastIEHover.className.replace(/\s{0,}tr_hover/gi, ""); this._lastIEHover = null; } } if (t != null && t.className.search(/tr_hover/gi) < 0) { t.className += " tr_hover"; that._lastIEHover = t; } } this._IEHoverInited = true; } this._IEHoverClear = function() { this.p.onmouseover = null; this.p.onmouseout = null; this._IEHoverInited = false; } } // IE6/7/8 first/last-child this._IEFirstLast = (this.conf.isIE && navigator.userAgent.search(/MSIE [6,7,8]\.0/i)>=0); // IE6 visibility fix this._enableIEVFix = function() { if (this.conf.isIE && navigator.userAgent.search("MSIE 6.0") >= 0) { var e1 = this.attachEvent("onHide", function(){ document.getElementById(this._nodeId).style.visibility = "hidden"; }); var e2 = this.attachEvent("onShow", function(){ document.getElementById(this._nodeId).style.visibility = "visible"; }); if (this._nodeObjEv == null) this._nodeObjEv = []; this._nodeObjEv.push(e1,e2); } } // auto-init, toolbar mode if (typeof(window.dhtmlXToolbarObject) != "undefined" && this.conf.toolbar != null && this.conf.toolbar instanceof window.dhtmlXToolbarObject && this.conf.id != null) { if (!(this.conf.id instanceof Array)) this.conf.id = [this.conf.id]; this.skinParent = this.conf.toolbar.conf.skin; this._doOnToolbarClick = function(id) { for (var q=0; q