
// images
var imgFalse = baseaddr + "/images/checkbox-half.png";
var imgTrue = baseaddr + "/images/checkbox-checked-half.png";
var imgRefresh = baseaddr + "/images/spinner_half.gif";

// cell element
var opacity_timer;
var flashcard_opacity_wrapper_id = "flashcard_opacity_wrapper";
var flashcard_opacity_wrapper = null;
var flashcard_opacity_wrapper_opacity_value = 0.05;
var flashcard_opacity_wrapper_opacity_increment = 0.10;
var flashcard_opacity_wrapper_timer_delay = 5;

function show_flashcard_container( container_name )
{
	container_name = trim( container_name.toLowerCase() );
	
	var flashcard_create_container_id = "flashcard_create_container";
	var flashcard_print_container_id = "flashcard_print_container";
	var flashcard_practice_container_id = "flashcard_practice_container";
	var flashcard_delete_container_id = "flashcard_delete_container";

	var create_element = document.getElementById( flashcard_create_container_id );
	var print_element = document.getElementById( flashcard_print_container_id );
	var practice_element = document.getElementById( flashcard_practice_container_id );
	var delete_element = document.getElementById( flashcard_delete_container_id );

	create_element.style.display = "none";
	print_element.style.display = "none";	
	practice_element.style.display = "none";
	delete_element.style.display = "none";

	switch( container_name )
	{
		case "create":

			create_element.style.display = "block";

			break;
			
		case "print":

			print_element.style.display = "block";	

			break;
			
		case "practice":
		
			practice_element.style.display = "block";
		
			break;
			
		case "delete":
		
			delete_element.style.display = "block";
		
			break;
			
		default:
		
	}
	
	// this is to prevent the instructions from showing up on pages 
	// they're not supposed to
	show_hide_instructions( 0 );

}

function get_flashcard_pool()
{	
	var flashcard_select_element_id = "flashcard_select_element";
	var flashcard_select_element_create_id = "flashcard_select_element_create";
	var save_spinner_id = "save_spinner";
	var flashcard_doublelist_table_cell_pool_id = "flashcard_doublelist_table_cell_pool";
	
	var save_spinner = document.getElementById( save_spinner_id )

	if ( save_spinner == null )
	{
		alert( "'save_spinner' element not found." );
		return false;
	}	
	
	save_spinner.src = imgRefresh;
	
	var gateway = baseaddr + "/ajax/flashcards.php?f=1";
	
//	alert( gateway );
	
	try
	{
		xmlHttp.open( "GET", gateway, true );
		xmlHttp.onreadystatechange = function()
		{
			switch( xmlHttp.readyState )
			{
					/*
					
					0 = open has not yet been called
					1 = send has not yet been called but open has been called
					2 = send has been called but no response from server
					3 = data is in the process of being received from the server
					4 = response from server has arrived				
					
					*/
				
					case 4:

						window.clearTimeout( ajax_request_timeout_timer );

						if ( xmlHttp.status == 200 )
						{
							var txt = xmlHttp.responseText;
						
							var element = document.getElementById( flashcard_select_element_id )
		
							if ( element == null )
							{
								alert( "'flashcard_select_element' element not found." );
								save_spinner.src = imgFalse;
								return false;
							}

							var element2 = document.getElementById( flashcard_select_element_create_id )
		
							if ( element2 == null )
							{
								alert( "'flashcard_select_element_create' element not found." );
								save_spinner.src = imgFalse;
								return false;
							}

							var list = xmlHttp.responseXML.getElementsByTagName( "list" )[0];
							
							if ( list == null )
							{
								alert( "XML response 'list' missing." );
								save_spinner.src = imgFalse;
								return false;
							}
							
							var result_code = list.attributes.getNamedItem( "result_code" ).value;
							var time = list.attributes.getNamedItem( "time" ).value;
														
							if ( result_code == 0 || result_code == 1 )
							{
								element.options.length = 0;
								element.disabled = false;
								element.style.display = 'block';

								element2.options.length = 0;
								element2.disabled = false;
						
								var option_list = list.getElementsByTagName( "option" );

								for ( si = 0; si < option_list.length; si++ )
								{
									var key = option_list[si].firstChild.nodeValue;
									var value = option_list[si].attributes.getNamedItem( "value" ).value;
									element.options[si] = new Option( key, value );
								}

								if ( element.options.length == 0 )
								{
									element.style.display = "none";
									
									var element3 = document.getElementById( flashcard_doublelist_table_cell_pool_id )
				
									if ( element3 == null )
									{
										alert( "'flashcard_doublelist_table_cell_pool' element not found." );

										save_spinner.src = imgFalse;
								
										return false;
									}									
									
									element3.style.display = "block";
									element3.innerHTML = "<div class=\"notice\">" + 
										"You do not have any words in your flashcard pool.<br/><br/>" +
										"To add words, <a href=\"/search_latin.php\">search</a>, " +
										"<a href=\"/browse_latin.php\">browse</a> or " +
										"use the <a href=\"/word_study_tool.php\">word study tool</a>.<br/><br/>" +
										"When you find a word you need a flashcard for, click the " +
										"flaschard checkbox." +
										"</div>";
								}

								save_spinner.src = imgTrue;
							}
							else
							{
								save_spinner.src = imgFalse;
							}
								
						}
						else
						{
							save_spinner.src = imgFalse;
								
							if ( xmlHttp.status == 0 ) 
							{
								// This just means we aborted the connection
							}
							else
							{
								alert( "I encountered error " + 
									xmlHttp.status + " (" + xmlHttp.statusText + ") " + 
									"while trying to communicate with the AJAX gateway." );							
							}
						}

						break;
			}
			
		}
		
		xmlHttp.send( null );	
		ajax_request_timeout_timer = window.setTimeout( "ajax_request_timeout()", ajax_request_timeout_in_ms );

	}
	catch( e )
	{
		alert( "I could not open the AJAX gateway.\n\n" + gateway );
		
		return false;
	}
	
	return true;
}

