//= require jquery-throttle.js
var selected_items = {};

$(function(){
  var search_query = '.ls-search-field';
  var batchSelectionLastStatus = {};

  $('.listing').each(function(){
    var listing = $(this);

    var listing_search_submit = $.debounce(function(){
      var search = $(search_query, listing);
      search.closest('form').submit();
    }, 250, null, true);

    listing.on('keyup', search_query, function(){
      listing_search_submit();
    })

    selected_items[this['id']] = [];
    batchSelectionLastStatus[this['id']] = 'none'
  });

  $(window).bind('change', '#batch-selection', function(e) {
    var checkbox = $(e.target);
    // Selector in bind is not filtering anything for some reason :(
    if (!checkbox.is('#batch-selection')) {
      return;
    }

    var listingElement = checkbox.closest('.listing')[0];
    var listingName = listingElement['id'];
    var status = (checkbox.is(':checked') || batchSelectionLastStatus[listingName] == 'some');

    $(listingElement).find('.checkbox-selection').each(function(){
      $(this).prop("checked", status).change();
    });
  });


  $(window).bind('change', '.checkbox-selection', function(e) {
    // Selector in bind is not filtering anything for some reason :(
    if (!$(e.target).hasClass('checkbox-selection')) {
      return;
    }

    var checkbox = $(e.target);
    var listingElement = checkbox.closest('.listing')[0];
    var listingName = listingElement['id'];
    var listingSelectedItems = selected_items[listingName];
    toggleRowToSelectedRows(checkbox[0].value, listingSelectedItems, checkbox.is(':checked'));
    setIndeterminateStateIfRequired($(listingElement), listingSelectedItems, listingName);
  });

  $(window).on('ajaxComplete', function(event, xhr, status) {
    reloadCheckboxes();
  });

  function clearSelectedItems(listingElement) {
    var listingName = listingElement.attr('id');
    selected_items[listingName] = [];
  }

  $('.scope_link').bind('click', function(e) {
    var listingElement = $(this).closest('.listing');
    clearSelectedItems(listingElement);
  });

  function setIndeterminateStateIfRequired(listingElement, listingSelectedItems, listingName) {
    var batchSelectionCheckbox = listingElement.find('#batch-selection');
    var totalRowCount = listingElement.find('.checkbox-selection').length;
    var selectedRowCount = listingElement.find('.checkbox-selection:checked').length;

    var zeroSelected = listingSelectedItems.length == 0;
    var allSelected = selectedRowCount == totalRowCount;

    if (batchSelectionCheckbox.length == 0) {
      return;
    }

    if (zeroSelected) {
      batchSelectionCheckbox[0].indeterminate = false;
      batchSelectionCheckbox.prop("checked", false);
      batchSelectionLastStatus[listingName] = 'none';
    }

    if (allSelected) {
      batchSelectionCheckbox[0].indeterminate = false;
      batchSelectionCheckbox.prop("checked", true);
      batchSelectionLastStatus[listingName] = 'all';
    }

    if (!allSelected && ! zeroSelected) {
      batchSelectionCheckbox[0].indeterminate = true;
      batchSelectionLastStatus[listingName] = 'some';
    }
  }

  function toggleRowToSelectedRows(colId, listingSelectedItems, checked) {
    var index = listingSelectedItems.indexOf(colId);
    var present = index > -1;
    if (checked && !present) {
      listingSelectedItems.push(colId);
    }
    if (!checked && present) {
      listingSelectedItems.splice(index, 1);
    }
  }

  function reloadCheckboxes() {
    $.each(selected_items, function(bindingId) {
      $.each(selected_items[bindingId], function(index, checkboxValue) {
        $('.listing#' + bindingId).find('.checkbox-selection[value=\'' + checkboxValue + '\']').prop("checked", true);
      })
      var listingElement = $('.listing#' + bindingId)[0];
      setIndeterminateStateIfRequired($(listingElement), selected_items[bindingId], bindingId);
    });
  }

  $('.listing').on('click', 'a.filter, .filter a', function(e) {
    elem = $(this);
    var listingElement = elem.closest('.listing');
    var key = elem.data('key');
    var value = elem.data('value');

    var search_data = listingElement.data('search');
    if (search_data.filters[key] == value) {
      listingElement.trigger("listings:filter:key:clear", key)
    } else {
      listingElement.trigger("listings:filter:key:set", [key, value])
    }

    e.preventDefault();
  }).on("listings:loaded", function(e){
    // highlight current filter
    var listingElement = $(this).closest('.listing');
    listingElement.find('.filter.active').removeClass('active');

    var search_data = listingElement.data('search');
    for(key in search_data.filters) {
      var filerLinkSelector = 'a[data-key=' + searchEscape(key) + '][data-value=' + searchEscape(search_data.filters[key]) + ']';
      listingElement.find(filerLinkSelector).closest('.filter').addClass('active');
    }

    if (listingElement.data('config').push_url && listingElement.data('skip-push-url') !== true) {
      listingElement.data('skip-push-url', false);
      var url = listingElement.data('url');
      var queryStringStart = url.indexOf('?');
      var queryString = queryStringStart == -1 ? '' : url.substring(queryStringStart);
      history.pushState({listing: '#' + listingElement.attr('id')}, document.title, location.href.split('?')[0] + queryString);
    }

  }).on("listings:filter:key:set", function(event, key, value) {
    var listingElement = $(this).closest('.listing');
    clearSelectedItems(listingElement);

    var search_data = listingElement.data('search');
    search_data.filters[key] = value;
    listingElement.data('search', search_data);

    updateListingFromSearchData(listingElement);
  }).on("listings:filter:key:clear", function(event, key) {
    var listingElement = $(this).closest('.listing');
    clearSelectedItems(listingElement);

    var search_data = listingElement.data('search');
    delete search_data.filters[key];
    listingElement.data('search', search_data);

    updateListingFromSearchData(listingElement);
  });

  window.onpopstate = function(event) {
    if (event.state && event.state.listing) {
      var listing = $(event.state.listing);
      listing.data('skip-push-url', true);
      $.get(listing.data('url').split('?')[0] + '?' + document.location.href.split('?')[1]);
    }
  };

  function searchEscape(value) {
    if (value.toString().indexOf(" ") == -1) {
      return value;
    } else if (value.indexOf("'") > -1) {
      return '"' + value + '"';
    } else {
      return "'" + value + "'";
    }
  }

  function updateListingFromSearchData(listingElement) {
    s = ""
    search_data = listingElement.data('search');
    for(key in search_data.filters) {
      s += key + ":" + searchEscape(search_data.filters[key])
      s += " ";
    }
    if (search_data.criteria) {
      s += search_data.criteria;
    }

    var search = $(search_query, listingElement);
    search.val(s);
    search.closest('form').submit();
  }
});


function getSelectedRows(name) {
  return selected_items[name];
}

function refreshListing(name) {
  var url = $('#' + name).data('url');
  $.get(url);
}