Hello all!

I recently revised the latest (CVS) version of events.js, and have events working 
properly in IE5, IE55, NS4, and NS6 (I don't have IE4, but I am almost positive that 
it will work in it).

It would be great if anyone would like to plug this into their version of the API and 
take it for a test drive! (Also, I would appriciate any feedback!)

Now, I made A LOT of modifications/optimizations, and I haven't commented everything, 
so please don't get angry for the lack of comments... ;-)

Here goes...

<!--//

/*
   DynAPI Distribution
   Event Classes
   Modified: 2001.01.23

   The DynAPI Distribution is distributed under the terms of the GNU LGPL license.
*/

/*----------------------------------------------------------------------
-- CLASS:       DynEvent
-- ARGUMENTS:   type,src,target
-- METHODS:     getType(), getSource(), getTarget()
----------------------------------------------------------------------*/
DynEvent=function(type,src,target) {
    this.type=type;
    this.src=src;
    this.target=target;
};
DynEvent.prototype.getType=function() {
    return this.type;
};
DynEvent.prototype.getSource=function() {
    return this.src;
};
DynEvent.prototype.getTarget=function() {
    return this.target;
};


/*----------------------------------------------------------------------
-- CLASS:       EventListener
-- ARGUMENTS:   target
-- METHODS:     handleEvent()
----------------------------------------------------------------------*/
EventListener=function(target) {
    this.target=target;
}
EventListener.prototype.handleEvent=function(type,e) {
        if ((e.button==2 || e.button==3) && (type=='mousedown' || type=='mouseup' || 
type=='click' || type=='dblclick')) {
                if (e.button==2) type='md'+type;
                if (e.button==3) type='rt'+type;
        e.type=type; //ADDED:proteanman
        }    
    if (this["on"+type]) {            
        if (is.ns5) {
            var mse=(type.match(/mouse/) || type.match(/click/));
            if (!mse || (!isNaN(e.eventPhase) && ((e.src.isDynLayer && 
(e.eventPhase==1 || e.eventPhase==2)) || (e.src.isDynDocument && e.eventPhase==3)))) 
this["on"+type](e);
        } else this["on"+type](e);
    }
};

/*----------------------------------------------------------------------
-- CLASS:       MouseEvent
-- ARGUMENTS:   none
-- METHODS:     getType(), getSource(), getTarget(), setEvent(),
                bubbleEvent(), getX(), getY(), getPageX(), getPageY(),
                setBubble(), cancelBrowserEvent()
----------------------------------------------------------------------*/
MouseEvent=function() {};
MouseEvent.prototype.getType=function() {
    return this.type;
};
MouseEvent.prototype.getSource=function() {
    return this.src;
};
MouseEvent.prototype.getTarget=function() {
    return this.target;
};
MouseEvent.prototype.setEvent=function(src,e) {
    this.orig=e;
    this.browserReturn=true;
    this.bubble=true;
    this.src=src;
    this.type=e.type;
        
    if (is.ie) {
        //Set event's mouse's x/y & pageX/pageY coords
        this.pageX=e.x+document.body.scrollLeft;
        this.pageY=e.y+document.body.scrollTop;
        this.x=e.offsetX;
        this.y=e.offsetY;
        
        //Set event mouse button
        var b=e.button;    
        if (b==2) b=3;
        else if (b==4) b=2;
        this.button=b;
        
        //Set mouse event's modifiers
        this.altKey=(e.altKey || e.altLeft);
        this.ctrlKey=(e.ctrlKey || e.ctrlLeft);
        this.shiftKey=(e.shiftKey || e.shiftLeft);
    } else {
        //ADDED: proteanman -- adds events eventphase property for ns5
        if (is.ns5) this.eventPhase=e.eventPhase;
        
        //Set event's mouse's x/y & pageX/pageY coords
        this.pageX=e.pageX-window.pageXOffset;
        this.pageY=e.pageY-window.pageYOffset;
        this.x=e.layerX;
        this.y=e.layerY;
        
        //Set event mouse button
        this.button=e.which;
        
        //Set mouse event's modifiers
        var m=e.modifiers;
        this.altKey=(m==1 || m==3 || m==5 || m==7);
        this.ctrlKey=(m==2 || m==3 || m==6 || m==7);
        this.shiftKey=(m==4 || m==5 || m==6 || m==7);
    }
};
MouseEvent.prototype.bubbleEvent=function() {
    if (!this.bubble || this.src.isDynDocument || this.src.parent==null) return;
    this.x+=this.src.x;
    this.y+=this.src.y;
    this.src=this.src.parent;
    this.src.invokeEvent(this.type,this);
    this.bubbleEvent();
    return;
};
MouseEvent.prototype.getX=function() {
    return this.x;
};
MouseEvent.prototype.getY=function() {
    return this.y;
};
MouseEvent.prototype.getPageX=function() {
    return this.pageX;
};
MouseEvent.prototype.getPageY=function() {
    return this.pageY;
};
MouseEvent.prototype.setBubble=function(b) {
    this.bubble=b;
};
MouseEvent.prototype.cancelBrowserEvent=function(b) {
    this.browserReturn=false;
};

