framework.eventmodel = {
_eventId:1,
addElementEvent:function(elementId, type, handler)
{
    if (!framework.util.isType(elementId, framework.DataType.STRING))
    {
		return framework.Status.INVALID_ELEMENT_TYPE;
    }  
	var element = document.getElementById(elementId);
	if (framework.util.isUndefinedOrNull(element))
	{
  		return framework.Status.ELEMENT_DOES_NOT_EXIST;
	}
 	else
	{
    	return framework.eventmodel.addEvent(element, type, handler);
	}
},
addEvent:function(element, type, handler) 
{ 
    if (framework.util.isUndefinedOrNull(element))
    {
		return framework.Status.ELEMENT_DOES_NOT_EXIST;
    }  
    if (!framework.util.isType(type, framework.DataType.STRING))
    {
		return framework.Status.INVALID_ELEMENT_TYPE;
    }  
	if (!framework.util.isType(handler, framework.DataType.FUNCTION))
	{
		return framework.Status.EVENT_HANDLER_NOT_A_FUNCTION;
	}
    if (!framework.eventmodel._isEventTypeSupported(type))
	{
	   	return framework.Status.UNSUPPORTED_EVENT_TYPE; 
	}
	if (!handler.uniqueEventId)
	{
		handler.uniqueEventId = framework.eventmodel._eventId += 1;
	}
	if (framework.eventmodel._isEventHandlerRegistered(element, type, handler))
	{
		return framework.Status.DUPLICATE_EVENT_HANDLER;
	}
	if (!element.events)
	{
		element.events = {};
	}
	var handlers = element.events[type];
	if (!handlers) 
	{
		handlers = element.events[type] = {};
		if (!element.addEventListener && element["on" + type])
		{
	 		handlers[0] = element["on" + type];
		}
	}
	handlers[handler.uniqueEventId] = handler;
	if (element.addEventListener)
	{
		element.addEventListener(type, framework.eventmodel._handleEvent, false);
	}
	else 
	{
		element["on" + type] = framework.eventmodel._handleEvent;
	}
	return framework.Status.SUCCESS;
},
removeElementEvent:function(elementId, type, handler)
{
	if (!framework.util.isType(elementId, framework.DataType.STRING))
    {
		return framework.Status.INVALID_ELEMENT_TYPE;
    }  
   	var element = document.getElementById(elementId);
	if (framework.util.isUndefinedOrNull(element))
	{
		return framework.Status.ELEMENT_DOES_NOT_EXIST;
	}
	else
	{
		return framework.eventmodel.removeEvent(element, type, handler);
	}
},
removeEvent:function(element, type, handler) 
{
    if (framework.util.isUndefinedOrNull(element))
    {
		return framework.Status.ELEMENT_DOES_NOT_EXIST;
    }  
    if (!framework.util.isType(type, framework.DataType.STRING))
    {
		return framework.Status.INVALID_ELEMENT_TYPE;
    }  
	if (!framework.util.isType(handler, framework.DataType.FUNCTION))
	{
		return framework.Status.EVENT_HANDLER_NOT_A_FUNCTION;
	}
	if( !framework.eventmodel._isEventTypeSupported(type))
	{
    	return framework.Status.UNSUPPORTED_EVENT_TYPE; 
	}
    else if (framework.eventmodel._isEventHandlerRegistered(element, type, handler))
    {
		delete element.events[type][handler.uniqueEventId];
    }
    else
	{
		return framework.Status.EVENT_HANDLER_NOT_FOUND;
	}
	return framework.Status.SUCCESS;
},
getEventTarget:function(event) 
{
    if (framework.util.isUndefinedOrNull(event))
    {
		return null;
    }  
 	if (!framework.util.isType(event, framework.DataType.OBJECT))
    {
		return null;
    }  
	var eventTarget = event.target || event.srcElement;
	if (eventTarget.nodeType == 3)
	{           
		eventTarget = eventTarget.parentNode;
	}
	return eventTarget; 
},
_handleEvent:function(event) 
{
	var returnValue = true;
	event = event || framework.eventmodel._fixEvent(((this.ownerDocument || this.document || this).parentWindow || window).event);
	var handlers = this.events[event.type];
	for (var handlerIndex in handlers) 
	{
		this.handleThisEvent = handlers[handlerIndex];
		if (this.handleThisEvent(event) === false) 
		{
			returnValue = false;
		}
	}
	return returnValue;
},
_fixEvent:function(event)
{
	event.preventDefault = function()
	{
		this.returnValue = false;
	};
	event.stopPropagation = function()
	{
		this.cancelBubble = true;
	};
	return event;
},
_isEventHandlerRegistered:function(element, type, handler) 
{
	if (element.events && element.events[type])
	{
	 	if(!framework.util.isUndefinedOrNull(element.events[type][handler.uniqueEventId]))
	    {
			return true;
		}
	}
	return false;
},
_isEventTypeSupported:function(type) 
{
	var isValidType = false;
	for (var index in framework.EventType)
	{
		if (framework.EventType[index] == type)
		{
			isValidType = true;
			break;
		} 
	}
	return isValidType; 
},
loaded:true
};//Version 3.4
