/*
	Roku.Popup
*/

if(typeof(Roku) == "undefined")
    Roku = { classes : [] };

Roku.Popup =
{
	popupClassName		: "popup",
	closeClassName		: "close",

	currentPopup		: null
};

Roku.classes.push(Roku.Popup);

Roku.Popup.show = function(popup, element, x, y, arrowOffsetX)
{
	if(!popup || !element)
		return;

	this.hidePopup(popup);
	this.currentPopup = popup;
	
	popup.currentElement = element;
	
	popup.style.left = x + "px"; 
	popup.style.top = y + "px";
	
	var widget = this.parentWidget(element);
	if(widget)
		Roku.Widget.enable(widget, false);
	
	popup.style.visibility = "visible";
	popup.style.display = "block";
	this.setArrowsOffset(popup, arrowOffsetX);
	popup.focus(); 
}

Roku.Popup.on_clicked_popup_close = function(ev)
{
	var element = Roku.Util.srcEventElement(ev);
	var popup = Roku.Util.parentClassElement(element, this.popupClassName);
	this.hidePopup(popup);
}

Roku.Popup.setArrowsOffset = function(popup, offset)
{
	this.clearFillWidths(popup, "ftl", "ftr", "fbl", "fbr");
	this.setArrowOffset(popup, offset, "tl", "ftl", "ta", "ftr", "tr");
	this.setArrowOffset(popup, offset, "bl", "fbl", "ba", "fbr", "br");
}

Roku.Popup.setArrowOffset = function(popup, offset, l, fl, a, fr, r)
{
	var fill_left = Roku.Util.childIdElement(popup, fl);
	if(fill_left)
		fill_left.width = 1;
	
	var fill_right = Roku.Util.childIdElement(popup, fr);
	if(fill_right)
		fill_right.width = 1;
	
	var currentWidth = popup.offsetWidth;
	
	var left_edge = Roku.Util.childIdElement(popup, l);
	if(left_edge)
	{
		currentWidth -= left_edge.offsetWidth;
		offset -= left_edge.offsetWidth;
	} 
	
	var right_edge = Roku.Util.childIdElement(popup, r);
	currentWidth -= right_edge ? right_edge.offsetWidth : 0;

	var arrow =  Roku.Util.childIdElement(popup, a);
	if(arrow)
	{
		currentWidth -= arrow.offsetWidth;
		offset -= arrow.offsetWidth / 2;
	}
	
	if(fill_left)
	{
		fill_left.width = Math.max(offset, 1);
		currentWidth -= Math.max(offset, 1);
	}
	
	if(fill_right)
	{
		fill_right.width = Math.max(currentWidth, 1);
	} 
}

Roku.Popup.clearFillWidths = function(popup, fills)
{
	for(var index in fills)
	{
		var fill = Roku.Util.childIdElement(popup, fills[index]);
		if(fill)
			fill.width = 1;
	}
}

Roku.Popup.showArrow = function(popup, a, show)
{
	var arrow =  Roku.Util.childIdElement(popup, a);
	if(arrow)
		arrow.style.display = show ? "block" : "none";
}


Roku.Popup.hidePopup = function(popup)
{
	if(!popup)
		popup = this.currentPopup;
	if(popup)
	{
		popup.style.display = "none";
		popup.style.visibility = "hidden";

		var widget = this.parentWidget(popup.currentElement);
		if(widget)
			Roku.Widget.enable(widget, true);
		
		popup.currentElement = null;
	}
}

Roku.Popup.need_mouse_down = function()
{
	return Roku.Popup.currentPopup;
}

Roku.Popup.on_mouse_down = function(ev)
{
	var element = Roku.Util.srcEventElement(ev);
	if(!element)
		return;
		
	if(Roku.Util.parentClassElement(element, Roku.Popup.popupClassName))
		return;
	
	var widget = this.parentWidget(element);
	if(widget && Roku.Widget.disabled(widget))
		return; 

	Roku.Popup.hidePopup();
}

Roku.Popup.parentWidget = function(element)
{
	return Roku.Widget ? Roku.Util.parentClassElement(element, Roku.Widget.widgetClassName) : null;
}

Roku.Popup.initialize = function()
{
	var popups = (Roku.Body && Roku.Body.all) ? Roku.Body.all[this.popupClassName] : Roku.Util.childrenClassElements(document.body, this.popupClassName);
	var popups_count = popups ? popups.length : 0;
	for(var iPopup = 0; iPopup < popups_count; iPopup++)
		this.initialize_popup(popups[iPopup])
}

Roku.Popup.initialize_popup = function(popup)
{
	var closeHandler = function() { return Roku.Popup.on_clicked_popup_close((0 < arguments.length) ? arguments[0] : null); };
	
	var close_list = Roku.Util.childrenClassElements(popup, this.closeClassName);
	var close_list_count = close_list.length;
	for(var iClose = 0; iClose < close_list_count; iClose++)  
	{
		var close = close_list[iClose];
		Roku.Util.eventHandler(close, "click", closeHandler);
	}
}

