/*======================================================================*\
|| #################################################################### ||
|| # vBulletin Custom File - Licence Number L4648f56
|| # ---------------------------------------------------------------- # ||
|| # Copyright ©2000-2006 Jelsoft Enterprises Ltd. All Rights Reserved. ||
|| # This file may not be redistributed in whole or significant part. # ||
|| # ---------------- VBULLETIN IS NOT FREE SOFTWARE ---------------- # ||
|| # http://www.vbulletin.com | http://www.vbulletin.com/license.html # ||
|| #################################################################### ||
\*======================================================================*/

vB_AJAX_HaultRefresh = {};
vB_AJAX_DetailCache = {};
vB_AJAX_ActiveCache = {};
vB_Calendar_Table = null
vB_AJAX_Actuals = {};
vB_AJAX_Charts = {};
vB_AJAX_Details = {};
vB_AJAX_Chart_URIs = {};

/**
* Adds onclick events to appropriate elements for AJAX actions
* Also loads all detail view buttons / chart buttons
*
* @param	string	The ID of the table that contains ajax trigger events
*/
function vB_AJAX_RefreshData_Init(tableid)
{
	if (typeof detail_loader != 'undefined')
	{
		for (var d = 0; d < detail_loader.length; d++)
		{
			load_detail_button(detail_loader[d][0], detail_loader[d][1], detail_loader[d][2], detail_loader[d][3], detail_loader[d][4])
		}
	}


	if (typeof chart_loader != 'undefined')
	{
		for (var d = 0; d < chart_loader.length; d++)
		{
			load_chart_button(chart_loader[d][0], chart_loader[d][1], chart_loader[d][2], chart_loader[d][3])
		}
	}

	if (AJAX_Compatible && (typeof vb_disable_ajax == 'undefined' || vb_disable_ajax < 2))
	{
		var tds = fetch_tags(fetch_object(tableid), 'td');
		for (var i = 0; i < tds.length; i++)
		{
			if (tds[i].id && tds[i].id.substr(0, 7) == 'actual_')
			{
				// innerHTML is the actual
				tds[i].onclick = refresh_actual;
			}

			if (fetch_tags(tds[i], 'a')[0] && fetch_tags(tds[i], 'a')[0].id && fetch_tags(tds[i], 'a')[0].id.match(/^detail_/))
			{
				// innerHTML contains detail view
				fetch_tags(tds[i], 'a')[0].onclick = refresh_detail;
			}

			if (fetch_tags(tds[i], 'a')[0] && fetch_tags(tds[i], 'a')[0].id && fetch_tags(tds[i], 'a')[0].id.match(/^chart_/))
			{
				// innerHTML contains detail view
				fetch_tags(tds[i], 'a')[0].onclick = refresh_chart;
			}
		}

		vB_Calendar_Table = fetch_object(tableid)
	}
}

vB_Active_RB_Totals = 0;
var vB_Fetched_RBs = false;
var vB_Multi_RBs = false;

