[ Index ] |
|
Code source de Serendipity 1.2 |
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 11 var is_ie = ( (navigator.userAgent.toLowerCase().indexOf("msie") != -1) && 12 (navigator.userAgent.toLowerCase().indexOf("opera") == -1) ); 13 var is_compat = (document.compatMode == "BackCompat"); 14 15 function 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 73 PopupDiv.currentPopup = null; 74 75 PopupDiv.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 117 PopupDiv.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 134 PopupDiv.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 171 PopupDiv.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 186 PopupDiv.prototype.getForm = function() { 187 var forms = this.content.getElementsByTagName("form"); 188 return (forms.length > 0) ? forms[0] : null; 189 }; 190 191 PopupDiv.prototype.callHandler = function() { 192 var tags = ["input", "textarea", "select"]; 193 var params = new Object(); 194 for (var ti = tags.length; --ti >= 0;) { 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 206 PopupDiv.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 216 PopupDiv.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 226 PopupDiv.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 276 PopupDiv.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 300 PopupDiv.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 322 PopupDiv.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 334 PopupDiv.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 345 PopupDiv.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 };
titre
Description
Corps
titre
Description
Corps
titre
Description
Corps
titre
Corps
Généré le : Sat Nov 24 09:00:37 2007 | par Balluche grâce à PHPXref 0.7 |
![]() |