var eventsArray = new Array();
var categorie = new Array();
var mesi = new Array('','Gennaio','Febbraio','Marzo','Aprile','Maggio','Giugno','Luglio','Agosto','Settembre','Ottobre','Novembre','Dicembre');
var mesi_en = new Array('','January','February','March','April','May','June','July','August','September','October','November','December');

var dataRef = new Date();
var dateNow = new Date();
var nowyear = (dateNow.getYear() < 1900) ? dateNow.getYear()+1900:dateNow.getYear();
var interval_delay_show = '';
var interval_delay_hide = '';
var ajaxEventsRequest = null;
var wsCalendarURL=null;
var htmlContainer = '';
var giorni = 0;
var defaultCategoriesPresent = false;
var title_obj = {};
var lang_calendar ="it";


//////////////////////////////////////////////////////////////////////////// COSTRUZIONE DEL CALENDARIO

function buildTitle(_title, _image ) {
	var htmlString ="";
	if(_image != null && _image != "") htmlString  += '<img src="'+ _image +'" >';
	htmlString += '<p>' +  _title + '</p><br clear="all"/>';
	var title_div= document.getElementById('titoloCalendario') ;
	if(title_div) title_div.innerHTML = htmlString;
}
function buildCalendar(_wsCalendarURL, _lang){
	if(wsCalendarURL == null) {
		if(_wsCalendarURL != undefined) {
			wsCalendarURL=_wsCalendarURL;
		} else {
			return;
		}
	}
	loadEvents();

	if(_lang != null && _lang != undefined && _lang != "") {
		var _lang_lc = _lang.toLowerCase();
		if(_lang_lc.indexOf("it") != -1) {
			lang = _lang;
			lang_calendar="it";
		} else if(_lang_lc.indexOf("en") != -1) {
			lang = _lang;
			lang_calendar="en";
		}
	}
	
	if(lang_calendar=="en") {
		var mcs =document.getElementById('cal_settimana');
		if(mcs != null) mcs.innerHTML = "<ul><li>Mo</li><li>Tu</li><li>We</li><li>Th</li><li>Fr</li><li>Sa</li><li>Su</li></ul>";
	}
}

function loadEvents() {
	var url=wsCalendarURL;
	ajaxEventsRequest = $.ajax({
	url: url,
	type: "GET",
	cache: false,
	async:true,
		success: function( data ) {
			parseData();
	  }
	});
}

function parseData() {
	
	var req = ajaxEventsRequest;
	if ( req==null ) return;
	eventsArray = [];
	
	if (req.readyState == 4 ) {
		if (req.status == 200 || req.status == 0) {
				
		var result=req.responseXML;
		
		var title_text = getNodeValue(result.getElementsByTagName("titolo"));
		var icona_text =  getNodeValue(result.getElementsByTagName("icona"));
		
		buildTitle(title_text,icona_text);
		
		if(categorie.length ==0) {
		var categories = result.getElementsByTagName("categorie")[0].childNodes;
		for ( var i = 0; i<categories.length; i++ ) {
			var catResult = categories[i];
			if(catResult.nodeName=="categoria") {
				var objcat={};
				objcat.id=catResult.attributes.getNamedItem("id").value;
				objcat.label=catResult.getElementsByTagName("label")[0].firstChild.nodeValue;
				objcat.colore=catResult.getElementsByTagName("colore")[0].firstChild.nodeValue;
				categorie.push(objcat);
			} 
		
		}
		drawCategories();
	}

		var events = result.getElementsByTagName("evento");
		for ( var i = 0; i<events.length; i++ ) {
			var itemResult = events[i];
			var alldate="";
			
			var categoria = getDefaultCategorie(itemResult.getElementsByTagName("categoria"));
			var titolo = getNodeValue(itemResult.getElementsByTagName("titolo"));
			var luogo = getNodeValue(itemResult.getElementsByTagName("luogo"));
			var indirizzo = getNodeValue(itemResult.getElementsByTagName("indirizzo"));	
			var abstract = getNodeValue(itemResult.getElementsByTagName("abstract"));
			var data_inizio = getNodeValue(itemResult.getElementsByTagName("data-inizio")).split(" ")[0];
			var data_fine = getNodeValue(itemResult.getElementsByTagName("data-fine")).split(" ")[0];
			var giorni_attivi_data = itemResult.getElementsByTagName("giorni-attivi")[0].childNodes;
			alldate+=data_inizio+data_fine;
			var giorni_attivi = [];
				
			for(var j=0; j <giorni_attivi_data.length; j++) {
				var itemData = giorni_attivi_data[j];
				if(itemData.nodeName=="data") {
					var giorno_attivo =itemData.firstChild.nodeValue.split(" ")[0]; 
					alldate+=giorno_attivo; 
				 	giorni_attivi.push(giorno_attivo);
				}
			}
			var objEvent = {categoria:categoria, alldate:alldate, titolo:titolo, luogo:luogo, indirizzo:indirizzo, abstract:abstract, data_inizio:data_inizio, data_fine:data_fine, giorni_attivi:giorni_attivi};
			eventsArray.push(objEvent);
		}
	
	drawCalendar();
}
}
}

