/*
   EventBrowser javascriptek:
   
 Mukodese: a napokat es az esemenyeket egy Vectorban fogjuk tarolni, es minden egyes 
 kategoria valtas alkalmaval vegigmegyunk a tombokon es megnezzzuk, mely elemek 
 rendelkeznek az adott kategoriaval, majd ezek class-at valtoztatjuk (jelenitjuk meg)
*/

//esemenyeket fogja tarolni
var events = new Vector(10);

//a select-bol ezen ertek jelenti a mindent
var allCategories = "all_categories";

//ez kezeli az eventekhez tartozo day_id-kat, hogy meg lehessen jelolni oket
var eventDayManagers = new Array();

function getEventDayManager(portletid){
	for(__eventdaymanager in eventDayManagers){
		if (eventDayManagers[__eventdaymanager].key==portletid){
			return eventDayManagers[__eventdaymanager].value;
		}
	}
	
	var newEDM = new EventDayManager(portletid);
	eventDayManagers.push(new KeyValuePair(portletid, newEDM));
	
	return newEDM;
}

/*
    Event class:kozepen egy adott event class-a
*/
function Event(id, categories){
	this.id = id;
	this.categories=categories;
	this.visible=true;
}
Event.prototype.getID = function(){
	return this.id;
}
Event.prototype.getCategories = function(){
	return this.categories;
}
Event.prototype.hasCategories = function(){
	return this.categories.getSize()>0;
}
Event.prototype.hasCategory = function(categoryName){
	return this.categories.contains(categoryName);
}
Event.prototype.isMultipleEvent = function(){
	return this.categories.getSize()>1;
}
Event.prototype.getVisible = function(){
	return this.visible;
}
Event.prototype.setVisible = function(isVisible){
	this.visible = isVisible;
}
Event.prototype.toString = function(){
	return this.id + " " + this.categories;
}

/*
 * EventDayManager class, azt tartalmazza hogy egy napon milyen esemĂ©nyek vannak
 * eventDays = Array<KeyValuePair<string, Array>>
 */
function EventDayManager(portletid){
	this.portletid = portletid;
	this.eventDays = new Array();
}
EventDayManager.prototype.addEvent = function(dayid, eventid){
	var isregged = false;
	for (__eventday in this.eventDays){
		if (this.eventDays[__eventday].key==eventid){
			isregged = true;
			var dayregged = false;
			for (__dayid in this.eventDays[__eventday].value){
				if (this.eventDays[__eventday].value[__dayid]==dayid){
					dayregged = true;
					break;
				}
			}
			if (!dayregged){
				this.eventDays[__eventday].value.push(dayid);
			}
			break;
		}
	}
	if (isregged==false){
		var newDayIds = new Array();
		newDayIds.push(dayid);
		var newKVPair = new KeyValuePair(eventid, newDayIds);
		this.eventDays.push(newKVPair);
	}
}
EventDayManager.prototype.markEventDays = function(eventid){
	//eloszor leszedjuk a kijelolest
	this.unmarkEventDays();
	//aztan kijelolunk ujra
	for (__eventday in this.eventDays){
		if (this.eventDays[__eventday].key==eventid){
			for (__dayid in this.eventDays[__eventday].value){
				var theDayElement = document.getElementById(this.eventDays[__eventday].value[__dayid]);
				theDayElement.className = theDayElement.className + " EventDayHoover";
			}
		}
	}
}
EventDayManager.prototype.unmarkEventDays = function(){
	var _calendarplaceholder = document.getElementById('calendarplaceholder_div_'+this.portletid);
	var the_calendar_td_elements = _calendarplaceholder.getElementsByTagName("td");
	
	for(i=0; i<the_calendar_td_elements.length; i++){
		var calendar_td_class = the_calendar_td_elements[i].className;
		var marked_class_index = calendar_td_class.indexOf(" EventDayHoover")
		if (marked_class_index>-1){
			try{
				calendar_td_class = calendar_td_class.substring(0, marked_class_index) + calendar_td_class.substring(marked_class_index+15, calendar_td_class.length);
				the_calendar_td_elements[i].className = calendar_td_class;
			}
			catch(e){alert(e)}
		}
	}
}
EventDayManager.prototype.clearAllEventElements = function(){
	while (this.eventDays.pop()!=null){}
}

/*
 * seged osztaly
 */
