﻿/******************************************************
* CalendarEvent: represents a single calendar event
******************************************************/
function CalendarEvent(calendar, element)
{
   this._calendar  = calendar;
   this._element   = element;
   this._startTime = element.getAttribute("startTime");
   this._endTime   = element.getAttribute("endTime");
   this._startHour   = element.getAttribute("startHour");   

     
   if( IsIE() == true)
   {
      this._element.onmouseover = this.eventController;
   }
   else
   {
      this._element.addEventListener("mouseover",  this.eventController, false); 
   }
   
   
   this._element._eventEntity = this;
   
   this.dragging = false;
   this.resizing = false;
   this.expand = false;
}


CalendarEvent.prototype.align = function()
{
   if(this._startTime == null || this._endTime == null)
   {
      return;
   }
   
   var _helper = TimeHelper.getInstance(this._calendar);

   this._element.style.position = "absolute";
   
   var top = _helper.timeToPosY(this._startTime);
   this._element.style.top    = top + "px";
   //this._element.style.left   = _helper.timeToPosX(this._element) + "px"; 

   //this._element.style.width  =  this._element.parentNode.offsetWidth + "px";

   this._element.style.height = Math.abs(_helper.timeToPosY(this._endTime) - _helper.timeToPosY(this._startTime)) + "px";
}


CalendarEvent.prototype.fitToTimeBounds = function(phantom)
{
   if(phantom != null)
   {
      this._element.style.top = phantom.style.top;
   }

   var _helper = TimeHelper.getInstance(this._calendar);
   var _topY    = parseInt(this._element.style.top, 10);  
   
   var _bottomY = _topY + parseInt(this._element.style.height, 10);
    
   var startTime = _helper.posToTime(_topY);      
   var endTime   = _helper.posToTime(_bottomY);
   
   this._element.style.top    = _helper.timeToPosY( startTime ) + "px";
   this._element.style.height = _helper.timeToPosY( endTime ) - _helper.timeToPosY( startTime ) + "px";
   this._element.style.left   = _helper.timeToPosX(this._element) + "px";
   
   this._startTime = startTime;
   this._endTime   = endTime;
   
   this._element.setAttribute('startTime', this._startTime);
   this._element.setAttribute('endTime', this._endTime); 

   Proxy.getInstance().MoveEvent( this.getID(), 
                                  _helper.getDate(this._element), 
                                  this._startTime, 
                                  this._endTime);      
   ViewMode.getInstance()._calendar = this._calendar;
   ViewMode.getInstance().onUpdateCalendars();
}


CalendarEvent.prototype.adjustBoundaries = function(event, calendar)
{
   event = event || window.event;
  
   var clientY = AbsToRelY( event.clientY, WeekManager.getInstance(calendar.id)._element) + getTotalScrollTop(this._element);
     
   var _helper = TimeHelper.getInstance(calendar);
          
   var TDpos = _helper.getTimeCellOverPos(clientY);
      
   this._element.style.height = (this._element.style.height - parseInt(this._element.style.top, 10)) > _helper.getMinHeight() ? 
                                (this._element.style.height - parseInt(this._element.style.top, 10)) : _helper.getMinHeight();    
          
   if ( clientY  >  _helper.getBottomLimit())
   {
      this._element.style.height = _helper.getBottomLimit() - parseInt(this._element.style.top, 10) + "px";              
      this._element._eventEntity._endTime = 
      addHours(_helper.posToTime(parseInt(this._element.style.height, 10) + _helper.getTopLimit() + parseInt(this._element.style.top, 10)), 0);       
   }
   else
   {      
       if( clientY > TDpos[0] )
       {
          this._element.style.height = TDpos[1] - parseInt(this._element.style.top, 10) + "px"; 
          this._element._eventEntity._endTime = _helper.posToTime(TDpos[0] + _helper.getTopLimit());  
       }
       else 
       {
          var newH = TDpos[0] - parseInt(this._element.style.top, 10);      
          this._element.style.height = ( newH > 2 * _helper.getMinHeight() ? newH : 2 * _helper.getMinHeight() ) + "px";     
          this._element._eventEntity._endTime = addHours(_helper.posToTime(parseInt(this._element.style.height, 10) + 
                                                         parseInt(this._element.style.top, 10) + _helper.getTopLimit()), 0);            
       }
   }

   this._element.style.height = _helper.timeToPosY(this._element._eventEntity._endTime) - _helper.timeToPosY(this._element._eventEntity._startTime); 
   
   Proxy.getInstance().UpdateTime( this.getID(), 
                                   this._element._eventEntity._startTime, 
                                   this._element._eventEntity._endTime ); 
                                   
   ViewMode.getInstance()._calendar = this._calendar;                             
   ViewMode.getInstance().onUpdateCalendars();                                   
}


CalendarEvent.prototype.getStartTime = function()
{
   return this._startTime;   
}


CalendarEvent.prototype.getEndTime = function()
{
   return this._endTime;
}

CalendarEvent.prototype.getID = function()
{
   return this._element.getAttribute("eventID");
}


CalendarEvent.prototype.getElement = function()
{
   return this._element;
}


CalendarEvent.prototype.eventController = function (event)
{
   event = event || window.event;

   var oDIV = (event.target) ? event.target : event.srcElement;
   
   oDIV.onmouseover  = onEventOver;
   oDIV.onmouseout   = onEventLeave;
   oDIV.onmousedown  = onEventMouseDown;
   
   var oldZ = null;
   
   onEventOver(event);
   
   function onEventOver(event)
   {  
      event = event || window.event;
      oDIV = (event.target) ? event.target : event.srcElement;

      oldZ = oDIV.style.zIndex;
      oDIV.style.zIndex = 10000;   
   }

   function onEventLeave(event)
   {
      event = event || window.event;
      oDIV = (event.target) ? event.target : event.srcElement;

      oDIV.style.zIndex = oldZ; 
      oldZ = null;   
   }

   function onEventMouseDown(event)
   {  
      event = event || window.event;
      
      var grid = GetGridForEvent(event);     
      
      if(oDIV.tagName == "IMG") 
      {
         oDIV = oDIV.parentNode;
      }

      if(oDIV.tagName == "A")
      {
         if( IsIE() != true)
         {
            event.stopPropagation();
         }
         else
         {
            event.cancelBubble = true;
         }

         return; 
      }
      if(oDIV._eventEntity == null)
      {
         return;
      }
      
      var currentElement = (event.target) ? event.target : event.srcElement;

      if( currentElement.tagName == "IMG")
      {
         var link = oDIV.getAttribute('link');

         if( link != "")
         {
            window.location = link;
         }
         else
         {
            oDIV._eventEntity.expand   = true;
            oDIV._eventEntity.resizing = false;
            oDIV._eventEntity.dragging = false;
         }
         return;
      }

      if( oDIV.getAttribute('readonly') == "True")
      {
         return;
      }
      
      var clientY = AbsToRelY( event.clientY, grid) + getTotalScrollTop(oDIV);

      if( clientY > ( parseInt(oDIV.style.top, 10) + oDIV.offsetHeight) - 10)
      {
         oDIV._eventEntity.resizing = true; 
         oDIV._eventEntity.dragging = false;     
      }
      else
      {   
         oDIV._eventEntity.resizing = false;
         oDIV._eventEntity.dragging = true;         
      }
   }
}

