/* Requires JQuery */

var COURSE_CACHE = {}; /* Caches all things loaded through dwr. */
var USE_COURSE_CACHE = true; /* Set this to false to disable caching. */

var generatedIds = {};
function generateId()
{
	var generatedId;
	
	do {
		generatedId = "generated-id_" + Math.floor(Math.random() * 1000000);
	} while(generatedIds[generatedId] == true);
		
	generatedIds[generatedId] = true;
	
	return generatedId;
}

var inited = false;
function init()
{
	if(inited)
	{
		return true;
	}
	
	if(!COURSE_AJAX_CONTENT_AREAS)
	{
		alert("AJAX_CONTENT_AREA undefined.");
	}

	if(!COURSEINFORMATION_NAVIPATH && !alerted)
	{
		alert("Course information navi path not declared. Unable to link course names to descriptions.");
	}
	
	inited = true;
	
	return true;
}

/*
 * DWR CallBack things..
 *

var dataFromBrowser = ...;

// define an erasure function to store a reference to
// dataFromBrowser and to call dataFromServer
var callbackProxy = function(dataFromServer) {
  callbackFunc(dataFromServer, dataFromBrowser);
};

var callMetaData = { callback:callbackProxy };

Remote.method(params, callMetaData);

 */

handleCourseNames = function(lst, curArea) // contains course real names
{
	//debug(lst);

	var ul = jQuery('#' + curArea.courseNameListId);
	var html = '';	
	var cacheUpdated = false;

	if(lst && lst != undefined && lst != null && lst != '')
	{
		for(var i = 0; i < lst.length; i++)
		{
			if(!lst[i])
			{
				continue;
			}
			
			if(USE_COURSE_CACHE)
			{
				if(!cacheUpdated)
				{
					if(!COURSE_CACHE[lst[i].areaId])
					{
						COURSE_CACHE[lst[i].areaId] = {};
					}
	
					if(!COURSE_CACHE[lst[i].areaId]['courseNameContent'])
					{
						COURSE_CACHE[lst[i].areaId]['courseNameContent'] = lst;
					}
					
					cacheUpdated = true;
				}
			}
			
			html += '<li><a href="'+COURSEINFORMATION_NAVIPATH+'?act=showCourseDesc&cnId='+lst[i].id+'&areaId='+lst[i].areaId+'">'+lst[i].name+'</a></li>';
		}
	}
	
	ul.html(html);
};

handleAreaDesc = function(area, curArea) 
{
	//debug(area);

	if(USE_COURSE_CACHE)
	{
		if(!COURSE_CACHE[area.id])
		{
			COURSE_CACHE[area.id] = {};
		}
		
		if(!COURSE_CACHE[area.id]['areaContent'])
		{
			COURSE_CACHE[area.id]['areaContent'] = area;
		}
	}

	var elem = jQuery('#' + curArea.areaDescId);
	elem.html(area.desc);
};

function loadCourseinformationForArea(areaId, 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 < COURSE_AJAX_CONTENT_AREAS.length; i++)
	{
		var area = COURSE_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);

	jQuery(selElem).addClass(curArea.selectedTabClass);
		
	var callbackProxy1 = function(dataFromServer) {
			handleAreaDesc(dataFromServer, curArea);
		};
	var callMetaData1 = { callback:callbackProxy1 };
	
	
	var callbackProxy2 = function(dataFromServer) {
		handleCourseNames(dataFromServer, curArea);
	};
	var callMetaData2 = { callback:callbackProxy2 };
	
	if(USE_COURSE_CACHE)
	{
		if(!COURSE_CACHE[areaId])
		{
			RemoteCourseinformationService.loadArea(areaId, callMetaData1);
			RemoteCourseinformationService.loadCourseNamesForArea(areaId, callMetaData2);
		}
		else
		{
			handleAreaDesc(COURSE_CACHE[areaId]['areaContent'], curArea);
			handleCourseNames(COURSE_CACHE[areaId]['courseNameContent'], curArea);
		}
	}
	else
	{
		RemoteCourseinformationService.loadArea(areaId, callMetaData1);
		RemoteCourseinformationService.loadCourseNamesForArea(areaId, callMetaData2);
	}
}

handleCourseCal = function(response)
{
	var tableContainer = jQuery('#courseCalendarTableContainer');
	
	try
	{
		var ccmoye = document.getElementById("ccmoye");
		document.removeChild(ccmoye);
	}
	catch(e)
	{
		// IGNORE
	}
	
	tableContainer.html();
	tableContainer.html(response);
	
	setTimeout("tooltip()", 200);
};

function getParts(str)
{
	var replacer = new RegExp("[^0-9]*([0-9]+)[^0-9]*([0-9]+)[^0-9]*");
	var splitter = new RegExp('[^0-9]+');	

	return str.replace(replacer, '$1/$2').split(splitter);
}

function loadCal(month, year)
{	
	RemoteCourseinformationService.renderCourseCalendar(month + '/' + year,handleCourseCal);
}

function loadNextCal(elem)
{
	var html = jQuery('#ccmoye').html();
	var parts = getParts(html);
	var month = parts[0];
	var year = parts[1];

	month++;
	
	if(month > 12)
	{
		month = 1;
		year++;
	}
	
	loadCal(month, year);
}

function loadPrevCal(elem)
{
	var html = jQuery('#ccmoye').html();
	var parts = getParts(html);
	var month = parts[0];
	var year = parts[1];

	month--;
	
	if(month < 1)
	{
		month = 12;
		year--;
	}
	
	loadCal(month, year);
}

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_COURSE_CACHE) {
        try {
            delete COURSE_CACHE;
        } catch(e) {
        	// IGNORE
        }
    }
});