Index: openacs-4/packages/acs-templating/www/resources/htmlarea/popupdiv.js =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-templating/www/resources/htmlarea/popupdiv.js,v diff -u -r1.1 -r1.2 --- openacs-4/packages/acs-templating/www/resources/htmlarea/popupdiv.js 4 Mar 2004 18:32:10 -0000 1.1 +++ openacs-4/packages/acs-templating/www/resources/htmlarea/popupdiv.js 30 Jan 2005 16:13:26 -0000 1.2 @@ -1,369 +1,369 @@ -/** This file is derived from PopupDiv, developed by Mihai Bazon for - * SamWare.net. Modifications were needed to make it usable in HTMLArea. - * HTMLArea is a free WYSIWYG online HTML editor from InteractiveTools.com. - * - * This file does not function standalone. It is dependent of global functions - * defined in HTMLArea-3.0 (htmlarea.js). - * - * Please see file htmlarea.js for further details. - **/ - -var is_ie = ( (navigator.userAgent.toLowerCase().indexOf("msie") != -1) && - (navigator.userAgent.toLowerCase().indexOf("opera") == -1) ); -var is_compat = (document.compatMode == "BackCompat"); - -function PopupDiv(editor, titleText, handler, initFunction) { - var self = this; - - this.editor = editor; - this.doc = editor._mdoc; - this.handler = handler; - - var el = this.doc.createElement("div"); - el.className = "content"; - - var popup = this.doc.createElement("div"); - popup.className = "dialog popupdiv"; - this.element = popup; - var s = popup.style; - s.position = "absolute"; - s.left = "0px"; - s.top = "0px"; - - var title = this.doc.createElement("div"); - title.className = "title"; - this.title = title; - popup.appendChild(title); - - HTMLArea._addEvent(title, "mousedown", function(ev) { - self._dragStart(is_ie ? window.event : ev); - }); - - var button = this.doc.createElement("div"); - button.className = "button"; - title.appendChild(button); - button.innerHTML = "×"; - title.appendChild(this.doc.createTextNode(titleText)); - this.titleText = titleText; - - button.onmouseover = function() { - this.className += " button-hilite"; - }; - button.onmouseout = function() { - this.className = this.className.replace(/\s*button-hilite\s*/g, " "); - }; - button.onclick = function() { - this.className = this.className.replace(/\s*button-hilite\s*/g, " "); - self.close(); - }; - - popup.appendChild(el); - this.content = el; - - this.doc.body.appendChild(popup); - - this.dragging = false; - this.onShow = null; - this.onClose = null; - this.modal = false; - - initFunction(this); -}; - -PopupDiv.currentPopup = null; - -PopupDiv.prototype.showAtElement = function(el, mode) { - this.defaultSize(); - var pos, ew, eh; - var popup = this.element; - popup.style.display = "block"; - var w = popup.offsetWidth; - var h = popup.offsetHeight; - popup.style.display = "none"; - if (el != window) { - pos = PopupDiv.getAbsolutePos(el); - ew = el.offsetWidth; - eh = el.offsetHeight; - } else { - pos = {x:0, y:0}; - var size = PopupDiv.getWindowSize(); - ew = size.x; - eh = size.y; - } - var FX = false, FY = false; - if (mode.indexOf("l") != -1) { - pos.x -= w; - FX = true; - } - if (mode.indexOf("r") != -1) { - pos.x += ew; - FX = true; - } - if (mode.indexOf("t") != -1) { - pos.y -= h; - FY = true; - } - if (mode.indexOf("b") != -1) { - pos.y += eh; - FY = true; - } - if (mode.indexOf("c") != -1) { - FX || (pos.x += Math.round((ew - w) / 2)); - FY || (pos.y += Math.round((eh - h) / 2)); - } - this.showAt(pos.x, pos.y); -}; - -PopupDiv.prototype.defaultSize = function() { - var s = this.element.style; - var cs = this.element.currentStyle; - var addX = (is_ie && is_compat) ? (parseInt(cs.borderLeftWidth) + - parseInt(cs.borderRightWidth) + - parseInt(cs.paddingLeft) + - parseInt(cs.paddingRight)) : 0; - var addY = (is_ie && is_compat) ? (parseInt(cs.borderTopWidth) + - parseInt(cs.borderBottomWidth) + - parseInt(cs.paddingTop) + - parseInt(cs.paddingBottom)) : 0; - s.display = "block"; - s.width = (this.content.offsetWidth + addX) + "px"; - s.height = (this.content.offsetHeight + this.title.offsetHeight) + "px"; - s.display = "none"; -}; - -PopupDiv.prototype.showAt = function(x, y) { - this.defaultSize(); - var s = this.element.style; - s.display = "block"; - s.left = x + "px"; - s.top = y + "px"; - this.hideShowCovered(); - - PopupDiv.currentPopup = this; - HTMLArea._addEvents(this.doc.body, ["mousedown", "click"], PopupDiv.checkPopup); - HTMLArea._addEvents(this.editor._doc.body, ["mousedown", "click"], PopupDiv.checkPopup); - if (is_ie && this.modal) { - this.doc.body.setCapture(false); - this.doc.body.onlosecapture = function() { - (PopupDiv.currentPopup) && (this.doc.body.setCapture(false)); - }; - } - window.event && HTMLArea._stopEvent(window.event); - - if (typeof this.onShow == "function") { - this.onShow(); - } else if (typeof this.onShow == "string") { - eval(this.onShow); - } - - var field = this.element.getElementsByTagName("input")[0]; - if (!field) { - field = this.element.getElementsByTagName("select")[0]; - } - if (!field) { - field = this.element.getElementsByTagName("textarea")[0]; - } - if (field) { - field.focus(); - } -}; - -PopupDiv.prototype.close = function() { - this.element.style.display = "none"; - PopupDiv.currentPopup = null; - this.hideShowCovered(); - HTMLArea._removeEvents(this.doc.body, ["mousedown", "click"], PopupDiv.checkPopup); - HTMLArea._removeEvents(this.editor._doc.body, ["mousedown", "click"], PopupDiv.checkPopup); - is_ie && this.modal && this.doc.body.releaseCapture(); - if (typeof this.onClose == "function") { - this.onClose(); - } else if (typeof this.onClose == "string") { - eval(this.onClose); - } - this.element.parentNode.removeChild(this.element); -}; - -PopupDiv.prototype.getForm = function() { - var forms = this.content.getElementsByTagName("form"); - return (forms.length > 0) ? forms[0] : null; -}; - -PopupDiv.prototype.callHandler = function() { - var tags = ["input", "textarea", "select"]; - var params = new Object(); - for (var ti in tags) { - var tag = tags[ti]; - var els = this.content.getElementsByTagName(tag); - for (var j = 0; j < els.length; ++j) { - var el = els[j]; - params[el.name] = el.value; - } - } - this.handler(this, params); - return false; -}; - -PopupDiv.getAbsolutePos = function(el) { - var r = { x: el.offsetLeft, y: el.offsetTop }; - if (el.offsetParent) { - var tmp = PopupDiv.getAbsolutePos(el.offsetParent); - r.x += tmp.x; - r.y += tmp.y; - } - return r; -}; - -PopupDiv.getWindowSize = function() { - if (window.innerHeight) { - return { y: window.innerHeight, x: window.innerWidth }; - } - if (this.doc.body.clientHeight) { - return { y: this.doc.body.clientHeight, x: this.doc.body.clientWidth }; - } - return { y: this.doc.documentElement.clientHeight, x: this.doc.documentElement.clientWidth }; -}; - -PopupDiv.prototype.hideShowCovered = function () { - var self = this; - function isContained(el) { - while (el) { - if (el == self.element) { - return true; - } - el = el.parentNode; - } - return false; - }; - var tags = new Array("applet", "select"); - var el = this.element; - - var p = PopupDiv.getAbsolutePos(el); - var EX1 = p.x; - var EX2 = el.offsetWidth + EX1; - var EY1 = p.y; - var EY2 = el.offsetHeight + EY1; - - if (el.style.display == "none") { - EX1 = EX2 = EY1 = EY2 = 0; - } - - for (var k = tags.length; k > 0; ) { - var ar = this.doc.getElementsByTagName(tags[--k]); - var cc = null; - - for (var i = ar.length; i > 0;) { - cc = ar[--i]; - if (isContained(cc)) { - cc.style.visibility = "visible"; - continue; - } - - p = PopupDiv.getAbsolutePos(cc); - var CX1 = p.x; - var CX2 = cc.offsetWidth + CX1; - var CY1 = p.y; - var CY2 = cc.offsetHeight + CY1; - - if ((CX1 > EX2) || (CX2 < EX1) || (CY1 > EY2) || (CY2 < EY1)) { - cc.style.visibility = "visible"; - } else { - cc.style.visibility = "hidden"; - } - } - } -}; - -PopupDiv.prototype._dragStart = function (ev) { - if (this.dragging) { - return false; - } - this.dragging = true; - PopupDiv.currentPopup = this; - var posX = ev.clientX; - var posY = ev.clientY; - if (is_ie) { - posY += this.doc.body.scrollTop; - posX += this.doc.body.scrollLeft; - } else { - posY += window.scrollY; - posX += window.scrollX; - } - var st = this.element.style; - this.xOffs = posX - parseInt(st.left); - this.yOffs = posY - parseInt(st.top); - HTMLArea._addEvent(this.doc, "mousemove", PopupDiv.dragIt); - HTMLArea._addEvent(this.doc, "mouseover", HTMLArea._stopEvent); - HTMLArea._addEvent(this.doc, "mouseup", PopupDiv.dragEnd); - HTMLArea._stopEvent(ev); -}; - -PopupDiv.dragIt = function (ev) { - var popup = PopupDiv.currentPopup; - if (!(popup && popup.dragging)) { - return false; - } - is_ie && (ev = window.event); - var posX = ev.clientX; - var posY = ev.clientY; - if (is_ie) { - posY += this.doc.body.scrollTop; - posX += this.doc.body.scrollLeft; - } else { - posY += window.scrollY; - posX += window.scrollX; - } - popup.hideShowCovered(); - var st = popup.element.style; - st.left = (posX - popup.xOffs) + "px"; - st.top = (posY - popup.yOffs) + "px"; - HTMLArea._stopEvent(ev); -}; - -PopupDiv.dragEnd = function () { - var popup = PopupDiv.currentPopup; - if (!popup) { - return false; - } - popup.dragging = false; - HTMLArea._removeEvent(popup.doc, "mouseup", PopupDiv.dragEnd); - HTMLArea._removeEvent(popup.doc, "mouseover", HTMLArea._stopEvent); - HTMLArea._removeEvent(popup.doc, "mousemove", PopupDiv.dragIt); - popup.hideShowCovered(); -}; - -PopupDiv.checkPopup = function (ev) { - is_ie && (ev = window.event); - var el = is_ie ? ev.srcElement : ev.target; - var cp = PopupDiv.currentPopup; - for (; (el != null) && (el != cp.element); el = el.parentNode); - if (el == null) { - cp.modal || ev.type == "mouseover" || cp.close(); - HTMLArea._stopEvent(ev); - } -}; - -PopupDiv.prototype.addButtons = function() { - var self = this; - var div = this.doc.createElement("div"); - this.content.appendChild(div); - div.className = "buttons"; - for (var i = 0; i < arguments.length; ++i) { - var btn = arguments[i]; - var button = this.doc.createElement("button"); - div.appendChild(button); - button.innerHTML = HTMLArea.I18N.buttons[btn]; - switch (btn) { - case "ok": - button.onclick = function() { - self.callHandler(); - self.close(); - }; - break; - case "cancel": - button.onclick = function() { - self.close(); - }; - break; - } - } -}; +/** This file is derived from PopupDiv, developed by Mihai Bazon for + * SamWare.net. Modifications were needed to make it usable in HTMLArea. + * HTMLArea is a free WYSIWYG online HTML editor from InteractiveTools.com. + * + * This file does not function standalone. It is dependent of global functions + * defined in HTMLArea-3.0 (htmlarea.js). + * + * Please see file htmlarea.js for further details. + **/ + +var is_ie = ( (navigator.userAgent.toLowerCase().indexOf("msie") != -1) && + (navigator.userAgent.toLowerCase().indexOf("opera") == -1) ); +var is_compat = (document.compatMode == "BackCompat"); + +function PopupDiv(editor, titleText, handler, initFunction) { + var self = this; + + this.editor = editor; + this.doc = editor._mdoc; + this.handler = handler; + + var el = this.doc.createElement("div"); + el.className = "content"; + + var popup = this.doc.createElement("div"); + popup.className = "dialog popupdiv"; + this.element = popup; + var s = popup.style; + s.position = "absolute"; + s.left = "0px"; + s.top = "0px"; + + var title = this.doc.createElement("div"); + title.className = "title"; + this.title = title; + popup.appendChild(title); + + HTMLArea._addEvent(title, "mousedown", function(ev) { + self._dragStart(is_ie ? window.event : ev); + }); + + var button = this.doc.createElement("div"); + button.className = "button"; + title.appendChild(button); + button.innerHTML = "×"; + title.appendChild(this.doc.createTextNode(titleText)); + this.titleText = titleText; + + button.onmouseover = function() { + this.className += " button-hilite"; + }; + button.onmouseout = function() { + this.className = this.className.replace(/\s*button-hilite\s*/g, " "); + }; + button.onclick = function() { + this.className = this.className.replace(/\s*button-hilite\s*/g, " "); + self.close(); + }; + + popup.appendChild(el); + this.content = el; + + this.doc.body.appendChild(popup); + + this.dragging = false; + this.onShow = null; + this.onClose = null; + this.modal = false; + + initFunction(this); +}; + +PopupDiv.currentPopup = null; + +PopupDiv.prototype.showAtElement = function(el, mode) { + this.defaultSize(); + var pos, ew, eh; + var popup = this.element; + popup.style.display = "block"; + var w = popup.offsetWidth; + var h = popup.offsetHeight; + popup.style.display = "none"; + if (el != window) { + pos = PopupDiv.getAbsolutePos(el); + ew = el.offsetWidth; + eh = el.offsetHeight; + } else { + pos = {x:0, y:0}; + var size = PopupDiv.getWindowSize(); + ew = size.x; + eh = size.y; + } + var FX = false, FY = false; + if (mode.indexOf("l") != -1) { + pos.x -= w; + FX = true; + } + if (mode.indexOf("r") != -1) { + pos.x += ew; + FX = true; + } + if (mode.indexOf("t") != -1) { + pos.y -= h; + FY = true; + } + if (mode.indexOf("b") != -1) { + pos.y += eh; + FY = true; + } + if (mode.indexOf("c") != -1) { + FX || (pos.x += Math.round((ew - w) / 2)); + FY || (pos.y += Math.round((eh - h) / 2)); + } + this.showAt(pos.x, pos.y); +}; + +PopupDiv.prototype.defaultSize = function() { + var s = this.element.style; + var cs = this.element.currentStyle; + var addX = (is_ie && is_compat) ? (parseInt(cs.borderLeftWidth) + + parseInt(cs.borderRightWidth) + + parseInt(cs.paddingLeft) + + parseInt(cs.paddingRight)) : 0; + var addY = (is_ie && is_compat) ? (parseInt(cs.borderTopWidth) + + parseInt(cs.borderBottomWidth) + + parseInt(cs.paddingTop) + + parseInt(cs.paddingBottom)) : 0; + s.display = "block"; + s.width = (this.content.offsetWidth + addX) + "px"; + s.height = (this.content.offsetHeight + this.title.offsetHeight) + "px"; + s.display = "none"; +}; + +PopupDiv.prototype.showAt = function(x, y) { + this.defaultSize(); + var s = this.element.style; + s.display = "block"; + s.left = x + "px"; + s.top = y + "px"; + this.hideShowCovered(); + + PopupDiv.currentPopup = this; + HTMLArea._addEvents(this.doc.body, ["mousedown", "click"], PopupDiv.checkPopup); + HTMLArea._addEvents(this.editor._doc.body, ["mousedown", "click"], PopupDiv.checkPopup); + if (is_ie && this.modal) { + this.doc.body.setCapture(false); + this.doc.body.onlosecapture = function() { + (PopupDiv.currentPopup) && (this.doc.body.setCapture(false)); + }; + } + window.event && HTMLArea._stopEvent(window.event); + + if (typeof this.onShow == "function") { + this.onShow(); + } else if (typeof this.onShow == "string") { + eval(this.onShow); + } + + var field = this.element.getElementsByTagName("input")[0]; + if (!field) { + field = this.element.getElementsByTagName("select")[0]; + } + if (!field) { + field = this.element.getElementsByTagName("textarea")[0]; + } + if (field) { + field.focus(); + } +}; + +PopupDiv.prototype.close = function() { + this.element.style.display = "none"; + PopupDiv.currentPopup = null; + this.hideShowCovered(); + HTMLArea._removeEvents(this.doc.body, ["mousedown", "click"], PopupDiv.checkPopup); + HTMLArea._removeEvents(this.editor._doc.body, ["mousedown", "click"], PopupDiv.checkPopup); + is_ie && this.modal && this.doc.body.releaseCapture(); + if (typeof this.onClose == "function") { + this.onClose(); + } else if (typeof this.onClose == "string") { + eval(this.onClose); + } + this.element.parentNode.removeChild(this.element); +}; + +PopupDiv.prototype.getForm = function() { + var forms = this.content.getElementsByTagName("form"); + return (forms.length > 0) ? forms[0] : null; +}; + +PopupDiv.prototype.callHandler = function() { + var tags = ["input", "textarea", "select"]; + var params = new Object(); + for (var ti = tags.length; --ti >= 0;) { + var tag = tags[ti]; + var els = this.content.getElementsByTagName(tag); + for (var j = 0; j < els.length; ++j) { + var el = els[j]; + params[el.name] = el.value; + } + } + this.handler(this, params); + return false; +}; + +PopupDiv.getAbsolutePos = function(el) { + var r = { x: el.offsetLeft, y: el.offsetTop }; + if (el.offsetParent) { + var tmp = PopupDiv.getAbsolutePos(el.offsetParent); + r.x += tmp.x; + r.y += tmp.y; + } + return r; +}; + +PopupDiv.getWindowSize = function() { + if (window.innerHeight) { + return { y: window.innerHeight, x: window.innerWidth }; + } + if (this.doc.body.clientHeight) { + return { y: this.doc.body.clientHeight, x: this.doc.body.clientWidth }; + } + return { y: this.doc.documentElement.clientHeight, x: this.doc.documentElement.clientWidth }; +}; + +PopupDiv.prototype.hideShowCovered = function () { + var self = this; + function isContained(el) { + while (el) { + if (el == self.element) { + return true; + } + el = el.parentNode; + } + return false; + }; + var tags = new Array("applet", "select"); + var el = this.element; + + var p = PopupDiv.getAbsolutePos(el); + var EX1 = p.x; + var EX2 = el.offsetWidth + EX1; + var EY1 = p.y; + var EY2 = el.offsetHeight + EY1; + + if (el.style.display == "none") { + EX1 = EX2 = EY1 = EY2 = 0; + } + + for (var k = tags.length; k > 0; ) { + var ar = this.doc.getElementsByTagName(tags[--k]); + var cc = null; + + for (var i = ar.length; i > 0;) { + cc = ar[--i]; + if (isContained(cc)) { + cc.style.visibility = "visible"; + continue; + } + + p = PopupDiv.getAbsolutePos(cc); + var CX1 = p.x; + var CX2 = cc.offsetWidth + CX1; + var CY1 = p.y; + var CY2 = cc.offsetHeight + CY1; + + if ((CX1 > EX2) || (CX2 < EX1) || (CY1 > EY2) || (CY2 < EY1)) { + cc.style.visibility = "visible"; + } else { + cc.style.visibility = "hidden"; + } + } + } +}; + +PopupDiv.prototype._dragStart = function (ev) { + if (this.dragging) { + return false; + } + this.dragging = true; + PopupDiv.currentPopup = this; + var posX = ev.clientX; + var posY = ev.clientY; + if (is_ie) { + posY += this.doc.body.scrollTop; + posX += this.doc.body.scrollLeft; + } else { + posY += window.scrollY; + posX += window.scrollX; + } + var st = this.element.style; + this.xOffs = posX - parseInt(st.left); + this.yOffs = posY - parseInt(st.top); + HTMLArea._addEvent(this.doc, "mousemove", PopupDiv.dragIt); + HTMLArea._addEvent(this.doc, "mouseover", HTMLArea._stopEvent); + HTMLArea._addEvent(this.doc, "mouseup", PopupDiv.dragEnd); + HTMLArea._stopEvent(ev); +}; + +PopupDiv.dragIt = function (ev) { + var popup = PopupDiv.currentPopup; + if (!(popup && popup.dragging)) { + return false; + } + is_ie && (ev = window.event); + var posX = ev.clientX; + var posY = ev.clientY; + if (is_ie) { + posY += this.doc.body.scrollTop; + posX += this.doc.body.scrollLeft; + } else { + posY += window.scrollY; + posX += window.scrollX; + } + popup.hideShowCovered(); + var st = popup.element.style; + st.left = (posX - popup.xOffs) + "px"; + st.top = (posY - popup.yOffs) + "px"; + HTMLArea._stopEvent(ev); +}; + +PopupDiv.dragEnd = function () { + var popup = PopupDiv.currentPopup; + if (!popup) { + return false; + } + popup.dragging = false; + HTMLArea._removeEvent(popup.doc, "mouseup", PopupDiv.dragEnd); + HTMLArea._removeEvent(popup.doc, "mouseover", HTMLArea._stopEvent); + HTMLArea._removeEvent(popup.doc, "mousemove", PopupDiv.dragIt); + popup.hideShowCovered(); +}; + +PopupDiv.checkPopup = function (ev) { + is_ie && (ev = window.event); + var el = is_ie ? ev.srcElement : ev.target; + var cp = PopupDiv.currentPopup; + for (; (el != null) && (el != cp.element); el = el.parentNode); + if (el == null) { + cp.modal || ev.type == "mouseover" || cp.close(); + HTMLArea._stopEvent(ev); + } +}; + +PopupDiv.prototype.addButtons = function() { + var self = this; + var div = this.doc.createElement("div"); + this.content.appendChild(div); + div.className = "buttons"; + for (var i = 0; i < arguments.length; ++i) { + var btn = arguments[i]; + var button = this.doc.createElement("button"); + div.appendChild(button); + button.innerHTML = HTMLArea.I18N.buttons[btn]; + switch (btn) { + case "ok": + button.onclick = function() { + self.callHandler(); + self.close(); + }; + break; + case "cancel": + button.onclick = function() { + self.close(); + }; + break; + } + } +};