function KeyValuePair(key, value){
	this.key = key;
	this.value = value;
}

/*
  Jobb oldalt a kategoriavaltasakor hivodik meg, es 
  beallitja az adott kategoriakat tartalmazo tablazat cellak CSS style-at.
*/
function changeEventDaysStyle(portletid){
	//select tag
	var selectElement = document.getElementById("categoryselect_"+portletid);
	
	//kivalasztott kategoria
	var selectedCategory=selectElement.value;
	
	var currentDay;
	
	//ha "minden" van kivalasztva
	var isAllCategories = (selectedCategory == allCategories);
	
	//ujra lekerjuk AJAX-al a naptarat, kategoriakra szurve
	var _currentYear = document.getElementById("currentyear_"+portletid);
	var _currentMonth = document.getElementById("currentmonth_"+portletid);
	var _yearSelect = document.getElementById("yearselect_"+portletid);
	var _monthSelect = document.getElementById("monthselect_"+portletid);
	var _currentCategorySelector = document.getElementById("categoryselect_"+portletid);
	var _selectedCategoryID = (_currentCategorySelector==null)?"":_currentCategorySelector.value;
	
	var currentYear;
	var currentMonth;
	
	//legordulo selectre es lapozora egxyxarant mukodnie kell, eloszor legordulo selectet vizsgal
	try{
		currentYear = _yearSelect.value;
	}
	catch(e){
		currentYear = _currentYear.value;
	}
	try{
		currentMonth = _monthSelect.value;
	}
	catch(e){
		currentMonth = _currentMonth.value;
	}
	
	getCalendarForMonth(portletid, currentYear*1, currentMonth*1, _selectedCategoryID);

	//ha a kozepso megjelenito van, akkor az esemenyeket is ki kell listazni
	if(enableListEvents){
		//ha az osszeset kell listazni
		if(isAllCategories){
			listAllEvents(portletid);
		}else{
			listEvents(selectedCategory, portletid);
		}
	}
}// fv vege


/*
  Az esemeny listazo ugy mukodik, hogy van egy lathato es egy nem lathato DIV
  Attol fuggoen, hogy az adott esemenyt ki kell-e jelezni,
  a ket div kozott mozgatjuk az esemenyt tartalmazo div-et az appendChild metodus segitsegevel
  (lsd.: DOM)
  
  Ha az osszes esemenyt ki kell listazni, akkor mindegyiket befuzzuk a lathato div-be
*/
function listAllEvents(portletid){
	//a lathato div, ebbe fogjuk belefuzni az esemenyek div-jeit
	var divNode = document.getElementById("currentEvents_"+portletid);
	var currentEvent;
	var eventNode;
	
	//az osszes esemenyt elkerjuk
	for (var i=0; i<events.getSize();i++){
		currentEvent = events.getElementAt(i);
		eventNode = document.getElementById(currentEvent.getID());
		// alert(eventNode.innerHTML);
		//befuzzuk, hogy lathato legyen
		divNode.appendChild(eventNode);
	}
}

/*
  Adott kategoriaju esemenyek megjelenitese
*/
function listEvents(eventCategory, portletid){
	//ebbe fuzzuk a lathato esemenyeket (adott kategorianak megfeleloeket)
	var visibleDivNode = document.getElementById("currentEvents_"+portletid);
	//a nem megfelelo kategoriajuakat ebbe fogjuk elrejteni
	var hiddenDivNode = document.getElementById("hiddenEvents_"+portletid);
	var currentEvent;
	var eventNode;
	
	//vegigmegyunk az esemenyeken
	for (var i=0; i<events.getSize();i++){
		currentEvent = events.getElementAt(i);
		//ha benne van az aktualisan kivalasztott kategoriaban
		//akkor megjelenitjuk
		if(currentEvent.hasCategory(eventCategory)){
			eventNode = document.getElementById(currentEvent.getID());
			visibleDivNode.appendChild(eventNode);
		}else{
			//egyebkent pedig elrejtjuk
			eventNode = document.getElementById(currentEvent.getID());
			hiddenDivNode.appendChild(eventNode);
		}	
	}    
}

///////////////////////////////////////////////////

