/**  
 * @fileoverview This file contains functions and variables related to the gateway page.
 * @author Mark Hendrickson <mhendric@bowdoin.edu>
 * @version 1.0
 */

// remember if page has been customized
var page_customized = false;

// Load indicator variables
var load = new Image();
load.src = 'images/load.gif';
var load_indicator_shown = false;
var load_processes = 0;
var moving_load_indicator = false;

/**
 * Add or subtract from the number of loading processes known to be underway. Display or hide the load indicator as appropriate.
 * @param {String} action Indicates whether a loading process has just started or stopped ("start" or "stop")
 */
function indicateLoad(action)
{ 
	if(action == 'start')
	{
		if(!load_indicator_shown)
		{
			load_indicator_shown = true;
			
			var load_indicator = document.createElement('div');
			load_indicator.setAttribute('id','load_indicator');
			load_indicator.innerHTML = 'Loading content...';

			var load_indicator_image = document.createElement('img');
			load_indicator_image.setAttribute('id','load_indicator_image');
			load_indicator_image.setAttribute('src','images/load.gif');
			
			var header = $('header');
			header.appendChild(load_indicator);
			load_indicator.appendChild(load_indicator_image);
			
		}
		
		if(load_processes < 0)
			load_processes = 1;
		else
			load_processes = load_processes + 1;
	}
	else
	{
		load_processes = load_processes - 1;
		
		if(!load_processes || load_processes < 0)
		{
			var header = $('header');
			var load_indicator = $('load_indicator');
			header.removeChild(load_indicator);
			load_indicator_shown = false;
		}
	}

	if(load_processes < 0)
		load_processes = 0;
}

/**
 * Toggles the display of the sign-in box.
 * @param {String} status Indicates whether to show or hide the sign-in box ("on" or "off")
 * @param {String} message Optional message to display in the sign-in box
 */
function toggleSignIn(status,message)
{
	var body = document.getElementsByTagName('body')[0];
	var signin_container = $('signin_container');
	var username = $('username');
	var signin = $('signin');
	var signin_message = $('signin_message');
	var password = $('password');

	if(status == 'on')
	{
		toggleTint('on');
		signin_container.style.display = 'block';
		username.focus();
		signin.onclick = function(event) { stopPropagation(event); };
		setTimeout("var body = document.getElementsByTagName('body')[0]; body.onclick = function() { toggleSignIn('off'); };",1);
		
		signin_status = 'open';

		if(message)
		{
			signin_message.style.display = 'block';
			signin_message.innerHTML = message;
		}
	}
	else if(status == 'off')
	{
		toggleTint('off');
		signin_container.style.display = 'none';
		signin_status = 'closed';
		
		signin_message.style.display = 'none';
		username.value = '';
		password.value = '';

		body.onclick = null;
	}
}

/**
 * Toggles a tint overlaying the entire page.
 * @param {String} status Indicates whether to show or hide the tint ("on" or "off")
 */
function toggleTint(status)
{
	var column_3 = $('column_3');
	var tint = $('tint');

	if(status == 'on' && !tint)
	{
		tint = document.createElement('div');
		tint.setAttribute('id','tint');
		tint.style.height = column_3.offsetHeight;
		column_3.appendChild(tint);
	}
	else if(status == 'off' && tint)
	{
		column_3.removeChild(tint);
		
	}
}

var current_page_options_section;

/**
 * Toggles the display of page options.
 * @param {String} section Section of page options to display
 */
function togglePageOptions(section)
{
	var page_options_dropdown = $('page_options_dropdown');

	if(current_page_options_section != section && section)
	{
		page_options_dropdown.style.display = 'block';

		if(current_page_options_section)
		{
			var current_section = $('page_options_dropdown_'+current_page_options_section);
			current_section.style.display = 'none';

			var current_section_tab = $('page_options_'+current_page_options_section);
			current_section_tab.className = '';

			var current_section_tab_interior = $('page_options_interior_'+current_page_options_section);
			current_section_tab_interior.className = 'page_options_interior';
		}

		var new_section = $('page_options_dropdown_'+section);
		new_section.style.display = 'block';

		var new_section_tab = $('page_options_'+section);
		new_section_tab.className = 'page_options_selected';

		var new_section_tab_interior = $('page_options_interior_'+section);
		new_section_tab_interior.className = 'page_options_interior_selected';

		current_page_options_section = section;
	}
	else
	{
		page_options_dropdown.style.display = 'none';

		var current_section = $('page_options_dropdown_'+current_page_options_section);
		current_section.style.display = 'none';
	
		var current_section_tab = $('page_options_'+current_page_options_section);
		current_section_tab.className = '';

		var current_section_tab_interior = $('page_options_interior_'+current_page_options_section);
		current_section_tab_interior.className = 'page_options_interior';

		current_page_options_section = '';
	}
}

