
HJ.DailyCalendar = Class.create();

HJ.DailyCalendar.prototype = Object.extend(new HJ.Calendar(), {

	initialize: function(calendarTitle, calendarArea, calendarHeader, allDayEvents, todaysCalendarLink) {
	    this.calendarTitle = calendarTitle;
		this.calendarArea = calendarArea;
	    this.calendarHeader = calendarHeader;
	    this.allDayEvents = allDayEvents;
	    this.todaysCalendarLink = todaysCalendarLink;
	    this.table = document.createElement("table");
	    this.table.id = "dailyCTable";
	    this.allDayEventsBody = document.createElement('tbody');
	    this.dndMgr2 = new Af.DndMgr2(this);
	    this.m = null;
        this.dropZone = null;
	    this.allDayDropZone = 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.allDayDropZone == null) {
	         this.allDayDropZone   = this.dndMgr2.registerDropZone("dailyCalendar_allDayEvents", this.allDayEvents, this); 
	      } else {
	         this.dndMgr2.registerDropZone2(this.allDayDropZone);
	      }
	      if (this.dropZone == null) {
	         this.dropZone = this.dndMgr2.registerDropZone("dailyCalendar", this.table, this); 
	      } else {
	         this.dndMgr2.registerDropZone2(this.dropZone);
	      }

	      app.dndMgrScribble.registerDropZone("dailyCalendar_allDayEvents", this.allDayEvents, this); 
	      app.dndMgrMyLists.registerDropZone("dailyCalendar_allDayEvents", this.allDayEvents, this);
	      app.dndMgrScribble.registerDropZone("dailyCalendar", this.table, this); 
	      app.dndMgrMyLists.registerDropZone("dailyCalendar", this.table, this);
	      this.allDayEvents.onmousedown= this.mouseDownOnAllDaysTable.bindAsEventListener(this);
	   } else {
	      if (this.allDayDropZone != null) {
	         this.dndMgr2.deregisterDropZone(this.allDayDropZone); 
	      } 
	      if (this.dropZone != null) {
	         this.dndMgr2.deregisterDropZone(this.dropZone); 
	      } 
	   }
	},
	
	render: function(schedules, date) {
        app.showBusy();
	
	   this.schedules = schedules;
	   this.date = date;
	   
	   this.startTime = new Date(this.date.getTime());
	   
	   this.endTime = new Date(this.date.getTime());
	   this.endTime.setHours(24, 0, 0);
	   
	   if (this.todaysCalendarLink != null) {
	      var dt = new Date();
	      dt.setHours(0,0,0,0);
	      if (dt.getTime() == this.date.getTime()) {
	         this.todaysCalendarLink.className = "todaysCalendar_on";
	      } else {
	         this.todaysCalendarLink.className = "todaysCalendar_off";
	      }
	   }
	
	   this.calendarHeader.className = 'calendarHeader';
	   this.calendarTitle.innerHTML = this.daysLong[this.date.getDay()] + ", " + this.months[this.date.getMonth()] + " " + this.date.getDate() + ", " + this.date.getFullYear();
	   removeAll(this.calendarArea);
	   removeAll(this.calendarHeader);
	   this.calendarArea.className = 'calendar';
	   this.allDayEvents.style.display = "";
	   var tbl = this.table;
	   removeAll(tbl);
	   tbl.cellSpacing = "0";
	   this.calendarArea.appendChild(tbl);
	   var tbody = document.createElement('tbody');
	   tbody.id = "dailyCTB";
	   tbl.appendChild(tbody);
	   for (var i=0; i<24; i++) {
	      var tr = document.createElement("tr");
	      tbody.appendChild(tr);
	      var td = document.createElement("td");
	      td.className = "calTime";
	      //td.style.width = "100%";
	      var ts;
	      if (i == 0) {
	        ts = "12 am";
	      } else if (i == 12) {
	        ts = "12 pm";
	      } else if (i > 12) {
	        ts = (i-12) + " pm";
	      } else {
	        ts = i + " am";
	      }
	      td.vAling = "top";
	      td.appendChild(document.createTextNode(ts));
	      tr.appendChild(td);
	      td = document.createElement("td");
	      td.innerHTML = "&nbsp;";
	      tr.appendChild(td);
	      td.className = 'dailyCalEventName';
	   }
	   this.renderEvents();
	   this.table.ondblclick = this.doubleClicked.bindAsEventListener(this);
	   this.table.onclick = this.tableClicked.bindAsEventListener(this);
	   this.table.onmousedown= this.mouseDownOnTable.bindAsEventListener(this);
        app.endBusy();
	},
	
	next: function() {
	   var t = new Date(this.startTime.getTime());
	   t.setDate(t.getDate() + 1);
	   this.render(this.schedules, t);
	   app.schedule.saveCurrentCalendarDate();
	},
	
	previous: function() {
	   var t = new Date(this.startTime.getTime());
	   t.setDate(t.getDate() - 1);
	   this.render(this.schedules, t);
	   app.schedule.saveCurrentCalendarDate();
	},
	
	
	 renderEvents: function() {
	   
	   this.allDayEvents.className = "allDay";
	   removeAll(this.allDayEvents);
	   var tbody = this.allDayEventsBody;
	   removeAll(tbody);
	   this.allDayEvents.appendChild(tbody);
	   this.allDayEvents.onclick = this.tableClicked.bindAsEventListener(this);
	  
	   this.m = this.getEventMatrics(this.table, this.date, this.startTime, this.endTime);
	   var m = this.m;
	   var list = m[24];
	   this.allDayEvents.style.tableLayout = "auto";
	   if (list.length > 0) {
		  for (var j=0; j<list.length; j++) {
			  var o = list[j];
			  if (o.r < 24) {
				 continue;
			  }
			  var tr = document.createElement("tr");
			  tbody.appendChild(tr);
			  var td = document.createElement("td");
			  tr.appendChild(td);
			  td.style.paddingTop = "4px";
			  td.appendChild(o.link);
		   }
	   
	   } else {
	      var tr = document.createElement("tr");
          tbody.appendChild(tr);
          var td = document.createElement("td");
          td.style.height = "20px";
          tr.appendChild(td);
          td.innerHTML = "&nbsp;";
	   }
	   var trs = this.table.rows[1];
	   if (trs.cells[0].offsetWidth != 0) { // first time it is 0 therefore use css value
		   this.allDayEvents.style.marginLeft = (trs.cells[0].offsetWidth - 1) + "px";
		   this.allDayEvents.style.tableLayout = "fixed";
		   this.allDayEvents.style.width = (trs.cells[1].offsetWidth + 1)+ "px";
       }
	   this.renderMatrics(this.m, this.table, 1);
	 },
	 
	 handleScroll: function() {
        this.renderMatrics(this.m, this.table, 1);
     },

     processDragBegin: function(draggable) {
		 this.bFlag = true;		 		   
     },
      
     processDragged: function(draggable, e) {
		if(!this.bFlag){
			return;			
		}
		var idx = htmlTableRowIndexAt(this.table, e);       
        if (idx >= 0) {		 
		   var hr = idx;
		   var stTime = new Date(this.startTime.getTime());
		   var endTime = new Date(stTime.getTime());
		   this.bFlag = false;
		   this.actualDate = stTime.getTime();
		} 
		
     },

     processDragComplete: function(source, target, e) {
        if (target.htmlElement == this.allDayEvents) {
           this.processDragCompleteOnNoTime(source, target, e);
           return;
        }
        
        var pos = RicoUtil.toViewportPosition(this.calendarArea);
	    var ytemp = pos.y + this.calendarArea.scrollTop;
	    var y;
	    if (!is_Safari) {
			y = e.clientY;
		} else {
			y = e.clientY - document.body.scrollTop;
		}
	    if (y < ytemp) {
	       return;
	    }
       
        var idx = htmlTableRowIndexAt(this.table, e);
       
        if (idx >= 0) {
		   //idx++;
		   var hr = idx;
		   var stTime = new Date(this.startTime.getTime());
		    var endTime = new Date(stTime.getTime());
		   stTime.setHours(idx);
		   endTime.setHours(idx, 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"] = "true";
		    event["noTimeFlag"] = "false";
		    event["fromTime"] = hr*60;
		    event["toTime"] = hr*60 + 30;
		    this.save(event);
		    this.render(this.schedules, this.date);
			
        } else {
		    this.moveToNewStartTime(source, stTime);
		    this.render(this.schedules, this.date);
        }
     },
     
     
     processDragCompleteOnNoTime: function(source, target, e) {
     
        if (source.type != "Event") {
			var sch = app.schedule.getSelectedSchedule();
			if (sch == null) {
			   app.schedule.showSelectScehduleMessage();
			   return;
			}
			var stTime = new Date(this.startTime.getTime());
		    var endTime = new Date(stTime.getTime());
		    var event = new Object();
		    event["displayName"] = source.text;
		    event["timeFlag"] = "false";
		    event["noTimeFlag"] = "true";
		    event["startDT"] = "" + stTime.getTime();
		    event["endDT"] = "" + (endTime.getTime() + (30 * 60 * 1000));
		    event["fromTime"] = 8*60;
		    event["toTime"] = 8*60 + 30;
		    this.save(event);
		    this.render(this.schedules, this.date);
			
        } else {
		    this.moveToNoTime(source, this.startTime.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) {
		   //idx++;
		   var hr = idx;
		   
		   var stTime = new Date(this.startTime.getTime());
		   var endTime = new Date(stTime.getTime());
		   stTime.setHours(idx);
		   endTime.setHours(idx, 30);
		   
		   var event = new Object();
		   event["displayName"] = "New Event";
		   event["startDT"] = "" + stTime.getTime();
		   event["endDT"] = "" + endTime.getTime();
		   event["timeFlag"] = "true";
		   event["noTimeFlag"] = "false";
		   event["fromTime"] = hr*60;
		   event["toTime"] = hr*60 + 30;
		   app.schedule.editEventDetails(event, sch, true);
		} 
     },
     
     scrollTo7AM: function() {
        if (is_ie) {
           this.calendarArea.scrollTop = "189";
        } else {
           this.calendarArea.scrollTop = "162";
        }
     },
      
     showQuickEventDialog: function(notime) {
           var sch = app.schedule.getSelectedSchedule();
           if (sch == null) {
			   app.schedule.showSelectScehduleMessage();
			   return;
		   }
		   var hr = this.startIdx;
		   
		   var stTime = new Date(this.startTime.getTime());
		   var endTime = new Date(stTime.getTime());
		   stTime.setHours(hr);
		   endTime.setHours(this.endIdx+1);
		   
		   var event = new Object();
		   event["displayName"] = "New Event";
		   if(stTime.getTime()- endTime.getTime() <= 0)	   {
				event["startDT"] = "" + stTime.getTime();
				event["endDT"] = "" + endTime.getTime();
		   } else {
			    event["startDT"] = "" + endTime.getTime();
				event["endDT"] = "" + stTime.getTime();

		   }
		   if (notime) {
		       event["timeFlag"] = "false";
			   event["noTimeFlag"] = "true";
		   } else {
			   event["timeFlag"] = "true";
			   event["noTimeFlag"] = "false";
		   }
		   if( hr*60 - (this.endIdx+1)*60 <= 0) {
				event["fromTime"] = hr*60;
				event["toTime"] = (this.endIdx+1)*60;
		   } else {
			   event["fromTime"] = (this.endIdx+1)*60;
				event["toTime"] =  hr*60;
		   }
		   app.schedule.addQuickNewEvent(event, sch, true);
	
     }
	
});