function save_flashcard_deck()
{	
	var flashcard_select_element_create_id = "flashcard_select_element_create";
	var save_spinner_id = "save_spinner";
	var flashcard_deck_name_text_id = "flashcard_deck_name_text";
	var flashcard_deck_tags_text_id = "flashcard_deck_tags_text";
	var flashcard_pubpriv_radio_id = "flashcard_pubpriv_radio";
	
	var save_spinner = document.getElementById( save_spinner_id )

	if ( save_spinner == null )
	{
		alert( "'save_spinner' element not found." );
		return false;
	}	
	
	save_spinner.src = imgRefresh;
	
	var flashcard_select_element_create = document.getElementById( flashcard_select_element_create_id )

	if ( flashcard_select_element_create == null )
	{
		alert( "'flashcard_select_element_create' element not found." );
		return false;
	}
	
	if( flashcard_select_element_create.options.length < 1 )
	{
		alert( "Your list is empty. Please place " +
			"at least one word on the list." );					

		save_spinner.src = imgFalse;

		return false;
	}	

	var flashcard_list = "";
	for( var si = 0; si < flashcard_select_element_create.length; si++ )
	{
		if( flashcard_list != "" )
		{
			flashcard_list = flashcard_list + ",";
		}
		
		flashcard_list = flashcard_list + flashcard_select_element_create.options[si].value;
	}

	// the name of the list
	var flashcard_deck_name_text = document.getElementById( flashcard_deck_name_text_id )

	if ( flashcard_deck_name_text == null )
	{
		alert( "'flashcard_deck_name_text' element not found." );

		save_spinner.src = imgFalse;

		return false;
	}	

	if( trim( flashcard_deck_name_text.value ).length < 1 )
	{
		alert( "Please give your list a name." );
		
		save_spinner.src = imgFalse;

		return false;
	}

	// the tags of the list
	var flashcard_deck_tags_text = document.getElementById( flashcard_deck_tags_text_id )

	if ( flashcard_deck_tags_text == null )
	{
		alert( "'flashcard_deck_tags_text' element not found." );

		save_spinner.src = imgFalse;

		return false;
	}	

	if( trim( flashcard_deck_tags_text.value ).length < 1 )
	{
		alert( "Please give your list at least one tag." );
		
		save_spinner.src = imgFalse;

		return false;
	}

	// public or private
	var elements = document.getElementsByName( flashcard_pubpriv_radio_id );
	
	if ( elements.length < 2 )
	{
		alert( "'flashcard_pubpriv_radio' elements not found." );

		save_spinner.src = imgFalse;

		return false;
	}		

	// 2009.11.05 KAW: flashcard_pubpriv_radio is already in
	// the IE namespace because elements with an ID are placed
	// there (presumably as read only elements). Creating a
	// variable with this name was returning a JS error,
	// so I renamed the variable to flashcard_pubpriv_radio_var.
	// This probably happens elsewhere and it should just be
	// a common practice to avoid such name collisions in browsers
	// (like IE) that exhibit this behavior. 
	for( var si = 0; si < elements.length; si++ )
	{
		if( elements[si].checked )
		{
			var flashcard_pubpriv_radio_var = elements[si];
		}		
	}

	var p1 = urlencode( flashcard_deck_name_text.value );
	var p2 = urlencode( flashcard_deck_tags_text.value );
	var p3 = urlencode( flashcard_pubpriv_radio_var.value );
	var p4 = urlencode( flashcard_list );
	
	var gateway = baseaddr + "/ajax/flashcards.php?f=2" +
		"&p1=" + p1 +
		"&p2=" + p2 +
		"&p3=" + p3 +
		"&p4=" + p4;	
	
	try
	{
		xmlHttp.open( "GET", gateway, true );
		xmlHttp.onreadystatechange = function()
		{
			switch( xmlHttp.readyState )
			{
					/*
					
					0 = open has not yet been called
					1 = send has not yet been called but open has been called
					2 = send has been called but no response from server
					3 = data is in the process of being received from the server
					4 = response from server has arrived				
					
					*/
				
					case 4:

						window.clearTimeout( ajax_request_timeout_timer );

						if ( xmlHttp.status == 200 )
						{
							var txt = xmlHttp.responseText;
						
							var element2 = document.getElementById( flashcard_select_element_create_id )
		
							if ( element2 == null )
							{
								alert( "'flashcard_select_element_create' element not found." );
								return false;
							}

							var list = xmlHttp.responseXML.getElementsByTagName( "list" )[0];
							
							if ( list == null )
							{
								alert( "XML response 'list' missing." );
								return false;
							}

							var result_code = list.attributes.getNamedItem( "result_code" ).value;
							var time = list.attributes.getNamedItem( "time" ).value;
													
							if ( result_code == 0 )
							{
								
								var flashcard_save = document.getElementById( "flashcard_save" )
		
								if ( flashcard_save == null )
								{
									alert( "'flashcard_save' element not found." );

									save_spinner.src = imgFalse;
									
									return false;
								}
								
								//flashcard_save.value = "Flashcard list was saved successfully.";

								//disable_form_elements_in_element( "flashcard_create_container", save_spinner );

								alert( "Your new deck was saved." );

								save_spinner.src = imgTrue;

							}
							else
							{
								if ( result_code == 4 )
								{
									alert( "You already have a list with that exact name." );
								}
								
								save_spinner.src = imgFalse;
							}
						}
						else
						{
							save_spinner.src = imgFalse;

							if ( xmlHttp.status == 0 ) 
							{
								// This just means we aborted the connection
							}
							else
							{
								alert( "I encountered error " + 
									xmlHttp.status + " (" + xmlHttp.statusText + ") " + 
									"while trying to communicate with the AJAX gateway." );							
							}
						}

						break;
			}
			
		}
		
		xmlHttp.send( null );	
		ajax_request_timeout_timer = window.setTimeout( "ajax_request_timeout()", ajax_request_timeout_in_ms );

	}
	catch( e )
	{
		alert( "I could not open the AJAX gateway.\n\n" + gateway );
		
		return false;
	}
	
	return true;
}

