/*
 *	Random Facts Generator AJAX functionality.
 *
 *	Author: Allan Oliveira - Digital Media Unit.
 *	Date:		14th Jan, 2008.
 */

/* Variable to prevent extra clicks being processed while a request is currently underway */
var linkClicked = false;

/* Random facts generator stuff */
var RandomFactsGenerator = 
{
	init: function()
	{
		/* variable to prevent more AJAX calls while one is currently occuring */
		linkClicked = false;

		/* Add the link with JavaScript to maintain accessibility */
		var linkArea = document.getElementById("linkArea");
		if (linkArea)
		{
			var newRfgLink = document.createElement("a");
			newRfgLink.setAttribute("href", "#");
			newRfgLink.setAttribute("id", "rfgAnchor");
			newRfgLink.appendChild(document.createTextNode("...more"));
			linkArea.appendChild(newRfgLink);
		}
		
		/* Start the event listener for a click on the link */
		var rfg = document.getElementById("randomFact");
		var rfgAnchor = document.getElementById("rfgAnchor");
		Core.addEventListener(rfgAnchor, "click", RandomFactsGenerator.clickListener);
		
		// Set the text color to white and then begin fading in.
		setColor(255, rfg);
		fadein(255, 102, 4, rfg, 1000/25);
	},

	clickListener: function(event)
	{
		if (!linkClicked)
		{
			linkClicked = true;
			// Add a loader image while waiting for the server
			var rfgContainer = document.getElementById("rfgContainer");
			if (rfgContainer)
			{
				rfgContainer.className = "ajaxLoader";
			}
	
			var randomFact = document.getElementById("randomFact");
			fadeout(102, 255, 8, randomFact, 1000/25, this, event);
		}
		// Prevent the default full page reload
		Core.preventDefault(event);
	},
	
	ajaxCall: function(clickedLink, event)
	{
		try
		{
			var requester = new XMLHttpRequest();
		}
		catch (error)
		{
			try
			{
				var requester = new ActiveXObject("Microsoft.XMLHTTP");
			}
			catch (error)
			{
				var requester = null;
			}
		}
		
		if (requester != null)
		{
			var rfgLink = this;
			rfgLink._timer = setTimeout( function()
				{
					requester.abort();
					// Time out occurred but no real need for error message
				}, 10000);
			
			// Grab the old fact id to prevent repeating it
			var lastId = document.getElementById("lastRfgID");
			if (!lastId)
			{
				lastId = 0;
			}
			// Add random number to fix IE6 cache issue
			requester.open("GET", "/local/includes/rfg/rfg.cfm?call=" + Math.random() + "&id=" + lastId.value, true);
			requester.onreadystatechange = function()
				{
					if (requester.readyState == 4)
					{
						// clear the timer we set before
						clearTimeout(rfgLink._timer);
						
						if (requester.status == 200 || requester.status == 304)
						{
							RandomFactsGenerator.writeUpdate(requester.responseXML);
						}
						else
						{
							/* Server error, perform clean up */
							linkClicked = false;
							
							// Remove the loader image
							var rfgContainer = document.getElementById("rfgContainer");
							if (rfgContainer)
							{
								rfgContainer.className = "";
							}
						}
					}
				};
			
			requester.send(null);
		}
	},
	
	writeUpdate: function(responseXML)
	{
		var randomFact = document.getElementById("randomFact");
		/*var factCategory = document.getElementById("category");*/
		var categoryImage = document.getElementById("categoryImage");

		if (randomFact && /*factCategory &&*/ categoryImage)
		{
			/* Parse the XML */
			// Grab the fact text
			try
			{
				var nameNode = responseXML.getElementsByTagName("text")[0];
				var nameTextNode = nameNode.firstChild;
				var name = nameTextNode.textContent;
				// Grab the fact category
				var categoryNode = responseXML.getElementsByTagName("category")[0];
				var categoryTextNode = categoryNode.firstChild;
				var category = categoryTextNode.data;
				// Grab the fact id
				var idNode = responseXML.getElementsByTagName("id")[0];
				var idTextNode = idNode.firstChild;
				var id = idTextNode.data;

				// Change the text and category to the new fact
				randomFact.innerHTML = name;
				/*factCategory.innerHTML = "(category: " + category + ")";*/
	
				// Change the image
				categoryImage.setAttribute("src", "/local/images/rfgImages/" + category + ".gif");
			}
			catch (error)
			{
				linkClicked = false;
			}
			
			fadein(255, 102, 8, randomFact, 1000/25);

			// Save it in the hidden field
			var lastId = document.getElementById("lastRfgID");
			if (lastId)
			{
				lastId.value = id;
			}
		}
	}
};

