
HJ.YearlyCalendar = Class.create();

HJ.YearlyCalendar.prototype = Object.extend(new HJ.Calendar(), {

	initialize: function(calendarTitle, calendarArea, calendarHeader, allDayEvents) {
	    this.calendarTitle = calendarTitle;
		this.calendarArea = calendarArea;
	    this.calendarHeader = calendarHeader;
	    this.allDayEvents = allDayEvents;
	    this.table = document.createElement("table");
	    this.table.onclick = this.tableClicked.bindAsEventListener(this);
	},
	
	cleanup: function() {
	   this.table.onclick = null;
	   this.table.style.display = "none";
	   this.calendarArea.appendChild(this.table);
	},
	
	render: function(schedules, date) {
        app.showBusy();
	   this.schedules = schedules;
	   this.date = date;
       // XXX: fixme: We don't load event data here because we don't 
       // actually do anything with events.  In the future, there probably
       // needs to be a way to query which dates actually have events, 
       // but maybe not get all the event data
	   var tempDate = new Date(date.getTime());
	   tempDate.setMonth(0);
	   tempDate.setDate(1);
	   this.calendarTitle.innerHTML = tempDate.getFullYear();
	   
	   this.startTime = new Date(tempDate.getTime());
	   var dt = new Date();
	   dt.setFullYear(tempDate.getFullYear());
	   dt.setMonth(11);
	   dt.setDate(31);
	   this.endTime = dt;
	   
	   removeAll(this.calendarArea);
	   removeAll(this.calendarHeader);
	   
	   
	   this.calendarArea.className = 'fullYear';
	   this.allDayEvents.style.display = "none";
	   
	   
	   var tbl = this.table;
	   removeAll(tbl);
	   tbl.cellSpacing = "1";
	   tbl.cellPadding = "0";
	   this.calendarArea.appendChild(tbl);
	   var tbody = document.createElement('tbody');
	   tbl.appendChild(tbody);
	   var tr = null;
	   for (var i=0; i<12; i++) {
	      tempDate.setMonth(i);
	      var n = i % 3;
	      if (n == 0) {
	         var tr = document.createElement("tr");
	         tbody.appendChild(tr);
	      }
	      tr.appendChild(this.renderAMonth(tempDate));
	   }
        app.endBusy();
	},
	
	renderAMonth: function(date) {
	   var dt = new Date(date.getTime());
	   var day = date.getDay();
	   dt.setDate(dt.getDate() - day);
	   var m = date.getMonth();
	   var y = date.getFullYear();
	   var td = document.createElement("td");
	   td.className = 'yearMonth';
	   var h5 = document.createElement("h5");
	   h5.innerHTML = this.months[date.getMonth()];
	   td.appendChild(h5);
	   var table = document.createElement("table");
	   var tr;
	   var innerTd;
	   var tbody = document.createElement('tbody');
	   table.appendChild(tbody);
	   // display the first letter for Sunday through Saturday
	   tr = document.createElement("tr");
	   for (var j=0; j<7; j++) {
		   innerTd = document.createElement("td");
		   tr.appendChild(innerTd);
		   Element.extend(innerTd);
		   switch (j) {
		   	case 0:
		   		innerTd.innerHTML = "S";	   	
		   		break;
		   	case 1:
		   		innerTd.innerHTML = "M";	   	
		   		break;
		   	case 2:
		   		innerTd.innerHTML = "T";	   	
		   		break;
		   	case 3:
		   		innerTd.innerHTML = "W";	   	
		   		break;
		   	case 4:
		   		innerTd.innerHTML = "T";	   	
		   		break;
		   	case 5:
		   		innerTd.innerHTML = "F";	   	
		   		break;
		   	case 6:
		   		innerTd.innerHTML = "S";	   	
		   		break;
		   }
	   }	   
	   tbody.appendChild(tr);
	   
	   while((dt.getMonth() <= m && dt.getFullYear() == y) || (dt.getMonth() > m && dt.getFullYear() < y)) {
	   	  tr = document.createElement("tr");
	      for (var j=0; j<7; j++) {
	          temp = dt.getTime();
	          innerTd = document.createElement("td");
			  if (dt.getMonth() == m) {
				var a = document.createElement("a");
				a.href="#"
			    a.innerHTML = "" + dt.getDate();
			    a.id = "" + temp;
			    innerTd.appendChild(a);
			  } else {
			    var span = document.createElement("span");
			    span.innerHTML = "";
			    innerTd.appendChild(span);
			  }
			  
			  tr.appendChild(innerTd);
			  tbody.appendChild(tr);
			  dt.setDate(dt.getDate() + 1);
	      }
	   }
	   td.appendChild(table);
	   var e = document.createElement("div");
	   e.className = 'mozFix';
	   td.appendChild(e);
	   return td;
	},
	
	next: function() {
	   var y = this.date.getFullYear();
	   y++;
	   this.date.setFullYear(y);
	   this.render(this.schedules, this.date);
	},
	
	previous: function() {
	   var y = this.date.getFullYear();
	   y--;
	   this.date.setFullYear(y);
	   this.render(this.schedules, this.date);
	},
	
	scheduleListChanged: function(schedules) {
	   this.schedules = schedules;
	}
	
});

