﻿    //=================================事件类=============================================
	/**
	* 定义事件类

	*/
	function KEvent(){}
	
	/**
	* 获取对象的回调函数

	*
	*/
    var KEvent_getCallback = function(object,method)
    {
        return function()
        {
            return method.apply(object,arguments);
        }
       
    }
    
    
    
    /**
	* 创建适配器

	*
	*/    
    var KEvent_createAdapter = function(htmlObject,method)
    {
		//x 其实是event
        return function(x)
        {
            x = x ? x : ( (htmlObject && htmlObject.ownerDocument && htmlObject.ownerDocument.parentWindow) ? htmlObject.ownerDocument.parentWindow : window).event;
            
            //x.target是在FF中使用的，x.srcElement是在IE里用的。
            if (!x.target) x.target = x.srcElement;
            method.call(htmlObject, x);
        }
    }
    
    
    
    /**
	* 消除事件响应--不返回事件值

	*
	*/    
    var KEvent_cancelBubble = function(x)
    {
        if (!x)
        {
            return;
        }
        if (document.all)//IE情况下

        {
            if (!x.target) x.target = x.srcElement;
            var obj = ( (x.target && x.target.ownerDocument && x.target.ownerDocument.parentWindow) ? x.target.ownerDocument.parentWindow : window);
            obj.event.cancelBubble = true;
            obj.event.returnValue = false;            
        }
        else
        {            
            x.preventDefault();
            x.stopPropagation();
        }
    }
    /**
	* 消除事件响应--返回事件值

	*
	*/    
    var KEvent_returnTrue = function(x)
    {
         if (!x)
        {
            return;
        }
        if (document.all)//IE情况下

        {
            if (!x.target) x.target = x.srcElement;
            var obj = ( (x.target && x.target.ownerDocument && x.target.ownerDocument.parentWindow) ? x.target.ownerDocument.parentWindow : window);
            obj.event.cancelBubble = true;
            obj.event.returnValue = true;            
        }
        else
        {           
            x.stopPropagation();
        }
    }
    
    /**
	* 获取属性名称

	*
	*/    
    var KEvent_getPropertyName = function(event)
    {
        return "G_KINGTOP_" + event;
    }
    
    
    var KEvent_addEventListener = function(source, event, object, method)
    {		
		
		if (method!=null)
		{
			var caller = KEvent.getCallback(object, method);
			source.attachEvent("on" + event, caller);
		}
		else
		{			
			source.attachEvent("on" + event, object);
		}
    }
    
    
    /**
	* 增加事件监听
	*
	*/
    var KEvent_addListener = function(source, event, object, method)
    {
		if (method!=null)
		{
			return KEvent_addListener_(source, event, KBase.isHtmlControl(source) ? KEvent.createAdapter(object, method) : KEvent.getCallback(object, method));
		}
		else
		{
			return KEvent_addListener_(source, event, object);
		}
    }    
   
    /**
	* 增加事件监听--内部方法
	*
	*/
    var KEvent_addListener_ = function(source, event, method)
    {
        if (KBase.isHtmlControl(source))//HTML近件(如DIV等)
        {
            var caller = KEvent.getCallback(source, method);

            if (source.addEventListener)//FireFox
            {
                source.addEventListener(event, caller, false);
            }
            else if (source.attachEvent)
            {
                //szx edit 207-12-11 由于这行采用了caller重新创建了一个方法，导致对象无法被IE的垃圾回收器自动回收。
                source.attachEvent("on" + event, caller);
                //caller = null;
                //source.attachEvent("on" + event, method);
            }
            else
            {
                var sourceEvent = source["on" + event];
                if (typeof(sourceEvent) == "function")
                {
                    source["on" + event] = function()
                    {
                        sourceEvent();
                        caller();
                    }
                }
                else
                {
                    source["on" + event] = caller;
                }
            }
            return[source, event, caller];
        }
        else
        {
            var propertyName = KEvent.getPropertyName(event);
            var caller = [source, event, method];
            if (source[propertyName])
            {
                source[propertyName].push(caller);
            }
            else
            {
                source[propertyName] = [caller];
            }
            return caller;
        }
    }
    
    /**
	* 删除事件监听
	*
	*/
    var KEvent_removeListener = function(source)
    {
        if (arguments.length > 1)
        {
            if (KBase.isHtmlControl(source))
            {
                return KEvent.removeListener(arguments);
            }
            else
            {
                var eventArray = arguments[0][KEvent.getPropertyName(arguments[1])];
                for (var i = 0;i < eventArray.length;i++)
                {
                    if (eventArray[i][2] == arguments[2])
                    {
                        return KEvent.removeListener(eventArray[i]);
                    }
                }
            }
        }
        
        if (KBase.isHtmlControl(source[0]))
        {
            if (source[0].removeEventListener)
            {
                source[0].removeEventListener(source[1], source[2], false);
            }
            else if (source[0].detachEvent)
            {
                source[0].detachEvent("on" + source[1], source[2]);
            }
            else
            {
                source[0]["on" + source[1]] = null;
            }

        }
        else
        {
            KBase.deleteFromArray(source[0][KEvent.getPropertyName(source[1])], source);
        }
        source = null;
    }
    
    /**
	* 清除所有事件监听--有问题

	*
	*/    
    var KEvent_clearListeners = function(source, event)
    {
        if (!KBase.isHtmlControl(source))
        {
            var II = KEvent.getPropertyName(event);
            source[event] = null;
        }
    }
    
    /**
	* 触发事件
	*
	*/    
    var KEvent_trigger = function(source, event, parameters)
    {
        if (KBase.isHtmlControl(source))
        {
            if (source.fireEvent)
            {
                source.fireEvent("on" + event);
            }

        }
        else
        {
            if (!parameters)
            {
                parameters = [];
            }
            var eventName = KEvent.getPropertyName(event);
            var eventArray = source[eventName];
            if (eventArray && eventArray.length > 0)
            {
                for (var i = 0;i < eventArray.length;i++)
                {
                    var eventTemp = eventArray[i];
                    if (eventTemp && eventTemp[2])
                    {
                        eventTemp[2].apply(source, parameters);
                    }
                }
            }
        }
    }

	KConfig.defineClass("KEvent", KEvent);
    KConfig.defineStaticFunction(KEvent, "getCallback", KEvent_getCallback);
    KConfig.defineStaticFunction(KEvent, "isHtmlControl", KEvent_isHtmlControl);
    KConfig.defineStaticFunction(KEvent, "createAdapter", KEvent_createAdapter);
    KConfig.defineStaticFunction(KEvent, "cancelBubble", KEvent_cancelBubble);
    KConfig.defineStaticFunction(KEvent, "returnTrue", KEvent_returnTrue);
    KConfig.defineStaticFunction(KEvent, "getPropertyName", KEvent_getPropertyName);    
    KConfig.defineStaticFunction(KEvent, "addListener", KEvent_addListener);
    KConfig.defineStaticFunction(KEvent, "addEventListener", KEvent_addEventListener);
    KConfig.defineStaticFunction(KEvent, "removeListener", KEvent_removeListener);
    KConfig.defineStaticFunction(KEvent, "clearListeners", KEvent_clearListeners);
    KConfig.defineStaticFunction(KEvent, "trigger", KEvent_trigger);
    
    //=================================事件类[End]====================================