\n\n);
+
+
+//////////////
+// USE CASE //
+//////////////
+
+
+////////////////
+// PARAMETERS //
+////////////////
+// {xx} - where 'xx' is a variable name which will be (literally) replaced by the $xx given parameter (if missing, by an empty string)
+// note that the parameter in a higher level have to be preceeded by '$'
+// /!\ warning: the variable name must only contain [ lowercase_letters, hyphens ]
+//
+// {{zz}} - where 'zz' is an array variable name which will be (for each item) replaced by the $$zz given array (see next statement)
+// note that the parameter in a higher level have to be preceeded by '$$'
+//
+// {zz.xx} - where 'zz' is an array name + 'xx' is an index name of this array's items, it will be replaced by zz[0][xx], then zz[1][xx], etc
+// note that this is the only case when the dot (.) is allowed in variable naming
+//
+// {__attributes__} - default variable name for the attributes
+// {__children__} - default variable name for the children
+
+/////////////////////////
+// REGURAL EXPRESSIONS //
+/////////////////////////
+// /^yy$/ - where '^yy$' is a regular expression, matches will be added to the input parameters named like so : '$1', '$2'
+// note that it have to match the whole string and begin with '/^' and end with '$/'
+
+
+////////////////////////
+// DEFAULT ATTRIBUTES //
+////////////////////////
+//
+// node - is a "key" of a definition that describes an element
+// next_nodes - the set of the element's next elements
+// prev_nodes - the set of the element's previous elements
+// node_type - real node-type (to create element in javascript)
+// node_attr - real attributes array (to create element in javascript)
+// node_children - real children arary (to create element in javascript)
+// text - overrides all to specify the text content corresponding of the element
+// children - the set of the element's children (doesn't check if it is a container or not)
+// attributes - attributes are replaced in a lower level
+// listeners - contains the associations: 'eventName' => 'listenerFuncName'
+// $xxx - where 'xxx' is a variable name that will be replaced in a lower level
+// $$zzz - where 'zzz' is an array variable name that will be split in a lower level
+// repeat - must contain a number or an array name (such as: "{{tabname}}")
+// 1- if an array is given, the element will be repeated for each item of the array
+// 2- if a number @n is given, the element will be repeated @n times
+
+var default_definition = {
+ 'input': { node_type: 'input', node_attr: '{__attributes__}' },
+ 'h/^([1-6])$/': { node_type: 'h{$1}', node_attr: '{__attributes__}', node_children: '{__children__}' },
+ 'br': { node_type: 'br', },
+ 'option': { node_type: 'option', node_attr: '{__attributes__}', node_children: '{__children__}' },
+ 'select': { node_type: 'select', node_attr: '{__attributes__}', node_children: '{__children__}' },
+ 'span': { node_type: 'span', node_attr: '{__attributes__}', node_children: '{__children__}' }
+};
+
+var custom_definition = {
+ 'input:/^([a-z]+)$/': {
+ node: 'input',
+ attributes: {
+ 'type': '{$1}',
+ 'data-name': '{name}',
+ 'value': '{value}',
+ 'placeholder': '{placeholder}'
+ },
+ next_nodes: [{ node: 'br' }]
+ },
+
+
+ 'custom-select': {
+ node: 'span',
+ attributes: { 'class': 'select-container nobold' },
+ children: [
+ {
+ node: 'select',
+ attributes: { 'data-name': '{name}' },
+ children: [
+ {
+ node: 'option',
+ attribute: { value: '{options.value}' },
+ text: '{options.value}',
+ repeat: '{{options}}'
+ }
+ ]
+ }
+ ],
+ next_nodes: [{ node: 'br' }]
+ }
+};
+
+var form = {
+ node: 'h4',
+ attributes: { 'data-icon': 'o', 'class': 'new-contact color2' },
+ children: [
+ { node: 'input:hidden', $name: 'uid', $value: '{uid}' },
+ { node: 'input:hidden', $name: 'call', $value: '{call}' },
+ { node: 'input:hidden', $name: 'sms', $value: '{sms}' },
+ { node: 'input:hidden', $name: 'countcall', $value: '{countcall}' },
+ { node: 'input:hidden', $name: 'countsms', $value: '{countsms}' },
+
+ { node: 'input:text', $name: 'number', $value: '{number}' },
+
+ { node: 'custom-select', $name: 'existing', $$options: '{{options}}' }
+ ]
+};
+
+// \n+
diff --git a/doc/form-builder/constraints-min.js b/doc/form-builder/constraints-min.js
new file mode 100644
index 0000000..c820b42
--- /dev/null
+++ b/doc/form-builder/constraints-min.js
@@ -0,0 +1 @@
+function formatObject(a){for(var b in a)formatObject(a[b]),a[b].parent=a};
diff --git a/doc/form-builder/constraints.js b/doc/form-builder/constraints.js
new file mode 100644
index 0000000..34fd7b7
--- /dev/null
+++ b/doc/form-builder/constraints.js
@@ -0,0 +1,12 @@
+"use strict";
+
+/* [1] Gestion de la référence vers le parent
+=========================================================*/
+function formatObject(object){
+
+ for( var i in object ){
+ formatObject(object[i]);
+ object[i].parent = object;
+ }
+
+}
diff --git a/js/lib/form-builder-min.js b/js/lib/form-builder-min.js
index fad13a2..312f11f 100644
--- a/js/lib/form-builder-min.js
+++ b/js/lib/form-builder-min.js
@@ -1,2 +1,3 @@
-var default_definition={input:{html:""},"h/^([1-6])$/":{html:"{{__children__}}"},br:{html:" "},option:{html:""},select:{html:""}},custom_definition={"input:/^([a-z]+)$/":{node:"input",attributes:{type:"{{$1}}","data-name":"{{name}}",value:"{{value}}",placeholder:"{{placeholder}}"},next_child:{node:"br"}}},form={node:"h4",attributes:{"data-icon":"o",
-"class":"new-contact color2"},children:[{node:"input:hidden",$name:"uid",$value:"{{uid}}"},{node:"input:hidden",$name:"call",$value:"{{call}}"},{node:"input:hidden",$name:"sms",$value:"{{sms}}"},{node:"input:hidden",$name:"countcall",$value:"{{countcall}}"},{node:"input:hidden",$name:"countsms",$value:"{{countsms}}"},{node:"input:text",$name:"number",$value:"{{number}}"}]};
+var FormBuilder=function(a,b){this.parent_element=a;this.form_object=b;FormBuilder.formatFormObject(this.form_object)};
+FormBuilder.prototype={form_object:this.form_object,defs_object:{},parent_element:this.parent_element,allowed_attr:"node node_type node_attr node_children next_nodes prev_nodes attributes children text repeat".split(" "),built_form:null,regex:{primitive_ouput_value:/\{([a-z-]+)\}/g,primitive_input_key:/^\$([a-z-]+)$/,array_output_set:/\{\{([a-z-]+)\}\}/g,array_output_value:/\{([a-z-]+)\.([a-z-]+)\}/g,array_input_key:/^\$\$([a-z-]+)$/}};
+FormBuilder.formatFormObject=function(a){if(a.hasOwnProperty("children"))for(var b in a.children)a.children[b].parent=a,FormBuilder.formatFormObject(a.children[b]);return a};FormBuilder.replaceStatements=function(a,b){for(var c in a)"string"==typeof a[c]&&(/a/.exec(a[c]),console.log(RegExp.$0));return a};
diff --git a/js/lib/form-builder.js b/js/lib/form-builder.js
index 4d3a69e..b35687a 100644
--- a/js/lib/form-builder.js
+++ b/js/lib/form-builder.js
@@ -1,118 +1,98 @@
-//