var Search = {
  lists: {},

  loadList: function(name, path){
    $.getJSON(path, function(data){
      Search.lists[name] = $.map(data, function(i) { return i[name] }); 
      $("input#query_q").attr("disabled", "");
    });
  },

  results: function(field, section, params){
    query = $(field).val().toLowerCase();
    list = Search.lists[section]; //eval("all_" + section + "s");
    filtered_items = this.filter(query, list, params);
    results = eval("this." + section + "_resultset(filtered_items)")

    eval("this.render_" + section + "(results)");
  },

  filter: function(query, list, params){
   return $.grep(list, function(item){
      final_score = 0;
      $.each(params, function(i, val){ 
        ins = eval("item." + val);
        if(ins != null)
          final_score += ins.toLowerCase().score(query);
      });

      return final_score > 0
    });
  },

  invoice_resultset: function(items){
    return $.map(items, function(item){
      output_html = $("<tr id='invoice_" + item.id + "' class='invoice'></tr>"); 
      $("<td></td>").html(item.date).appendTo(output_html); //FIXME: use the user defined date format
      $("<td class='clickable_url invoice_url'></td>").html("<a href='/invoices/" + item.id + "'>" + item.invoice_no + "</a>").appendTo(output_html);
      $("<td></td>").html(item.client.name).appendTo(output_html);
      $("<td></td>").html("<img src='/images/status_" + item.state + "_label.png' alt='" + item.state + "'/>").appendTo(output_html);
      $("<td class='last'></td>").html(item.total_billed).appendTo(output_html);
      $("<td class='last'></td>").html(item.total_due).appendTo(output_html);

      return output_html
    });
  },

  estimate_resultset: function(items){
    return $.map(items, function(item){
      output_html = $("<tr id='estimate_" + item.id + "' class='estimate'></tr>"); 
      $("<td></td>").html(item.date).appendTo(output_html); //FIXME: use the user defined date format
      $("<td class='clickable_url estimate_url'></td>").html("<a href='/estimates/" + item.id + "'>" + item.estimate_no + "</a>").appendTo(output_html);
      $("<td></td>").html(item.client.name).appendTo(output_html);
      $("<td></td>").html("<img src='/images/status_" + item.state + "_label.png' alt='" + item.state + "'/>").appendTo(output_html);
      $("<td class='last'></td>").html(item.total_billed).appendTo(output_html);

      return output_html
    });
  },

  recurring_profile_resultset: function(items){
    return $.map(items, function(item){
      output_html = $("<tr id='recurring_profile_" + item.id + "' class='recurring_profile'></tr>"); 
      $("<td class='clickable_url recurring_profile_url'></td>").html("<a href='/recurring_profiles/" + item.id + "/edit'>" + item.profile_name + "</a>").appendTo(output_html);
      $("<td></td>").html(item.client.name).appendTo(output_html);
      $("<td></td>").html(item.frequency_term).appendTo(output_html);
      $("<td></td>").html(item.next_billing_date).appendTo(output_html);
      $("<td class='last'></td>").html(item.total_due).appendTo(output_html);
      $("<td></td>").html("<a href=\"/recurring_profiles/"+ item.id + "/edit\">Edit</a>").appendTo(output_html);

      $("<td></td>").html("<a class='delete' href='/recurring_profiles/"+ item.id + "'>Delete</a>").appendTo(output_html);

      return output_html
    });
  },


  item_resultset: function(items){
    return $.map(items, function(item){
      output_html = $("<tr id='item_" + item.id + "' class='item'></tr>"); 
      $("<td></td>").html(item.name).appendTo(output_html); 
      $("<td></td>").html(item.description).appendTo(output_html);
      $("<td></td>").html(item.units).appendTo(output_html);
      $("<td class='last'></td>").html(item.price).appendTo(output_html);
      $("<td></td>").html("<a href=\"/items/"+ item.id + "/edit\">Edit</a>").appendTo(output_html);

      $("<td></td>").html("<a class='delete' href='/items/"+ item.id + "'>Delete</a>").appendTo(output_html);
//FIXME Have to bind delete method to link

      return output_html
    });
  },

  client_resultset: function(items){
    return $.map(items, function(item){
      output_html = $("<div class='client' id ='client_" + item.id + "'></div>"); 
      
      leftcol_title = ("<dt><a href='/clients/" + item.id + "'>" + item.name + "</a></dt>"); 
      leftcol_content = "";
      if(item.address != "") { leftcol_content += item.address + "<br/>" };
      if(item.email != "") { leftcol_content += ("Email: <a href='mailto:" + item.email + "'>" + item.email + "</a> ") };
      if(item.phone != "") { leftcol_content += "| Phone: " + item.phone };
      if(item.fax != "")   { leftcol_content += "| Fax: " + item.fax };
      leftcol_list = $("<dl></dl");

      leftcol_actions  = ("<a href='/clients/" + item.id + "/edit' class='actions'>Edit</a> | ");
      leftcol_actions += ("<a href='/clients/" + item.id + "' class='actions delete'>Delete</a>");
      
      leftcol_list.append(leftcol_title)
                  .append($("<dd></dd>").append(leftcol_content))
                  .append($("<dd></dd>").append(leftcol_actions));

      output_html.append($("<div class='default'></div>").append(leftcol_list));

      rightcol_list  = $("<ul></ul>"); 
      rightcol_list.append("<li>Number of invoices pending: " + item.aggregated_values.pending_invoices + "</li>");
      rightcol_list.append("<li>Total amount due: " + item.aggregated_values.invoices_total_due + "</li>");
      if(item.aggregated_values.contacts_count != "0")
        rightcol_list.append("<li>Contacts: " + item.aggregated_values.contacts_count + "</li>");

      output_html.append($("<div class='meta'></div>").append(rightcol_list));

      return output_html
    });
  },

  render_invoice: function(results){
    $("table.invoices tbody").html("");
    $(results).appendTo("table.invoices tbody");
  },

  render_estimate: function(results){
    $("table.estimates tbody").html("");
    $(results).appendTo("table.estimates tbody");
  },

  render_recurring_profile: function(results){
    $("table.recurring_profiles tbody").html("");
    $(results).appendTo("table.recurring_profiles tbody");
  },

  render_estimate: function(results){
    $("table.estimates tbody").html("");
    $(results).appendTo("table.estimates tbody");
  },

  render_item: function(){
    $("table.items tbody").html("");
    $(results).appendTo("table.items tbody");
  },

  render_client: function(results){
    $("div.clients").html("");
    $(results).appendTo("div.clients");
    //$("div.clients").html(results);
  }
};


