text: /**
   * @author Kyle Florence <kyle[dot]florence[at]gmail[dot]com>
   * @website https://github.com/kflorence/jquery-deserialize/
   * @version 1.1.0
   *
   * Dual licensed under the MIT and GPLv2 licenses.
   */
  
  (function( jQuery ) {
  
  var push = Array.prototype.push,
  	rcheck = /^(radio|checkbox)$/i,
  	rselect = /^(option|select-one|select-multiple)$/i,
  	rvalue = /^(hidden|text|search|tel|url|email|password|datetime|date|month|week|time|datetime-local|number|range|color|submit|image|reset|button|textarea)$/i;
  
  jQuery.fn.extend({
  	deserialize: function( data, callback ) {
  		if ( !this.length || !data ) {
  			return this;
  		}
  
  		var i, length,
  			elements = this[ 0 ].elements || this.find( ":input" ).get(),
  			normalized = [];
  
  		if ( !elements ) {
  			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 = decodeURIComponent( data ).split( "&" );
  
  			for ( i = 0, length = data.length; i < length; i++ ) {
  				parts = data[ i ].split( "=" );
  				push.call( normalized, { name: parts[ 0 ], value: parts[ 1 ] } );
  			}
  		}
  
  		if ( !( length = normalized.length ) ) {
  			return this;
  		}
  
  		var current, element, item, j, len, property, type;
  
  		for ( i = 0; i < length; i++ ) {
  			current = normalized[ i ];
  
  			if ( !( element = elements[ current.name ] ) ) {
  				continue;
  			}
  
  			type = ( len = element.length ) ? element[ 0 ] : element;
  			type = type.type || type.nodeName;
  			property = null;
  
  			if ( rvalue.test( type ) ) {
  				property = "value";
  			} else if ( rcheck.test( type ) ) {
  				property = "checked";
  			} else if ( rselect.test( type ) ) {
  				property = "selected";
  			}
  
  			// Handle element group
  			if ( len ) {
  				for ( j = 0; j < len; j++ ) {
  					item = element [ j ];
  
  					if ( item.value == current.value ) {
  						item[ property ] = true;
  					}
  				}
  			} else {
  				element[ property ] = current.value;
  			}
  		}
  
  		if ( jQuery.isFunction( callback ) ) {
  			callback.call( this );
  		}
  
  		return this;
  	}
  });
  
  })( jQuery );
  