1/** 2 * @author Kyle Florence <kyle[dot]florence[at]gmail[dot]com> 3 * @website https://github.com/kflorence/jquery-deserialize/ 4 * @version 1.2.1 5 * 6 * Dual licensed under the MIT and GPLv2 licenses. 7 */ 8(function( jQuery, undefined ) { 9 10var push = Array.prototype.push, 11 rcheck = /^(?:radio|checkbox)$/i, 12 rplus = /\+/g, 13 rselect = /^(?:option|select-one|select-multiple)$/i, 14 rvalue = /^(?:button|color|date|datetime|datetime-local|email|hidden|month|number|password|range|reset|search|submit|tel|text|textarea|time|url|week)$/i; 15 16function getElements( elements ) { 17 return elements.map(function() { 18 return this.elements ? jQuery.makeArray( this.elements ) : this; 19 }).filter( ":input:not(:disabled)" ).get(); 20} 21 22function getElementsByName( elements ) { 23 var current, 24 elementsByName = {}; 25 26 jQuery.each( elements, function( i, element ) { 27 current = elementsByName[ element.name ]; 28 elementsByName[ element.name ] = current === undefined ? element : 29 ( jQuery.isArray( current ) ? current.concat( element ) : [ current, element ] ); 30 }); 31 32 return elementsByName; 33} 34 35jQuery.fn.deserialize = function( data, options ) { 36 var i, length, 37 elements = getElements( this ), 38 normalized = []; 39 40 if ( !data || !elements.length ) { 41 return this; 42 } 43 44 if ( jQuery.isArray( data ) ) { 45 normalized = data; 46 47 } else if ( jQuery.isPlainObject( data ) ) { 48 var key, value; 49 50 for ( key in data ) { 51 jQuery.isArray( value = data[ key ] ) ? 52 push.apply( normalized, jQuery.map( value, function( v ) { 53 return { name: key, value: v }; 54 })) : push.call( normalized, { name: key, value: value } ); 55 } 56 57 } else if ( typeof data === "string" ) { 58 var parts; 59 60 data = data.split( "&" ); 61 62 for ( i = 0, length = data.length; i < length; i++ ) { 63 parts = data[ i ].split( "=" ); 64 push.call( normalized, { 65 name: decodeURIComponent( parts[ 0 ].replace( rplus, "%20" ) ), 66 value: decodeURIComponent( parts[ 1 ].replace( rplus, "%20" ) ) 67 }); 68 } 69 } 70 71 if ( !( length = normalized.length ) ) { 72 return this; 73 } 74 75 var current, element, j, len, name, property, type, value, 76 change = jQuery.noop, 77 complete = jQuery.noop, 78 names = {}; 79 80 options = options || {}; 81 elements = getElementsByName( elements ); 82 83 // Backwards compatible with old arguments: data, callback 84 if ( jQuery.isFunction( options ) ) { 85 complete = options; 86 87 } else { 88 change = jQuery.isFunction( options.change ) ? options.change : change; 89 complete = jQuery.isFunction( options.complete ) ? options.complete : complete; 90 } 91 92 for ( i = 0; i < length; i++ ) { 93 current = normalized[ i ]; 94 95 name = current.name; 96 value = current.value; 97 98 if ( !( element = elements[ name ] ) ) { 99 continue; 100 } 101 102 type = ( len = element.length ) ? element[ 0 ] : element; 103 type = ( type.type || type.nodeName ).toLowerCase(); 104 property = null; 105 106 if ( rvalue.test( type ) ) { 107 if ( len ) { 108 j = names[ name ]; 109 element = element[ names[ name ] = ( j == undefined ) ? 0 : ++j ]; 110 } 111 112 change.call( element, ( element.value = value ) ); 113 114 } else if ( rcheck.test( type ) ) { 115 property = "checked"; 116 117 } else if ( rselect.test( type ) ) { 118 property = "selected"; 119 } 120 121 if ( property ) { 122 if ( !len ) { 123 element = [ element ]; 124 len = 1; 125 } 126 127 for ( j = 0; j < len; j++ ) { 128 current = element[ j ]; 129 130 if ( current.value == value ) { 131 change.call( current, ( current[ property ] = true ) && value ); 132 } 133 } 134 } 135 } 136 137 complete.call( this ); 138 139 return this; 140}; 141 142})( jQuery );
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.