| 13 | | (function($,undefined){ |
| 14 | | '$:nomunge'; // Used by YUI compressor. |
| 15 | | |
| 16 | | $.fn.serializeObject = function(){ |
| 17 | | var obj = {}; |
| 18 | | |
| 19 | | $.each( this.serializeArray(), function(i,o){ |
| 20 | | var n = o.name, |
| 21 | | v = o.value; |
| 22 | | |
| 23 | | obj[n] = obj[n] === undefined ? v |
| 24 | | : $.isArray( obj[n] ) ? obj[n].concat( v ) |
| 25 | | : [ obj[n], v ]; |
| 26 | | }); |
| 27 | | |
| 28 | | return obj; |
| | 17 | // CommonJS |
| | 18 | else if (typeof exports !== "undefined") { |
| | 19 | var $ = require("jquery"); |
| | 20 | factory(exports, $); |
| | 21 | } |
| | 22 | |
| | 23 | // Browser |
| | 24 | else { |
| | 25 | factory(root, (root.jQuery || root.Zepto || root.ender || root.$)); |
| | 26 | } |
| | 27 | |
| | 28 | }(this, function(exports, $) { |
| | 29 | |
| | 30 | var patterns = { |
| | 31 | validate: /^[a-z_][a-z0-9_]*(?:\[(?:\d*|[a-z0-9_]+)\])*$/i, |
| | 32 | key: /[a-z0-9_]+|(?=\[\])/gi, |
| | 33 | push: /^$/, |
| | 34 | fixed: /^\d+$/, |
| | 35 | named: /^[a-z0-9_]+$/i |
| 30 | | |
| 31 | | })(jQuery); |
| | 37 | |
| | 38 | function FormSerializer(helper, $form) { |
| | 39 | |
| | 40 | // private variables |
| | 41 | var data = {}, |
| | 42 | pushes = {}; |
| | 43 | |
| | 44 | // private API |
| | 45 | function build(base, key, value) { |
| | 46 | base[key] = value; |
| | 47 | return base; |
| | 48 | } |
| | 49 | |
| | 50 | function makeObject(root, value) { |
| | 51 | |
| | 52 | var keys = root.match(patterns.key), k; |
| | 53 | |
| | 54 | // nest, nest, ..., nest |
| | 55 | while ((k = keys.pop()) !== undefined) { |
| | 56 | // foo[] |
| | 57 | if (patterns.push.test(k)) { |
| | 58 | var idx = incrementPush(root.replace(/\[\]$/, '')); |
| | 59 | value = build([], idx, value); |
| | 60 | } |
| | 61 | |
| | 62 | // foo[n] |
| | 63 | else if (patterns.fixed.test(k)) { |
| | 64 | value = build([], k, value); |
| | 65 | } |
| | 66 | |
| | 67 | // foo; foo[bar] |
| | 68 | else if (patterns.named.test(k)) { |
| | 69 | value = build({}, k, value); |
| | 70 | } |
| | 71 | } |
| | 72 | |
| | 73 | return value; |
| | 74 | } |
| | 75 | |
| | 76 | function incrementPush(key) { |
| | 77 | if (pushes[key] === undefined) { |
| | 78 | pushes[key] = 0; |
| | 79 | } |
| | 80 | return pushes[key]++; |
| | 81 | } |
| | 82 | |
| | 83 | function encode(pair) { |
| | 84 | switch ($('[name="' + pair.name + '"]', $form).attr("type")) { |
| | 85 | case "checkbox": |
| | 86 | return pair.value === "on" ? true : pair.value; |
| | 87 | default: |
| | 88 | return pair.value; |
| | 89 | } |
| | 90 | } |
| | 91 | |
| | 92 | function addPair(pair) { |
| | 93 | if (!patterns.validate.test(pair.name)) return this; |
| | 94 | var obj = makeObject(pair.name, encode(pair)); |
| | 95 | data = helper.extend(true, data, obj); |
| | 96 | return this; |
| | 97 | } |
| | 98 | |
| | 99 | function addPairs(pairs) { |
| | 100 | if (!helper.isArray(pairs)) { |
| | 101 | throw new Error("formSerializer.addPairs expects an Array"); |
| | 102 | } |
| | 103 | for (var i=0, len=pairs.length; i<len; i++) { |
| | 104 | this.addPair(pairs[i]); |
| | 105 | } |
| | 106 | return this; |
| | 107 | } |
| | 108 | |
| | 109 | function serialize() { |
| | 110 | return data; |
| | 111 | } |
| | 112 | |
| | 113 | function serializeJSON() { |
| | 114 | return JSON.stringify(serialize()); |
| | 115 | } |
| | 116 | |
| | 117 | // public API |
| | 118 | this.addPair = addPair; |
| | 119 | this.addPairs = addPairs; |
| | 120 | this.serialize = serialize; |
| | 121 | this.serializeJSON = serializeJSON; |
| | 122 | } |
| | 123 | |
| | 124 | FormSerializer.patterns = patterns; |
| | 125 | |
| | 126 | FormSerializer.serializeObject = function serializeObject() { |
| | 127 | return new FormSerializer($, this). |
| | 128 | addPairs(this.serializeArray()). |
| | 129 | serialize(); |
| | 130 | }; |
| | 131 | |
| | 132 | FormSerializer.serializeJSON = function serializeJSON() { |
| | 133 | return new FormSerializer($, this). |
| | 134 | addPairs(this.serializeArray()). |
| | 135 | serializeJSON(); |
| | 136 | }; |
| | 137 | |
| | 138 | if (typeof $.fn !== "undefined") { |
| | 139 | $.fn.serializeObject = FormSerializer.serializeObject; |
| | 140 | $.fn.serializeJSON = FormSerializer.serializeJSON; |
| | 141 | } |
| | 142 | |
| | 143 | exports.FormSerializer = FormSerializer; |
| | 144 | |
| | 145 | return FormSerializer; |
| | 146 | })); |