(function($)
{
	$.fn.serializeObject = function()
	{
		var $this = $(this),		
			item = {},
			val,
			field;

		var fields = this.map(function(){
			return this.elements ? jQuery.makeArray( this.elements ) : this;
		}).get();
		
		var fields_length = fields.length;
		
		for (i = 0; i < fields_length; i++)
		{
			field = fields[i];
			
			if(field.name && !field.disabled && ( field.checked || ( /^(?:select|textarea|input)/i.test( field.nodeName ) && !/^(?:checkbox|radio)/i.test( field.type ) ) ) )
			{
				val = $(field).val();
				
				if (item[field.name] !== undefined) 
				{
					if (!item[field.name].push)
					{
						item[field.name] = [item[field.name]];
					}
					
					if(val.length)
					{
						jQuery.merge( item[field.name], val );
					}
					else
					{
						item[field.name].push(val);
					}
				}
				else
				{
					item[field.name] = val;
				}
			}
		}
		
		return item;
		
		/*
		.each(function(){
			if(this.name && !this.disabled && ( this.checked || /^(?:select|textarea|input)/i.test( this.nodeName ) ) )
			{
				val = $(this).val();
				jQuery.merge( ret, array );
				
				if (item[this.name] !== undefined) {
					if (!item[this.name].push) {
						item[this.name] = [item[this.name]];
					}
					
					if(val.length)
					{
						jQuery.merge( item[this.name], val );
					}
					else
					{
						item[this.name].push(val);
					}
				} else {
					item[this.name] = val;
				}
			}
		});
		*/
	};
})(jQuery);
