/**
 * @author Victor Andres Perez
 */
function Calendar(){
	this.canvas;
	this.header;
	this.calendar;
	this.dNow = new Date();
	this.dCurrentDate = new Date();
	this.monthNames = ["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"];
	this.dayNames = ["z","m","d","w","d","v","z"];
	this.oCalendarDate;
	this.oPopup;
}

Calendar.prototype.load = function(){
	var iMonth = this.dNow.getMonth() + 1;
	var oThis = this;
	$.post("/json_agenda.html", "month="+ iMonth,
  	function(p_oData){
		for (var x = 0; x < p_oData.length; x++) {
			p_oData[x].valid_from = new Date(p_oData[x].valid_from * 1000);
			p_oData[x].valid_to = new Date(p_oData[x].valid_to * 1000);
			//alert(p_oData[x].valid_to.toString());
		}
		
		oThis.oCalendarDate = p_oData;
		oThis.create();
  	}, "json");
}

Calendar.prototype.create = function(){
	var oThis = this;
	if(this.calendar){
		this.canvas.removeChild($('.daysHolder').get(0));
	}
	
	var oTable = document.createElement("table")
	this.calendar = document.createElement("tbody");
	oTable.appendChild(this.calendar);
	oTable.className = "daysHolder";
	this.canvas.appendChild(oTable);
	this.header();
	this.days();
}

Calendar.prototype.header = function(){
	var oThis = this; 
	//header
	var oMonthYearRow = document.createElement("tr");
	oMonthYearRow.className = "calendarMonthYear row";
	this.calendar.appendChild(oMonthYearRow);
	
	
	var oCells;
	var oCellText;
	//back
	oCells = document.createElement('td');
	oCells.className = "calendarMonthYear back";
	oCellText = document.createTextNode('<');
	oCells.appendChild(oCellText);
	oMonthYearRow.appendChild(oCells);
	oCells.onclick = function(){
		var iOldMonth = oThis.dNow.getMonth() - 1;
		oThis.dNow.setMonth(iOldMonth);
		oThis.load();
	}

	//month year
	oCells = document.createElement('td');
	oCells.className = "calendarMonthYear monthyear";
	oCells.colSpan = 5;
	oCellText = document.createTextNode(this.monthNames[this.dNow.getMonth()].substr(0,3) + ' ' + this.dNow.getFullYear());
	oCells.appendChild(oCellText);
	oMonthYearRow.appendChild(oCells);	
	
	//next
	oCells = document.createElement('td');
	oCells.className = "calendarMonthYear next";
	oCellText = document.createTextNode('>');
	oCells.appendChild(oCellText);
	oMonthYearRow.appendChild(oCells);
	oCells.onclick = function(){
		var iOldMonth = oThis.dNow.getMonth() + 1;
		oThis.dNow.setMonth(iOldMonth);
		oThis.load();
	}	
	
	//day names
	var oDaysRow = document.createElement("tr");
	oDaysRow.className = "calendarDayNames row";
	this.calendar.appendChild(oDaysRow);
	
	var oTempTd;
	var oTempText;
	for(var i = 0; i < 7; i++){
		oTempTd = document.createElement('td');
		if(i % 2 == 0){
			oTempTd.className = 'calendarDayNames cell one';
		}else{
			oTempTd.className = 'calendarDayNames cell two';
		}
		oTempText = document.createTextNode(this.dayNames[i]);
		oTempTd.appendChild(oTempText)
		oDaysRow.appendChild(oTempTd);
	}
	
	
}

/**
 * this will create the days 
 */
