ns('Carib.Order.Data');

/**
 * Reader
 * 
 * @version $Id: data_reader.js 384 2009-06-25 14:17:42Z  $
 */
Carib.Order.Data.Reader = function(config) {
  // configurable {
  this.record_class = null; //required
  this.id_field = false;
  // }
  
  $.extend(this, config);
}

Carib.Order.Data.Reader.prototype = {
  /**
   * Read data 
   * 
   * @param {Object} data dataset specified by the loader
   * @param {Object} recordset recordset to save read data (by default creates new recordset)
   * @return {Object} recordset with read data
   */
  read: function(data, recordset) {
    if(!recordset)
      recordset = new Carib.Order.Data.Recordset();
    
    this._read(data, recordset);
    
    return recordset;
  },
  
  _read: function(data, recordset) {
    
  },
  
  /**
   * Create new record
   * 
   * @param {Object} values values to be set to a record
   * @param {Object} id record id or false if id is generated 
   */
  _createRecord: function(values) {
    var record = new this.record_class();
    if(values)
      record.importValues(values);
      
    return record;
  }
}


/**
 * Array reader
 */
Carib.Order.Data.ArrayReader = function(config) {
  Carib.Order.Data.ArrayReader.superclass.constructor.call(this, config);
}

utils.extend(Carib.Order.Data.ArrayReader, Carib.Order.Data.Reader, {
  _read: function(data, recordset) {
    for(var i = 0, l = data.length; i < l; i ++) {
      var record = this._createRecord(data[i]);
      if(this.id_field !== false)
        record.setId(record.get(this.id_field));
      recordset.add(record);
    }
  }
});


/**
 * Xml reader
 */
Carib.Order.Data.XmlReader = function(config) {
  // configurable {
  this.row_selector = 'row';
  // }  
  
  Carib.Order.Data.XmlReader.superclass.constructor.call(this, config);
}

utils.extend(Carib.Order.Data.XmlReader, Carib.Order.Data.Reader, {
  _read: function(data, recordset) {
    var _this = this;
    $(this.row_selector, data).each(function() {
      recordset.add(_this._readValues(this));
    });
  },
  
  _readValues: function($row) {
    var record = this._createRecord();
    $.each(record.data, function(name, value) {
      var $value = $(name, $row);
      if($value.length > 0)
        record.set(name, $value.text());
    });
    if(this.id_field !== false)
      record.setId(record.get(this.id_field));
      
    return record;
  }
});

