(function($) {
  var
  MV_current = null,
  MV_settings = null,
  MV_defaults = {
    response : null,
    jsontype : null,
    service : null,
    resetOnSuccess : true,
    setErrors : function(target, fielderrors, subseterrors) {
      if (fielderrors) {
        for (field in fielderrors) {
          target.find('[name=' + field + ']').parent().addClass('error');
        }
      }
      if (subseterrors) {
        var row, l;
        for (subset in subseterrors) {
          //                  for (row = 0, l = subseterrors[subset].length; row < l; row++ ) {
          for (row in subseterrors[subset]) {
            for (field in subseterrors[subset][row].data) {
              //                            target.find(':name(' + [subset, row, field].join(',') + ')').parent().addClass('error')
              }
          }
        }
      }
    },
    extraData : null//object, array or function
  },
  MF_closeonerror = function(error) {
    MV_current = null;
    if (error)
      alert(error);

  },

  MF_submit = function (target, settings) {
    if (MV_current) {
      if (!confirm("Oled juba vajutanud ning päringut teostatakse!\nKas oled kindel et soovid päringu uuesti teha?")) {
        return false;
      }
    }
    MV_current = target;
    MV_settings = settings;
    var data = {}, name;

    $(target).find('input[type=hidden], input[type=text], input[type=password], textarea, select').each(function() {
      if (!$(this).attr('disabled')) {
        name = $(this).attr('name');
        if (name) {
          val = $(this).val();
          data[name] = val? val : '';
        }
      }
    });
    $(target).find('input[type=radio]:checked').each(function() {
      if (!$(this).attr('disabled')) {
        name = $(this).attr('name');
        if (name) {
          val = $(this).val();
          data[name] = val? val : '';
        }
      }
    });
    $(target).find('input[type=checkbox]:checked').each(function() {
      if (!$(this).attr('disabled')) {
        name = $(this).attr('name');
        if (name) {
          val = $(this).val();
          data[name] = val? val : '';
        }
      }
    });

    if (MV_settings.extraData) {      
      data = $.extend({}, data, $.isFunction(MV_settings.extraData)? MV_settings.extraData.call() : MV_settings.extraData);
    }
    if (!MV_current) {
      $.loadingIndicator.init();
    }
    $.post((MV_settings.service? MV_settings.service : 'json.php?type=' + MV_settings.jsontype) +  '&_nocache=' + (new Date()).getTime(), data, function(j, status) {
      if (!MV_current) {
        MF_closeonerror("Süsteemi viga\n Palun lae leht uuesti.");
        return;
      }
      if (j.error) {
        target.before('<div class="msg_error"><p>' + j.error + '<p>' + (j.errortext? '<p>' + j.errortext + '</p>' : '') + '</div>');
        status = 'error';
      }

      if (j.fielderrors || j.subseterrors) {
        if (typeof MV_settings.setErrors == 'function')
          MV_settings.setErrors(MV_current, j.fielderrors || null, j.subseterrors || null);
        status = 'error';
      } else if (status == 'success') {
        if (MV_settings.resetOnSuccess)
          $(target).get(0).reset();
      }
      if ($.isFunction(MV_settings.response))
        MV_settings.response.call(this, status, j);
      MV_current = null;
      $.loadingIndicator.stop();
    }, 'json');
    target.find('.error').removeClass('error');
    target.parent().find('.msg_error').remove();

  };

  $.fn.jsonform = function(options){
    return this.each(function() {
      var target = $(this), s = $.extend({}, MV_defaults, options);
      if ($(target).get(0).tagName.toLowerCase() == 'form') {
        target.bind('submit', {
          settings: s
        }, function(e) {
          e.preventDefault();
          MF_submit($(this), e.data.settings);
        });
      }
    });
  };
})(jQuery);

