/******************************************************************************/
/************************** ScenarioElement object ****************************/
/******************************************************************************/

var imageExitFunctions = new Array();
var imageEnterFunctions = new Array();

imageExitFunctions["shrinkToCenter"] = function(element, array){Effect.Shrink(element, array)};
imageExitFunctions["none"] = function(element, array){Effect.Fade(element, array)};
imageExitFunctions["exitToTop"] = function(element, array){Effect.SlideUpOut(element,array)};
imageExitFunctions["exitToBottom"] = function(element, array){Effect.SlideDownOut(element,array)};
imageExitFunctions["exitToLeft"] = function(element, array){Effect.SlideLeftOut(element, array)}
imageExitFunctions["exitToRight"] = function(element, array){Effect.SlideRightOut(element,array)};
  
imageEnterFunctions['none'] = function (element, array){Effect.Appear(element, array)};
imageEnterFunctions["growFromCenter"] = function(element, array){Effect.Grow(element,array)};
imageEnterFunctions["enterFromTop"] = function(element, array){Effect.SlideDownIn(element,array)};
imageEnterFunctions["enterFromBottom"] = function(element, array){Effect.SlideUpIn(element,array)};
imageEnterFunctions["enterFromLeft"] = function(element, array){Effect.SlideRightIn(element,array)};
imageEnterFunctions["enterFromRight"] = function(element, array){Effect.SlideLeftIn(element,array)};



function newScenarioElementFromXml(element) 
{
  var resource   = getFirstElementValue(element,'resource');
  var prettyName = getFirstElementValue(element,'prettyName');
  var type       = getFirstElementValue(element,'type');
  
  var origin     = getFirstElementValue(element, 'origin');
  if( origin == '' )   //backwards compatibility : internal
    origin = 'I'; 
  
  var duration   = getFirstElementValue(element,'duration');;
          
  var text = new Array();
  
  var texts = element.getElementsByTagName('text');
  if( texts && texts.length == 1) 
  {
    text['content'] = getFirstElementValue(texts[0],'content');
    text['color']   = getFirstElementValue(texts[0],'color');
    text['position']= getFirstElementValue(texts[0],'position');
    text['sizeOfText'] = getFirstElementValue(texts[0],'size');
  }
  
  var enterTransitions = element.getElementsByTagName('enterTransition');
  var exitTransitions = element.getElementsByTagName('exitTransition');
  var enterTransition = new Array();  
  if (enterTransitions.length == 1) {
    if(getFirstElementValue(enterTransitions[0],'type') != '')
       enterTransition['type'] = getFirstElementValue(enterTransitions[0],'type');
    else
       enterTransition['type'] = 'default';
       
    if(getFirstElementValue(enterTransitions[0],'delay') != '')
       enterTransition['delay'] = getFirstElementValue(enterTransitions[0],'delay');
    else
       enterTransition['delay'] = 'default'
  }
  var exitTransition = new Array();  
  if (exitTransitions.length == 1) {
    if(getFirstElementValue(exitTransitions[0],'type') != '')
       exitTransition['type'] = getFirstElementValue(exitTransitions[0],'type');
    else
       exitTransition['type'] = 'default';
       
    if(getFirstElementValue(exitTransitions[0],'delay') != '')
       exitTransition['delay'] = getFirstElementValue(exitTransitions[0],'delay');
    else
       exitTransition['delay'] = 'default'
  }
  var mustFadeTransition;
  if(getFirstElementValue(element, "mustFadeTransition") != '')
    mustFadeTransition = getFirstElementValue(element, "mustFadeTransition");
  else
    mustFadeTransition = 'default'
  //alert("enter "+enterTransition['delay']);
  //alert("exit "+exitTransition['delay']);
  return new ScenarioElement(resource, prettyName, type, origin, duration, text, mustFadeTransition, enterTransition, exitTransition);
  
}

ScenarioElement = function(aResource, aPrettyName, aType, aOrigin, aDuration, aText, aMustFadeTransition, aEnterTransition, aExitTransition) {

  this.resource=aResource;
  this.prettyName = aPrettyName;
  this.type=aType;
  this.origin = aOrigin;
  this.duration=aDuration;
  this.text=aText ? aText : new Array();

  this.enterTransition = aEnterTransition ? aEnterTransition : new Array();
  if(!this.enterTransition["delay"]) this.enterTransition["delay"] = "default";
  if(!this.enterTransition["type"]) this.enterTransition["type"] = "default";
  
  this.exitTransition = aExitTransition ? aExitTransition : new Array();
  if(!this.exitTransition["delay"]) this.exitTransition["delay"] = "default";
  if(!this.exitTransition["type"]) this.exitTransition["type"] = "default";

  //alert(this.enterTransition['type']);
  this.enterDelay = this.enterTransition['delay'] == 'default' ? scenario.globalOptions.defaultEnterDelay: this.enterTransition['delay'];
  this.exitDelay = this.exitTransition['delay'] == 'default'  ? scenario.globalOptions.defaultExitDelay: this.exitTransition['delay'];
  this.enterType = this.enterTransition['type'] == 'default' ? scenario.globalOptions.defaultEnterTransition: this.enterTransition['type'];
  this.exitType = this.exitTransition['type'] == 'default' ? scenario.globalOptions.defaultExitTransition: this.exitTransition['type'];
  
  this.mustFadeTransition = aMustFadeTransition ? aMustFadeTransition: 'default';
  //alert("true enter "+ this.enterDelay);
  //alert("true exit "+ this.exitDelay);
 
}


