W3C = function () {}

W3C.getEvent = function (evt)
{
    if (evt != undefined)
        return evt;
    else if (window.event != undefined)
        return window.event;
    else
        return null;
}

//Class W3C.EventTarget
W3C.EventTarget = function () {}

W3C.EventTarget.addEventListener=function(element,type,listener,useCapture)
{
//	alert(element.id+' - '+type+' - '+listener+' - '+useCapture);

	if(element.addEventListener) 
	  element.addEventListener(type,listener,useCapture);
	else if ( element.attachEvent )
	  element.attachEvent("on"+type,listener);
	else
	  element.onclick = listener;
}

W3C.EventTarget.removeEventListener=function(element,type,listener,useCapture)
{
	if(element.removeEventListener) 
	  element.removeEventListener(type,listener,useCapture);
	else if (element.detachEvent)
	  element.detachEvent("on"+type,listener);
	else
	  element.onclick = '';
}

//W3C.EventTarget.dispatchEvent = function (element, evt) { ... }

//Class W3C.Event
W3C.Event = function () {}

W3C.Event.getType = function (evt)
{
    var type = null;
    if (evt.type != undefined)
        type = evt.type;
    return type;
}

W3C.Event.getTarget = function (evt)
{
    var target = null;
    if (evt.target != undefined)
    {
        //if target is a TEXT_NODE then
        //we want his parent that is an ELEMENT_NODE
        target = (evt.target.nodeType == Node.TEXT_NODE)?
							evt.target.parentNode
							: evt.target;
    }
    else if (evt.srcElement != undefined)
        target = evt.srcElement;
    return target;
}

W3C.Event.getCurrentTarget = function (evt)
{
    var current = null;
    if (evt.currentTarget != undefined)
        current = evt.currentTarget;
    return current;
}

W3C.Event.getEventPhase = function (evt)
{
    var phase = null;
    if (evt.eventPhase != undefined)
        phase = evt.eventPhase;
    return phase;
}

W3C.Event.getBubbles = function (evt)
{
    var bubbles = true; //IE always bubbles
    if (evt.bubbles != undefined)
        bubbles = evt.bubbles;
    return bubbles;
}

W3C.Event.getCancelable = function (evt)
{
    var cancelable = true; //IE always allow cancel
    if (evt.cancelable != undefined)
        cancelable = evt.cancelable;
    return cancelable;
}

W3C.Event.getTimeStamp = function (evt)
{
    var timeStamp = null; //Not available in IE
    if (evt.timeStamp != undefined)
        timeStamp = evt.timeStamp;
    return timeStamp;
}

W3C.Event.stopPropagation = function (evt)
{
    if (evt.stopPropagation != undefined)
        evt.stopPropagation();
    else if (evt.cancelBubble != undefined)
        evt.cancelBubble = true;
}

W3C.Event.preventDefault = function (evt)
{
    if (evt.preventDefault != undefined)
        evt.preventDefault()
    else //if (evt.returnValue != undefined) IE misses this test don't know why
        evt.returnValue = false;
}

W3C.Event.UIEvent = function () {}
W3C.Event.UIEvent.MouseEvent = function () {}
W3C.Event.UIEvent.MouseEvent.PRIMARY_BUTTON = 0;
W3C.Event.UIEvent.MouseEvent.MIDDLE_BUTTON = 1;
W3C.Event.UIEvent.MouseEvent.ALTERNATE_BUTTON = 2;
W3C.Event.UIEvent.MouseEvent.getScreenX = function (evt)
{
    var x = null;
    if (evt.screenX != undefined)
        x = evt.screenX;
    return x;
}

W3C.Event.UIEvent.MouseEvent.getScreenY = function (evt)
{
    var y = null;
    if (evt.screenY != undefined)
        y = evt.screenY;
    return y;
}

W3C.Event.UIEvent.MouseEvent.getClientX = function (evt)
{
    var x = null;
    if (evt.clientX != undefined)
        x = evt.clientX;
    return x;
}

W3C.Event.UIEvent.MouseEvent.getClientY = function (evt)
{
    var y = null;
    if (evt.clientY != undefined)
        y = evt.clientY;
    return y;
}

W3C.Event.UIEvent.MouseEvent.getButton = function (evt)
{
    var button = null;
    if (evt.button != undefined)
    {
        if (evt.button == 0)
        {
            //Firefox and Opera PRIMARY_BUTTON
            button = W3C.Event.UIEvent.MouseEvent.PRIMARY_BUTTON;
        }
        else if (evt.button == 1)
        {
            if (window.event != undefined && window.event.target == undefined)
            {
                //Internet Explorer PRIMARY_BUTTON
                button = W3C.Event.UIEvent.MouseEvent.PRIMARY_BUTTON;
            }
            else
            {
                //Firefox and Opera MIDDLE_BUTTON
                button = W3C.Event.UIEvent.MouseEvent.MIDDLE_BUTTON;
            }
        }
        else if (evt.button == 2)
        {
            //Firefox, Opera and Internet Explorer ALTERNATE_BUTTON
            button = W3C.Event.UIEvent.MouseEvent.ALTERNATE_BUTTON;
        }
        else if (evt.button == 4)
        {
            //Internet Explorer MIDDLE_BUTTON
            button = W3C.Event.UIEvent.MouseEvent.MIDDLE_BUTTON;
        }
    }
    return button;
}

W3C.Event.UIEvent.MouseEvent.getRelatedTarget = function (evt)
{
    //Firefox has evt.relatedTarget == null on mouseover
    //Need to find a solution for this
    var relatedTarget = null;
    if (evt.relatedTarget != undefined)
    {
        relatedTarget = evt.relatedTarget;
    }
    else if (evt.fromElement != undefined && evt.toElement != undefined)
    {
        //Internet Explorer does not support evt.relatedTarget
        if (W3C.Event.getType(evt) == "mouseover")
        {
            relatedTarget = evt.fromElement;
        }
        else if (W3C.Event.getType(evt) == "mouseout")
        {
            relatedTarget = evt.toElement;
        }
    }
}

W3C.Event.UIEvent.KeyboardEvent = function () {}

// TODO JM
W3C.Event.UIEvent.KeyboardEvent.getKeyCode = function (evt)
{
    if (window.event) // IE
        return evt.keyCode;
    else if (evt.which) // Netscape/Firefox/Opera
        return evt.which;
}

W3C.Event.UIEvent.KeyboardEvent.getCtrlKey = function (evt)
{
	return evt.ctrlKey;
}

W3C.Event.UIEvent.KeyboardEvent.getShiftKey = function (evt)
{
	return evt.shiftkey;
}

W3C.Event.UIEvent.KeyboardEvent.getAltKey = function (evt)
{
	return evt.altKey;
}

W3C.Event.MutationEvent = function () {}