/**
* Class to handle pending to published actual values with AJAX
*
* @param	string	The actual to resolve
* @param	string	The ID of the object that the resolved actual will replace
*/
function vB_AJAX_RefreshData(actual, objid)
{
	this.actual = actual;
	this.objid = fetch_object(objid);
	this.eventid = objid.substr(7);
	this.element = document.getElementById(this.eventid);
	this.xml_sender = null;

	var me = this;
	vB_AJAX_Actuals[this.eventid] = this;

	/**
	* Resolves the actual value using AJAX
	*/
	this.resolve = function()
	{
		vB_Active_RB_Totals++;
		refresh_rate = (vbulletin_rb_rate * vB_Active_RB_Totals);

		if (!vB_Fetched_RBs)
		{
			// Let's fetch all the eventids with RBs
			vB_Fetched_RBs = true;
			var do_actual_ajax = true;
			docimages = document.images;

			all_eventids = new Array();
			all_eventids[all_eventids.length] = this.eventid;

			for (var i = 0; i < docimages.length; i++)
			{
				if (docimages[i].parentNode.style.display != 'none' && docimages[i].src.match(/calendar_tool_refresh\.gif$/) && parseInt(docimages[i].parentNode.parentNode.id.substr(7)) > 0)
				{
					otheractualid = parseInt(docimages[i].parentNode.parentNode.id.substr(7));

					if (otheractualid != parseInt(this.eventid))
					{
						all_eventids[all_eventids.length] = otheractualid;

						tempobj = new vB_AJAX_RefreshData(docimages[i].parentNode.parentNode.innerHTML, docimages[i].parentNode.parentNode.id);
						tempobj.resolve();
					}
				}
			}

			refresh_rate = (vbulletin_rb_rate * 1);

			if (all_eventids.length > 1)
			{
				vB_Multi_RBs = true;
			}
		}

		if (do_actual_ajax || all_eventids.length <= 1)
		{
			if (all_eventids.length < 1)
			{
				all_eventids.push(this.eventid);
			}

			this.xml_sender = new vB_AJAX_Handler(true);
			this.xml_sender.onreadystatechange(this.onreadystatechange);
			setTimeout("vB_AJAX_Actuals['" + this.eventid + "'].xml_sender.send('ajax_actual.php?eventid=" + all_eventids.join(',') + "', '');", refresh_rate);

			all_eventids = new Array();
		}

		if (this.element)
		{
			this.loadingImage = this.element;
			this.loadingImage.style.display = '';
		}
		else
		{
			this.loadingImage = new Image();
			this.loadingImage.className = 'inlineimg';
			this.loadingImage.id = this.eventid;
			this.loadingImage.src = IMGDIR_MISC + '/progress.gif';
		}

		this.refreshLink = this.objid.getElementsByTagName('a')[0];
		this.refreshLink.style.display = 'none';

		this.objid.insertBefore(this.loadingImage, this.refreshLink);
	}

	/**
	* OnReadyStateChange callback. Uses a closure to keep state.
	* Remember to use me instead of this inside this function!
	*/
	this.onreadystatechange = function()
	{
		if (me.xml_sender.handler.readyState == 4 && me.xml_sender.handler.status == 200)
		{
			if (me.xml_sender.handler.responseText && !fetch_tags(me.xml_sender.handler.responseXML, 'actual')[0])
			{
				data_response = me.xml_sender.handler.responseText.replace('multipart-events--', '').split('|');

				for (var d = 0;d < data_response.length; d++)
				{
					actualdata = data_response[d].split(':');

					if (actualdata[1].split('[^]')[0].replace(/ /g, '') != '')
					{
						loading_image = fetch_object(actualdata[0]);
						refresh_link = loading_image.parentNode.getElementsByTagName('a')[0];

						loading_image.style.display = 'none';
						refresh_link.style.display = 'none';

						ActualWrap = document.createElement('span');
						ActualWrap.className = 'smallfont';

						ActualParts = actualdata[1].split('[^]');

						newActualValue = document.createTextNode(ActualParts[0]);

						if (ActualParts[1] && PHP.trim(ActualParts[1]) != '')
						{
							ActualWrap.className = 'smallfont ' + PHP.trim(ActualParts[1]);
						}

						ActualWrap.appendChild(newActualValue);

						loading_image.parentNode.insertBefore(ActualWrap, refresh_link);

						loading_image.parentNode.onclick = function()
						{
							return false;
						}
					}
					else
					{
						loading_image = fetch_object(actualdata[0]);
						refresh_link = loading_image.parentNode.getElementsByTagName('a')[0];

						loading_image.style.display = 'none';
						refresh_link.style.display = '';
						vB_AJAX_HaultRefresh[loading_image.parentNode.id] = false;
					}

					vB_Active_RB_Totals--;
				}

				vB_Fetched_RBs = false;
			}
			else if (me.xml_sender.handler.responseXML)
			{
				me.responseValue = me.xml_sender.fetch_data(fetch_tags(me.xml_sender.handler.responseXML, 'actual')[0]);

				if (me.responseValue.replace(/ /g, '') != '')
				{
					me.loadingImage.style.display = 'none';
					me.refreshLink.style.display = 'none';

					ActualWrap = document.createElement('span');
					ActualWrap.className = 'smallfont';

					newActualValue = document.createTextNode(me.responseValue);

					ActualWrap.appendChild(newActualValue)

					me.objid.insertBefore(ActualWrap, me.refreshLink);
					me.refreshLink.onclick = '';

					me.objid.onclick = function()
					{
						return false;
					}

					vB_Active_RB_Totals--;			
				}
				else
				{
					me.loadingImage.style.display = 'none';
					me.refreshLink.style.display = '';
					vB_AJAX_HaultRefresh[me.objid.id] = false;
					vB_Active_RB_Totals--;
				}
			}

			if (is_ie)
			{
				me.xml_sender.handler.abort();
			}
		}
		else if (me.xml_sender.handler.readyState == 4)
		{
			me.loadingImage.style.display = 'none';
			me.refreshLink.style.display = '';
			vB_AJAX_HaultRefresh[me.objid.id] = false;
			vB_Active_RB_Totals--;
		}
	}
}