/*----------------------------------------------------------------------
-- DynLayer Event Methods
----------------------------------------------------------------------*/
DynLayer.prototype.captureMouseEvents=function() {
    if (this.isDynDocument && this.mouseEventsCaptured) return;
    this.mouseEventsCaptured=true;
    
    if (!this.eventListeners) this.eventListeners=[];
    this.hasEventListeners=true;
    
    if (this.isDynLayer && (!this.created || !this.elm)) return;
    
    var o=(this.isDynDocument)?this.doc:this.elm;
    
    if (is.ns4) {
        if (this.isDynLayer) o.captureEvents(Event.MOUSEOVER | Event.MOUSEMOVE | 
Event.MOUSEDOWN | Event.MOUSEUP | Event.CLICK | Event.DBLCLICK | Event.MOUSEOUT);
        else if (this.isDynDocument) o.captureEvents(Event.MOUSEMOVE | Event.MOUSEDOWN 
| Event.MOUSEUP | Event.CLICK | Event.DBLCLICK);
    } else if (is.ie) {
        o.oncontextmenu=function() { 
            return false;
        };
    }
    
    if (is.ns5) {
        if (this.isDynLayer) {
            //true (bubble phase - from src to window): eventPhase = 1 to 2
            o.addEventListener("mouseover",DynLayer.prototype.EventMethod,true);
            o.addEventListener("mousemove",DynLayer.prototype.EventMethod,true);
            o.addEventListener("mousedown",DynLayer.prototype.EventMethod,true);
            o.addEventListener("mouseup",DynLayer.prototype.EventMethod,true);
            o.addEventListener("click",DynLayer.prototype.EventMethod,true);
            o.addEventListener("dblclick",DynLayer.prototype.EventMethod,true); 
            o.addEventListener("mouseout",DynLayer.prototype.EventMethod,true);
        } else if (this.isDynDocument) {
            //false (capture phase - from window to src): eventPhase = 3
            o.addEventListener("mousemove",DynDocument.prototype.EventMethod,false);
            o.addEventListener("mousedown",DynDocument.prototype.EventMethod,false);
            o.addEventListener("mouseup",DynDocument.prototype.EventMethod,false);
            o.addEventListener("click",DynDocument.prototype.EventMethod,false);
            o.addEventListener("dblclick",DynDocument.prototype.EventMethod,false);
        }
    } else {
        if (this.isDynLayer) 
o.onmouseover=o.onmousemove=o.onmousedown=o.onmouseup=o.onclick=o.ondblclick=o.onmouseout=DynLayer.prototype.EventMethod;
        else if (this.isDynDocument) 
o.onmousemove=o.onmousedown=o.onmouseup=o.onclick=o.ondblclick=DynDocument.prototype.EventMethod;
    }
};
DynLayer.prototype.releaseMouseEvents=function() {
    this.mouseEventsCaptured=false;
    if (this.isDynLayer) {
        var o=this.elm;
        
o.onmouseover=o.onmousemove=o.onmousedown=o.onmouseup=o.onclick=o.ondblclick=o.onmouseout=function(e)
 {
            return false;
        };
    } else if (this.isDynDocument) {
        var o=this.doc;
        o.onmousemove=o.onmousedown=o.onmouseup=o.onclick=o.ondblclick=function(e) {
            return false;
        };
    }
};
DynLayer.prototype.EventMethod=function(e) {
    var dyndoc=this.lyrobj.dyndoc;
    if (is.ie) {
        var e=dyndoc.elm.event;        
        e.cancelBubble=true;
        if (e.type=="click" && DynAPI.wasDragging) {
            DynAPI.wasDragging=false;            
            return true;
        }
        if ((e.type=="mouseout" && this.contains(e.toElement)) || (e.type=="mouseover" 
&& this.contains(e.fromElement))) return true;
    }
    
    var realsrc=(is.ie)?e.srcElement:(is.ns5)?e.currentTarget:e.target;//var 
realsrc=(is.ie)?e.srcElement:e.target;
    
    if (is.ie) while (!realsrc.lyrobj && realsrc.parentElement && 
realsrc.parentElement!=realsrc) realsrc=realsrc.parentElement;//for (; is.ie && 
!realsrc.lyrobj && realsrc.parentElement && realsrc.parentElement!=realsrc; 
realsrc=realsrc.parentElement);
    else if (is.ns5) while (!realsrc.lyrobj && realsrc.parentNode && 
realsrc.parentNode!=realsrc) realsrc=realsrc.parentNode;
    
    var src=realsrc.lyrobj||dyndoc;
    if (!src) return true;
    var evt=dyndoc._e;
    evt.setEvent(src,e);
    var type=evt.type;
    src.invokeEvent(type,evt);
    
    if (!this.isDynDocument && is.ns && (e.type=="mouseover" || e.type=="mouseout")) 
