var standardDelay    = 500;
var changeStageDelay = 8000;

var stages  = new Array('gourmetanimation', 'marketinganimation', 'handballanimation', 'feuerwehranimation');

var targetStage = null;
var visibleStage = null;
var stageTimer = null;

playAnimation = function() {
   $('playcontrol').addClassName('playing');
   if (targetStage == null || visibleStage == stages.size() - 1) {
      targetStage = 0;
   } else {
      targetStage = visibleStage + 1;
   }
   stageAppear(targetStage)();
}

pauseAnimation = function() {
   $('playcontrol').removeClassName('playing');      
   clearTimeout(stageTimer);
   stageTimer = null;
}

showStage = function() {
   return(function() {
      if (stages[visibleStage]) {
         elementCount = $(stages[visibleStage]).childElements().each(function(item) {
            if (item.hasClassName('headline') && stageTimer) {
                  Effect.BlindRight(item, { duration: 1, fps: 50 });
            } else {
               Effect.Appear(item, { duration: 0.5, fps: 50 });
            }
         });
      }
   });
}

hideStage = function() {
   if (visibleStage != null) {
      elementCount = $(stages[visibleStage]).childElements().each(function(item) {
         if (item.hasClassName('headline')) {
            Effect.BlindLeft(item, { duration: 1, fps: 50 });
         } else {
            Effect.Fade(item, { duration: 0.5, fps: 50 });
         }
      });
   }
}

toggleStageControl = function() {
   $('stagecontrol').select('img.active').each( function (item) {
      item.removeClassName('active');
      item.src = item.src.sub('_active.gif', '.gif');
   });
   stageControlToActivate = $('stagecontrol').childElements()[visibleStage];
   with (stageControlToActivate) {
      addClassName("active");
      src = src.sub('.gif','_active.gif');
   }
}

toggleStage = function(stage) {
   pauseAnimation();
   if (stage != visibleStage) {
      hideStage();
      visibleStage = stage;
   }
   stageTimer = setTimeout(showStage(), 1000);
   toggleStageControl();
}      

stageAppear = function(stage) {
   return(function() {
      if (visibleStage != null)  hideStage();
      
      visibleStage = stage;
      toggleStageControl();
      elementCount = $(stages[visibleStage]).childElements().size();
      
      switch (stage) {
         case 0:
            stageTimer = setTimeout(showMarketingAnimation(0, elementCount-1), 0);
            break;
         case 1:
            stageTimer = setTimeout(showFeuerwehrAnimation(0, elementCount-1), 0);
            break;
         case 2:
            stageTimer = setTimeout(showGourmetAnimation(0, elementCount-1), 0);
            break;
         case 3:
            stageTimer = setTimeout(showHandballAnimation(0, elementCount-1), 0);
            break;
         default:
            break;
      }
   });
}

showMarketingAnimation = function(frame, end_frame)  {
   return (function() {
      var animationElements = $(stages[visibleStage]).childElements();
      var additionalDelay = 0;
      switch (frame) {
      case 0:
         Effect.Appear(animationElements[frame], { duration: 1, fps: 50 });
         additionalDelay=500;
         break;
      case 1:
         Effect.BlindRight(animationElements[frame], { duration: 1, fps: 50 });
         break;
      case 2:
         Effect.Appear(animationElements[frame], { duration: 1, fps: 50 });
         additionalDelay=500;
         break;
      case 3:
         Effect.Appear(animationElements[frame], { duration: 1, fps: 50 });
         additionalDelay=500;
         break;
      case 4:
         Effect.Appear(animationElements[frame], { duration: 1, fps: 50 });
         additionalDelay=500;
         break;
      case 5:
         Effect.Appear(animationElements[frame], { duration: 1, fps: 50 });
         break;            
      default:
         break;
      }       
      frame++;
      if (frame <= end_frame) {
         stageTimer = setTimeout(showMarketingAnimation(frame, end_frame), standardDelay + additionalDelay);
      } else {
         stageTimer = setTimeout(stageAppear(1), changeStageDelay);
      }
   });
}