/**
* Class to handle AJAX request to fetch event details
*
* @param	string	The trigger object
*/
function vB_AJAX_FetchDetails(objid)
{
	this.objid = fetch_tags(objid, 'img')[0];
	this.eventid = objid.id.substr(7);
	this.xml_sender = null;

	var me = this;

	/**
	* Fetches details through AJAX then caches them (or returns cache if exists)
	*/
	this.fetch = function(force)
	{
		// Are we displaying details, the chart, or both?
		show_details = vB_AJAX_Details['detail_' + this.eventid] ? '1' : '0';
		show_chart = vB_AJAX_Charts['chart_' + this.eventid] ? '1' : '0';

		// is it open
		/*
		if (vB_AJAX_HaultRefresh[this.objid.parentNode.id] == 'open' && typeof force == 'undefined')
		{
			this.closeDetails(this.objid, 'detail_row_seek_' + this.eventid);

			return false;
		}
		*/

		// we now only close if both details and charts is set to 0
		if (show_details == '0' && show_chart == '0')
		{
			this.closeDetails(this.objid, 'detail_row_seek_' + this.eventid);

			return false;
		}

		// is it in cache - disabled, no longer caching
		if (1==2 && vB_AJAX_DetailCache[this.eventid] && typeof force == 'undefined')
		{
			rowData = this.findrowindex(this.objid, 'detail_row_seek_' + this.eventid);
			this.showDetails(rowData, vB_AJAX_DetailCache[this.eventid][0], vB_AJAX_DetailCache[this.eventid][1]);

			return false;
		}

		this.xml_sender = new vB_AJAX_Handler(true);
		this.xml_sender.onreadystatechange(this.onreadystatechange);

		if (typeof force != 'undefined')
		{
			this.xml_sender.forced = true;
		}

		this.xml_sender.send('calendar.php?do=getdetail&e=' + this.eventid, 'do=getdetail&ajax=1&e=' + this.eventid + '&sd=' + show_details + '&sc=' + show_chart);

		if (!this.charticon)
		{
			this.objid.src = IMGDIR_MISC + '/progress.gif';
			this.objid.height = '16';
			this.objid.width = '16';
			this.objid.style.padding = '0 0 2px 0';
		}
		else
		{
			chart_imgobj = fetch_object('chart_' + this.eventid).childNodes[0];

			chart_imgobj.src = IMGDIR_MISC + '/progress.gif';
			chart_imgobj.height = '16';
			chart_imgobj.width = '16';
			chart_imgobj.style.padding = '0 0 2px 0';
		}
	}

	/**
	* OnReadyStateChange callback. Uses a closure to keep state.
	* Remember to use me instead of this inside this function!
	*/
	this.onreadystatechange = function()
	{
		if (me.xml_sender.handler.readyState == 4 && me.xml_sender.handler.status == 200)
		{
			if (me.xml_sender.handler.responseXML)
			{
				me.responseValue = me.xml_sender.fetch_data(fetch_tags(me.xml_sender.handler.responseXML, 'detail')[0]);
				me.responseValue = me.responseValue.replace(/\s+/g, ' ');
				me.page = fetch_tags(me.xml_sender.handler.responseXML, 'detail')[0].getAttribute('page');

				if (me.xml_sender.forced)
				{
					vB_AJAX_DetailCache[me.eventid] = new Array(me.responseValue, me.page);

					// Refresh The Details..
					fetch = new vB_AJAX_FetchDetails(fetch_object('detail_' + me.eventid));
					fetch.fetch();

					if (vB_AJAX_HaultRefresh[me.objid.parentNode.id] != 'open')
					{
						fetch.fetch();
					}

					return false;
				}

				if (me.responseValue.replace(/ /g, '') != '')
				{
					vB_AJAX_DetailCache[me.eventid] = new Array(me.responseValue, me.page);

					if ((rowData = me.findrowindex(me.objid, 'detail_row_seek_' + me.eventid)) !== false)
					{
						me.showDetails(rowData, me.responseValue, me.page);
					}
					else
					{
						me.updateDetails(me.responseValue, me.page);
					}
				}
				else
				{
					if (!me.charticon)
					{
						me.objid.src = IMGDIR_MISC + '/calendar_detail.gif';
					}
					else
					{
						fetch_object('chart_' + me.eventid).childNodes[0].src = IMGDIR_MISC + '/viewchart.gif';
					}
				}

				vB_AJAX_HaultRefresh[me.objid.id] = false;
			}

			if (is_ie)
			{
				me.xml_sender.handler.abort();
			}
		}
	}

	this.findopendetails = function(limit)
	{
		tableRows = fetch_tags(vB_Calendar_Table, 'tr');
		total = -1;

		for (r = 0; r <= limit; r++)
		{
			if (tableRows[r].id.match(/^details_view_row_(\d+)$/))
			{
				total--; // negative aspect
			}
		}

		return total;
	}

	/**
	* Finds a row within a table and returns the index of that row
	* 
	* @param	object	Image clicked to activate detail view
	* @param	string	The row ID
	*
	* @return	array	Cell class, rowindex, hasOptions
	*/
	this.findrowindex = function(imgobj, rowid)
	{
		// Stop replication
		if (vB_AJAX_HaultRefresh[me.objid.parentNode.id] == 'open' && typeof force == 'undefined')
		{
			//this.closeDetails(me.objid, 'detail_row_seek_' + me.eventid);

			return false;
		}

		rowIndex = 0;
		rowcolSpan = 1;
		tableNode = vB_Calendar_Table;
		rowSpando = false
		cellClass = ''
		hasOptions = false

		// fetch the row index
		row = fetch_object('toprow_' + parseInt(imgobj.getAttribute('toprow'))).parentNode
		rowSpando = true;
		cellClass = row.cells[0].className;
		rowcolSpan = row.cells.length;
		row.cells[0].rowSpan = row.cells[0].rowSpan + 1;

		if (row.cells[row.cells.length - 1].rowSpan > 1)
		{
			hasOptions = true;
			row.cells[row.cells.length - 1].rowSpan = row.cells[row.cells.length - 1].rowSpan + 1;
		}

		return [cellClass, fetch_object(rowid).rowIndex + 1, hasOptions, rowcolSpan]; // everything below redundant now?
	}

	/**
	* Determines what is currently displaying inside HTML string
	* 
	* @param	string  Details
	*/

	this.determineDetails = function(details)
	{
		fracture = details.split('DETAIL_VIEW_SPLIT');

		if (typeof fracture[0] == 'undefined')
		{
			fracture[0] = '';
		}

		if (typeof fracture[1] == 'undefined')
		{
			fracture[1] = '';
		}

		try_frac1 = fracture[0].replace(/<div style="display: none(;)?">/gi, '');
		try_frac2 = fracture[1].replace(/<\/div>/gi, '');

		chart	= (PHP.trim(try_frac1) != '' && try_frac1.length > 80);
		details	= (PHP.trim(try_frac2) != '' && try_frac2.length > 80);

		return [chart, details, fracture[0], fracture[1]];
	}

	/**
	* Updates the details
	* 
	* @param	string  Details
	* @param	string	Page Link
	*/

	this.updateDetails = function(details, pagelink)
	{
		detail_row = fetch_object('details_view_row_' + me.eventid).cells[0].getElementsByTagName('span')[0];

		// What are we currently showing in our details?
		current_show = me.determineDetails(detail_row.innerHTML);

		// What are we going to be displaying?
		new_show = me.determineDetails(details);

		if (new_show[0] && current_show[0]) // We're going to be displaying the chart, and we already have a chart displayed, we don't want to "refresh" it
		{
			if (new_show[1] && !current_show[1])
			{
				// Show details, they aren't already there
				newdiv = document.createElement('div');
				newdiv.innerHTML = new_show[3];

				detail_row.appendChild(newdiv);

				fetch_object('event_details_' + me.eventid).style.marginTop = '12px';
			}
			else if (!new_show[1] && current_show[1])
			{
				// Remove details, they are already there

				fetch_object('event_details_' + me.eventid).parentNode.removeChild(fetch_object('event_details_' + me.eventid));
			}
			else
			{
				// This should never happen
				//alert('Critical Error, Unknown Circumstances');
			}

			me.activateDetails(false);
		}
		else
		{
			detail_row.innerHTML = details;

			me.activateDetails(true);
		}
	}

	/**
	* Activates dynamic detail objects
	* 
	* @param	boolean	Activate chart swf
	*/

	this.activateDetails = function(do_chart)
	{
		var chart_container = fetch_object('ff_chart_' + me.eventid);
		if (chart_container && do_chart)
		{
			var ffChart = new SWFObject("charts/main.swf?v=1.1", "swf_chart_" + me.eventid, "100%", "239", "8", "#ffffff");
			//ffChart.addVariable("settings_file", escape("chartsettings_stock.php?title=" + vB_AJAX_Chart_URIs[me.eventid] + "&bgcol=&nc=" + (Math.random() * 9999)));
			ffChart.addVariable("eventid", me.eventid);
			ffChart.addVariable("preloader_color", "#999999");
			ffChart.addParam("menu", "false");
			//ffChart.addParam("tabindex", "100");
			//ffChart.addParam("wmode", "opaque");			
			ffChart.write("ff_chart_" + me.eventid);
			
			var swf_chart = fetch_object('swf_chart_' + me.eventid);
			//swf_chart.tabindex = 100;
			
			Chart.getInst().showTip(me.eventid);			
			
			
			var wheel = function(event)
			{
				if (!event) event = window.event;
				
				try
				{
					event.returnValue = false;
					event.preventDefault();																
				}
				catch(err)
				{
					//alert(dump(err));
				}

			};
			
			
			chart_container.onmouseover = function()
			{				
				swf_chart.focus();
				if (window.addEventListener)
					window.addEventListener('DOMMouseScroll', wheel, false);
					
				window.onmousewheel = document.onmousewheel = wheel;
			};
			
			chart_container.onmouseout = function()
			{
				if (window.removeEventListener)
					window.removeEventListener('DOMMouseScroll', wheel, false);
					
				window.onmousewheel = document.onmousewheel = null;
			};
			
		}

		if (!me.charticon)
		{
			me.objid.src = IMGDIR_MISC + '/calendar_detail_down.gif';
			me.objid.setAttribute('oldtitle', me.objid.title)
			me.objid.title = 'Close Detail'

			me.objid.height = '16';
			me.objid.width = '16';
		}
		else
		{
			chart_imgobj = fetch_object('chart_' + me.eventid).childNodes[0];

			chart_imgobj.src = IMGDIR_MISC + '/calendar_detail_down.gif';
			chart_imgobj.setAttribute('oldtitle', me.objid.title)
			chart_imgobj.title = 'Close Chart'

			chart_imgobj.height = '16';
			chart_imgobj.width = '16';
		}

		vB_AJAX_HaultRefresh[me.objid.parentNode.id] = 'open';

		if (fetch_object("event_linkthread_" + me.eventid))
		{
			vbmenu_register("event_linkthread_" + me.eventid, true);
		}

		if (fetch_object("event_linkarticle_" + me.eventid))
		{
			vbmenu_register("event_linkarticle_" + me.eventid, true);
		}

		if (fetch_object("related_mod_" + me.eventid))
		{
			vbmenu_register("related_mod_" + me.eventid, true);
		}

		if (fetch_object("relatednews_mod_" + me.eventid))
		{
			vbmenu_register("relatednews_mod_" + me.eventid, true);
		}

		me.handle_images();
	}

	/**
	* Shows the details
	* 
	* @param	array	Cell class, rowindex
	* @param	string	Details
	*/
	this.showDetails = function(rowData, details, pagelink)
	{
		newRow	= vB_Calendar_Table.insertRow(rowData[1]);
		newRow.id = 'details_view_row_' + me.eventid
		newCell	= newRow.insertCell(-1);
		newCell.colSpan = rowData[3] - (rowData[2] ? 3 : 2);
		newCell.className = rowData[0];

		tempcell = newRow.insertCell(-1);
		tempcell.className = rowData[0];

		newCell.style.padding = '0px 0px 6px 0px';

		fieldset = document.createElement('div');
		fieldset.style.padding = '10px';
		fieldset.className = rowData[0].split(' ')[0].toString().replace(/ /g, '') == 'alt1' ? 'alt2' : 'alt1';
		fieldset.style.border = '1px solid #D1D1E1';

		span = document.createElement('span');
		span.innerHTML = details.replace(/{CELLCLASS}/g, rowData[0]);

		if (typeof pagelink == 'string' && 1==2)
		{
			lbreak = document.createElement('br');
			relimg = document.createElement('img');
			relink = document.createElement('a');
			relinkb = document.createElement('a');
			relinkb.href = pagelink;
			relinkb.target = '_blank';
			relimg.src = IMGDIR_MISC + '/calendar_release_link.gif?nocache=5';
			relimg.style.padding = '3px 0 0 0';
			relimg.style.position = 'relative'
			relimg.style.verticalAlign = 'middle'
			relimg.border = '0';
			relink.appendChild(document.createTextNode('Official Release Page')); // phrase...
			relink.href = pagelink;
			relink.target = '_blank';
			relink.style.padding = '5px 0 0 5px'


			relinkb.appendChild(relimg)
			span.appendChild(lbreak);
			span.appendChild(relinkb);
			span.appendChild(relink);
		}

		fieldset.appendChild(span);
		newCell.appendChild(fieldset);

		me.activateDetails(true);
	}

	/**
	* Hides the details
	* 
	* @param	object	Image clicked to activate detail view
	* @param	string	The row ID
	*/
	this.closeDetails = function(imgobj, rowid)
	{
		rowSpando = false
		hideRow = fetch_object('details_view_row_' + me.eventid)
		offset = 0;

		row = fetch_object('toprow_' + parseInt(imgobj.getAttribute('toprow'))).parentNode
		rowSpando = true
		row.cells[0].rowSpan = row.cells[0].rowSpan - 1

		if (row.cells[row.cells.length - 1].rowSpan > 1)
		{
			row.cells[row.cells.length - 1].rowSpan = row.cells[row.cells.length - 1].rowSpan - 1
		}

		vB_Calendar_Table.deleteRow(hideRow.rowIndex)
		vB_AJAX_HaultRefresh[me.objid.parentNode.id] = false;

		me.handle_images();
	}

	this.handle_images = function()
	{
		if (vB_AJAX_Details['detail_' + me.eventid] == '0')
		{
			me.objid.src = IMGDIR_MISC + '/calendar_detail' + (fetch_tags(objid, 'img')[0].getAttribute('detailstar') == '1' ? '_star' : fetch_tags(objid, 'img')[0].getAttribute('detailstar') == '2' ? '_alert' : '') + '.gif';
			me.objid.title = me.objid.getAttribute('oldtitle');

			me.objid.width = 17;
			me.objid.height = 18;
			me.objid.style.padding = '0 0 0 0';
		}

		if (vB_AJAX_Charts['chart_' + me.eventid] == '0')
		{
			chart_imgobj = fetch_object('chart_' + me.eventid).childNodes[0];

			chart_imgobj.src = IMGDIR_MISC + '/viewchart.gif';
			chart_imgobj.title = me.objid.getAttribute('oldtitle');


			chart_imgobj.width = 17;
			chart_imgobj.height = 18;
			chart_imgobj.style.padding = '0 0 0 0';
		}
	}

}

