| 355 | |
| 356 | // utility fn for deep serialization |
| 357 | function deepSerialize(extraData) { |
| 358 | var serialized = $.param(extraData, options.traditional).split('&'); |
| 359 | var len = serialized.length; |
| 360 | var result = []; |
| 361 | var i, part; |
| 362 | |
| 363 | for (i = 0; i < len; i++) { |
| 364 | // #252; undo param space replacement |
| 365 | serialized[i] = serialized[i].replace(/\+/g, ' '); |
| 366 | part = serialized[i].split('='); |
| 367 | // #278; use array instead of object storage, favoring array serializations |
| 368 | result.push([decodeURIComponent(part[0]), decodeURIComponent(part[1])]); |
| 369 | } |
| 370 | |
| 371 | return result; |
| 372 | } |
| 373 | |
| 374 | // XMLHttpRequest Level 2 file uploads (big hat tip to francois2metz) |
| 375 | function fileUploadXhr(a) { |