showFeuerwehrAnimation = function(frame, end_frame) {
   return (function() {
      var animationElements = $(stages[visibleStage]).childElements();
      var additionalDelay = 0;
      switch (frame) {
      case 0:
         Effect.Appear(animationElements[frame], { duration: 1, fps: 50 });
         additionalDelay=500;
         break;
      case 1:
         Effect.BlindRight(animationElements[frame], { duration: 1, fps: 50 });
         break;
      case 2:
         Effect.Appear(animationElements[frame], { duration: 1, fps: 50 });
         additionalDelay=500;
         break;
      case 3:
         Effect.Appear(animationElements[frame], { duration: 1, fps: 50 });
         additionalDelay=500;
         break;
      case 4:
         Effect.Appear(animationElements[frame], { duration: 1, fps: 50 });
         additionalDelay=500;
         break;
      case 5:
         Effect.Appear(animationElements[frame], { duration: 1, fps: 50 });
         additionalDelay=500;
         break;
      case 6:
         Effect.Appear(animationElements[frame], { duration: 1, fps: 50 });
         additionalDelay=500;
         break;
      default:
         break;
      }
      frame++;
      if (frame <= end_frame) {
         stageTimer = setTimeout(showFeuerwehrAnimation(frame, end_frame), standardDelay + additionalDelay);
      } else {
         stageTimer = setTimeout(stageAppear(2), changeStageDelay);
      }
   });
}

showGourmetAnimation = function(frame, end_frame) {
   return (function() {
      var animationElements = $(stages[visibleStage]).childElements();
      var additionalDelay = 0;
      switch (frame) {
      case 0:
         Effect.Appear(animationElements[frame], { duration: 1, fps: 50 });
         additionalDelay=500;
         break;
      case 1:
         Effect.BlindRight(animationElements[frame], { duration: 1, fps: 50 });
         break;
      case 2:
         Effect.Appear(animationElements[frame], { duration: 1, fps: 50 });
         additionalDelay=500;
         break;
      case 3:
         Effect.Appear(animationElements[frame], { duration: 1, fps: 50 });
         additionalDelay=500;
         break;
      case 4:
         Effect.Appear(animationElements[frame], { duration: 1, fps: 50 });
         additionalDelay=500;
         break;
      case 5:
         Effect.Appear(animationElements[frame], { duration: 1, fps: 50 });
         additionalDelay=500;
         break;
      case 6:
         Effect.Appear(animationElements[frame], { duration: 1, fps: 50 });
         additionalDelay=500;
         break;
      default:
         break;
      }
      frame++;
      if (frame <= end_frame) {
         stageTimer = setTimeout(showGourmetAnimation(frame, end_frame), standardDelay + additionalDelay);
      } else {
         stageTimer = setTimeout(stageAppear(3), changeStageDelay);
      }
   });
}

showHandballAnimation = function(frame, end_frame) {
   return (function() {
      var animationElements = $(stages[visibleStage]).childElements();
      var additionalDelay = 0;
      switch (frame) {
      case 0:
         Effect.Appear(animationElements[frame], { duration: 1, fps: 50 });
         additionalDelay=500;
         break;
      case 1:
         Effect.BlindRight(animationElements[frame], { duration: 1, fps: 50 });
         break;
      case 2:
         Effect.Appear(animationElements[frame], { duration: 1, fps: 50 });
         additionalDelay=500;
         break;
      case 3:
         Effect.Appear(animationElements[frame], { duration: 1, fps: 50 });
         break;
      case 4:
         Effect.Appear(animationElements[frame], { duration: 1, fps: 50 });
         break;
      case 5:
         Effect.Appear(animationElements[frame], { duration: 1, fps: 50 });
         additionalDelay=500;
         break;
      case 6:
         Effect.Appear(animationElements[frame], { duration: 1, fps: 50 });
         additionalDelay=500;
         break;
      case 7:
         Effect.Appear(animationElements[frame], { duration: 1, fps: 50 });
         additionalDelay=500;
         break;
      default:
         break;
      }
      frame++;
      if (frame <= end_frame) {
         stageTimer = setTimeout(showHandballAnimation(frame, end_frame), standardDelay + additionalDelay);
      } else {
         stageTimer = setTimeout(stageAppear(0), changeStageDelay);
      }
   });
}