/* Call on core.js library */
Core.start(RandomFactsGenerator);


/*************************************************************
 * Modifications performed to "fade script ver0.1" by 
 * Kouichirou Eto 1996/02/20
 *
 * Copyright (c) 1996 Kouichirou Eto. All Rights Reserved.
 * You can freely copy, use, modify this script,
 * if the credit is given in the source.
 * If you would like to get information for this script,
 * please access <http://eto.com/JavaScript/>
 */

function makearray(n) {
    this.length = n;
    for(var i = 1; i <= n; i++)
        this[i] = 0;
    return this;
}

hexa = new makearray(16);

for(var i = 0; i < 10; i++)
    hexa[i] = i;
hexa[10]="a"; hexa[11]="b"; hexa[12]="c";
hexa[13]="d"; hexa[14]="e"; hexa[15]="f";

function hex(i) {
    if (i < 0)
	return "00";
    else if (i > 255)
	return "ff";
    else
	return "" + hexa[Math.floor(i/16)] + hexa[i%16];
}

function setColor(c, elem)
{
  var h = hex(c);
  elem.style.color = "#"+h+h+h;
}

/* Usage:
 *   	fadein( s, e, step, elem, timer);
 * or fadeout( s, e, step, elem, timer, clickedLink, event);
 *
 * s = starting "colour", 255 = white, 0 = black.
 * e = ending "colour"
 * step = amount colour is reduced by in each step
 * elem = element to change colour on
 * timer = animation rate (usually 1000/25)
 * clickedLink = link to pass to AJAX call
 * event = event to pass to AJAX call
 */

function fadein(s, e, step, elem, timer) 
{
	s = s - step;
	
	if (s < e)
	{
		setColor(e, elem);
		// Remove the loader image
		var rfgContainer = document.getElementById("rfgContainer");
		if (rfgContainer)
		{
			rfgContainer.className = "";
			linkClicked = false;
		}
	}
	else
	{
		setColor(s, elem);

		var theTimer = setTimeout( function()
										{	fadein(s, e, step, elem, timer); }, 
										timer);
	}
}

function fadeout(s, e, step, elem, timer, clickedLink, event)
{
	s = s + step;
	
	if ((step < 0 && s < e) || (step > 0 && s > e))
	{
		setColor(e, elem);
		RandomFactsGenerator.ajaxCall(clickedLink, event);
	}
	else
	{
		setColor(s, elem);

		var theTimer = setTimeout( function()
										{	fadeout(s, e, step, elem, timer, clickedLink, event); }, 
										timer);
	}
}

/***** end fade script *****/
/************************************************************/

/* Function to alternate rows on tables (separate from RFG) */
function applyClasses()
{
	var elem = document.getElementsByTagName("table");	
	
	if (elem)
	{
		for(tableIndex=0; tableIndex<elem.length; tableIndex++){ 
		var rows = elem[tableIndex].rows;
		for (var i=0;i<rows.length;++i)
		{
			if (i % 2) rows[i].className = 'odd';
			else rows[i].className = 'even';
		}
	}}
}

/*
* toggleDiv() void
*
* Toggles the display of the passed div id.
*
* [@param] id - Id of the field to validate - as string
* [@param] show - flag to toggle on or off - as boolean
* [@return] as void
*/
function toggleDiv(id)
{
	var elem = document.getElementById(id);
	
	if (elem)
	{
		if (elem.style.display == "")
		{
			elem.style.display = "none";
		}
		else
		{
			elem.style.display= "";
			/*elem.style.display=(show?"":"none");*/
		}
		return false;
	}
}
