/*
	Roku.Dialog
*/

if(typeof(Roku) == "undefined")
    Roku = { classes : [] };

Roku.Dialog =
{
	className			: "dialog",
	closeClassName		: "close",
	captionClassName	: "caption",
	closeEventName		: "on_closed",

	modalDialog			: null,
	disableOverlap		: null,
	
	dragDialog			: null,
	dragStartPos		: null,
	dragStartMouse		: null
};

Roku.classes.push(Roku.Dialog);

Roku.Dialog.on_close = function()
{
	this.hide();
}

Roku.Dialog.show = function(dialog, ev)
{
	if(!dialog || this.modalDialog)
		return;
		
	var content_rect = { left : 0, top : 0, width : document.body.clientWidth, height : document.body.clientHeight };
	 
	this.disableOverlap = document.createElement("div");
	this.disableOverlap.style.position = "absolute";
	this.disableOverlap.style.zIndex = "99";
	this.disableOverlap.style.left = "0px";				
	this.disableOverlap.style.top = "0px";
	this.disableOverlap.style.width = (content_rect.left + content_rect.width + 20) + "px";
	this.disableOverlap.style.height = (content_rect.top + content_rect.height) + "px";
	this.disableOverlap.style.backgroundColor = "#ABABAB";
	this.disableOverlap.style.filter = "alpha(opacity=80)";
	this.disableOverlap.style.opacity = 0.8;	
	document.body.appendChild(this.disableOverlap);
	
	dialog.style.visibility = "hidden";
	dialog.style.display = "block";
	
	var scrollX = 0, scrollY = 0;
	if(ev)
	{
		var element = Roku.Util.srcEventElement(ev);
		var elementRect = Roku.Util.elementRect(element);
		var parentRect = Roku.Util.elementRect(element ? element.offsetParent : null);
		
		if(ev.offsetX && ev.offsetY)
		{
			// IE
			if(Roku.Util.CompareNoCase(element.tagName, "span"))
			{
				scrollX = parentRect.left - (ev.clientX - ev.offsetX);
				scrollY = parentRect.top - (ev.clientY - ev.offsetY);
			}
			else
			{
				scrollX = elementRect.left - (ev.clientX - ev.offsetX);
				scrollY = elementRect.top - (ev.clientY - ev.offsetY);
			}
		}
		else if(ev.pageX && ev.pageY)
		{
			// Mozilla
			scrollX = ev.pageX - ev.clientX;
			scrollY = ev.pageY - ev.clientY;
		}
	}

	var windowWidth = Roku.Util.clientWidth();
	var windowHeight = Roku.Util.clientHeight();
	
	dialog.style.left = (scrollX + (windowWidth - dialog.offsetWidth) / 2) + "px"; 
	dialog.style.top = (scrollY + (windowHeight - dialog.offsetHeight) / 2) + "px";
	
	dialog.style.visibility = "visible";
	dialog.focus();
	
	this.modalDialog = dialog;
}

Roku.Dialog.hide = function()
{
	if(!this.modalDialog)
		return;
		
	if(this.disableOverlap)
	{
		document.body.removeChild(this.disableOverlap);
		this.disableOverlap = null;
	}
	
	if(this.modalDialog)
	{
		this.modalDialog.style.display = "none";

		if(typeof(this.modalDialog[this.closeEventName]) == "function")
			this.modalDialog[this.closeEventName](this.modalDialog);
		
		this.modalDialog = null;
	}
}

Roku.Dialog.on_mouse_down = function(ev)
{
	var element = Roku.Util.srcEventElement(ev);
	var dialog = Roku.Util.parentClassElement(element, this.className);
	if(this.dragDialog || !dialog || !ev)
		return;
		
	this.dragDialog = dialog;
	this.dragStartPos = { X : dialog.offsetLeft, Y : dialog.offsetTop };
	this.dragStartMouse = { X : ev.clientX, Y : ev.clientY };
	
	if(dialog.setCapture)
		dialog.setCapture();
}

Roku.Dialog.on_mouse_move = function(ev)
{
	if(!this.dragDialog || !ev) 
		return;

	this.dragDialog.style.left = (this.dragStartPos.X + ev.clientX - this.dragStartMouse.X) + "px";
	this.dragDialog.style.top = (this.dragStartPos.Y + ev.clientY - this.dragStartMouse.Y) + "px";
}

Roku.Dialog.need_mouse_move = function()
{
	return this.dragDialog; 
}

Roku.Dialog.on_mouse_up = function(ev)
{
	if(this.dragDialog && this.dragDialog.releaseCapture)
		this.dragDialog.releaseCapture();
		
	this.dragDialog = null;
	this.dragStartPos = null;
	this.dragStartMouse = null;
}

Roku.Dialog.need_mouse_up = function()
{
	return this.dragDialog; 
}

Roku.Dialog.on_key_down = function(ev)
{
	if(ev && (ev.keyCode == 27))	//VK_ESC
		this.hide();
}


Roku.Dialog.initialize = function()
{
	var dialogs = Roku.Body.all ? Roku.Body.all[this.className] : Roku.Util.childrenClassElements(document.body, this.className);
	var dialogs_count = dialogs ? dialogs.length : 0;
	for(var iDialog = 0; iDialog < dialogs_count; iDialog++)
	{
		var dialog = dialogs[iDialog];
		Roku.Util.eventHandler(dialog, "keydown", function(ev) { Roku.Dialog.on_key_down(ev); })
		
		var close = Roku.Util.childClassElement(dialog, this.closeClassName);
		Roku.Util.eventHandler(close, "click", function(ev) { Roku.Dialog.on_close(ev); })
		
		var caption = Roku.Util.childClassElement(dialog, this.captionClassName);
		Roku.Util.eventHandler(caption, "mousedown", function(ev) { Roku.Dialog.on_mouse_down(ev); })
	}

}

