/**
 * Simple script to attach autocompletion to text input fields with a custom
 * HTML attribute of autocomplete-disease=<type>, e.g.
 *     <input type="text" autocomplete-disease="rare">
 */

$(document).ready(function() {
	var _elementPrefix;
	var _list;

	$("INPUT[type=text][autocomplete-disease]").autocomplete({
			url: "/disease/autocomplete",
			cacheLength: 50,
			delay: 250,
			minChars: 3,
			matchContains: true
		});

	$("INPUT[type=text][autocomplete-disease*=multiple]").each(function () {
			var e = $(this);

			_elementPrefix = e.
				bind("keydown", _keyed).
				bind("keyup", _keyed).
				attr("id").replace(/-text/, "");

			_list = e.
				autocomplete("result", function(evt, data, formatted) {
					$(evt.target).next("BUTTON").val(data[1]);
				}).
				after('<button type="button" name="add-item">Add</button>').
				parent().
					bind("click", _clicked).
				children("UL");

			e.
				parents("form").
				bind("submit", _preSubmit);
		});

	function _clicked(evt) {
		var e = evt.target;
		if(e.tagName == "BUTTON" && e.name == "add-item") {
			var v = e.value;
			if(!v) return;

			e.value = "";

			var id = v.replace(/^\s*|\s*$/g, "").replace(/[^a-z0-9]+/ig, "-");

			var inp = $(e).prev("INPUT");
			var name = inp.val().replace(/^\s*|\s*$/g, "");
			var liId = _elementPrefix + '-item-' + id;
			if(!$("#" + liId).length) {
				_list.append('<li id="' + liId + '" style="display: none">' +
					'<input type="checkbox" checked="checked" name="' + _elementPrefix + '-selected-items" value="' + v + '" id="item-' + id + '">' +
					'<label for="item-' + id + '">' + name + '</label>' +
					'</li>');
			}

			$("#" + liId.replace(/\[/g, "\\[").replace(/]/g, "\\]")).show("highlight", 250);

			inp.val("");
		} else if(e.tagName == "INPUT" && e.type == "checkbox") {
			var id = e.value;
			var p = $(e).parents("LI");
			p.hide("highlight", 250, function() { $(this).remove(); });

			evt.preventDefault();
		}
	}

	function _keyed(evt) {
		var e = evt.target;
		var v = e.value;
		if(evt.keyCode == $.ui.keyCode.ENTER) {
			var btn = $(e).next("BUTTON");
			if(btn.val()) _clicked({target: btn[0]});

			evt.preventDefault();
			return false;
		}
	}

	function _preSubmit(evt) {
		var frm = evt.target;
		var els = frm[_elementPrefix + "-selected-items"];
		var v = "";
		if(els) {
			if(!els.length) els = [els];
			for(var i = 0; i < els.length; i++) v += els[i].value + ";";
		}

		frm[_elementPrefix].value = v;
	}
});