/**
	*
	*/
function get_print_list()
{	
	var flashcard_print_select_element_id = "flashcard_print_select_element";
	var flashcard_print_pubpriv_radio_id = "flashcard_print_pubpriv_radio";

	var print_spinner_id = "print_spinner";
	
	var print_spinner = document.getElementById( print_spinner_id )

	if ( print_spinner == null )
	{
		alert( "'print_spinner' element not found." );
		return false;
	}	
	
	print_spinner.src = imgRefresh;
	
	// public or private
	var elements = document.getElementsByName( flashcard_print_pubpriv_radio_id );
	
	if ( elements.length < 2 )
	{
		alert( "'flashcard_print_pubpriv_radio' element not found." );

		print_spinner.src = imgFalse;

		return false;
	}		
	
	for( var si = 0; si < elements.length; si++ )
	{
		if( elements[si].checked )
		{
			pub_priv = elements[si];
		}
	}	

	var p1 = urlencode( pub_priv.value );

	var gateway = baseaddr + "/ajax/flashcards.php?f=7" +
		"&p1=" + p1;
	
//	alert( gateway );
	
	try
	{
		xmlHttp.open( "GET", gateway, true );
		xmlHttp.onreadystatechange = function()
		{
			switch( xmlHttp.readyState )
			{
					/*
					
					0 = open has not yet been called
					1 = send has not yet been called but open has been called
					2 = send has been called but no response from server
					3 = data is in the process of being received from the server
					4 = response from server has arrived				
					
					*/
				
					case 4:

						window.clearTimeout( ajax_request_timeout_timer );

						if ( xmlHttp.status == 200 )
						{
							var txt = xmlHttp.responseText;
						
							var element = document.getElementById( flashcard_print_select_element_id )
		
							if ( element == null )
							{
								alert( "'flashcard_print_select_element' element not found." );

								print_spinner.src = imgFalse;

								return false;
							}

							var list = xmlHttp.responseXML.getElementsByTagName( "list" )[0];
							
							if ( list == null )
							{
								alert( "XML response 'list' missing." );

								print_spinner.src = imgFalse;

								return false;
							}
							
							var result_code = list.attributes.getNamedItem( "result_code" ).value;
							var time = list.attributes.getNamedItem( "time" ).value;
														
							if ( result_code == 0 || result_code == 1 )
							{
								element.options.length = 0;
								element.disabled = false;
						
								var option_list = list.getElementsByTagName( "option" );

								for ( si = 0; si < option_list.length; si++ )
								{
									var key = option_list[si].firstChild.nodeValue;
									var value = option_list[si].attributes.getNamedItem( "value" ).value;
									element.options[si] = new Option( key, value );
								}

							}

							print_spinner.src = imgTrue;

						}
						else
						{
							print_spinner.src = imgFalse;
							
							if ( xmlHttp.status == 0 ) 
							{
								// This just means we aborted the connection
							}
							else
							{
								alert( "I encountered error " + 
									xmlHttp.status + " (" + xmlHttp.statusText + ") " + 
									"while trying to communicate with the AJAX gateway." );							
							}
						}

						break;
			}
			
		}
		
		xmlHttp.send( null );	
		ajax_request_timeout_timer = window.setTimeout( "ajax_request_timeout()", ajax_request_timeout_in_ms );

	}
	catch( e )
	{
		alert( "I could not open the AJAX gateway.\n\n" + gateway );
		
		return false;
	}
	
	return true;
}