return false;
    
    evt.bubbleEvent();
    
    //returns false after double-click, so that the click event doesn't happen again 
(it happens before) after the double-click -- works all but ns5
    if (type.match(/dblclick/)) return false;
    
    //checks for mousedown so that clicks will get fired in ns4
    else if (is.ns4 && evt.button!=3 && type.match(/mousedown/)) return true;
    
    //checks if there is a right-mousedown(ns4) || right-mouseup(ns5) and prevents the 
right-mouse menu from popping up
    else if ((is.ns4 && evt.button==3 && type.match(/mousedown/)) || (is.ns5 && 
evt.button==3 && type.match(/mouseup/))) return false;
    else return evt.browserReturn;
};
DynLayer.prototype.addEventListener=function(listener) {
        if (!this.hasEventListeners) this.captureMouseEvents();
        for (var i in this.eventListeners) {
        if (this.eventListeners[i]==listener) return;
    }
        this.eventListeners[this.eventListeners.length]=listener;
};
DynLayer.prototype.removeEventListener=function(listener) {
    DynAPI.removeFromArray(this.eventListeners, listener, false);
};
DynLayer.prototype.removeAllEventListeners=function() {
    if (!this.hasEventListeners) return;
        for (var i in this.eventListeners) delete this.eventListeners[i];
        this.eventListeners=[];
        this.hasEventListeners=false;
};
DynLayer.prototype.invokeEvent=function(type,e) {
        if (!this.hasEventListeners) return;
    
    if (is.ie && this.isDynLayer && ((type=='mouseover' && 
this.elm.contains(e.orig.fromElement)) || (type=='mouseout' && 
this.elm.contains(e.orig.toElement)))) return;
    
    var orig=null;
        if (is.ns && e) {
                orig=e.orig;
                e.cancelBubble=false;
    }
        if (is.ns4 && is.platform=='other' && type.match(/mousedown/)) {
        if (this.dbltimer!=null) {
            type="dblclick";
            if (e) e.type=type;
        } else this.dbltimer=setTimeout(this+'.dbltimer=null',300);
        }
    for (var i=0; i<this.eventListeners.length; i++) {
        if (e) e.target=this.eventListeners[i].target;
                else {
                        e=new DynEvent(type,this);
                        e.target=this.eventListeners[i].target;
                if (is.ns) e.cancelBubble=false;
                }
        this.eventListeners[i].handleEvent(type,e);
        }
        
    if (is.ns && ((this.isDynLayer && e) || (this.isDynDocument && (e || i!=0)))) {
                if (e.cancelBubble) return;
        if (orig && orig.target.handleEvent) {
            if (this.isDynLayer && orig.target!=this.elm) 
orig.target.handleEvent(type,orig);
            else if (this.isDynDocument && !orig.target.URL) 
orig.target.handleEvent(orig);
        }
    }
        if (is.ns4 && is.platform=='other' && type=='mouseup') 
this.invokeEvent('click',e);    
    if (this.isDynLayer && this.parentComponent) {
        if (e) e.src=this.parentComponent;
        else e=new DynEvent(type,this);
        this.parentComponent.invokeEvent(type,e);
    }
};

