
  mForm = {};
  
  /**
   * Повесить ajax-обработчик на форму.
   * Дополнительные параметры:
   * - success Функция, вызываемая при удачной отправке формы. this: jQuery-объект контейнера формы
   * - onload Функция, вызываемая при инициализации формы. this: jQuery-объект контейнера формы
   * @param {String} modelName Имя модели формы
   * @param {Object} options Дополнительные параметры
   */
  mForm.ajaxifyForm = function (modelName, options) {
    options = options || {};
    options.success = options.success || function () { alert ('Спасибо, ваша заявка принята!'); };
    options.onload = options.onload || function () {};
    var container = $('.MFormModel_' + modelName);
    var form = container.find ('form');
    options.onload.apply (container);
    form.append ('<input type="hidden" name="ajax" value="1" />');
    var captchaImage = form.find ('img.captchaImage');
    var captchaSrc = captchaImage.attr ('src');
    var captchaField = form.find ('input.captchaField');
    function refreshCaptcha () {
      captchaImage.attr ('src', captchaSrc + '&_nocache=' + Math.random ());
      captchaField.val ('');
    }
    captchaImage.click (refreshCaptcha);
    form.find ('input').keydown (function () {
      $(this).removeClass ('error');
      $('label[for="' + $(this).attr ('id') + '"]').removeClass ('error');
    });
    form.ajaxForm ({
      dataType: 'json',
      beforeSubmit: function () {
        MWindow.showTrobber ();
      },
      success: function (data) {
        data.errorSummary = decodeURIComponent ((data.errorSummary + '').replace (/\+/g, '%20'));
        MWindow.hideTrobber ();
        form.find ('.error').removeClass ('error');
        container.find ('.errorSummaryWrapper').html (data.errorSummary);
        if (data.wrongFields.length > 0) {
          for (var i in data.wrongFields) {
            var id = modelName + '_' + data.wrongFields[i];
            form.find ('#' + id + ', label[for="' + id + '"]').addClass ('error');
          }
          refreshCaptcha ();
        } else {
          options.success.apply (container);
        }
      }
    });
  }
  
  /**
   * Сделать форму всплывающей
   * @param {String} modelName Имя модели формы
   * @param {String} triggers Селектор триггеров
   * @param {String} handlerUrl URL обработчика
   * @param {String} windowTitle Заголовок окна
   * @param {Object} options Дополнительные параметры для {@link mForm.ajaxifyForm}
   */
  mForm.windowizeForm = function (modelName, triggers, handlerUrl, windowTitle, options) {
    options = options || {};
    var window = new MWindow;
    window.title (windowTitle);
    var formHtml = null; // если null значит html еще и не загружали
    var ajaxified = false; // был ли навешен обработчик ajax
    function prepared () {
      window.show ();
    }
    function success () {
      window.hide ();
    }
    function loaded () {
      if (!ajaxified) {
        window.content (formHtml);
        options.success = success;
        mForm.ajaxifyForm (modelName, options);
        ajaxified = true;
      }
      prepared ();
    }
    function clicked () {
      if (formHtml === null) {
        MWindow.showTrobber ();
        $.ajax ({
          url: handlerUrl,
          success: function (data) {
            formHtml = data;
            MWindow.hideTrobber ();
            loaded ();
          }
        });
      } else {
        loaded ();
      }
    }
    $(triggers).click (function () {
      clicked ();
      return false;
    });
  }

