/**
	*
	*/
function get_practice_list()
{	
	var flashcard_practice_select_element_id = "flashcard_practice_select_element";
	var flashcard_practice_pubpriv_radio_id = "flashcard_practice_pubpriv_radio";

	var practice_spinner_id = "practice_spinner";
	
	var practice_spinner = document.getElementById( practice_spinner_id )

	if ( practice_spinner == null )
	{
		alert( "'practice_spinner' element not found." );
		return false;
	}	
	
	practice_spinner.src = imgRefresh;
	
	// public or private
	var elements = document.getElementsByName( flashcard_practice_pubpriv_radio_id );
	
	if ( elements.length < 2 )
	{
		alert( "'flashcard_practice_pubpriv_radio' elements not found." );

		practice_spinner.src = imgFalse;

		return false;
	}		
	
	for( var si = 0; si < elements.length; si++ )
	{
		if( elements[si].checked )
		{
			pub_priv = elements[si];
		}
	}	

	var p1 = urlencode( pub_priv.value );

	var gateway = baseaddr + "/ajax/flashcards.php?f=6" +
		"&p1=" + p1;
	
//	alert( gateway );
	
	try
	{
		xmlHttp.open( "GET", gateway, true );
		xmlHttp.onreadystatechange = function()
		{
			switch( xmlHttp.readyState )
			{
					/*
					
					0 = open has not yet been called
					1 = send has not yet been called but open has been called
					2 = send has been called but no response from server
					3 = data is in the process of being received from the server
					4 = response from server has arrived				
					
					*/
				
					case 4:

						window.clearTimeout( ajax_request_timeout_timer );

						if ( xmlHttp.status == 200 )
						{
							var txt = xmlHttp.responseText;
						
							var element = document.getElementById( flashcard_practice_select_element_id )
		
							if ( element == null )
							{
								alert( "'flashcard_practice_select_element' element not found." );

								practice_spinner.src = imgFalse;

								return false;
							}

							var list = xmlHttp.responseXML.getElementsByTagName( "list" )[0];
							
							if ( list == null )
							{
								alert( "XML response 'list' missing." );

								practice_spinner.src = imgFalse;

								return false;
							}
							
							var result_code = list.attributes.getNamedItem( "result_code" ).value;
							var time = list.attributes.getNamedItem( "time" ).value;
														
							if ( result_code == 0 || result_code == 1 )
							{
								element.options.length = 0;
								element.disabled = false;
						
								var option_list = list.getElementsByTagName( "option" );

								for ( si = 0; si < option_list.length; si++ )
								{
									var key = option_list[si].firstChild.nodeValue;
									var value = option_list[si].attributes.getNamedItem( "value" ).value;
									element.options[si] = new Option( key, value );
								}

							}

							practice_spinner.src = imgTrue;

						}
						else
						{
							practice_spinner.src = imgFalse;
							
							if ( xmlHttp.status == 0 ) 
							{
								// This just means we aborted the connection
							}
							else
							{
								alert( "I encountered error " + 
									xmlHttp.status + " (" + xmlHttp.statusText + ") " + 
									"while trying to communicate with the AJAX gateway." );							
							}
						}

						break;
			}
			
		}
		
		xmlHttp.send( null );	
		ajax_request_timeout_timer = window.setTimeout( "ajax_request_timeout()", ajax_request_timeout_in_ms );

	}
	catch( e )
	{
		alert( "I could not open the AJAX gateway.\n\n" + gateway );
		
		return false;
	}
	
	return true;
}

/**
	*
	*/
function get_delete_list()
{	
	var flashcard_delete_select_element_id = "flashcard_delete_select_element";

	var delete_spinner_id = "delete_spinner";
	
	var delete_spinner = document.getElementById( delete_spinner_id )

	if ( delete_spinner == null )
	{
		alert( "'delete_spinner' element not found." );
		return false;
	}	

	var gateway = baseaddr + "/ajax/flashcards.php?f=3";
	
//	alert( gateway );
	
	try
	{
		xmlHttp.open( "GET", gateway, true );
		xmlHttp.onreadystatechange = function()
		{
			switch( xmlHttp.readyState )
			{
					/*
					
					0 = open has not yet been called
					1 = send has not yet been called but open has been called
					2 = send has been called but no response from server
					3 = data is in the process of being received from the server
					4 = response from server has arrived				
					
					*/
				
					case 4:

						window.clearTimeout( ajax_request_timeout_timer );

						if ( xmlHttp.status == 200 )
						{
							var txt = xmlHttp.responseText;
						
							var element = document.getElementById( flashcard_delete_select_element_id )
		
							if ( element == null )
							{
								alert( "'flashcard_delete_select_element' element not found." );
								return false;
							}

							var list = xmlHttp.responseXML.getElementsByTagName( "list" )[0];
							
							if ( list == null )
							{
								alert( "XML response 'list' missing." );
								return false;
							}
							
							var result_code = list.attributes.getNamedItem( "result_code" ).value;
							var time = list.attributes.getNamedItem( "time" ).value;
														
							if ( result_code == 0 || result_code == 1 )
							{
								element.options.length = 0;
								element.disabled = false;
						
								var option_list = list.getElementsByTagName( "option" );

								for ( si = 0; si < option_list.length; si++ )
								{
									var key = option_list[si].firstChild.nodeValue;
									var value = option_list[si].attributes.getNamedItem( "value" ).value;
									element.options[si] = new Option( key, value );
								}

								delete_spinner.src = imgTrue;
							}
							else
							{
								delete_spinner.src = imgFalse;
							}
						}
						else
						{
							delete_spinner.src = imgFalse;

							if ( xmlHttp.status == 0 ) 
							{
								// This just means we aborted the connection
							}
							else
							{
								alert( "I encountered error " + 
									xmlHttp.status + " (" + xmlHttp.statusText + ") " + 
									"while trying to communicate with the AJAX gateway." );							
							}
						}

						break;
			}
			
		}
		
		xmlHttp.send( null );	
		ajax_request_timeout_timer = window.setTimeout( "ajax_request_timeout()", ajax_request_timeout_in_ms );

	}
	catch( e )
	{
		alert( "I could not open the AJAX gateway.\n\n" + gateway );
		
		return false;
	}
	
	return true;
}