function getNodeValue(obj) {
	return (obj[0] != undefined)  ? (obj[0].firstChild != null) ? obj[0].firstChild.nodeValue : "":"";
}
function getDefaultCategorie(obj) {
	return (obj[0] != undefined)  ? (obj[0].firstChild != null) ? obj[0].firstChild.nodeValue : "default":"default";
}

function getMeseRef() {
	var mese = dataRef.getMonth()+1;
	var month = lang_calendar=="it" ? mesi[mese] : mesi_en[mese];
	var year = (dataRef.getYear() < 1900) ? dataRef.getYear()+1900:dataRef.getYear();
	var htmlString = month+' '+year;
	document.getElementById('meseRef').innerHTML = htmlString;
}
function drawCategories() {
	var hta = "";	
	for( var j=0; j <categorie.length; j++) {
		var objcat = categorie[j];
		hta +=  '<div class="calendario_legenda_box legenda_'+ objcat.colore.toLowerCase() +'">' + objcat.label + '</div>';
	}
	document.getElementById('calendario_legenda').innerHTML = hta;
}
function drawCalendar(){
	var htmlContainer = '<ul>';
	var mese = dataRef.getMonth()+1;
	var meseCal = (mese < 10) ? '0'+mese:mese;
	var year = (dataRef.getYear() < 1900)? dataRef.getYear()+1900:dataRef.getYear();
	var dataCalendario; 
	var giornoCal; 
	var htmlEventi;
	
	getMeseRef();
	for(i=1;i<33;i++){
		dataRef.setDate(i);
		var nowMonth = dataRef.getMonth()+1;
		if(mese != nowMonth){
			giorni = i;i=33;
			dataRef.setDate(0);
			dataRef.setDate(1);
		}
	}
	var ng = dataRef.getDay();
	
	if (ng == 0){
		for(n=1;n<7;n++){htmlContainer += '<li> </li>';}
	}else{
		for(n=1;n<ng;n++){htmlContainer += '<li> </li>';}
	}
	//check current date
	//***********************************************************************//
	for(n=1;n<giorni;n++){
		dataRef.setDate(n);
		giornoCal = (n < 10)? '0'+n:n;
		dataCalendario = meseCal +'-'+giornoCal+'-'+year;
		var param = "'" + dataCalendario + "'";
		htmlEventi = getCalContainerEventid(dataCalendario);
		htmlContainer += '<li id="day'+ n +'" onMouseOver="onOver('+param+',this);">'+n+htmlEventi+'</li>';
	}
	dataRef.setDate(giorni-1);
	ng = dataRef.getDay();
	if (ng > 0 ){
		for(n=1;n<7-ng+1;n++){htmlContainer += '<li> </li>';}
	}
	htmlContainer += '</ul>';
	document.getElementById("cal_giorno").innerHTML = htmlContainer;
	dataRef.setDate(1);
	
	//higlight current date
	if(dateNow.getMonth()+1 == mese ) {
		if(nowyear == year) {
				var mc = document.getElementById("day"+dateNow.getDate() );
				if(mc) document.getElementById("day"+dateNow.getDate() ).style.border= '1px solid #5B8BA2';
		}
	}
	//fillNextEvents()
}		
function changeMonth(m){
	document.getElementById('popup').style.display = 'none';
	dataRef.setMonth(m);
	buildCalendar();
	return false;
}