/**
 * Toggles the existence of an invisible "cover" over the entire page. Prevents clickage on any of the page's elements.
 * Note: Used pretty much exclusively by panel lifting operations to prevent inadvertent clicks.
 * @param {String} status Indicates whether to create or destroy the cover ("on" or "off")
 */
function togglePageCover(status)
{
	var page_cover = $('page_cover');

	if(!page_cover)
	{
		page_cover = document.createElement('div');
		page_cover.setAttribute('id','page_cover');

		var column_3 = $('column_3');
		page_cover.style.height = column_3.offsetHeight+'px';

		var body = document.getElementsByTagName('body')[0];
		body.appendChild(page_cover);
	}
	
	if(status == 'on')
		page_cover.style.display = 'block';
	else if(status == 'off')
	{
		page_cover.style.display = 'none';
	}
}

var show_tooltips = true;
var show_blurbs = false;
var tooltips_on = false;

/**
 * Recalls the user's tooltip settings (whether to show them or not).
 */
function recallTooltipSettings()
{
	var ajax = initAjax();
	ajax.open('GET','scripts/recall_tooltip_settings.php?timeStamp='+new Date().getTime()+'&username='+username,true);
	ajax.onreadystatechange = function() { recallTooltipSettingsCallback(ajax) };
	ajax.send(null);
}

/**
 * Called exclusively by recallTooltipSettings(); continues the operations of that function.
 * @see #recallTooltipSettings
 */
function recallTooltipSettingsCallback(ajax)
{
	if(ajax.readyState == 4)
	{
		if(ajax.status == 200)
		{
			var response = ajax.responseText;
			setTooltipSettings(response);
		}
	}
}

/**
 * Sets tooltips as either enabled or disabled.
 * @param {String} setting Indicates whether tooltips are "enabled" or "disabled", or settings are "not set"
 */
function setTooltipSettings(setting)
{
	if(setting == 'disabled')
		toggleTooltips('off',false,true);
	else if(setting == 'disabled' || setting == 'not set')
		toggleTooltips('on',false,true);
}

/**
 * Recalls the user's blurb settings (whether to show them or not).
 */
function recallBlurbSettings()
{
	var ajax = initAjax();
	ajax.open('GET','scripts/recall_blurb_settings.php?timeStamp='+new Date().getTime()+'&username='+username,true);
	ajax.onreadystatechange = function() { recallBlurbSettingsCallback(ajax) };
	ajax.send(null);
}

/**
 * Called exclusively by recallBlurbSettings(); continues the operations of that function.
 * @see #recallBlurbSettings
 */
function recallBlurbSettingsCallback(ajax)
{
	if(ajax.readyState == 4)
	{
		if(ajax.status == 200)
		{
			var response = ajax.responseText;
			setBlurbSettings(response);
		}
	}
}

/**
 * Sets blurbs as either enabled or disabled.
 * @param {String} setting Indicates whether blurbs are "enabled" or "disabled", or settings are "not set"
 */
function setBlurbSettings(setting)
{
	if(setting == 'enabled')
		toggleBlurbs('on',false,true);
	else if(setting == 'disabled' || setting == 'not set')
		toggleBlurbs('off',false,true);
}

/**
 * Recalls the user's panel drifting settings (whether to drift panels or not).
 */
function recallPanelDriftingSettings()
{
	var ajax = initAjax();
	ajax.open('GET','scripts/recall_panel_drifting_settings.php?timeStamp='+new Date().getTime()+'&username='+username,true);
	ajax.onreadystatechange = function() { recallPanelDriftingSettingsCallback(ajax) };
	ajax.send(null);
}

/**
 * Called exclusively by recallPanelDriftingSettings(); continues the operations of that function.
 * @see #recallPanelDriftingSettings
 */