/**
	*
	*/
function delete_flashcard_deck()
{	
	var flashcard_delete_select_element_id = "flashcard_delete_select_element";
	var delete_spinner_id = "delete_spinner";
	
	var delete_spinner = document.getElementById( delete_spinner_id )

	if ( delete_spinner == null )
	{
		alert( "'delete_spinner' element not found." );
		return false;
	}	
	
	delete_spinner.src = imgRefresh;
	
	var flashcard_delete_select_element = document.getElementById( flashcard_delete_select_element_id )

	if ( flashcard_delete_select_element == null )
	{
		alert( "'flashcard_delete_select_element' element not found." );

		delete_spinner.src = imgFalse;

		return false;
	}
	
	if( flashcard_delete_select_element.selectedIndex == -1 )
	{
		alert( "You must select one list to delete." );					

		delete_spinner.src = imgFalse;

		return false;
	}	

	if( !confirm( "Are you sure you want to delete this deck?" ) )
	{
		delete_spinner.src = imgFalse;

		return false;		
	}

	var p1 = urlencode( flashcard_delete_select_element.options[flashcard_delete_select_element.selectedIndex].value );
	
	var gateway = baseaddr + "/ajax/flashcards.php?f=4" +
		"&p1=" + p1;	
	
	try
	{
		xmlHttp.open( "GET", gateway, true );
		xmlHttp.onreadystatechange = function()
		{
			switch( xmlHttp.readyState )
			{
					/*
					
					0 = open has not yet been called
					1 = send has not yet been called but open has been called
					2 = send has been called but no response from server
					3 = data is in the process of being received from the server
					4 = response from server has arrived				
					
					*/
				
					case 4:

						window.clearTimeout( ajax_request_timeout_timer );

						if ( xmlHttp.status == 200 )
						{
							var txt = xmlHttp.responseText;
						
							var element2 = document.getElementById( flashcard_delete_select_element_id )
		
							if ( element2 == null )
							{
								alert( "'flashcard_delete_select_element' element not found." );
								return false;
							}

							var list = xmlHttp.responseXML.getElementsByTagName( "list" )[0];
							
							if ( list == null )
							{
								alert( "XML response 'list' missing." );
								return false;
							}

							var result_code = list.attributes.getNamedItem( "result_code" ).value;
							var time = list.attributes.getNamedItem( "time" ).value;
													
							if ( result_code == 0 )
							{
								
								var flashcard_delete = document.getElementById( "flashcard_delete" )
		
								if ( flashcard_delete == null )
								{
									alert( "'flashcard_delete' element not found." );

									delete_spinner.src = imgFalse;
									
									return false;
								}

								delete_spinner.src = imgTrue;

								get_delete_list();

							}
							else
							{
								delete_spinner.src = imgFalse;
							}
						}
						else
						{
							delete_spinner.src = imgFalse;

							if ( xmlHttp.status == 0 ) 
							{
								// This just means we aborted the connection
							}
							else
							{
								alert( "I encountered error " + 
									xmlHttp.status + " (" + xmlHttp.statusText + ") " + 
									"while trying to communicate with the AJAX gateway." );							
							}
						}

						break;
			}
			
		}
		
		xmlHttp.send( null );	
		ajax_request_timeout_timer = window.setTimeout( "ajax_request_timeout()", ajax_request_timeout_in_ms );

	}
	catch( e )
	{
		alert( "I could not open the AJAX gateway.\n\n" + gateway );
		
		return false;
	}
	
	return true;
}

/**
	*
	*/
