var retailer_csv_url = "csv/HorizonSeedRetailerList.csv";
var retailers = [];
//correspond to the columns in the csv
var retailer_props = ["type", "company_name", "city", "state", "phone"];
// var pp_icon_url = "images/producer_processer_icon.gif";

// create new object for defaults
function Options(){
  this.type             = "Both";
  this.search           = "";
  this.per_page         = 1000;
  this.current_page     = 0;
  this.prev_text        = "Prev";
  this.next_text        = "Next";
  this.ellipse_text     = "...";
};
options = new Options();
function Retailer(){};

$(document).ready(function() {
  $.get(retailer_csv_url, {},function(csv_data) {
          // Searchbox
          $("#search").keyup(function(e){
            options.type = $("input[name='type']:checked").val();
            options.search = $("#search").val();
            if(options.search == ""){ options.type = $("#both_button").attr("checked", "checked"); }
              show_retailers(filter_retailers(retailers));
            });

          // Radio button
          $("input[name='type']").change(function(e){
            options.type = $("input[name='type']:checked").val();
            options.search = $("#search").val();
            show_retailers(filter_retailers(retailers));
          });

          var company, contact, city_state, phone;
          retailers = arrays2retailers(jQuery.csv()(csv_data));
//          retailers = retailers.slice(0,30);

          show_retailers();

        });
});

function filter_retailers(retailers){
  var matched_retailers = [];
  var filter_regex = new RegExp(".*");
  filter_regex.ignoreCase = true;
  if(options.search.length != 0){
    filter_regex = new RegExp("^" + options.search, "i");
  }
  for (var i=0; i < retailers.length; i++){
    for (var j=0; j < retailer_props.length; j++){
      if(options.type == "Both"){
        if (retailers[i][retailer_props[j]].match(filter_regex)){
          matched_retailers.push(retailers[i]);
          // console.log(type + " " + "Match: " + " "+ filter_regex + " : " + retailers[i].company_name);
          break;
        }
      } else {
        if (retailers[i].type.match(options.type) && retailers[i][retailer_props[j]].match(filter_regex)){
          matched_retailers.push(retailers[i]);
          // console.log(type + " " + "Match: " + " "+ filter_regex + " : " + retailers[i].company_name);
          break;
        }
      }
    }
  }
  return matched_retailers;
}

function arrays2retailers(array_of_arrays){
  var retailers = new Array();
  for (var i=1; i < array_of_arrays.length; i++){
    retailer = new Retailer();
    for (var j=0; j < retailer_props.length; j++){
      retailer[retailer_props[j]] = array_of_arrays[i][j];
    }
    if(retailer.company_name.length != 0){
      retailers.push(retailer);
    }
  }
  return retailers;
}

function clear_retailers(){
  $('.retailer').remove();
}

function show_retailers(){
  clear_retailers();
  $("#Pagination").pagination(filter_retailers(retailers).length, {callback: pageselectCallback});
        // TODO: Uncomment when pagination is fixed

        /*
        options.per_page = typeof options.per_page == "undefined" ? retailers.length : options.per_page;
        for (var i=0; i < retailers.length; i++){
                is_odd = i % 2 ? false : true;
                retailer = retailers[i];
                company = retailer.company_name;
                contact = retailer.contact_first_name + " " + retailer.contact_last_name;
                city_state = retailer.city + "," + retailer.state;
                phone = retailer.phone;
                $('#retailer_display').append(
                        render_retailer_row(retailer, is_odd)
                );
        }*/
        if(retailers.length == 0){
                $('#retailer_display').append(render_error_row());
        }
}



function render_error_row(){
  return "<tr class=\"error_row retailer\" ><td colspan=\"4\">Sorry we don't have any retailers that match that criteria </tr>";
}

// Callback for function.  Build table

function pageselectCallback(page_index, jq){

  var filtered_retailers =  filter_retailers(retailers);
  var items_per_page = 25;
  var max_elem = Math.min((page_index+1) * items_per_page, filtered_retailers.length);
  var newcontent = '';
  newcontent += '<table id="retailer_display" class="pchart" width="100%">';
  newcontent += '<tr>';
  newcontent += '<th>&nbsp;</th><th>Seed Company</th><th width="100px">City/State</th><th width="100px">Phone</th>';
  newcontent += '</tr>';
        for(var i=page_index*items_per_page;i<max_elem;i++) {
                is_odd = i % 2 ? false : true;
                if (is_odd) {
                  newcontent += '<tr class="retailer odd">';
                } else {
                  newcontent += '<tr class="retailer even">';
                }
                if(filtered_retailers[i].type.match("Producer")){
                  newcontent += "<td><img src=\'images/producer_icon.gif\'></img></td>";
                }else{
                  newcontent += "<td>&nbsp;</td>";
                }
                newcontent += '<td>' + filtered_retailers[i].company_name + '</td>';
                newcontent += '<td>' + filtered_retailers[i].city + ', ' + filtered_retailers[i].state + '</td>';
                newcontent += '<td>' + filtered_retailers[i].phone + '</td>';
                newcontent += '</tr>';
        }
        newcontent += "</table>";
        $('#newcontent').html(newcontent);
        return false;
}

