/**
 * Serializators
 * 
 * @version $Id: serialization.js 398 2009-07-02 15:05:36Z  $
 */

ns('Carib.Order.Data.Serializators');


/**
 * Record serializator
 */
Carib.Order.Data.Serializators.Record = function(config) {
  // configurable {
  this.name = '';
  this.result = {};
  // }
  
  $.extend(this, config);
}

Carib.Order.Data.Serializators.Record.prototype = {
  serialize: function(record) {
    var _this = this;
    $.each(record.data, function(name) {
      _this._addValueToResult(record, name);
    });
    return this.result;
  },
  
  _serializeValue: function(record, name) {
    var value = record.get(name);
    if(value instanceof Date)
      value = $.strftime('%d.%m.%Y', value);
    else if(value === false)
      value = 0;
    else if(value === true)
      value = 1;
      
    return value;
  },
  
  _addValueToResult: function(record, name) {
    this.result[this._generateFullName(name)] = this._serializeValue(record, name);
  },
  
  _generateFullName: function(name) {
    return this.name + '[' + name + ']';
  },
  
  getResult: function() {
    return this.result;
  }
}


/**
 * Recordset serializator
 */
Carib.Order.Data.Serializators.Recordset = function(config) {
  // configurable {
  this.name = '';
  this.result = {};
  // }
  
  $.extend(this, config);
}

Carib.Order.Data.Serializators.Recordset.prototype = {
  serialize: function(recordset, record_serializator_class) {
    recordset.each(function(i, record) {
      this._serializeRecord(record, record_serializator_class);
    }, this);
  },
  
  _serializeRecord: function(record, serializator_class) {
    var serializator = new serializator_class({
      result: this.result,
      name: this._generateFullName(record)
    });
    serializator.serialize(record);
  },
  
  _generateFullName: function(record) {
    return this.name + '[' + record.getId() + ']';
  }
}


/**
 * Order serializator
 * 
 * @param {Object} config
 */
Carib.Order.Data.Serializators.Order = function(config) {
  Carib.Order.Data.Serializators.Order.superclass.constructor.call(this, config);  
}

utils.extend(Carib.Order.Data.Serializators.Order, Carib.Order.Data.Serializators.Record, {
  _addValueToResult: function(record, name) {
    if(name == 'residence')
      this._addResidenceToResult(record);
    else 
      Carib.Order.Data.Serializators.Order.superclass._addValueToResult.call(this, record, name);
  },
  
  _addResidenceToResult: function(record) {
    var serializator = new Carib.Order.Data.Serializators.Residence({
      result: this.result,
      name: this.name + '[residence]'
    });
    serializator.serialize(record.get('residence'));
  }  
});


Carib.Order.Data.Serializators.Residence = function(config) {
  Carib.Order.Data.Serializators.Residence.superclass.constructor.call(this, config);
}

utils.extend(Carib.Order.Data.Serializators.Residence, Carib.Order.Data.Serializators.Record, {
  _addValueToResult: function(record, name) {
    if(name == 'excursions')
      this._addExcursionsToResult(record);
    else
      Carib.Order.Data.Serializators.Residence.superclass._addValueToResult.call(this, record, name);
  },
  
  _addExcursionsToResult: function(record) {
    var serializator = new Carib.Order.Data.Serializators.Recordset({
      result: this.result,
      name: this.name + '[excursions]'
    });
    serializator.serialize(record.get('excursions'), Carib.Order.Data.Serializators.Record);    
  }  
});

