﻿/******************************************************
* WeekManager: handles day tables
******************************************************/
function WeekManager()
{
    this._dayManagersList = null;
    this._element = null;
}

WeekManager._instance = new Array();
WeekManager._current  = null;

WeekManager.getInstance =  function(idCalendar)
{
   if(WeekManager._instance[idCalendar] == null)
   {
      WeekManager._instance[idCalendar] = new WeekManager();
   }

   return WeekManager._instance[idCalendar];
}

window.onresize = resize;
var gloabalwidth = 0;
function resize()
{
    if (gloabalwidth != document.forms[0].offsetWidth)
    {
        for (var item in WeekManager._instance)
        {
            if (item != null && item != "[object]")
            {
               WeekManager.getInstance(item).Resize(item);
            }        
        }
        gloabalwidth = document.forms[0].offsetWidth;
    }
}

WeekManager.prototype.Resize = function(idCalendar)
{
   element = WeekManager.getInstance(idCalendar)._element;
   var calendar = _$(idCalendar);
   if (element != null && element.rows && element.rows.length > 0)
   {
       var divDays = element.rows[element.rows.length - 1].cells[0].firstChild;
       var helper = TimeHelper.getInstance(calendar);

       if (IsIE7())
       {      
          element.style.width = calendar.offsetWidth - 16 + "px";
       }
       
       var numHours = parseInt(element.getAttribute('numHours'));
       var startHour = parseInt(element.getAttribute('startHour'));
       divDays.style.height = 2 * numHours * parseInt(helper._height) + numHours + 4 + "px";      
       divDays.scrollTop = 2 * startHour * parseInt(helper._height) + startHour + 2;      

       var  tdcell = document.getElementById('idemptycell' + idCalendar);
   
       if (IsIE7())
       {
           if (tdcell != null)
           {
                divDays.firstChild.style.width = calendar.offsetWidth - 50 + "px";
                tdcell.nextSibling.style.width = tdcell.nextSibling.clientWidth - divDays.firstChild.rows[0].cells[0].clientWidth + 'px';
           }   
           divDays.firstChild.style.width = divDays.clientWidth;
       }  
   }
   WeekManager.getInstance(idCalendar).Update(idCalendar);
}

WeekManager.prototype.Init = function(idCalendar)
{   
   this._dayManagersList = new Array();
   this._element = _$(idCalendar).firstChild.lastChild.previousSibling;   
  
   var tables = this._element.getElementsByTagName("TABLE");
      
   WeekManager.getInstance(_$(idCalendar)).Resize(idCalendar);
  
   
   var j = 0;
   for( var i = 0; i< tables.length; i++)
   {
      if ( tables[i].getAttribute('DayTable') != null)
      {
         this._dayManagersList[j++] = new DayManager(_$(idCalendar), tables[i]);
      }
   }  
   
}

WeekManager.prototype.Update = function(calendar)
{
   var dayManager = WeekManager.getInstance(calendar)._dayManagersList;
   if (dayManager != null)
   {
       for( var i = 0; i < dayManager.length; i++)
       { 
          dayManager[i].AdjustOverlappingEvents();    
       }
   }
}

WeekManager.prototype.onResize = function(event)
{
   event = event || window.event;

   var target = (event.target) ? event.target : event.srcElement;
    
   var grid = GetGridForEvent(event);        
   if (grid == null)
   {
       return;
   }
   var calendar = grid.parentNode.parentNode;
   WeekManager.getInstance(calendar.id).Update(calendar.id);   
}

