
function hilight_glossary_entries( areas, entries, elem, css_class, title, first_only, skip_elems )
{
    var a = areas.split(',');

    // pruefen, ob skip_elems gesetzt
    if ( typeof(skip_elems) == 'undefined' )
      var skip_e = new Array();
    else
      var skip_e = skip_elems.split(',');

    for ( var i = 0; i < entries.length; i++ )
    {
        var found = false;

        for( var j = 0; j < a.length; j++ )
        {
            // var search_exp = eval("/("+entries[j].name+")/gi");

            var search_exp = new RegExp("\\b"+entries[i].name+"\\b","gi");


            var scope = document.getElementById(a[j]);

            if (scope == null)
            {
               //alert("hilight_glossary_entries\n\nWarning!\n\nscope is null. [" + a[j] + ' not found]');
               return;
            }

            var res = $(scope).text().search(search_exp);

            if( res != -1){
             found = hilight_text( scope , entries[i].name, elem, css_class, entries[i].url, title, first_only, skip_e );
            }

            if ( first_only && found)
              break;
        }
    }
}


function hilight_text( elem, search_term, hilight_elem, css_class, url, title, first_only, skip_elems )
{
      var search_term = search_term.toLowerCase();

      var search_exp = new RegExp("\\b"+search_term+"\\b","gi");

      for (var node = elem.firstChild,nextnode; node; node=nextnode)
      {

        nextnode = node.nextSibling;

        if (node.nodeType == 1)
        {
            // rekursion
            var found = hilight_text( node, search_term, hilight_elem, css_class, url, title, first_only, skip_elems );

            // nur das erste wort markieren
            if ( first_only && found )
                return true;
        }

        var pos;

        /*
        while(    node.nodeType == 3
               && ( pos = node.nodeValue.toLowerCase().indexOf( search_term ) ) > -1 )
        {
        */
        while(    node.nodeType == 3
               && ( pos = node.nodeValue.toLowerCase().search( search_exp ) ) != -1 )
        {

          // wenn da nix kommt fassen wir zumindest die links nicht an
          if (    typeof( skip_elems ) == 'undefined'
               || skip_elems.length == 0 )
            var skip_elems = new Array( 'A' );

          var skip = false;

          // bestimmte elementtypen werden nicht angefasst
          for ( var i = 0; i < skip_elems.length; i++ )
          {
              if ( node.parentNode.nodeName == skip_elems[ i ] )
              {
                skip = true;
                break;
              }
          }

          if ( skip )
            break;

          var string_before      = node.nodeValue.substring( 0, pos );
          var string_after       = node.nodeValue.substr( pos + search_term.length );
          var string_search_term = node.nodeValue.substring( pos, pos + search_term.length );

          var textnode_before      = document.createTextNode( string_before )
          var textnode_after       = document.createTextNode( string_after  );
          var textnode_search_term = document.createTextNode( string_search_term );

          var node_search_term = document.createElement( hilight_elem );

          if ( css_class != '' )
              $( node_search_term ).addClass ( css_class );

          if ( title != '' )
              node_search_term.setAttribute( 'title', title );

          if ( url != '' )
              node_search_term.setAttribute( 'href', url );

          node_search_term.appendChild( textnode_search_term );

          node.parentNode.replaceChild( textnode_after, node );

          textnode_after.parentNode.insertBefore( textnode_before, textnode_after);
          textnode_after.parentNode.insertBefore( node_search_term, textnode_after);

          node = textnode_after;

          return true;

        }
      }
}

function replace_text ( elem, xsearch_term, replace_term )
{
      if ( typeof ( elem ) == 'function' )
          return;

      var search_term2 = xsearch_term.toLowerCase();

      var search_exp = new RegExp("\\b"+search_term2+"\\b","gi");

      for ( var node = elem.firstChild,nextnode; node; node=nextnode )
      {

        nextnode = node.nextSibling;

        if ( node.nodeType == 1 )
        {
            if ( typeof ( xsearch_term ) == 'undefined' )
               alert ( 'peng' );

            // rekursion

            var found = replace_text( node, xsearch_term, replace_term );
        }

        var pos;

        while(    node.nodeType == 3
               && ( pos = node.nodeValue.toLowerCase().search( search_exp ) ) != -1 )
        {

          // wenn da nix kommt fassen wir zumindest die links nicht an

          if ( typeof( skip_elems ) == 'undefined' )
              var skip_elems = new Array();

          var skip = false;

          // bestimmte elementtypen werden nicht angefasst

          for ( var i = 0; i < skip_elems.length; i++ )
          {
              if ( node.parentNode.nodeName == skip_elems[ i ] )
              {
                  skip = true;
                  break;
              }
          }

          if ( skip )
              break;

          $( node ).wrap ( '<span class="change_wrapper"></span>' );

          parent_node_html = $ ( node.parentNode ).html();

          // pos muessen wir hier neu berechnen! Der Wert von oben ist jetzt ungueltig.
          // weil hier  HTML vorkommen kann und entities offenbar anders zaehlen :-|

          pos = parent_node_html.toLowerCase().search( search_exp );

      //    alert (parent_node_html);

          var string_before      = parent_node_html.substring ( 0, pos );
          var string_after       = parent_node_html.substr ( pos + search_term2.length );
          var string_search_term = parent_node_html.substring ( pos, pos + search_term2.length );

          // we actually work on the parent node :-|

          var new_node_str = string_before + '<span class="substitute">'
                             + replace_term + '</span>' + string_after;

          $( node.parentNode ).html ( new_node_str );

          return true;

        }
      }
}



