(function(){window.Evento=Evento;var observados=Evento._observados;Evento.observar=function(objeto,evento,funcao,bubble){if(objeto.dispatchEvent||objeto.fireEvent){if(objeto.addEventListener){return objeto.addEventListener(evento,funcao,bubble||false)}else{if(objeto.attachEvent){return objeto.attachEvent("on"+evento,funcao)}}}var indice=observados.indiceDoObjeto(objeto);if(indice==-1){indice=observados.push(new Observado(objeto))-1}observados[indice].adicionar(evento,funcao)};Evento.desobservar=function(objeto,evento,funcao,bubble){if(objeto.dispatchEvent||objeto.fireEvent){if(objeto.removeEventListener){return objeto.removeEventListener(evento,funcao,bubble||false)}else{if(objeto.detachEvent){return objeto.detachEvent("on"+evento,funcao)}}}var indice=observados.indiceDoObjeto(objeto);if(indice==-1){indice=observados.push(new Observado(objeto))-1}observados[indice].remover(evento,funcao)};Evento.criar=function(tipo){if(document.createEvent){return document.createEvent(tipo)}else{return document.createEventObject()}};observados=Evento._observados=[];observados.indiceDoObjeto=function(objeto,inicio){for(var i=(inicio||0);i<this.length;i++){if(this[i].objeto()==objeto){return i}}return -1};function Evento(){var evento,atributos={};function __Constructor(vEvento){evento=vEvento}this.atributos=function(vAtributos){if(vAtributos==null){return Object.clonar(atributos)}for(var i in vAtributos){atributos[i]=vAtributos[i]}};this.disparar=function(objeto){var indice=observados.indiceDoObjeto(objeto);if(indice==-1){return}var funcoes=observados[indice].evento(evento);if(!funcoes){return}var evObj=Evento.criar("Event");for(var i in atributos){evObj[i]=atributos[i]}for(var i=0;i<funcoes.length;i++){funcoes[i].call(objeto,evObj)}};__Constructor.apply(this,arguments)}function Observado(){var objeto,eventos={};function __Constructor(vObjeto){objeto=vObjeto}this.adicionar=function(evento,funcao){if(!eventos[evento]){eventos[evento]=[]}if(eventos[evento].indexOf(funcao)==-1){eventos[evento].push(funcao)}};this.remover=function(evento,funcao){if(!eventos[evento]){return}var indice=eventos[evento].indexOf(funcao);if(indice==-1){return}eventos[evento].splice(indice,1)};this.evento=function(vEvento){return eventos[vEvento]};this.objeto=function(){return objeto};__Constructor.apply(this,arguments)}})();
