/**  
 * @fileoverview This file contains functions and variables for the snapshots panel.
 * @author Mark Hendrickson <mhendric@bowdoin.edu>
 * @version 1.0
 */

// Directory that stores the snapshot images
var snapshots_directory = 'images/snapshots/';

// Interval between snapshots in slideshow in milliseconds
var snapshots_interval_ms = 10000;

var current_snapshot;
var backward_snapshot;
var forward_snapshot;
var backward_snapshot_image = new Image();
var forward_snapshot_image = new Image();
var active_snapshot = 1;
var showing_snapshot = false;
var slideshow_interval;
var prepping_backward_snapshot = false;
var prepping_forward_snapshot = false;

/**
 * Initializes and starts the snapshots slideshow.
 */
function initSnapshots()
{
	var ajax = initAjax();
	ajax.open('GET','scripts/get_snapshot.php',true);
	ajax.onreadystatechange = function() { initSnapshotsCallback(ajax) };
	ajax.send(null);
}

/**
 * Called exclusively by initSnapshots() ; continues the operations of that function.
 * @param {Object} ajax Ajax object
 * @see #initSnapshots
 */
function initSnapshotsCallback(ajax)
{
	if(ajax.readyState == 4)
	{
		if(ajax.status == 200)
		{
			var response = ajax.responseXML;
			var snapshot = response.getElementsByTagName('snapshot')[0];
			var id = elementText(snapshot.getElementsByTagName('id')[0]);
			var filename = elementText(snapshot.getElementsByTagName('filename')[0]);

			var active_snapshot_image = $('snapshot_image_'+active_snapshot);
			active_snapshot_image.src = snapshots_directory+filename;
			
			var active_snapshot_div = $('snapshot_div_'+active_snapshot);
			active_snapshot_div.style.opacity = 1;
			active_snapshot_div.style.filter = 'alpha(opacity=100)';

			current_snapshot = id;

			prepNextSnapshots();

			startSnapshotSlideshow(true);
		}
	}
}

/**
 * Prepares the previous and next snapshots so they are ready when snapshot changes.
 */
function prepNextSnapshots()
{	
	prepping_backward_snapshot = true;
	var ajax = initAjax();
	ajax.open('GET','scripts/get_snapshot.php?current_snapshot='+current_snapshot+'&direction=backward',true);
	ajax.onreadystatechange = function() { prepNextSnapshotsCallback(ajax,'backward') };
	ajax.send(null);

	prepping_forward_snapshot = true;
	var ajax2 = initAjax();
	ajax2.open('GET','scripts/get_snapshot.php?current_snapshot='+current_snapshot+'&direction=forward',true);
	ajax2.onreadystatechange = function() { prepNextSnapshotsCallback(ajax2,'forward') };
	ajax2.send(null);
}

/**
 * Called exclusively by prepNextSnapshots(); continues the operations of that function.
 * @param {Object} ajax Ajax object
 * @param {String} direction Indicates whether to prepare the previous or next snapshot
 * @see #prepNextSnapshots
 */
function prepNextSnapshotsCallback(ajax,direction)
{
	if(ajax.readyState == 4)
	{
		if(ajax.status == 200)
		{
			var response = ajax.responseXML;
			var snapshot = response.getElementsByTagName('snapshot')[0];
			var id = elementText(snapshot.getElementsByTagName('id')[0]);
			var filename = elementText(snapshot.getElementsByTagName('filename')[0]);

			if(direction == 'backward')
			{
				backward_snapshot = id;
				backward_snapshot_image = snapshots_directory+filename;
				prepping_backward_snapshot = false;
			}
			else
			{
				forward_snapshot = id;
				forward_snapshot_image = snapshots_directory+filename;
				prepping_forward_snapshot = false;
			}
		}
	}
}

/**
 * Starts the snapshots slideshow.
 * @param {Boolean} dont_show_snapshot Indicates whether not to show a new snapshot initially.
 */
function startSnapshotSlideshow(dont_show_snapshot)
{
	slideshow_interval = setInterval('showSnapshot()',snapshots_interval_ms);

	var snapshot_play_pause = $('snapshot_play_pause');
	snapshot_play_pause.src = 'images/pause.gif';
	snapshot_play_pause.onmouseover = function(event) { toggleTooltip(event,'on','Pause slideshow'); };
	snapshot_play_pause.onclick = function() { stopSnapshotSlideshow(); };

	if(!dont_show_snapshot)
		showSnapshot();
}

/**
 * Stops the snapshots slideshow.
 */
function stopSnapshotSlideshow()
{
	clearInterval(slideshow_interval);
	slideshow_interval = '';

	var snapshot_play_pause = $('snapshot_play_pause');
	snapshot_play_pause.src = 'images/play.gif';
	snapshot_play_pause.onmouseover = function(event) { toggleTooltip(event,'on','Play slideshow'); };
	snapshot_play_pause.onclick = function() { startSnapshotSlideshow(); };
}

/**
 * Shows a different snapshot.
 * @param {String} direction Indicates whether the snapshot should be chosen by going "backward" or "forward."
 * @param {Boolean} override Indicates whether to override the precondition that another call of the function must have completed
 */
function showSnapshot(direction,override)
{
	if(!showing_snapshot || override)
	{
		showing_snapshot = true;

		if(active_snapshot == 1)
			var inactive_snapshot = 2;
		else
			var inactive_snapshot = 1;

		var inactive_snapshot_image = $('snapshot_image_'+inactive_snapshot);

		if(direction == 'backward')
		{
			if(prepping_backward_snapshot)
			{
				setTimeout("showSnapshot('backward',true)",1000);
				return;
			}

			direction = 'backward';
			inactive_snapshot_image.src = backward_snapshot_image;
			current_snapshot = backward_snapshot;
		}
		else
		{
			if(prepping_forward_snapshot)
			{
				setTimeout("showSnapshot('forward',true)",1000);
				return;
			}

			direction = 'forward';
			inactive_snapshot_image.src = forward_snapshot_image;
			current_snapshot = forward_snapshot;
		}

		showSnapshotProcess();
	}
}

/**
 * Called exclusively by snowSnapshot(); continues the operations of that function by fading new snapshot into view.
 * @param {Integer} step Step in fade-in process
 */
function showSnapshotProcess(step)
{
	if(!step)
		step = 1;
	
	if(active_snapshot == 1)
		var inactive_snapshot = 2;
	else
		var inactive_snapshot = 1;

	var active_snapshot_div = $('snapshot_div_'+active_snapshot);
	var inactive_snapshot_div = $('snapshot_div_'+inactive_snapshot);
	
	if(step <= 20)
	{
		active_snapshot_div.style.opacity = (20-step)/20;
		active_snapshot_div.style.filter = 'alpha(opacity='+(20-step)*20+')';

		inactive_snapshot_div.style.opacity = step/20;
		inactive_snapshot_div.style.filter = 'alpha(opacity='+(step)*20+')';

		setTimeout('showSnapshotProcess('+(step+1)+')',35);
		
	}
	else
	{		
		if(active_snapshot == 1)
			active_snapshot = 2;
		else
			active_snapshot = 1;
		
		showing_snapshot = false;

		prepNextSnapshots();
	}
}