$(document).ready(function() {
	$('.chooser').each(function () {
		chooser_init(this);
	});
});

function chooser_init(chooser) {
	$(chooser).find('.choose .filter')
		.change(function () {
			chooser_type(chooser, this);
			return false;
		})
		.keyup(function () {
			chooser_type(chooser, this);
			return false;
		});
	$(chooser).find('.chosen .unchoose')
		.click(function () {
			chooser_deselect(chooser);
			return false;
		});
}

function chooser_type(chooser, field) {
	var old_filter = $(chooser).data('filter');
	var new_filter = field.value;
	if (new_filter != old_filter) {
		$(chooser).data('filter', new_filter);
		chooser_load(chooser);
	}
}

function chooser_load(chooser) {
	var url = $(chooser).data('url');
	var type = $(chooser).data('type');
	var filter = $(chooser).data('filter');
	if (filter != "") {
	  filter = filter + "*";
	}
	var query = $.param({
		"search[type]": type,
		"search[text]": filter
	});
  return $.getJSON(url, query, function(hits) {
   chooser_update(chooser, hits);
  });
}

function chooser_update(chooser, hits) {
	$(chooser).data('hits', hits);
	
	list = $(chooser).find('.choose .choices');
	list.empty();
	$.each(hits, function(i) {
		list.append('<li class="choice">'+this.choice_html+'</li>');
		list.find(':last-child').data('index', i).click(function () {
			var index = $(this).data('index');
			chooser_select(chooser, index);
		});
	});
	$(chooser).find("ul.choices").css("display", "block");
}

function chooser_select(chooser, index) {
	hit = $(chooser).data('hits')[index];
	
	$(chooser).find('.chosen .choice_id').each(function () {
		this.value = hit.id;
	});
	$(chooser).find('.chosen .current_choice').each(function () {
		$(this).html(hit.chosen_html);
	});
	
	$(chooser).find('.choose .choices').empty();
	$(chooser).find('.choose .filter').each(function () {
		this.value = "";
	});

	$(chooser).find('.choose').hide();
	$(chooser).find('.chosen .no_choice').hide();
	$(chooser).find('.chosen .current_choice').show();
	$(chooser).find('.chosen .unchoose').show();
	$(chooser).find("ul.choices").css("display", "none");
	$(chooser).change();
}

function chooser_deselect(chooser) {
	$(chooser).find('.chosen .choice_id').each(function () {
		this.value = '';
	});
	$(chooser).find('.chosen .current_choice').each(function () {
		$(this).html('');
	});
	
	$(chooser).find('.choose').show();
	$(chooser).find('.chosen .no_choice').show();
	$(chooser).find('.chosen .current_choice').hide();
	$(chooser).find('.chosen .unchoose').hide();
	$(chooser).change();
}
