function search(disp_id,form_id,link,web_root,def_val)
{

 var is_ie=document.all;
 var disp_obj=document.getElementById(disp_id);
 var form_obj=document.getElementById(form_id);
 var self=this;
 var last_val="";
 var current_results=[];
 var selected= -1;
 var write_lock=false;
 var min_search=2;

 form_obj.value=def_val

 form_obj.onkeyup = function(e)
 {
  var event = (is_ie)?window.event : e;
  switch (event.keyCode)
  {
   case 38:key_up();break
   case 40:key_down();break;
   case 39:key_right();break;
   case 13:key_enter();break;
   case 27:self.remove_results();break; //escape
//   default:alert(event.keyCode);
  }
  if(form_obj.value != last_val)
  {
   self.remove_results();
   last_val=form_obj.value;
   if(form_obj.value.length >= min_search)
   {
    do_sub_search(form_obj.value);
   }
  }
  
 }
 
 form_obj.onfocus= function()
 {
  if(form_obj.value == def_val)
  {
   form_obj.value="";
  }
 }
 
 form_obj.onblur = function()
 {
//  setTimeout(function(){self.remove_results()},100);
  self.remove_results();
 }
 
 this.on_enter=function()
 {
  key_enter();
 }
 
 
 this.handle_search_results=function(vars)
 {
  if(write_lock)
  {
   return;
  }
  else
  {
   write_lock=true;
  }
  disp_obj.innerHTML="";
  current_results=[];
  selected=-1;
  res=document.createElement("div");
  res.className="suggest";
  res.innerHTML="Search Suggestions";
  disp_obj.appendChild(res);
  for(a=0;a<vars.results.length;a++)
  {
   div=document.createElement("div");
   div.onmousedown=(function(obj,slug){return function(){obj.click_result(slug)}})(self,vars.results[a].slug);
   div.onmouseover=(function(obj,sel){return function(){obj.mouseover_result(sel)}})(self,a);
   div.innerHTML=highlight(unescape(vars.results[a].name),form_obj.value);
   div.title=unescape(vars.results[a].name);
//   div.style.backgroundColor="#ffffff";
   disp_obj.appendChild(div);
   current_results.push({'info':vars.results[a],'div':div});

  }
  if(vars.results.length == 0)
  {
   div=document.createElement("div");
   div.innerHTML="No Results Found";
   disp_obj.appendChild(div);
  }
  disp_obj.className="show";
  write_lock=false;
  
 }
 
 this.mouseover_result=function(ind)
 {
  clear_current_selected();
  selected=ind;
  set_current_selected();
 }
 
 this.click_result=function(slug)
 {
  write_lock=true
  window.location=link+slug+"/";
 }
 
 function highlight(str,text)
 {
  var ind=str.toLowerCase().indexOf(text.toLowerCase());
  if(ind >= 0)
  {
   var to_return=str.substr(0,ind);
   to_return+="<strong>";
   to_return+=str.substr(ind,text.length);
   to_return+="</strong>";
   to_return+=str.substr(ind+text.length);
   str=to_return;
  }
  return str;
 }
 
 function key_right()
 {
  if(selected >= 0)
  {
   form_obj.value=unescape(current_results[selected].info.name);
  }
 }
 
 function key_up()
 {
//  alert("Up");
  var on=clear_current_selected();
  if(on > 0)
  {
   selected=on - 1;
  }
  else if(on == 0)
  {
   return;
  }
  else
  {
   selected=current_results.length;
  }
  set_current_selected();
 }
 
 function key_down()
 {
//  alert("Down");
  if(current_results.length == 0 && form_obj.value.length >= min_search)
  {
   do_sub_search(form_obj.value);
  }
  else
  {
   var on=clear_current_selected();
   if(on+1 < current_results.length)
   {
    selected= on + 1;
   }
   else
   {
    return;
    //selected=0;
   }
   set_current_selected();
  }
 }
 
 function key_enter()
 {
  if(selected < 0)
  {
   if(form_obj.value.length < min_search)
   {
    return;
   }
   window.location=web_root+"search/"+escape(form_obj.value)+"/";
   return;
  }
  window.location=link+current_results[selected].info.slug+"/";
 }
 
 function clear_current_selected()
 {
  var to_return=-1;
  if(selected >= 0 && selected < current_results.length)
  {
   current_results[selected].div.className="";
   to_return=selected;
  }
  selected=-1;
  return to_return;
 }
 
 function set_current_selected()
 {
  if(selected < 0)
  {
   selected=0;
  }
  if(selected +1 >= current_results.length)
  {
   selected=current_results.length -1;
  }
  if(selected < 0)
  {
   selected=0;
  }
  if(current_results.length > 0)
  {
   current_results[selected].div.className="selected";
  }
 }
 
 function do_sub_search(val)
 {
  var vars={};
  vars.inp="page=search";
  vars.data="val="+escape(val);
  vars.completedVars={'results':[]};
  vars.completedFunction=self.handle_search_results;
  Request(web_root+"request.php","POST",vars);
 }
 
 this.remove_results=function()
 {
  if(write_lock)
  {
   setTimeout(function(){self.remove_results()},100);
   return;
  }
  write_lock=true;
  selected=-1;
  disp_obj.className="hide";
  current_results=[];
  disp_obj.innerHTML="";
  
  write_lock=false;
 }
 
}
