source: branches/1.2/workflow/js/htmlarea/popupdiv.js @ 1349

Revision 1349, 9.4 KB checked in by niltonneto, 15 years ago (diff)

Ticket #561 - Inclusão do módulo Workflow faltante nessa versão.

  • Property svn:executable set to *
Line 
1/** This file is derived from PopupDiv, developed by Mihai Bazon for
2 * SamWare.net.  Modifications were needed to make it usable in HTMLArea.
3 * HTMLArea is a free WYSIWYG online HTML editor from InteractiveTools.com.
4 *
5 * This file does not function standalone.  It is dependent of global functions
6 * defined in HTMLArea-3.0 (htmlarea.js).
7 *
8 * Please see file htmlarea.js for further details.
9 **/
10
11var is_ie = ( (navigator.userAgent.toLowerCase().indexOf("msie") != -1) &&
12              (navigator.userAgent.toLowerCase().indexOf("opera") == -1) );
13var is_compat = (document.compatMode == "BackCompat");
14
15function PopupDiv(editor, titleText, handler, initFunction) {
16        var self = this;
17
18        this.editor = editor;
19        this.doc = editor._mdoc;
20        this.handler = handler;
21
22        var el = this.doc.createElement("div");
23        el.className = "content";
24
25        var popup = this.doc.createElement("div");
26        popup.className = "dialog popupdiv";
27        this.element = popup;
28        var s = popup.style;
29        s.position = "absolute";
30        s.left = "0px";
31        s.top = "0px";
32
33        var title = this.doc.createElement("div");
34        title.className = "title";
35        this.title = title;
36        popup.appendChild(title);
37
38        HTMLArea._addEvent(title, "mousedown", function(ev) {
39                self._dragStart(is_ie ? window.event : ev);
40        });
41
42        var button = this.doc.createElement("div");
43        button.className = "button";
44        title.appendChild(button);
45        button.innerHTML = "×";
46        title.appendChild(this.doc.createTextNode(titleText));
47        this.titleText = titleText;
48
49        button.onmouseover = function() {
50                this.className += " button-hilite";
51        };
52        button.onmouseout = function() {
53                this.className = this.className.replace(/\s*button-hilite\s*/g, " ");
54        };
55        button.onclick = function() {
56                this.className = this.className.replace(/\s*button-hilite\s*/g, " ");
57                self.close();
58        };
59
60        popup.appendChild(el);
61        this.content = el;
62
63        this.doc.body.appendChild(popup);
64
65        this.dragging = false;
66        this.onShow = null;
67        this.onClose = null;
68        this.modal = false;
69
70        initFunction(this);
71};
72
73PopupDiv.currentPopup = null;
74
75PopupDiv.prototype.showAtElement = function(el, mode) {
76        this.defaultSize();
77        var pos, ew, eh;
78        var popup = this.element;
79        popup.style.display = "block";
80        var w = popup.offsetWidth;
81        var h = popup.offsetHeight;
82        popup.style.display = "none";
83        if (el != window) {
84                pos = PopupDiv.getAbsolutePos(el);
85                ew = el.offsetWidth;
86                eh = el.offsetHeight;
87        } else {
88                pos = {x:0, y:0};
89                var size = PopupDiv.getWindowSize();
90                ew = size.x;
91                eh = size.y;
92        }
93        var FX = false, FY = false;
94        if (mode.indexOf("l") != -1) {
95                pos.x -= w;
96                FX = true;
97        }
98        if (mode.indexOf("r") != -1) {
99                pos.x += ew;
100                FX = true;
101        }
102        if (mode.indexOf("t") != -1) {
103                pos.y -= h;
104                FY = true;
105        }
106        if (mode.indexOf("b") != -1) {
107                pos.y += eh;
108                FY = true;
109        }
110        if (mode.indexOf("c") != -1) {
111                FX || (pos.x += Math.round((ew - w) / 2));
112                FY || (pos.y += Math.round((eh - h) / 2));
113        }
114        this.showAt(pos.x, pos.y);
115};
116
117PopupDiv.prototype.defaultSize = function() {
118        var s = this.element.style;
119        var cs = this.element.currentStyle;
120        var addX = (is_ie && is_compat) ? (parseInt(cs.borderLeftWidth) +
121                                           parseInt(cs.borderRightWidth) +
122                                           parseInt(cs.paddingLeft) +
123                                           parseInt(cs.paddingRight)) : 0;
124        var addY = (is_ie && is_compat) ? (parseInt(cs.borderTopWidth) +
125                                           parseInt(cs.borderBottomWidth) +
126                                           parseInt(cs.paddingTop) +
127                                           parseInt(cs.paddingBottom)) : 0;
128        s.display = "block";
129        s.width = (this.content.offsetWidth + addX) + "px";
130        s.height = (this.content.offsetHeight + this.title.offsetHeight) + "px";
131        s.display = "none";
132};
133
134PopupDiv.prototype.showAt = function(x, y) {
135        this.defaultSize();
136        var s = this.element.style;
137        s.display = "block";
138        s.left = x + "px";
139        s.top = y + "px";
140        this.hideShowCovered();
141
142        PopupDiv.currentPopup = this;
143        HTMLArea._addEvents(this.doc.body, ["mousedown", "click"], PopupDiv.checkPopup);
144        HTMLArea._addEvents(this.editor._doc.body, ["mousedown", "click"], PopupDiv.checkPopup);
145        if (is_ie && this.modal) {
146                this.doc.body.setCapture(false);
147                this.doc.body.onlosecapture = function() {
148                        (PopupDiv.currentPopup) && (this.doc.body.setCapture(false));
149                };
150        }
151        window.event && HTMLArea._stopEvent(window.event);
152
153        if (typeof this.onShow == "function") {
154                this.onShow();
155        } else if (typeof this.onShow == "string") {
156                eval(this.onShow);
157        }
158
159        var field = this.element.getElementsByTagName("input")[0];
160        if (!field) {
161                field = this.element.getElementsByTagName("select")[0];
162        }
163        if (!field) {
164                field = this.element.getElementsByTagName("textarea")[0];
165        }
166        if (field) {
167                field.focus();
168        }
169};
170
171PopupDiv.prototype.close = function() {
172        this.element.style.display = "none";
173        PopupDiv.currentPopup = null;
174        this.hideShowCovered();
175        HTMLArea._removeEvents(this.doc.body, ["mousedown", "click"], PopupDiv.checkPopup);
176        HTMLArea._removeEvents(this.editor._doc.body, ["mousedown", "click"], PopupDiv.checkPopup);
177        is_ie && this.modal && this.doc.body.releaseCapture();
178        if (typeof this.onClose == "function") {
179                this.onClose();
180        } else if (typeof this.onClose == "string") {
181                eval(this.onClose);
182        }
183        this.element.parentNode.removeChild(this.element);
184};
185
186PopupDiv.prototype.getForm = function() {
187        var forms = this.content.getElementsByTagName("form");
188        return (forms.length > 0) ? forms[0] : null;
189};
190
191PopupDiv.prototype.callHandler = function() {
192        var tags = ["input", "textarea", "select"];
193        var params = new Object();
194        for (var ti in tags) {
195                var tag = tags[ti];
196                var els = this.content.getElementsByTagName(tag);
197                for (var j = 0; j < els.length; ++j) {
198                        var el = els[j];
199                        params[el.name] = el.value;
200                }
201        }
202        this.handler(this, params);
203        return false;
204};
205
206PopupDiv.getAbsolutePos = function(el) {
207        var r = { x: el.offsetLeft, y: el.offsetTop };
208        if (el.offsetParent) {
209                var tmp = PopupDiv.getAbsolutePos(el.offsetParent);
210                r.x += tmp.x;
211                r.y += tmp.y;
212        }
213        return r;
214};
215
216PopupDiv.getWindowSize = function() {
217        if (window.innerHeight) {
218                return { y: window.innerHeight, x: window.innerWidth };
219        }
220        if (this.doc.body.clientHeight) {
221                return { y: this.doc.body.clientHeight, x: this.doc.body.clientWidth };
222        }
223        return { y: this.doc.documentElement.clientHeight, x: this.doc.documentElement.clientWidth };
224};
225
226PopupDiv.prototype.hideShowCovered = function () {
227        var self = this;
228        function isContained(el) {
229                while (el) {
230                        if (el == self.element) {
231                                return true;
232                        }
233                        el = el.parentNode;
234                }
235                return false;
236        };
237        var tags = new Array("applet", "select");
238        var el = this.element;
239
240        var p = PopupDiv.getAbsolutePos(el);
241        var EX1 = p.x;
242        var EX2 = el.offsetWidth + EX1;
243        var EY1 = p.y;
244        var EY2 = el.offsetHeight + EY1;
245
246        if (el.style.display == "none") {
247                EX1 = EX2 = EY1 = EY2 = 0;
248        }
249
250        for (var k = tags.length; k > 0; ) {
251                var ar = this.doc.getElementsByTagName(tags[--k]);
252                var cc = null;
253
254                for (var i = ar.length; i > 0;) {
255                        cc = ar[--i];
256                        if (isContained(cc)) {
257                                cc.style.visibility = "visible";
258                                continue;
259                        }
260
261                        p = PopupDiv.getAbsolutePos(cc);
262                        var CX1 = p.x;
263                        var CX2 = cc.offsetWidth + CX1;
264                        var CY1 = p.y;
265                        var CY2 = cc.offsetHeight + CY1;
266
267                        if ((CX1 > EX2) || (CX2 < EX1) || (CY1 > EY2) || (CY2 < EY1)) {
268                                cc.style.visibility = "visible";
269                        } else {
270                                cc.style.visibility = "hidden";
271                        }
272                }
273        }
274};
275
276PopupDiv.prototype._dragStart = function (ev) {
277        if (this.dragging) {
278                return false;
279        }
280        this.dragging = true;
281        PopupDiv.currentPopup = this;
282        var posX = ev.clientX;
283        var posY = ev.clientY;
284        if (is_ie) {
285                posY += this.doc.body.scrollTop;
286                posX += this.doc.body.scrollLeft;
287        } else {
288                posY += window.scrollY;
289                posX += window.scrollX;
290        }
291        var st = this.element.style;
292        this.xOffs = posX - parseInt(st.left);
293        this.yOffs = posY - parseInt(st.top);
294        HTMLArea._addEvent(this.doc, "mousemove", PopupDiv.dragIt);
295        HTMLArea._addEvent(this.doc, "mouseover", HTMLArea._stopEvent);
296        HTMLArea._addEvent(this.doc, "mouseup", PopupDiv.dragEnd);
297        HTMLArea._stopEvent(ev);
298};
299
300PopupDiv.dragIt = function (ev) {
301        var popup = PopupDiv.currentPopup;
302        if (!(popup && popup.dragging)) {
303                return false;
304        }
305        is_ie && (ev = window.event);
306        var posX = ev.clientX;
307        var posY = ev.clientY;
308        if (is_ie) {
309                posY += this.doc.body.scrollTop;
310                posX += this.doc.body.scrollLeft;
311        } else {
312                posY += window.scrollY;
313                posX += window.scrollX;
314        }
315        popup.hideShowCovered();
316        var st = popup.element.style;
317        st.left = (posX - popup.xOffs) + "px";
318        st.top = (posY - popup.yOffs) + "px";
319        HTMLArea._stopEvent(ev);
320};
321
322PopupDiv.dragEnd = function () {
323        var popup = PopupDiv.currentPopup;
324        if (!popup) {
325                return false;
326        }
327        popup.dragging = false;
328        HTMLArea._removeEvent(popup.doc, "mouseup", PopupDiv.dragEnd);
329        HTMLArea._removeEvent(popup.doc, "mouseover", HTMLArea._stopEvent);
330        HTMLArea._removeEvent(popup.doc, "mousemove", PopupDiv.dragIt);
331        popup.hideShowCovered();
332};
333
334PopupDiv.checkPopup = function (ev) {
335        is_ie && (ev = window.event);
336        var el = is_ie ? ev.srcElement : ev.target;
337        var cp = PopupDiv.currentPopup;
338        for (; (el != null) && (el != cp.element); el = el.parentNode);
339        if (el == null) {
340                cp.modal || ev.type == "mouseover" || cp.close();
341                HTMLArea._stopEvent(ev);
342        }
343};
344
345PopupDiv.prototype.addButtons = function() {
346        var self = this;
347        var div = this.doc.createElement("div");
348        this.content.appendChild(div);
349        div.className = "buttons";
350        for (var i = 0; i < arguments.length; ++i) {
351                var btn = arguments[i];
352                var button = this.doc.createElement("button");
353                div.appendChild(button);
354                button.innerHTML = HTMLArea.I18N.buttons[btn];
355                switch (btn) {
356                    case "ok":
357                        button.onclick = function() {
358                                self.callHandler();
359                                self.close();
360                        };
361                        break;
362                    case "cancel":
363                        button.onclick = function() {
364                                self.close();
365                        };
366                        break;
367                }
368        }
369};
Note: See TracBrowser for help on using the repository browser.