var AJAX=new function()
{
 //GetXmlHttpObject taken from www.w3schools.com
 function GetXmlHttpObject()
 {
  var xmlHttp=null;
  try
  {
   // Firefox, Opera 8.0+, Safari
   xmlHttp=new XMLHttpRequest();
  }
  catch (e)
  {
   // Internet Explorer
   try
   {
    xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
   }
   catch (e)
   {
    xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
   }
  }
  return xmlHttp;
 }

 this.Request=function(script,type,vars)
 {
  var toRequest=GetXmlHttpObject();
  if(type != "GET" && type != "POST")
  {
   return;
  }
  var date=new Date();
  var timestamp=date.getTime();
  if(!vars.inp)
  {
   vars.inp="timestamp="+timestamp;
  }
  else
  {
   vars.inp+="&timestamp="+timestamp;
  }
  if(!vars.data)
  {
   vars.data="";
  }
  toRequest.onreadystatechange=function()
  {
   if(toRequest.readyState==4)
   {
    if(toRequest.responseText != "")
    {
     eval(toRequest.responseText);
    }
    if(vars.completedFunction)
    {
     var func=vars.completedFunction
     if(vars.completedVars)
     {
      func(vars.completedVars)
     }
     else
     {
      func();
     }
    }
   }
  }
  if(type == "GET")
  {
   toRequest.open("GET",script+"?"+vars.inp,true);
   toRequest.send(null);
  }
  else if (type == "POST")
  {
   toRequest.open("POST",script+"?"+vars.inp,true);
   toRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
   toRequest.setRequestHeader("Context-length", vars.data.length);
//   toRequest.setRequestHeader("Connection", "close");
   toRequest.send(vars.data);
  }
 }
}()

var FRONT=new function()
{
 var settings={WEB_ROOT:'/',search:{}};

 this.init=function(in_settings)
 {
  for(var i in in_settings)
  {
   settings[i]=in_settings[i];
  }
 }

 this.post_comment=function(form_id,in_vars)
 {
  var form=document.getElementById(form_id);
  if(!in_vars)
  {
   in_vars={completedVars:{}};
  }
  var vals={};
  var items=[];
  var inp=form.getElementsByTagName('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=form.getElementsByTagName('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=FRONT.post_comment_complete;
  }
  FRONT.request("POST",vars);

  return false;
 }

 this.post_comment_complete=function(vars)
 {
  if(vars.success)
  {
   for(var a=0;a<vars.items.length;a++)
   {
    vars.items[a].value="";
   }
   alert(vars.message);
  }
  else
  {
   alert(vars.errors.join("\n"));
  }
 }

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

  var vals={};
  var items=[];
  var inp=form.getElementsByTagName('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=form.getElementsByTagName('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=FRONT.post_contact_us_complete;
  FRONT.request("POST",vars);

  return false;

 }

 this.post_contact_us_complete=function(vars)
 {
  if(vars.success)
  {
   for(var a=0;a<vars.items.length;a++)
   {
    vars.items[a].value="";
   }
   alert(vars.message);
  }
  else
  {
   alert(vars.errors.join("\n"));
  }
 }

 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])}}(FRONT,arg);
   }

  }
 }

 this.track_event=function(cat,action,label,val)
 {
  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+'ajax/request.php',method,vars);
 }

 this.setup_search=function()
 {

  var is_ie=document.all;
  var disp_obj=document.getElementById(settings.search.disp_id);
  var form_obj=document.getElementById(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_left";

   var sh=document.createElement('div');
   sh.className='suggest_headings';
   var sha=document.createElement('a');
   sha.href=settings.search.store_list;
   sha.innerHTML='Stores';
   sha.onmousedown=(function(obj,slug){return function(){obj.click_result(slug)}})(self,sha.href);
   sh.appendChild(sha);
   res.appendChild(sh);

   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('<div class="suggest_logo">');
    html.push('<a href="'+vars.results[a].link+'" title="'+vars.results[a].name+'">');
    html.push("<img src=\""+vars.results[a].logo+"\" width=\"100\" height=\"27\">");
    html.push("</a></div>");
    html.push('</td><td class="name">');
    html.push('<div class="suggest_store_name">');
    html.push("<a href=\""+vars.results[a].link+"\" title=\""+vars.results[a].name+"\">");
    html.push(highlight(unescape(vars.results[a].name),form_obj.value)+"</a><br>");
    html.push(vars.results[a].num+' coupon'+(vars.results[a].num != 1?'s':''));
    html.push('</div>');
    html.push("</td></tr></table>");

    div.innerHTML=html.join('');
    div.title=unescape(vars.results[a].name);
    div.className='suggest_store';
    res.appendChild(div);
    current_results.push({'info':vars.results[a],'div':div});

   }
   if(vars.results.length == 0)
   {
    div=document.createElement("div");
    div.className="suggest_store";
    div.innerHTML="No Results Found";
    res.appendChild(div);
   }

   var res_cat=document.createElement('div');
   res_cat.className="suggest_right";

   sh=document.createElement('div');
   sh.className='suggest_headings';
   sha=document.createElement('a');
   sha.href=settings.search.cat_list;
   sha.innerHTML='Categories';
   sha.onmousedown=(function(obj,slug){return function(){obj.click_result(slug)}})(self,sha.href);
   sh.appendChild(sha);
   res_cat.appendChild(sh);

   disp_obj.appendChild(res_cat);

   for(a=0;a<vars.cats.length;a++)
   {
    div=document.createElement("div");
    div.onmousedown=(function(obj,slug){return function(){obj.click_result(slug)}})(self,vars.cats[a].link);

    html=[];
    html.push('<table><tr><td>');
    html.push('<div class="suggest_icon">');
    html.push('<a href="'+vars.cats[a].link+'" title="'+vars.cats[a].name+'">');
    html.push("<img src=\""+vars.cats[a].logo+"\" width=\"47\" height=\"47\">");
    html.push("</a></div>");
    html.push('</td><td class="name">');
    html.push('<div class="suggest_category_name">');
    html.push("<a href=\""+vars.cats[a].link+"\" title=\""+vars.cats[a].name+"\">");
    html.push(highlight(unescape(vars.cats[a].name),form_obj.value)+"</a><br>");
    html.push(vars.cats[a].num+' store'+(vars.cats[a].num != 1?'s':''));
    html.push('</div>');
    html.push('</td></tr></table>');

    div.innerHTML=html.join('');
    div.title=unescape(vars.cats[a].name);
    div.className='suggest_store';
    res_cat.appendChild(div);

   }
   if(vars.cats.length == 0)
   {
    div=document.createElement("div");
    div.className="suggest_category";
    div.innerHTML="No Results Found";
    res_cat.appendChild(div);
   }
   var c=document.createElement('div');
   c.className='clear';
   disp_obj.appendChild(c);



   disp_obj.className="search_suggest";
   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+'?query='+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="suggest_store";
    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="suggest_store selected";
   }
  }

  function do_sub_search(val)
  {
   var vars={};
   vars.inp="r=search";
   vars.data="val="+escape(val);
   vars.completedVars={'results':[],cats:[]};
   vars.completedFunction=self.handle_search_results;
   FRONT.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="search_suggest hide";
   current_results=[];
   disp_obj.innerHTML="";

   write_lock=false;
  }

 }

}