function clear_flashcard_pool()
{	
	var save_spinner_id = "save_spinner";
	
	var save_spinner = document.getElementById( save_spinner_id )

	if ( save_spinner == null )
	{
		alert( "'save_spinner' element not found." );
		return false;
	}	
	
	save_spinner.src = imgRefresh;
	
	var result = confirm( "This will erase all the flashcards " +
		"in your pool.\n\n " +
		"Your flashcard decks will not be affected.\n\n " +		
		"Are you sure?" );
	
	if( result == false )
	{
		save_spinner.src = imgFalse;

		return false; 
	}

	var gateway = baseaddr + "/ajax/flashcards.php?f=5";	
	
	try
	{
		xmlHttp.open( "GET", gateway, true );
		xmlHttp.onreadystatechange = function()
		{
			switch( xmlHttp.readyState )
			{
					/*
					
					0 = open has not yet been called
					1 = send has not yet been called but open has been called
					2 = send has been called but no response from server
					3 = data is in the process of being received from the server
					4 = response from server has arrived				
					
					*/
				
					case 4:

						window.clearTimeout( ajax_request_timeout_timer );

						if ( xmlHttp.status == 200 )
						{
							var txt = xmlHttp.responseText;
						
							var list = xmlHttp.responseXML.getElementsByTagName( "list" )[0];
							
							if ( list == null )
							{
								alert( "XML response 'list' missing." );
								return false;
							}

							var result_code = list.attributes.getNamedItem( "result_code" ).value;
							var time = list.attributes.getNamedItem( "time" ).value;
													
							if ( result_code == 0 )
							{								
								get_flashcard_pool();

								alert( "Your pool has been cleared!" );

								save_spinner.src = imgTrue;								
							}
							else
							{
								save_spinner.src = imgFalse;								
							}
						}
						else
						{
							save_spinner.src = imfFalse;
							
							if ( xmlHttp.status == 0 ) 
							{
								// This just means we aborted the connection
							}
							else
							{
								alert( "I encountered error " + 
									xmlHttp.status + " (" + xmlHttp.statusText + ") " + 
									"while trying to communicate with the AJAX gateway." );							
							}
						}

						break;
			}
			
		}
		
		xmlHttp.send( null );	
		ajax_request_timeout_timer = window.setTimeout( "ajax_request_timeout()", ajax_request_timeout_in_ms );

	}
	catch( e )
	{
		alert( "I could not open the AJAX gateway.\n\n" + gateway );
		
		return false;
	}
	
	return true;
}

function print_flashcard_deck( side )
{
	var flashcard_print_select_element_id = "flashcard_print_select_element";
	var print_spinner_id = "print_spinner";
	
	var print_spinner = document.getElementById( print_spinner_id )

	if ( print_spinner == null )
	{
		alert( "'print_spinner' element not found." );
		return false;
	}	
	
	print_spinner.src = imgRefresh;
	
	var flashcard_print_select_element = document.getElementById( flashcard_print_select_element_id )

	if ( flashcard_print_select_element == null )
	{
		alert( "'flashcard_print_select_element' element not found." );

		print_spinner.src = imgFalse;

		return false;
	}
	
	if( flashcard_print_select_element.selectedIndex == -1 )
	{
		alert( "You must select one list to print." );					

		print_spinner.src = imgFalse;

		return false;
	}	

	var deck = urlencode( flashcard_print_select_element.options[flashcard_print_select_element.selectedIndex].value );

	if( side == 1 || side == 2 )
	{
		var url = "/flashcards.php?s=" + side + "&d=" + deck;
	}
	else
	{
		var url = "/vocabulary_list.php?d=" + deck;
	}
	
	var popup_window = window.open( url, "print" );
	
	if ( popup_window == undefined )
	{
		alert( "I can't open the print window.\n\n" +
			"Do you have your popup blocker on?\n\n" +
			"Try unblocking this site." );

		print_spinner.src = imgFalse;

		return false;
	}
	
	print_spinner.src = imgTrue;
}

function practice_flashcard_deck()
{
	var flashcard_practice_panel_id = "flashcard_practice_panel";

	get_scrollbar_sizes();

	var window_width = GetWidth();
	var window_height = GetHeight();

	var panel_element = document.getElementById( flashcard_practice_panel_id )

	if ( panel_element == null )
	{
		alert( "'" + flashcard_practice_panel_id + "' element not found." );

		return false;
	}

	panel_element.style.width = window_width + "px";
	panel_element.style.height = window_height + "px";
	panel_element.style.display = "block";

	flashcard_opacity_wrapper = document.getElementById( flashcard_opacity_wrapper_id )

	if ( flashcard_opacity_wrapper == null )
	{
		alert( "'flashcard_opacity_wrapper' element not found." );
		
		practice_panel_spinner.src = imgFalse;
		
		return false;
	}

	document.onkeydown = flashcard_panel_event;

	get_flashcard( "init" );
}

/**
	*
	*/
function practice_flashcard_deck_close()
{
	var flashcard_practice_panel_id = "flashcard_practice_panel";
	
	var panel_element = document.getElementById( flashcard_practice_panel_id )

	if ( panel_element == null )
	{
		alert( "'" + flashcard_practice_panel_id + "' element not found." );

		return false;
	}

	panel_element.style.display = "none";

	document.onkeydown = null;
}

/**
	*
	*/