function recallPanelDriftingSettingsCallback(ajax)
{
	if(ajax.readyState == 4)
	{
		if(ajax.status == 200)
		{
			var response = ajax.responseText;
			setPanelDriftingSettings(response);
		}
	}
}

/**
 * Sets panel drifting as either enabled or disabled.
 * @param {String} setting Indicates whether panel drifting is "enabled" or "disabled", or settings are "not set"
 */
function setPanelDriftingSettings(setting)
{
	if(setting == 'enabled')
		togglePanelDrifting('on',false,true);
	else if(setting == 'disabled' || setting == 'not set')
		togglePanelDrifting('off',false,true);
}

/**
 * Toggles the display of a tooltip.
 * @param {Object} event Event object
 * @param {String} status Indicates whether to show or hide the tooltip ("on" or "off")
 * @param {String} information Content to display as tooltip
 * @param {Boolean} force Indicates whether to override preconditions to show tooltip
 */
function toggleTooltip(event,status,information,force)
{
	if(!event)
		var event = window.event;

	if(!$('tooltip'))
	{ 
		var body = document.getElementsByTagName('body')[0];
		var tooltip = document.createElement('div');
		var tooltip_shadow = document.createElement('div');
		tooltip.setAttribute('id','tooltip');
		tooltip_shadow.setAttribute('id','tooltip_shadow');
		body.appendChild(tooltip);
		body.appendChild(tooltip_shadow);
	}
	
	if(status == 'on' && !tooltips_on && (!panel_lifted || force) && show_tooltips)
	{ 
		var tooltip = $('tooltip');
		tooltip.innerHTML = information;
		tooltip.style.display = 'block';

		var tooltip_shadow = $('tooltip_shadow');
		tooltip_shadow.style.display = 'block';
		tooltip_shadow.style.width = tooltip.offsetWidth+'px';
		tooltip_shadow.style.height = tooltip.offsetHeight+'px';
		
		var body = document.getElementsByTagName('body')[0];

		if(current_browser != 'Explorer')
			body.addEventListener("mousemove", moveTooltip, false);
		else
			body.attachEvent("mousemove", moveTooltip);

		moveTooltip(event);

		tooltips_on = true;
	}
	else if(status == 'off' && tooltips_on)
	{
		var tooltip = $('tooltip');
		tooltip.innerHTML = '';
		tooltip.style.display = 'none';

		var tooltip_shadow = $('tooltip_shadow');
		tooltip_shadow.style.display = 'none';
		
		var body = document.getElementsByTagName('body')[0];

		if(current_browser != 'Explorer')
			body.removeEventListener("mousemove", moveTooltip, false);
		else
			body.detachEvent("mousemove", moveTooltip);

		tooltips_on = false;
	}
}

/**
 * Moves the tooltip to location determined by event.
 * @param {Object} event Event object
 */
function moveTooltip(event)
{
	if(!event)
		var event = window.event;

	var tooltip = $('tooltip');
	tooltip.style.left = (getEventPageX(event)+15)+'px';
	tooltip.style.top = (getEventPageY(event)+10)+'px';

	var tooltip_shadow = $('tooltip_shadow');
	tooltip_shadow.style.left = (getEventPageX(event)+15+2)+'px';
	tooltip_shadow.style.top = (getEventPageY(event)+10+2)+'px';
}

var blurb_on = false;

/**
 * Toggles the display of a blurb.
 * @param {Object} event Event object
 * @param {String} status Indicates whether to show or hide the blurb ("on" or "off")
 * @param {String} information Content to display as blurb
 * @param {Boolean} force_blurb Indicates whether to override preconditions to show blurb
 */
function toggleBlurb(event,status,information,force_blurb)
{
	if(!event && event != 'false')
		var event = window.event;

	if(!$('blurb'))
	{
		var body = document.getElementsByTagName('body')[0];
		var blurb = document.createElement('div');
		var blurb_shadow = document.createElement('div');
		blurb.setAttribute('id','blurb');
		blurb_shadow.setAttribute('id','blurb_shadow');
		body.appendChild(blurb);
		body.appendChild(blurb_shadow);
	}
	
	if(status == 'on' && !blurb_on && !panel_lifted && (show_blurbs || force_blurb))
	{
		var blurb = $('blurb');
		blurb.innerHTML = information;
		blurb.style.display = 'block';

		var blurb_shadow = $('blurb_shadow');
		blurb_shadow.style.display = 'block';
		blurb_shadow.style.width = blurb.offsetWidth+'px';
		blurb_shadow.style.height = blurb.offsetHeight+'px';
		
		var body = document.getElementsByTagName('body')[0];
		body.onmousemove = moveBlurb;

		moveBlurb(event);

		blurb_on = true;
	}
	else if(status == 'off' && blurb_on)
	{
		var blurb = $('blurb');
		blurb.innerHTML = '';
		blurb.style.display = 'none';

		var blurb_shadow = $('blurb_shadow');
		blurb_shadow.style.display = 'none';
		
		var body = document.getElementsByTagName('body')[0];
		body.onmousemove = null;

		blurb_on = false;
	}
}

