/* Requires JQuery */

/*
 * Define these before this javascript file:
 * 
 * var AJAX_CONTENT_AREAS = [];
 *   	
 * var firstArea = {};
 * 	   firstArea.wrapperId = 'ajax-content-wrapper';
 *     firstArea.selectedTabClass = 'selected';
 *     firstArea.tabsId = 'ajax-content-tabs';
 *     firstArea.contentId = 'ajax-content';
 *  		
 * AJAX_CONTENT_AREAS.push(firstArea);
 * 
 * var secondArea = {}
 * ...
 * ...
 * 
 * AJAX_CONTENT_AREAS.push(secondArea);
 */

var AJAX_CONTENT_CACHE = {}; /* Caches all things loaded through dwr. */
var USE_AJAX_CONTENT_CACHE = true; /* Set this to false to disable caching. */
var AJAX_CONTENT_DEBUG = false; /* Alert's debug information if this is set. */

var generatedIds = {};
function generateId()
{
	var generatedId;
	
	do {
		generatedId = "generated-id_" + Math.floor(Math.random() * 1000000);
	} while(generatedIds[generatedId] == true);
	
	if(AJAX_CONTENT_DEBUG)
	{
		alert("Generated id: " + generatedId)
	}
	
	generatedIds[generatedId] = true;
	
	return generatedId;
}

var inited = false;
function init()
{
	if(inited)
	{
		return true;
	}
	
	if(!AJAX_CONTENT_AREAS)
	{
		alert("AJAX_CONTENT_AREA undefined.");
	}

	inited = true;
	
	return true;
}

clearAndPopulate = function(acn, curArea) // acn = AjaxContentNode
{
	//debug(acn);
	
	if(USE_AJAX_CONTENT_CACHE)
	{
		if(!AJAX_CONTENT_CACHE[curArea.clickedElementId])
		{
			if(AJAX_CONTENT_DEBUG)
			{
				alert("Caching content for element: " + curArea.clickedElementId);
			}
			
			AJAX_CONTENT_CACHE[curArea.clickedElementId] = acn;
		}
	}
	
	var el = jQuery('#' + curArea.contentId);
	el.html(acn.content);
	
	if(AJAX_CONTENT_DEBUG)
	{
		if(acn.failMessage)
		{		
			alert(acn.failMessage);
		}
	}
}

function loadContent(contentId, selElem)
{
	init();
	
	selElem = jQuery(selElem);
	
	if(!selElem.attr("id") || selElem.attr("id") == '' || selElem.attr("id") == undefined)
	{
		selElem.attr("id", generateId());
	}
	
	var curArea = null;
	for(var i = 0; i < AJAX_CONTENT_AREAS.length; i++)
	{
		var area = AJAX_CONTENT_AREAS[i];
		
		if(jQuery('#' + area.wrapperId).find('#' + selElem.attr("id")).length > 0)
		{
			curArea = area;
			break;
		}
	}
	
	var ul = jQuery('#' + curArea.tabsId);	
	ul.find("li").removeClass(curArea.selectedTabClass);

	var selectedLi = null;
	ul.find("li").each(function(i) {
		if(selectedLi == null && jQuery(this).find('#' + selElem.attr("id")).length > 0)
		{
			selectedLi = jQuery(this);
		}
	});
	
	if(AJAX_CONTENT_DEBUG)
	{
		if(selectedLi == null)
		{
			alert("Could not determine li-element containing the clicked link.");
		}
	}
	
	if(!selectedLi.attr("id") || selectedLi.attr("id") == '' || selectedLi.attr("id") == undefined)
	{
		selectedLi.attr("id", generateId());
	}
	
	curArea.clickedElementId = selectedLi.attr("id");
	
	selectedLi.addClass(curArea.selectedTabClass);
	
	var callbackProxy1 = function(dataFromServer) {
		clearAndPopulate(dataFromServer, curArea);
	};
	var callMetaData1 = { callback:callbackProxy1 };	
	
	if(USE_AJAX_CONTENT_CACHE)
	{
		if(!AJAX_CONTENT_CACHE[curArea.clickedElementId])
		{	
			if(AJAX_CONTENT_DEBUG)
			{
				alert(curArea.clickedElementId + " clicked, not found in cache. Loading..");
			}
			
			AjaxContentService.loadContent(contentId, callMetaData1);
		}
		else
		{
			if(AJAX_CONTENT_DEBUG)
			{
				alert(curArea.clickedElementId + " clicked, content found in cache. Rendering..");
			}
			
			clearAndPopulate(AJAX_CONTENT_CACHE[curArea.clickedElementId], curArea);
		}
	}
	else
	{
		if(AJAX_CONTENT_DEBUG)
		{
			alert(curArea.clickedElementId + " clicked, cache not in use. Loading..");
		}
		
		AjaxContentService.loadContent(contentId, callMetaData1);
	}
}

function debug(elem)
{
	var txt="";for(p in elem){txt+=p+"="+elem[p]+"\n";};alert(txt);
}

/* Prepare stop and deletion for unload */
jQuery(window).bind("beforeunload", function() {
    if(USE_AJAX_CONTENT_CACHE) {
        try {
            delete AJAX_CONTENT_CACHE;
        } catch(e) {
        	// IGNORE
        }
    }
});