/**
* Class to handle the progress image while refreshing page
* [Is this even used anymore?]
*
* @param	string	The actual to resolve
*/
function vB_AJAX_ProgressData(objid)
{
	this.objid = objid.substr(7);
	this.xml_sender = null;

	var img = document.createElement('img');

	img.onload = function()
	{

	}
}

/**
* Handles click events on resolve actual
*/
function refresh_actual(e)
{
	if (vB_AJAX_HaultRefresh[this.id])
	{
		return false;
	}

	vB_AJAX_HaultRefresh[this.id] = true;
	var refresher = new vB_AJAX_RefreshData(this.innerHTML, this.id);
	refresher.resolve();
	return false;
}

/**
* Handles click events on details
*/
function refresh_detail(e)
{
	return show_details_(this, true);
}

function show_details_(obj, hault)
{
	vB_AJAX_Details[obj.id] = vB_AJAX_Details[obj.id] ? false : true;

	if (vB_AJAX_HaultRefresh[obj.id] === true)
	{
		if (hault)
			return false;
	}

	if (vB_AJAX_HaultRefresh[obj.id] != 'open')
	{
		vB_AJAX_HaultRefresh[obj.id] = true;
	}

	var detailfetch = new vB_AJAX_FetchDetails(obj);
	detailfetch.fetch();
	return false;
}

