diff --git a/src/Formfield.php b/src/Formfield.php
new file mode 100644
index 0000000..dcfcd1d
--- /dev/null
+++ b/src/Formfield.php
@@ -0,0 +1,1715 @@
+
+ * @license BSD
+ */
+
+namespace Domframework;
+
+/** The definition of a formfield
+ */
+class Formfield
+{
+ /** The form name
+ */
+ public $formName;
+ /** The name of the field
+ */
+ public $name;
+ /** The label of the field
+ */
+ public $label;
+ /** The titles of the field
+ */
+ public $titles;
+ /** The defaults values of the field
+ */
+ public $defaults;
+ /** The type of the field (text, password, checkbox, select)
+ */
+ public $type="text";
+ /** The state of the field : hidden or show
+ */
+ public $hidden = false;
+ /** Allow a help message to be displayed below the field. In case of error,
+ * it is overrided by the error message
+ */
+ public $help;
+ /** Display the placeholder if needed
+ */
+ public $placeholder = false;
+ /** The multiplicity of selection of the field (available in select only)
+ */
+ public $multiple;
+ /** The name of group for the fields
+ */
+ public $group;
+ /** The read-only feature of the field
+ */
+ public $readonly;
+ /** The field is mandatory
+ */
+ public $mandatory;
+ /** The statut of error of the field
+ */
+ public $error;
+ /** Number of rows
+ */
+ public $rows;
+ /** Number of columns
+ */
+ public $cols;
+ /** The Bootstrap width of the column of titles
+ */
+ public $titlewidth = 2;
+ /** The Bootstrap width of the column of fields
+ */
+ public $fieldwidth = 10;
+
+ /** When adding a field, the name and the label are the minimum mandatory
+ * @param string $name Name of the field
+ * @param string|null $label Label of the field
+ */
+ public function __construct ($name, $label = "")
+ // {{{
+ {
+ $this->name = $name;
+ $this->label = $label;
+ }
+ // }}}
+
+ /** Display really the form
+ */
+ public function display ()
+ // {{{
+ {
+ $func = "field".$this->formTemplate.$this->type;
+ return $this->$func ();
+ }
+ // }}}
+
+ // Setters for all the properties of the class
+ // {{{
+ /** Set the type of the field
+ * @param string $val The value of the type of the field
+ */
+ public function type ($val)
+ {
+ $this->type = $val;
+ return $this;
+ }
+
+ /** Set the hidden of the field
+ * @param string $val The value of the hidden of the field
+ */
+ public function hidden ($val)
+ {
+ $this->hidden = !! $val;
+ return $this;
+ }
+
+ /** Set the help of the field
+ * @param string $val The value of the help of the field
+ */
+ public function help ($val)
+ {
+ $this->help = $val;
+ return $this;
+ }
+
+ /** Set the placeholder
+ * @param string $val The value of the placeholder
+ */
+ public function placeholder ($val)
+ {
+ $this->placeholder = $val;
+ return $this;
+ }
+
+ /** Set the multiple
+ * @param string $val The value of the multiple
+ */
+ public function multiple ($val)
+ {
+ $this->multiple = $val;
+ return $this;
+ }
+
+ /** Set the group
+ * @param string $val The value of the group
+ */
+ public function group ($val)
+ {
+ $this->group = $val;
+ return $this;
+ }
+
+ /** Set the readonly
+ * @param string $val The value of the readonly
+ */
+ public function readonly ($val)
+ {
+ $this->readonly = !! $val;
+ return $this;
+ }
+
+ /** Set the mandatory
+ * @param string $val The value of the mandatory
+ */
+ public function mandatory ($val)
+ {
+ $this->mandatory = !! $val;
+ return $this;
+ }
+
+ /** Set the rows
+ * @param string $val The value of the rows
+ */
+ public function rows ($val)
+ {
+ $this->rows = $val;
+ return $this;
+ }
+
+ /** Set the cols
+ * @param string $val The value of the cols
+ */
+ public function cols ($val)
+ {
+ $this->cols = $val;
+ return $this;
+ }
+ // }}}
+
+ //////////////////////////
+ //// BOOTSTRAP3 ////
+ //////////////////////////
+ // {{{
+ /** Return the checkbox defined
+ */
+ private function fieldBootstrap3checkbox ()
+ // {{{
+ {
+ // No $this->multiple, $this->rows $this->cols $this->placeholder,
+ // $this->maxlength
+ if (! is_array ($this->titles) || count ($this->titles) === 0)
+ $titles = array ("");
+ else
+ $titles = $this->titles;
+ $res = "";
+ $res .= "
\n";
+ $res .= " name, ENT_QUOTES)."]'";
+ $res .= " id='$this->formName"."_";
+ $res .= htmlspecialchars ($this->name, ENT_QUOTES)."'";
+ if (isset ($this->readonly) && $this->readonly !== FALSE)
+ $res .= " disabled='disabled'";
+ if (isset ($this->defaults))
+ $res .= " value='".htmlspecialchars ($this->defaults, ENT_QUOTES).
+ "'";
+ elseif (isset ($this->label))
+ $res .= " value='".htmlspecialchars ($this->label, ENT_QUOTES)."'";
+ $res .= " class='form-control btn-primary'";
+ if (isset ($this->hidden) && $this->hidden !== FALSE)
+ $res .= " style='display:none'";
+ // Block the submit button 10s. The user can not double click on it and
+ // submit two times the POST to the server
+ // Re-enable after 15s, if there is a problem with the server
+ // This code is needed by Chrome and Edge which allow multiple submission of
+ // a form
+ $res .= " onclick='submit=this ; ";
+ $res .= " setTimeout(function() {";
+ $res .= " submit.setAttribute(\"disabled\", \"disabled\");";
+ $res .= " }, 1);";
+ $res .= "'";
+ $res .= "/>\n";
+ $res .= "
\n";
+ $res .= " name, ENT_QUOTES)."]'";
+ $res .= " id='$this->formName"."_";
+ $res .= htmlspecialchars ($this->name, ENT_QUOTES)."'";
+ if (isset ($this->readonly) && $this->readonly !== FALSE)
+ $res .= " disabled='disabled'";
+ if (isset ($this->defaults))
+ $res .= " value='".htmlspecialchars ($this->defaults, ENT_QUOTES).
+ "'";
+ elseif (isset ($this->label))
+ $res .= " value='".htmlspecialchars ($this->label, ENT_QUOTES)."'";
+ $res .= " class='form-control btn-primary'";
+ if (isset ($this->hidden) && $this->hidden !== FALSE)
+ $res .= " style='display:none'";
+ // Block the submit button 10s. The user can not double click on it and
+ // submit two times the POST to the server
+ // Re-enable after 15s, if there is a problem with the server
+ // This code is needed by Chrome and Edge which allow multiple submission of
+ // a form
+ $res .= " onclick='submit=this ; ";
+ $res .= " setTimeout(function() {";
+ $res .= " submit.setAttribute(\"disabled\", \"disabled\");";
+ $res .= " }, 1);";
+ $res .= "'";
+ $res .= "/>\n";
+ $res .= "