(function(jQuery, undefined){
var push=Array.prototype.push,
rcheck=/^(?:radio|checkbox)$/i,
rplus=/\+/g,
rselect=/^(?:option|select-one|select-multiple)$/i,
rvalue=/^(?:button|color|date|datetime|datetime-local|email|hidden|month|number|password|range|reset|search|submit|tel|text|textarea|time|url|week)$/i;
function getElements(elements){
return elements.map(function(){
return this.elements ? jQuery.makeArray(this.elements):this;
}).filter(":input:not(:disabled)").get();
}
function getElementsByName(elements){
var current,
elementsByName={};
jQuery.each(elements, function(i, element){
current=elementsByName[ element.name ];
elementsByName[ element.name ]=current===undefined ? element :
(jQuery.isArray(current) ? current.concat(element):[ current, element ]);
});
return elementsByName;
}
jQuery.fn.deserialize=function(data, options){
var i, length,
elements=getElements(this),
normalized=[];
if(!data||!elements.length){
return this;
}
if(jQuery.isArray(data) ){
normalized=data;
}else if(jQuery.isPlainObject(data) ){
var key, value;
for(key in data){
jQuery.isArray(value=data[ key ]) ?
push.apply(normalized, jQuery.map(value, function(v){
return { name: key, value: v };})):push.call(normalized, { name: key, value: value });
}}else if(typeof data==="string"){
var parts;
data=data.split("&");
for(i=0, length=data.length; i < length; i++){
parts=data[ i ].split("=");
push.call(normalized, {
name: decodeURIComponent(parts[ 0 ].replace(rplus, "%20") ),
value: decodeURIComponent(parts[ 1 ].replace(rplus, "%20") )
});
}}
if(!(length=normalized.length) ){
return this;
}
var current, element, j, len, name, property, type, value,
change=jQuery.noop,
complete=jQuery.noop,
names={};
options=options||{};
elements=getElementsByName(elements);
if(jQuery.isFunction(options) ){
complete=options;
}else{
change=jQuery.isFunction(options.change) ? options.change:change;
complete=jQuery.isFunction(options.complete) ? options.complete:complete;
}
for(i=0; i < length; i++){
current=normalized[ i ];
name=current.name;
value=current.value;
if(!(element=elements[ name ]) ){
continue;
}
type=(len=element.length) ? element[ 0 ]:element;
type=(type.type||type.nodeName).toLowerCase();
property=null;
if(rvalue.test(type) ){
if(len){
j=names[ name ];
element=element[ names[ name ]=(j==undefined) ? 0:++j ];
}
change.call(element,(element.value=value) );
}else if(rcheck.test(type) ){
property="checked";
}else if(rselect.test(type) ){
property="selected";
}
if(property){
if(!len){
element=[ element ];
len=1;
}
for(j=0; j < len; j++){
current=element[ j ];
if(current.value==value){
change.call(current,(current[ property ]=true)&&value);
}}
}}
complete.call(this);
return this;
};})(jQuery);