/*
 *  Classe MAHSAdminForm ---->TODO COMMENT<-----
 */

/* 
 * Questa classe permette TODO
 *
 * @author Antonio Bencivenga <a.bencivenga@mahs.it>, Marco Giammarini <m.giammarini@mahs.it>
 * @version 0.1.0
 * @copyright 2009-2010 - MAHS di Antonio Bencivenga - www.mahs.it  
 * @package mahsJS/mahsJSAdmin
 */
var MAHSAdminForm = 
{
  errorMsg:
  {
    0: "No Error",
    1: "Si sono verificati i seguenti Errori: Ci sono campi obbligatori NON VALIDI o che NON sono stati RIEMPITI.",
    2: "Si sono verificati i seguenti Errori: Ci sono campi opzionali NON VALIDI." 
  },

  createFormTitle: function(nameOperation, titleText, level)
  {
    // Ciclo che permette di determinare quante "sub" bisogna aggiungere.
    var stringlevel = "";
    // Se level è undefined lo setto uguale a 0.
    if(level == undefined)
      level = 0;
    for(var i = 0; i < level; i++)
    {
      stringlevel += "sub";
    }

    var title = MAHSHtml.tag("p","admin-" + stringlevel + "form-title",nameOperation + "-title");

    var titleTesto = document.createTextNode(titleText);
    title.appendChild(titleTesto);

    return title;
  },

  createFormEmptyMessage: function(nameOperation, msgText, level)
  {
    // Ciclo che permette di determinare quante "sub" bisogna aggiungere.
    var stringlevel = "";
    // Se level è undefined lo setto uguale a 0.
    if(level == undefined)
      level = 0;
    for(var i = 0; i < level; i++)
    {
      stringlevel += "sub";
    }

    var title = MAHSHtml.tag("p","admin-" + stringlevel + "emptymsg",nameOperation + "-emptymsg");

    var titleTesto = document.createTextNode(msgText);
    title.appendChild(titleTesto);

    return title;
  },
  
  createFormReport: function(nameOperation, reportText, level)
  {
    // Ciclo che permette di determinare quante "sub" bisogna aggiungere.
    var stringlevel = "";
    // Se level è undefined lo setto uguale a 0.
    if(level == undefined)
      level = 0;
    for(var i = 0; i < level; i++)
    {
      stringlevel += "sub";
    }

    var report = MAHSHtml.tag("p","admin-" + stringlevel + "form-report",nameOperation + "-report");

    var reportTesto = document.createTextNode(reportText);
    report.appendChild(reportTesto);

    return report;
  },

  createFormButtonRow: function(nameOperation, level)
  {
    // Ciclo che permette di determinare quante "sub" bisogna aggiungere.
    var stringlevel = "";
    // Se level è undefined lo setto uguale a 0.
    if(level == undefined)
      level = 0;
    for(var i = 0; i < level; i++)
    {
      stringlevel += "sub";
    }

    var div = MAHSHtml.tagDIV("admin-" + stringlevel + "button-row", nameOperation + "-button-row");

    return div;
  },

  createForm: function(nameOperation, methodForm, actionForm)
  {
    var form = MAHSHtml.tagFORM("admin-form",nameOperation + "-form",methodForm,actionForm);

    return form;
  },

  createFieldset: function(nameOperation)
  {
    var fieldset = MAHSHtml.tagFIELDSET("admin-fieldset",nameOperation + "-fieldset");

    return fieldset;
  },

  createLegend: function(nameOperation, textLegend)
  {
    var legend = MAHSHtml.tagLEGEND("admin-legend",nameOperation + "-legend", textLegend);

    return legend;
  },

  /*
   * Metodo che permette l'inserimento di una textarea.
   *
   */
  createTextarea: function(nameOperation, labelName, valueRequired, taName, taValue, taClass, taRows, taCols, fieldset, level)
  {
    // Ciclo che permette di determinare quante "sub" bisogna aggiungere.
    var stringlevel = "";
    // Se level è undefined lo setto uguale a 0.
    if(level == undefined)
      level = 0;
    for(var i = 0; i < level; i++)
    {
      stringlevel += "sub";
    }

    // Viene creato il div per contenere la label, la textarea e la pulsantiera.
    var div = MAHSHtml.tagDIV("form-row admin-row", "");

    //var id = nameOperation.substring(0,nameOperation.indexOf("-"));

    var labelClass = "";
    if(valueRequired)
      labelClass = "admin-" + stringlevel + "label label-required";
    else
      labelClass = "admin-" + stringlevel + "label";

    // Creo la label per la textarea.
    var label = MAHSHtml.tagLABEL(labelClass,nameOperation + "-label",nameOperation + "-textareaplus");

    var labelText = document.createTextNode(labelName);
    label.appendChild(labelText);

    div.appendChild(label);

    // Creo la textarea.
    var ta = MAHSHtml.tagTEXTAREA("admin-" + stringlevel + "taplus " + taClass,nameOperation + "-taplus", taName, taValue, taRows, taCols, false);

    div.appendChild(ta);
    fieldset.appendChild(div);
    return ta;    
  },
  
  /*
   * Metodo che permette l'inserimento di una textarea con possibilità di formattazione del testo.
   *
   */
  createTextareaPlus: function(nameOperation, labelName, valueRequired, taName, taValue, taClass, taRows, taCols, fieldset, level)
  {
    // Ciclo che permette di determinare quante "sub" bisogna aggiungere.
    var stringlevel = "";
    // Se level è undefined lo setto uguale a 0.
    if(level == undefined)
      level = 0;
    for(var i = 0; i < level; i++)
    {
      stringlevel += "sub";
    }

    // Viene creato il div per contenere la label, la textarea e la pulsantiera.
    var div = MAHSHtml.tagDIV("form-row admin-row", "");

    //var id = nameOperation.substring(0,nameOperation.indexOf("-"));

    var labelClass = "";
    if(valueRequired)
      labelClass = "admin-" + stringlevel + "label label-required";
    else
      labelClass = "admin-" + stringlevel + "label";

    // Creo la label per la textarea.
    var label = MAHSHtml.tagLABEL(labelClass,nameOperation + "-label",nameOperation + "-textareaplus");

    var labelText = document.createTextNode(labelName);
    label.appendChild(labelText);

    div.appendChild(label);

    // Creo la textarea.
    var ta = MAHSHtml.tagTEXTAREA("admin-" + stringlevel + "taplus " + taClass,nameOperation + "-taplus", taName, taValue, taRows, taCols, false);

    div.appendChild(ta);

    // TODO i link per creare la tastiera.
    // Viene creato il div per contenere solo la pulsantiera.
    var divButton = MAHSHtml.tagDIV("admin-" + stringlevel + "taplus-button", "");

    var linkButton = MAHSHtml.tagA("","","textarea=bold&info=" + nameOperation + "-taplus", "Inserisci del testo in grassetto");
    MAHSCore.addEventListener(linkButton, "click", MAHSAdminForm.eventTextareaPlus);
    linkButton.appendChild(MAHSHtml.tagIMG("","","images/bold.gif","Bold"));
    divButton.appendChild(linkButton); 

    linkButton = MAHSHtml.tagA("","","textarea=underline&info=" + nameOperation + "-taplus", "Inserisci del testo sottolineato");
    MAHSCore.addEventListener(linkButton, "click", MAHSAdminForm.eventTextareaPlus);
    linkButton.appendChild(MAHSHtml.tagIMG("","","images/underline.gif","Underline"));
    divButton.appendChild(linkButton); 

    linkButton = MAHSHtml.tagA("","","textarea=italic&info=" + nameOperation + "-taplus", "Inserisci del testo in italico");
    MAHSCore.addEventListener(linkButton, "click", MAHSAdminForm.eventTextareaPlus);
    linkButton.appendChild(MAHSHtml.tagIMG("","","images/italic.gif","Italic"));
    divButton.appendChild(linkButton); 

    linkButton = MAHSHtml.tagA("","","textarea=left&info=" + nameOperation + "-taplus", "Inserisci del testo allineato a sinistra");
    MAHSCore.addEventListener(linkButton, "click", MAHSAdminForm.eventTextareaPlus);
    linkButton.appendChild(MAHSHtml.tagIMG("","","images/left.gif","Left"));
    divButton.appendChild(linkButton); 

    linkButton = MAHSHtml.tagA("","","textarea=center&info=" + nameOperation + "-taplus", "Inserisci del testo allineato al centro");
    MAHSCore.addEventListener(linkButton, "click", MAHSAdminForm.eventTextareaPlus);
    linkButton.appendChild(MAHSHtml.tagIMG("","","images/center.gif","Center"));
    divButton.appendChild(linkButton); 

    linkButton = MAHSHtml.tagA("","","textarea=right&info=" + nameOperation + "-taplus", "Inserisci del testo allineato a destra");
    MAHSCore.addEventListener(linkButton, "click", MAHSAdminForm.eventTextareaPlus);
    linkButton.appendChild(MAHSHtml.tagIMG("","","images/right.gif","Right"));
    divButton.appendChild(linkButton);

    div.appendChild(divButton);

    fieldset.appendChild(div);
    return ta;
  },

  /*
   * TODO
   */
  eventTextareaPlus: function(event)
  {
    var button = this;

    MAHSCore.preventDefault(event);

    var operation = MAHSAjax.getParam("textarea",this.href);
    //var operationId = MAHSAjax.getParam("id",this.href);
    var operationInfo = MAHSAjax.getParam("info",this.href);

    var newText = "";

    switch(operation)
    {
      case 'bold':
        newText = "[bold]\n" + prompt("Inserire il testo che si vuole formattare in GRASSETTO:") + "\n[/bold]\n";
      break;
      case 'underline':
        newText = "[underline]\n" + prompt("Inserire il testo che si vuole formattare in SOTTOLINEATO:") + "\n[/underline]\n";
      break;
      case 'italic':
        newText = "[italic]\n" + prompt("Inserire il testo che si vuole formattare in ITALICO:") + "\n[/italic]\n";
      break;
      case 'right':
        newText = "[right]\n" + prompt("Inserire il testo che si vuole ALLINEARE A DESTRA:") + "\n[/right]\n";
      break;
      case 'center':
        newText = "[center]\n" + prompt("Inserire il testo che si vuole ALLINEARE AL CENTRO:") + "\n[/center]\n";
      break;
      case 'left':
        newText = "[left]\n" + prompt("Inserire il testo che si vuole ALLINEARE A SINISTRA:") + "\n[/left]\n";
      break;
    }

    document.getElementById(operationInfo).value += newText;
  },

  createInput: function(nameOperation, labelName, valueRequired, inputName, inputValue, inputClass, inputLength, fieldset, level)
  {
    // Ciclo che permette di determinare quante "sub" bisogna aggiungere.
    var stringlevel = "";
    // Se level è undefined lo setto uguale a 0.
    if(level == undefined)
      level = 0;
    for(var i = 0; i < level; i++)
    {
      stringlevel += "sub";
    }

    // Viene creato il div per contenere la label e l'input.
    var div = MAHSHtml.tagDIV("form-row admin-row", "");

    var labelClass = "";
    if(valueRequired)
      labelClass = "admin-" + stringlevel + "label label-required";
    else
      labelClass = "admin-" + stringlevel + "label";

    // Creo la label per l'input.
    var label = MAHSHtml.tagLABEL(labelClass,nameOperation + "-label",nameOperation + "-input");

    var labelText = document.createTextNode(labelName);
    label.appendChild(labelText);

    div.appendChild(label);

    // Creo l'elemento input.
    var input = MAHSHtml.tagINPUT("admin-" + stringlevel + "input " + inputClass,nameOperation + "-input","text",inputName, inputValue, inputLength, false);

    div.appendChild(input);
    fieldset.appendChild(div);

    return input;
  },

  /**
   * TODO
   */
  createInputFile: function(nameOperation, labelName, valueRequired, inputName, inputValue, inputClass, fieldset, level)
  {
    // Ciclo che permette di determinare quante "sub" bisogna aggiungere.
    var stringlevel = "";
    // Se level è undefined lo setto uguale a 0.
    if(level == undefined)
      level = 0;
    for(var i = 0; i < level; i++)
    {
      stringlevel += "sub";
    }

    // Viene creato il div per contenere la label e l'input.
    var div = MAHSHtml.tagDIV("form-row admin-row", "");

    var labelClass = "";
    if(valueRequired)
      labelClass = "admin-" + stringlevel + "label label-required";
    else
      labelClass = "admin-" + stringlevel + "label";

    // Creo la label per l'input.
    var label = MAHSHtml.tagLABEL(labelClass,nameOperation + "-label",nameOperation + "-input");

    var labelText = document.createTextNode(labelName);
    label.appendChild(labelText);

    div.appendChild(label);

    // Creo l'elemento input.
    var input = MAHSHtml.tagINPUT("admin-" + stringlevel + "file " + inputClass,nameOperation + "-input","file",inputName, inputValue, 0, false);

    div.appendChild(input);
    fieldset.appendChild(div);

    return input;
  },
  
  createInputButton: function(nameOperation, inputClass, inputName, inputValue, inputType)
  {
    var input = MAHSHtml.tagINPUT("admin-button " + inputClass, nameOperation + "-button",inputType, inputName, inputValue, 0, false);

    return input;
  },
  
  /**
   * Metodo che permette di creare un campo input hydden.
   * 
   * @param nameOperation ...
   * @param inputClass ...
   * @param inputName ...
   * @param inputValue ...
   * @param fieldset ...
   */
  createInputHidden: function(nameOperation, inputClass, inputName, inputValue, fieldset)
  {
    var input = MAHSHtml.tagINPUT("admin-hidden " + inputClass, nameOperation + "-hidden","hidden", inputName, inputValue, 0, false);

    fieldset.appendChild(input);

    return input;
  },  

  formValidation: function(formToValidate,report)
  {
    // Prendo tutti gli elementi del form.
    var elementOfForm = formToValidate.elements;

    // Controllo se ogni elemento rispetta le regole di validazione.
    for(var j = 0; j < elementOfForm.length; j++)
    {
      // Acquisisco le classi associate.
      var classNames = elementOfForm[j].className.split(" ");
      var classLenght = classNames.length;

      // Controllo tutti gli elementi obbligatori.
      if(MAHSCore.hasClass(elementOfForm[j],"required"))
      {
        // Se questi non sono validi, oppure sono vuoti blocco la funzione.
        if((elementOfForm[j].value == "") || (MAHSCore.hasClass(elementOfForm[j],"not-validate")))
        {
          // Scrivo il messaggio di errore nel report.
          MAHSHtml.truncateNode(report);
          report.appendChild(document.createTextNode(MAHSAdminForm.errorMsg[1]));
          MAHSCore.addClass(report,"report-error");
          return 1;
        }
      }
      // Controllo anche gli elementi non obbligatori.
      if(MAHSCore.hasClass(elementOfForm[j],"no-required"))
      {
        // Se questi non sono validi blocco la funzione.
        if(MAHSCore.hasClass(elementOfForm[j],"not-validate"))
        {
          // Scrivo il messaggio di errore nel report.
          MAHSHtml.truncateNode(report);
          report.appendChild(document.createTextNode(MAHSAdminForm.errorMsg[2]));
          MAHSCore.addClass(report,"report-error");
          return 2;
        }
      }
    }
    return 0;
  },

  loadingReport: function(report)
  {
    // Prima svuoto il contenuto del report.
    MAHSHtml.truncateNode(report);
    // Elimino la classe che indica la non validità del form.
    MAHSCore.removeClass(report, "report-error");
    // Poi creo l'immagine.
    report.appendChild(MAHSHtml.tagIMG("","","images/ajax-loader.gif",""));
    // Aggiungo la scritta 'Loading...'.
    report.appendChild(document.createTextNode("Loading..."));
  },

  confirmReport: function(report)
  {
    // Prima svuoto il contenuto del report.
    MAHSHtml.truncateNode(report);
    // Elimino la classe che indica la non validità del form.
    MAHSCore.removeClass(report, "report-error");
    // Aggiungo la classe che ne indica la validità.
    MAHSCore.addClass(report, "report-confirm");
    // Aggiungo la scritta 'Loading...'.
    report.appendChild(document.createTextNode("Operazione eseguita correttamente!"));
  },

  getFormParameters: function(formToRead)
  {
    // Creo l'array che conterrà tutti gli elementi che devono essere utilizzati 
    // per inviare parametri.
    var formElements = [];
    // Prendo tutte le textarea.
    var textareas = formToRead.getElementsByTagName("textarea");
    for (var i = 0; i < textareas.length; i++)
    {
      formElements[formElements.length] = textareas[i];
    }
    // Prendo tutti i select.
    var selects = formToRead.getElementsByTagName("select");
    for (var i = 0; i < selects.length; i++)
    {
      formElements[formElements.length] = selects[i];
    }
    // Prendo tutti gli input.
    var inputs = formToRead.getElementsByTagName("input");
    for (var i = 0; i < inputs.length; i++)
    {
      var inputType = inputs[i].getAttribute("type");
      if (inputType == null || inputType == "text" || inputType == "hidden" || inputType == "password" || (typeof inputs[i].checked != "undefined" && inputs[i].checked == true))
      {
        formElements[formElements.length] = inputs[i];
      }
    }

    // La variabile che conterrà parte della stringa dei parametri da mandare al server.
    var parameters = "";
    // Prelevo da tutti gli elementi il nome ed il relativo valore.
    for (var i = 0; i < formElements.length; i++)
    {
      var elementName = formElements[i].getAttribute("name");
      if (elementName != null && elementName != "")
      {
        parameters += "&" + elementName + "=" + encodeURIComponent(formElements[i].value);
      }
    }
    return parameters;
  },

  getRowOfTable: function(key,level,id)
  {
    // Ciclo che permette di determinare quante "sub" bisogna aggiungere.
    var stringlevel = "";
    // Se level è undefined lo setto uguale a 0.
    if(level == undefined)
      level = 0;
    for(var i = 0; i < level; i++)
    {
      stringlevel += "sub";
    }

    // Se id è undefined lo setto uguale a 0.
    if(id == undefined)
      id = 0;
    
    // Creo la variabile per prendere la lista delle righe.
    var row = null;
    
    // Se l'id e il level sono uguali a 0 voglio la riga della tabella base.
    if((id == 0) && (level == 0))
	  row = MAHSCore.getElementsByClass("admin-nome-span");
    else
      row = MAHSCore.getElementsByClass( id + "-admin-" + stringlevel + "nome-span");

    if(row.length > 0)
    {
      // Array per contenere i nomi e gli id presenti nella tabella visualizzata.
      var rowName = new Array(row.length);
      var rowId = new Array(row.length);
      // Riempio gli array.
      for(var k = 0; k < row.length; k++)
      {
        rowName[k] = row[k].firstChild.nodeValue;
        rowId[k] = row[k].getAttribute("id");
      }
      // Inserisco la nuova chiave all'interno dell'array.
      rowName.push(key);
      // Ordino il nuovo array senza badar a maiuscole/minuscole.
      rowName.sort(MAHSUtility.compareString);
      // Estraggo la posizione in cui è stato inserito il nuovo elemento
      var position = MAHSUtility.arrayIndexOf(rowName,key);
      // Ritorno l'id dell'elemento che deve essere spostato.
      return rowId[position];
    }
    else
      return -1;
  }
};

/* TODO
 *
 *
 */
var MAHSFormAdminOk = function(box, delClass, Sbox, delSClass)
{
  this.box = box;
  this.delClass = delClass;

  this.Sbox = Sbox;
  this.delSClass = delSClass;

  this.launch = function()
  {
    var ajaxformok = this;

    return function()
    {
      for(var j = 0; j < ajaxformok.delClass.length; j++)
      {
        MAHSCore.removeClass(ajaxformok.box,ajaxformok.delClass[j]);
      }
      MAHSHtml.truncateNode(ajaxformok.box);

      if(ajaxformok.Sbox != null)
      {
        for(var j = 0; j < ajaxformok.delSClass.length; j++)
        {
          MAHSCore.removeClass(ajaxformok.Sbox,ajaxformok.delSClass[j]);
        }
      }
    };
  };
};