/**
* Handles click events on charts
*/
function refresh_chart(e)
{
	return show_chart_(this, true);
}

function show_chart_(obj, hault)
{
	vB_AJAX_Charts[obj.id] = vB_AJAX_Charts[obj.id] ? false : true;

	detail_icon = fetch_object('detail_' + obj.id.split('chart_')[1]).parentNode.getElementsByTagName('a')[0];

	if (vB_AJAX_HaultRefresh[detail_icon.id] === true)
	{
		if (hault)
			return false;
	}

	if (vB_AJAX_HaultRefresh[detail_icon.id] != 'open')
	{
		vB_AJAX_HaultRefresh[detail_icon.id] = true;
	}

	var chartfetch = new vB_AJAX_FetchDetails(detail_icon);
	chartfetch.charticon = true;
	chartfetch.fetch();
	return false;
}

/**
* Handles click events on details (for event title)
*/
function alt_refresh_detail(e)
{
	thecell = this.parentNode.cells[8] ? 8 : 7;
	imgobj = this.parentNode.cells[thecell].getElementsByTagName('a')[0];

	if (vB_AJAX_HaultRefresh[imgobj.id] === true)
	{
		return false;
	}

	if (vB_AJAX_HaultRefresh[imgobj.id] != 'open')
	{
		vB_AJAX_HaultRefresh[imgobj.id] = true;
	}

	var detailfetch = new vB_AJAX_FetchDetails(imgobj);
	detailfetch.fetch();
	return false;
}

