/* */

var eventTranslators = 
{
    ie:
    {
    /*  'eventName': 'newEventName' */
    },
    
    ff:
    {
    /*  'eventName': 'newEventName' */
    }
};

// Attaches to node's event (in the form of ie. 'click') so that callback
// is called when said event happens.  callback's first parameter will be
// the event object and its second parameter will be 'parameter'.  The third
// parameter is the event named pased into doAttachEvent.
//
// 'callback' has this form:
// function callback(event, parameter, eventName);
//
// Returns a function instance which must be used to unattach the event.
function doAttachEvent(node, eventName, callback, parameter)
{
    var func = new Function("return arguments.callee.callback("
        + "arguments[0] || window.event, arguments.callee.parameter, "
        + "arguments.callee.eventName);");
    
    func.callback = callback;
    func.parameter = parameter;
    func.eventName = eventName;
    
    if(node.attachEvent) {
        
        if(eventTranslators.ie[eventName])
            event = eventTranslators.ie[eventName];
        else
            eventName = 'on' + eventName;
        
        node.attachEvent(eventName, func);
    }
    else {
        
        if(eventTranslators.ff.hasOwnProperty(eventName))
            eventName = eventTranslators.ff[eventName];
        
        node.addEventListener(eventName, func, false);
    }
    
    return func;
}

// Unattaches an event previously attached with doAttachEvent.
// 
// 'attachEventRetValue' is the value returned by doAttachEvent.
function doDetachEvent(node, eventName, attachEventRetValue)
{
    if(node.detachEvent) {
        
        if(eventTranslators.ie[eventName])
            event = eventTranslators.ie[eventName];
        else
            eventName = 'on' + eventName;
        
        node.detachEvent(eventName, attachEventRetValue);
    }
    else {
        
        if(eventTranslators.ff.hasOwnProperty(eventName))
            eventName = eventTranslators.ff[eventName];
        
        node.removeEventListener(eventName, attachEventRetValue, false);
    }
}
