function xbig_manager ()
{
	// "internal" methods (i.e. data parsing/management)
	this.initialise		= xbig_initialise;
	this.load_filter_xml	= xbig_load_filter_xml;
	this.load_news_xml	= xbig_load_news_xml;

	// "external" methods (i.e. UI management)
	this.render_all			= xbig_render_all;
	this.render_disclaimer_div	= xbig_render_disclaimer_div;
	this.render_filters_div		= xbig_render_filters_div;
	this.render_header_div		= xbig_render_header_div;
	this.render_news_div		= xbig_render_news_div;

	// Attributes
	// 1: Standard DIVs
	this.disclaimer_div	= false;
	this.filters_div	= false;
	this.header_div		= false;
	this.news_div		= false;

	// 2: Standard XML objects
	this.filter_list_obj 	= false;
	this.news_obj		= false;
	this.review_list_obj 	= false;

	// 3: "internal" variables
	this.initialised	= false;

	this.disclaimer_url	= 'data/disclaimer.html';
	this.filter_xml_url	= 'php/get_filter_list.php';
	this.header_url		= 'data/header.html';
	this.news_xml_url	= 'php/get_headlines_list.php';

	gbl_timer.mark ('xbig_manager instantiated');
}

function xbig_initialise (review_count, review_offset, news_count)
{
	var i		= 0;
	var rg_list 	= false;
	var rg_node	= false;
	var g_obj	= false;
	var t_str	= '';
	var n_str	= '';

	// 1: Load all the standard <div> elements
	// Management of content_div (et al) is left as an exercise for the caller...
	this.disclaimer_div	= new div_manager ('disclaimer_div');
	this.filters_div	= new div_manager ('filters_div');
	this.header_div		= new div_manager ('header_div');
	this.news_div		= new div_manager ('news_div');
	gbl_timer.mark ('xbig_manager: divs initialised');

	this.load_news_xml (review_count, review_offset, news_count);
	gbl_timer.mark ('xbig_manager: news XML init complete');

	this.load_filter_xml ();
	gbl_timer.mark ('xbig_manager: filter XML init complete');

	this.initialised = true;
	gbl_timer.mark ('xbig_manager initialised');
}

function xbig_load_filter_xml ()
{
	this.filter_list_obj 	= new jxte (this.filter_xml_url);
	this.filter_list_obj.set_attribute ('filters_expanded', 'yes');
	this.filter_list_obj.set_attribute ('search_type', 'or');
}

function xbig_render_all (page_name)
{
	// We use the current/default "expanded" settings when rendering all the divs
	// We also render the filters last, as they're likely to take longest
	this.render_header_div ();
	gbl_timer.mark ('xbig_manager: headers rendered');

	this.render_disclaimer_div ();
	gbl_timer.mark ('xbig_manager: disclaimer rendered');

	this.render_news_div (false);
	gbl_timer.mark ('xbig_manager: news rendered');


	// The filters have extra features on the search page...
	if (page_name == 'search')
		this.render_filters_div	(-1, false, false, true);
	else
		this.render_filters_div	(-1, false, false);

	gbl_timer.mark ('xbig_manager: filters rendered');
}

function xbig_load_news_xml (review_count, review_offset, news_count, add_review_tags)
{
	var i		= 0;
	var xml_found	= false;
	var tmp_obj	= false;
	var t_array	= false;
	var t_node	= false;
	var g_node	= false;
	var xml_url	= '';
	var t_str	= '';
	var expanded	= '';
	var t_list	= false;

	// Set sane default values
	review_count 	= (typeof (review_count) 	!= 'undefined' 	? review_count 		: 10);
	review_offset 	= (typeof (review_offset) 	!= 'undefined' 	? review_offset 	: 0);
	news_count 	= (typeof (news_count) 		!= 'undefined'	? news_count 		: 10);

	try
	{
		xml_url = this.news_xml_url + '?review_count=' + review_count + '&review_offset=' + review_offset + "&news_count=" + news_count;
		tmp_obj = new jxte ();
		xml_found = tmp_obj.load_from_url (xml_url, true);
	}
	catch (err_obj)
	{
		alert ('Unable to load news_xml from ' + xml_url);
		xml_found = false;
	}

	if (this.news_obj != false)
	{
		// This function can be re-called on the index page, if the user wants to scroll through older news articles
		// We therefore need to ensure continuity for the "Recent" sections and their "expanded" settings
		t_array = new Array ('new_comments', 'new_reviews');
		for (i = 0; i < t_array.length; i++)
		{
			t_str = t_array[i];

			// 1: read...
			t_node = this.news_obj.get_elements_by_tag_name(t_str)[0];
			expanded = t_node.get_attribute('expanded', 'yes');

			// 2: write!
			t_node = tmp_obj.get_elements_by_tag_name(t_str)[0];
			t_node.set_attribute('expanded', expanded);
		}
	}

	this.news_obj = tmp_obj;
}

