
var SHERPA=new function()
{
 var self=this;
 var settings={WEB_ROOT:'/',search:{}};
 
 this.init=function(in_settings)
 {
  for(var i in in_settings)
  {
   settings[i]=in_settings[i];
  }
 }

 this.home=new function()
 {
  var HOME=this;
  var layout={quote:{},logo:{}};
  this.settings={id:{quote:{},logo:{}},
                 interval:40,
                 fade_rate:0.04,
                 show_wait:60,
                 hide_wait:15,
                 move_rate:1.5,
                 reset_move:140};
  this.on={fade:{opacity:0,
                 waited:0,
                 dir:1,
                 ind:0},
           move:{pos:0}};

  this.do_fade=function()
  {
   if(HOME.on.fade.dir == 0)
   {
    HOME.on.fade.waited++;
    if(HOME.on.fade.waited > HOME.settings.show_wait)
    {
     HOME.on.fade.waited=0;
     HOME.on.fade.dir=-1;
    }
   }
   else if(HOME.on.fade.dir == -2)
   {
    HOME.on.fade.waited++;
    if(HOME.on.fade.waited > HOME.settings.hide_wait)
    {
     HOME.on.fade.waited=0;
     HOME.on.fade.dir=1;
    }
   }
   else
   {
    HOME.on.fade.opacity+=HOME.on.fade.dir*HOME.settings.fade_rate;
    var on_ind=HOME.on.fade.ind;
    if(HOME.on.fade.opacity >= 1)
    {
     HOME.on.fade.opacity=1;
     HOME.on.fade.dir=0;
     HOME.on.fade.waited=0;
    }
    if(HOME.on.fade.opacity <= 0)
    {
     HOME.on.fade.opacity=0;
     HOME.on.fade.dir=-2;
     HOME.on.fade.ind++;
     layout.quote.list[on_ind].className='quotes';
     if(HOME.on.fade.ind >= layout.quote.list.length)
     {
      HOME.on.fade.ind=0;
     }
     layout.quote.list[HOME.on.fade.ind].className='quotes selected';

    }
    layout.quote.list[on_ind].style.opacity=HOME.on.fade.opacity;
    layout.quote.list[on_ind].style.filter='alpha(opacity='+(HOME.on.fade.opacity*100)+')';
   }
  }

  this.init=function(in_settings)
  {
   for(var i in in_settings)
   {
    HOME.settings[i]=in_settings[i];
   }
   layout.quote.container=_ID(HOME.settings.ids.quotes);
   layout.quote.list=[];
   var div=_OGTN(layout.quote.container,'div');
   for(var a=0;a<div.length;a++)
   {
    layout.quote.list.push(div[a]);
   }
   layout.quote.list[HOME.on.fade.ind].className='quotes selected';

   layout.logo.container=_ID(HOME.settings.ids.logos);
   layout.logo.list=_OGTN(layout.logo.container,'ul')[0];
   layout.logo.list_items=[];
   var li=_OGTN(layout.logo.list,'li');
   for(a=0;a<li.length;a++)
   {
    layout.logo.list_items.push(li[a]);
   }
   setInterval(HOME.interval,HOME.settings.interval);
  }

  this.interval=function()
  {
   //alert('HERE');
   HOME.do_move();
   HOME.do_fade();
  }

  this.do_move=function()
  {
   HOME.on.move.pos-=HOME.settings.move_rate;
   //alert(HOME.on.move.pos + ' - ' + HOME.settings.move_rate + ' > ' +HOME.settings.reset_move);
   if(Math.abs(HOME.on.move.pos) > HOME.settings.reset_move)
   {
    HOME.on.move.pos=0;
    var f_logo=layout.logo.list_items.shift();
    layout.logo.list.removeChild(f_logo);
    layout.logo.list.appendChild(f_logo);
    layout.logo.list_items.push(f_logo);
   }
   layout.logo.container.style.left=HOME.on.move.pos+'px';
  }

 }

 this.mobile=new function()
 {
  var MOBILE=this;
  var layout={};
  var on=1;
  this.init=function(in_settings)
  {
   layout.prev=_ID(in_settings.prev);
   layout.prev.onclick=(function(obj){return function(){obj.go_prev();}})(MOBILE);
   layout.next=_ID(in_settings.next);
   layout.next.onclick=(function(obj){return function(){obj.go_next();}})(MOBILE);
   layout.container=_ID(in_settings.container);
   layout.counter=_ID(in_settings.counter);
   layout.list=_OGTN(layout.container,'ul')[0];
   layout.list_ele=[];
   var li=_OGTN(layout.list,'li');
   for(var a=0;a<li.length;a++)
   {
    layout.list_ele.push(li[a]);
   }
   MOBILE.set_on_count();
  }

  this.set_on_count=function()
  {
   layout.counter.innerHTML=on+' of '+layout.list_ele.length;
  }

  this.go_next=function()
  {
   layout.list.removeChild(layout.list_ele[on-1]);
   layout.list.appendChild(layout.list_ele[on-1]);
   on++;
   if(on > layout.list_ele.length)
   {
    on=1;
   }
   MOBILE.set_on_count();
  }

  this.go_prev=function()
  {
   on--;
   if(on <= 0)
   {
    on=layout.list_ele.length;
   }
   layout.list.removeChild(layout.list_ele[on-1]);
   layout.list.insertBefore(layout.list_ele[on-1],layout.list.firstChild);

   MOBILE.set_on_count();
  }
 }

 this.offers=new function()
 {
  var OFFER=this;
  var offers={};
  var offer_types={};
  var order=[];
  //var filter_name='';
  var layout={};

  this.init=function()
  {
   for(var id in offers)
   {
    var offer=offers[id];
    if(offer.show_comments)
    {
     offer.show_comments.onclick=(function(obj,oid){return function(){obj.toggle_comments(oid);}})(OFFER,id);
     OFFER.toggle_comments(id);
    }
   }
  }

  this.init_filter=function(name)
  {
   //filter_name=name;
   var types=_GN(name);
   layout.filters=[];
   for(var a=0;a<types.length;a++)
   {
    layout.filters.push(types[a]);
    var t_name=types[a].getAttribute('data-trackname');
    types[a].onclick=(function(obj,type){return function(){SHERPA.track_event('filter-offers','',type);obj.apply_filter();}})(OFFER,t_name);
   }
  }

  this.add=function(in_offers)
  {
   for(var id in in_offers)
   {
    var oid='_offer_'+id;
    order.push(id);
    offers[id]={worked_yes:_ID(oid+'_worked_yes'),
                worked_no:_ID(oid+'_worked_no'),
                offer:_ID(oid),
                add_comment:_ID(oid+'_add_comment'),
                show_comments:_ID(oid+'_show_comments'),
                comments:_ID(oid+'_comments')}
    offers[id].worked_yes.onclick=(function(obj,o_id){return function(){obj.vote(o_id,'yes');}})(OFFER,id);
    offers[id].worked_no.onclick=(function(obj,o_id){return function(){obj.vote(o_id,'no');}})(OFFER,id);
    offers[id].add_comment.onclick=(function(obj,o_id){return function(){obj.add_comment(o_id);}})(OFFER,id);
    var t=in_offers[id];
    for(var a=0;a<t.length;a++)
    {
     var tid=t[a];
     if(!offer_types[tid])
     {
      offer_types[tid]=[];
     }
     offer_types[tid].push(id);
    }
   }
  }
  this.apply_filter=function()
  {
   var show={};
   for(var a=0;a<layout.filters.length;a++)
   {
    var type=layout.filters[a];

    if(type.checked)
    {
     for(var b=0;b<offer_types[type.value].length;b++)
     {
      show[offer_types[type.value][b]]=true;
     }
    }
   }
   for(a=0;a<order.length;a++)
   {
    var o_id=order[a];
    if(show[o_id] == true)
    {
     offers[o_id].offer.style.display='block';
    }
    else
    {
     offers[o_id].offer.style.display='none';
    }
   }
  }

  this.toggle_comments=function(id)
  {
   var offer=offers[id];
   if(offer.comments.parentNode.className == 'bottom')
   {
    offer.comments.parentNode.className='bottom show_comments';
   }
   else
   {
    offer.comments.parentNode.className='bottom';
   }
  }
  this.add_comment=function(id)
  {
//   var os=(function(obj,o_id){return function(){return obj.post_comment(o_id,this);}})(OFFER,id);
   offers[id].overlay_id=OVERLAY.create({type:'add_comment',heading:'Add a Comment',comment_id:id,comment_type:'offer',manager:OFFER});
  }
  this.post_comment=function(id,form)
  {
   return self.post_comment(form,{completedVars:{offer_id:id},completedFunction:OFFER.post_comment_complete});
  }
  this.post_comment_complete=function(vars)
  {
   if(vars.success)
   {
    OVERLAY.create({type:'message',close_class:'grey',heading:'Success',content:vars.message});
   }
   else
   {
    OVERLAY.update_comment({id:offers[vars.offer_id].overlay_id,heading:'Add a Comment: Error',content:'<ul><li>'+vars.errors.join('</li><li>')+'</li></ul>'});
   }
  }
  this.vote=function(id,vote)
  {
   var vars={};
   vars.inp="r=offer_vote";

   var data=[];

   data.push("offer="+escape(id));
   data.push("works="+escape(vote));

   vars.data=data.join('&');
   vars.completedVars={success:false,message:'',errors:[],works:vote,id:id,offer:id,share:''};
   vars.completedFunction=OFFER.vote_complete;
   self.request("POST",vars);
   SHERPA.track_event('offer-vote','',escape(vote));
  }
  this.vote_complete=function(vars)
  {
   if(vars.success)
   {
    share_text=vars.share;
    OVERLAY.create({type:'offer_vote',message:vars.message,works:vars.works,offer:vars.offer,manager:OFFER});
   }
   else
   {
    OVERLAY.create({type:'message',heading:'Error',content:'<ul><li>'+vars.errors.join('</li><li>')+'</li></ul>'});
   }
  }
  this.doesnt_work=function(form)
  {
   var vals={};
   var inp=_OGTN(form,'input');
   for(var a=0;a<inp.length;a++)
   {
    vals[inp[a].name]=inp[a].value;
   }
   inp=_OGTN(form,'textarea')
   for(a=0;a<inp.length;a++)
   {
    vals[inp[a].name]=inp[a].value;
   }

   var vars={};
   vars.inp="r=doesnt_work";

   var data=[];
   data.push("message="+escape(vals.message));
   data.push("offer="+escape(vals.offer));

   vars.data=data.join('&');
   vars.completedVars={success:false,message:'',errors:[]};
   vars.completedFunction=OFFER.doesnt_work_complete;
   self.request("POST",vars);
   return false;
  }
  this.doesnt_work_complete=function(vars)
  {
   if(vars.success)
   {
    OVERLAY.create({type:'status',close_class:'grey',heading:vars.message});
   }
   else
   {
    OVERLAY.create({type:'message',close_class:'grey',heading:'Error',content:'<ul><li>'+vars.errors.join('</li><li>')+'</li></ul>'});
   }
  }
  this.savings_amount=function(form)
  {
   var vals={};
   var inp=_OGTN(form,'input');
   for(var a=0;a<inp.length;a++)
   {
    vals[inp[a].name]=inp[a].value;
   }

   var vars={};
   vars.inp="r=savings_amount";

   var data=[];
   data.push("dollars="+escape(vals.dollars));
   data.push("cents="+escape(vals.cents));
   data.push("offer="+escape(vals.offer));

   vars.data=data.join('&');
   vars.completedVars={success:false,message:'',errors:[],do_share:false,share:''};
   vars.completedFunction=OFFER.savings_amount_complete;
   self.request("POST",vars);
   return false;
  }

  this.savings_amount_complete=function(vars)
  {
   if(vars.success)
   {
    if(vars.do_share)
    {
     OVERLAY.create({type:'save_share',heading:'Thanks',message:vars.message,manager:OFFER,vars:vars});
    }
    else
    {
     OVERLAY.create({type:'message',heading:'Thanks!',content:vars.message});
    }
   }
   else
   {
    OVERLAY.create({type:'message',heading:'Error',content:'<ul><li>'+vars.errors.join('</li><li>')+'</li></ul>'});
   }
  }
  this.share_saved=function(network,vars)
  {
   if(network == 'facebook')
   {
    FB.ui({ method: 'feed',
            message: vars.share,
            picture: 'http://www.couponsherpa.com/images/gui/sherpa_overlay.png',
            description: 'See how much you can save!',
            link: window.location.href,
            name: 'Coupon Sherpa'})

   }
   else if(network == 'twitter')
   {
    window.open('http://twitter.com/share?text='+escape(vars.share)+'&via=CouponSherpa',
   "twitter_tweet","personalbar=0,toolbar=0,scrollbars=1,resizable=1");
   }
  }
  
  this.tool_tip=new function()
  {
   var TT=this;
   var info={};
   var setup=false;
   var layout={};
   this.init=function()
   {
    if(setup)
    {
     return;
    }
    setup=true;
    var body=_GTN('body')[0];
    layout.tt=_CE('div',{id:'_tool_tip'});
    layout.content=_CE('div',{className:'tt_cont'});
    layout.tt.appendChild(layout.content);
    layout.tt.appendChild(_CE('div',{className:'tt_arrow'}));
    body.appendChild(layout.tt);
   }
   
   this.add=function(offer_id,img)
   {
    info[offer_id]=img;
    var ele=_ID('_offer_tt_'+offer_id);
    ele.onmouseover=function(obj,id){return function(){obj.show(id,this);}}(TT,offer_id);
    ele.onmouseout=function(obj){return function(){obj.hide();}}(TT);
   }
   
   this.show=function(id,obj)
   {
    if(!setup)
    {
     return;
    }
    var left =0;
    var top =0;

    if(obj.offsetParent)
    {
     do
     {
      left+=obj.offsetLeft;
      top+=obj.offsetTop;
     }
     while(obj = obj.offsetParent);
    }
    while(layout.content.firstChild)
    {
     layout.content.removeChild(layout.content.firstChild);
    }
    var img=_CE('img',{src:info[id]})
    layout.content.appendChild(img);
    layout.tt.style.left=(left-50)+'px';
    layout.tt.style.top=(top - 127)+'px';//top+'px';
    layout.tt.style.display='block';

   }
   
   this.hide=function()
   {
    if(!setup)
    {
     return;
    }
    layout.tt.style.display='none';
   }
  }

 }



 this.poll=new function()
 {
  var POLL=this;
  var layout={};
  var can_submit;

  this.init=function(id)
  {
   can_submit=true;
   layout.form=_ID(id);
   layout.radio=[];
   var temp=_OGTN(layout.form,'input')
   for(var a=0;a<temp.length;a++)
   {
    if(temp[a].name == 'poll')
    {
     layout.poll=temp[a];
    }
    if(temp[a].name == 'poll_option')
    {
     layout.radio.push(temp[a]);
    }
    if(temp[a].type == 'submit')
    {
     layout.submit=temp[a];
    }
   }
   layout.list=_OGTN(layout.form,'ul')[0];
   layout.list_ele=[];
   temp=_OGTN(layout.list,'li');
   for(a=0;a<temp.length;a++)
   {
    layout.list_ele.push(temp[a]);
   }

   var c=get_cookies();
   if(c['poll'])
   {
    var tp=c.poll.split(",");
    for(a=0;a<tp.length;a++)
    {
     if(tp[a] == layout.poll.value)
     {
      can_submit=false
     }
    }
   }
   layout.form.onsubmit=function(obj){return function(){return obj.submit();}}(POLL);

   if(!can_submit)
   {
    get_results();
   }

  }
  this.submit=function()
  {
   if(!can_submit)
   {
    return false;
   }
   var vars={};
   vars.inp="r=poll_vote";
   var data=[];
   var checked=false;
   for(var a=0;a<layout.radio.length;a++)
   {
    var radio=layout.radio[a];
    if(radio.checked)
    {
     data.push(radio.name+'='+escape(radio.value));
     checked=true;
    }
   }

   data.push("poll="+escape(layout.poll.value));

   if(checked)
   {
    can_submit=false;
    vars.data=data.join('&');
    vars.completedVars={success:false,message:'',errors:[],results:{}};
    vars.completedFunction=POLL.submit_complete;
    self.request("POST",vars);
    SHERPA.track_event('poll-vote','');
   }
   return false;
  }

  function get_results()
  {
   var vars={};
   vars.inp="r=get_poll_results";

   var data=[];
   data.push("poll="+escape(layout.poll.value));

   vars.data=data.join('&');
   vars.completedVars={success:false,message:'',errors:[],results:{}};
   vars.completedFunction=POLL.show_results;
   self.request("POST",vars);
  }
  this.submit_complete=function(vars)
  {
   if(vars.success)
   {
    var c=get_cookies();
    if(c.poll)
    {
     set_cookie('poll',c.poll+','+layout.poll.value,60);
    }
    else
    {
     set_cookie('poll',layout.poll.value,60);
    }

    POLL.show_results(vars);
   }
   else
   {
    can_submit=true;
    OVERLAY.create({type:'message',close_class:'grey',heading:'Error',content:'<ul><li>'+vars.errors.join('</li><li>')+'</li></ul>'});
   }
  }
  
  this.show_results=function(vars)
  {
   if(vars.success)
   {
    layout.submit.parentNode.removeChild(layout.submit);
    for(var a=0;a<layout.radio.length;a++)
    {
     var radio=layout.radio[a];
     var parent=radio.parentNode;
     var label=_OGTN(parent,'label')[0];
     parent.removeChild(radio);
     parent.removeChild(label);
     var con=_CE('div',{className:'grey logo'});
     var res=_CE('div',{className:'result'});
     res.style.width=vars.results[radio.value]+'%';
     con.appendChild(res);
     con.appendChild(_CE('div',{innerHTML:label.innerHTML}));
     parent.appendChild(con);
    }
   }
   else
   {
    OVERLAY.create({type:'message',close_class:'grey',heading:'Error',content:'<ul><li>'+vars.errors.join('</li><li>')+'</li></ul>'});
   }
  }
 }

 this.sub_nav=new function()
 {
  var SUB_NAV=this;
  var selected;
  var layout;
  this.init=function(id,num_items)
  {
   selected={};
   layout={nav:[],disp:[]};
   layout.container=_ID(id);
   for(var a=0;a<num_items;a++)
   {
    var nav=_ID(id+'_nav_'+a);
    nav.onclick=function(obj,ind){return function(){obj.select(ind)}}(SUB_NAV,a);
    layout.nav.push(nav);
    var disp=_ID(id+'_disp_'+a);
    disp.className='display';
    layout.disp.push(disp);
   }
   SUB_NAV.select(0);
  }

  this.select=function(ind)
  {
   if(selected.nav)
   {
    selected.nav.className='option';
    selected.disp.className='display';
   }
   selected.nav=layout.nav[ind];
   selected.disp=layout.disp[ind];

   selected.nav.className='option selected';
   selected.disp.className='display show';
  }
 }

 function get_cookies()
 {
  var cookie=document.cookie.split(";");
  var cookies={};
  for (var a=0;a<cookie.length;a++)
  {
   var name=cookie[a].substr(0,cookie[a].indexOf("="));
   var val=cookie[a].substr(cookie[a].indexOf("=")+1);
   name=name.replace(/^\s+|\s+$/g,"");
   cookies[name]=unescape(val);
  }
  return cookies;
 }

 function set_cookie(c_name,value,exdays)
 {
  var exdate=new Date();
  exdate.setDate(exdate.getDate() + exdays);
  var c_value=escape(value) + ((exdays==null) ? "" : "; expires="+exdate.toUTCString()) +
              (";domain=."+settings.DOMAIN+"; path="+settings.WEB_ROOT);
  document.cookie=c_name + "=" + c_value;
 }
/*
 this.set_refer=function()
 {
  var spans=_GTN('span');
  for(var a=spans.length -1;a>=0;a--)//spans.length;a++)
  {
   var span=spans[a];
   if(span.className == 'refer' || span.className=="refered_link")
   {
    var s=_OGTN(span,'script')[0];
    if(s)
    {
     var data;
     eval('data='+s.innerHTML);
     var link;
     if(span.className == 'refer')
     {
      link=_CE('a',{href:settings.WEB_ROOT+'refer/?'+data.r});
     }
     else if(span.className == 'refered_link')
     {
      link=_CE('a',{href:data.r});
     }
     link.innerHTML=data.v;
     if(data.c)
     {
      link.className=data.c;
     }
     if(data.rel)
     {
      link.rel=data.rel;
     }
     if(data.t)
     {
      link.target=data.t;
     }
     if(data.id)
     {
      link.id=data.id;
     }
     span.parentNode.replaceChild(link,span);
    }

   }
  }
 }
*/

 this.setup_refer=function()
 {
  var list=document.getElementsByTagName('a');
  for(var a=0, s=list.length;a<s;a++)
  {
   var ele=list[a];
   var info=ele.getAttribute('data-refer');
   if(info)
   {
    var arg=info.split('|');
    if(arg[1] == '')
    {
     arg[1]=window.location.pathname;
    }
    arg.length=4;
    ele.onclick=function(obj,args){return function(){obj.track_event(args[0],args[1],args[2],args[3])}}(SHERPA,arg);
   }

  }
 }

 this.track_event=function(cat,action,label,val)
 {
  if(action == '')
  {
   action=window.location.pathname;
  }
  var event=['_trackEvent',cat,action];
  if(label)
  {
   event.push(label);
  }
  if(val)
  {
   event.push(val);
  }
  _gaq.push(event);
 }

 this.request=function(method,vars)
 {
  AJAX.Request(settings.WEB_ROOT+'request.php',method,vars);
 }
 
 this.post_comment=function(form_id,in_vars)
 {
  var form=_ID(form_id);
  if(!in_vars)
  {
   in_vars={completedVars:{}};
  }
  var vals={};
  var items=[];
  var inp=_OGTN(form,'input');
  for(var a=0;a<inp.length;a++)
  {
   var item=inp.item(a);
   if(item.type == 'text')
   {
    items.push(item);
   }
   vals[item.name]=item.value;
  }
  
  var txt=_OGTN(form,'textarea')
  for(var a=0;a<txt.length;a++)
  {
   var item=txt.item(a);
   items.push(item);
   vals[item.name]=item.value;
  }

  
  var vars={};
  vars.inp="r=post_comment";
  
  var data=[];
  for(var i in vals)
  {
   if(i != '')
   {
    data.push(i+"="+escape(vals[i]));
   }
  }
  vars.data=data.join('&');
  vars.completedVars={success:false,message:'',errors:[],items:items};
  for(i in in_vars.completedVars)
  {
   vars.completedVars[i] = in_vars.completedVars[i];
  }
  if(in_vars.completedFunction)
  {
   vars.completedFunction=in_vars.completedFunction;
  }
  else
  {
   vars.completedFunction=self.post_comment_complete;
  }
  self.request("POST",vars);

  return false;
 }
 
 this.post_comment_complete=function(vars)
 {
  if(vars.success)
  {
   OVERLAY.create({type:'message',close_class:'grey',heading:'Success',content:vars.message});
   for(var a=0;a<vars.items.length;a++)
   {
    vars.items[a].value="";
   }
  }
  else
  {
   OVERLAY.create({type:'message',close_class:'grey',heading:'Error',content:'<ul><li>'+vars.errors.join('</li><li>')+'</li></ul>'});
  }
 }

 this.post_contact_us=function(form_id)
 {
  var form=_ID(form_id);

  var vals={};
  var items=[];
  var inp=_OGTN(form,'input');
  for(var a=0;a<inp.length;a++)
  {
   var item=inp.item(a);
   if(item.type == 'text')
   {
    items.push(item);
   }
   vals[item.name]=item.value;
  }

  var txt=_OGTN(form,'textarea')
  for(var a=0;a<txt.length;a++)
  {
   var item=txt.item(a);
   items.push(item);
   vals[item.name]=item.value;
  }


  var vars={};
  vars.inp="r=post_contact_us";

  var data=[];
  for(var i in vals)
  {
   data.push(i+"="+escape(vals[i]));
  }
  vars.data=data.join('&');
  vars.completedVars={success:false,message:'',errors:[],items:items};
  vars.completedFunction=self.post_contact_us_complete;
  self.request("POST",vars);

  return false;

 }

 this.post_contact_us_complete=function(vars)
 {
  if(vars.success)
  {
   OVERLAY.create({type:'message',close_class:'green',heading:'Success',content:vars.message});
   for(var a=0;a<vars.items.length;a++)
   {
    vars.items[a].value="";
   }
  }
  else
  {
   OVERLAY.create({type:'message',close_class:'yellow',heading:'Error',content:'<ul><li>'+vars.errors.join('</li><li>')+'</li></ul>'});
  }
 }


 this.setup_search=function()
 {

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

  form_obj.value=settings.search.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
   }
   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 == settings.search.def_val)
   {
    form_obj.value="";
   }
  }

  form_obj.onblur = function()
  {
   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;
   var res=document.createElement("div");
   res.className="suggest";
   res.innerHTML="Search Suggestions";
   disp_obj.appendChild(res);
   for(var a=0;a<vars.results.length;a++)
   {
    var div=document.createElement("div");
    div.onmousedown=(function(obj,slug){return function(){obj.click_result(slug)}})(self,vars.results[a].link);
    div.onmouseover=(function(obj,sel){return function(){obj.mouseover_result(sel)}})(self,a);

    var html=[];
    html.push('<table><tr><td>');
    html.push("<img src=\""+vars.results[a].logo+"\" class=\"blue logo\">");
    html.push("</td>");
    html.push("<td><span><a href=\""+vars.results[a].link+"\" title=\""+vars.results[a].name+"\">");
    html.push(highlight(unescape(vars.results[a].name),form_obj.value)+"</a></span></td>");
    html.push('</tr>');
    html.push('</table>');
    div.innerHTML=html.join('');
    div.title=unescape(vars.results[a].name);
    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=slug;
  }

  function highlight(str,text)
  {
   text=text.replace(/[ ]{2,}/,' ');
   text=text.replace(/[']/,"&#039;");
   text=text.replace(/["]/,"&quot;");
   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()
  {
   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()
  {
   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;
    }
    set_current_selected();
   }
  }

  this.submit=function()
  {
   key_enter();
   return false;
  }

  function key_enter()
  {
   if(selected < 0)
   {
    if(form_obj.value.length < min_search || form_obj.value == settings.search.def_val)
    {
     return;
    }
    var val=form_obj.value;
    val=val.replace(/\\/g,"%5C");
    val=val.replace(/^\./g,"%2E");
    val=val.replace(/\//g,"%2F");
    val=encodeURIComponent(val);

    if(val == '')
    {
     return;
    }

    var loc=settings.search.slug+val+'/';

    window.location.assign(loc);
    return;
   }
   window.location=current_results[selected].info.link;
  }

  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="r=search";
   vars.data="val="+escape(val);
   vars.completedVars={'results':[]};
   vars.completedFunction=self.handle_search_results;
   SHERPA.request("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;
  }

 }

}()

