jQuery.addMutator(function(ctx) {
	jQuery("[@widget='Collapsable']", ctx).each(function() {
		var jThis = jQuery(this);
		var target = this.getAttribute("collapsableTarget");
		if (target) {
			target = jQuery(target, this);
		} else {
			target = jQuery(jThis.after("<div></div>").get(0).nextSibling).css("display", "none");

		}
		var clickHandler;
		var ignoreClick = function() {
		};
		var tryOpen = function() {
			var href = jThis.attr("href");
			href = webslinger.url.makeAbsoluteUrl(href);
			var base = webslinger.url.extractBase(href);
			function processData(data) {
				webslinger.url.pushBase(base);
				target.append(data).show().applyMutators();
				webslinger.url.popBase();
				if (clickHandler == ignoreClick) clickHandler = doClose;
			}
			webslinger.event(href + "?modal", function(data) {
				processData(data);
			}, function(which) {
				switch (which) {
					case "request":
						var context = arguments[1];
						//errorHandler("request", {req: req, type: type, exc: exc});
						var req = context.req;
						if (req.status == 404) {
							alert(req.responseText);
							var data;
							eval("data=" + req.responseText);
							alert(data);
							if (data.hub) {
								for (var i = 0; i < data.hub.length; i++) {
									var item = data.hub[i];
									OpenAjax.hub.publish(item.topic, item.data);
								}
							}
							processData(data.result);
						} else {
							alert("request error(" + context.req + ", " + context.type + ", " + context.exc + ")");
						}

						break;
					case "client":
						var e = arguments[1];
						alert("client error(" + e + ")");
						break;
					case "server":
						var error = arguments[1];
						alert("server error(" + error + ")");
						break;
				}
			});
			clickHandler = ignoreClick;
		};
		var doClose = function() {
			target.empty().hide();
			clickHandler = tryOpen;
		};
		clickHandler = tryOpen;
		jThis.click(function() {
			clickHandler();
			return false;
		});
	});
});
