
Livesearch = Class.create();

Livesearch.prototype = {
   initialize: function(searchform, attachitem, targetitem, hideitem, url, pars, loaditem, searchtext, resetbutton, submitbutton, buttonvalue) {
      var thisSearch = this;

      this.searchform = searchform;
      this.attachitem = attachitem;
      this.targetitem = targetitem;
      this.hideitem = hideitem;
      this.url = url;
      this.pars = pars;
      this.loaditem = loaditem;
      this.searchtext = searchtext;
      this.resetbutton = resetbutton;
      this.submitbutton = submitbutton;
      this.buttonvalue = buttonvalue;
      this.t = null;  // Init timeout variable
      
      if (($(attachitem).value == this.searchtext) || ($(attachitem).value == '')) {
         value = this.searchtext;
         this.searchstring = '';
      } else {
         value = $(attachitem).value;
         this.searchstring = $(attachitem).value;
      }
      
      $(this.searchform).innerHTML = '<input type="text" id="'+this.attachitem+'" name="'+this.attachitem+'" class="livesearch" autocomplete="off" value="'+value+'" /><span id="'+this.resetbutton+'"></span><span id="'+this.loaditem+'"></span><input type="submit" id="'+this.submitbutton+'" value="'+this.buttonvalue+'" />';

      $(this.submitbutton).style.display = "none";
      $(this.loaditem).style.display = "none";
      new Effect.Fade(this.resetbutton, { duration: 0, to: 0.3 });

      Event.observe(thisSearch.attachitem, 'focus', function() {
         if ($F(thisSearch.attachitem) == thisSearch.searchtext)
            $(thisSearch.attachitem).setAttribute('value', '');
      });

      Event.observe(thisSearch.attachitem, 'blur', function() {
         if ($F(thisSearch.attachitem) == '')
            $(thisSearch.attachitem).setAttribute('value', thisSearch.searchtext);
      });

      // Bind the keys to the input
      Event.observe(this.attachitem, 'keyup', this.readyLivesearch.bindAsEventListener(this));
      
      this.initialSubscriptionLinkText = $('userinfos').innerHTML;
      this.updateLinks();
   },

   updateLinks: function() {
      if (this.searchstring == '') {
         $('userinfos').innerHTML = this.initialSubscriptionLinkText+'.';
      } else {
         $('userinfos').innerHTML = 'Jobanzeigen mit "'+this.searchstring+'" als <a href="http://www.geekjobs.de/wp-rss2.php?s='+encodeURIComponent(this.searchstring)+'">RSS-Feed</a> abonnieren.';
      }
   },

   readyLivesearch: function(event) {
      var code = event.keyCode;
      if (code == Event.KEY_ESC || ((code == Event.KEY_DELETE || code == Event.KEY_BACKSPACE) && $F(this.attachitem) == '')) {
         this.resetLivesearch.bind(this);
      } else if (code != Event.KEY_RETURN) {
         if (this.t) clearTimeout(this.t);
           this.t = setTimeout(this.doLivesearch.bind(this), 400);
      }
   },

   doLivesearch: function() {
      if ($F(this.attachitem) == this.searchstring) return;

      new Effect.Fade(this.resetbutton, { duration: 0.1 });
      new Effect.Appear(this.loaditem, { duration: 0.1 });

      new Ajax.Updater(
         this.targetitem,
         this.url,
         {
            method: 'get',
            evalScripts: true,
            parameters: this.pars + encodeURIComponent($F(this.attachitem)) + '&rolling=1',
            onComplete: this.searchComplete.bind(this)
      });

      this.searchstring = $F(this.attachitem);
      
      this.updateLinks();
   },
   
   searchComplete: function() {
      $(this.hideitem).style.display = 'none';
      new Effect.Fade(this.loaditem, { duration: 0.1 });
      new Effect.Appear(this.resetbutton, { duration: 0.1 });
      
      Event.observe(this.resetbutton, 'click', this.resetLivesearch.bindAsEventListener(this));
      $(this.resetbutton).style.cursor = 'pointer';

      // Support for Lightbox
      if (window.initLightbox) {
         initLightbox();
      }
   },

   resetLivesearch: function() {
      $(this.targetitem).innerHTML = '';
      $(this.hideitem).style.display = 'block';

      $(this.attachitem).value = this.searchtext;
      new Effect.Fade(this.resetbutton, { duration: 0.1, to: 0.3 });
      $(this.resetbutton).style.cursor = 'default';
      
      this.updateLinks();
   }
}