// ***** Copyright ©2003 Frogtrade Limited. All rights reserved *****
//
// Purpose: 
//
// Notes: 
//

function broker()
{
	ft_broker=this;
	this.object_array=new Array();
	this.window_array=new Array();
	this.windows_initializing_objects=new Array();
	this.event_callbacks=new Array();
	this.event_callbacks['onmousedown']=new Array();
	this.event_callbacks['onmouseup']=new Array();
	this.event_callbacks['onclick']=new Array();
	this.event_callbacks['ondblclick']=new Array();
	this.event_callbacks['onmouseover']=new Array();

	this.add_js_object=broker_add_js_object;
	this.get_js_object=broker_get_js_object;
	this.remove_js_object=broker_remove_js_object;
	this.add_mouse_event_callback=broker_add_mouse_event_callback;
	this.add_key_event_callback=broker_add_key_event_callback;
	this.mouse_event_occured=broker_mouse_event_occured;
	this.register_window=broker_register_window;
	this.site_loaded=broker_site_loaded;
	this.initializing_objects=broker_initializing_objects;
	this.objects_initialized=broker_objects_initialized;
	this.all_objects_initialized=broker_all_objects_initialized;
	this.init_popup_controller=broker_init_popup_controller;
}


function broker_init_popup_controller(pc)
{
	if (!this.popup_controller)
	{
		this.popup_controller=new popup_controller();
		this.add_mouse_event_callback('onmousedown', hide_all_popups);
	}
}

// Adds a js_object to the broker
function broker_add_js_object(js_object)
{
	var debug_messages=(typeof(ft_debug_messages)!="undefined");
	if (!js_object)
	{
		return false;
	}
	else if (!js_object.object_ref || !js_object.object_type)
	{
		if (debug_messages)
		{
			show_ft_debug_message("broker",
								  "Tried to add an object with no or a false object_ref or object_type to the broker.");
		}
		return false;
	}
/*	else if (this.object_array[js_object.object_type + "_" + js_object.object_ref])
	{
		if (debug_messages)
		{
			show_ft_debug_message("broker",
								  "Tried to add an object with object_type: " + js_object.object_type + " and object_ref: " + js_object.object_ref + " to the broker.\nAn object with this object_ref and object_type is already present in the broker.");
		}
		return false;
	}
*/	else
	{
		this.object_array[js_object.object_type + "_" + js_object.object_ref]=js_object;
		return true;
	}
}

function broker_get_js_object(js_object_type, js_object_ref)
{
	return this.object_array[js_object_type + "_" + js_object_ref]
}

function broker_remove_js_object(js_object_type, js_object_ref)
{
// something is needed here, a split on the array or something oor maybe set to null
}

function broker_add_mouse_event_callback(event_name, cb_func)
{
	// events supported : onmousedown, onmouseup, onclick, ondblclick
	if (this.event_callbacks[event_name])
	{
		this.event_callbacks[event_name][this.event_callbacks[event_name].length]=cb_func;
	}
	else
	{
// need to report an error here
	}
}

function broker_add_key_event_callback()
{

}

function broker_mouse_event_occured(event_name, event)
{
	if ( (cbs=this.event_callbacks[event_name]) )
	{
		for (var i=0; i<cbs.length; i++)
		{
			cbs[i](event);				
		}
	}
}

function broker_register_window(win)
{
	var window_id=this.window_array.length;
	this.window_array[window_id]=win;
	return window_id;
}

function broker_site_loaded()
{
	for (var i=0; i<this.window_array.length; i++)
	{
		try
		{
			if (this.window_array[i].document.readyState!='complete')
			{
				return false;
			}
		}
		catch (e)
		{
		}
	}
	return true;
}

function broker_all_objects_initialized()
{
	for (key in this.windows_initializing_objects)
	{
		if (this.windows_initializing_objects[key]==true)
		{
			return false;
		}
	}
	return true;
}

function broker_initializing_objects(window_id)
{
	this.windows_initializing_objects[window_id]=true;
}

function broker_objects_initialized(window_id)
{
	this.windows_initializing_objects[window_id]=false;
}


// broker location function
// needs work
function get_broker(tgt_win)
{
	tgt_win=(tgt_win?tgt_win:window);
	if (!tgt_win.ft_broker)
	{
		if (window.parent==window)
		{
			return null;
		}
		else
		{
			return get_broker(window.parent);
		}
	}
	else
	{
		return tgt_win.ft_broker;
	}
}

// broker location function
// needs work
function get_pc(tgt_win)
{
	var broker=get_broker(tgt_win);
	if (broker)
	{
		return broker.popup_controller;
	}
	else
	{
// some error
	}
}

function get_html_element(object_type, object_ref, html_parent, html_window)
{
	html_element=(html_parent?html_parent: (html_window?html_window.document:document) );
	var tgt=html_element.getElementById([object_type + "_" + object_ref]);

	if (!tgt)
	{
		return tgt;
	}
	else if (!tgt.length)
	{
		return tgt;
	}
	else if (typeof(ft_debug_messages)!="undefined")
	{
		show_ft_debug_message("broker",
							  "Tried to access html element by id: " + object_type + "_" + object_ref + ".\nMore than one element in the DOM with this id.")
	}
}

function get_element_borders(elem)
{
	var detect = navigator.userAgent.toLowerCase();
	var is_mac=detect.indexOf('mac') + 1;

	var borders=new Object()
	borders.top=(elem.clientTop && !is_mac ? elem.clientTop : 0);
	borders.left=(elem.clientLeft && !is_mac ? elem.clientLeft : 0);

	return borders;
}

function get_absolute_position(elem)
{
	var x, y, win;
	x=0;
	y=0;

	while(elem)
	{
		if (document.all)
		{
			win=elem.document.parentWindow;
		}
		else
		{
			win=elem.ownerDocument.defaultView;
		}

		borders=get_element_borders(elem);
		x+=elem.offsetLeft + borders.left - elem.scrollLeft;
		y+=elem.offsetTop + borders.top - elem.scrollTop;

		while (elem=elem.offsetParent)
		{
			borders=get_element_borders(elem);
			// the borders top and left are needed here because IE does not take them into account
			x+=elem.offsetLeft + borders.left - elem.scrollLeft;
			y+=elem.offsetTop + borders.top - elem.scrollTop;
		}

		if (win.parent!=win)
		{
			try
			{
				elem=win.parent.document.getElementsByName(win.name)[0];

				if ((!elem || elem.length) && win.frameElement)
				{	// IE 5.5 only
					elem=win.frameElement;
				}
			}
			catch(e)
			{
				elem=false;
				var no_parent_access=1
			}

			if (!elem && !no_parent_access)
			{
// ERROR problem finding parent frame or iframe element
				return false;
			}
		}
	}

	// remove the border width added for the body of the top document. This should not be added
	x+= -borders.left;
	y+= -borders.top;

	var coords=new Object();
	coords.x=x;
	coords.y=y;
	return coords;
}

function hide_all_popups(event)
{
	if (get_broker().popup_controller) get_broker().popup_controller.hide_popup();
}

