// (c) dynarch.com 2003-2004 // Distributed under the same terms as HTMLArea itself. function PopupWin(editor, title, handler, initFunction) { this.editor = editor; this.handler = handler; var dlg = window.open("", "__ha_dialog", "toolbar=no,menubar=no,personalbar=no,width=600,height=600,left=20,top=40" + "scrollbars=no,resizable=no"); this.window = dlg; var doc = dlg.document; this.doc = doc; var self = this; var base = document.baseURI || document.URL; if (base && base.match(/(.*)\/([^\/]+)/)) { base = RegExp.$1 + "/"; } if (typeof _editor_url != "undefined" && !/^\//.test(_editor_url)) { // _editor_url doesn't start with '/' which means it's relative // FIXME: there's a problem here, it could be http:// which // doesn't start with slash but it's not relative either. base += _editor_url; } else base = _editor_url; if (!/\/$/.test(base)) { // base does not end in slash, add it now base += '/'; } this.baseURL = base; doc.open(); var html = "<html><head><title>" + title + "</title>\n"; // html += "<base href='" + base + "htmlarea.js' />\n"; html += "<style type='text/css'>@import url(" + base + "htmlarea.css);</style></head>\n"; html += "<body class='dialog popupwin' id='--HA-body'></body></html>"; doc.write(html); doc.close(); // sometimes I Hate Mozilla... ;-( function init2() { var body = doc.body; if (!body) { setTimeout(init2, 25); return false; } dlg.title = title; doc.documentElement.style.padding = "0px"; doc.documentElement.style.margin = "0px"; var content = doc.createElement("div"); content.className = "content"; self.content = content; body.appendChild(content); self.element = body; initFunction(self); dlg.focus(); }; init2(); }; PopupWin.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]; var val = el.value; if (el.tagName.toLowerCase() == "input") { if (el.type == "checkbox") { val = el.checked; } } params[el.name] = val; } } this.handler(this, params); return false; }; PopupWin.prototype.close = function() { this.window.close(); }; PopupWin.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(); return false; }; break; case "cancel": button.onclick = function() { self.close(); return false; }; break; } } }; PopupWin.prototype.showAtElement = function() { var self = this; // Mozilla needs some time to realize what's goin' on.. setTimeout(function() { var w = self.content.offsetWidth + 4; var h = self.content.offsetHeight + 4; // size to content -- that's fuckin' buggy in all fuckin' browsers!!! // so that we set a larger size for the dialog window and then center // the element inside... phuck! // center... var el = self.content; var s = el.style; // s.width = el.offsetWidth + "px"; // s.height = el.offsetHeight + "px"; s.position = "absolute"; s.left = (w - el.offsetWidth) / 2 + "px"; s.top = (h - el.offsetHeight) / 2 + "px"; if (HTMLArea.is_gecko) { self.window.innerWidth = w; self.window.innerHeight = h; } else { self.window.resizeTo(w + 8, h + 35); } }, 25); };