@SuppressWarnings("rawtypes")
  public void ajoutFormulaireDirect() {
    for (int i = 0; i < elements.size(); i++) {
      JSONObject elementAsJSONObject =
          BuildJsonObject.buildJSONObjectElementBis(
              "" + i,
              ((ArrayList) elements.get(i)).get(0).toString(),
              ((ArrayList) elements.get(i)).get(1).toString(),
              ((ArrayList) elements.get(i)).get(2).toString());
      formAsJSONObjectBis.put("element" + i, elementAsJSONObject);

      ajouterParametre(
          i,
          ((ArrayList) elements.get(i)).get(3).toString(),
          ((ArrayList) elements.get(i)).get(4).toString());
    }

    FormulaireController.allouerFormulaireBis(dualListBox, formAsJSONObjectBis);
    try {
      RequestBuilder builder =
          new RequestBuilder(RequestBuilder.PUT, FORMULAIRE_URL + "updateForm");
      builder.setHeader("Content-Type", "application/json");
      builder.sendRequest(
          formAsJSONObjectBis.toString(),
          new RequestCallback() {
            public void onError(Request request, Throwable exception) {
              Window.alert("Erreur d'ajout");
            }

            public void onResponseReceived(Request request, Response response) {
              RootPanel.get("button_Enregistrer").remove(enregistrer);
              Window.alert("Formulaire: Ajout avec succès");
              Window.Location.reload();
            }
          });
    } catch (RequestException e) {
      System.out.println("RequestException");
    }
  }
  // Charger la zone de modification par les differents elements du formulaire
  public void chargerFormulaire() {
    // Vider la zone de modification dans le cas où elle est occupée par un
    // autre formulaire
    if (bodyExist) {
      RootPanel.get("container_principal").clear();
      Document.get().getBody().removeChild(bodyForm.getElement());
      dualListBox.clear();
      enregistrer = new Anchor();
    }

    // Construire la zone de modification
    bodyForm = new BodyFormulaire();

    Document.get().getBody().appendChild(bodyForm.getElement());

    // Alimenter la liste des comptes CU et CA
    alimenterList();
    // Ajouter Action au lien "Allocation du formulaire"
    Anchor link_allocation = Anchor.wrap(bodyForm.getLink_allocation());
    link_allocation.addClickHandler(
        new ClickHandler() {
          public void onClick(ClickEvent event) {
            // Afficher le popup contenant la dual liste qui contient la
            // liste des comptes CA et CU
            FormulaireController.CreateDialogBoxAllocation(dualListBox, false, null).show();
          }
        });

    // Ajouter le button supprimer Formulaire

    supprimer.setHTML(
        "<a class='bouton_enregistrer floatRight' style='margin-right:13%; cursor:pointer'>Supprimer</a>");
    RootPanel.get("button_Enregistrer").add(supprimer);

    // RootPanel.get("form_formulaire_allocation").getElement().appendChild(dualListBox.getElement());
    RootPanel.get("form_formulaire_creation").getElement().appendChild(form.getElement());
    enregistrer.setHTML(
        "<a class='bouton_enregistrer floatRight' style='margin-right:15px; cursor:pointer'>Enregistrer</a>");
    RootPanel.get("button_Enregistrer").add(enregistrer);

    RootPanel.get("contenu_principal_formulaire").add(new FormulaireBoard());
    RootPanel.get("container_principal").insert(FormulaireController.createImageGrid(), 0);
    bodyExist = true;

    // Remplir le formulaire nom et commentaire
    RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, FORMULAIRE_URL + formulaire_id);
    builder.setHeader("Content-Type", "application/json");

    try {
      builder.sendRequest(
          null,
          new RequestCallback() {
            public void onError(Request request, Throwable exception) {}

            @SuppressWarnings("deprecation")
            public void onResponseReceived(Request request, Response response) {
              if (response.getStatusCode() == Response.SC_OK) {
                JSONValue formAsJSONValue = JSONParser.parse(response.getText());
                formAsJSONObject = formAsJSONValue.isObject();
                ((InputElement) form.getForm_nom())
                    .setValue(formAsJSONObject.get("nom").isString().stringValue());
                ((InputElement) form.getForm_comment())
                    .setValue(formAsJSONObject.get("commentaire").isString().stringValue());
                ancienNom = form.getForm_nom().getValue();
                // ((InputElement)form.getForm_nom()).setDisabled(true);
              }
            }
          });
    } catch (RequestException e) {
      System.out.println("RequestException");
    }

    // Remplir la zone de création par les elements et les parametres
    builder =
        new RequestBuilder(
            RequestBuilder.GET, ELEMENT_URL + "listerElement/formulaire/" + formulaire_id);
    builder.setHeader("Content-Type", "application/json");

    try {
      builder.sendRequest(
          null,
          new RequestCallback() {
            public void onError(Request request, Throwable exception) {}

            @SuppressWarnings("deprecation")
            public void onResponseReceived(Request request, Response response) {
              if (response.getStatusCode() == Response.SC_OK) {
                String elementsAsJSONString = response.getText();
                JSONValue elementsAsJSONValue = JSONParser.parse(elementsAsJSONString);
                JSONArray elementsAsJSONArray = elementsAsJSONValue.isArray();
                for (int i = 0; i < elementsAsJSONArray.size(); i++) {

                  JSONValue elementAsJSONValue = elementsAsJSONArray.get(i);
                  JSONObject elementAsJSONObject = elementAsJSONValue.isObject();
                  elementsAsString += elementAsJSONObject.get("id").isNumber().toString() + "-";
                  getParamsByElement(
                      Long.parseLong(elementAsJSONObject.get("id").isNumber().toString()),
                      Integer.parseInt(elementAsJSONObject.get("position_y").isNumber().toString()),
                      Integer.parseInt(elementAsJSONObject.get("position_x").isNumber().toString()),
                      elementAsJSONObject.get("type").isString().stringValue());
                }
              }
            }
          });
    } catch (RequestException e) {
      System.out.println("RequestException");
    }

    // Action de suppression d'un formulaire
    supprimer.addClickHandler(
        new ClickHandler() {
          @Override
          public void onClick(ClickEvent event) {
            // Supprimer le formulaire
            RequestBuilder builder =
                new RequestBuilder(
                    RequestBuilder.PUT, FORMULAIRE_URL + "supprimer/" + formulaire_id);
            builder.setHeader("Content-Type", "application/json");
            try {
              builder.sendRequest(
                  null,
                  new RequestCallback() {
                    public void onError(Request request, Throwable exception) {}

                    public void onResponseReceived(Request request, Response response) {
                      Window.Location.reload();
                    }
                  });
            } catch (RequestException e) {
              System.out.println("RequestException");
            }
          }
        });

    // Action de l'enregistrement du formulaire dans la base de données
    enregistrer.addClickHandler(
        new ClickHandler() {
          public void onClick(ClickEvent event) {
            FormulaireController.recupererElements(choices, options, elements, parametres);
            // Ajouter les elements regroupés dans la base de données
            ajouterFormulaire(elements);
          }
        });

    final Anchor apercu = new Anchor();

    // Création du lien de l'aperçu
    apercu.setHTML(
        "<a class='bouton_enregistrer floatRight' style='margin-right:15px; cursor:pointer'>Aperçu</a>");
    RootPanel.get("button_Enregistrer").add(apercu);
    apercu.addClickHandler(
        new ClickHandler() {
          @SuppressWarnings("rawtypes")
          public void onClick(ClickEvent event) {
            choices = new ArrayList();
            options = new ArrayList();
            elements = new ArrayList();
            parametres = new ArrayList();

            FormulaireController.recupererElements(choices, options, elements, parametres);
            bodyapercu = new BodyApercu();
            // Passer à l'interface de l'aperçu
            Document.get().getBody().removeChild(bodyForm.getElement());
            Document.get().getBody().appendChild(bodyapercu.getElement());
            // Création de la page de l'aperçu
            FormulaireController.pageApercu(
                bodyapercu,
                form.getForm_nom().getValue(),
                form.getForm_comment().getValue(),
                elements,
                parametres,
                choices,
                options);

            Anchor retourAnchor = Anchor.wrap(bodyapercu.getRetour());

            retourAnchor.addClickHandler(
                new ClickHandler() {
                  @Override
                  public void onClick(ClickEvent event) {
                    choices = new ArrayList();
                    options = new ArrayList();
                    elements = new ArrayList();
                    parametres = new ArrayList();
                    Document.get().getBody().removeChild(bodyapercu.getElement());
                    Document.get().getBody().appendChild(bodyForm.getElement());
                  }
                });
          }
        });
  }
  public void ajouterElement(JSONArray parametres, final int x, final int y, final String type) {

    final FormulaireController gc = FormulaireController.getInstance();
    FormulaireBoard cb = gc.getCheckerBoard();
    Widget element = null;
    TextBox label = new TextBox();
    label.addStyleName("inputLabel");
    JSONValue paramAsJSONValue;
    if (type.equals("text") || type.equals("date") || type.equals("time") || type.equals("chiffre"))
      paramAsJSONValue = parametres.get(0);
    else {
      JSONValue parametresValue = parametres.get(0);
      JSONObject parametresObject = parametresValue.isObject();
      if (parametresObject.get("nom").isString().stringValue().equals("titre"))
        paramAsJSONValue = parametres.get(0);
      else paramAsJSONValue = parametres.get(1);
    }
    JSONObject paramAsJSONObject = paramAsJSONValue.isObject();
    label.setText(paramAsJSONObject.get("valeur").isString().stringValue());
    TextBox choix = null;
    final DroppableElement cellule = (DroppableElement) cb.getCell(x, y);
    cellule.type = type;
    Element elem = new Element(new Position(y, x), "deplace");
    elem.getElement().setClassName(elem.getType() + "Style");
    Image suppression = new Image();
    suppression.setUrl("images/formulaire/delete.png");
    suppression.addStyleName("deleteForm");

    String id = Utils.generateId();
    ;

    // Création de l'element selon le type
    if (type.equals("text")) {
      element = new TextBox();
    }
    if (type.equals("image")) {
      element = new Image("../images/formulaire/Photo.png");
    } else if (type.equals("checkbox")) {
      CheckBox c = new CheckBox();
      // Ajout de l'attribut name pour les champs checkbox et radio
      cellule.name = "" + CHOICE;
      element = c;
      // Ajout du label de choix pour les champs de type checkbox et radio
      choix = new TextBox();
      choix.addStyleName("inputLabel");
      choix.getElement().setAttribute("placeholder", "Choix");

    } else if (type.equals("radio")) {
      RadioButton r = new RadioButton("Choix");
      cellule.name = "" + CHOICE;
      element = r;
      choix = new TextBox();
      choix.addStyleName("inputLabel");
      choix.getElement().setAttribute("placeholder", "Choix");
    } else if (type.equals("combobox")) {
      OPTION++;
      // Ajout de l'option pour les champs de type combobox
      cellule.option = "" + OPTION;
      element = new ListBox();
    } else if (type.equals("chiffre")) {
      element =
          new HTML(
              "<input type='text' class='gwt-TextBox' onkeypress=\"if((event.keyCode < 48 || event.keyCode > 57) && event.keyCode != 46){ event.returnValue=false;}else if(event.keyCode == 46 && (this.value == '' || this.value.indexOf('.') != -1)){ event.returnValue =false;} \" />");
    } else if (type.equals("date")) {
      element = new HTML("<input type='text' id='date" + id + "' class='gwt-TextBox' />");
    } else {
      element = new HTML("<input type='text' id='time" + id + "'  class='gwt-TextBox' />");
    }

    HorizontalPanel hp = cellule.getWidgetElement();

    hp.add(label);
    hp.add(element);
    cellule.choix = false;
    if (type.equals("checkbox") || type.equals("radio") || type.equals("combobox")) {

      JSONValue parametresValue = parametres.get(0);
      JSONObject parametresObject = parametresValue.isObject();
      if (parametresObject.get("nom").isString().stringValue().equals("titre"))
        paramAsJSONValue = parametres.get(1);
      else paramAsJSONValue = parametres.get(0);

      paramAsJSONObject = paramAsJSONValue.isObject();

      String ch[] = paramAsJSONObject.get("valeur").isString().stringValue().split("\\*_\\*");
      if (type.equals("checkbox") || type.equals("radio")) {
        choix.setText(ch[0]);
        for (int i = 1; i < ch.length; i++) {
          DroppableElement.ajouterChoix(x + i, y, type, ch[i]);
        }
        CHOICE++;
      } else {
        for (int i = 0; i < ch.length; i++) {
          ((ListBox) element).addItem(ch[i], ch[i]);
        }
      }
    }

    if (choix != null) hp.add(choix);
    hp.add(elem);
    hp.add(suppression);
    cellule.lock();
    if (type.equals("date") || type.equals("time"))
      FormulaireController.nativeMethod(type + id, type);

    // Action de la suppression
    suppression.addClickHandler(
        new ClickHandler() {
          public void onClick(ClickEvent event) {
            // Vider la cellule
            cellule.clear();
            // Si le champs est de type checkbox ou radio, il faix vider les
            // champs de choix également
            if (type.equals("checkbox") || type.equals("radio")) {
              final FormulaireController gc = FormulaireController.getInstance();
              FormulaireBoard c = gc.getCheckerBoard();
              boolean end = false;
              int ligne = x + 1;
              while (!end) {
                DroppableElement cellule_choix = (DroppableElement) c.getCell(ligne, y);
                if (cellule_choix.choix) {
                  cellule_choix.clear();
                  cellule_choix.type = null;
                  cellule_choix.choix = false;
                  cellule_choix.name = null;
                  cellule_choix.enable();
                  ligne++;
                } else end = true;
              }
            }
            // Rendre le champs capable de recevoir des elements puisqu'on
            // l'a vidé
            cellule.enable();
            cellule.type = null;
          }
        });
  }
  @Override
  public void onModuleLoad() {

    /** * Seuls les profils Super Adminisatreur et CA peuvent se connecter à cette page * */
    if (Cookies.getCookie("profil") == null) {
      Window.Location.replace(GWT.getHostPageBaseURL() + "Connexion.html" + Constantes.SUFFIXE_URL);
    } else if (Cookies.getCookie("client") == null)
      Window.Location.replace(
          GWT.getHostPageBaseURL() + "Accueil_superadmin.html" + Constantes.SUFFIXE_URL);
    else if (Cookies.getCookie("profil").equals("CU")) {
      Window.Location.replace(
          GWT.getHostPageBaseURL() + "Accueil_applifit.html" + Constantes.SUFFIXE_URL);
    } else {

      // Ajouter le menu à la page
      MenuForm menu = new MenuForm(Constantes.USER);
      Document.get().getBody().appendChild(menu.getElement());

      /** * action de deconnexion ** */
      Anchor deconnexionWrapper = Anchor.wrap(menu.getDeconnexion());
      deconnexionWrapper.addClickHandler(
          new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
              Utils.deconnexion();
            }
          });

      /** * action Rubrique accueil ** */
      Anchor accueilWrapper = Anchor.wrap(menu.getAccueil());
      accueilWrapper.addClickHandler(
          new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
              if (Cookies.getCookie("profil").equals("SA"))
                Window.Location.replace(
                    GWT.getHostPageBaseURL() + "Accueil_superadmin.html" + Constantes.SUFFIXE_URL);
              else
                Window.Location.replace(
                    GWT.getHostPageBaseURL() + "Accueil_applifit.html" + Constantes.SUFFIXE_URL);
            }
          });
      /** * action de rubrique formulaire ** */
      Anchor formulaireWrapper = Anchor.wrap(menu.getFormulaire());
      formulaireWrapper.addClickHandler(
          new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
              if (Cookies.getCookie("profil").equals("SA")
                  || Cookies.getCookie("profil").equals("CA"))
                Window.Location.replace(
                    GWT.getHostPageBaseURL()
                        + "Formulaire_menu_applifit.html"
                        + Constantes.SUFFIXE_URL);
              else
                Window.Location.replace(
                    GWT.getHostPageBaseURL()
                        + "Formulaire_consulter_applifit.html"
                        + Constantes.SUFFIXE_URL);
            }
          });

      // Ajouter la zone de recherche à la page
      Document.get().getBody().insertAfter(recherche.getElement(), menu.getElement());
      nativeMethod("datepicker");
      // Remplire la liste des formulaires par les formulaires actifs liés
      // à la société courante
      FormulaireController.alimenterListeForm(
          FORMULAIRE_URL + "listerFormulaire/entreprise/" + Cookies.getCookie("client"), recherche);

      // Ajouter action por le button de recherche
      Anchor search = Anchor.wrap(recherche.getSearch_link());
      search.addClickHandler(
          new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
              final ListBox lb = ListBox.wrap(recherche.getFormulaire());
              // Vider la liste
              lb.clear();
              lb.addItem("Choisir un formulaire...", "");

              // Lancer la recherche du formulaire selon le nom et la date
              // de création
              FormulaireController.rechercheForm(recherche);

              // Ajouter action on change de la liste des formulaires ,
              // affichant le formulaire selectionné
              final ListBox lb2 = ListBox.wrap(recherche.getFormulaire());
              lb2.addChangeHandler(
                  new ChangeHandler() {
                    @SuppressWarnings("rawtypes")
                    @Override
                    public void onChange(ChangeEvent event) {
                      elements = new ArrayList();
                      parametres = new ArrayList();
                      choices = new ArrayList();
                      options = new ArrayList();
                      // Si la ligne selectionnée n'est pas le prompt de
                      // la liste
                      if (lb.getSelectedIndex() != 0) {
                        // Récuperer la valeur selectionnée
                        formulaire_id = Long.parseLong(lb.getValue(lb.getSelectedIndex()));

                        // Récuperer les elements et parametres du
                        // formulaire et les afficher dans la zone de
                        // modification
                        chargerFormulaire();
                      }
                    }
                  });
            }
          });

      // Ajouter action on change de la liste des formulaires , affichant
      // le formulaire selectionné
      final ListBox lb = ListBox.wrap(recherche.getFormulaire());

      lb.addChangeHandler(
          new ChangeHandler() {
            @SuppressWarnings("rawtypes")
            @Override
            public void onChange(ChangeEvent event) {
              elements = new ArrayList();
              parametres = new ArrayList();
              choices = new ArrayList();
              options = new ArrayList();
              // Si la ligne selectionnée n'est pas le prompt de la liste
              if (lb.getSelectedIndex() != 0) {
                // Récuperer la valeur selectionnée
                formulaire_id = Long.parseLong(lb.getValue(lb.getSelectedIndex()));
                // Récuperer les elements et parametres du formulaire et
                // les afficher dans la zone de modification
                chargerFormulaire();
              }
            }
          });
    }
  }