/*----------------------------------------------------------------------
-- DynDocument Event Methods
----------------------------------------------------------------------*/
DynDocument.prototype._e=new MouseEvent();
DynDocument.prototype.captureMouseEvents=DynLayer.prototype.captureMouseEvents;
DynDocument.prototype.releaseMouseEvents=DynLayer.prototype.releaseMouseEvents;
DynDocument.prototype.EventMethod=DynLayer.prototype.EventMethod;
DynDocument.prototype.addEventListener=DynLayer.prototype.addEventListener;
DynDocument.prototype.removeEventListener=DynLayer.prototype.removeEventListener;
DynDocument.prototype.removeAllEventListeners=DynLayer.prototype.removeAllEventListeners;
DynDocument.prototype.invokeEvent=DynLayer.prototype.invokeEvent;

//-->

I have also made A LOT of modifications to dynlayer.js, which fixes some of the 
existing problems, including tge contentW/H (specifically in NS4 and NS6, in the 
createElement). But it is still undergoing evtensive testing.

I need to set up CVS on my computer, so that I can make these updates soon.

--proteanman

On Mon, 22 January 2001, [EMAIL PROTECTED] wrote:

> 
> I tried your patch and still doubleclick on ns 6 doesn't work 
> ciao
> Y
> On Mon, 22 January 2001, [EMAIL PROTECTED] wrote:
> 
> > 
> > Patch #103359 has been updated. 
> > 
> > Project: dynapi
> > Category: DynAPI-Event
> > Status: Open
> > Submitted by: camhart
> > Assigned to : nobody
> > Summary: NS6 event fixes
> > 
> > Follow-Ups:
> > 
> > Date: 2001-Jan-22 19:55
> > By: nobody
> > 
> > Comment:
> > Tested and working
> > Richard Bennett
> > -------------------------------------------------------
> > 
> > -------------------------------------------------------
> > For more info, visit:
> > 
> > http://sourceforge.net/patch/?func=detailpatch&patch_id=103359&group_id=5757
> > 
> > _______________________________________________
> > Dynapi-Dev mailing list
> > [EMAIL PROTECTED]
> > http://lists.sourceforge.net/lists/listinfo/dynapi-dev
> 
> 
> 
> _______________________________________________
> Dynapi-Dev mailing list
> [EMAIL PROTECTED]
> http://lists.sourceforge.net/lists/listinfo/dynapi-dev

_______________________________________________
Dynapi-Dev mailing list
[EMAIL PROTECTED]
http://lists.sourceforge.net/lists/listinfo/dynapi-dev

Reply via email to