var CtAjaxLink = Class.create(CtComponent_Abstract, {

	status: null,

	initialize: function(htmlElement) {
		this.element = $(htmlElement);
		this.id = this.element.identify();
		this.status = new CtComponent_Message();
		this.element.insert({top: this.status.element});

		this.reassembly();

		CtPage.addComponent(this);
	},

	reassembly: function() {
		this.element.select('.ctAjaxLink-item').each(function(linkElement) {
			linkElement.params = {};
			try {
				linkElement.params = linkElement.readAttribute('rel').evalJSON(true);
			} catch (ex) {
			}
			linkElement.observe('click', this.clickHandler.bindAsEventListener(this, linkElement));
		}.bind(this));
	},

	clickHandler: function(event, linkElement) {
		Event.stop(event);
		var request = CtPage.getRequest(this.id, 'ajax');
		request.url = linkElement.readAttribute('href');
		request.options.parameters = linkElement.params;
		request.send();
	},

	refresh: function(response) {
		if (response && response.content) {
			this.element.insert({before: this.status.element});
			this.element.update(response.content);
			this.element.insert({top: this.status.element});
			this.reassembly();
		}
		if (response && response.json && response.json.messages) {
			this.status.show(response.json.messages);
		}

	}

});



var CtAjaxLink_Factory = new (Class.create({
	initialize: function() {
		Event.observe(document, 'dom:loaded', function() { this.refresh() }.bind(this));
	},

	refresh: function(htmlElement) {
		var elements = [];
		if (htmlElement) {
			elements = $(htmlElement).select('.ctAjaxLink');
		} else {
			elements = $$('.ctAjaxLink');
		}
		for (var i = 0; i < elements.length; i++) {
			elements[i].removeClassName('ctAjaxLink');
			new CtAjaxLink(elements[i]);
		}
	}
}));

CtPage.registerScript("CtAjaxLink");


