function ShowCascadeMenu(Show,LinkedButton,Menu,Type,VisibilityLinked,AutoZIndex,event){
  var SubMenu = $(Menu);
  if (Show){
    SubMenu.style.display='block';
    clearTimeout(SubMenu.getAttribute('TimeoutID'));
    if (Type=='Refresh'){
      clearTimeout(SubMenu.getAttribute('TimeoutID'));
      var LinkedMenu = SubMenu.getAttribute('MenuLinked');
      if (LinkedMenu!=null && LinkedMenu!='') {
        ShowCascadeMenu(true,'',LinkedMenu,'Refresh','');
      }     
    }
    else{
      SubMenu.setAttribute('InUse','false'); 
      if (Type=='DropDown'){
        Element.clonePosition(SubMenu, LinkedButton ,{offsetTop: Element.getHeight(LinkedButton)});
        var SubMenuOffset = Element.viewportOffset(SubMenu);
        if (Element.getWidth(SubMenu)+SubMenuOffset[0]+15 > Element.getWidth(document.body)){
          var Left = - Element.getWidth(SubMenu) + Element.getWidth(LinkedButton);
          Element.clonePosition(SubMenu, LinkedButton ,{offsetTop: Element.getHeight(LinkedButton) , offsetLeft: Left });
        }
      }
      if (Type=='Cascade'){
        Element.clonePosition(SubMenu, LinkedButton,{offsetLeft: Element.getWidth(LinkedButton)});
        var SubMenuOffset = Element.viewportOffset(SubMenu);
        if (Element.getWidth(SubMenu)+SubMenuOffset[0]+15 > Element.getWidth(document.body)){
          var Left = - Element.getWidth(SubMenu) + Element.getWidth(LinkedButton);
          Element.clonePosition(SubMenu, LinkedButton ,{offsetLeft: Left });
        }
      }    
      if (Type=='Context'){
        var MarginLeft = 10;
        var MarginTop = 5;
        if (SubMenu.getAttribute('UnderAjax')=='true'){
          MarginLeft += $('ContentPane').positionedOffset()[0];
          MarginTop += $('ContentPane').positionedOffset()[1];
        }
        SubMenu.style.left=(Event.pointerX(event)- MarginLeft)+'px';
        SubMenu.style.top=(Event.pointerY(event)-MarginTop)+'px';
        var SubMenuOffset = Element.viewportOffset(SubMenu);
        if (Element.getWidth(SubMenu)+SubMenuOffset[0]+15 > Element.getWidth(document.body)){
          SubMenu.style.left = (SubMenuOffset[0] - Element.getWidth(SubMenu)+7)+'px';
        }
      }
      if (VisibilityLinked != null){
        SubMenu.setAttribute('MenuLinked',VisibilityLinked);
      }
    }
    //Recupero lo ZIndex
    if ( AutoZIndex && LinkedButton != ''){
      SubMenu.style.zIndex=GetNextZIndex(LinkedButton).toString();
    }
  }
  else{
    if (SubMenu.getAttribute('InUse')=='false'){
      SubMenu.style.display='none';
      var LinkedMenu = SubMenu.getAttribute('MenuLinked');
      if (LinkedMenu!=null && LinkedMenu!='') {
        ShowCascadeMenu(false,'',LinkedMenu,'','');
      }
    }
  }
}

function GetNextZIndex(Control){
  var NextZIndex;
  Control = $(Control);
  try{ 
    if (Control.getStyle('z-index')>0){
      NextZIndex = parseInt(Control.getStyle('z-index'))+1;
    } 
    else{
      var ParentControl = Control.up();
      if (ParentControl.tagName != 'BODY'){
        NextZIndex = GetNextZIndex(Control.up());
      }
      else{
        NextZIndex = 1;
      }
    }
    return NextZIndex;
  }
  catch(e)
  {
  }
}

