ns('Carib.Order.Widgets');

/**
 * Form panel
 * 
 * @version $Id: form_panel.js 865 2010-03-19 17:01:03Z  $
 */
Carib.Order.Widgets.FormPanel = function(config) {
  this.record = null;
  this.fields = [];
  this.updating = false;
  
  // configurable {
  this.validator = null;
  // }

  Carib.Order.Widgets.FormPanel.superclass.constructor.call(this, config);
}

utils.extend(Carib.Order.Widgets.FormPanel, Carib.Order.Widgets.Panel, {
  init: function() {
    Carib.Order.Widgets.FormPanel.superclass.init.call(this);
    
    this._initFields();
    
    if(this.record)
      this.updateFields();
  },
  
  _initFields: function() {
    for(var i = 0, l = this.fields.length; i < l; i ++) {
      this.fields[i].selector = '#' + this.getId() + ' ' + this.fields[i].selector;
      this.fields[i].init();
    }
  },
  
  getValidator: function() {
    return this.validator;
  },
  
  setRecord: function(record) {
    this.record = record;
    //this.updateFields();
  },
  
  getRecord: function() {
    return this.record;
  },
  
  updateFields: function() {
    if(!this.record)
      return;
      
    this.updating = true;
    this._updateFields();
    this.updating = false;
  },
  
  _updateFields: function() {
    for(var i = 0, l = this.fields.length; i < l; i ++) {
      var field = this.fields[i];
      if(this.record.has(field.getName()))
        field.setValue(this.record.get(field.getName()));
    }
  },
  
  updateRecord: function() {
    if(!this.record)
      return;
      
    for(var i = 0, l = this.fields.length; i < l; i ++) {
      var field = this.fields[i];
      if(this.record.has(field.getName()))
        this.record.set(field.getName(), field.getValue());
    }
  },
  
  getField: function(name) {
    var num = this.findField(name);
    return num !== false ? this.getFieldByNum(num) : null;
  },  
  
  findField: function(name) {
    for(var i = 0, l = this.fields.length; i < l; i ++) {
      if(this.fields[i].getName() == name)
        return i;
    }
    return false;
  },
  
  getValue: function(name) {
    var field = this.getField(name);
    return field ? field.getValue() : null;
  },
  
  getFieldByNum: function(num) {
    return this.fields[num];
  }, 
  
  getErrors: function(errors) {
    if(!errors)
      errors = new Carib.Order.Validation.ErrorsContainer();
      
    if(this.validator) 
      this.validator.validate(this, errors);
      
    return errors;
  },
  
  validate: function() {
    if(!this.validator)
      return true;
      
    var errors = this.validator.validate(this);
    if(errors.isValid())
      return true;
      
    var messages = '- ' + errors.getAllMessages().join("\r\n- ");
    alert('Не все данные введены правильно: \r\n' + messages);
    
    return false;
  }  
});

