Quicklink = {
	attribute: 'quicklink',
	init: function() {
		this.selector = 'a['+this.attribute+']';
		document.observe('click', this.click.bind(this));
	},
	click: function(e) {
		if (!e.isLeftClick()) return;
		var el = e.element();
		if (!el.readAttribute(this.attribute)) {
			el = el.up(this.selector);
		}
		if (el && !this.treat(el)) {
			e.stop();
		}
	},
	submit: function(form) {
		return this.treat(form);
	},
	treat: function(el) {
		var action = el.readAttribute(this.attribute);
		switch (action) {
			case 'replace':
			case 'remove':
			case 'update':
			case 'insert':
			case 'reload':
			case 'fade-remove':
				var params = {
					method: 'GET',
					onSuccess: this.treatResponse.bindAsEventListener(this, el)
				};
				if (el.href) {
					new Ajax.Request(el.href, params);
				} else {
					params.method = 'POST';
					el.request(params);
				}
				return false;
			break;
			default:
				this.getElements(el).invoke(action);
				break;
		}
		return false;
	},
	treatResponse: function(response, el) {
		var action = el.readAttribute(this.attribute);
		switch (action) {
			case 'replace':
			case 'remove':
			case 'update':
			case 'insert':
				this.getElements(el).invoke(action, response.responseText);
				break;
			case 'fade-remove':
				throw 'Not implemented';
				break;
			case 'reload':
				location.reload(true)
				break;
		}
		document.fire('quicklink:response', {
			response: response,
			el: el
		});
	},
	getElements: function(el) {
		var selector = el.readAttribute('selector');
		if (!selector)
			return [el];
		var func = el.readAttribute('func') || '$$';
		var object = func[0]=='.'? el : window;
		func = func.replace(/^\./, '');
		return [object[func](selector)].flatten();
	}
};

Event.observe(window, 'load', Quicklink.init.bind(Quicklink));
