function addListener(id, href, loadingHtml, errorHtml, addHtml, remHtml, altHtml) {
	var elem = $(id);
	if(elem == null) return;
	var parent = $(elem.parentNode);
	Element.observe(elem, 'click', function(e) {
		parent.innerHTML = loadingHtml;
		new Ajax.Request(href, {
			method: 'get',
			onSuccess: function(transport, json) {
				var action = transport.responseText.evalJSON().action;
				if(action == 'deleted') {
					parent.innerHTML = addHtml;
				} else {
					if (altHtml != null) {
						var elements = $$("." + parent.className);
						for (i = 0; i < elements.length; i++) {
							elements[i].innerHTML = altHtml;
						}
						//parent.innerHTML = altHtml;
					} else {
						parent.innerHTML = remHtml;
					}
				}
				addListener(id, href, loadingHtml, errorHtml, addHtml, remHtml, altHtml);
			},
			onFailure: function() {
				parent.innerHTML = errorHtml;
			}
		});
		Event.stop(e);
	});
}
	
function addOrRemove(id, href, checkUrl, loadingHtml, errorHtml, addHtml, remHtml, altHtml) {
	new Ajax.Request(checkUrl, {
		method: 'get',
		onSuccess: function(transport, json) {
			var elem = $(id);
			var parent = $(elem.parentNode);
			var canAdd = transport.responseText.evalJSON().canAdd;
			if(canAdd) {
				parent.innerHTML = addHtml;
			} else {
				parent.innerHTML = remHtml;
			}
			addListener(id, href, loadingHtml, errorHtml, addHtml, remHtml, altHtml);
		}
	});
}