
/*******************************************************************************
Funções
addEvent(object: Object, event: String, handler: Function(e: Event): Boolean,
    [scope: Object = object]): Boolean
    Adiciona uma função que será disparada quando ocorrer determinado evento no
    objeto.

    object
        objeto que receberá o listener
    event
        nome do evento sem o prefixo "on" (click, mouseover, ...)
    handler
        função que será chamada quando o evento ocorrer, será enviado como
        argumento para esta função o objeto de evento, que além das propriedades
        normais, *sempre* irá conter:

            * target: objeto que gerou o evento
            * key: código do caractere em eventos de teclado
            * stopPropagation: método para evitar a propagação do evento
            * preventDefault: método para evitar que a ação default ocorra

        o preventDefault pode ser emulado retornando "false" na função 
    scope
        escopo (quem o "this" irá referenciar dentro do handler) que será usado
        quando a função for chamada, o default é o objeto no primeiro argumento
*******************************************************************************/

addEvent = function(o, e, f, s){
    var r = o[r = "_" + (e = "on" + e)] = o[r] || (o[e] ? [[o[e], o]] : []), a, c, d;
	// mudado para atender a consulta por número
    r[0] = [f, s || o], o[e] = function(e){
        try{
            (e = e || event).preventDefault || (e.preventDefault = function(){e.returnValue = false;});
            e.stopPropagation || (e.stopPropagation = function(){e.cancelBubble = true;});
            e.target || (e.target = e.srcElement || null);
            e.key = (e.which + 1 || e.keyCode + 1) - 1 || 0;
        }catch(f){}
        for(d = 1, f = r.length; f; r[--f] && (a = r[f][0], o = r[f][1], a.call ? c = a.call(o, e) : (o._ = a, c = o._(e), o._ = null), d &= c !== false));
        return e = null, !!d;
    }
};

/*******************************************************************************
removeEvent(object: Object, event: String, handler: function(e: Event): Boolean,
    [scope: Object = object]): Boolean
    
    Remove um listener previamente adicionado em um objeto e retorna true em
    caso de sucesso.

    object
        objeto que recebeu o listener
    event
        nome do evento sem o prefixo "on" (click, mouseover, ...)
    handler
        mesma função que foi atribuida no addEvent
    scope
        escopo em que a função foi adicionada, caso você tenha fornecido um
        escopo diferente no addEvent, é necessário que você passe como parâmetro
        o mesmo objeto, caso contrário a remoção do evento não será realizada

*******************************************************************************/
removeEvent = function(o, e, f, s){
    for(var i = (e = o["_on" + e] || []).length; i;)
        if(e[--i] && e[i][0] == f && (s || o) == e[i][1])
            return delete e[i];
    return false;
};