/**
* Loads detail button for javascript enabled users online
*/
function load_detail_button(id, eventid, title, toprowid, detailstar)
{
	//thecell = fetch_object(id).parentNode.parentNode.cells[3].getElementsByTagName('img')[0] ? 2 : 3;

	//fetch_object(id).parentNode.parentNode.cells[thecell].onclick = alt_refresh_detail;
	//fetch_object(id).parentNode.parentNode.cells[thecell].style.cursor = 'pointer';
	link = document.createElement('a');
	link.id = 'detail_' + eventid;
	link.href = '?';

	img = document.createElement('img');
	img.title = title;
	img.border = '0';
	img.src = IMGDIR_MISC + '/calendar_detail' + (detailstar == '1' ? '_star' : (detailstar == '2') ? '_alert' : '') + '.gif';
	img.className = 'inlineimg';
	img.setAttribute('toprow', toprowid);
	img.setAttribute('detailstar', detailstar);

	img.width = 17;
	img.height = 18;

	link.appendChild(img)
	fetch_object(id).appendChild(link)
	fetch_object(id).appendChild(document.createTextNode(' '))
}

/**
* Loads chart button for javascript enabled users online
*/
function load_chart_button(id, eventid, toprowid, chart_uri)
{
	vB_AJAX_Chart_URIs[eventid] = chart_uri;

	link = document.createElement('a');
	link.id = 'chart_' + eventid;
	link.href = '?';

	img = document.createElement('img');
	img.title = 'Open Chart';
	img.border = '0';

	img.src = IMGDIR_MISC + '/viewchart.gif';
	img.className = 'inlineimg';
	img.setAttribute('toprow', toprowid);

	img.width = 17;
	img.height = 18;

	link.appendChild(img)
	fetch_object(id).appendChild(link)
	fetch_object(id).appendChild(document.createTextNode(' '))
}