function ToogleNode(Control){
  InvertClassName($(Control));
  var ListItem = $(Control).up('li');
  var FirstSubMenu = ListItem.down('ul');
  if (FirstSubMenu != undefined){
    InvertVisibility(FirstSubMenu);
    var NextSubMenus = FirstSubMenu.nextSiblings().findAll(function(SubMenu){ return SubMenu.tagName.toLowerCase() == 'ul'}); 
    NextSubMenus.each(function(SubMenu) { InvertVisibility(SubMenu)});  
  }
}

function InvertClassName(Control){
  if (Control.className == 'NodePlus'){Control.className='NodeMinus'}
  else if (Control.className == 'NodeMinus'){Control.className='NodePlus'}
  else if (Control.className == 'LastNodePlus'){Control.className='LastNodeMinus'}
  else if (Control.className == 'LastNodeMinus'){Control.className='LastNodePlus'}
}

function InvertVisibility(Control){
  if (Control.visible()){
    Control.hide();
  }
  else{
    Control.show();
  }
}

function ToogleBranch(Control,Level){
  if (Control.className == 'Collapse'){
    Control.className='Expand';
    $(Control).up().up().up().select('[Level="'+Level+'"]').invoke('hide');
  }
  else{
    Control.className='Collapse';
    $(Control).up().up().up().select('[Level="'+Level+'"]').invoke('show');
  } 
}

function ZoomContent(Control,Value){
  $(Control).style.zoom = Value;
}

function GanttChartDraw(GanttChart,TaskLine,ChartType,Definition){
  var GanttChart = $(GanttChart);
  var TaskLine = $(TaskLine);
  var LinePosition = TaskLine.getAttribute('Position').split('-');
  var TopOffset = 1;
  var RightOffset = parseInt(LinePosition[2])+1;
  var LeftOffset = parseInt(LinePosition[1])+1;
  if (ChartType == 'Rulers'){
    RightOffset = ((RightOffset * Definition) - Definition + parseInt(LinePosition[4]))-1;
    LeftOffset = (LeftOffset * Definition) - Definition + parseInt(LinePosition[3]);
    TopOffset = 3
  }
  var GanttChartLineStart = GanttChart.rows[parseInt(LinePosition[0])+TopOffset].cells[LeftOffset];
  Element.clonePosition(TaskLine, GanttChartLineStart, {setWidth: false,setHeight: false ,offsetTop: 2});
  TaskLine.style.height=(GanttChartLineStart.getHeight()-4).toString()+'px';
  var LineWidth = 0;
  for (x=LeftOffset;x <= RightOffset;x++){
    LineWidth += $(GanttChart.rows[parseInt(LinePosition[0])+1].cells[x]).getWidth();
  }
  TaskLine.style.width=LineWidth.toString()+'px';
}

var TaskLineSelected;
var GanttChartSelected;
var MouseMoveEvent ;
var MouseUpEvent ;

