if(!Nibynic) {
	var Nibynic = { };
}

Nibynic.AjaxContext = Class.create({
	defaultOptions: {
		linksSelector: 'a.ajax',
		formsSelector: 'form.ajax',
		mode: 'update'
	},
	
	initialize: function(element, options) {
		this.element = $(element);
		this.options = Object.extend(Object.extend({ }, this.defaultOptions), options || { });
		this.bindedGoTo = this.goTo.bind(this);
		
		this.updateLinksAndForms();
	},

	updateLinksAndForms: function()
	{
		this.element.select(this.options.linksSelector).each(function(element) {
			element.observe('click', this.bindedGoTo);
		}.bind(this));

		this.element.select(this.options.formsSelector).each(function(element) {
			element.observe('submit', this.bindedGoTo);
		}.bind(this));
	},

	update: function(content)
	{		
		if(this.options.mode == 'replace') {
			var oldElement = this.element;
			oldElement.hide();
			oldElement.insert({ after: content });
			this.element = oldElement.next();
			oldElement.remove();
		} else {
			this.element.update(content);
		}

		this.updateLinksAndForms();
	},
	
	goTo: function(event)
	{
		var element = event.findElement('a');
		
		if(element) {
			var method 	= 'get';
			var params 	= {};
			var url	 	= element.href
		} else if(element = event.findElement('form')) {
			element.fire('ajax:submit');
			var method 	= element.method;
			var params 	= element.serialize();
			var url 	= element.action;
		} else {
			return;
		}
		
		event.stop();
		
		this.indicator = new Nibynic.Indicator(this.element);
		
		new Ajax.Request(url,
		{
			method: method,
			parameters: params,
			onComplete: function(transport) {
				if(this.indicator) {
					this.indicator.destroy();
					this.indicator = null;
				}
				
				this.update(transport.responseText);

			}.bind(this)
		})
	}
})