/**
* Uses AJAX to link a thread to an event, with dynamic responses
*/
function link_thread(eventid)
{
	// create request & send data
	ajax_linkthread = new vB_AJAX_Handler(true);
	ajax_linkthread.eventid = eventid;
	ajax_linkthread.onreadystatechange(do_link_thread);
	setTimeout("ajax_linkthread.send('calendar.php', 'do=linkthread&event=" + eventid + "&thread=" + fetch_object('linkthread_url_' + eventid).value.replace('&', '+') + "')", 3000);

	overload_link_thread(
		'event_linkthread_' + eventid,
		'event_linkthread_' + eventid + '_wait_menu'
	)
}

/**
* Gathers link thread request response and returns visually to user
*/
function do_link_thread()
{
	var AJAX = ajax_linkthread.handler;
	var eventid = ajax_linkthread.eventid;

	if (AJAX.readyState == 4 && AJAX.status == 200)
	{
		var response = AJAX.responseText;

		if (response.substr(0, 9) == 'accepted-')
		{
			// Refresh The Details..
			fetch = new vB_AJAX_FetchDetails(fetch_object('detail_' + eventid));
			fetch.fetch(true);
		}
		else
		{
			overload_link_thread(
				'event_linkthread_' + eventid,
				'event_linkthread_' + eventid + '_bad_menu'
			)
		}
	}
}