/**
 * Moves the blurb to location determined by event.
 * @param {Object} event Event object
 */
function moveBlurb(event)
{
	if(!event)
		var event = window.event;

	var blurb = $('blurb');
	blurb.style.left = (getEventPageX(event)+15)+'px';
	blurb.style.top = (getEventPageY(event)+10)+'px';

	var blurb_shadow = $('blurb_shadow');
	blurb_shadow.style.left = (getEventPageX(event)+15+3)+'px';
	blurb_shadow.style.top = (getEventPageY(event)+10+3)+'px';
	blurb_shadow.style.width = blurb.offsetWidth+'px';
	blurb_shadow.style.height = blurb.offsetHeight+'px';
}

/**
 * Toggles the display of tooltips.
 * @param {String} action Indicates whether tooltips should be enabled or disabled ("on" or "off")
 * @param {Boolean} notify Indicates whether to alert the user to the settings change
 * @param {Boolean} noreport Indicates whether to report the settings change or not
 */
function toggleTooltips(action,notify,noreport)
{
	var toggle_tooltips_link = $('toggle_tooltips_link').firstChild;

	if(action == 'off' || (show_tooltips && action != 'on'))
	{
		show_tooltips = false;
		toggle_tooltips_link.nodeValue = 'Turn on tooltips';

		if(notify)
			alert('Tooltips have been disabled.');
	}
	else
	{
		show_tooltips = true;
		toggle_tooltips_link.nodeValue = 'Turn off tooltips';

		if(notify)
			alert('Tooltips have been enabled.');
	}

	if(!noreport)
		reportTooltipSettings();

	page_customized = true;
}

/**
 * Reports tooltip settings.
 */
function reportTooltipSettings()
{
	if(show_tooltips)
		status = 'enabled';
	else
		status = 'disabled';
	
	if(username)
	{
		var ajax = initAjax();
		ajax.open('GET','scripts/report_tooltip_settings.php?timeStamp='+new Date().getTime()+'&username='+username+'&status='+status,true);
		ajax.send(null);
	}
}

/**
 * Toggles the display of blurbs.
 * @param {String} action Indicates whether blurbs should be enabled or disabled ("on" or "off")
 * @param {Boolean} notify Indicates whether to alert the user to the settings change
 * @param {Boolean} noreport Indicates whether to report the settings change or not
 */
function toggleBlurbs(action,notify,noreport)
{
	var ajax = initAjax();
	var toggle_blurbs_link = $('toggle_blurbs_link').firstChild;
	
	if(action == 'off' || (show_blurbs && action != 'on'))
	{
		show_blurbs = false;
		toggle_blurbs_link.nodeValue = 'Turn on popup blurbs';
		
		if(notify)
			alert('Popup blurbs have been disabled.');
	}
	else
	{
		show_blurbs = true;
		toggle_blurbs_link.nodeValue = 'Turn off popup blurbs';

		if(notify)
			alert('Popup blurbs have been enabled.');
	}

	if(!noreport)
		reportBlurbSettings();

	page_customized = true;
}

/**
 * Reports blurb settings.
 */
function reportBlurbSettings()
{
	if(show_blurbs)
		status = 'enabled';
	else
		status = 'disabled';
	
	if(username)
	{
		var ajax = initAjax();
		ajax.open('GET','scripts/report_blurb_settings.php?timeStamp='+new Date().getTime()+'&username='+username+'&status='+status,true);
		ajax.send(null);
	}
}

/**
 * Toggles the drifting of panels.
 * @param {String} action Indicates whether panel drifting should be enabled or disabled ("on" or "off")
 * @param {Boolean} notify Indicates whether to alert the user to the settings change
 * @param {Boolean} noreport Indicates whether to report the settings change or not
 */
