+// https://github.com/jquery/jquery/blob/master/src/serialize.js\r
+function X_String_serialize( a, traditional ) {\r
+ var prefix,\r
+ list = [];\r
+\r
+ // If an array was passed in, assume that it is an array of form elements.\r
+ if ( X_Type_isArray( a ) && false ) {\r
+ // Serialize the form elements\r
+ //jQuery.each( a, function() {\r
+ // X_String_serialize_addParam( list, this.name, this.value );\r
+ //});\r
+\r
+ } else {\r
+ // If traditional, encode the 'old' way (the way 1.3.2 or older\r
+ // did it), otherwise encode params recursively.\r
+ for ( prefix in a ) {\r
+ X_String_serialize_buildParams( list, prefix, a[ prefix ], traditional );\r
+ }\r
+ }\r
+\r
+ // Return the resulting serialization\r
+ return list.join( '&' ).split( '%20' ).join( '+' );\r
+};\r
+\r
+function X_String_serialize_addParam( list, key, value ){\r
+ // If value is a function, invoke it and return its value\r
+ value = X_Type_isFunction( value ) ? value() : ( value == null ? '' : value );\r
+ list[ list.length ] = encodeURIComponent( key ) + '=' + encodeURIComponent( value );\r
+};\r
+\r
+function X_String_serialize_buildParams( list, prefix, obj, traditional ) {\r
+ var name;\r
+\r
+ if ( X_Type_isArray( obj ) ) {\r
+ // Serialize array item.\r
+ for( i = 0, l = obj.length; i < l; ++i ){\r
+ v = obj[ i ];\r
+ if ( traditional || prefix === '[]' ) {\r
+ // Treat each array item as a scalar.\r
+ X_String_serialize_addParam( list, prefix, v );\r
+\r
+ } else {\r
+ // Item is non-scalar (array or object), encode its numeric index.\r
+ X_String_serialize_buildParams(\r
+ list,\r
+ prefix + '[' + ( X_Type_isObject( v ) ? i : '' ) + ']',\r
+ v,\r
+ traditional\r
+ );\r
+ }; \r
+ };\r
+\r
+ } else\r
+ if ( !traditional && X_Type_isObject( obj ) ) {\r
+ // Serialize object item.\r
+ for ( name in obj ) {\r
+ X_String_serialize_buildParams( list, prefix + '[' + name + ']', obj[ name ], traditional );\r
+ };\r
+\r
+ } else {\r
+ // Serialize scalar item.\r
+ X_String_serialize_addParam( list, prefix, obj );\r
+ };\r
+};\r