Calendar.prototype.days = function(){
	//Current Object
	var oCalendar = this;
	
	//Set Years
	var iThisYear = this.dNow.getFullYear();
	var iNextYear = iThisYear + 1;
	var iBackYear = iThisYear - 1;
	
	//Set Months
	var iThisMonth = this.dNow.getMonth();
	var iNextMonth = iThisMonth + 1;
	var iBackMonth = iThisMonth - 1;
	
	//Set days
	//Total days of the month
	var dNewDate = new Date();
	dNewDate.setFullYear(this.dNow.getFullYear());
	dNewDate.setMonth(iThisMonth + 1, 0);
	var iTotalDays = dNewDate.getDate();
	//Fist day of the month
	dNewDate.setMonth(iThisMonth, 1);
	var iFirstDay = dNewDate.getDay();
	//Last day of the month
	dNewDate.setMonth(iThisMonth, iTotalDays);
	var iLastDay = dNewDate.getDay();
		
	//Start days loop, set countdays
	var sCountDays = 0;
	var oWeekDiv;
	for (iDay = 0 - iFirstDay; iDay < iTotalDays; iDay++) {
		
		//Week
		if (sCountDays % 7 == 0) {
			oWeekDiv = document.createElement('tr');
			oWeekDiv.className = 'calendarWeek row';
			this.calendar.appendChild(oWeekDiv);
		}
				
		//Day Element
		var oDaySpan = document.createElement('td');
		
		//event days
		var sEventDay = '';;
		for(var x = 0; x < this.oCalendarDate.length; x++){
			if(iDay + 1 >= this.oCalendarDate[x].valid_from.getDate() && iDay + 1 <= this.oCalendarDate[x].valid_to.getDate()){
				sEventDay = ' event';
				oDaySpan.onclick = function(p_oEvent){
					var oTarget = p_oEvent || event;
					oCalendar.openInfoBox(oTarget);
				}
			}
		}
		
		
		if (iDay >= 0) {
			if (iDay + 1 == this.dCurrentDate.getDate() && iThisMonth == this.dCurrentDate.getMonth() && iThisYear == this.dCurrentDate.getFullYear()){ 
				if (iDay % 2 == 0) {
					oDaySpan.className = 'calendarCell one ToDay' + sEventDay;
				}
				else {
					oDaySpan.className = 'calendarCell two ToDay' + sEventDay;
				}
			}else{
				if (iDay % 2 == 0) {
					oDaySpan.className =  'calendarCell one' + sEventDay;
				}
				else {
					oDaySpan.className =  'calendarCell two' + sEventDay;
				}				
			}			
			
		
			$(oDaySpan).hover(function(){
				$(this).addClass('hover'); 
			}, 
			function(){
				$(this).removeClass('hover');
			});
			
			//Add title
			var oDayNode = document.createTextNode(iDay + 1);
			oDaySpan.appendChild(oDayNode);
						
		}else{
			if (iDay % 2 == 0) {
				oDaySpan.className = 'calendarCell one Empty';
			}
			else {
				oDaySpan.className = 'calendarCell two Empty';
			}				
			oDaySpan.innerHTML = '&nbsp;';
		}
		
		//To week
		oWeekDiv.appendChild(oDaySpan);
		//Up days
		sCountDays++;
	}
	
	//Fill last fields
	for(iDays = (6 - iLastDay); iDays > 0; iDays--){
		//Day
		//Day Element
		var oDaySpan = document.createElement('td');
		if (iDays % 2 == 0) {
			oDaySpan.className = 'calendarCell one Empty';
		}
		else {
			oDaySpan.className = 'calendarCell two Empty';
		}				
		oDaySpan.innerHTML = '&nbsp;';
		oWeekDiv.appendChild(oDaySpan);
	}
}


Calendar.prototype.openInfoBox = function(p_oTarget){
	var oThis = this;
	var oTarget = p_oTarget.srcElement || p_oTarget.target;
	
	//open popup
	if (this.oPopup) {
		$('body').get(0).removeChild(this.oPopup);
		this.oPopup = null;
	}
	this.oPopup = document.createElement('div');
	var oOffsets = $(oTarget).offset();
	this.oPopup.className = 'calendarEvents popup';
	$('body').get(0).appendChild(this.oPopup);
	this.oPopup.style.position = 'absolute';
	
	
	//header
	var oPopupRows = document.createElement('div');
	oPopupRows.className = 'calendarEvents popup top';
	this.oPopup.appendChild(oPopupRows)
	
	//close
	var oSpan = document.createElement('a');
	oSpan.className = 'calendarEvents popup closebutton';
	oSpan.appendChild(document.createTextNode('X'));
	oSpan.onclick = function(){
		$('body').get(0).removeChild(oThis.oPopup);
		oThis.oPopup = null;
	}
	oPopupRows.appendChild(oSpan);
	
	//middle
	var oPopupMiddle = document.createElement('div');
	oPopupMiddle.className = 'calendarEvents popup middle';
	this.oPopup.appendChild(oPopupMiddle);
	
	//bottom
	oPopupRows = document.createElement('div');
	oPopupRows.className = 'calendarEvents popup bottom';
	this.oPopup.appendChild(oPopupRows)	
		
	
	//events to day
	var iDay = oTarget.innerHTML;
	//list start
	var oUl = document.createElement('ul');
	oUl.className = 'calendarEvents list';
	oPopupMiddle.appendChild(oUl);
	 
	//create items
	var oTempLi;
	var oTempA;
	var oTempAText;
	for(var x = 0; x < this.oCalendarDate.length; x++){
		if(iDay >= this.oCalendarDate[x].valid_from.getDate() && iDay <= this.oCalendarDate[x].valid_to.getDate()){
			oTempLi = document.createElement('li');
			//href
			oTempA = document.createElement('a');
			oTempLi.appendChild(oTempA);
			
			if(this.oCalendarDate[x].valid_from.getTime() >= this.dCurrentDate.getTime() || this.oCalendarDate[x].valid_to.getTime() >= this.dCurrentDate.getTime()){
				oTempA.setAttribute('href', s_agenda_url + '#a' + this.oCalendarDate[x].id);
				oTempA.className = 'arrowlink';
			}else{
				oTempA.className = 'past';
			}
			oTempAText = document.createTextNode(this.oCalendarDate[x].name);
			oTempA.appendChild(oTempAText);
			
			//to list
			oUl.appendChild(oTempLi)
		}
	}
	
	//location popup
	var iTop = (oOffsets.top - $(this.oPopup).innerHeight()) + $(oTarget).innerHeight();
	var iLeft =  oOffsets.left - $(this.oPopup).innerWidth() + $(oTarget).innerWidth();;
	this.oPopup.style.top = iTop + 'px';
	this.oPopup.style.left = iLeft + 'px';	
	
		
}