function __dlg_onclose() {
	if (!document.all) {
		opener.WidgetDialog._return(null);
	}
};

function __dlg_init() {
	if (!document.all) {
		// init dialogArguments, as IE gets it
		window.dialogArguments = opener.WidgetDialog._arguments;
		/*window.sizeToContent();
		window.sizeToContent();	// for reasons beyond understanding,
					// only if we call it twice we get the
					// correct size.*/
		window.addEventListener("unload", __dlg_onclose, true);
		// center on parent
		var px1 = opener.screenX;
		var px2 = opener.screenX + opener.outerWidth;
		var py1 = opener.screenY;
		var py2 = opener.screenY + opener.outerHeight;
		var x = (px2 - px1 - window.outerWidth) / 2;
		var y = (py2 - py1 - window.outerHeight) / 2;
		window.moveTo(x, y);
		/*var body = document.body;
		window.innerHeight = body.offsetHeight;
		window.innerWidth = body.offsetWidth;*/
	} else {
		/*var body = document.body;
		window.dialogHeight = body.offsetHeight + 50 + "px";
		window.dialogWidth = body.offsetWidth + "px";*/
	}
};

// closes the dialog and passes the return info upper.
function __dlg_close(val) {
	if (document.all) {	// IE
		window.top.returnValue = val;
	} else {
		opener.WidgetDialog._return(val);
	}
	window.close();
};



function convertSize(value, browser) {
	return browser == "IE" ? (parseInt(value) + 50) + "px" : parseInt(value);
}

function convertBool(value) {
	return value ? "yes" : "no";
}


// Though "Dialog" looks like an object, it isn't really an object.  Instead
// it's just namespace for protecting global symbols.

function WidgetDialog(sURL, fAction, oArguments, oParams) {
	if (typeof oArguments == "undefined") {
		oArguments = window;	// pass this window object by default
	}
	var args = {
		IE: {
			separator: "; ",
			assign: ": ",
			options: {
				height: {name: "dialogHeight", convert: convertSize},
				width: {name: "dialogWidth", convert: convertSize},
				help: {name: "help", convert: convertBool},
				resizable: {name: "resizable", convert: convertBool},
				scrollbar: {name: "scroll", convert: convertBool},
				statusbar: {name: "status", convert: convertBool}
			}
		},
		Moz: {
			separator: ", ",
			assign: "=",
			options: {
				height: {name: "height", convert: convertSize}, 
				width: {name: "width", convert: convertSize},
				resizable: {name: "resizable", convert: convertBool}, 
				scrollbar: {name: "scrollbars", convert: convertBool}
			}
		}
	};
	
	var params = { IE: "", Moz: "toolbar=no, menubar=no, personalbar=no"};
	for (var i in oParams) {
		for (var browser in params) {

			if (params[browser]) {
				params[browser] += args[browser].separator;
			}
			if (typeof args[browser].options[i] == "object" && typeof args[browser].options[i].convert == "function") {
				params[browser] += args[browser].options[i].name + args[browser].assign + args[browser].options[i].convert(oParams[i], browser);
			}
		}
	}

	if (!Browser.is_gecko) {

		var value =	showModalDialog(sURL, oArguments, params["IE"]);
		if (typeof fAction == "function") {
			fAction(value);
		}
	} else {
		return WidgetDialog._geckoOpenModal(sURL, fAction, oArguments, params["Moz"]);
	}
};

WidgetDialog._parentEvent = function(ev) {
	if (WidgetDialog._modal && !WidgetDialog._modal.closed) {
		WidgetDialog._modal.focus();
		// We get here in Mozilla only, anyway, so we can safely use
		// the DOM version.
		ev.preventDefault();
		ev.stopPropagation();
	}
};

// should be a function, the return handler of the currently opened dialog.
WidgetDialog._return = null;

// constant, the currently opened dialog
WidgetDialog._modal = null;

// the dialog will read it's args from this variable
WidgetDialog._arguments = null;

WidgetDialog._geckoOpenModal = function(sURL, fAction, oArguments, oParams) {
	var dlg = window.open(sURL, "ha_dialog", oParams);
	WidgetDialog._modal = dlg;
	WidgetDialog._arguments = oArguments;

	// capture some window's events
	function capwin(w) {
		w.addEventListener("click", WidgetDialog._parentEvent, true);
		w.addEventListener("mousedown", WidgetDialog._parentEvent, true);
		w.addEventListener("focus", WidgetDialog._parentEvent, true);
	};
	// release the captured events
	function relwin(w) {
		w.removeEventListener("focus", WidgetDialog._parentEvent, true);
		w.removeEventListener("mousedown", WidgetDialog._parentEvent, true);
		w.removeEventListener("click", WidgetDialog._parentEvent, true);
	};
	capwin(window);
	// capture other frames
	for (var i = 0; i < window.frames.length; capwin(window.frames[i++]));
	// make up a function to be called when the Dialog ends.
	WidgetDialog._return = function (val) {
		if (val && typeof fAction == "function") {
			fAction(val);
		}
		relwin(window);
		// capture other frames
		for (var i = 0; i < window.frames.length; relwin(window.frames[i++]));
		WidgetDialog._modal = null;
	};
};

