$.search_in_cos =
{

    defaults : {

        areas: 'page_body_main_content',
        cos:   'rt_ext_inh',
        btntext: 'Suchen',
        btntext_reset : 'Zurücksetzen'
    },

    init : function( options ){

        if( !options.areas )
          options.areas = $.search_in_cos.defaults.areas;

        if( !options.cos )
          options.cos = $.search_in_cos.defaults.cos;

        if( !options.btntext )
          options.btntext = $.search_in_cos.defaults.btntext;

        if( !options.btntext_reset )
          options.btntext_reset = $.search_in_cos.defaults.btntext_reset;

        $btn = $('.wwe_form_submit', this);
        options.btn = $btn;

        this.options=options;

        $btn.bind('click', {options: this.options}, $.search_in_cos.search);

    },

    search : function(event) {

      var options = event.data.options;

      // Suchausdruck ermitteln
      var search_term = $( '.search_in_cos .search_text' ).eq(0).val();

      // Suchausdruck trimmen
      search_term = search_term.replace(/^\s+/,'').replace(/\s+$/,'');

      // kein Suchbegriff eingegeben:
      if ( search_term == '' )
      {
        alert('Bitte geben Sie einen Suchbegriff ein.');
        return;
      }

      var search_exp = eval("/("+search_term+")/gi");

      var areas = options.areas.split(",");
      var cos   = options.cos.split(",");

      var $fed_state_filter = $('.fed_states').eq(0).val('no_filter');
      var $role_filter      = $('.roles'     ).eq(0).val('no_filter');

      var found = false;

      for( i = 0; i < areas.length; i++) {
          for( j = 0; j < cos.length; j++) {

            var $elems = $( '#' + areas[i] + ' .' + cos[j]);

            $elems.each(function(){

              $(this).css('display','block');

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

              if( res == -1) {
                $(this).css('display', 'none' );
              }
              else {
                found = true;
                $.search_in_cos.hilight( this , search_term );
              }

            });
          }
      }

      if( !found ) {

        for( i = 0; i < areas.length; i++) {

          for( j = 0; j < cos.length; j++) {

            var $elems = $( '#' + areas[i] + ' .' + cos[j]);
            $elems.each(function(){ $(this).css('display', 'block'); });
          }
        }

        alert('Es wurde keine passende Textstelle gefunden.');
      }
      else {

        $btn = options.btn;
        $btn.unbind();
        $btn.bind('click', {options:options}, $.search_in_cos.reset);
        $btn.val(options.btntext_reset);
      }

    },

    reset : function(event){

      var options = event.data.options;

      var areas = options.areas.split(",");
      var cos   = options.cos.split(",");

      for( i = 0; i < areas.length; i++) {
          for( j = 0; j < cos.length; j++) {

            var $elems = $( '#' + areas[i] + ' .' + cos[j]);

            $elems.each( function() {

              var $hits =  $(this).find( '.search_hit' );

              $hits.each( function() {
                  var $text = $(this).text();
                  $(this).replaceWith($text);
              });

              $(this).css( 'display', 'block' );
            });

          }
      }

      $btn = options.btn;
      $btn.unbind();
      $btn.bind( 'click', {options: options}, $.search_in_cos.search );
      $btn.val( options.btntext );

    },

    hilight : function( elem, search_term )
    {

      var search_term = search_term.toLowerCase();

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

        nextnode = node.nextSibling;

        if (node.nodeType == 1){
            // rekursion
            $.search_in_cos.hilight( node, search_term );
        }

        var pos;

        while(    node.nodeType == 3
               && ( pos = node.nodeValue.toLowerCase().indexOf( search_term ) ) > -1 )
        {

          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( 'span' );
          node_search_term.setAttribute( 'class', 'search_hit' );

          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;
        }

      }

    }

}

$.fn.search_in_cos = $.search_in_cos.init;