function onOver(param,obj){
	 window.clearInterval(interval_delay_show);
	 window.clearInterval(interval_delay_hide);
	 interval_delay_show = window.setTimeout( function() {buildPopUp(param , obj); param=null; obj=null;}, 100);
}

function getColorByCategorie(cat) {
	for(var j=0; j <categorie.length; j++) {
		if(categorie[j].id == cat) {
			return categorie[j].colore.toLowerCase(); ;
		}
	}
	return "nero";	
}
function buildPopUp(param,obj){
	window.clearInterval(interval_delay_hide);
	interval_delay_hide = window.setTimeout("document.getElementById('popup').style.display='none';", 4000);
	var position = findPos(obj);
	var coEvents = findEvents(param);
	var dt = param.split("-");
	var datestring= dt[1] +"-" +dt[0] + "-" + dt[2];
	var pop_element=document.getElementById('popup');
	pop_element.innerHTML = '';
	
	var testoPopUp = '<div id="cal_pop_header"></div><div id="cal_pop"><h1>'+datestring+'</h1><table>';
	
	if(coEvents.length>0){
		for(c=0;c<coEvents.length;c++){
			var events = coEvents[c];
			var ahref = events.indirizzo;
			var text ="";
			var img = '<td class="cal_col_1"><img src="/shared/i/calendar/bullet_'+getColorByCategorie(events.categoria)+'.gif" /></td>';
			text = '<td class="cal_col_2">';
			
			
			if (ahref == 'null'){
				text = text + events.luogo;
			} else {
				var target = (ahref.indexOf('http') != -1)? '_blank':'';
				text = text + '<a href="'+ahref+'" target="'+target+'">'+events.titolo+'</a>';
			}
			text = text+'</td>';
			testoPopUp += '<tr>'+ img + text +'</tr>';
			
			if(coEvents.length>1 && c < coEvents.length-1) {
				testoPopUp += '<tr><td colspan="2"><hr /></td></tr>';
			}
		}
		testoPopUp +=	'</table></div><div id="cal_pop_footer"></div>';
		
		pop_element.innerHTML = testoPopUp;
		pop_element.style.display = '';
		pop_element.style.zIndex = '100000';
		
		//work around ie6 > calculate offeset
		/*************************************************************/
		
		var calElement= document.getElementById(obj);
		var position =findPos(obj);
		var top_pos =0;
		var left_pos= 0;
		
		left_pos = (position[0]-150);
		top_pos = (position[1]+22);
		
		if (Browser.Version() < 7) {
  			top_pos -= (obj.offsetParent.offsetParent.offsetTop);
			left_pos = (position[0]-148);
			top_pos = (position[1]+14);
		}
		pop_element.style.left = left_pos + 'px';
		pop_element.style.top = top_pos + 'px';
	}
}

function getEventsOnDate(dataCalendario,categoriesOnDate,eventsOnDate) {
	for (i=0;i<eventsArray.length;i++){	
	var eventObj = eventsArray[i];
	var categoriaEvento =eventObj.categoria; 
	if(eventObj.alldate.indexOf(dataCalendario) != -1) {
		for (j=0;j<categorie.length;j++){	
				if( categoriaEvento=="default") defaultCategoriesPresent = true;
				if (categorie[j].id==categoriaEvento){
					categoriesOnDate[j]='Y';
					eventsOnDate[j]+= 1;
				}
			}
	}
	}
}			