function togglePanelDrifting(action,notify,noreport)
{ 
	var ajax = initAjax();
	var toggle_panel_drifting_link = $('toggle_panel_drifting_link').firstChild;
	
	if(action == 'off' || (drift_panels && action != 'on'))
	{
		drift_panels = false;
		toggle_panel_drifting_link.nodeValue = 'Turn on panel drifting';
		
		if(notify)
			alert('Panel drifting has been disabled.');
	}
	else
	{ 
		drift_panels = true;
		toggle_panel_drifting_link.nodeValue = 'Turn off panel drifting'; 

		if(notify)
			alert('Panel drifting has been enabled.');
	}

	if(!noreport)
		reportPanelDriftingSettings('disabled');

	page_customized = true; 
}

/**
 * Reports panel drifting settings.
 */
function reportPanelDriftingSettings()
{
	if(drift_panels)
		status = 'enabled';
	else
		status = 'disabled';
	
	if(username)
	{
		var ajax = initAjax();
		ajax.open('GET','scripts/report_panel_drifting_settings.php?timeStamp='+new Date().getTime()+'&username='+username+'&status='+status,true);
		ajax.send(null);
	}
}

/**
 * Changes the content of the tooltip.
 * @param {String} content New content for tooltip
 */
function setTooltip(content)
{
	var tooltip = $('tooltip');
	if(tooltip)
		tooltip.innerHTML = content;
}

/**
 * Toggles activation of "add panel" link.
 * @param {String} panel_name Name of panel for link
 * @param {String} status Indicates whether to activate or deactivate link ("on" or "off")
 */
function toggleAddPanelLink(panel_name,status)
{
	if(panel_name && status)
	{
		var add_panel_link = $('add_panel_link_'+panel_name);

		if(add_panel_link)
		{
			if(status == 'on')
			{
				add_panel_link.className = 'add_panel_link';
				add_panel_link.onclick = function(event) { loadPanel(panel_name,'c2',null,false,event,true); };
			}
			else if(status == 'off')
			{
				add_panel_link.className = 'add_panel_link_disabled';
				add_panel_link.onmousedown = null;
			}
		}
	}
}

// Username of user who has signed in
var username;

/**
 * Reports basic gateway settings.
 */
function reportSettings()
{
	if(username)
	{
		reportTooltipSettings();
		reportBlurbSettings();
		reportPanelDriftingSettings();
		reportPanels();
	}
}

/**
 * Adds new RSS feed to gateway and creates new panel for the feed.
 * @param {Object} event Event object
 * @param {String} name Name of feed
 * @param {String} url URL of feed
 */
function addRssFeed(event,name,url)
{	
	if(!username && !(name && url))
	{
		alert('You must sign in before adding a new feed.');
		return false;
	}

	if(!name)
		name = trim($("add_rss_feed_name").value);
	if(!url)
		url = trim($("add_rss_feed_url").value);

	if(!name || !url)
	{
		alert('Please provide both a name and a URL for your new feed.');
		return false;
	}
	else
	{
		var ajax = initAjax();
		var xml = '<feed><name><![CDATA['+name+']]></name><url><![CDATA['+url+']]></url></feed>';
		ajax.open('POST','scripts/add_rss_feed.php',false);
		ajax.setRequestHeader("Content-Type","text/xml;");
		ajax.send(xml);
		
		var feed = ajax.responseText;
		
		if(feed == 'invalid')
		{
			alert('The URL of your feed must begin with "http://".');
			return false;
		}
		else if(feed == 'illegal')
		{
			alert('You must sign in before adding a new feed.');
			return false;
		}
		else if(feed && parseInt(feed).toString() != 'NaN' && feed != 0)
		{
			loadPanel('rss_feed','c2',false,feed,event,true);
			return true;
		}
		else
		{
			alert('Sorry, we were unable to add your new feed successfully.');
			return false;
		}
	}

	return false;
}

/**
 * Submits feedback to webmaster about gateway using information entered into feedback form.
 */
