/**
 * Extender jQuery med funk for å gjøre dynamisk søk blant ansatte/jobber/nyheter
 *
 * Funksjonaliteten er basert på kode fra denne plugin:
 * http://dev.jquery.com/view/trunk/plugins/autocomplete/jquery.autocomplete.js
 */
if(typeof jQuery != "undefined"){
  ;(function($){
    jQuery.fn.extend({
      gyrosearch: function(options,callback){
        options = $.extend( {},
                            $.gyrosearcher.defaults,
                            options );
        
        $(this).val(options.defaultText);
        
        return this.each(function(){
          new $.gyrosearcher(this,options,callback);
        });
      }
    });
    
    $.gyrosearcher = function(input,options,callback){

		  var KEY = {
		    UP: 38,
		    DOWN: 40,
		    DEL: 46,
		    TAB: 9,
		    RETURN: 13,
		    ESC: 27,
		    COMMA: 188,
		    PAGEUP: 33,
		    PAGEDOWN: 34,
		    BACKSPACE: 8
		  };
  
      var $input = $(input);
      var timeout;
      var changing = false;
      
      $input.keyup(function(event){
        switch(event.keyCode) {
          case KEY.BACKSPACE:
            clearTimeout(timeout);
            timeout = setTimeout(onChange, options.delay*2);
            break;
        
          default:
		        clearTimeout(timeout);
		        timeout = setTimeout(onChange, options.delay);
		        break;
        }
        if(jQuery.isFunction(callback)){
          callback.apply($(this));
        }
      }).focus(function(){
        $input.val( $input.val()==options.defaultText ? '' : $input.val() );
      }).blur(function(){
        $input.val( $input.val()=='' ? options.defaultText : $input.val() );
        if(jQuery.isFunction(callback)){
          callback.apply($(this));
        }
      });
      
      /**
       * Henter ut hits på listitems, ved å søke på tekst i inputfelt, sender tilbake array med treff som jQuery objekter
       */ 
      function getHits(){
        var hits    = new Array();
        var filter  = $input.val().toLowerCase();
        if( filter!='' && filter!=options.defaultText.toLowerCase() ){
          $(options.target).each(function(){
            if( $(this).text().toLowerCase().indexOf(filter)!=-1 ){
              hits.length++;
              hits[hits.length-1] = $(this).parents('li').get(0);
            } 
          });
          if( options.additionalTargets && options.additionalTargets.length>0 ){
            for(key in options.additionalTargets){
              additionalTarget=options.additionalTargets[key];
	            $(additionalTarget).each(function(){
	              if( $(this).text().toLowerCase().indexOf(filter)!=-1 ){
	                hits.length++;
	                hits[hits.length-1] = $(this).parents('li').get(0);
	              } 
	            });
            }
          }
        }else{
          $(options.target).each(function(){
            hits.length++;
            hits[hits.length-1] = $(this).parents('li').get(0);
          });
        }
         
        if( options.restrictTo && options.restrictTo!='' && hits.length>0 ){
          var filterClasses = '';
				  $(options.restrictTo).each(function(e){
				    filterClasses += $(this).attr('class')+',';
				  });
				  var hits2 = new Array();;
				  for(key in hits){
            if (filterClasses.indexOf( $(hits[key]).attr('class') )>-1 ){
              hits2.length++;
              hits2[hits2.length-1] = hits[key];
				    }
				  }
				  hits = hits2;
        }
        return hits;
      }
      
      /**
       * Viser alle hits hentet ut med getHits()
       */
      function displayHits(hits){
        var no_hits = hits.length;
         $('.gyrosearcher-nohits').slideUp('normal',function(e){
           $('.gyrosearcher-nohits').remove();
         });
        $(options.items).parent('ul').fadeOut(function(){
          $(options.items).hide();
          if( no_hits>0 ){
		        for( var i=0; i<no_hits; i++){
		          $(hits[i]).show();
		        }
		      }else{
		        $(options.noHitsTarget).before(options.noHitsText);
		        $('.gyrosearcher-nohits').fadeIn();
		      }
	        $(options.items).parent('ul').fadeIn(function(){
	          changing=false;
	        });
	      });
      }
  
      /**
       * Ved keydown så henter vi ut antall hits som matcher tekst, om det er hits så fader vi ut alle synlige treff (om det er noen) før vi fader inn treffene...
       * Obs, merk at changing ikke settes false her, den blir satt false i callbacken til fadeIn() av resultatet
       */   
      function onChange(){
        if(!changing){
          var hits = getHits();
          changing = true;
          displayHits(hits);
        }
      }
    };
  
    $.gyrosearcher.defaults = {
      delay: 300,
      target: "ul.listitems li h2",
      items: "ul.listitems li",
      defaultText: "Søk...",
      restrictTo: "",
      noHitsText: "<p class=\"gyrosearcher-nohits\" style=\"display:none;\">Beklager, vi fant ingen treff som matchet ditt søkekriterie...</p>",
      noHitsTarget: "ul.listitems"
    };
    
  })(jQuery);
}
