// ############################################################

var queryFilter = listFilter();

queryFilter.filter(function(book, criteria) {
  return book.title.match(criteria.re) || book.authors.match(criteria.re) || book.isbn.match(criteria.re);
});

queryFilter.query = function(text) {
  var re = null;
  try { re = new RegExp(text, 'i') } catch(e) {};

  queryFilter.criteria({"query": text, "re": re});
};

// ############################################################

var statusFilter = listFilter();

statusFilter.filter(function(book, criteria) {
  return book.status == criteria.status;
});

// ############################################################

queryFilter.onchange = function() {
  var selection = queryFilter.selection();
  statusFilter.list(selection);

  var counts = {"heard of": 0, "maybe": 0, "to buy": 0, "ready": 0, "in progress": 0, "stalled": 0, "done": 0};

  $.each(selection, function(i, book) {
    counts[book.status] += 1;
  });

  $.each(counts, function(status, count) {
    $('#' + status.replace(/ /g, '') + ' .count').
      text(count).
      toggle(count != 0);
  });
}

// ############################################################

function booklife_custom() {

  var insert_items_into = function(sel, items, renderer) {
    var target = $(sel);

    target.html('');
    $.each(items, function(i, item) {
      target.append('<li>' + renderer(item) + '</li>');
    });
  }

  var onchange = function() {
    focused_book.deselect();

    set_location_hash('status', statusFilter.criteria().status);
    set_location_hash('query', queryFilter.criteria().query);

    insert_items_into('#books', statusFilter.selection(), TEMPLATES.book_cover);

    $('#nav li').removeClass('selected');
    $('#' + statusFilter.criteria().status.replace(/ /g, '')).addClass('selected');

    $('#q').val(queryFilter.criteria().query);

    $('img.cover').click(function() {
      focused_book.select(this);
      return false;
    });
  };

  $.getJSON('books.js', null, function(data) {
    queryFilter.list(data);

    var options = decode_location_hash();
    statusFilter.criteria({"status": (options.status || 'in progress')});
    queryFilter.query(options.query || '');

    statusFilter.onchange = onchange;
    statusFilter.onchange();
  });

  //-------------------------------------------------

  $('#nav li a').click(function(e) {
    statusFilter.criteria({"status": $(e.target).text()});
    return false;
  });

  $('#nav form').submit(function() { return false; });

  $('#q').typeWatch({enterkey: false, captureLength: -1, wait: 400, callback: function(text) {
    queryFilter.query(text);
    return false;
  }});
}