// Pagination Functions

jQuery.fn.pagination = function(maxentries, opts){
        opts = jQuery.extend({
                items_per_page:25,
                num_display_entries:10,
                current_page:0,
                num_edge_entries:0,
                link_to:"#",
                prev_text:"Prev",
                next_text:"Next",
                ellipse_text:"...",
                prev_show_always:true,
                next_show_always:true,
                callback:function(){return false;}
        },opts||{});

        return this.each(function() {
                function numPages() {
                        return Math.ceil(maxentries/opts.items_per_page);
                }

                function getInterval()  {
                        var ne_half = Math.ceil(opts.num_display_entries/2);
                        var np = numPages();
                        var upper_limit = np-opts.num_display_entries;
                        var start = current_page>ne_half?Math.max(Math.min(current_page-ne_half, upper_limit), 0):0;
                        var end = current_page>ne_half?Math.min(current_page+ne_half, np):Math.min(opts.num_display_entries, np);
                        return [start,end];
                }

                function pageSelected(page_id, evt){
                        current_page = page_id;
                        drawLinks();
                        var continuePropagation = opts.callback(page_id, panel);
                        if (!continuePropagation) {
                                if (evt.stopPropagation) {
                                        evt.stopPropagation();
                                }
                                else {
                                        evt.cancelBubble = true;
                                }
                        }
                        return continuePropagation;
                }

                function drawLinks() {
                        panel.empty();
                        var interval = getInterval();
                        var np = numPages();
                        var getClickHandler = function(page_id) {
                          return function(evt){ return pageSelected(page_id,evt); };
                        };
                        var appendItem = function(page_id, appendopts){
                                page_id = page_id<0?0:(page_id<np?page_id:np-1); // Normalize page id to sane value
                                appendopts = jQuery.extend({text:page_id+1, classes:""}, appendopts||{});
                                if(page_id == current_page){
                                        var lnk = jQuery("<span class='current'>"+(appendopts.text)+"</span>");
                                }
                                else
                                {
                                        var lnk = jQuery("<a>"+(appendopts.text)+"</a>")
                                                .bind("click", getClickHandler(page_id))
                                                .attr('href', opts.link_to.replace(/__id__/,page_id));


                                }
                                if(appendopts.classes){lnk.addClass(appendopts.classes);}
                                panel.append(lnk);
                        };
                        if(opts.prev_text && (current_page > 0 || opts.prev_show_always)){
                                appendItem(current_page-1,{text:opts.prev_text, classes:"prev"});
                        }
                        if (interval[0] > 0 && opts.num_edge_entries > 0)
                        {
                                var end = Math.min(opts.num_edge_entries, interval[0]);
                                for(var i=0; i<end; i++) {
                                        appendItem(i);
                                }
                                if(opts.num_edge_entries < interval[0] && opts.ellipse_text)
                                {
                                        jQuery("<span>"+opts.ellipse_text+"</span>").appendTo(panel);
                                }
                        }
                        for(var i=interval[0]; i<interval[1]; i++) {
                                appendItem(i);
                        }
                        if (interval[1] < np && opts.num_edge_entries > 0)
                        {
                                if(np-opts.num_edge_entries > interval[1]&& opts.ellipse_text)
                                {
                                        jQuery("<span>"+opts.ellipse_text+"</span>").appendTo(panel);
                                }
                                var begin = Math.max(np-opts.num_edge_entries, interval[1]);
                                for(var i=begin; i<np; i++) {
                                        appendItem(i);
                                }

                        }
                        if(opts.next_text && (current_page < np-1 || opts.next_show_always)){
                                appendItem(current_page+1,{text:opts.next_text, classes:"next"});
                        }
                }
                var current_page = opts.current_page;
                maxentries = (!maxentries || maxentries < 0)?1:maxentries;
                opts.items_per_page = (!opts.items_per_page || opts.items_per_page < 0)?1:opts.items_per_page;
                var panel = jQuery(this);
                this.selectPage = function(page_id){ pageSelected(page_id);};
                this.prevPage = function(){
                        if (current_page > 0) {
                                pageSelected(current_page - 1);
                                return true;
                        }
                        else {
                                return false;
                        }
                };
                this.nextPage = function(){
                        if(current_page < numPages()-1) {
                                pageSelected(current_page+1);
                                return true;
                        }
                        else {
                                return false;
                        }
                };
                drawLinks();
                opts.callback(current_page, this);
        });
}