//mouseenter, mouseleave
//from http://dev.rubyonrails.org/attachment/ticket/8354/event_mouseenter_106rc1.patch
Object.extend(Event, (function() {
  var cache = Event.cache;

  function getEventID(element) {
    if (element._prototypeEventID) return element._prototypeEventID[0];
    arguments.callee.id = arguments.callee.id || 1;
    return element._prototypeEventID = [++arguments.callee.id];
  }

  function getDOMEventName(eventName) {
    if (eventName && eventName.include(':')) return "dataavailable";
    //begin extension
    if(!Prototype.Browser.IE){
      eventName = {
        mouseenter: 'mouseover',
        mouseleave: 'mouseout'
      }[eventName] || eventName;
    }
    //end extension
    return eventName;
  }

  function getCacheForID(id) {
    return cache[id] = cache[id] || { };
  }

  function getWrappersForEventName(id, eventName) {
    var c = getCacheForID(id);
    return c[eventName] = c[eventName] || [];
  }

  function createWrapper(element, eventName, handler) {
    var id = getEventID(element);
    var c = getWrappersForEventName(id, eventName);
    if (c.pluck("handler").include(handler)) return false;

    var wrapper = function(event) {
      if (!Event || !Event.extend ||
        (event.eventName && event.eventName != eventName))
          return false;

      Event.extend(event);
      handler.call(element, event);
    };

    //begin extension
    if(!(Prototype.Browser.IE) && ['mouseenter','mouseleave'].include(eventName)){
      wrapper = wrapper.wrap(function(proceed,event) {
        var rel = event.relatedTarget;
        var cur = event.currentTarget;
        if(rel && rel.nodeType == Node.TEXT_NODE)
          rel = rel.parentNode;
        if(rel && rel != cur && !rel.descendantOf(cur))
          return proceed(event);
      });
    }
    //end extension

    wrapper.handler = handler;
    c.push(wrapper);
    return wrapper;
  }

  function findWrapper(id, eventName, handler) {
    var c = getWrappersForEventName(id, eventName);
    return c.find(function(wrapper) { return wrapper.handler == handler });
  }

  function destroyWrapper(id, eventName, handler) {
    var c = getCacheForID(id);
    if (!c[eventName]) return false;
    c[eventName] = c[eventName].without(findWrapper(id, eventName, handler));
  }

  function destroyCache() {
    for (var id in cache)
      for (var eventName in cache[id])
        cache[id][eventName] = null;
  }

  if (window.attachEvent) {
    window.attachEvent("onunload", destroyCache);
  }

  return {
    observe: function(element, eventName, handler) {
      element = $(element);
      var name = getDOMEventName(eventName);

      var wrapper = createWrapper(element, eventName, handler);
      if (!wrapper) return element;

      if (element.addEventListener) {
        element.addEventListener(name, wrapper, false);
      } else {
        element.attachEvent("on" + name, wrapper);
      }

      return element;
    },

    stopObserving: function(element, eventName, handler) {
      element = $(element);
      var id = getEventID(element), name = getDOMEventName(eventName);

      if (!handler && eventName) {
        getWrappersForEventName(id, eventName).each(function(wrapper) {
          element.stopObserving(eventName, wrapper.handler);
        });
        return element;

      } else if (!eventName) {
        Object.keys(getCacheForID(id)).each(function(eventName) {
          element.stopObserving(eventName);
        });
        return element;
      }

      var wrapper = findWrapper(id, eventName, handler);
      if (!wrapper) return element;

      if (element.removeEventListener) {
        element.removeEventListener(name, wrapper, false);
      } else {
        element.detachEvent("on" + name, wrapper);
      }

      destroyWrapper(id, eventName, handler);

      return element;
    },

    fire: function(element, eventName, memo) {
      element = $(element);
      if (element == document && document.createEvent && !element.dispatchEvent)
        element = document.documentElement;

      var event;
      if (document.createEvent) {
        event = document.createEvent("HTMLEvents");
        event.initEvent("dataavailable", true, true);
      } else {
        event = document.createEventObject();
        event.eventType = "ondataavailable";
      }

      event.eventName = eventName;
      event.memo = memo || { };

      if (document.createEvent) {
        element.dispatchEvent(event);
      } else {
        element.fireEvent(event.eventType, event);
      }

      return Event.extend(event);
    }
  };
})());





var Highlights = Class.create();
Highlights.prototype = {

    //
    //  Initialize the accordions
    //
    initialize: function(options) {

	this.options = Object.extend({
	    resizeSpeed : 8,
	    linkClass : 'recension',
	    highlightsId : 'highlights',
	    effectDuration : 0.3,
	    effectOpacityFrom : 0,
	    effectOpacityTo : 0.6

	}, options || {});


	this.effect1 = new Array();
	this.effect2 = new Array();


	$$('#' + this.options.highlightsId + ' a').each(
	    function(elm){

		elm.removeClassName('hover');

		Event.observe(elm, 'mouseenter', this.mouseoverHandler.bindAsEventListener(this, elm), false);
		Event.observe(elm, 'mouseleave', this.mouseoutHandler.bindAsEventListener(this, elm), false);
	    }.bind(this)
	);

    },


    mouseoverHandler : function(ev, elm) {
	ev.stop();

	trans = elm.select('.trans').first();
	desc = elm.select('.desc').first();


	if(this.effect1[trans.id]){
	    this.effect1[trans.id].cancel();
	}
	if(this.effect2[desc.id]){
	    this.effect2[desc.id].cancel();
	}


	this.effect1[trans.id] = new Effect.Opacity(trans, { from: this.options.effectOpacityFrom, to: this.options.effectOpacityTo, duration: this.options.effectDuration });
	this.effect2[desc.id] = new Effect.Opacity(desc, { from: this.options.effectOpacityFrom, to: 0.999, duration: this.options.effectDuration});
    },

    mouseoutHandler : function(ev, elm) {
	ev.stop();


	trans = elm.select('.trans').first();
	desc = elm.select('.desc').first();


	if(this.effect1[trans.id]){
	    this.effect1[trans.id].cancel();
	}
	if(this.effect2[desc.id]){
	    this.effect2[desc.id].cancel();
	}

	this.effect1[trans.id] = new Effect.Opacity(trans, { from: this.options.effectOpacityTo, to: this.options.effectOpacityFrom, duration: this.options.effectDuration });
	this.effect2[desc.id] = new Effect.Opacity(desc, { from: 1, to: this.options.effectOpacityFrom, duration: this.options.effectDuration });
    },

    dummy : function() {
    }
}


document.observe('dom:loaded',function(){
	myHighlights = new Highlights();
});

