
HJ.MonthlyCalendar = Class.create();

HJ.MonthlyCalendar.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.listener = null;
	    this.table = document.createElement("table");
	    this.dndMgr2 = new Af.DndMgr2(this);
	    this.table.ondblclick = this.doubleClicked.bindAsEventListener(this);
	    this.table.onclick = this.tableClicked.bindAsEventListener(this);

	    this.dropZone = null;
	},
	
	
	cleanup: function() {
	   this.table.ondblclick = null;
	   this.table.onclick = null;
	   this.dndMgr2.clearAll();
	   this.table.style.display = "none";
	   this.calendarArea.appendChild(this.table);
	   this.calendarArea.appendChild(this.dndMgr2.draggableElement);
	},
	
	setVisible: function(f) {
	   if (f) {
	      if (this.dropZone == null) {
	         this.dropZone = this.dndMgr2.registerDropZone("monthlyCalendar", this.table, this); 
	      } else {
	         this.dndMgr2.registerDropZone2(this.dropZone);
	      }
	      app.dndMgrScribble.registerDropZone("monthlyCalendar", this.table, this); 
	      app.dndMgrMyLists.registerDropZone("monthlyCalendar", this.table, this);
	      
	   } else {
	      if (this.dropZone != null) {
	         this.dndMgr2.deregisterDropZone(this.dropZone); 
	      } 
	   }
	},
	
	render: function(schedules, date) {
        // Caused undesired interruption of UI on login
        // app.showBusy();
		this.schedules = schedules;
		this.date = date;
       if (!app.schedule.loadEventData(this.date)) {
       	// fetching data from the backend, do not render
       	return false;
       }

		var tempDate = new Date(date.getTime());
		tempDate.setDate(1);
		this.calendarTitle.innerHTML = this.months[tempDate.getMonth()] + " " + tempDate.getFullYear();
	   
		this.startTime = new Date(tempDate.getTime());
	   
		var day = tempDate.getDay();
	   
		this.startTime.setDate(this.startTime.getDate() - day);
	   
		removeAll(this.calendarArea);
		removeAll(this.calendarHeader);
	   
	   
		this.calendarArea.className = 'fullMonth';
		this.calendarHeader.className = 'calendarHeaderFullMonth';
		this.allDayEvents.style.display = "none";
	   
		var tbl = document.createElement("table");
		tbl.cellSpacing = "0";
		tbl.className = "calMonthHeaderDays";
		this.calendarHeader.appendChild(tbl);
		var tbody = document.createElement('tbody');
		tbl.appendChild(tbody);
		var tr = document.createElement("tr");
		tbody.appendChild(tr);
	   
		for (var i=0; i<7; i++) {
			var td = document.createElement("td");
			td.className = "calMonthHeaderDays";
			td.innerHTML = this.days[i];
			tr.appendChild(td);
		}
	   
	   
	   tbl = this.table;
	   removeAll(tbl);
	   tbl.cellSpacing = "2";
	   tbl.cellPadding = "1";
	   this.calendarArea.appendChild(tbl);
	   tbody = document.createElement('tbody');
	   tbl.appendChild(tbody);
	   var m = tempDate.getMonth();
	   var y = tempDate.getFullYear();
	   var dt = new Date(this.startTime.getTime());
	   while((dt.getMonth() <= m && dt.getFullYear() == y) || (dt.getMonth() > m && dt.getFullYear() < y)) {
	      var tr = document.createElement("tr");
	      tbody.appendChild(tr);
	      for (var j=0; j<7; j++) {
	          var temp = dt.getTime();
			  td = document.createElement("td");
			  td.id = "" + temp;
			  var a = document.createElement("a");
			  if (dt.getMonth() != m) {
			     a.className = 'otherMonthDay';
			  } else {
			     a.className = 'monthDay';
			  }
			  a.href="#"
			  a.innerHTML = "" + dt.getDate();
			  a.id = "" + temp;
			  td.appendChild(a);
			  tr.appendChild(td);
			  dt.setDate(dt.getDate() + 1);
	      }
	   }
	   this.endTime = dt;
	   this.renderEvents(tbl);
        // See commented-out showBusy at top of function
        // app.endBusy();
	},
	
	next: function() {
	   var m = this.date.getMonth();
	   var y = this.date.getFullYear();
	   m += 1;
	   if (m > 11) {
	     m = 0;
	     y++;
	   }
	   this.date.setFullYear(y);
	   this.date.setMonth(m);
	   this.render(this.schedules, this.date);
	},
	
	previous: function() {
	   var m = this.date.getMonth();
	   var y = this.date.getFullYear();
	   m -= 1;
	   if (m < 0) {
	     m = 11;
	     y--;
	   }
	   this.date.setFullYear(y);
	   this.date.setMonth(m);
	   this.render(this.schedules, this.date);
	},
	
	renderEvents: function(tbl) {
	  
	   var tempDate = new Date(this.date.getTime());
	   tempDate.setDate(1);
	   var dayOffset = tempDate.getDay();
	   
	   var dt1 = new Date(this.startTime.getTime());
	   while(dt1.getTime() < this.endTime.getTime()) {
	     var dt2 = new Date(dt1.getTime());
	     dt2.setDate(dt2.getDate() + 1);
	     
	     var t1 = dt1.getTime();
	     var t2 = dt2.getTime();
	     
	     var m = new Array();
		
	   
	     for (var i=0; i<this.schedules.length; i++) {
	       var sc = this.schedules[i];
	       var l = sc["event"];
	       
	       if (l != null) {
	       
	          for (var j=0; j<l.length; j++) {
	              var event = l[j];
	              var s = parseInt(event["startDT"]);
	              var e = parseInt(event["endDT"]);
	              var tempDt = new Date(s);
	              tempDt.setHours(0,0,0,0);
	              if (tempDt.getTime() <= t1 && (event["repeatFlag"] + "" == "true")) {
	                 if (event["deletedSeqList"] == null) {
	                    setEventDeleteSeqList(event);
	                 }
	                 if (event["modifiedSeqList"] == null) {
	                    setEventModifySeqList(event);
	                 }
	                 if (!isEventInSeq(event, dt1.getTime())) {
	                    continue;
	                 }
	                 event = this.getRpt(event, dt1, dt1, dt2);
	                 if (event == null) {
	                    continue;
	                 }
	                 s = dt1.getTime();
	              } else if (s < t1 || s >= t2) {
	                 continue;
	              }
	              
	              
                  var temp = new Date(s);
                  var nday = this.getDayNumber(s) - 1;
                  if (nday < 0) {
                     debugA(event.displayName + " : " + temp.toString());
                     continue;
                  }
                  var r = parseInt(nday / 7);
                  var c = nday % 7;
                  
                  var o = new Object();
                  o.schedule = sc;
                  o.scindex = i;
                  o.event = event;
                  o.eventindex = j;
	              o.link = this.getEventLink(sc, i, event, j);
	              o.link.name = s;
	              o.r = r;
	              o.c = c;
	              
	              m.push(o);
	              
                  
                  
                  if (this.dndMgr2 != null && sc["sharing"] != "ALL_TIME" && sc["sharing"] != "FREE_TIME"
                  				&& sc["sharing"] != "public") 
                  {
                     var a = o.link;
					 var key = a.id;

					 this.dndMgr2.registerDraggable("Event", key, a, event.displayName);
				  }
	             
	          }
	       }
	     }
	     
	     m.sort(eventOrder);
	     
	     for (j=0; j<m.length; j++) {
	       var o = m[j];
	       var cell = tbl.rows[o.r].cells[o.c];
           cell.appendChild(o.link);
	     }
		
	     dt1 = dt2;
	   }
	},
	
	 processDragBegin: function(draggable) {
		 this.bFlag = true;
     },
      
      
     processDragged: function(draggable, e) {
		if(!this.bFlag){
			return;			
		}
		var idx = htmlTableRowIndexAt(this.table, e);

		if (idx >= 0) {

		var idx2 = htmlTableCellIndexAt(this.table, this.table.rows[idx], e);
		if (idx2 < 0) {
		return;
		}

		var cell = this.table.rows[idx].cells[idx2];		   
		var stTime = new Date(parseInt(cell.id));				
		this.bFlag = false;
		this.actualDate = stTime.getTime();
		}
		
     },
     
	
	 processDragComplete: function(source, target, e) {
	  
        var idx = htmlTableRowIndexAt(this.table, e);
       
        if (idx >= 0) {
        
           var idx2 = htmlTableCellIndexAt(this.table, this.table.rows[idx], e);
           if (idx2 < 0) {
              return;
           }
           
           var cell = this.table.rows[idx].cells[idx2];
           var stTime = new Date(parseInt(cell.id));
           var endTime = new Date(stTime.getTime());
           stTime.setHours(8);
           endTime.setHours(8, 30);
         } else {
           return;
         }   
         
         if (source.type != "Event") {
           var sch = app.schedule.getSelectedSchedule();
		   if (sch == null) {
		      app.schedule.showSelectScehduleMessage();
			  return;
		   }
        
           var event = new Object();
           event["displayName"] = source.text;
           event["startDT"] = "" + stTime.getTime();
           event["endDT"] = "" + endTime.getTime();
           event["timeFlag"] = "false";
           event["noTimeFlag"] = "true";
           this.save(event);
           this.render(this.schedules, this.date);
        } else {

			// Code Modified on 24 Oct 07, Gabbar, Time changes when event is moved on Month Calendar
			//  No Time to Time 

			var event = this.getEventByIndex(source.key);
		    if(event != null && event.fromTime != null 
				&& (event["timeFlag"]+"") == "true" && (event["noTimeFlag"] == null || event["noTimeFlag"] == "false")){
				stTime.setHours(0);
				stTime.setMinutes(event.fromTime);
				this.moveToNewStartTime(source, stTime);
		    }else{				
				this.moveToNoTime(source, stTime.getTime()); 
			}
		    this.render(this.schedules, this.date);
        }
     },
     
     doubleClicked: function(e) {
        var eventTarget = e.target ? e.target : e.srcElement;
        if (eventTarget.tagName == 'A' && eventTarget.id != null) {
	       return;
	    }
        var sch = app.schedule.getSelectedSchedule();
	    if (sch == null) {
	        app.schedule.showSelectScehduleMessage();
			return;
		}
			
        var idx = htmlTableRowIndexAt(this.table, e);
        
        if (idx >= 0) {
		   var idx2 = htmlTableCellIndexAt(this.table, this.table.rows[idx], e);
           if (idx2 < 0) {
              return;
           }
           
           var cell = this.table.rows[idx].cells[idx2];
           var stTime = new Date(parseInt(cell.id));
           var endTime = new Date(stTime.getTime());
           stTime.setHours(8);
           endTime.setHours(8, 30);
		   
		   var event = new Object();
		   event["displayName"] = "New Event";
		   event["startDT"] = "" + stTime.getTime();
           event["endDT"] = "" + endTime.getTime();
           event["timeFlag"] = "true";
           event["noTimeFlag"] = "false";
		   app.schedule.editEventDetails(event, sch, true);
		} 
     }
	
});

