/*
Written by: Adam Crownoble (adam@bryan.edu)
Date: September 28 2009
License: LGPL (http://www.gnu.org/copyleft/lesser.html)
*/

var LiveSearch = function(searchBox, results) {

 this.form = searchBox.form;
 this.searchBox = searchBox;
 this.results = results;
 this.url = this.form.action;
 this.method = this.form.method;
 this.stopSubmit = true;
 this.searchString = this.searchBox.value;
 this.starterText = this.searchString;
 this.searchingMessage = 'Searching...';
 this.minLength = 4;
 this.timeoutID = 0;
 this.delay = 500;
 this.resultsLimit = 4;

 if(typeof(XMLHttpRequest) !== 'undefined') {
  this.ajax = new XMLHttpRequest(); // Real browsers
 } else {
  this.ajax = new ActiveXObject('Microsoft.XMLHTTP'); // IE6
 }

 this.form.onsubmit = this.createHandler(this.submitForm);
 this.searchBox.onkeyup = this.createHandler(this.searchUpdate);
 this.searchBox.onfocus = this.createHandler(this.handleStarterText, ['focus']);
 this.searchBox.onblur = this.createHandler(this.handleStarterText, ['blur']);

 this.form.reset();

}

 LiveSearch.prototype.createHandler = function(handlerFunction, args) {
  var liveSearch = this;
  var handlerWrapper = function() {
   return handlerFunction.apply(liveSearch, args ? args : []);
  }
  return handlerWrapper;
 }

 LiveSearch.prototype.handleStarterText = function(eventType) {

  switch(eventType) {
   case 'focus':
    if(this.searchBox.value == this.starterText) {
     this.searchBox.value = '';
    }
    break;

   case 'blur':
    if(this.searchBox.value == '') {
     this.searchBox.value = this.starterText;
    }
    break;

  }

 }

 LiveSearch.prototype.searchUpdate = function() {

  if(this.searchString != this.searchBox.value && this.searchBox.value != this.starterText) {

   this.searchString = this.searchBox.value;
   clearTimeout(this.timeoutID);

   if(this.searchString.length >= this.minLength) {
    this.results.innerHTML = this.searchingMessage;
    this.timeoutID = setTimeout(this.createHandler(this.search), this.delay);
   } else {
    this.results.innerHTML = '';
   }

  }

 }

 LiveSearch.prototype.search = function() {

  var query = 'search='+encodeURI(this.searchBox.value)+'&limit='+this.resultsLimit;

  this.ajax.open(this.method, this.url, true);
  this.ajax.onreadystatechange = this.createHandler(this.searchResults);
  this.ajax.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  this.ajax.setRequestHeader("Content-length", query.length);
  this.ajax.setRequestHeader("Connection", "close");
  this.ajax.send(query);

 }

 LiveSearch.prototype.searchResults = function() {
  if(this.ajax.readyState == 4) {
   this.results.innerHTML = this.ajax.responseText;
  }
 }

 LiveSearch.prototype.submitForm = function(event) {
  if(this.stopSubmit) { return false; }
 }
