// ---------------------------------------------------------------
// Parameters
// ---------------------------------------------------------------

var dn_headers_id_prefix = "dnewsbox_h-";
var dn_layers_id_prefix = "dnewsbox_l-";
var dn_layer_fade_time = 1000;
var dn_cycle_period = 5000;
var dn_layers = new Array("dnewsbox_l-in_the_news", "dnewsbox_l-press_releases", "dnewsbox_l-events", "dnewsbox_l-reviews", "dnewsbox_l-white_papers");
var dn_fade_enabled = false;	// Operate in fade mode (IE does not like this)

// Link Rotator parameters
var lr_holder_class = "link_rotator";
var lr_active_object_class = "link_rotator_on";
var lr_inactive_object_class = "link_rotator_off";
var lr_rotate_period = 3900;	// This is approximately the same time as the awards animated gif

// ---------------------------------------------------------------
// Parameters End
// ---------------------------------------------------------------



// ---------------------------------------------------------------
// Global Vars, Do not change anything below this line!
// ---------------------------------------------------------------

var dn_active_layer = "";
var dn_loading_layer = "";
var dn_anim_closing_lock = false;
var dn_anim_loading_lock = false;
var dn_layer_request_queue_l = "";
var dn_layer_request_queue_h = "";
var dn_cycle_timer = null;
var dn_cycling = true;
var dn_cycle_delay_time = 0;		// How much time to delay before the next cycle event
var dn_cycle_timeout = 0;			// When the next cycle will timeout

// Link Rotator vars
var lr_rotating_objects = new Array();
var lr_rotate_timer = null;

// ---------------------------------------------------------------
// Global Vars End, Do not change anything above this line!
// ---------------------------------------------------------------



// ---------------------------------------------------------------
// JS Events
// ---------------------------------------------------------------

jQuery(document).ready(function()
{
	// Initialise
	init_newsbox();

	$(".dnewsbox_headers a").click(function(event) {
		load_newsbox_layer(this.id.replace(dn_headers_id_prefix, dn_layers_id_prefix), this.id);
		return false;
	});
	
	$(".dnewsbox").bind("mouseenter", function(e){
		// Pause the cycling of layers
		dn_cycling = false;
		if(dn_cycle_timer !== null)
		{
			// Determine how much time is left on the timer
			// NB: If there is already an existing dn_cycle_delay_time, do not update it.
			//     This happens if the user mouses out of and back into a layer very quickly.
			if(dn_cycle_delay_time == 0) {
				var d = new Date();
				dn_cycle_delay_time = Math.max(dn_cycle_timeout - d.getTime(), 0);
			}
			
			// Clear the timer
			clearTimeout(dn_cycle_timer);
			dn_cycle_timer = null;
		}
		if(document.getElementById("debugstr") !== null)
		{
			var currentTime = new Date();
			var hh = currentTime.getHours();
			var mm = currentTime.getMinutes();
			var ss = currentTime.getSeconds();
			var ms = currentTime.getMilliseconds();
			var oldtxt = document.getElementById("debugstr").innerHTML;
			document.getElementById("debugstr").innerHTML = hh+":"+mm+":"+ss+"."+ms+" - enter\n<br />"+oldtxt;
		}
	});
	
	$(".dnewsbox").bind("mouseleave", function(e){
		// Continue the cycling of layers
		dn_cycling = true;
		
		// Attempt to work out what the next layer will be (default is to start at the beginning of the dn_layers array again)
		var current_layer = (dn_loading_layer !== "") ? dn_loading_layer : dn_active_layer;
		var next_layer = 0;
		for (key in dn_layers) {
			if(dn_layers[key] == current_layer)
			{
				// Found the current key, work out what layer will be next
				next_layer = parseInt(key, 10)+1;
				if(next_layer >= dn_layers.length) {
					next_layer = 0;
				}
				break;
			}
		}
		
		cycle_layers(next_layer);
		if(document.getElementById("debugstr") !== null)
		{
			var currentTime = new Date();
			var hh = currentTime.getHours();
			var mm = currentTime.getMinutes();
			var ss = currentTime.getSeconds();
			var ms = currentTime.getMilliseconds();
			var oldtxt = document.getElementById("debugstr").innerHTML;
			document.getElementById("debugstr").innerHTML = hh+":"+mm+":"+ss+"."+ms+" - exit\n<br />"+oldtxt;
		}
	});
});

// ---------------------------------------------------------------
// JS Events End
// ---------------------------------------------------------------



// ---------------------------------------------------------------
// Functions
// ---------------------------------------------------------------

/**
 * Initialise the newsbox
 */
function init_newsbox() {
	// Begin looping through the layers
	dn_active_layer = dn_layers[0];
	cycle_layers(0);
	
	// Activate link rotator(s)
	var link_rotators = $("."+lr_holder_class);
	if(link_rotators.length > 0) {
		lr_counter = 0;
		for(lr=0; lr<link_rotators.length; lr++) {
			// Fetch all objects in this link rotator
			lr_rotating_objects[lr_counter] = $(link_rotators[lr]).children("."+lr_active_object_class+", ."+lr_inactive_object_class);
			
			lr_counter++;
		}
		
		// Trigger the rotator!
		lr_rotate_timer = setTimeout(function(){ cycle_link_rotators(); }, lr_rotate_period);
	}
}

/**
 *
 */