ScenarioElement.prototype =
{

  setResource: function(aResource) 
  {
    this.resource=aResource;
  },
  
  getResource : function()
  {
    return this.resource;
  },
  
  getPrettyName: function()
  {
    return this.prettyName;
  },
  
  getDuration : function()
  {
    return this.duration;
  },
  
  setDuration: function(aDuration)
  {
    this.duration = aDuration;
  },
  
  setType: function(aType)
  {
    this.type = aType;
  },
  getFolder : function()
  {
    if (this.type == "I") return "image/" ;
    if (this.type == "V") return "video/" ;
    if (this.type == "A") return "audio/" ;
  },
  
  getMustFadeTransition : function() {
  if(scenario.globalOptions.defaultMustFadeTransition) var defaultValue = scenario.globalOptions.defaultMustFadeTransition;
  else var defaultValue = "true";
    var theReturn = this.mustFadeTransition == 'default' ? defaultValue : this.mustFadeTransition;
    return theReturn;
  },
  
  getOrigin : function() {
    return this.origin;
  },
  
  getResourceLocation : function()
  {
    if (this.origin == "E") return this.resource;
    else return scenario.getFullPath() + this.getFolder() + this.resource;
  },
  
  
  /**
   * Calcule la taille du texte et l'affiche
   * A chaque affichage, besoin de recalculer parce que la taille du player peut avoir changé
   **/
  setCaption : function(playerName)  {
    if(playerName) {
      var player = $f(playerName);
    }
    else
      var player = scenario.activePlayer;
      
    if(playerName || player == scenario.mediaPlayer) {
      
      var plugin = player.getPlugin('content');
      if (!plugin.setHtml) return;
      plugin.setHtml('<p></p>');
      
      if (this.text && this.text['content']) {
        /* début traitement texte */
        var nbLines = this.captionNbLines();
        
        /* fin traitement texte */
        plugin.setHtml('<p>'+this.text['content']+'</p>');
  
        if (player.size == 'mid') scale = 2.0;
        else if (player.size == 'big') scale = 2.5;
        else scale = 1;
  
        var position = this.text['position'] ? this.text['position'] : 'top';
        if (position == 'top') {
          var topMargin = 10 * scale;
        } else if (position == 'middle') {
          var topMargin = 100 * scale;
          if (player.getPlugin('controls')) bottomMargin -= 10;
        } else if (position == 'bottom') {
          var bottomMargin = 10 * scale;
          if (player.getPlugin('controls')) bottomMargin += 25;
        }
        
        var size = (this.text['sizeOfText'] ? this.text['sizeOfText'] : 12) * scale;
        var height = size * 1.7 * nbLines;
        var color = this.text['color'] ? this.text['color'] : '#ffffff';
  
        if (position == 'bottom') {
   	      plugin.css({body:{'color':color, 'fontSize':size+'px'},'top':null,'bottom':bottomMargin+'px','height':height});
        } else {
   	      plugin.css({body:{'color':color, 'fontSize':size+'px'},'bottom':null,'top':topMargin+'px','height':height});
        }
  
      }
    }
    else if(player == scenario.imagePlayer) {
      var theDiv = document.getElementById("imageCaption")
      theDiv.innerHTML = ''
      
      if (this.text && this.text['content']) {
        /* début traitement texte */
        var nbLines = this.captionNbLines();
        
        /* fin traitement texte */
        theDiv.innerHTML = '<p class="imageCaptionP">'+this.text['content']+'</p>';

        var base; //original size
        var variablePos // variable function of position
        var scale; //player scale (1 = 240*320)
        
        if (player.size == 'mid') { base = -500; scale=2;}
        else if (player.size == 'big') {base = -620; scale = 2.5;}
        else {base = -260; scale = 1;}
  
        var position = this.text['position'] ? this.text['position'] : 'top';
        if (position == 'top') {
          var topMargin = base + 20*scale;
        } else if (position == 'middle') {
          var topMargin = base + 100*scale;
        } else if (position == 'bottom') {
          var topMargin = base + 180*scale;
        }
        
        var size = (this.text['sizeOfText'] ? this.text['sizeOfText'] : 12) * scale;
        var height = size * 1.7 * nbLines;
        var color = this.text['color'] ? this.text['color'] : '#ffffff';

   	    theDiv.setAttribute("style","position:relative;color:"+color+";font-size:"+size+"px;top:"+topMargin+"px;height:"+height+"px;");
        theDiv.style.cssText="position:relative;top:"+topMargin+"px;margin-left:auto:margin-right:auto;color:"+color+";font-size:"+size+"px;height:"+height+"px;";

  
      }
    
    }
  },
  
  unsetCaption : function(playerName) {
    if(playerName) {
      var player = $f(playerName);
    }
    else
      var player = scenario.activePlayer;
      
    if(playerName || player == scenario.mediaPlayer) {
      var plugin = player.getPlugin('content');
      if (!plugin.setHtml) return;
      plugin.setHtml('<p></p>');
    }
    else if(player == scenario.imagePlayer) {
      var theDiv = document.getElementById("imageCaption");
      theDiv.innerHTML = '';
    }
  },
  
  captionNbLines : function() {
      var myLength = this.text['content'].length;
      return Math.floor((myLength / 30) +1);
  
  },
  
  startEnterTransition: function() {
    if (this.type == "V") {
    
      if (this.enterType && this.enterDelay && this.enterType != 'none') {
      var trType=this.enterType;
          if(trType=="growFromCenter") {
          setTimeout("scenario.activePlayer.transitionGrowFromCenter(scenario.scenarioElements[scenario.currentDisplayed].enterDelay*1000);",200);   
        } else if(trType=="enterFromLeft") {
          setTimeout("scenario.activePlayer.transitionEnterFromLeft(scenario.scenarioElements[scenario.currentDisplayed].enterDelay*1000);",200);    
        } else if (trType=="enterFromRight") {
          setTimeout("scenario.activePlayer.transitionEnterFromRight(scenario.scenarioElements[scenario.currentDisplayed].enterDelay*1000);",200);
        } else if(trType=="enterFromTop") {
          setTimeout("scenario.activePlayer.transitionEnterFromTop(scenario.scenarioElements[scenario.currentDisplayed].enterDelay*1000);",200);
        } else if (trType=="enterFromBottom") {
          setTimeout("scenario.activePlayer.transitionEnterFromBottom(scenario.scenarioElements[scenario.currentDisplayed].enterDelay*1000);",200);
        }
        setTimeout("scenario.scenarioElements[scenario.currentDisplayed].display()",200); 
    }
      else {
        //setTimeout("scenario.activePlayer.show()",200);
        //setTimeout("scenario.scenarioElements[scenario.currentDisplayed].display()",200);
        scenario.mediaPlayer.show();
        scenario.scenarioElements[scenario.currentDisplayed].display();
      }
    
    }
    else {
      scenario.scenarioElements[scenario.currentDisplayed].display();  //image or audio
      if (this.type == "A") this.startExitTransition(); //audio
    }
  },
  
  startExitTransition: function() {
    /*never happens when images are displayed, because imagePlayer always ends
    * by a scenario.next(something) call
    *
    */
    var transitionFunction = new Array();
    transitionFunction["shrinkToCenter"] = function(delay){transitionExitToRight(delay)};
    transitionFunction["exitToRight"]    = function(delay){transitionExitToRight(delay)};
    transitionFunction["exitToLeft"]     = function(delay){transitionExitToRight(delay)};
    transitionFunction["exitToTop"]      = function(delay){transitionExitToRight(delay)};
    transitionFunction["exitToBottom"]   = function(delay){transitionExitToRight(delay)};
  
   if (this.type == "V" && this.exitType && transitionFunction[this.exitType]) {
      var trType=this.exitType;
      var theFunction = transitionFunction[trType]
      scenario.activePlayer.theFunction(this.exitDelay*1000);
      setTimeout('scenario.next()',this.exitDelay*1000);
    }
    else if(this.type == "V") {
      scenario.activePlayer.unloadMedia();
      scenario.next();
    }
    else { //audio
      scenario.next();
    }
  },
  
  display: function()
  {
    if (this.type == "V") {
      scenario.mediaPlayer.type = 'V';
      scenario.activePlayer.play(this.getResourceLocation());
      this.setCaption();
    }
    else if (this.type == "I") {
       var theFrames = scenario.getFollowingImageFrames()
       scenario.imagePlayer.playImageSlideShow(theFrames);
      //scenario.activePlayer.play({frame:scenario.currentImage, duration:this.getDuration()});
    }
    
    else if (this.type == "A") {
      scenario.mediaPlayer.setVolume(100);
      scenario.mediaPlayer.type='A';
      scenario.mediaPlayer.play({
	url:this.getResourceLocation() ,
	duration:this.getDuration(),
  loop:true}); //audio, force mediaPlayer even if unseen
    }
  }
  
}