function get_flashcard( command )
{	
	var practice_panel_spinner_id = "practice_panel_spinner";
	var flashcard_practice_select_element_id = "flashcard_practice_select_element";
	
	var f;
	
	var practice_panel_spinner = document.getElementById( practice_panel_spinner_id )

	if ( practice_panel_spinner == null )
	{
		alert( "'practice_panel_spinner' element not found." );
		return false;
	}	

	practice_panel_spinner.src = imgRefresh;

	var select_element = document.getElementById( flashcard_practice_select_element_id )

	if ( select_element == null )
	{
		practice_flashcard_deck_close();

		alert( "'" + flashcard_practice_select_element_id + "' element not found." );

		practice_panel_spinner.src = imgFalse;

		return false;
	}
	
	if( select_element.selectedIndex == -1 )
	{
		practice_flashcard_deck_close();

		alert( "Please select a deck to practice." );

		practice_panel_spinner.src = imgFalse;

		return false;		
	}

	var deck = select_element.options[select_element.selectedIndex].value;

	switch( command )
	{
		case "init":

			f = "1";
		
			break;
		
		case "previous":

			f = "2";

			break;
		
		case "next":

			f = "3";

			break;
			
		case "shuffle":

			f = "4";
			
			break;
		
		case "flip":
		
			f = "5";
		
		default:
	}

	var gateway = baseaddr + "/ajax/lookup_flashcard.php?f=" + f +
		"&d=" + deck;	
	
	try
	{
		xmlHttp.open( "GET", gateway, true );
		xmlHttp.onreadystatechange = function()
		{
			switch( xmlHttp.readyState )
			{
					/*
					
					0 = open has not yet been called
					1 = send has not yet been called but open has been called
					2 = send has been called but no response from server
					3 = data is in the process of being received from the server
					4 = response from server has arrived				
					
					*/
				
					case 4:

						window.clearTimeout( ajax_request_timeout_timer );

						if ( xmlHttp.status == 200 )
						{
							var txt = xmlHttp.responseText;
													
							flashcard_opacity_wrapper.innerHTML = txt;

							clearTimeout( opacity_timer );
							flashcard_opacity_wrapper_opacity_increment = Math.abs(
								flashcard_opacity_wrapper_opacity_increment );		
							opacity_timer = setTimeout( "opacity_timer_function()", 
								flashcard_opacity_wrapper_timer_delay );

							practice_panel_spinner.src = imgTrue;

						}
						else
						{
							practice_panel_spinner.src = imgFalse;

							if ( xmlHttp.status == 0 ) 
							{
								// This just means we aborted the connection
							}
							else
							{
								alert( "I encountered error " + 
									xmlHttp.status + " (" + xmlHttp.statusText + ") " + 
									"while trying to communicate with the AJAX gateway." );							
							}
						}

						break;
			}
			
		}
		
		xmlHttp.send( null );	
		ajax_request_timeout_timer = window.setTimeout( "ajax_request_timeout()", ajax_request_timeout_in_ms );

	}
	catch( e )
	{
		alert( "I could not open the AJAX gateway.\n\n" + gateway );
		
		return false;
	}
	
	return true;
}

/**
	*
	*
	*/
function flashcard_panel_event( evt )
{
	// for Internet Explorer compatibility
	if ( !evt )
	{
		evt = window.event;
	}

	var	keychar = String.fromCharCode( evt.keyCode );

	switch( evt.type )
	{
			case "keydown":
				
				if ( evt.keyCode == "27" ) // escape
				{
					practice_flashcard_deck_close();
				}

				else if ( evt.keyCode == "37" ) // left arrow
				{
					get_flashcard( "previous" );
				}
			
				else if ( evt.keyCode == "39" ) // right arrow
				{
					get_flashcard( "next" );
				}
				
				else
				{
					//alert( evt.keyCode );
				}
				
				if ( keychar == "S" )
				{
					clearTimeout( opacity_timer );
					flashcard_opacity_wrapper_opacity_increment = Math.abs(
						flashcard_opacity_wrapper_opacity_increment ) * -1;		
					opacity_timer = setTimeout( "opacity_timer_function()", 
						flashcard_opacity_wrapper_timer_delay );

					get_flashcard( "shuffle" );
				}
				else if ( keychar == "R" )
				{
					clearTimeout( opacity_timer );					
					flashcard_opacity_wrapper_opacity_increment = Math.abs(
						flashcard_opacity_wrapper_opacity_increment ) * -1;		
					opacity_timer = setTimeout( "opacity_timer_function()", 
						flashcard_opacity_wrapper_timer_delay );
					
					get_flashcard( "init" );
				}
				else if ( keychar == "H" )
				{
					opacity_timer = setTimeout( "opacity_timer_function()", 
						flashcard_opacity_wrapper_timer_delay );
				}
				else if ( keychar == "F" )
				{
					clearTimeout( opacity_timer );					
					flashcard_opacity_wrapper_opacity_increment = Math.abs(
						flashcard_opacity_wrapper_opacity_increment ) * -1;		
					opacity_timer = setTimeout( "opacity_timer_function()", 
						flashcard_opacity_wrapper_timer_delay );
					
					get_flashcard( "flip" );					
				}
				
				break;

			case "keyup":			
				break;
				
			case "keypress":							
				break;
			
			case "mousedown":
				break;
				
			case "mouseup":
				break;
				
			default:
				alert( evt.type );
	}
}

