/*
 * <copyright>
 *  Copyright (c) 2001 by Hyperwave AG
 * </copyright>
 *
 * <file>
 *  Name:        IterateCmd.js
 *  Created:     2001-01-14
 *  $Id: IterateCmd.js,v 1.4 2003/07/03 08:05:58 mmair Exp $
 * </file>
 */

initPackage ( "com.hyperwave.res" );
loadClass ( "com.hyperwave.res.ResourceException" );
loadClass ( "com.hyperwave.res.ScopedMap" );

//----------------------------------------------------------------------
/**
 * Defines the behaviour of a template's iterate command.
 */
// <JSClass Name="com.hyperwave.res.IterateCmd">

  //--------------------------------------------------------------------
  /**
   * Construct the for command node.
   * @see com.hyperwave.res.AbstractCmd
   */
  com.hyperwave.res.IterateCmd = function ( aParam )
  {
    if ( aParam == "__proto__" )
      return;

    this.base$ = com.hyperwave.res.AbstractCmd;
    this.base$ ( aParam );
    delete this.base$;

    /**
     * Holds the parsed placeholder or null in case of invalid placeholder 
     */
    this.parsedPHolder_ =  
      com.hyperwave.res.Template.static_.parsePH ( this.expression_ );

    /**
     * Error flag is set when supplied placeholder is invalid
     */
    if ( this.parsedPHolder_ == null )      
      this.error_ = new com.hyperwave.res.ResourceException (
        "com.hyperwave.res.IterateCmd: Invalid placeholder '" +
        this.dataPHolder_ + "'." );
}
  class$ = doInherit ( com.hyperwave.res.IterateCmd, 
                       com.hyperwave.res.AbstractCmd );

  //--------------------------------------------------------------------
  /**
   * Parses the rest of the <code>for</code> command. This is done
   * by finding the next <code>endfor</code>.
   * @see com.hyperwave.res.AbstractCmd#doParse
   */
  class$.doParse = function ( theTemplateTail )
  {
    this.forBodyTemplate_ = 
      new com.hyperwave.res.Template 
        ( { templateString_: theTemplateTail } );
    var state = 
      this.forBodyTemplate_.continueParse ( theTemplateTail, { enditerate:true, elseiterate:true } );

    if ( state.error_ )
      return state;

    if ( state.parsedEndCmd_ == "elseiterate" )
    {
      this.elseBodyTemplate_ =
        new com.hyperwave.res.Template 
          ( { templateString_: state.textTail_ } );
      state = 
        this.elseBodyTemplate_.continueParse ( state.textTail_, { enditerate:true } );
    }

    if ( state.error_ )
      return state;

    if ( state.parsedEndCmd_ == null )
    {
      state.textTail_ = theTemplateTail;
      state.error_ = new com.hyperwave.res.ResourceException ( 
        "com.hyperwave.res.IterateCmd: Could not find *enditerate* statement." );
      return state;
    }

    return state;
  }

  //--------------------------------------------------------------------
  /**
   * Executes the command in the given environment. This means 
   * that the data placeholder is evaluated and iterated in this
   * case.
   * @see com.hyperwave.res.AbstractCmd#execCmd
   */
  class$.execCmd = function ( theEnv )
  {
    var ScopedMap = com.hyperwave.res.ScopedMap;
    var array = theEnv.get ( this.parsedPHolder_ );
    var iterate_map = {};
    var iterate_env = new ScopedMap ( theEnv, iterate_map );
    var line_ctr = 0;
    var out_array = [];

    if ( array == null )
      return this.elseBodyTemplate_.fill ( theEnv );

    for ( var i in array )
    {
      if ( i == "key" || i == "line" || i == "value" || i == "even" )
        continue;
      ++line_ctr;
      row_data = array [i];
      iterate_map.key = i;
      iterate_map.value = array [i];
      iterate_map.even = (line_ctr & 0x01) ? "" : "1";
      iterate_map.line = line_ctr;
      var for_env = new ScopedMap ( iterate_env, row_data );
      out_array [out_array.length] = this.forBodyTemplate_.fill ( for_env );
    }

    if (line_ctr == 0)
      return this.elseBodyTemplate_.fill ( theEnv );
      
    return out_array.join ("");
  }

// </JSClass>
//----------------------------------------------------------------------

/* End of "com.hyperwave.res.IterateCmd.js" */

