$.fn.formData = function(){
    var data = {};
    var form = $(this);
    var types = {
        str: function(value){
            return value;
        },
        number: function(value){
            if(value){
                return Number(value);
            }
            else{
                return null;
            }
        },
        csv: function(value){
            var values = [];
            $.each(value.split(','), function(i, item){
                var value = item.replace(/^[\n\t ]*|[\n\t ]*$/g, '');
                if(value){
                    values.push(value)
                }
            });
            return values;
        }
    }
    form.find('textarea[name], input[name], select[name]').each(function(i, node){
        var input = $(node);
        var htmltype = input.attr('type')
        var type_name = input.attr('name').split(' ');
        if(type_name.length == 1){
            var name = type_name[0];
            var convert = types.str;
        }
        else{
            var name = type_name[1];
            var convert = types[type_name[0]];
        }

        if(htmltype == 'checkbox'){
            var count = form.find('input[name="' + input.attr('name') + '"]').length;
            if(count == 1){
                data[name] = input.attr('checked');
            }
            else{
                var items = data[name];
                if(!items){
                    items = data[name] = [];
                }
                
                if(input.attr('checked')){
                    items.push(convert(input.val()));
                }
            }
        }
        else if(htmltype == 'text'){
            data[name] = convert(input.val());
        }
        else if(htmltype == 'textarea'){
            data[name] = convert(input.val());
        }
        else if(htmltype == 'select-one'){
            data[name] = convert(input.val());
        }
        else if(htmltype == 'file'){
            if(input.attr('files').length){
                var file_data = input.attr('files')[0];
                var file_type = file_data.fileName.search(/\.\w+$/);
                data[name] = file_data.getAsDataURL();
            }
        }
    });
    return data;
}
