/** * jQuery serializeObject * @copyright 2014, macek * @link https://github.com/macek/jquery-serialize-object * @license BSD * @version 2.5.0 */ (function (root, factory) { // AMD if (typeof define === "function" && define.amd) { define(["exports", "jquery"], function (exports, $) { return factory(exports, $); }); } // CommonJS else if (typeof exports !== "undefined") { var $ = require("jquery"); factory(exports, $); } // Browser else { factory(root, (root.jQuery || root.Zepto || root.ender || root.$)); } }(this, function (exports, $) { var patterns = { validate: /^[a-z_][a-z0-9_]*(?:\[(?:\d*|[a-z0-9_]+)\])*$/i, key: /[a-z0-9_]+|(?=\[\])/gi, push: /^$/, fixed: /^\d+$/, named: /^[a-z0-9_]+$/i }; function FormSerializer(helper, $form) { // private variables var data = {}, pushes = {}; // private API function build(base, key, value) { base[key] = value; return base; } function makeObject(root, value) { var keys = root.match(patterns.key), k; // nest, nest, ..., nest while ((k = keys.pop()) !== undefined) { // foo[] if (patterns.push.test(k)) { var idx = incrementPush(root.replace(/\[\]$/, '')); value = build([], idx, value); } // foo[n] else if (patterns.fixed.test(k)) { value = build([], k, value); } // foo; foo[bar] else if (patterns.named.test(k)) { value = build({}, k, value); } } return value; } function incrementPush(key) { if (pushes[key] === undefined) { pushes[key] = 0; } return pushes[key]++; } function encode(pair) { //debugger; switch ($('[name="' + pair.name + '"]', $form).attr("type")) { case "checkbox": return pair.value === "on" ? true : pair.value; default: var sDataType = $('[name="' + pair.name + '"]', $form).attr("data-type"), sDataName = $('[name="' + pair.name + '"]', $form).attr("data-name"); if ((sDataType && sDataName && sDataName == 'int') || sDataType == 'pop') { return $('[name="' + pair.name + '"]', $form).attr("data-value") || pair.value; } else { return pair.value; } } } function addPair(pair) { if (!patterns.validate.test(pair.name)) return this; var obj = makeObject(pair.name, encode(pair)); data = helper.extend(true, data, obj); return this; } function addPairs(pairs) { if (!helper.isArray(pairs)) { throw new Error("formSerializer.addPairs expects an Array"); } for (var i = 0, len = pairs.length; i < len; i++) { this.addPair(pairs[i]); } return this; } function serialize() { return data; } function serializeJSON() { return JSON.stringify(serialize()); } // public API this.addPair = addPair; this.addPairs = addPairs; this.serialize = serialize; this.serializeJSON = serializeJSON; } FormSerializer.patterns = patterns; FormSerializer.serializeObject = function serializeObject() { return new FormSerializer($, this). addPairs(this.serializeArray()). serialize(); }; FormSerializer.serializeJSON = function serializeJSON() { return new FormSerializer($, this). addPairs(this.serializeArray()). serializeJSON(); }; if (typeof $.fn !== "undefined") { $.fn.serializeObject = FormSerializer.serializeObject; $.fn.serializeJSON = FormSerializer.serializeJSON; } exports.FormSerializer = FormSerializer; return FormSerializer; }));