
var HoverSiblings = Class.create({
	log: function(str) {
		if (!Object.isUndefined(site)) { site.log('HoverSiblings: '+str); }
	},
	initialize: function(elementIdArr, options) {
		this.options = Object.extend({
			onMouseEnter: function(element){ element.addClassName('hover'); },
			onMouseLeave: function(element){ element.removeClassName('hover'); },
			siblingElementSelector: '.siblingelement',
			delay: 10
		}, options || {});
		this.hoverElement = null;
		this.timeout = null;
		this.containerArr = new Array();
		// Helper:
		if (undefined!=elementIdArr) {
			var self=this;
			elementIdArr.each(function(item){ self.addContainer(item); });
		}
	},
	addContainer: function(containerElementId) {
		var id = this.containerArr.length;
		this.containerArr[id] = new Array();
		this.containerArr[id]['containerElement'] = $(containerElementId);
		this.containerArr[id]['elementArr'] = this.containerArr[id]['containerElement'].select(this.options.siblingElementSelector);
		this.containerArr[id]['elementArr'].each(function(item){
			item.observe('mouseover',this.onMouseOver.bindAsEventListener(this,item,true));
			item.observe('mouseout',this.onMouseOver.bindAsEventListener(this,item,false));
		},this);
		this.log("Added container with "+this.containerArr[id]['elementArr'].length+" elements (selector="+this.options.siblingElementSelector+")");
	},
	enterElements: function(id,isEntering) {
		this.containerArr.each(function(item){
			var element = item['elementArr'][id];
			if (undefined!=element) {
				if (isEntering) {
					this.log('Entering element '+element);
					this.options.onMouseEnter(element);
				} else {
					this.log('Leaving element '+element);
					this.options.onMouseLeave(element);
				}
			}
		},this);
	},
	enterElement: function(element,isEntering) {
		this.containerArr.each(function(item){
			if ((id=item['elementArr'].indexOf(element))>=0) this.enterElements(id,isEntering);
		},this);
	},
	delayedMouseOver: function(element,isMouseOver) {
		if (this.hoverElement!=null) { this.enterElement(this.hoverElement,false); }
		this.hoverElement = (isMouseOver ? element : null);
		if (this.hoverElement!=null) { this.enterElement(this.hoverElement,true); }
	},
	onMouseOver: function(event,observerElement,isMouseOver) {
		var eventElement = event.findElement();
		this.delayedMouseOver(observerElement,isMouseOver);
		Event.stop(event);
	}
});	


