// places/index
function filter_search_by_category() {
  categories = get_categories();
  if (categories.size() == $$('.category input').size()) {
    toggle_select_all(true);
  } else {
    toggle_select_all(false);
  }
  // Catch-all route makes loading from URL impossible that's why these 2
  // variables are defined in the view rather than here ☺
  // query = get_url_parameter('search');
  // page = get_url_parameter('page');
  if (page == "") {
    parameters = {
      search: query,
      'categories[]': categories
    };
  } else {
    parameters = {
      search: query, 
      'categories[]': categories,
      page: page
    };
  }
  new Ajax.Request('/places', {
    method: 'get',
    asynchronous: true,
    parameters: parameters
  });
}

function get_categories() {
  var categories = new Array;
  $$('.category input').each(function(category){
    if (category.checked == "1") {
      categories.push(category.value);
    }
  });
  return categories;
}

function toggle_select_all(bool) {
  $$("input[type=checkbox][name='category[]'][value=all]").first().checked=bool;
}

function clear_search_results() {
  $('place_list').innerHTML = "";
  $('search_results_count').innerHTML = "Selecciona una categoria para buscar";
}

function initialize_places(default_categories) {

  $$('.category input').each(function(input) {
    if (default_categories.include(input.value) == true) {
      input.checked = true;
    } else {
      input.checked = false;
    }
    input.observe("click", function() {
      filter_search_by_category();
    });
  });

  $$("input[type=checkbox][name='category[]'][value=all]").first().observe('click', function(){
    if (this.checked == true){
      $$('.category input').each(function(input) {
        input.checked = true;
      });
      filter_search_by_category();
    } else {
      $$('.category input').each(function(input) {
        input.checked = false;
      });
      clear_search_results();
    }
  });
  filter_search_by_category();
}

// places/show
// ReviewCounter: Creates a counter indicating 
var ReviewCounter = Class.create({

  initialize: function(review, counter, max_chars) {
    this.review = review;
    this.counter = counter;
    this.max_chars = max_chars;
    Event.observe(this.review, 'keypress', this.keyPressHandler.bind(this));
    Event.observe(this.review, 'keyup', this.keyUpHandler.bind(this));
  },

  keyUpHandler: function() {
    words_left = this.max_chars - $F(this.review).length;
    this.counter.innerHTML = words_left;
  },

  keyPressHandler: function(e) {
    words_left = this.max_chars - $F(this.review).length;
    if (words_left <= 0 && this.allowedChars(e.keyCode)) {
      e.stop();
    }
  },

  allowedChars: function(keycode) {
    // 8: backspace, 37-40: arrow keys, 46: delete
    allowed_keycodes = [ 8, 37, 38, 39, 40, 46 ];
    if (allowed_keycodes.include(keycode)) {
      return false;
    }
    return true
  }

});
