/*************************************************************************[info]
  OBJECT:               Manager
  REQUIRED:             Framework eXtend (v2) (eXtend)
  DATA:                 13/01/2010
  COMPANY:              Onlime S.n.c.
 
  VERS:                 1.0
  LAST EDIT:            13/01/2010
  
  PURPOSE:              Gestione stream errori
  
  TODO:                 
    - ...
    
  LIMITI:  
    - ....
*******************************************************************************/
(function() {
/*******************************************************************************
  [Manager OBJECT]  
*******************************************************************************/
Manager = {};
/*******************************************************************************
  [Manager OBJECT]  
*******************************************************************************/ 

// Funzione per l'analisi del flusso
Manager.parseStream = function( stream )
{ 
  Manager.clearError(stream);
  // Parse header 
  switch( stream["header"]["tipo"] )
  {   
    // caso successo
    case 0  :   if( $(stream["header"]["caller"]) ) $E.fire( $(stream["header"]["caller"]), "success", { "stream" : stream } );
                break;
    
    // caso errore di sistema (generale) -> derivante da una chiamata AJAX con un valore di stream di tipo "errore generico" con azione da definire         
    case 1  :   if( $(stream["header"]["caller"]) ) $E.fire( $(stream["header"]["caller"]), "error", { "stream" : stream } );
                break;
    
    // caso errori singoli
    case 2  :   Manager.parseDataError(stream);
                if ( $(stream["header"]["caller"]) && ( stream.data.length > 0) ) $E.fire( $(stream["header"]["caller"]), "error", { "stream" : stream } );
                break;
                
    // caso notifiche generali -> globali della pagina. Risultanti anche dal JS interno. L'azione è predisposta di default.
    case 3  :   Manager.parseDataMsg(stream);
                break;
    
    default :   return false;
                break;                  
  }
  
  return true;
};

Manager.parseDataError = function( stream )
{
  var maxData = stream.data.length;
  for ( var i=0; i < maxData ; i++ )
  {
    switch( stream["data"][i]["mod"] )
    {
      case 0 :  
                if ( $(stream["data"][i]["elem"]).XEditor )
                {                  
                  if ( $(stream["data"][i]["elem"] + "_iframe") )  $(stream["data"][i]["elem"] + "_iframe").fn.manageClassName("add", "errorIframe");
                }
                else                
                {
                  if ( $(stream["data"][i]["elem"] + "_container") )  
                  {
                    $(stream["data"][i]["elem"] + "_container").fn.manageClassName("add", "error");
                  }
                  else
                  {
                    $(stream["data"][i]["elem"]).fn.manageClassName("add", "error");
                  }
                }
                
                if ( $(stream["data"][i]["elem"] + "_title") )      $(stream["data"][i]["elem"] + "_title").fn.manageClassName("add", "error");
                
                /*
                if ( $(stream["data"][i]["elem"] + "_desc") )
                {
                  $(stream["data"][i]["elem"] + "_desc").fn.manageClassName("add", "errordesc");
                  
                  if ( stream["data"][i]["num"] === "" )
                  {
                    $(stream["data"][i]["elem"] + "_desc").appendChild(document.createTextNode( stream["data"][i]["msg"] ) );
                  }
                  else
                  {
                    $(stream["data"][i]["elem"] + "_desc").appendChild(document.createTextNode( Manager.getErrorDescription(stream["data"][i]["num"], Manager.lang ) ) );
                  }
                                  
                  
                }
                */
    }
  }

}

Manager.clearError = function( stream )
{
  if( !$(stream["header"]["caller"]) ) return null;

  // Cancello gli errori solo in caso di FORM - serve per la gestione file sopratutto  
  if ( $(stream["header"]["caller"]).tagName == "undefined" ) return null;
	if ( $(stream["header"]["caller"]).tagName.toLowerCase() != "form" ) return null;

  var els = $(stream["header"]["caller"]);      // Puntatore agli elementi della form  
  for (var i = 0; i<els.length; i++) 
  { 
		el = els[i];
		
		// Controllo se il campo deve essere escluso
		isToExclude = el.getAttribute("exclude");
		if( (isToExclude) && (isToExclude=="true") ) continue;
		
		if ( !el.type ) continue;               // Elementi non contemplato ( fieldset-legend )
		
		switch ( el.type.toLowerCase() )
    { 
      case "hidden":      if ( $(el.id).XEditor )
                          {
                            $(el.id + "_iframe").style.border = "1px solid gray";
                            if ( $(el.id + "_iframe") )  $(el.id + "_iframe").fn.manageClassName("remove", "errorIframe");
                          }
			case "text": 
			case "password": 
			case "textarea": 
			case "select":
      case "checkbox": 
			case "select-one":	if ( $(el.id + "_title") )      $(el.id + "_title").fn.manageClassName("remove", "error");
                          
                          if ( $(el.id + "_container") )  
                          {
                            $(el.id + "_container").fn.manageClassName("remove", "error");
                          }
                          else
                          {
                            $(el.id).fn.manageClassName("remove", "error");
                          }
                          /*
                          if ( $(el.id + "_desc") )
                          {
                            $( el.id + "_desc" ).fn.manageClassName("remove", "errordesc");                
                            removeAllChild( $( el.id + "_desc" ) );
                          }
                          */
                  				break;                  				
			case "radio":       break; 
			                    // Ci sono più ID. Dobbiamo capire come gestirli. Se sono array di elementi id[] basta togliere le [] e chiamare
			                    // il contenitore/campo errore id_container id_err. Così possiamo avere una singola gestione e non n. Anche se 
			                    // qui andrebbe definita una pensata. Chiaramente la stessa anche per far scattare l'errore. Di solito
			                    // si lega il controllo ad un solo elemento. I dati vengono passati tutti in diversi cicli del for, ma solo
			                    // uno fa scattare il controllo. Le prestazioni aumentano.
                				  break; 
		} 
	} 
}

Manager.parseDataMsg = function( stream )
{
  
}

Manager.getErrorDescription = function( errorCode, lang )
{
  if (!lang) lang = "ita";
  if ( typeOf(errorCode) == "number" ) errorCode = errorCode.toString(); 
  return ERROR[errorCode][lang];   
}

Manager.setLang = function( lang )
{
  Manager.lang = lang;
}

Manager.setNotify = function( mex )
{ 
  removeAllChild( $("notify") );
  $("notify").appendChild( document.createTextNode(mex) ); 
  $("notify").fn.manageClassName("add", "active"); 
}

//            
Manager.lang = "ita";

// JCustomEvent                             
//Manager.onevent = new JCustomEvent( "event" );

/*******************************************************************************
  [END Manager OBJECT]  
*******************************************************************************/

})();