function cycle_link_rotators()
{
	// Process all link rotators
	for(lr=0; lr<lr_rotating_objects.length; lr++)
	{
		// Which object will we make active?
		var make_active = 0;
		
		// Check all objects in this rotator
		for(i=0; i<lr_rotating_objects[lr].length; i++)
		{
			// Find which object is currently active
			if($(lr_rotating_objects[lr][i]).hasClass(lr_active_object_class)) {
				make_active = i+1;
			}
		}
		
		// Check the make_active is within limits
		if(make_active < 0 || make_active >= lr_rotating_objects[lr].length) {
			make_active = 0;
		}
		
		// Make all objects inactive
		$(lr_rotating_objects[lr]).removeClass(lr_active_object_class).addClass(lr_inactive_object_class);
		
		// Make the selected object active
		$(lr_rotating_objects[lr][make_active]).removeClass(lr_inactive_object_class).addClass(lr_active_object_class);
	}
	
	lr_rotate_timer = setTimeout(function(){ cycle_link_rotators(); }, lr_rotate_period);
}

/**
 * Repeatedly cycles through the news layers
 */
function cycle_layers(layer_num)
{
	// Is cycling enabled?
	if(dn_cycling)
	{
		if(dn_cycle_delay_time > 0 && dn_cycle_delay_time <= dn_cycle_period)
		{
			// Delaying the current cycle (the user just moused out of a layer)
			dn_cycle_timer = setTimeout(function(){ cycle_layers(layer_num); }, dn_cycle_delay_time);
			dn_cycle_delay_time = 0;
		}
		else
		{
			// Load a layer
			load_newsbox_layer(dn_layers[layer_num], dn_layers[layer_num].replace(dn_layers_id_prefix, dn_headers_id_prefix));
			
			// Work out what layer will be next
			var new_layer_num = layer_num+1;
			if(new_layer_num >= dn_layers.length) {
				new_layer_num = 0;
			}
			
			// Set cycle timeout time
			var d = new Date();
			dn_cycle_timeout = d.getTime() + dn_cycle_period;
			
			// Trigger the timeout
			dn_cycle_timer = setTimeout(function(){ cycle_layers(new_layer_num); }, dn_cycle_period);
		}
	}
}


/**
 * Load the selected layer
 */
function load_newsbox_layer(new_layer_id, new_header_id)
{
	// Sanity check: do not allow users to load the layer if its already loaded or is currently loading
	var already_loaded = (dn_loading_layer == "" && new_layer_id == dn_active_layer);
	var currently_loading = (new_layer_id == dn_loading_layer);
	
	if(!already_loaded && !currently_loading)
	{
		// Check if an animation is currently in progress
		if(!dn_anim_closing_lock && !dn_anim_loading_lock)
		{
			// 1. Get required layer/header nodes
			var new_layer_node = document.getElementById(new_layer_id);
			var new_header_node = document.getElementById(new_header_id);
			var active_layer_node = null;
			var active_header_node = null;
			if(dn_active_layer !== "") {
				active_layer_node = document.getElementById(dn_active_layer);
				active_header_node = document.getElementById(dn_active_layer.replace(dn_layers_id_prefix, dn_headers_id_prefix));
			}
			
			// alert("NLI: "+new_layer_id+"\nALI: "+dn_active_layer+"\nLLI: "+dn_loading_layer);
			
			// Validate nodes
			if(new_layer_node !== null && new_header_node !== null)
			{
				// 2. Fade out the active layer?
				if(active_layer_node !== null && active_header_node !== null)
				{
					// Make this heading inactive
					$(active_header_node.parentNode).removeClass("active");
					
					if(!dn_fade_enabled)
					{
						$(active_layer_node).css("display", "none");
						$(active_layer_node).css("z-index", "-1");
					}
					else
					{
						dn_anim_closing_lock = true;
						$(active_layer_node).animate({opacity:0}, dn_layer_fade_time, function() {
							// Fade complete
							$(active_layer_node).css("z-index", "-1");
							dn_anim_closing_lock = false;
							
							// Is there a queued request? and has the fade-in anim completed?
							if(dn_layer_request_queue_l !== "" && dn_layer_request_queue_h !== "" && !dn_anim_loading_lock) {
								load_newsbox_layer(dn_layer_request_queue_l, dn_layer_request_queue_h);
								dn_layer_request_queue_l = "";
								dn_layer_request_queue_h = "";
							}
						});
					}
				}
				
				// Make this heading active
				$(new_header_node.parentNode).addClass("active");
				
				// 3. Fade in the new layer
				if(!dn_fade_enabled)
				{
					$(new_layer_node).css("z-index", "1");
					$(new_layer_node).css("display", "block");
					dn_active_layer = new_layer_id;
				}
				else
				{
					dn_anim_loading_lock = true;
					dn_loading_layer = new_layer_id;
					$(new_layer_node).css("opacity", "0");
					$(new_layer_node).css("z-index", "1");
					$(new_layer_node).animate({opacity:1}, dn_layer_fade_time, function() {
						// Fade complete
						dn_loading_layer = "";
						dn_active_layer = new_layer_id;
						dn_anim_loading_lock = false;
						
						// Remove filter attribute when done to prevent font from appearing 'fuzzy'.
						new_layer_node.style.removeAttribute("filter");
						
						// Is there a queued request? and has the fade-out anim completed?
						if(dn_layer_request_queue_l !== "" && dn_layer_request_queue_h !== "" && !dn_anim_closing_lock) {
							load_newsbox_layer(dn_layer_request_queue_l, dn_layer_request_queue_h);
							dn_layer_request_queue_l = "";
							dn_layer_request_queue_h = "";
						}
					});
				}
			}
		}
		else {
			// Queue the layer load request
			dn_layer_request_queue_l = new_layer_id;
			dn_layer_request_queue_h = new_header_id;
		}
	}
}
// ---------------------------------------------------------------
// Functions End
// ---------------------------------------------------------------