DM.Validation.Markuper = iClass.create({
  initialize: function( args ) {
    this.table          = $( args.formTable );
    this.validationRows = args.validationRows;
    this.validationMsgs = args.validationMsgs;

    this.prepare();
  }, // initialize
  
  prepare: function() { 
    if ( this.table ) this.prepareTable();
    var msgs = {};
    for ( var i=0; i < this.validationMsgs.length; i++ ) {
      var msg  = this.validationMsgs[i];
      var name = this.validationRows[i];
      
      if ( msg.constructor != Array ) msg = [msg];
      msgs[name] = msg;
    } // for
    
    this.validationMsgs = msgs;
  }, // prepare
  
  prepareTable: function() {
    var rows = this.table.rows;
    var indx = [];
    
    var i = 0;
    var k = 0;
    
    var tBody = this.table.getElementsByTagName( 'TBODY' )[0];
    
    this.validation = {};
    this.msgRow     = {};
    this.msgCell    = {};
    
    while ( i < this.table.rows.length ) {
      var row = this.table.rows[i];
      if ( row.className == 'inputRow' ) {
        k++;
        var msgRow    = cr( 'TR' );
        hideElement( msgRow );
        
        var emptyCell = cr( 'TD' );
        var msgCell   = cr( 'TD' );
        
        emptyCell.innerHTML = '&nbsp;';
        
        msgRow.appendChild( emptyCell );
        msgRow.appendChild( msgCell );
        
        tBody.insertBefore( msgRow, row );

        i++;
        
        var rowName = this.validationRows[k-1];
        
        this.msgRow[rowName]  = msgRow;
        this.msgCell[rowName] = msgCell;
      } // if
      
      i++;
    } // while
  }, // prepareTable
  
  prepareMessages: function( failedOptions ) {
    for ( var key in failedOptions ) {
      var failedList = failedOptions[key];
      var cell = this.msgCell[key];
      removeChildren( cell );
        
      var msgObj = new DM.Validation.Msg();
      var msgs   = this.validationMsgs[key];
      
      for ( var i=0; i < failedList.length; i++ ) {
        if ( failedList[i] ) msgObj.errors.push( msgs[i] );
      } // for
      
      cell.appendChild( msgObj.markup() );
    } // for
  }, // prepareMessages
  
  update: function( failedOptions ) {
    var failed = false;
    
    var allOptions = {};
    for ( var key in failedOptions ) {
      var value = failedOptions[key];
      
      if ( value.constructor != Array ) value = [value];
      
      var keyFailed = false;
      for ( var i=0; i < value.length; i++ ) {
        keyFailed = keyFailed || value[i];
      } // for
      
      failedOptions[key] = keyFailed;
      allOptions[key]    = value;
    } // for
    
    this.prepareMessages( allOptions );
    
    for ( var key in failedOptions ) {
      failed = failed || failedOptions[key];
      
      if ( failedOptions[key] ) { 
        displayElement( this.msgRow[key] );
      } else {
        hideElement( this.msgRow[key] );
      } // if
    } // for
    
    return !failed;
  } // update
}); // DM.Validation.Markuper
