var Expander = function(selector, options) {
	this.elements = $$(selector);
	this.options  = $H(this.options).merge(options);

	this.init();
};

Expander.prototype = {
	elements: null,
	options:  {
		  collapsedClass: 'collapsed'
		, collapseImage:  'collapse.gif'
		, expandImage:    'expand.gif'
		, baseUrl:        '/'
	},

	init: function() {
		var self = this;
		this.elements.each(function(element) {
			self.bindEvents(element);
		});
	},

	bindEvents: function(element) {
		if (element.hasClassName('collapse')) {
			this.expand(element);
			return;
		}
		if (element.hasClassName('expand')) {
			this.collapse(element);
			return;
		}

		element.destroy();
	},

	expand: function(element) {
		this.changeImage(element, 'collapseImage');
		this.getBlock(element).removeClassName(this.options.get('collapsedClass'));

		var self = this;
		element
			.removeClassName('expand')
			.addClassName('collapse')
			.stopObserving('click')
			.observe('click', function(event) {
				event.stop();
				self.collapse(element);
				self.saveState(element, 'expand');
			})
		;
	},

	collapse: function(element) {
		this.changeImage(element, 'expandImage');
		this.getBlock(element).addClassName(this.options.get('collapsedClass'));

		var self = this;
		element
			.removeClassName('collapse')
			.addClassName('expand')
			.stopObserving('click')
			.observe('click', function(event) {
				event.stop();
				self.expand(element);
				self.saveState(element, 'collapse');
			})
		;
	},

	getBlock: function(element) {
		return element.up('.block');
	},

	changeImage: function(element, image) {
		element.down('img').writeAttribute('src', this.options.get('baseUrl') + this.options.get(image));
	},
	
	saveState: function(element, newState) {
		new Ajax.Request('/index/saveBlock', {
			  method: 'get'
			, parameters: {
				  'block': this.getBlock(element).readAttribute('id')
				, 'a':     newState
				, 'nc':    new Date().getTime()
			}
		});
	}
};

document.observe('dom:loaded', function() {
	window.expander = new Expander(
		  '.expander'
		, {
			  collapsedClass: 'collapsed'
			, collapseImage:  'collapse.gif'
			, expandImage:    'expand.gif'
			, baseUrl:        '/images/v3/'
		}
	);
});