function preview_glossary_entries_prepare ( areas, entries, elem, css_class, skip_elems )
{
    var a = areas.split ( ',' );

    if ( typeof ( skip_elems ) == 'undefined' )
        var skip_e = new Array();
    else
        var skip_e = skip_elems.split ( ',' );

    for ( var i = 0; i < entries.length; i++ )
    {
        var found = false;

        for ( var j = 0; j < a.length; j++ )
        {
            var search_exp = new RegExp ( "\\b" + entries[i].name + "\\b","gi" );

            var scope = document.getElementById ( a[j] );

            if ( scope == null )
               return;

            var res = $( scope ).text().search ( search_exp );

            if ( res != -1 )
                found = prepare_preview_text ( scope, entries[i].name, elem, entries[i].url, css_class, i, skip_e );
        }
    }
}


function prepare_preview_text ( elem, search_term, hilight_elem, url, css_class, iii, skip_elems )
{
    var search_term = search_term.toLowerCase();

    var search_exp = new RegExp ( "\\b" + search_term + "\\b", "gi" );

    for ( var node = elem.firstChild,nextnode; node; node=nextnode )
    {
        nextnode = node.nextSibling;

        if ( node.nodeType == 1 )
        {
            // rekursion

            var found = prepare_preview_text ( node, search_term, hilight_elem, url, css_class, iii, skip_elems );

            // nur das erste wort markieren

            //if ( first_only && found )
              //  return true;
        }

        var pos;

        while (    node.nodeType == 3
                && ( pos = node.nodeValue.toLowerCase().search( search_exp ) ) != -1 )
        {
            // wenn da nix kommt fassen wir zumindest die links nicht an

            if (    typeof ( skip_elems ) == 'undefined'
                 || skip_elems.length == 0 )
                var skip_elems = new Array ( 'A' );

            var skip = false;

            // bestimmte elementtypen werden nicht angefasst

            for ( var i = 0; i < skip_elems.length; i++ )
            {
                if ( node.parentNode.nodeName == skip_elems[ i ] )
                {
                    skip = true;
                    break;
                }
            }

            if ( skip )
                break;

            var string_before      = node.nodeValue.substring( 0, pos );
            var string_after       = node.nodeValue.substr( pos + search_term.length );
            var string_search_term = node.nodeValue.substring( pos, pos + search_term.length );

            var textnode_before      = document.createTextNode( string_before )
            var textnode_after       = document.createTextNode( string_after  );
            var textnode_search_term = document.createTextNode( string_search_term );

            var node_search_term = document.createElement( hilight_elem );

            if ( css_class != '' )
                $( node_search_term ).addClass ( css_class );

            if ( url != '' )
                node_search_term.setAttribute( 'href', url );

            node_search_term.setAttribute( 'title', '' );

            node_search_term.teaser_number = iii; // damit identifizieren wir dann den richtigen 'Teaser';

            node_search_term.appendChild ( textnode_search_term );
            node.parentNode.replaceChild ( textnode_after, node );

            textnode_after.parentNode.insertBefore( textnode_before, textnode_after);
            textnode_after.parentNode.insertBefore( node_search_term, textnode_after);

            node = textnode_after;

            return true;
        }
    }
}

function add_preview ( jq_expr, elist )
{
    settings = {
        showURL:     false,
        track:       true,
        fade:        500,
        left:        -150,
        bottom:      15,
        bodyHandler: function()
        {
           return $( elist [ this.teaser_number ].descr );
        }
    };

    if ( $.browser.msie && $.browser.version == '6.0' )
        settings.fade = false;

    $( jq_expr ).tooltip ( settings );
}