function submitFeedback()
{
	var name = trim($('feedback_name').value);
	var email = trim($('feedback_email').value);
	var content = trim($('feedback_content').value);
	
	var button = $('submit_feedback_button');
	var load = $('submit_feedback_load');

	if(content)
	{
		button.disabled = true;
		load.style.display = 'block';
		
		var ajax = initAjax();
		var xml = '<feedback><name><![CDATA['+name+']]></name><email><![CDATA['+email+']]></email><content><![CDATA['+content+']]></content></feedback>';
		ajax.open('POST','scripts/submit_feedback.php',true);
		ajax.setRequestHeader("Content-Type","text/xml;");
		ajax.onreadystatechange = function() { submitFeedbackResponse(ajax) };
		ajax.send(xml);
	}
}

/**
 * Called exclusively by submitFeedback(); continues operations of that function by reporting result to user.
 * @param {Object} ajax Ajax object
 * @see #submitFeedback
 */
function submitFeedbackResponse(ajax)
{
	if(ajax.readyState == 4)
	{
		var button = $('submit_feedback_button');
		var load = $('submit_feedback_load');
		button.disabled = false;
		load.style.display = 'none';

		if(ajax.status == 200)
		{
			var response = ajax.responseText;
			
			if(response == 'success')
				alert('Thank you! Your feedback has been submitted successfully.');
			else
				alert("Sorry, due to technical difficulties your feedback was not submitted successfully.\n\nPlease email webmaster@bowdoin.edu to let us know that you encountered this problem.");
		}
		else
			alert("Sorry, due to technical difficulties your feedback was not submitted successfully.\n\nPlease email webmaster@bowdoin.edu to let us know that you encountered this problem.");
	}
}

/**
 * Toggles display of the "What's RSS?" information box.
 * @param {String} action Indicates whether to show or hide the information box ("on" or "off")
 * @param {Object} event Event object
 */
function toggleWhatsRss(action,event)
{
	if(!event)
		var event = window.event;	
	
	if(action == 'on')
	{
		var y = getEventPageY(event)-50;

		toggleTint('on');

		var popup = document.createElement('div');
		popup.setAttribute('id','popup');
		popup.style.top = y+'px';
		popup.innerHTML = 'Many websites use Really Simple Syndication (RSS) feeds to distribute information so that it can be displayed on other websites. News websites, such as The New York Times, for example, commonly provide RSS feeds that contain information about their news articles. These feeds can be harnessed by other websites to display the news articles in a customized fashion.<br /><br />On the Bowdoin Student Gateway, this is done by displaying the headlines of news articles in a publisher\'s own panel. We have provided a set of publishers whose feeds you can load into the gateway (Associated Press, ESPN, etc.). However, you can load any RSS feed you would like by simply providing the name of the feed and its URL, or internet address.<br /><br />To determine the URL of the feed you would like to add, visit the website of the publisher and look for any of these icons: <img src="images/rss.gif" /> <img src="images/xml.gif" /> <img src="images/rss_feed.gif" />. <strong>Make sure you actually click on one of these icons to obtain the proper URL, which will probably end in something like ".xml" or ".rss".</strong> Just grabbing any URL (such as "http://www.cnn.com/") from a website that provides RSS feeds will <strong>not</strong> work. You need to grab the URL of the actual feed (such as "http://rss.cnn.com/rss/cnn_topstories.rss").<br /><br />You may also want to try searching for the RSS feed using a search engine. For example, if you wanted to add news from Rolling Stone magazine, you could search for \'rolling stone rss\' in Google.';
		popup.onclick = function(event) { stopPropagation(event); };

		var close = document.createElement('div');
		close.className = 'close';
		close.onclick = function(event) { toggleWhatsRss('off',event); };
		popup.appendChild(close);

		var popup_shadow = document.createElement('div');
		popup_shadow.setAttribute('id','popup_shadow');
		popup_shadow.style.top = (y+2)+'px';

		var column_3 = $('column_3');
		column_3.appendChild(popup);
		column_3.appendChild(popup_shadow);

		var popup = $('popup');
		var popup_shadow = $('popup_shadow');
		popup_shadow.style.width = popup.offsetWidth+'px';
		popup_shadow.style.height = popup.offsetHeight+'px';

		setTimeout("var body = document.getElementsByTagName('body')[0]; body.onclick = function(event) { toggleWhatsRss('off',event); };",1);
	}
	else
	{
		var column_3 = $('column_3');
		var popup = $('popup');
		var popup_shadow = $('popup_shadow');
		column_3.removeChild(popup);
		column_3.removeChild(popup_shadow);
		toggleTint('off');
		var body = document.getElementsByTagName('body')[0]; 
		body.onclick = null;
	}
}

