{"version":3,"sources":["_layouts/core/utils/mootools.form2js.js","_layouts/core/utils/mootools.js2form.js"],"names":["form2js","Class","Implements","Options","options","rootNode","delimiter","skipEmpty","nodeCallback","useIdIfEmpty","emptyToNull","useIdIfEmptyName","formValues","initialize","this","setOptions","$","on","currNode","i","constructor","Array","NodeList","concat","getFormValues","processNameValues","nameValues","j","k","l","value","nameParts","currResult","arrNameFull","arrName","arrIdx","namePart","name","_nameParts","result","arrays","length","split","match","push","indexOf","substr","replace","test","extractNodeValues","getSubFormValues","currentNode","firstChild","currentResult","nextSibling","node","callbackResult","fieldValue","fieldName","getFieldName","nodeName","getFieldValue","type","id","fieldNode","disabled","toLowerCase","checked","getSelectedOptionValue","selectNode","multiple","getElementsByTagName","selected","js2form","data","fieldValues","formFieldsByName","_subArrayRegexp","_subObjectRegexp","_arrayItemRegexp","_lastIndexedArrayRegexp","_arrayOfArraysRegexp","_inputOrTextareaRegexp","rm","object2array","getFields","setValue","field","children","arrayIndexes","shouldClean","arguments","nameNormalized","subFieldName","subFields","tagName","add","normalizeName","currChunk","currIndex","newIndex","nameChunksNormalized","nameChunks","join","lastIndex","indexes","obj","lvl","getSubValues","subObj","itemName","tempItem","tempResult"],"mappings":"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","file":"form2js.bundle.min.js","sourcesContent":["/**\n * Copyright (c) 2010 Maxim Vasiliev\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @author Maxim Vasiliev\n * Date: 19.09.11\n * Time: 23:40\n */\nform2js = new Class({\n\tImplements: Options,\n\toptions: {\n\t\trootNode: null,\n\t\tdelimiter: null,\n\t\tskipEmpty: null,\n\t\tnodeCallback: null,\n\t\tuseIdIfEmpty: null,\n\t\temptyToNull: null,\n\t},\n\tuseIdIfEmptyName: null,\n\tformValues: null,\n\tnodeCallback: null,\n\temptyToNull: null,\n\tinitialize: function(options) {\n\t\tthis.setOptions(options);\n\t\t\n\t\tif (typeof this.options.skipEmpty == 'undefined' || this.options.skipEmpty == null) this.options.skipEmpty = true;\n\t\tif (typeof this.options.emptyToNull == 'undefined' || this.options.emptyToNull == null) this.emptyToNull = true;\n\t\tif (typeof this.options.delimiter == 'undefined' || this.options.delimiter == null) this.options.delimiter = '.';\n\t\tif (this.options.useIdIfEmpty == null) this.useIdIfEmptyName = false;\n\n\t\tthis.rootNode = typeof this.options.rootNode == 'string' ? $(this.options.rootNode) : this.options.rootNode;\n\t\tthis.nodeCallback = this.options.nodeCallback;\n\t\n\t},\n\ton: function() {\n\t\tvar formValues = [], currNode, i = 0;\n\t\t/* If rootNode is array - combine values */\n\t\tif (this.rootNode.constructor == Array || (typeof NodeList != \"undefined\" && this.rootNode.constructor == NodeList)) {\n\t\t\twhile(currNode = this.rootNode[i++]) {\n\t\t\t\tformValues = formValues.concat(this.getFormValues(currNode, this.nodeCallback, this.useIdIfEmptyName));\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tformValues = this.getFormValues(this.rootNode, this.nodeCallback, this.useIdIfEmptyName);\n\t\t}\n\n\t\treturn this.processNameValues(formValues, this.options.skipEmpty, this.emptyToNull, this.options.delimiter);\n\t},\n\tprocessNameValues: function(nameValues, skipEmpty, delimiter) {\n\t\tvar result = {},\n\t\t\tarrays = {},\n\t\t\ti, j, k, l,\n\t\t\tvalue,\n\t\t\tnameParts,\n\t\t\tcurrResult,\n\t\t\tarrNameFull,\n\t\t\tarrName,\n\t\t\tarrIdx,\n\t\t\tnamePart,\n\t\t\tname,\n\t\t\t_nameParts;\n\n\t\t\tfor (i = 0; i < nameValues.length; i++) {\n\t\t\t\tvalue = nameValues[i].value;\n\n\t\t\t\tif (this.emptyToNull && (value === '')) { value = null; }\n\t\t\t\tif (skipEmpty && (value === '' || value === null)) continue;\n\n\t\t\t\tname = nameValues[i].name;\n\t\t\t\tif (typeof name === 'undefined') continue;\n\n\t\t\t\t_nameParts = name.split(this.options.delimiter);\n\t\t\t\tnameParts = [];\n\t\t\t\tcurrResult = result;\n\t\t\t\tarrNameFull = '';\n\n\t\t\t\tfor(j = 0; j < _nameParts.length; j++)\n\t\t\t\t{\n\t\t\t\t\tnamePart = _nameParts[j].split('][');\n\t\t\t\t\tif (namePart.length > 1)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor(k = 0; k < namePart.length; k++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (k == 0)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tnamePart[k] = namePart[k] + ']';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if (k == namePart.length - 1)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tnamePart[k] = '[' + namePart[k];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tnamePart[k] = '[' + namePart[k] + ']';\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tarrIdx = namePart[k].match(/([a-z_]+)?\\[([a-z_][a-z0-9_]+?)\\]/i);\n\t\t\t\t\t\t\tif (arrIdx)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfor(l = 1; l < arrIdx.length; l++)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tif (arrIdx[l]) nameParts.push(arrIdx[l]);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse{\n\t\t\t\t\t\t\t\tnameParts.push(namePart[k]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tnameParts = nameParts.concat(namePart);\n\t\t\t\t}\n\n\t\t\t\tfor (j = 0; j < nameParts.length; j++)\n\t\t\t\t{\n\t\t\t\t\tnamePart = nameParts[j];\n\n\t\t\t\t\tif (namePart.indexOf('[]') > -1 && j == nameParts.length - 1)\n\t\t\t\t\t{\n\t\t\t\t\t\tarrName = namePart.substr(0, namePart.indexOf('['));\n\t\t\t\t\t\tarrNameFull += arrName;\n\n\t\t\t\t\t\tif (!currResult[arrName]) currResult[arrName] = [];\n\t\t\t\t\t\tcurrResult[arrName].push(value);\n\t\t\t\t\t}\n\t\t\t\t\telse if (namePart.indexOf('[') > -1)\n\t\t\t\t\t{\n\t\t\t\t\t\tarrName = namePart.substr(0, namePart.indexOf('['));\n\t\t\t\t\t\tarrIdx = namePart.replace(/(^([a-z_]+)?\\[)|(\\]$)/gi, '');\n\n\t\t\t\t\t\t/* Unique array name */\n\t\t\t\t\t\tarrNameFull += '_' + arrName + '_' + arrIdx;\n\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t * Because arrIdx in field name can be not zero-based and step can be\n\t\t\t\t\t\t * other than 1, we can't use them in target array directly.\n\t\t\t\t\t\t * Instead we're making a hash where key is arrIdx and value is a reference to\n\t\t\t\t\t\t * added array element\n\t\t\t\t\t\t */\n\n\t\t\t\t\t\tif (!arrays[arrNameFull]) arrays[arrNameFull] = {};\n\t\t\t\t\t\tif (arrName != '' && !currResult[arrName]) currResult[arrName] = [];\n\n\t\t\t\t\t\tif (j == nameParts.length - 1)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (arrName == '')\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcurrResult.push(value);\n\t\t\t\t\t\t\t\tarrays[arrNameFull][arrIdx] = currResult[currResult.length - 1];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcurrResult[arrName].push(value);\n\t\t\t\t\t\t\t\tarrays[arrNameFull][arrIdx] = currResult[arrName][currResult[arrName].length - 1];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (!arrays[arrNameFull][arrIdx])\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif ((/^[a-z_]+\\[?/i).test(nameParts[j+1])) currResult[arrName].push({});\n\t\t\t\t\t\t\t\telse currResult[arrName].push([]);\n\n\t\t\t\t\t\t\t\tarrays[arrNameFull][arrIdx] = currResult[arrName][currResult[arrName].length - 1];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcurrResult = arrays[arrNameFull][arrIdx];\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tarrNameFull += namePart;\n\n\t\t\t\t\t\tif (j < nameParts.length - 1) /* Not the last part of name - means object */\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (!currResult[namePart]) currResult[namePart] = {};\n\t\t\t\t\t\t\tcurrResult = currResult[namePart];\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcurrResult[namePart] = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn result;\n\t\t},\n\tgetFormValues: function(rootNode, nodeCallback, useIdIfEmpty) {\n\t\tvar result = this.extractNodeValues(rootNode, nodeCallback, this.useIdIfEmptyName);\n return result.length > 0 ? result : this.getSubFormValues(rootNode, nodeCallback, this.useIdIfEmptyName);\n\t},\n\tgetSubFormValues: function(rootNode, nodeCallback, useIdIfEmpty) {\n\t\t\tvar result = [],\n\t\t\tcurrentNode = rootNode.firstChild;\n\n\t\t\twhile (currentNode) {\n\t\t\t\tvar currentResult = this.extractNodeValues(currentNode, nodeCallback, this.useIdIfEmptyName);\n\t\t\t\tfor (var i = 0; i < currentResult.length;i++ ) {\n\t\t\t\t\tif((currentResult[i].value !== null && this.options.skipEmpty) || !this.options.skipEmpty) {\n\t\t\t\t\t\tresult[result.length] = currentResult[i];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcurrentNode = currentNode.nextSibling;\n\t\t\t}\n\t\t\treturn result;\n\t},\n\textractNodeValues: function(node, nodeCallback, useIdIfEmptyName) {\n\t\tvar callbackResult, fieldValue, result, fieldName = this.getFieldName(node, useIdIfEmptyName);\n\n callbackResult = this.nodeCallback && this.nodeCallback(node);\n\n if (callbackResult && callbackResult.name) {\n result = [callbackResult];\n }\n else if (fieldName != '' && node.nodeName.match(/INPUT|TEXTAREA/i)) {\n fieldValue = this.getFieldValue(node);\n\t\t\tif (fieldValue == null && node.type == 'radio')\n\t\t result = [];\n\t\t else\n\t\t result = [ { name: fieldName, value: fieldValue} ];\n\t\t} else if (fieldName != '' && node.nodeName.match(/SELECT/i)) {\n\t\t\tfieldValue = this.getFieldValue(node);\n\t\t\tresult = [ { name: fieldName.replace(/\\[\\]$/, ''), value: fieldValue } ];\n } else {\n result = this.getSubFormValues(node, nodeCallback, useIdIfEmptyName);\n }\n\n return result;\n\n\t},\n\tgetFieldName: function(node, useIdIfEmptyName) {\n\t\tif (node.name && node.name != '') return node.name;\n\t\telse if (this.useIdIfEmptyName && node.id && node.id != '') return node.id;\n\t\telse return '';\n\t},\n\tgetFieldValue: function(fieldNode) {\n\t\tif (fieldNode.disabled) return null;\n\t\t\n\t\tswitch (fieldNode.nodeName) {\n\t\t\tcase 'INPUT':\n\t\t\tcase 'TEXTAREA':\n\t\t\t\tswitch (fieldNode.type.toLowerCase()) {\n\t\t\t\t\tcase 'radio':\n\t\t\t\t\t\tif (fieldNode.checked) return fieldNode.value;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'checkbox':\n\t\t if (fieldNode.checked && fieldNode.value === 'true' || fieldNode.value === 'on') return true;\n\t\t if (!fieldNode.checked && fieldNode.value === 'true' || fieldNode.value === 'on') return false;\n\t\t\t\t\t\t\tif (fieldNode.checked) return fieldNode.value;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'button':\n\t\t\t\t\tcase 'reset':\n\t\t\t\t\tcase 'submit':\n\t\t\t\t\tcase 'image':\n\t\t\t\t\t\treturn '';\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn fieldNode.value;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 'SELECT':\n\t\t\t\treturn this.getSelectedOptionValue(fieldNode);\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\n\t\treturn null;\n\n\t},\n\tgetSelectedOptionValue: function(selectNode) {\n\t\tvar multiple = selectNode.multiple,\n\t\t\tresult = [],\n\t\t\toptions,\n\t\t\ti, l;\n\n\t\tif (!multiple) return selectNode.value;\n\n\t\tfor (options = selectNode.getElementsByTagName('option'), i = 0, l = options.length; i < l; i++) {\n\t\t\tif (options[i].selected) result.push(options[i].value);\n\t\t}\n\n\t\treturn result; \n\t}\n\t\n\n});","/**\n * Copyright (c) 2010 Maxim Vasiliev\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @author Maxim Vasiliev\n * Date: 19.09.11\n * Time: 23:40\n */\njs2form = new Class({\nImplements: Options,\noptions: {\n\trootNode: null,\n\tdelimiter: null,\n\tskipEmpty: null,\n\tnodeCallback: null,\n\tuseIdIfEmpty: null,\n\tdata: null\n},\nuseIdIfEmptyName: null,\nfieldValues: null,\nformFieldsByName: null,\n_subArrayRegexp: /^\\[\\d+?\\]/,\n_subObjectRegexp: /^[a-zA-Z_][a-zA-Z_0-9]+/,\n_arrayItemRegexp: /\\[[0-9]+?\\]$/,\n_lastIndexedArrayRegexp: /(.*)(\\[)([0-9]*)(\\])$/,\n_arrayOfArraysRegexp: /\\[([0-9]+)\\]\\[([0-9]+)\\]/g,\n_inputOrTextareaRegexp: /INPUT|TEXTAREA/i,\n\n/**\n*\n* @param rootNode\n* @param data\n* @param delimiter\n* @param nodeCallback\n* @param useIdIfEmptyName\n*/\n\tinitialize: function(options) {\n\t\tthis.setOptions(options);\n\t\tif (typeof this.options.skipEmpty == 'undefined' || this.options.skipEmpty == null) this.options.skipEmpty = true;\n\t\tif (typeof this.options.delimiter == 'undefined' || this.options.delimiter == null) this.options.delimiter = '.';\n\t\tif (this.options.useIdIfEmpty == null) this.useIdIfEmptyName = false;\n\t\tthis.rootNode = this.options.rootNode;\n\t},\n\trm: function() {\n\t\tthis.fieldValues = this.object2array(this.options.data);\n\t\tthis.formFieldsByName = this.getFields(this.rootNode, this.useIdIfEmptyName, this.options.delimiter, {}, true);\n\n\t\tfor (var i = 0; i < this.fieldValues.length; i++) {\n\t\t\tvar fieldName = this.fieldValues[i].name;\n\t\t\tvar fieldValue = this.fieldValues[i].value;\n\n\t\t\tif (typeof this.formFieldsByName[fieldName] != 'undefined') {\n\t\t\t\tthis.setValue(this.formFieldsByName[fieldName], fieldValue);\n\t\t\t} else if (typeof this.formFieldsByName[fieldName.replace(this._arrayItemRegexp, '[]')] != 'undefined') {\n\t\t\t\tthis.setValue(this.formFieldsByName[fieldName.replace(this._arrayItemRegexp, '[]')], fieldValue);\n\t\t\t}\n\t\t}\n\t},\n\tsetValue: function(field, value) {\n\t\tvar children, i, l;\n\n\t\tif (field instanceof Array) {\n\t\t\tfor(i = 0; i < field.length; i++)\n\t\t\t\tif (field[i].value == value) \n\t\t\t\t\tfield[i].checked = true;\n\n\t\t} else if (this._inputOrTextareaRegexp.test(field.nodeName)) {\n\t\t\tfield.value = (value == null) ? '' : value;\n\n\t\t} else if (/SELECT/i.test(field.nodeName)) {\n\t\t\tchildren = field.getElementsByTagName('option');\n\n\t\t\tfor (i = 0,l = children.length; i < l; i++) {\n\n\t\t\t\tif (children[i].value == value) {\n\t\t\t\t\tchildren[i].selected = true;\n\t\t\t\t\tif (field.multiple) \n\t\t\t\t\t\tbreak;\n\t\t\t\t} else if (!field.multiple) {\n\t\t\t\t\tchildren[i].selected = false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tgetFields: function(rootNode, useIdIfEmptyName, delimiter, arrayIndexes, shouldClean) {\n\t\tif (arguments.length < 4) arrayIndexes = {};\n\n\t\tvar result = {},\n\t\tcurrNode = $(rootNode).firstChild,\n\t\tname, nameNormalized,\n\t\tsubFieldName,\n\t\ti, j, l,\n\t\toptions;\n\n\t\twhile (currNode) {\n\t\t\tname = '';\n\n\t\t\tif (currNode.name && currNode.name != '') {\n\t\t\t\tname = currNode.name;\n\t\t\t}\n\t\t\telse if (useIdIfEmptyName && currNode.id && currNode.id != '') {\n\t\t\t\tname = currNode.id;\n\t\t\t}\n\n\t\t\tif (name == '') {\n\t\t\t\tvar subFields = this.getFields(currNode, useIdIfEmptyName, delimiter, arrayIndexes, shouldClean);\n\t\t\t\tfor (subFieldName in subFields) {\n\t\t\t\t\tif (typeof result[subFieldName] == 'undefined') {\n\t\t\t\t\t\tresult[subFieldName] = subFields[subFieldName];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfor (i = 0; i < subFields[subFieldName].length; i++) {\n\t\t\t\t\t\t\tif (result[subFieldName].tagName == \"SELECT\")\n\t\t\t\t\t\t\t\tresult[subFieldName].add(subFields[subFieldName][i]);\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tresult[subFieldName].push(subFields[subFieldName][i]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t } else {\n\t\t\t if (/SELECT/i.test(currNode.nodeName)) {\n\t\t\t\t for(j = 0, options = currNode.getElementsByTagName('option'), l = options.length; j < l; j++) {\n\t\t\t\t\t if (shouldClean) {\n\t\t\t\t\t\t options[j].selected = false;\n\t\t\t\t\t }\n\n\t\t\t\t\t nameNormalized = this.normalizeName(name, delimiter, arrayIndexes);\n\t\t\t\t\t result[nameNormalized] = currNode;\n\t\t\t\t }\n\t\t\t } else if (/INPUT/i.test(currNode.nodeName) && /CHECKBOX|RADIO/i.test(currNode.type)) {\n\t\t\t\t if(shouldClean) {\n\t\t\t\t\t currNode.checked = false;\n\t\t\t\t }\n\n\t\t\t\t nameNormalized =\tthis.normalizeName(name, delimiter, arrayIndexes);\n\t\t\t\t nameNormalized = nameNormalized.replace(this._arrayItemRegexp, '[]');\n\t\t\t\t\n\t\t\t\t if (!result[nameNormalized]) result[nameNormalized] = [];\n\t\t\t\t\t result[nameNormalized].push(currNode);\n\t\t\t } else {\n\t\t\t\t if (shouldClean) {\n\t\t\t\t\t currNode.value = '';\n\t\t\t\t }\n\n\t\t\t\t nameNormalized = this.normalizeName(name, delimiter, arrayIndexes);\n\t\t\t\t result[nameNormalized] = currNode;\n\n\t\t\t }\n\t\t }\r\n\t\t if (this.options.nodeCallback)\r\n\t\t this.options.nodeCallback(currNode);\n\t\t currNode = currNode.nextSibling;\n\t\t}\n\n\treturn result;\n\t},\n\n\t/**\n\t* Normalizes names of arrays, puts correct indexes (consecutive and ordered by element appearance in HTML)\n\t* @param name\n\t* @param delimiter\n\t* @param arrayIndexes\n\t*/\n\tnormalizeName: function(name, delimiter, arrayIndexes) {\n\t\tvar nameChunksNormalized = [],\n\t\tnameChunks = name.split(delimiter),\n\t\tcurrChunk,\n\t\tnameMatches,\n\t\tnameNormalized,\n\t\tcurrIndex,\n\t\tnewIndex,\n\t\ti;\n\n\t\tname = name.replace(this._arrayOfArraysRegexp, '[$1].[$2]');\n\t\t\n\t\tfor (i = 0; i < nameChunks.length; i++) {\n\t\t\tcurrChunk = nameChunks[i];\n\t\t\tnameChunksNormalized.push(currChunk);\n\t\t\tnameMatches = currChunk.match(this._lastIndexedArrayRegexp);\n\n\t\tif (nameMatches != null) {\n\t\t\tnameNormalized = nameChunksNormalized.join(delimiter);\n\t\t\tcurrIndex = nameNormalized.replace(this._lastIndexedArrayRegexp, '$3');\n\t\t\tnameNormalized = nameNormalized.replace(this._lastIndexedArrayRegexp, '$1');\n\n\t\t\tif (typeof (arrayIndexes[nameNormalized]) == 'undefined') {\n\t\t\t\tarrayIndexes[nameNormalized] = {\n\t\t\t\tlastIndex: -1,\n\t\t\t\tindexes: {}\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (currIndex == '' || typeof arrayIndexes[nameNormalized].indexes[currIndex] == 'undefined') {\n\t\t\t\tarrayIndexes[nameNormalized].lastIndex++;\n\t\t\t\tarrayIndexes[nameNormalized].indexes[currIndex] = arrayIndexes[nameNormalized].lastIndex;\n\t\t\t}\n\n\t\t\t\tnewIndex = arrayIndexes[nameNormalized].indexes[currIndex];\n\t\t\t\tnameChunksNormalized[nameChunksNormalized.length - 1] = currChunk.replace(this._lastIndexedArrayRegexp, '$1$2' + newIndex + '$4');\n\t\t\t}\n\t\t}\n\n\t\tnameNormalized = nameChunksNormalized.join(delimiter);\n\t\tnameNormalized = nameNormalized.replace('].[', '][');\n\t\treturn nameNormalized;\n\t},\n\tobject2array: function(obj, lvl) {\n\t\tvar result = [], i, name;\n\n\t\tif (arguments.length == 1) lvl = 0;\n\n\t\tif (obj == null) {\n\t\t\tresult = [{ name: \"\", value: null }];\n\t\t}\n\t\telse if (typeof obj == 'string' || typeof obj == 'number' || typeof obj == 'date' || typeof obj == 'boolean') {\n\t\t\tresult = [\n\t\t\t\t{ name: \"\", value : obj }\n\t\t\t];\n\t\t}\n\t\telse if (obj instanceof Array) {\n\t\t\tfor (i = 0; i < obj.length; i++)\n\t\t\t{\n\t\t\t\tname = \"[\" + i + \"]\";\n\t\t\t\tresult = result.concat(this.getSubValues(obj[i], name, lvl + 1));\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i in obj)\n\t\t\t{\n\t\t\t\tname = i;\n\t\t\t\tresult = result.concat(this.getSubValues(obj[i], name, lvl + 1));\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t},\n\tgetSubValues: function(subObj, name, lvl) {\n\t\tvar itemName;\n\t\tvar result = [], tempResult = this.object2array(subObj, lvl + 1), i, tempItem;\n\n\t\tfor (i = 0; i < tempResult.length; i++) {\n\t\t\titemName = name;\n\t\t\tif (this._subArrayRegexp.test(tempResult[i].name)) {\n\t\t\t\titemName += tempResult[i].name;\n\t\t\t}\n\t\t\telse if (this._subObjectRegexp.test(tempResult[i].name)) {\n\t\t\t\titemName += '.' + tempResult[i].name;\n\t\t\t}\n\n\t\t\ttempItem = { name: itemName, value: tempResult[i].value };\n\t\t\tresult.push(tempItem);\n\t\t}\n\t\treturn result;\n\t}\n});"]}