function GanttChartResizeTaskLine(GanttChart,TaskLine,Direction,Tasks,TimeLine,Definition,e){
  var Tasks = Tasks.split('#|#');
  var TimeLine = TimeLine.split('#|#');
  TaskLineSelected = $(TaskLine);
  GanttChartSelected = $(GanttChart);
  var ActualLeft;
  var ActualPoint;
  if (Direction == 'Left'){
    ActualLeft = parseInt(TaskLineSelected.getStyle('left'));
  }
  else if (Direction == 'Right'){
    ActualLeft = Event.pointerX(e);
  }
  else if (Direction == 'Move'){
    ActualLeft = parseInt(TaskLineSelected.getStyle('left'));
    ActualPoint = Event.pointerX(e);
  }
  var ActualWidth = TaskLineSelected.getWidth();

  var StartResize = function(Evento) {
    var Width;
    if (Direction == 'Left'){
      Width = ActualWidth + ActualLeft - Event.pointerX(Evento);
		  TaskLineSelected.style.left=Event.pointerX(Evento) + 'px';
      if (Width < 0 ){Width = 0};
      TaskLineSelected.style.width=Width.toString() + 'px';
    }
    else if (Direction == 'Right'){
      Width = ActualWidth + Event.pointerX(Evento) - ActualLeft;
      if (Width < 0 ){Width = 0};
      TaskLineSelected.style.width=Width.toString() + 'px';
    }
    else if (Direction == 'Move'){
      TaskLineSelected.style.left=(ActualLeft+(Event.pointerX(Evento)-ActualPoint)).toString() + 'px';
    }
  }

  var EndResize;
  if (Direction == 'Left'){
    EndResize = function(){
      var LastRow = GanttChartSelected.rows[GanttChartSelected.rows.length-1];
      var TaskLineOffset = Element.viewportOffset(GanttChartSelected)[0] + $(LastRow.cells[0]).getWidth();
      var ActualLeft = parseInt(TaskLineSelected.getStyle('left'));
      var ActualWidth = TaskLineSelected.getWidth();
      var LastLeft = TaskLineOffset;    
      for (x=1;x <= LastRow.cells.length-1;x++){
        LastLeft += $(LastRow.cells[x]).getWidth();    
        var Left = LastLeft - $(LastRow.cells[x]).getWidth();
        if (Left < 0 ){Left = TaskLineOffset};
        TaskLineSelected.style.left=Left.toString()+'px';
        TaskLineSelected.style.width=(ActualWidth+ActualLeft-Left).toString() + 'px';
        if (LastLeft > ActualLeft){ break; } 
      }
      Event.stopObserving(document.body, 'mousemove', MouseMoveEvent);
      Event.stopObserving(document.body, 'mouseup', MouseUpEvent);
      document.selection.clear(); 
      
      var LinePosition = TaskLineSelected.getAttribute('Position').split('-');
      LinePosition[1]=(Math.ceil(x/Definition)-1).toString();
      var OffsetRightColumn = (parseInt(LinePosition[1])+1) * Definition;
      LinePosition[3]= (Definition - (OffsetRightColumn-x));
      TaskLineSelected.setAttribute('Position',LinePosition.join('-'));
      if (TaskLineSelected.getAttribute('ChangeAction')!= null && TaskLineSelected.getAttribute('ChangeAction') != ''){
        var Action = TaskLineSelected.getAttribute('ChangeAction').replace("{SERIALIZE}",SerializeTaskLine(TaskLineSelected,Tasks,TimeLine));
        eval(Action);
      }
    }
  }
  else if (Direction == 'Right'){
    EndResize = function(){
      var TaskLineOffset = parseInt(TaskLineSelected.getStyle('left'))-Element.viewportOffset(GanttChartSelected)[0];
      var ActualWidth = TaskLineSelected.getWidth()+TaskLineOffset;
      var LastWidth = 0;
      for (x=0;x <= GanttChartSelected.rows[2].cells.length-1;x++){
        LastWidth += $(GanttChartSelected.rows[2].cells[x]).getWidth();
        if (Definition > 1 && LastWidth > ActualWidth){ break; }
        var Width = LastWidth-TaskLineOffset;
        if (Width < 0 ){Width = 0};
        TaskLineSelected.style.width=Width.toString()+'px';
        if (Definition == 1 && LastWidth > ActualWidth){ break; }
      }
      Event.stopObserving(document.body, 'mousemove', MouseMoveEvent);
      Event.stopObserving(document.body, 'mouseup', MouseUpEvent);
      document.selection.clear();

      var LinePosition = TaskLineSelected.getAttribute('Position').split('-');    
      LinePosition[2]=(Math.ceil(x/Definition)-1).toString();
      var OffsetRightColumn = (parseInt(LinePosition[2])+1) * Definition;
      LinePosition[4]= (Definition - (OffsetRightColumn-x));

      
      TaskLineSelected.setAttribute('Position',LinePosition.join('-'));      
      if (TaskLineSelected.getAttribute('ChangeAction')!= null && TaskLineSelected.getAttribute('ChangeAction') != ''){
        var Action = TaskLineSelected.getAttribute('ChangeAction').replace("{SERIALIZE}",SerializeTaskLine(TaskLineSelected,Tasks,TimeLine));
        eval(Action);
      }
    }
  }
  else if (Direction == 'Move'){
    EndResize = function(){
      var LastRow = GanttChartSelected.rows[GanttChartSelected.rows.length-1];
      var TaskLineOffset = Element.viewportOffset(GanttChartSelected)[0] + $(LastRow.cells[0]).getWidth();
      var ActualLeft = parseInt(TaskLineSelected.getStyle('left'));
      var ActualWidth = TaskLineSelected.getWidth();
      var LastLeft = TaskLineOffset;    
      
      for (x=1;x <= LastRow.cells.length-1;x++){
        LastLeft += $(LastRow.cells[x]).getWidth();    
        var Left = LastLeft - $(LastRow.cells[x]).getWidth();
        if (Left < 0 ){Left = TaskLineOffset};
        TaskLineSelected.style.left=Left.toString()+'px';
        TaskLineSelected.style.width=(ActualWidth+ActualLeft-Left).toString() + 'px';
        if (LastLeft > ActualLeft){ break; } 
      }

      var LinePosition = TaskLineSelected.getAttribute('Position').split('-');
      LinePosition[1]=(Math.ceil(x/Definition)-1).toString();
      var OffsetRightColumn = (parseInt(LinePosition[1])+1) * Definition;
      LinePosition[3]= (Definition - (OffsetRightColumn-x));    
      
      TaskLineOffset = parseInt(TaskLineSelected.getStyle('left'))-Element.viewportOffset(GanttChartSelected)[0];
      ActualWidth = TaskLineSelected.getWidth()+TaskLineOffset;
      var LastWidth = 0;
      for (x=0;x <= GanttChartSelected.rows[2].cells.length-1;x++){
        LastWidth += $(GanttChartSelected.rows[2].cells[x]).getWidth();
        if (Definition > 1 && LastWidth > ActualWidth){ break; }
        var Width = LastWidth-TaskLineOffset;
        if (Width < 0 ){Width = 0};
        TaskLineSelected.style.width=Width.toString()+'px';
        if (Definition == 1 && LastWidth > ActualWidth){ break; }
      }

      LinePosition[2]=(Math.ceil(x/Definition)-1).toString();
      OffsetRightColumn = (parseInt(LinePosition[2])+1) * Definition;
      LinePosition[4]= (Definition - (OffsetRightColumn-x));
      TaskLineSelected.setAttribute('Position',LinePosition.join('-'));      

      Event.stopObserving(document.body, 'mousemove', MouseMoveEvent);
      Event.stopObserving(document.body, 'mouseup', MouseUpEvent);
      document.selection.clear(); 
      
      if (TaskLineSelected.getAttribute('ChangeAction')!= null && TaskLineSelected.getAttribute('ChangeAction') != ''){
        var Action = TaskLineSelected.getAttribute('ChangeAction').replace("{SERIALIZE}",SerializeTaskLine(TaskLineSelected,Tasks,TimeLine));
        eval(Action);
      }
    }
  }

  MouseMoveEvent = StartResize.bindAsEventListener(StartResize);  
  MouseUpEvent = EndResize.bindAsEventListener(EndResize);
  Event.observe(document.body, 'mousemove', MouseMoveEvent);  
  Event.observe(document.body, 'mouseup', MouseUpEvent);
}

function SerializeTaskLine(TaskLine,Tasks,TimeLine){
  var LinePosition = TaskLine.getAttribute('Position').split('-');
  var Serialization = "&LineCode="+TaskLine.getAttribute('Code')+"&Task="+Tasks[LinePosition[0]]+"&StartTime="+TimeLine[LinePosition[1]]+"&EndTime="+TimeLine[LinePosition[2]]+"&StartDefinition="+LinePosition[3]+"&EndDefinition="+LinePosition[4];
  return Serialization;
}
