/**
* This is the common event-handler that calls the event-stack
*
* @var event Event-object when called as event-handler
*/
function handleEvent(event)
{
	/**
	 * IE-fix
	 */
	if (!event)
	{
		event = window.event;
	}

	if (this.eventStack && this.eventStack[event.type] && (this.eventStack[event.type].length > 0))
	{
		var i;
		var r = true;

		for (i=0; i<this.eventStack[event.type].length; i++)
		{
			this.callEvent = this.eventStack[event.type][i];
			if (!this.callEvent(event)) { r = false; }
			this.callEvent = null;
		}

		return r;
	}

	else
	{
		return true;
	}
}


/**********************************************************************/


/**
* Create event-stack for object obj
*
* @var obj Object to create event-stack for
*/
function initEventStack(obj)
{
	if (!obj.eventStack)
	{
		/**
		* Create event-stack
		*/
		obj.eventStack = new Array();
		
		/**
		*	Create Stacks for common events
		*/
		obj.eventStack['click'] = new Array();
		obj.eventStack['dblclick'] = new Array();
		obj.eventStack['keydown'] = new Array();
		obj.eventStack['keypress'] = new Array();
		obj.eventStack['keyup'] = new Array();
		obj.eventStack['mousedown'] = new Array();
		obj.eventStack['mousemove'] = new Array();
		obj.eventStack['mouseup'] = new Array();
		obj.eventStack['mouseover'] = new Array();
		obj.eventStack['mouseout'] = new Array();
		
		/**
		* Create stacks for special events
		*/
		if (obj.tagName.match(/^(a|area|button|input|label|select|textarea)$/i))
		{
			obj.eventStack['focus'] = new Array();
			obj.eventStack['blur'] = new Array();
		}

		if (obj.tagName.match(/^(input|select|textarea)$/i))
		{
			obj.eventStack['change'] = new Array();
		}

		if (obj.tagName.match(/^(frameset|body)$/i))
		{
			obj.eventStack['load'] = new Array();
			obj.eventStack['unload'] = new Array();
		}

		if (obj.tagName.match(/^(form)$/i))
		{
			obj.eventStack['reset'] = new Array();
			obj.eventStack['submit'] = new Array();
		}

		if (obj.tagName.match(/^(input|textarea)$/i))
		{
			obj.eventStack['select'] = new Array();
		}
	}

	return true;
}


/**
 * This is the common event-handler modifier.
 * Use only this function (or it's aliases) to modify the event-stack
 */
function addEvent(event, obj, func)
{
	// Allow obj be id of object
	if (!obj.tagName)
	{
		if (document.getElementById(obj))
		{
			obj = document.getElementById(obj);
		}

		else
		{
			return false;
		}
	}
	
	// Enable event-stack
	initEventStack(obj);

	if (obj.eventStack[event])
	{
		// Enable eventhandling for event
		eval('obj.on'+event+' = handleEvent;');

		// Blur after onclick to speedup onchange-event
		if (obj.tagName.match(/^(input)$/i) && obj.type.match(/^(radio|checkbox)$/i) && (event == 'change'))
		{
			var blurOnClick = false;
			var i;

			for (i=0; i<obj.eventStack[event].length; i++)
			{
				if (obj.eventStack[event][i] == obj.blur)
				{
					blurOnClick = true;
					break;
				}
			}

			addEvent('click', obj, obj.blur);
		}

		// Store handler-function
		obj.eventStack[event][obj.eventStack[event].length] = func;

		return true;
	}

	else
	{
		return false;
	}
}

/**
 * This adds a new mouseover-event-handler to obj
 * Is an alias to addEvent
 */
function addMouseOver(obj, func)
{
	return addEvent('mouseover', obj, func);
}

/**
 * This adds a new mouseout-event-handler to obj
 * Is an alias to addEvent
 */
function addMouseOut(obj, func)
{
	return addEvent('mouseout', obj, func);
}


/**********************************************************************/


/**
 * Use this function to fill javascript style-object
 *  with computed values
 * Can only be called once
 * Call function with obj.initStyle();
 * Function is available to all objects in fixElements-list
 *  of function makeBrowserCompatible();
 */
