
/************************************************************************************************

 ============
 codeclear.js
 ============

 Data di creazione: 24/06/2006
 Ultima modifica: 23/10/2007


 Obiettivi
 ---------

 1] Pulitura di elementi di tipo 'A' mal generati.
    Un descrittore di tipo 'A' è mal generato se non è un'ancora ed il suo contenuto è vuoto.

 2] Associazione di testi esplicativi ai link a documenti PDF e ZIP.


 Configurazione
 --------------

 * _check_link = BOOL                   Decide se fare il controllo dei link mal generati.

 * _check_docs = BOOL                   Decide se aggiungere etichette di testo ai collegamenti
                                        a documenti.


 Funzioni
 --------

 * _isBadLink_( OBJ ) => BOOL           Decide se il nodo OBJ di tipo A è mal generato.

 * _isDocLink_( STR, STR ) => BOOL      Decide se il riferimento ipertestuale STR (1) è collegato
                                        ad un documento di tipo STR (2):

                                        Riconosce, ad esempio: .zip | .zip?par1=val1&par2=val2

 * _delBadLink_( OBJ )                  Elimina il nodo OBJ (di tipo A). Elimina, inoltre,
                                        ricorsivamente i nodi padre rimasti con contenuto vuoto
                                        a causa della cancellazione dei nodi figlio.
                                        Ad esempio, il seguente annidamento di tag verrà
                                        cancellato, ricorsivamente, per intero a partire da A:

                                        <div>
                                         <ul>
                                          <li>
                                           <a href="http://www.sogei.it"></a>
                                          </li>
                                         </ul>
                                        </div>

 * _addLabel_( OBJ, STR )               Inserisce la stringa STR alla fine del contenuto del
                                        nodo OBJ di tipo A, ma solo se la stringa STR non appare
                                        già in qualche nodo successivo a OBJ.

                                        L'etichetta viene applicata nel seguente esempio:
                                        <p><a href="doc.pdf">doc</a></p>

                                        che diventa:
                                        <p><a href="doc.pdf">doc - pdf</a></p>

                                        L'etichetta non viene applicata nel seguente esempio:
                                        <p><a href="doc.pdf">doc</a> (PDF - 50kb)</p>

 * _recParseTree_( OBJ ) => BOOL        Esamina l'intera struttura (modellata ad albero) del
                                        documento, alla ricerca di elementi di tipo A mal
                                        formati o di contenuti ai quali appendere un'etichetta.
                                        Restituisce "true" nel caso venga eseguita la
                                        cancellazione di qualche nodo; altrimenti "false".

 * _main_()                             Funzione di avvio esecuzione.


************************************************************************************************/



if( _check_link == null ) { var _check_link = true; }
if( _check_docs == null ) { var _check_docs = true; }

function _isBadLink_( _elem ) {
 return ( ( _elem.innerHTML.replace( /[\s\n\f\r\t\v]/g, "" ) == "" ) && ( _elem.href != "" ) )? true : false;
}

function _isDocLink_ ( _href, _type ) {
 var _regexp = new RegExp( "\\." + _type + "\(\\\?\.\*\)\?\$", "ig" );
 return ( _href.match( _regexp ) )? true : false;
}

function _delBadLink_( _elem ) {
 do {
  var _current = _elem.parentNode;
  _current.removeChild( _elem );
  _elem = _current;
 } while( ( _elem.innerHTML.replace( /[\s\n\f\r\t\v]/g, "" ) == "" ) && ( _elem != document ) );

 return;
}

function _addLabel_( _elem, _text ) {
 var _regexp1 = new RegExp( _elem.innerHTML.replace( /[\s\n\f\r\t\v]/g, "" ).replace( /[\?\*\+\(\)\[\]\{\}\-]/g, "."  ) + "</a>.{0,50}" + _text + ".*<a", "ig" );
 var _regexp2 = new RegExp( _elem.innerHTML.replace( /[\s\n\f\r\t\v]/g, "" ).replace( /[\?\*\+\(\)\[\]\{\}\-]/g, "."  ) + "</a>.{0,50}<a", "ig" );
 var _regexp3 = new RegExp( _elem.innerHTML.replace( /[\s\n\f\r\t\v]/g, "" ).replace( /[\?\*\+\(\)\[\]\{\}\-]/g, "."  ) + "</a>.{0,50}" + _text, "ig" );

 if( _elem.innerHTML.indexOf( " - " + _text ) === -1 ) {
  if( _elem.parentNode.innerHTML.replace( /[\s\n\f\r\t\v]/g, "" ).match( _regexp1 ) )
   ;
  else if( _elem.parentNode.innerHTML.replace( /[\s\n\f\r\t\v]/g, "" ).match( _regexp2 ) )
   _elem.innerHTML += " - " + _text;
  else if( _elem.parentNode.innerHTML.replace( /[\s\n\f\r\t\v]/g, "" ).match( _regexp3 ) )
   ;
  else
   _elem.innerHTML += " - " + _text;
 }

 return;
}

function _recParseTree_( _elem ) {
 var _coderet = false;

 if( _elem != null ) {
  if( (_elem.tagName == "A") || (_elem.tagName == "a") ) {
   if( _isBadLink_( _elem ) ) {
    if( true == _check_link ) {
     _delBadLink_( _elem );
     _coderet = true;
    }
   }
   else if( _isDocLink_( _elem.href, "zip" ) ) {
    if( true == _check_docs ) {
     _addLabel_( _elem, "zip" );
    }
   }
   else if( _isDocLink_( _elem.href, "pdf" ) ) {
    if( true == _check_docs ) {
     _addLabel_( _elem, "pdf" );
    }
   }
  }
  else {
   for( var _count = 0; _count < _elem.childNodes.length; _count++ )
    if( ( _elem.nodeType === 1 ) || ( _elem.nodeType === 9 ) )
     if( true === ( _coderet = _recParseTree_( _elem.childNodes[_count] ) ) )
      _count -= 1;
  }
 }

 return _coderet;
}

function _main_() {
 return _recParseTree_( document );
}


/******
  Nota
 ******

 E' premessa la definizione di un solo evento "onload" per documento.
 Infatti, più definizioni non sono cumulative, ma si sovrascrivono.
 Attivare l'evento da qui solo se non presente in altri script della pagina;
 altrimenti avviare la funzione "_main_" altrove.

*/

// window.onload = _main_;