function writeYearOptionsForCalendar(portletid){
	Now = new Date();
	NowYear = Now.getFullYear(); //Aktualis ev
	if (NowYear < 2000) NowYear += 1900; //netscape miatt kell
	
	CurrentYear = NowYear;
	CurrentMonth = Now.getMonth();
	
	FromYear = NowYear - 6;
	ToYear = NowYear + 5;
	  
	line = "";
	
	for (i=ToYear; i!=FromYear; i--)
	{
		if (i==CurrentYear){
			line += "<OPTION value='"+i+"' selected = 'selected'>";
		}
		else{
			line += "<OPTION value='"+i+"'>";
		}
		line += i;
	}
	return line;
}

/*
 * az oldal letoltese utan a mai datumhoz betolti a naptarat
 */
function loadCalendar(portletid){
	d = new Date();
	currentyear = d.getFullYear();
	currentmonth = d.getMonth()+1;//0-11-ig vannak a honapok, ezert

	getCalendarForMonth(portletid, currentyear, currentmonth);
	//az osszes eventet listazzuk alapbol
	/*try{
		listAllEvents();
	}
	catch(e){}*/
}

/*
 * elozo honap nyil onclick esemnye
 */
function jumpToPrevMonth(portletid){
	var _currentYear = document.getElementById("currentyear_"+portletid);
	var _currentMonth = document.getElementById("currentmonth_"+portletid);
	var _currentCategorySelector = document.getElementById("categoryselect_"+portletid);
	var _selectedCategoryID = (_currentCategorySelector==null)?"":_currentCategorySelector.value;
	
	var prevYear = _currentYear.value*1;
	var prevMonth = _currentMonth.value*1;
	if (the_selectedMonth==1){
		prevYear = prevYear-1;
		prevMonth = 12;
	}
	else{
		prevMonth = prevMonth-1;
	}
	
	getCalendarForMonth(portletid, prevYear, prevMonth, _selectedCategoryID);
}

/*
 * kovetkezo honap nyil onclick esemenye
 */
function jumpToNextMonth(portletid){
	var _currentYear = document.getElementById("currentyear_"+portletid);
	var _currentMonth = document.getElementById("currentmonth_"+portletid);
	var _currentCategorySelector = document.getElementById("categoryselect_"+portletid);
	var _selectedCategoryID = (_currentCategorySelector==null)?"":_currentCategorySelector.value;
	
	var nextYear = parseInt(_currentYear.value);
	var nextMonth = parseInt(_currentMonth.value);
	if (the_selectedMonth==12){
		nextYear = nextYear+1;
		nextMonth = 1;
	}
	else{
		nextMonth = nextMonth+1;
	}
	
	getCalendarForMonth(portletid, nextYear, nextMonth, _selectedCategoryID);
}

/*
 * ev es honap kivalaszto onchange esemenye
 */
function jumpToCalendarMonth(portletid){
	selectedYear = document.getElementById("yearselect_"+portletid).value;
	selectedMonth = document.getElementById("monthselect_"+portletid).value;
	var _currentCategorySelector = document.getElementById("categoryselect_"+portletid);
	var _selectedCategoryID = (_currentCategorySelector==null)?"":_currentCategorySelector.value;
	
	getCalendarForMonth(portletid, selectedYear, selectedMonth, _selectedCategoryID);
}

/*
 * ajax hivas
 */
function getCalendarForMonth(portletid, year, month, categoryID){
	ajaxURL = location.href;
	idx = ajaxURL.indexOf("?");
	if (idx>0){
		ajaxURL = ajaxURL.substring(0,idx);
	}
	ajaxURL += "?ajaxrequest=EventBrowserAjaxAction&eb_portletid="+portletid+"&month="+year+"_"+month+"&category="+categoryID;
	
	req = tsystems.Services.AjaxService.createRequest(ajaxURL, getCalendarForMonth_callBack, undefined, 'GET', null);
	
	req.makeRequest();
}

/*
 * ajax hivas visszateresekor az eredmenyt feldolgozo metodus
 */
