﻿/************************************************************************************************
 * File: eventUtil.js
 * -------------------
 * Usage: 尽可能弱化IE事件模型和DOM事件模型之间的区别，使一部分代码能在所有主流浏览器上几乎完全
 *  相同的运行。
 *
 * Author: Nicholas C. Zakas
 *
 * Note: 摘抄自《JavaScript 高级程序设计》("Professional JavaScript for Web Developers")
 * 2008-6-22    myfootprints.cn@gmail.com   修改了EventUtil.addEventHandler()方法，加进了一个可选参数 vArgument
 * 
 * Created Date: 2008-1-8
 ************************************************************************************************/
 
 var EventUtil = new Object;
 
 EventUtil.addEventHandler = function (oTarget, sEventType, fnHandler, vArgument /* optional */) {
    //# 生成handler函数
    var handler;
    if (typeof(vArgument) == 'undefined') {
        handler = fnHandler;
    } else {
        handler = function () {
            fnHandler(vArgument);
        };
    }
    if (oTarget.addEventListener) {         // for DOM-compliant browsers
        oTarget.addEventListener(sEventType, handler, false);
    } else if (oTarget.attachEvent) {       // for IE
        oTarget.attachEvent("on" + sEventType, handler);
    } else {                                // for all others
        oTarget["on" + sEventType] = handler;
    }
 };
 
 EventUtil.removeEventHandler = function (oTarget, sEventType, fnHandler) {
    if (oTarget.removeEventListener) {      // for DOM-compliant browsers
        oTarget.removeEventListener(sEventType, fnHandler, false);
    } else if (oTarget.detachEvent) {       // for IE
        oTarget.detachEvent("on" + sEventType, fnHandler);
    } else {                                // for all others
        oTarget["on" + sEventType] = null;
    }
 };
 
 EventUtil.formatEvent = function (oEvent) {
    if (isIE && isWin) {
        oEvent.charCode = (oEvent.type == "keypress") ? oEvent.keyCode : 0;
        oEvent.eventPhase = 2;
        oEvent.isChar = (oEvent.charcode > 0);
        oEvent.pageX = oEvent.clientX + document.body.scrollLeft;
        oEvent.pageY = oEvent.clientY + document.body.scrollTop;
        oEvent.preventDefault = function () {
            this.returnValue = false;
        };
        
        if (oEvent.type == "mouseout") {
            oEvent.relatedTarget = oEvent.toElement;
        } else if (oEvent.type == "mouseover") {
            oEvent.relatedTarget = oEvent.fromElement;
        }
        
        oEvent.stopPropagation = function () {
            this.cancelBubble = true;
        };
        
        oEvent.target = oEvent.srcElement;
        oEvent.time = (new Date()).getTime();
    }
    
    return oEvent;
 };
 
 EventUtil.getEvent = function () {
    if (window.event) {
        return this.formatEvent(window.event);
    } else {
        return EventUtil.getEvent.caller.arguments[0];
    }
 };