String.prototype.trim = function() { 
  return this.replace(/^\s+|\s+$/, ''); 
}

var FormObserver = Class.create({
  
  form          : null,
  submit_errors : null,
  message_ok    : '<h2>Ваш запрос был успешно отправлен. Мы свяжемся с вами в ближайшее время.</h2>',
  duration      : 1.5,
  request_url   : '/mailApi/',
  message_search : null,
  
  initialize: function(form) {
    this.form = form;
    if (this.form.name == 'search-simple') {
      this.message_search = this.form.search.value;
      Event.observe(this.form, 'submit', this._submit_search.bindAsEventListener(this));
      Event.observe(this.form.search, 'blur', this._search_text_trace.bindAsEventListener(this));
      Event.observe(this.form.search, 'focus', this._search_text_trace.bindAsEventListener(this));
    } else {
      Event.observe(this.form, 'submit', this._submit_form.bindAsEventListener(this));
      
      // fix corner on contact form
      if (this.form.name == 'contact') {
        var contact_div = this.form.select('div')[0];
        var pos = contact_div.cumulativeOffset();
        $('contact_corner').setStyle({
          left: pos.left + contact_div.getWidth() - $('contact_corner').getWidth(),
          top: pos.top
        });
      }
    }
    return;
  },
  
  _search_text_trace: function(event) {
    var search = Event.element(event);
    switch (event.type) {
      case 'focus':
        if (search.value.trim() == this.message_search) {
          search.value = '';
          search.setStyle({ color: 'black' });
        }
        break;
      case 'blur':
        if (search.value.trim() == '') {
          search.value = this.message_search;
          search.setStyle({ color: 'gray' });
        }
        break;
    }
    return;
  },
  
  _submit_search: function(event) {
    if (this.form.search.value == this.message_search) {
      alert('Введите слово или фразу для начала поиска!');
      Event.stop(event);
    }
    return;
  },
  
  _submit_form: function(event) {
    Event.stop(event);
    
    this.submit_errors = new Array();
    this['_check_' + this.form.name]();
    
    if (this.submit_errors.length > 0) {
      alert('Заполните следующую информацию:\n' + this.submit_errors.join('\n'));
      return;
    }
    
    // send request on mail
    new Ajax.Request(this.request_url, {
      parameters : this.form.serialize()
    });
    
    var upper_div = this.form.up('div');
    upper_div.insert({before: this.message_ok});
    upper_div.previous('h2').hide();
    
    this.performEffects(upper_div);
    
    return;
  },
  
  _check_join: function() {
    var i = 0;
    
    if (this.form.getInputs('text', 'fname')[0].getValue().trim() == '')
      this.submit_errors[i++] = '- Имя не может быть оставлено незаполненным';
      
    if (this.form.getInputs('text', 'phone')[0].getValue().trim() == '' && 
        this.form.getInputs('text', 'email')[0].getValue().trim() == '')
      this.submit_errors[i++] = '- Укажите ваши контактные данные';
      
    return;
  },
  
  _check_contact: function() {
    var i = 0;
    if (this.form.getInputs('text', 'email')[0].getValue().trim() == '')
      this.submit_errors[i++] = '- Укажите ваши контактные данные';
    return;
  },
  
  performEffects: function(upper_div) {
    
    upper_div.setStyle({
      width:  upper_div.getWidth() + 'px',
      height: upper_div.getHeight() + 'px'
    });
    
//     hide corner of the contact form
    if (this.form.name == 'contact') {
      $('contact_corner').hide();
    }
    
    new Effect.Parallel([
      new Effect.Fade(upper_div, {
        sync: true
      }), 
      new Effect.BlindUp(upper_div, {
        sync: true,
        afterFinish: function(event) {
          
          new Effect.Parallel([
            new Effect.Appear(event.element.previous('h2'), {
              sync: true
            }), 
            new Effect.BlindDown(event.element.previous('h2'), {
              sync: true
            })
          ], { 
            duration: this.duration
          });
          
        }
      })
    ], { 
      duration: this.duration
    });
  }
  
});

Event.observe(window, 'load', function () {
  
  var forms = $$('form');
  
  if (forms.length > 0) {
    for (var i = 0; i<forms.length; i++) {
      if (['join', 'contact', 'search-simple'].indexOf(forms[i].name) != -1)
        new FormObserver(forms[i]);
    }
  }
  return;
});