function opacity_timer_function()
{	
	clearTimeout( opacity_timer );

	flashcard_opacity_wrapper_opacity_value += 
		flashcard_opacity_wrapper_opacity_increment;

	if ( flashcard_opacity_wrapper_opacity_value < 0 )
	{
		flashcard_opacity_wrapper_opacity_increment *= -1;;

		flashcard_opacity_wrapper_opacity_value = 0;		
	}
	else if ( flashcard_opacity_wrapper_opacity_value > 1 )
	{
		flashcard_opacity_wrapper_opacity_increment *= -1;

		flashcard_opacity_wrapper_opacity_value = 1;
	}
	else
	{			
		opacity_timer = setTimeout( "opacity_timer_function()", 
			flashcard_opacity_wrapper_timer_delay );		
	}

	flashcard_opacity_wrapper.style.MozOpacity = flashcard_opacity_wrapper_opacity_value;
	flashcard_opacity_wrapper.style.opacity = flashcard_opacity_wrapper_opacity_value;
	flashcard_opacity_wrapper.style.filter = 
		'alpha(opacity=' + flashcard_opacity_wrapper_opacity_value * 100 + ')';
}

function disable_form_elements_in_element( form_id, save_spinner ) 
{
	var form_element = document.getElementById( form_id )

	if ( form_element == null )
	{
		alert( "'" + form_id + "' element not found." );

		save_spinner.src = imgFalse;
		
		return false;
	}

	elements = form_element.getElementsByTagName( "input" );

	for( si = 0; si < elements.length; si++ ) 
	{
		elements[si].disabled = true;
	}

	elements = form_element.getElementsByTagName( "select" );

	for( si = 0; si < elements.length; si++ ) 
	{
		elements[si].disabled = true;
	}

	elements = form_element.getElementsByTagName( "textarea" );

	for( si = 0; si < elements.length; si++ ) 
	{
		elements[si].disabled = true;
	}

}

function show_hide_instructions( browser )
{
	var ie_instructions_container_id = "ie_instructions_container";
	var firefox_instructions_container_id = "firefox_instructions_container";
	var chrome_instructions_container_id = "chrome_instructions_container";
	var safari_instructions_container_id = "safari_instructions_container";
	var opera_instructions_container_id = "opera_instructions_container";
	
	var ie_element = document.getElementById( ie_instructions_container_id );	
	if ( ie_element == undefined )
	{
		alert( ie_instructions_container_id + " element not found" );
		return false;		
	}

	var firefox_element = document.getElementById( firefox_instructions_container_id );	
	if ( firefox_element == undefined )
	{
		alert( firefox_instructions_container_id + " element not found" );
		return false;		
	}

	var chrome_element = document.getElementById( chrome_instructions_container_id );	
	if ( chrome_element == undefined )
	{
		alert( chrome_instructions_container_id + " element not found" );
		return false;		
	}

	var safari_element = document.getElementById( safari_instructions_container_id );	
	if ( safari_element == undefined )
	{
		alert( safari_instructions_container_id + " element not found" );
		return false;		
	}

	var opera_element = document.getElementById( opera_instructions_container_id );	
	if ( opera_element == undefined )
	{
		alert( opera_instructions_container_id + " element not found" );
		return false;		
	}

	ie_element.style.display = "none";
	firefox_element.style.display = "none";
	chrome_element.style.display = "none";
	safari_element.style.display = "none";
	opera_element.style.display = "none";

	switch( browser )
	{
		case 1:
			ie_element.style.display = "block";
			break;

		case 2:
			firefox_element.style.display = "block";
			break;

		case 3:
			chrome_element.style.display = "block";
			break;

		case 4:
			safari_element.style.display = "block";
			break;

		case 5:
			opera_element.style.display = "block";
			break;

		default: 
	
	}
}

function input_form_gateway( type, combo_base_name )
{
	text_element = document.getElementById( combo_base_name + "_text" )
	
	if ( text_element == null )
	{
		alert( combo_base_name + "_text element not found." );
	}	
	
	select_element = document.getElementById( combo_base_name + "_select" )
	
	if ( select_element == null )
	{
		alert( combo_base_name + "_select element not found." );
	}	
	
	// encode text for URL GET (% format)
	p1 = urlencode( text_element.value );

	// essentially trim spaces from beginning and end
	p1 = p1.replace( /^\s+|\s+$/g, '' ); 	
	
	switch( type )
	{
		case "flashcard_deck_name":
			func = 101;
			break;		

		case "flashcard_deck_tags":
			func = 102;
			break;		

		default:
			func = 0;
	}
	
	// example: http://latinlexicon.org/ajax/flashcards.php?f=101&p1=caesar 
	var gateway = baseaddr + "/ajax/flashcards.php?f=" + func + "&p1=" + p1;			
		
	return gateway;
}
