blob: c85266847d35c5da001ad501a7dfe0b9c4633f88 [file] [log] [blame]
// (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=yes");
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 + "/";
}
// @fixme: why using a regex here and not a simple string test ?
if ( typeof _editor_url != "undefined" && ! ( /^\//.test(_editor_url) ) && ! ( /http:\/\//.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;
}
// @fixme: why using a regex here and not a simple string test ?
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(' + _editor_url + 'Xinha.css);</style>\n';
if ( _editor_skin != "" )
{
html += '<style type="text/css">@import url(' + _editor_url + 'skins/' + _editor_skin + '/skin.css);</style>\n';
}
html += "</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 = {};
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];
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()
{
// @fixme: isn't self a predefined variable used to access self frame in most browsers ?
// if yes, then we break it here
var self = this;
var div = this.doc.createElement("div");
this.content.appendChild(div);
div.id = "buttons";
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 = Xinha._lc(btn, 'Xinha');
switch (btn.toLowerCase())
{
case "ok":
Xinha.addDom0Event(button, 'click',
function()
{
self.callHandler();
self.close();
return false;
}
);
break;
case "cancel":
Xinha.addDom0Event(button, 'click',
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 = parseInt((w - el.offsetWidth) / 2, 10) + "px";
s.top = parseInt((h - el.offsetHeight) / 2, 10) + "px";
if (Xinha.is_gecko)
{
self.window.innerWidth = w;
self.window.innerHeight = h;
}
else
{
self.window.resizeTo(w + 8, h + 70);
}
},
25);
};