var FabulousForm = Class.create({
  initialize: function(forme_id, url, complete_func) {

    this.url           = url;
    this.form          = $(forme_id);
    this.parameters    = this.form.serialize(true);
    this.name          = null;
    this.submit_button = $(this.form.getInputs('submit')[0]);
    this.submit_button.init_value = this.submit_button.value;
    this.complete_func = complete_func;
  },
  setName: function(name)
  {
    this.name = name;
  },
  handleResponse: function(xhr, json)
  {
    /* ajax load hide*/
    hidewait();
  
    //v�rifier que le json est bon
     if(!json || !Object.inspect(json))
     {
       this.throwError('json incorrect');
     }

     var is_valid = json['params'].is_valid;
     //Le nom du formulaire
     this.setName(json['params'].name);
     var params   = json['params'];
     var errors   = json['errors'];

     //$('output-tester').update("le formulaire est valide ? :" + is_valid);

     if(is_valid)
       this.handleSuccess(params);
     else
       this.handleError(params, errors);
    },
  handleSuccess: function(params)
  {
    this.form.enable();
    //this.form.submit();
    eval(this.complete_func);
  },
  handleError: function(params, errors)
  {
      /* ajax load hide*/
      hidewaitfalse();
      
    //Clean erreures pr�c�dentes
    this.templateCleaner();
    //boucler les erreures et afficher les erreurs pr le debug
    /*
    var str = "";
    errors.each(function (err)
    {
      str += '//debug// => FIELD: ' + err.field + ' ERROR MSG: ' + err.error + '<br />';
    });
    $('output-tester').update(str);
    */
    //le id field est dans le json???
    form_name = this.name;
    //boucler les erreures
    errors.each(function (err)
    {
      //str += 'FIELD: ' + err.field + ' ERROR MSG: ' + err.error + '<br />';
      // on met en background rouge le fond des champs
      var field = '';
      var field = err.field_id;
      //on test l'existance de field dans DOM
      if($(field))
      {
        $(field).addClassName('fabulous_field_error');
        new Insertion.After($(field), '<div class="fabulous_field_error_msg"> ' + err.error + ' </div>');
      }
    });

    //shake da-submit-button
    //Le shake a le mm mouvement que le "non" => plus appropri� mais bug sur le callback, � v�rifier dans la nouvelle release 1.8.3 de scriptaculous http://prototype.lighthouseapp.com/projects/8887/tickets/41-effect-shake-afterfinish-not-supported
    this.submit_button.value = 'ошибка...!';

    Effect.Pulsate(this.submit_button, { duration : 1,
                               afterFinish: function(a_effect)
                               {
                                 a_effect.element.value = a_effect.element.init_value;
                               }
                             });
    //re enable le form
    this.form.enable();

    //donne le focus au premier element avec une erreure
    var first_field_to_focus = params['name'] + '_' + errors[0].field;
    $(first_field_to_focus).focus();
  },
  throwError: function(msg)
  {
    //@todo renvoyer sur une erreure globale formulaire
    alert(msg);
  },
  getFieldName: function(field)
  {
    alert(field);
    return this.name + '_' + field;
  },
  templateCleaner: function()
  {
    //Nettoyage des erreures pr�c�dentes
    var old_border = $$('.fabulous_field_error');
    old_border.each (function (item)
    { item.removeClassName('fabulous_field_error') })

    var old = $$('div.fabulous_field_error_msg');
    old.each (function (item)
    { item.remove() })
  }
});

function fabulous_submit()
{
  alert('feu!');
}
function fabulous_process(forme_id, url, complete_func)
{
  /* ajax load display */
  
  showwait();

  var fabForm = new FabulousForm(forme_id, url, complete_func);
  fabForm.form.disable();
  //On indique que l'on charge des donn�es
  fabForm.submit_button.value = 'проверка данных...';

  /*
  On pourrait remplacer le button par un ajax loader
  var submitbutton = fabForm.getInputs('submit')[0];
  <?php if(sfConfig::get('mod_sfajaxvalidationform_image_loader_enable')): ?>
    new Insertion.Before(submitbutton, '<?php echo image_tag(sfConfig::get('mod_sfajaxvalidationform_image_loader_path'), array('size'=>'128x15')); ?>');
  <?php endif; ?>
  submitbutton.hide()
  */

  //On appel la validation du formulaire
  var ajaxValidation = new Ajax.Request(
                                         fabForm.url,
                                         {
                                         method: 'post',
                                         parameters: fabForm.parameters,
                                         onComplete: function(xhr, json){
                                           fabForm.handleResponse(xhr, json)
                                           },
                                         onFailure: function() {ajax_form_error('Une erreure est survenue, Veuillez raffraichir la page');} // Si pb
                                       });
}