/**
* Overloads vBulletin menu object to force any menu into position from a single caller object
*/
function overload_link_thread(menuobj, newmenu)
{
	vBmenu.menus[menuobj].hide();
	vBmenu.menus[menuobj].menuobj = null;
	vBmenu.menus[menuobj].menuname = newmenu;
	vBmenu.menus[menuobj].show(fetch_object(menuobj))
}

/**
* Restores menu for thread linking
*/
function restore_link_thread(eventid)
{
	overload_link_thread(
		'event_linkthread_' + eventid,
		'event_linkthread_' + eventid + '_menu'
	)
}

/**
* Restores menu for article linking
*/
function restore_link_article(eventid)
{
	overload_link_thread(
		'event_linkarticle_' + eventid,
		'event_linkarticle_' + eventid + '_menu'
	)
}

/**
* Allows those with permission to dynamically moderate related threads
*/
function do_related_threads_moderation(eventid, isnews)
{
	// fetch thread ids desired to keep
	inputs = fetch_tags(document.body, 'input');
	threadids = new Array();

	for (var i = 0; i < inputs.length; i++)
	{
		if (inputs[i].name.match(/^relatedthread\[(\d+)\]$/) && inputs[i].checked)
		{
			threadids.push(RegExp.$1);
		}
	}

	try
	{
		threadids = threadids.join(',');
	}
	catch(e)
	{
		threadids = '';
	}

	// create request & send data
	ajax_linkthreadmod = new vB_AJAX_Handler(true);
	ajax_linkthreadmod.eventid = eventid;
	ajax_linkthreadmod.onreadystatechange(exec_related_threads_moderation);
	setTimeout("ajax_linkthreadmod.send('calendar.php', 'do=linkthreadmod&event=" + eventid + "&threadids=" + threadids + "')", 3000);

	if (typeof isnews != 'undefined' && isnews)
	{
		overload_link_thread(
			'relatednews_mod_' + eventid,
			'relatednews_mod_' + eventid + '_wait_menu'
		)
	}
	else
	{
		overload_link_thread(
			'related_mod_' + eventid,
			'related_mod_' + eventid + '_wait_menu'
		)
	}
}

function exec_related_threads_moderation()
{
	var AJAX = ajax_linkthreadmod.handler;
	var eventid = ajax_linkthreadmod.eventid;

	if (AJAX.readyState == 4 && AJAX.status == 200)
	{
		// Refresh The Details..
		fetch = new vB_AJAX_FetchDetails(fetch_object('detail_' + eventid));
		fetch.fetch(true);
	}
}

function get_url_params()
{
	var url = window.location.href;
	url = url.split('#');
	if (url.length > 1)
	{
		var query = url[1];
		query = query.split('&');
		var params = new Object();
		for (var i = 0; i < query.length; i++)
		{
			var param = query[i].split('=');
			params[param[0]] = param[1];
		}
		
		return params;		
	}
	
	return null;
}

//fire when dom is ready
if (typeof YAHOO != 'undefined')
{
	YAHOO.util.Event.onDOMReady(function()
	{
		var params = get_url_params();
		if (params != null)
		{		
			//open deails
			if (params['details'] != null)
			{
				var details = params['details'].split(',');
				for (var i = 0; i < details.length; i++)
				{
					if (YAHOO.util.Dom.get('detail_' + details[i]))
					{
						show_details_(YAHOO.util.Dom.get('detail_' + details[i]), false);
					}
					break;
								
				}						
			}
		
			//open charts
			if (params['chart'] != null)
			{			
				var charts = params['chart'].split(',');
				for (var i = 0; i < charts.length; i++)
				{
					if (YAHOO.util.Dom.get('chart_' + charts[i]))
					{
						show_chart_(YAHOO.util.Dom.get('chart_' + charts[i]), false);							
					}
					break;
				}
									
			}		
		}
	
	});
}

/*======================================================================*\
|| ####################################################################
|| # SVN: $RCSfile$ - $Rev$
|| ####################################################################
\*======================================================================*/
