(function($){
  $.fn.formObject = function() {
    var data = this.serializeArray();
    var ret = {};
    var indexes = {cnt: 0, children: {}};
    for (var d in data) {
      var first = data[d].name.match(/([^\[]+)/)[1];
      var keys = data[d].name.match(/\[.*?\]/g);
      var _keys = [first];
      for (var i in keys) {
        _keys.push(keys[i].match(/\[(.*)\]/)[1]);
      }
      var ref = ret;
      var refIndexes = indexes;
      for (var i in _keys) {
        var ix = _keys[i];
        if (ref[ix] == undefined) {
          if (ix.length == 0) {
            ix = refIndexes.cnt;
          }
          if(_keys.length-1 == i) {
            ref[ix] = data[d].value;
          } else {
            ref[ix] = {};
            if (refIndexes.children[ix] == undefined) {
              refIndexes.children[ix] = {cnt: 0, children: {}};
            }
          }
          refIndexes.cnt++;
        }
        ref = ref[ix];
        refIndexes = refIndexes.children[ix];
      }
    }
    return ret;
  }
})(jQuery);
