/*!
 * Goodar
 * @author    Vyacheslav Voronchuk
 * @date      25.12.2009 
 * Copyright(c) 2009, by Vyacheslav Voronchuk
 */

Goodar.Form = Ext.extend(Ext.util.Observable, {
  
  //данные формы
  values: {},
  
  //наличие ошибок в форме
  error: false,
  
  
  //предварительная настройка класса
  constructor: function(config)
  {
    for(value in config)
      this[value] = config[value];
    
    this.form = Ext.get(this.id);

    Goodar.Form.superclass.constructor.call(this);
    
    this.showLabels();    
    Goodar.Manager.addCmp(this.id, this);
  },
  
  //показываем все метки
  showLabels: function()
  {
    this.form.select('input').each(function(oItem) 
    {
      if(oItem.dom.name) 
      {
        var oLabelValue = oItem.dom.attributes.getNamedItem('gdr:label');
        if(oLabelValue)
        {
          var oLabel = document.getElementById('label-' + oItem.dom.name);
          if(oLabel)
            oLabel.innerHTML = oLabelValue.nodeValue;
        }
      }
    }, this);
  },  
  
  //собираем данные и сохраняем в эллемент
  getValues: function()
  {
    this.error = false;
    
    this.form.select('input').each(function(oItem) 
    {      
      if(oItem.dom.name) 
      {
        switch(oItem.dom.type)
        {
          case 'radio':
            if(oItem.dom.checked)            
              this.values[oItem.dom.name] = oItem.dom.value;
            break;
            
          case 'checkbox':
            if(oItem.dom.checked)            
              this.values[oItem.dom.name] = oItem.dom.value;
            else
              this.values[oItem.dom.name] = false;
            break;
          
          default:
            if(this.validate(oItem.dom) == true)
              this.values[oItem.dom.name] = oItem.dom.value;
            else
              this.error = true;
            break;
        }
      }
    }, this);
  },
    
  //проверка данных
  validateType: 'default',
  validate: function(oItem)
  {
    if(!this.validatePassword(oItem))
      return false;
    
    var template = oItem.attributes.getNamedItem('gdr:tpl');
    if(!template)
      return this.valid(oItem);
    else
      template = eval(template.nodeValue);
    
    if(template.test(oItem.value))
      return this.valid(oItem);
    
    switch(this.validateType)
    {
      case 'tooltip': 
        var oLabel = Ext.get('label-' + this.id + '-' + oItem.name);
        if(oLabel)
        {
          oLabel.dom.innerHTML = oItem.attributes.getNamedItem('gdr:fail').nodeValue;
          oLabel.setStyle({ display: '' });
          oLabel.setStyle.defer(2000, oLabel, [{ display: 'none' }]);
          break;
        }
        
        Ext.DomHelper.append(oItem.parentNode, { tag: 'div', cls: 'errortooltip', id: 'label-' + this.id + '-' + oItem.name, html: oItem.attributes.getNamedItem('gdr:fail').nodeValue });
        oLabel = Ext.get('label-' + this.id + '-' + oItem.name);
        Ext.get(oItem).on('mouseenter', function(event, item) {
          this.setStyle({ display: '' });
          this.setStyle.defer(2000, this, [{ display: 'none' }]);
        }, oLabel);
        Ext.get(oItem).on('mouseleave', function(event, item) {
          this.setStyle({ display: 'none' });
        }, oLabel);    
        break;
      
      default:
        var oLabel = Ext.get('label-' + oItem.name);
        if(oLabel)
        {
          oLabel.addClass('alert');
          oLabel.dom.innerHTML = oItem.attributes.getNamedItem('gdr:fail').nodeValue;
        }
        break;
    }
    return false;
  },
  
  //проверка пароля
  validatePassword: function(oItem)
  {
    if(oItem.name === 'password_confirm')
    {
      if(oItem.form['password'].value !== oItem.value)
      {
        this.setErrorLabel('password_confirm', oItem.attributes.getNamedItem('gdr:fail').nodeValue);
        return false;
      }
    }
    return true;
  },
  
  //исправляем поле, если нет ошибок
  valid: function(oItem)
  {
    //удаляем тултип с ошибкой
    if(this.validateType === 'tooltip')
    {
      var oLabel = Ext.get('label-' + this.id + '-' + oItem.name);
      if(oLabel)
        oLabel.remove();
      return true;
    }

    var oLabel = Ext.get('label-' + oItem.name);
    if(!oLabel)
      return true;
    
    var oDefault = oItem.attributes.getNamedItem('gdr:label');
    if(oDefault)
      oLabel.dom.innerHTML = oDefault.nodeValue;
    else
      oLabel.dom.innerHTML = '';
    
    if(oLabel.hasClass('alert'))
      oLabel.removeClass('alert');    
    
    return true;
  },  
  
  //установка метки
  setLabel: function(field, message)
  {
    var oLabel = Ext.get('label-' + field);
    if(oLabel)
    {
      if(oLabel.hasClass('alert'))
        oLabel.removeClass('alert');
      oLabel.dom.innerHTML = message;
    }
  },  
  
  //установка метки c ошибкой
  setErrorLabel: function(field, message)
  {
    switch(this.validateType)
    {
      case 'tooltip': 
        var oItem = this.form.dom[field];
        var oLabel = Ext.get('label-' + this.id + '-' + field);
        if(oLabel)
        {
          oLabel.dom.innerHTML = message;
          oLabel.setStyle({ display: '' });
          oLabel.setStyle.defer(2000, oLabel, [{ display: 'none' }]);
          break;
        }
          
        Ext.DomHelper.append(oItem.parentNode, { tag: 'div', cls: 'errortooltip', id: 'label-' + this.id + '-' + oItem.name, html: message ? message : oItem.attributes.getNamedItem('gdr:fail').nodeValue });
        oLabel = Ext.get('label-' + this.id + '-' + oItem.name);
        oLabel.setStyle.defer(2000, oLabel, [{ display: 'none' }]);
        Ext.get(oItem).on('mouseenter', function(event, item) {
          this.setStyle({ display: '' });
          this.setStyle.defer(2000, this, [{ display: 'none' }]);
        }, oLabel);
        Ext.get(oItem).on('mouseleave', function(event, item) {
          this.setStyle({ display: 'none' });
        }, oLabel);   
        break;
        
      default:
        var oLabel = Ext.get('label-' + field);
        if(oLabel)
        {
          if(!oLabel.hasClass('alert'))
            oLabel.addClass('alert');
          oLabel.dom.innerHTML = message;
        }
        break;
    }   
  },
   
  //отправка данных
  submit: function()
  {
    this.getValues();
    if(this.error)
      return false; 
    
    if(this.normalSubmit)
      this.submitNormal.call(this);   
    else
      this.submitAjax.call(this);   
  },  
  //отправка данных аяксом
  submitAjax: function()
  {
    this.values['ajax_submit'] = true;
    Ext.Ajax.request
    ({
      url: this.url,
      params: this.values,
      scope: this,
      success: function(response, options)
      {
        var oResponse = Ext.decode(response.responseText);
        if(oResponse.success == true)
        {
          if(this.onSuccess)
            this.onSuccess.call(this, oResponse);
        }
        else
        {
          if(this.onFailure)
            this.onFailure.call(this, oResponse);
        }
      },
      failure: function(response, options)
      {
        var oResponse = Ext.decode(response.responseText);
        if(this.onFailure)
          this.onFailure.call(this, oResponse);
      }
    });
  },
  //отправка данных стандартным методом
  submitNormal: function()
  {
    this.form.dom.submit();
  }  
});