jQuery.fn.deserialize = function(d, config)
{
	var data = d;
	var me = this;

	if (d == undefined)
	{
		return me;
	}

	config = jQuery.extend
	(
		{
			isPHPnaming : false
			, overwrite	: true
		}
		, config
	);

	if (d.constructor == Array)
	{
		data = {};

		for (var i=0; i < d.length; i++)
		{
			if (typeof data[d[i].name] != 'undefined')
			{
				if (data[d[i].name].constructor != Array)
				{
					data[d[i].name] = [data[d[i].name], d[i].value];
				}
				else
				{
					data[d[i].name].push( d[i].value );
				}
			}
			else
			{
				data[d[i].name] = d[i].value;
			}
		}
	}

	jQuery('input,select,textarea', me).each(function()
	{
		var p = this.name;
		var v = [];

		if (config.isPHPnaming)
		{
			p = p.replace(/\[\]$/,'');
		}

		if (p && data[p] != undefined)
		{
			v = (data[p].constructor == Array ? data[p] : [data[p]]);
		}

		if (config.overwrite === true || data[p])
		{
			switch (this.type || this.tagName.toLowerCase())
			{
				case "radio":
				case "checkbox":

					this.checked=false;

					for (var i=0; i < v.length; i++)
					{
						this.checked |= (this.value != '' && v[i] == this.value);
					}

					break;

				case "select-multiple" || "select":

					for (i=0; i < this.options.length; i++)
					{
						this.options[i].selected=false;

						for (var j=0; j < v.length; j++)
						{
							this.options[i].selected |= (this.options[i].value != '' && this.options[i].value == v[j]);
						}
					}

					break;

				case "button":
				case "submit":

					this.value = (v.length > 0 ? v.join(',') : this.value);
					break;

				default:

					this.value=v.join(',');
					break;
			}
		}
	});

	return me;
};