WeekManager.prototype.eventController = function(event)
{
   event = event || window.event;

   var target = (event.target) ? event.target : event.srcElement;
    
   var grid = GetGridForEvent(event);        
   if (grid == null)
   {
       return;
   }
   var calendar = grid.parentNode.parentNode;
       
   if( target != null)
   {
      if( target.tagName == "IMG")
      {
         target = target.parentNode;
      }
   }

   if( target == null || (target._eventEntity == null && target.tagName == "TD" && target.className != ""))
   {
      if( WeekManager.getInstance(calendar.id)._element.getAttribute("readonly") != "True")
      {
         EventToolbar.getInstance(calendar.id).show(calendar.id,
                             AbsToRelX( event.clientX, WeekManager.getInstance(calendar.id)._element),
                             AbsToRelY( event.clientY, WeekManager.getInstance(calendar.id)._element) + getTotalScrollTop( WeekManager.getInstance(calendar.id)._element ),
                             target.parentNode.rowIndex,
                             findAbsPosX(WeekManager.getInstance(calendar.id)._element));
      }
      return;
   }

   var evnt = target._eventEntity || target.parentNode._eventEntity;

   if(evnt == null || evnt.expand == null)
   {
      return 
   }
   if(evnt.expand == true)
   {
      EventWizard.getInstance().show(evnt.getID(), false);
      evnt.expand = false;   
      return;
   }

   this._element = grid;
   this._element.onmousemove  = onMouseMove;
   this._element.onmouseup    = onMouseUp;
   this._element.onmouseleave = onMouseLeave;  

   var _element = evnt.getElement();
   
   var phantom = null;
   var oldItem = _element;

   if( evnt.dragging == true)
   {
      phantom = createPhantom(_element); 
      phantom.style.left = findAbsPosX(_element) - findAbsPosX(WeekManager.getInstance(calendar.id)._element);
      GetEventGrid(this._element).appendChild(phantom);  
      phantom.style.display = "block";         
   }


var _delta =  AbsToRelY( event.clientY, WeekManager.getInstance(calendar.id)._element) + getTotalScrollTop(_element) - parseInt(_element.style.top);

var _dragging = false;
   
function onMouseMove(event)
{  
    event = event || window.event;

    if(evnt == null)
    {
        return;
    }

    var grid = GetGridForEvent(event);        
    if (grid == null)
    {
        return;
    }
    var calendar = grid.parentNode.parentNode;

    var clientY = AbsToRelY( event.clientY, WeekManager.getInstance(calendar.id)._element) + getTotalScrollTop(_element);

    var _helper = TimeHelper.getInstance(calendar);
    
        
    if(evnt.resizing == true)
    {
        var newH = clientY - parseInt(_element.style.top);        
        _element.style.height = (newH > _helper.getMinHeight() ? newH : _helper.getMinHeight()) + "px";
        
                                        
        if ( parseInt(_element.style.height) + parseInt(_element.style.top)  >  _helper.getBottomLimit())
        {                     
            _element.style.height = _helper.getBottomLimit() - parseInt(_element.style.top) + "px";
        }        
        return;
    }

    if (evnt.dragging == true && phantom != null)
    {         
        phantom.style.top = clientY - _delta + "px";
        var margin = 20;

        var bottomY = parseInt(phantom.style.top) + parseInt(phantom.style.height);        
        if ( bottomY  >  _helper.getBottomLimit())
        {
            phantom.style.top = _helper.getBottomLimit() - parseInt(phantom.style.height) + "px";            
        }

        if( parseInt( phantom.style.top ) < 0)
        {
            phantom.style.top = "0px";
        }
                
        var newPosX =  AbsToRelX( event.clientX, WeekManager.getInstance(calendar.id)._element);

        if(newPosX > ( parseInt(phantom.style.left) +  phantom.style.offsetWidth))
        {
            phantom.style.left = newPosX - phantom.offsetWidth + margin + "px";
        }
        else if (newPosX < parseInt(phantom.style.left))
        {
            phantom.style.left = newPosX - margin + "px";
        }
        
        phantom.style.left = newPosX;

        _dragging = true;
    }
}

function onMouseLeave(event)
{
   onMouseMove(event);
   postDragAction(this);
}
   
function onMouseUp(event)
{
    event = event || window.event;

    if(evnt == null)
    {
     return;
    }
      
    var grid = GetGridForEvent(event);        
    if (grid == null)
    {
       return;
    }
    var calendar = grid.parentNode.parentNode;      

    if(evnt.resizing == true)
    {            
        evnt.adjustBoundaries(event, calendar);     
        WeekManager.getInstance(calendar.id).Update(calendar.id);                                    
        evnt.resizing = false;
        evnt = null;
        return;
    }

    if(evnt.dragging == false && evnt.resizing == false)
    {
     return;
    }

    if( _dragging == false) // handling single/double clicks 
    {
     evnt.dragging = false;
     evnt.resizing = false;

     if( phantom != null)
     {
        GetEventGrid(WeekManager.getInstance(calendar.id)._element).removeChild(phantom);
     }

     phantom = null;

     return;
    }

    var _helper = TimeHelper.getInstance(calendar);

    var newParent = _helper.getDayTblFromX( AbsToRelX( event.clientX, WeekManager.getInstance(calendar.id)._element) );
     
    if(newParent != null && newParent._DayEntity != null)
    {
         newParent._DayEntity.addEvent(evnt, oldItem);
         postDragAction(this);         
         newParent._DayEntity.update();
    } 
}

function postDragAction(element)
{ 
    if(evnt == null)
    {
        return;
    }
    
    var grid = GetGridForEvent(event);        
    if (grid == null)
    {
        return;
    }
    var calendar = grid.parentNode.parentNode;   
        
    if (evnt.resizing == true)
    {   
        evnt.adjustBoundaries(event, calendar);
        WeekManager.getInstance(calendar.id).Update(calendar.id);                                    
        evnt = null;           
        return;
    }
            
    evnt.fitToTimeBounds(phantom);
    evnt.dragging = false;
    evnt = null;

    element.onmousemove = null;
    element.onmouseup   = null;
    element.onmouseleave = null; 
    element.onmouseout = null; 

    WeekManager.getInstance(calendar.id).Update(calendar.id);
    if( phantom != null)
    {
        GetEventGrid(WeekManager.getInstance(calendar.id)._element).removeChild(phantom);
    }
}
}