// Devo definire l'array con gli errori di sistema ( cod. inferiori a 5000 )
// questo codice sarà residente sul server centrale.

var ERROR = [];
ERROR["0"]  =  { "ita" : "Errore di sistema" };
ERROR["1"]  =  { "ita" : "Campo obbligatorio" };
ERROR["2"]  =  { "ita" : "Stringa troppo corta" };
ERROR["3"]  =  { "ita" : "Stringa troppo lunga" };
ERROR["4"]  =  { "ita" : "Campo non valido" };
ERROR["5"]  =  { "ita" : "Valore troppo piccolo" };
ERROR["6"]  =  { "ita" : "Valore troppo grande" };
ERROR["7"]  =  { "ita" : "Password non valida" };
ERROR["8"]  =  { "ita" : "Conferma password non coincide" };
ERROR["9"]  =  { "ita" : "Data non valida" };
ERROR["10"] =  { "ita" : "File non permesso" };
ERROR["11"] =  { "ita" : "Il file eccede le dimensioni consentite" };
ERROR["12"] =  { "ita" : "File non caricato correttamente" };
ERROR["13"] =  { "ita" : "Tag HTML non permessi" };

// Aggiungo al codice residente sul server le aggiunte sul client. Che risiedono
// in questo file

ERROR["5000"] =  { "ita" : "Errore personalizzato" };