function getCalendarForMonth_callBack(response){
	//firefox 4096 bug miatt el kell kerni a responsetextet is, mert neha truncolja a visszaadott XML-t
	response.responseText;
	var xmldoc = response.responseXML;
	
	var root = xmldoc.getElementsByTagName('eventbrowserdataroot').item(0);
	
	if (root==null){
		window.location.reload();
	}

	var portletid = root.getElementsByTagName("eb_portletid").item(0).firstChild.nodeValue;
	var calendarContent = root.getElementsByTagName("transformedcalendarnode").item(0).firstChild.nodeValue;
	//helyere rakjuk a transzformalt calendar nodeot
	var calendarPlaceHolder = document.getElementById('calendarplaceholder_div_'+portletid);
	calendarPlaceHolder.innerHTML = calendarContent;
	
	the_selectedYear = root.getElementsByTagName("selected_year").item(0).firstChild.nodeValue;
	the_selectedMonth = root.getElementsByTagName("selected_month").item(0).firstChild.nodeValue;
	the_selectedCategory = root.getElementsByTagName("selected_category").item(0).firstChild.nodeValue;
	the_selected_day_id = document.getElementById("selected_day_id_"+portletid);
	
	//megprobaljuk kijelolni a kivalasztott napot (css class-al)
	try{
		var selectedDay = document.getElementById(the_selected_day_id.value);
		selectedDay.className = selectedDay.className + " ThisDayEvent";
	}
	catch(e){}
	
	//nem fontos, ha van legordulo ev select, azt allitja
	try{
		_yearSelector = document.getElementById("yearselect_"+portletid);
		for (i = 0; i<_yearSelector.options.length; i++){
			if (_yearSelector.options[i].value==the_selectedYear){
				_yearSelector.options[i].selected=true;
			}
			else{
				_yearSelector.options[i].selected=false;
			}
		}
	}catch(e){}
	
	//nem fontos, ha van legordulo honap select, azt allitja
	try{
		_monthSelector = document.getElementById("monthselect_"+portletid);
		for (i = 0; i<_monthSelector.options.length; i++){
			if (_monthSelector.options[i].value==the_selectedMonth){
				_monthSelector.options[i].selected=true;
			}
			else{
				_monthSelector.options[i].selected=false;
			}
		}
	}
	catch(e){}
	
	//ha van lapozo akkor az ahhoz kello aktualis ev es honap input erteket allitja
	try{
		_currentYear = document.getElementById("currentyear_"+portletid);
		_currentMonth = document.getElementById("currentmonth_"+portletid);
		
		_currentYear.value=the_selectedYear;
		_currentMonth.value=the_selectedMonth;
	}
	catch(e){}
	
	//ha van aktualis datum kiiras akkor azt allitja (ev + honap betuvel formatum)
	try{
		_currentMonth_div = document.getElementById("currentmonth_div_"+portletid);
		_currentMonth_div.innerHTML = the_selectedYear+". "+root.getElementsByTagName("selected_month_name").item(0).firstChild.nodeValue;
	}
	catch(e){}
	
	//ha van kategoria valaszto akkor azt allitja
	try{
		_categorySelector = document.getElementById("categoryselect_"+portletid);
		for (i = 0; i<_yearSelector.options.length; i++){
			if (_categorySelector.options[i].value==the_selectedCategory){
				_categorySelector.options[i].selected=true;
			}
			else{
				_categorySelector.options[i].selected=false;
			}
		}
	}
	catch(e){}
	
	//eventek eventday-einek osszegyujtese, a kijelolesekhez kell
	try{
		var edManager = getEventDayManager(portletid);
		edManager.clearAllEventElements();
		
		var calendarNode = root.getElementsByTagName("calendarnode").item(0);
		var daysNode = calendarNode.getElementsByTagName("days").item(0);
		var weekNodes = daysNode.getElementsByTagName("week");
		for(i=0; i<weekNodes.length; i++){
			var dayNodes = weekNodes[i].getElementsByTagName("day");
			for (j=0; j<dayNodes.length; j++){
				var dayid = dayNodes[j].getAttribute("day_id");
				var eventsNode = dayNodes[j].getElementsByTagName("events").item(0);
				if (eventsNode!=null){
					var eventNodes = eventsNode.getElementsByTagName("event");
					for (k=0; k<eventNodes.length; k++){
						var eventid = eventNodes[k].getAttribute("contentid");
						edManager.addEvent(dayid, eventid);
					}
				}
			}
		}
	}
	catch(e){}
}
/*
 * megjeloli azokat a napokat amin az adott esemeny van
 */
function markEventDays(portletid, eventid){
	getEventDayManager(portletid).markEventDays(eventid);
}

/*
 * megszuntet minden megjelolest a naptarban
 */
function unmarkEventDays(portletid){
	getEventDayManager(portletid).unmarkEventDays();
}