function getCalContainerEventid(dataCalendario) {
	defaultCategoriesPresent = false;
	var categoriesOnDate = [];
	var eventsOnDate = [];
	var imagesOnDate = [];
	
	
	for(var j=0; j < categorie.length;j++) {
		categoriesOnDate.push('N');
		eventsOnDate.push(0);
		imagesOnDate.push(0);
	}
	getEventsOnDate(dataCalendario,categoriesOnDate,eventsOnDate);
	var giorno = dataCalendario.substr(3,2);
	var CalContainerEventid = '<div class="cal_container_eventi">';
	//determino il numero di categorie presenti
	var numeroCategorie = 0;
	for (j=0;j<categoriesOnDate.length;j++){
		
		if(categoriesOnDate[j]=='Y'){numeroCategorie += 1;}
	}
	
	switch(numeroCategorie) { 
  
  case 1: 
  	//metto 6 sull'unica categoria
    for (j=0;j<imagesOnDate.length;j++){
				if(categoriesOnDate[j]=='Y'){
					imagesOnDate[j] = 6;
				}
	}
  break; //si ferma qui 

  case 2: 
  	//metto 6 sull'unica categoria
    for (j=0;j<imagesOnDate.length;j++){
				if(categoriesOnDate[j]=='Y'){
					imagesOnDate[j] = 3;
				}
	}
  break; //si ferma qui 	

  case 3: 
  	//metto 6 sull'unica categoria
    for (j=0;j<imagesOnDate.length;j++){
				if(categoriesOnDate[j]=='Y'){
					imagesOnDate[j] = 2;
				}
	}
break;
  case 4: 
  	var counter =0;
  	//metto 6 sull'unica categoria
    for (j=0;j<imagesOnDate.length;j++){
				if(categoriesOnDate[j]=='Y'){
					counter++;
					imagesOnDate[j] = (counter==3 || counter==2 ) ? 2 : 1;	
				}
 }
 break;	
 case 5: 
  	//metto 6 sull'unica categoria
	var counter =0;
    for (j=0;j<imagesOnDate.length;j++){
				if(categoriesOnDate[j]=='Y'){
					counter++;
					imagesOnDate[j] = (counter==5) ? 2: 1;	
					
				}
 	}
	break;	
 case 6: 
  	//metto 6 sull'unica categoria
    for (j=0;j<imagesOnDate.length;j++){
				if(categoriesOnDate[j]=='Y'){
					imagesOnDate[j] = 1;
				}
	}
 break; //si ferma qui 	
 default: 
 break;
}

if(defaultCategoriesPresent==true) {
			for (i=0; i<6;i++){
						CalContainerEventid += '<img width="3" height="3" src="/shared/i/calendar/dot_nero.gif" />';
			}
} else {

	if(categoriesOnDate.length > 0) {
		
			for (j=0;j<categoriesOnDate.length;j++){	
				if(categoriesOnDate[j]=='Y'){
					for (i=0; i<imagesOnDate[j];i++){
						CalContainerEventid += '<img width="3" height="3" src="/shared/i/calendar/dot_'+   checkDotColor(categorie[j].colore)  +'.gif" />';
					}
				}
			}
		
		
		
		
	}
}
	CalContainerEventid += '</div>';
	return CalContainerEventid ;
}

function checkDotColor(val) {
	return (val != "") ? val : "nero";
	
}

/************************************/
/*UTILITY */
/************************************/

function getPosition(element) {
		var left = 0;
		var top = 0;
		if(element.offsetParent) {
			while(element) {
				left += element.offsetLeft;
				top += element.offsetTop;
				element = element.offsetParent;
			}
		}
		return {offsetLeft: left, offsetTop: top};
	}


function findPos(obj) {
	var mw = mh = 0;
	mw = obj.offsetWidth;
	mh = obj.offsetHeight;
	var debug ='';
	//var curleft = curtop = 0;
	if (obj.offsetParent) {
		curleft = obj.offsetLeft;
		curtop = obj.offsetTop;
		while (obj = obj.offsetParent) {
			curleft += obj.offsetLeft;
			curtop += obj.offsetTop;
			debug += obj.offsetTop +"  >>";
		}
	}
	return [curleft,curtop,mw,mh];
}

function findEvents(param){
	var coEvents = new Array();
	for(i=0;i<eventsArray.length;i++){
		var objEvent=eventsArray[i];
		if(objEvent.alldate.indexOf(param) != -1) {
			coEvents.push(objEvent);
		}
	}
	return coEvents;
}

var Browser = {
  Version: function() {
    var version = 999; // we assume a sane browser
    if (navigator.appVersion.indexOf("MSIE") != -1)
      // bah, IE again, lets downgrade version number
      version = parseFloat(navigator.appVersion.split("MSIE")[1]);
    return version;
  }
}

