	var translator = false;
	var isIE = false;
	if( window.ActiveXObject )
		isIE = true;

	// Create an HTTP request
	function createRequestObject()
	{
		var httpReq = false;
		if( window.XMLHttpRequest ) // Mozilla, Safari, ...
		{
			httpReq = new XMLHttpRequest();
			if( httpReq.overrideMimeTyype )
			{
				httpReq.overrideMimeType( 'text/xml' );
			}
		}
		else if( window.ActiveXObject ) // IE
		{
			try { httpReq = new ActiveXObject("Msxml2.XMLHTTP"); }
			catch( e )
			{
				try { httpReq = new ActiveXObject("Microsoft.XMLHTTP"); } catch(e) {}
			}
		}
		if( !httpReq )
		{
			alert( 'Giving up - cannot create an XMLHTTP instance' );
			return false;
		}
		return httpReq;
	}
	// Generate a random number in the range 0..highest
	// Note: this function was copied from "JavaScript & DHTML Cookbook",
	// and it does not seem to ever generate a zero!
	function getRandom( highest )
	{
		return Math.floor( Math.random() * highest+1 );
	}
	
	// Send a translation request
	function translate( phrase )
	{
		try
		{
			translator = createRequestObject();
			translator.onreadystatechange = handleResponse;
			translator.open( "GET", 'XmasTrans.xml', true );
			if( isIE )
				translator.send();
			else
				translator.send( null );
		}
		catch( e ) { alert( e.message ) }
	}
	// Update page with response
	function handleResponse()
	{
		if( translator.readyState == 4 )
		{
			if( translator.status == 200 )
			{
				var language = "?";
				var translation = "N/A";

				// We got either XML or Text in the response
				var respXML  = translator.responseXML;
				if( respXML )
				{
					var elements = respXML.getElementsByTagName("translation");
					var numElements = elements.length;
					if( numElements > 0 )
					{
						var randex = getRandom( numElements-1 );
						var tran = elements[randex];
						language = tran.attributes[0].value;
						translation = tran.firstChild.nodeValue;
					}
				}
				//else- got some text, don't know what

				document.getElementById("language").innerHTML = language;
				document.getElementById("translation").innerHTML = translation;
			}
		}
	}

	var speller = false;
	var keyword = "siorc"; // Debugging

	// Lookup the English word from its Scottish Gaelic spelling
	function transGaelic( word )
	{
		try
		{
			keyword = word;
			speller = createRequestObject();
			speller.onreadystatechange = handleResp2;
			speller.open( "GET", 'GaelicWords.xml', true );
			if( isIE )
				speller.send();
			else
				speller.send( null );
		}
		catch( e ) { alert( e.message ) }
	}
	// Update item with response
	function handleResp2()
	{
		if( speller.readyState == 4 )
		{
			if( speller.status == 200 )
			{
				var english = "N/A";
				var respXML = speller.responseXML;
				if( respXML )
				{
					var words = respXML.getElementsByTagName( "word" );
					var numWords = words.length;
					if( numWords > 0 )
					{
						// Find the corresponding Gaelic word
						english = lookup( keyword, 
										  respXML.getElementsByTagName( "gaelic" ), 
										  respXML.getElementsByTagName( "english" ) );
					}
				}
				//else - got some text, don't know what

				// Debugging
				//alert( "The word is " + english + ", numWords = " + numWords );
				document.getElementById( keyword ).innerHTML = english;
			}
		}
	}
	// Lookup an English word corresponding to a Gaelic key
	// Assumes parallel arrays
	function lookup( key, keys, values )
	{
		if( keys.length == 0 || values.length == 0 )
			return "NULL";
		if( keys.length != values.length )
			return "ERROR";

		// Find the desired English word
		for( var i=0; i < keys.length; i++ )
		{
			if( keys[i].firstChild.nodeValue == key )
				return values[i].firstChild.nodeValue;
		}
		return key;
	}
