
var CL_ClickableBlocks = new Class({
	Implements: [Options, Events],

	options: {
		selector                  : '',
		anchorSelectClass         : '',
		addBlockAnchorClass       : '',
		addBlockAnchorHoveredClass: '',
		addReplacementClass       : ''
	},

	//initialization
	initialize: function(options) {
		this.setOptions(options);

		if(this.options.selector != '') {
			this.elements = $$(this.options.selector).filter(function(el) {
				return (el.getElements('a')) ? true : false;
			});

			if(this.elements.length > 0)
				this.doClickables();
		}
	},

	doClickables: function() {
		this.elements.each(function(el) {
			var all_anchors         = el.getElements('a');
			var user_select_anchors = (this.options.anchorSelectClass) ? el.getElements('a.' + this.options.anchorSelectClass) : null;
			var anchor              = null;

			if($defined(user_select_anchors) && user_select_anchors[0])
				anchor = user_select_anchors[0];
			else if($defined(all_anchors) && all_anchors[0])
				anchor = all_anchors[0];

			if($defined(anchor))
				this.setClick(el, anchor);

			this.anchorToSpan(all_anchors);
		}, this);
	},

	//ads the click event
	setClick: function(element, anchor) {
		var self   = this;
		var href   = (anchor.get('href')) ? anchor.get('href') : '';
		var target = (anchor.get('target')) ? anchor.get('target') : '';

		if(href) {
			element.addEvents({
				'doLink': function(href, target) {
					if(target == '_blank')
						window.open(href);
					else
						document.location.href = href;
				},
				'pressEnter': function(e) {
					this.fireEvent('doLink', [href, target]);
					e.stop();
				},
				'click': function(e) {
					this.fireEvent('doLink', [href, target]);
					e.stop();
				}
			});

			if(this.options.addBlockAnchorClass != '') {
				element.addClass(this.options.addBlockAnchorClass);
			}

			if(this.options.addBlockAnchorHoveredClass != '') {
				element.addEvents({
					'mouseenter': function(ev) {
						this.addClass(self.options.addBlockAnchorHoveredClass);
					},
					'mouseleave': function(ev) {
						this.removeClass(self.options.addBlockAnchorHoveredClass);
					}
				});
			}
		}
	},

	anchorToSpan: function(anchors) {
		var self = this;

		anchors.each(function(anchor) {
			var span = new Element('span', {
				'html' : anchor.get('html'),
				'class': (self.options.addReplacementClass) ? self.options.addReplacementClass : ''
			}).replaces(anchor);
		});
	}
});