var signing_in = false;

/**
 * Attempt to sign the user into the gateway using information entered into sign-in form.
 */
function signIn()
{
	if(!signing_in)
	{
		signing_in = true;
		var username_field = document.forms["signin_form"].username;
		var password_field = document.forms["signin_form"].password;
		var remember = document.forms["signin_form"].remember.value;
		
		var ajax = initAjax();
		ajax.open('POST','scripts/signin.php?timeStamp='+new Date().getTime(),false);
		ajax.setRequestHeader("Content-Type","application/x-www-form-urlencoded;");
		ajax.send('username='+username_field.value+'&password='+password_field.value+'&remember='+remember);

		if(ajax.readyState == 4)
		{
			if(ajax.status == 200)
			{
				var response = ajax.responseText;

				if(response.substring(0,7) == 'success')
				{
					var new_user = response.substring(10,11);
					var fullname = response.substring(14,response.length);
					
					var session = $('session');
					session.innerHTML = 'Welcome, <strong>'+fullname+'</strong>';

					var session_link = document.createElement('a');
					session_link.setAttribute('href','scripts/signout.php');
					session_link.onclick = function() { return confirm('Are you sure you want to sign out?'); };
					session_link.style.color = 'gray';
					session_link.style.marginLeft = '5px';
					session_link.innerHTML = '[Sign Out]';

					session.appendChild(session_link);

					username = username_field.value;

					toggleSignIn('off');

					if(new_user == 'Y')
						reportPanels();
					else if(page_customized)
						signInPrompt();
					else
						window.location = 'index.php';
				}
				else
				{
					var signin_message = $('signin_message');
					signin_message.style.display = 'block';

					if(response == 'missing_variables')
						signin_message.innerHTML = 'Please provide both a username and a password.';
					else if(response == 'invalid')
						signin_message.innerHTML = 'The username and password you provided are invalid.';
					else
						signin_message.innerHTML = 'Sorry, but we are unable to sign you in at this time.';

					username_field.focus();
				}
			}
		}

		signing_in = false;
	}

	return false;
}

/**
 * Prompt user with option regarding their sign-in; specifically, whether to restore their old settings or save their new ones
 * @param {String} action Indicates whether to show or hide the prompt
 */
function signInPrompt(action)
{
	if(!action || action == 'on')
	{
		toggleTint('on');

		var popup = document.createElement('div');
		popup.setAttribute('id','popup');
		popup.style.top = '100px';
		popup.style.fontSize = '14px';
		popup.style.padding = '25px';
		popup.innerHTML = 'Loading content...';

		var popup_shadow = document.createElement('div');
		popup_shadow.setAttribute('id','popup_shadow');
		popup_shadow.style.top = '102px';

		var column_3 = $('column_3');
		column_3.appendChild(popup);
		column_3.appendChild(popup_shadow);

		var popup = $('popup');
		var popup_shadow = $('popup_shadow');
		popup_shadow.style.width = popup.offsetWidth+'px';
		popup_shadow.style.height = popup.offsetHeight+'px';

		var ajax = initAjax();
		ajax.open('GET','signin_prompt.php',true);
		ajax.onreadystatechange = function() { signInPromptCallback(ajax) };
		ajax.send(null);
	}
	else if(action == 'off')
	{
		var column_3 = $('column_3');
		var popup = $('popup');
		var popup_shadow = $('popup_shadow');
		column_3.removeChild(popup);
		column_3.removeChild(popup_shadow);
		toggleTint('off');
	}
}

/**
 * Called exclusively by signInPrompt(); continues the operations of that function.
 * @param {Object} ajax Ajax object
 * @see #signInPrompt
 */
function signInPromptCallback(ajax)
{
	if(ajax.readyState == 4)
	{
		if(ajax.status == 200)
		{
			var response = ajax.responseXML;
			var html = response.getElementsByTagName('html')[0];

			var popup = $('popup');
			popup.removeChild(popup.firstChild);
			appendNode(firstElement(html),popup);

			var popup_shadow = $('popup_shadow');
			popup_shadow.style.width = popup.offsetWidth+'px';
			popup_shadow.style.height = popup.offsetHeight+'px';
		}
		else
			window.location = 'index.php';
	}
}