| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 | 
							- /**
 
-  * Functions for manipulating web forms.
 
-  *
 
-  * @author David I. Lehn <dlehn@digitalbazaar.com>
 
-  * @author Dave Longley
 
-  * @author Mike Johnson
 
-  *
 
-  * Copyright (c) 2011-2014 Digital Bazaar, Inc. All rights reserved.
 
-  */
 
- var forge = require('./forge');
 
- /* Form API */
 
- var form = module.exports = forge.form = forge.form || {};
 
- (function($) {
 
- /**
 
-  * Regex for parsing a single name property (handles array brackets).
 
-  */
 
- var _regex = /([^\[]*?)\[(.*?)\]/g;
 
- /**
 
-  * Parses a single name property into an array with the name and any
 
-  * array indices.
 
-  *
 
-  * @param name the name to parse.
 
-  *
 
-  * @return the array of the name and its array indices in order.
 
-  */
 
- var _parseName = function(name) {
 
-   var rval = [];
 
-   var matches;
 
-   while(!!(matches = _regex.exec(name))) {
 
-     if(matches[1].length > 0) {
 
-       rval.push(matches[1]);
 
-     }
 
-     if(matches.length >= 2) {
 
-       rval.push(matches[2]);
 
-     }
 
-   }
 
-   if(rval.length === 0) {
 
-     rval.push(name);
 
-   }
 
-   return rval;
 
- };
 
- /**
 
-  * Adds a field from the given form to the given object.
 
-  *
 
-  * @param obj the object.
 
-  * @param names the field as an array of object property names.
 
-  * @param value the value of the field.
 
-  * @param dict a dictionary of names to replace.
 
-  */
 
- var _addField = function(obj, names, value, dict) {
 
-   // combine array names that fall within square brackets
 
-   var tmp = [];
 
-   for(var i = 0; i < names.length; ++i) {
 
-     // check name for starting square bracket but no ending one
 
-     var name = names[i];
 
-     if(name.indexOf('[') !== -1 && name.indexOf(']') === -1 &&
 
-       i < names.length - 1) {
 
-       do {
 
-         name += '.' + names[++i];
 
-       } while(i < names.length - 1 && names[i].indexOf(']') === -1);
 
-     }
 
-     tmp.push(name);
 
-   }
 
-   names = tmp;
 
-   // split out array indexes
 
-   var tmp = [];
 
-   $.each(names, function(n, name) {
 
-     tmp = tmp.concat(_parseName(name));
 
-   });
 
-   names = tmp;
 
-   // iterate over object property names until value is set
 
-   $.each(names, function(n, name) {
 
-     // do dictionary name replacement
 
-     if(dict && name.length !== 0 && name in dict) {
 
-        name = dict[name];
 
-     }
 
-     // blank name indicates appending to an array, set name to
 
-     // new last index of array
 
-     if(name.length === 0) {
 
-        name = obj.length;
 
-     }
 
-     // value already exists, append value
 
-     if(obj[name]) {
 
-       // last name in the field
 
-       if(n == names.length - 1) {
 
-         // more than one value, so convert into an array
 
-         if(!$.isArray(obj[name])) {
 
-           obj[name] = [obj[name]];
 
-         }
 
-         obj[name].push(value);
 
-       } else {
 
-         // not last name, go deeper into object
 
-         obj = obj[name];
 
-       }
 
-     } else if(n == names.length - 1) {
 
-       // new value, last name in the field, set value
 
-       obj[name] = value;
 
-     } else {
 
-       // new value, not last name, go deeper
 
-       // get next name
 
-       var next = names[n + 1];
 
-       // blank next value indicates array-appending, so create array
 
-       if(next.length === 0) {
 
-          obj[name] = [];
 
-       } else {
 
-         // if next name is a number create an array, otherwise a map
 
-         var isNum = ((next - 0) == next && next.length > 0);
 
-         obj[name] = isNum ? [] : {};
 
-       }
 
-       obj = obj[name];
 
-     }
 
-   });
 
- };
 
- /**
 
-  * Serializes a form to a JSON object. Object properties will be separated
 
-  * using the given separator (defaults to '.') and by square brackets.
 
-  *
 
-  * @param input the jquery form to serialize.
 
-  * @param sep the object-property separator (defaults to '.').
 
-  * @param dict a dictionary of names to replace (name=replace).
 
-  *
 
-  * @return the JSON-serialized form.
 
-  */
 
- form.serialize = function(input, sep, dict) {
 
-   var rval = {};
 
-   // add all fields in the form to the object
 
-   sep = sep || '.';
 
-   $.each(input.serializeArray(), function() {
 
-     _addField(rval, this.name.split(sep), this.value || '', dict);
 
-   });
 
-   return rval;
 
- };
 
- })(jQuery);
 
 
  |