
/************************************************************************************************

 ============
 codeclear.js
 ============

 Autore: Francesco Giuliani <fgiuliani.consulenti@sogei.it>
 Data di creazione: 24/06/2006
 Ultima modifica: 03/07/2006


 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?par=val

 * _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 il testo STR (2) alla fine del contenuto del
                                        nodo OBJ.

 * _recParseTree_( OBJ ) => BOOL        Esamina l'intera struttura (modellata ad albero) del
                                        documento, alla ricerca di elementi di tipo A mal
                                        formati o nei contenuti dei quali appendere un'etichetta.
                                        Restituisce "true" nel caso venga eseguita la
                                        cancellazione di qualche nodo; altrimenti "false".

 * _main_()                             Funzione di avvio esecuzione.

************************************************************************************************/



var _check_link = true;
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 ) {
 if( _elem.innerHTML.indexOf( "&nbsp;" + _text ) === -1 )
  _elem.innerHTML += "&nbsp;" + _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 );
}

// window.onload = _main_;