function initStyle()
{
	var i, value;
	var translateStyles = new Array(
		/* Dimensions */
		Array('width', 'width'),
		Array('minWidth', 'min-width'),
		Array('maxWidth', 'max-width'),
		Array('height', 'height'),
		Array('minHeight', 'min-height'),
		Array('maxHeight', 'max-height'),
		/* Position */
		Array('position', 'position'),
		Array('visibility', 'visibility'),
		Array('zIndex', 'z-index'),
		Array('cssFloat', 'float'),
		Array('diplay', 'diplay'),
		Array('clear', 'clear'),
		Array('clip', 'clip'),
		Array('overflow', 'overflow'),
		Array('left', 'left'),
	 	Array('right', 'right'),
		Array('top', 'top'),
		Array('bottom', 'bottom'),
		/* Padding */
		Array('paddingLeft', 'padding-left'),
	 	Array('paddingRight', 'padding-right'),
		Array('paddingTop', 'padding-top'),
		Array('paddingBottom', 'padding-bottom'),
		/* Margin */
		Array('marginLeft', 'margin-left'),
	 	Array('marginRight', 'margin-right'),
		Array('marginTop', 'margin-top'),
		Array('marginBottom', 'margin-bottom'),
		/* Border */
		Array('borderLeftStyle', 'border-left-style'),
		Array('borderLeftColor', 'border-left-color'),
		Array('borderLeftWidth', 'border-left-width'),
		Array('borderRightStyle', 'border-right-style'),
		Array('borderRightColor', 'border-right-color'),
		Array('borderRightWidth', 'border-right-width'),
		Array('borderTopStyle', 'border-top-style'),
		Array('borderTopColor', 'border-top-color'),
		Array('borderTopWidth', 'border-top-width'),
		Array('borderBottomStyle', 'border-bottom-style'),
		Array('borderBottomColor', 'border-bottom-color'),
		Array('borderBottomWidth', 'border-bottom-width'),
		Array('borderLeftStyle', 'border-left-style'),
		Array('borderLeftColor', 'border-left-color'),
		Array('borderLeftWidth', 'border-left-width'),
		/* Font */
		Array('fontFamily', 'font-family'),
		Array('fontStyle', 'border-style'),
		Array('fontVariant', 'border-variant'),
		Array('fontSize', 'font-size'),
		Array('fontWeight', 'border-weight'),
		Array('fontStretch', 'border-stretch'),
		/* Text */
		Array('color', 'color'),
		Array('textAlign', 'text-align'),
		Array('textDecoration', 'text-decoration'),
		Array('textIndent', 'text-indent'),
		Array('textTransform', 'text-transform'),
		Array('verticalAlign', 'vertical-align'),
		Array('letterSpacing', 'letter-spacing'),
		Array('wordSpacing', 'word-spacing'),
		Array('lineHeight', 'line-height'),
		Array('direction', 'direction'),
		/* Background */
		Array('backgroundAttachment', 'background-attachment'),
		Array('backgroundColor', 'background-color'),
		Array('backgroundImage', 'background-image'),
		Array('backgroundPosition', 'background-position'),
		Array('backgroundRepeat', 'background-repeat'),
		/* Tables */
		Array('captionSide', 'caption-side'),
		Array('tableLayout', 'table-layout'),
		Array('borderCollapse', 'border-collapse'),
		Array('borderSpacing', 'border-spacing'),
		Array('emptyCells', 'empty-cells'),
		/* Lists */
		Array('listStyleImage', 'list-style-image'),
		Array('listStylePosition', 'list-style-position'),
		Array('listStyleType', 'list-style-type'),
		/* Other */
		Array('cursor', 'cursor'),
		Array('pageBreakAfter', 'page-break-after'),
		Array('pageBreakBefore', 'page-break-before')
	);

	if (this.currentStyle)
	{
		for (i=0; i<translateStyles.length; ++i)
		{
			if ( (value = eval('this.currentStyle.' + translateStyles[i][0])) && (value != "") )
			{
				eval('this.style.'+translateStyles[i][0]+' = '+'\''+value+'\'');
			}
		}
	}

	else if (document.defaultView.getComputedStyle)
	{
		var computedStyle = document.defaultView.getComputedStyle(this,null);

		for (i=0; i<translateStyles.length; ++i)
		{
			if ( (value = computedStyle.getPropertyValue(translateStyles[i][1])) && (value != "") )
			{
				eval('this.style.'+translateStyles[i][0]+' = '+'\''+value+'\'');
			}
		}
	}

	this.initStyle = null;
}


/**********************************************************************/


/**
 * Adds hover-possibility to all elements
 * use element.hover instead of element:hover as stylesheet
 */
function FixMouseOverStyle()
{
	this.oldClassName = this.className;
	this.className = this.className+' hover';
}

function FixMouseOutStyle()
{
	this.className = this.oldClassName;
}


/**********************************************************************/


/**
 * Enables the compatibility-workaround
 * Call it with <body onload="fixStyleSheet();">
 * Pass "new Array('a', 'ul', 'li', 'span', 'div', ...)" as first param
 *  to enable stylesheet-workaround for all listed element-types
 */
function fixStyleSheet(fixElements)
{
	if (!fixElements)
	{
		var fixElements = new Array('a', 'ul', 'li', 'span', 'div');
	}

	var i,j, currentElements;

	for (i=0; i<fixElements.length; i++)
	{
		currentElements = document.getElementsByTagName(fixElements[i]);

		for (j=0; j<currentElements.length; j++)
		{
			// Add StyleSheet-Stuff
			currentElements[j].initStyle = initStyle;

			// Make elements hover-enabled
			addMouseOver(currentElements[j],FixMouseOverStyle);
			addMouseOut(currentElements[j],FixMouseOutStyle);
		}

	}
}