function get_image_tag(obj)
{
    return '<a href="'+obj[1]+'" border="0"><img src="'+obj[0]+'" onmousemove="'+obj[2]+'" alt="'+obj[3]+'"></a>';
}

function get_images(url, params)
{
	var carousel = this;

	if (!url)
	{
		url = "/scripts/carousels/fav_genres.php";
	}

	if (typeof(carousel)!="undefined") {

		if (typeof(params)!="undefined")
		{
			var new_params = params;
		}
		else
		{
			var new_params = "";
		}

		ajax_call("position="+carousel.get("c_position")+"&"+"timestamp="+carousel.get("c_timestamp")+"&"+new_params, url, 'POST', 'swap_carousel_callback','','', carousel);
	}
}

function swap_carousel(id, params, url, cache_id)
{
	if (!url)
	{
		var url = "/scripts/carousels/fav_genres.php";
	}

	// Destroy the old container
	var d2 = document.getElementById(id+"_carousel").parentNode;
	var d1 = d2.parentNode;
	var d0 = d1.parentNode;
	removeChildrenFromNode(d0);

	// Create a new location to house the new object
	containerDiv = document.createElement("div");
	containerDiv.setAttribute("id", id+"_container");

	carouselDiv = document.createElement("ol");
	carouselDiv.setAttribute("id", id+"_carousel");

	containerDiv.appendChild(carouselDiv);

	marginFixDiv = document.createElement("div");
	marginFixDiv.setAttribute((document.all ? "className" : "class"), "margin_fix");

	d0.appendChild(marginFixDiv);
	d0.appendChild(containerDiv);
	d0.appendChild(marginFixDiv);

	var carousel = new YAHOO.widget.Carousel(id+"_container",
	{
        numItems: 256,
        numVisible: 8,
		animation:
		{
			speed: 2,
			effect: YAHOO.util.Easing.easeBothStrong
		}
	});

	var d = new Date();
	var t = Math.ceil(d.getTime()/1000); // unix timestamp equivalent

	// New carousel, so set position to 0 and timestamp to now.
	carousel.setAttributeConfig("c_position", { value:0 });
    carousel.setAttributeConfig("c_timestamp", { value:t });

    // This initializes a listener for when next or previous buttons are clicked.  Also, DON'T MOVE THIS! It's position matters.
    carousel.on("afterScroll", function(c) { ajax_call("position="+c.first+"&id="+cache_id, "/scripts/carousels/save_position.php", 'POST'); });

	if (typeof(carousel)!="undefined")
	{
		var new_params = new String;

		if (typeof(params)!="undefined")
		{
			new_params = params;
		}
		else
		{
			new_params = "";
		}

		ajax_call("position="+carousel.get("c_position")+"&"+"timestamp="+carousel.get("c_timestamp")+"&"+new_params, url, 'POST', 'swap_carousel_callback', '', '', carousel);
	}

    carousel.on("loadItems", function(o) { get_images.call(this,url,params); });

    // ajax_call("id="+cache_id, '/scripts/carousels/get_position.php', 'POST', 'update_scroll_position', '', '', carousel);

    carousel.render();
    carousel.show();
}

function update_scroll_position(req, carousel)
{
	try
	{
	   	var response = eval('(' + req.responseText + ')');
	   	var scroll = response['scroll'];
	   	if (scroll!=="")
	   	{
	   		carousel.setAttributeConfig("c_scroll_position", { value:scroll });
	   	}
	}
	catch (e)
	{
		js_error_catcher("Invalid JSON Response" + e, "carousel_yui_2.7.js", 108);
	}
}

function swap_carousel_callback(req, carousel)
{
	try
	{
	   	var response = eval('(' + req.responseText + ')');
		process_carousel_data(response, carousel);
	}
	catch (e)
	{
		js_error_catcher("Invalid JSON Response" + e, "carousel_yui_2.7.js", 125);
	}
}

function process_carousel_data(response, carousel)
{
	var visible_items = carousel.get("numVisible");  		// constant from carousel object
	var position = response["position"]; 					// right hand position
	var prior = response["prior"];							// left hand position
	var actual_size = response["images"].length;			// number of items in current carousel based on data set
	var fathoms = Math.floor(actual_size/visible_items);	// number of pages in the carousel
	var leftovers = actual_size%visible_items;				// crumbs from select sizes of 9s or actually coming to the end of the data

	if (leftovers==actual_size && actual_size<visible_items)
	{
		// means we have less items in the carousel then the max...lets stop here
		var size =  actual_size;
	}
	else
	{
		//  means we are continuing to get plenty of data...carry on
		var size =  fathoms * visible_items;
	}

    for (var i = 0; i < size ; i++)
    {
    	// takes the AJAX data and turns it into HTML objects and adds it to the carousel
   		carousel.addItem(get_image_tag(new Array(response["images"][i], response["urls"][i], response["mms"][i], response["alts"][i])));
	}

	// Advance the position of the carousel
	carousel.set("c_position", position);

	// Turns off continuation if leftovers and sizes get out of sync or if 8 or less are in the carousel
	if (leftovers!=(actual_size-size) || actual_size<=visible_items)
	{
		// Window is not full, so left hand + size
		var new_size = prior + size;

		// Set variables to carry within the carousel object.
		carousel.set("numItems", new_size);
		carousel.set("c_position", new_size);
	}

	// USED FOR DEBUGGING
	// alert(carousel.get("numItems"));
	// alert(carousel.get("c_position"));
	// alert(carousel.get("c_scroll_position"));
	// alert(carousel.get("c_timestamp"));

	carousel.render();

	hide_loading_books();

	/*
	var csp = carousel.get("c_scroll_position");
	if (csp)
	{
		pause(1000);
		carousel.scrollTo(csp, true);
	}
	*/

	return carousel.get("c_position");
}

function dump(obj,level)
{
	var dumped_text = "";
	if (!level) level = 0;

	var level_padding = "";
	for (var j=0; j<level+1; j++) level_padding += "\t";

	if (typeof(obj)=='object')
	{
		for (var item in obj)
		{
			var value = obj[item];

			if (typeof(value)=='object')
			{
				dumped_text += level_padding + "'" + item + "' ...\n";
				dumped_text += dump(value, level+1);
			}
			else
			{
				dumped_text += level_padding + "'" + item + "' => \"" + value + "\"\n";
			}
		}
	}
	else
	{
		dumped_text = "===>"+obj+"<===("+typeof(obj)+")";
	}
	return dumped_text;
}

function hide_loading_books()
{
    var elements = YAHOO.util.Dom.getElementsByClassName("yui-carousel-item-loading","li");

	for(var i=0; i<elements.length; i++)
	{
		elements[i].style.display = "none";
	}
}

function removeChildrenFromNode(node)
{
	while (node.childNodes.length >= 1)
	{
		node.removeChild(node.firstChild);
	}
}