


/*******************************************************************************************
 *
 * events.js
 *
 *    Adds more events to the default ones of CSS.
 *    New effects are (as css classes):
 *        - class "click_toggle", toggles className (use "event_click_toggle" class to enable)
 *        - class "mouse_down", toggles className (use "event_mouse_down" class to enable)
 *        - class "hover_delayed", adds className (use "event_hover_delayed_<milliseconds>" class to enable)
 *
 *******************************************************************************************/


var _EVENTS_JS_ = 0;

if (_CLASSES_JS_ != 1)
{
	alert("Required library: _CLASSES_JS_ (classes.js)");
}
else
{
	_EVENTS_JS_ = 1;
	
	var EVENT_TYPE_CLASS_CLICKABLE_TOGGLE        = "event_click_toggle";
	var EVENT_TYPE_CLASS_CLICKABLE_TOGGLE_TARGET = "event_click_toggle_target_";
	var EVENT_TYPE_CLASS_MOUSE_DOWN              = "event_mouse_down";
	var EVENT_TYPE_CLASS_HOVER_DELAYED           = "event_hover_delayed_";
	
	var EVENT_CLASS_CLICK_TOGGLE                 = " click_toggle";
	var EVENT_CLASS_MOUSE_DOWN                   = " mouse_down";
	var EVENT_CLASS_HOVER_DELAYED                = " hover_delayed";
	
	/**
	 * Applies events to all document body elements that has the correct classes
	 * Use this on the document onload.
	 */
	function eventsInit()
	{
		var clickablesToggle = getElementsByClassName(document.body, EVENT_TYPE_CLASS_CLICKABLE_TOGGLE, null);
		var clickablesToggleTarget = getElementsByClassName(document.body, EVENT_TYPE_CLASS_CLICKABLE_TOGGLE_TARGET, null);
		var mouseDown = getElementsByClassName(document.body, EVENT_TYPE_CLASS_MOUSE_DOWN, null);
		var mouseOutDelays = getElementsByClassName(document.body, EVENT_TYPE_CLASS_HOVER_DELAYED, null);

		for (var i = 0; i < clickablesToggle.length; i++)
		{
			clickablesToggle[i].onclick = function()
			{
				if (hasClass(this, EVENT_CLASS_CLICK_TOGGLE))
				{
					delClass(this, EVENT_CLASS_CLICK_TOGGLE);
				}
				else
				{
					addClass(this, EVENT_CLASS_CLICK_TOGGLE);
				}
			}
		}
		
		for (var i = 0; i < clickablesToggleTarget.length; i++)
		{
			var oid = getClassParameter(clickablesToggle[i], EVENT_TYPE_CLASS_CLICKABLE_TOGGLE_TARGET);
			var otarget = document.getElementById(oid);
			clickablesToggle[i].otarget = otarget;
			
			clickablesToggle[i].onclick = function()
			{
				if (hasClass(this.otarget, EVENT_CLASS_CLICK_TOGGLE))
				{
					delClass(this.otarget, EVENT_CLASS_CLICK_TOGGLE);
				}
				else
				{
					addClass(this.otarget, EVENT_CLASS_CLICK_TOGGLE);
				}
			}
		}
		
		for (var i = 0; i < mouseDown.length; i++)
		{
			mouseDown[i].onmousedown = function()
			{
				addClass(this, EVENT_CLASS_MOUSE_DOWN);
			}
			
			mouseDown[i].onmouseup = function()
			{
				delClass(this, EVENT_CLASS_MOUSE_DOWN);
			}
		}
		
		for (var i = 0; i < mouseOutDelays.length; i++)
		{
			var delay = getClassParameter(mouseOutDelays[i], EVENT_TYPE_CLASS_HOVER_DELAYED);

			mouseOutDelays[i].onmouseover = function()
			{
				if (this.eventHoverDelayedTimer != null)
				{
					clearTimeout(this.eventHoverDelayedTimer);
				}
				
				addClass(this, EVENT_CLASS_HOVER_DELAYED);
			}
			
			mouseOutDelays[i].onmouseout = function()
			{
				this.eventHoverDelayedTimer = window.setTimeout(function(o) {return function() {delClass(o, EVENT_CLASS_HOVER_DELAYED)}} (this), delay);
			}
		}
	}
}
