
HJ.WeeklyCalendar = Class.create();

HJ.WeeklyCalendar.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.cellSpacing = "0";
		this.calendarArea.appendChild(this.table);

	    this.allDayEventsBody = document.createElement('tbody');
	    this.dndMgr2 = new Af.DndMgr2(this);
	    this.table.ondblclick = this.doubleClicked.bindAsEventListener(this);
	    this.table.onclick = this.tableClicked.bindAsEventListener(this);
	    this.allDayEvents.onclick= this.tableClicked.bindAsEventListener(this);
	    this.table.onmousedown= this.mouseDownOnTable.bindAsEventListener(this);
	    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("weeklyCalendar_allDayEvents", this.allDayEvents, this); 
	      app.dndMgrMyLists.registerDropZone("weeklyCalendar_allDayEvents", this.allDayEvents, this);
	      app.dndMgrScribble.registerDropZone("weeklyCalendar", this.table, this); 
	      app.dndMgrMyLists.registerDropZone("weeklyCalendar", 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();
	
	   var td;
	   this.schedules = schedules;
	   this.date = date;
       app.schedule.loadEventData(this.date);

	   this.startTime = new Date(this.date.getTime());
	   
	   var day = date.getDay();
	   
	   this.startTime.setDate(this.startTime.getDate() - day);
	   
	   this.endTime = new Date(this.startTime.getTime());
	   this.endTime.setDate(this.endTime.getDate() + 7);
	   var dt = new Date(this.startTime.getTime());
	   dt.setDate(dt.getDate() + 6);
	   
	   this.calendarTitle.innerHTML = "Week of "+this.months[this.startTime.getMonth()] + " " + this.startTime.getDate() + ", " + this.startTime.getFullYear(); 
//			 + " to " + this.months[dt.getMonth()] + " " + dt.getDate() + ", " + dt.getFullYear();
	   removeAll(this.calendarArea);
	   removeAll(this.calendarHeader);
	   
	   this.calendarHeader.className = 'calendarHeader';
	   this.calendarArea.className = 'calendar';
	   this.allDayEvents.style.display = "";

	   
	   var tbl = document.createElement("table");
	   tbl.cellSpacing = "0";
	   tbl.className = "calDays";
	   this.calendarHeader.appendChild(tbl);
	   var tbody = document.createElement('tbody');
	   tbl.appendChild(tbody);
	   var tr = document.createElement("tr");
	   tbody.appendChild(tr);
	   var dt = new Date(this.startTime.getTime());
	   for (var i=0; i<7; i++) {
	      td = document.createElement("td");
	      td.className = "calDay";
	      td.innerHTML = dt.getDate() + " " + this.days[i];
	      tr.appendChild(td);
	      dt.setDate(dt.getDate() + 1);
	   }
	   
	   
	   
	   tbl = this.table;
	   removeAll(tbl);
	   tbl.cellSpacing = "0";
	   this.calendarArea.appendChild(tbl);
	   tbody = document.createElement('tbody');
	   tbl.appendChild(tbody);
	   
	   for (var i=0; i<24; i++) {
	      tr = document.createElement("tr");
	      tbody.appendChild(tr);
	      td = document.createElement("td");
	      td.className = "calTime";
	      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.innerHTML = ts;
	      tr.appendChild(td);
	      for (var j=0; j<7; j++) {
			  td = document.createElement("td");
			  td.className = "weeklyCalEventName";
			  td.innerHTML = "&nbsp;";
			  tr.appendChild(td);
	      }
	   }
	   
	   var trs = this.table.rows[0];
	   
	   tbl = this.allDayEvents;
	   tbl.className = "calDaysNoTime";
	   tbl.style.tableLayout = "auto";
	   removeAll(tbl);
	   tbl.cellSpacing = "0";
	   tbl.border = "0";
	   
	   var tbody = this.allDayEventsBody;
	   removeAll(tbody);
	   tbl.appendChild(tbody);
	   var tr = document.createElement("tr");
	   tbody.appendChild(tr);
	  
	   var trs = this.table.rows[0];

	   tbl.style.marginLeft = (trs.cells[0].offsetWidth - 1) + "px";

	   var w = 0;
	   for (var j=0; j<7; j++) {
		  td = document.createElement("td");
		  if (j == 0) {
		     td.className = "weeklyCalNoTimeEventName1";
		  } else {
		     td.className = "weeklyCalNoTimeEventName";
		  }
		  w += trs.cells[j+1].offsetWidth;
		  td.style.width = (trs.cells[j+1].offsetWidth - 5) + "px";
		  tr.appendChild(td);
       }
       tbl.style.tableLayout = "fixed";
       tbl.style.width = w + "px";
	   this.renderEvents();
        app.endBusy();
	},
	
	next: function() {
	   var t = this.date;
	   t.setDate(t.getDate() + 7);
	   this.render(this.schedules, t);
	},
	
	previous: function() {
	   var t = this.date;
	   t.setDate(t.getDate() - 7);
	   this.render(this.schedules, t);
	},
	
	renderEvents: function() {
	   this.mlist = new Array(7);
	   var dt1 = new Date(this.startTime.getTime());
	   for (var i=0; i<this.mlist.length; i++) {
	      var dt2 = new Date(dt1.getTime());
	      dt2.setDate(dt2.getDate() + 1);
	      this.mlist[i] = this.getEventMatrics(this.table, dt1, dt1, dt2);
	      dt1 = dt2;
	   }
	   
	   
	  
	   var tbl = this.allDayEvents;
	
	   for (var i=0; i<this.mlist.length; i++) {
	      var list = this.mlist[i][24];
	      var c = tbl.rows[0].cells[i];
	      c.innerHTML = "&nbsp;&nbsp;";
	      for (var j=0; j<list.length; j++) {
			  var o = list[j];
			  if (o.r < 24) {
				 continue;
			  }
			  if (tbl.style.display == "none") {
			     tbl.style.display = "";
			  }
			  var d;
			  if (c.childNodes[0].tagName != "DIV") {
			     removeAll(c);
			     d = document.createElement("div");
			     d.style.overflow = "hidden";
			     d.style.width = c.width;
			     c.appendChild(d);
			  } else {
			     d = c.childNodes[0];
			     var sp = document.createElement("span");
			     sp.style.fontSize = "4px";
			     sp.innerHTML = "<br/><br/>";
			     d.appendChild(sp);
			  }
			  d.appendChild(o.link);
		   }
	   }
	   
	   this.renderMatricsList();

	},
	
	renderMatricsList: function() {
	   for (var i=0; i<this.mlist.length; i++) {
	      this.renderMatrics(this.mlist[i], this.table, i+1); 
	   }
	},
	
	handleScroll: function() {
        this.renderMatricsList();
    },
	 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;
           }           
           if (idx2 > 0) {
              idx2--;
           }
           var hr = idx;
           var stTime = new Date(this.startTime.getTime());
           stTime.setDate(stTime.getDate() + idx2);          
          
		   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) {
        
           var idx2 = htmlTableCellIndexAt(this.table, this.table.rows[idx], e);
           if (idx2 < 0) {
              return;
           }
           
           if (idx2 > 0) {
              idx2--;
           }
        
           //idx++;
           var hr = idx;
           var stTime = new Date(this.startTime.getTime());
           stTime.setDate(stTime.getDate() + idx2);
           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) {
        var idx2 = htmlTableCellIndexAt(this.allDayEvents, this.allDayEvents.rows[0], e);
        if (idx2 < 0) {
              return;
        }
        
        debugA("idx2: " + idx2);
        var stTime = new Date(this.startTime.getTime());
        stTime.setDate(stTime.getDate() + idx2);
        var endTime = new Date(stTime.getTime());
           
        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["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, 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;
           }
           
           if (idx2 > 0) {
              idx2--;
           }
        
           //idx++;
           var hr = idx;
          
           
           var stTime = new Date(this.startTime.getTime());
           stTime.setDate(stTime.getDate() + idx2);
           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());
           stTime.setDate(stTime.getDate() + (this.cellIdx-1));
           var endTime = new Date(stTime.getTime());
		   stTime.setHours(hr);
		   endTime.setHours(this.endIdx+1);
		   
		   var event = new Object();
		   event["displayName"] = "New Event";
		   event["startDT"] = "" + stTime.getTime();
		   event["endDT"] = "" + endTime.getTime();
		   if (notime) {
		       event["timeFlag"] = "false";
			   event["noTimeFlag"] = "true";
		   } else {
			   event["timeFlag"] = "true";
			   event["noTimeFlag"] = "false";
		   }
		   event["fromTime"] = hr*60;
		   event["toTime"] = (this.endIdx+1)*60;
		   app.schedule.addQuickNewEvent(event, sch, true);
		
     }
	
});