function xbig_render_filters_div (flip_visibility, filter_name, search_type, search_page)
{
	var i		= 0;
	var f_node	= false;
	var f_list	= false;

	var td_obj	= false;
	var visibility	= this.filter_list_obj.get_attribute('filters_expanded', 'no');

	// Check if we need to update the entire pane...
	if (flip_visibility != -1)
	{
		visibility = (visibility == 'no' ? 'yes' : 'no');
		this.filter_list_obj.set_attribute ('filters_expanded', visibility);

		td_obj = document.getElementById ('gui_sidebar_right');

		if (visibility == 'no')
			td_obj.style.width='1%';
		else
			td_obj.style.width='15%';
	}

	// or just a subsection
	if (filter_name)
	{
		// this.review_list_obj should never contain more than half a dozen or so filters, so we just use a 
		// brute force search instead of caching
		f_list	= this.filter_list_obj.get_elements_by_tag_name ('filter', 2);

		for (i = 0; i < f_list.length; i++)
		{
			f_node = f_list[i];
			if (f_node.get_attribute('safe_name') == filter_name)
			{
				if (f_node.get_attribute('expanded', 'yes') == 'yes')
					f_node.set_attribute ('expanded', 'no');
				else
					f_node.set_attribute ('expanded', 'yes');
		
				break;
			}
		}
	}

	// search_type is set to and/or
	if (search_type)
		this.filter_list_obj.set_attribute ('search_type', search_type);

	if (search_page)
		this.filter_list_obj.set_attribute ('full_filter_view', 'yes');
	

	str = this.filter_list_obj.render_with_xsl ('xsl/gbl_filters_div.xsl');
	this.filters_div.set_content (str);
}

function xbig_render_header_div ()
{
	var str 	= '';

	// The header (currently) isn't dynamic, so we simply store it in a HTML file and slurp it straight back out again...
	str = load_url_contents (this.header_url);
	this.header_div.set_content (str);
}

function xbig_render_disclaimer_div ()
{
	var str = '';
	
	// The disclaimer (currently) isn't dynamic, so we simply store it in a HTML file and slurp it straight back out again...
	str = load_url_contents (this.disclaimer_url);
	this.disclaimer_div.set_content (str);
}

function xbig_render_news_div (flip_visibility)
{
	var str 	= '';
	var td_obj	= false;
	var visibility	= this.news_obj.get_attribute('news_expanded', 'no');

	if (flip_visibility != -1)
	{
		visibility = (visibility == 'no' ? 'yes' : 'no');
		this.news_obj.set_attribute ('news_expanded', visibility);

		td_obj = document.getElementById ('gui_sidebar_left');

		if (visibility == 'no')
			td_obj.style.width='1%';
		else
			td_obj.style.width='15%';
	}

	str = this.news_obj.render_with_xsl ("xsl/gbl_news_div.xsl");
	this.news_div.set_content (str);
}

function load_search_engine (filter_safe_name, tag_name)
{
	var tag_safe_name = sanitise_str (tag_name);
	var url = 'search.html?filter_name=' + filter_safe_name + '&tag_name=' + tag_safe_name;
	window.location = url;
}

function submit_text_search (ev_obj)
{
	var t_node	= false;
	var str		= '';
	var url		= '';

	//alert (ev_obj +': ' + ev_obj.keyCode);
	// Simple helper to get around IE/Mozilla differences.  IE uses window.event, Mozilla uses event
	if (!ev_obj ||ev_obj.keyCode == 13)
	{
		// Extract the text from the input field
		t_node	= document.getElementById('search_text');
		str	= escape (t_node.value);

		url	= 'search.html?search_text=' + str;
		window.location = url;
	}
}

function submit_tag_search (filter_name, tag_str)
{
	var url		= '';

	// Extract the text from the input field
	tag_str	= sanitise_str (tag_str);
	url	= 'search.html?filter_name=' + filter_name + '&tag_name='+ escape(tag_str);
	window.location = url;
}

