Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
20 | reyssat | 1 | /* |
2 | DynAPI Distribution |
||
3 | MouseEvent Class |
||
4 | |||
5 | The DynAPI Distribution is distributed under the terms of the GNU LGPL license. |
||
6 | |||
7 | requires: dynapi.api.DynDocument |
||
8 | */ |
||
9 | |||
10 | function MouseEvent(dyndoc) { |
||
11 | this.DynEvent = DynEvent; |
||
12 | this.DynEvent(); |
||
13 | this.bubble = true; |
||
14 | this._mouseEvent = null; |
||
15 | this._relative = null; |
||
16 | this._dyndoc = dyndoc; |
||
17 | }; |
||
18 | var p = dynapi.setPrototype('MouseEvent','DynEvent'); |
||
19 | p.getX = function() {return this.x}; |
||
20 | p.getY = function() {return this.y}; |
||
21 | p.getPageX = function() {return this.pageX}; |
||
22 | p.getPageY = function() {return this.pageY}; |
||
23 | p.trapMouseUp = dynapi.functions.Null; |
||
24 | p.getRelative = function() {return this._relative}; |
||
25 | p.preventBubble = function() { |
||
26 | this.bubble = false; |
||
27 | }; |
||
28 | p.getButton = function() { |
||
29 | if (!this._mouseEvent) return "left"; |
||
30 | var b = this._mouseEvent.which; |
||
31 | if (b==2) return "middle"; |
||
32 | if (b==3) return "right"; |
||
33 | else return "left"; |
||
34 | }; |
||
35 | p._init = function(type,e,src) { |
||
36 | this.type = type; |
||
37 | this._mouseEvent = e; |
||
38 | this.origin = src; |
||
39 | this.bubbleChild = null; |
||
40 | this.defaultValue = true; |
||
41 | this.bubble = true; |
||
42 | }; |
||
43 | p._invoke = function() { |
||
44 | var o = this.origin; |
||
45 | o.invokeEvent(this.type,this); |
||
46 | }; |
||
47 | MouseEvent._getContainerLayerOf = function(element) { |
||
48 | if (!element) return null; |
||
49 | while (!element._dynobj && element.parentNode && element.parentNode!=element) { |
||
50 | element = element.parentNode; |
||
51 | } |
||
52 | return element._dynobj; |
||
53 | }; |
||
54 | MouseEvent._eventHandler = function(e) { |
||
55 | var dynobj = this._dynobj; |
||
56 | if (!dynobj) return true; |
||
57 | var dyndoc = dynobj._dyndoc; |
||
58 | var target = e.target; |
||
59 | |||
60 | var me = dyndoc._mouseEvent; |
||
61 | var src = MouseEvent._getContainerLayerOf(target); |
||
62 | me._init(e.type,e,src); |
||
63 | var rel = e.relatedTarget; |
||
64 | var r = me._relative = MouseEvent._getContainerLayerOf(rel); |
||
65 | if (e.type=="mouseout" || e.type=="mouseover") { |
||
66 | if(!r && dynapi.ua.opera) return; //fix for #15 |
||
67 | if (r && (r==src||src.isParentOf(r))) return; // fix for #15 |
||
68 | if (r && (r==src.parent||r.isChildOf(src.parent))) me.bubble=false; |
||
69 | } |
||
70 | me.pageX = e.clientX; |
||
71 | me.pageY = e.clientY; |
||
72 | if(!src) return; |
||
73 | me.x = me.pageX - src.getPageX(); //offsetX; |
||
74 | me.y = me.pageY - src.getPageY(); //offsetY; |
||
75 | e.cancelBubble = true; |
||
76 | me._invoke(); |
||
77 | |||
78 | var tn=(target.tagName+'').toLowerCase(); |
||
79 | |||
80 | // fix for form elements inside drag-enabled layer #08 |
||
81 | if(e.type=='mousedown' && tn=='input'||tn=='textarea'||tn=='button') { |
||
82 | var de=dynapi.frame.DragEvent; |
||
83 | de=(de && de.dragevent)? de.dragevent:null; |
||
84 | if(de && de.isDragging) de.cancelDrag(); |
||
85 | } |
||
86 | |||
87 | // prevent image dragging |
||
88 | if(tn=='img' && typeof(target.onmousedown)!="function") { |
||
89 | target.onmousedown=dynapi.functions.False; |
||
90 | } |
||
91 | |||
92 | // disable text select |
||
93 | if (e.type=='mousedown' && src._textSelectable==false) { |
||
94 | e.preventDefault(); |
||
95 | return false; |
||
96 | } |
||
97 | |||
98 | }; |
||
99 | |||
100 | DynElement.prototype.captureMouseEvents = function() { |
||
101 | this._hasMouseEvents = true; |
||
102 | var elm = (this.getClassName()=='DynDocument')? this.doc : this.elm; |
||
103 | if(elm) { |
||
104 | elm.addEventListener("mousemove",MouseEvent._eventHandler,false); |
||
105 | elm.addEventListener("mousedown",MouseEvent._eventHandler,false); |
||
106 | elm.addEventListener("mouseup",MouseEvent._eventHandler,false); |
||
107 | elm.addEventListener("mouseover",MouseEvent._eventHandler,false); |
||
108 | elm.addEventListener("mouseout",MouseEvent._eventHandler,false); |
||
109 | elm.addEventListener("click",MouseEvent._eventHandler,false); |
||
110 | elm.addEventListener("dblclick",MouseEvent._eventHandler,false); |
||
111 | } |
||
112 | }; |
||
113 | DynElement.prototype.releaseMouseEvents=function() { |
||
114 | this._hasMouseEvents = false; |
||
115 | var elm = (this.getClassName()=='DynDocument')? this.doc : this.elm; |
||
116 | if (typeof(elm)=='object') { |
||
117 | /* elm.removeEventListener("mousemove",MouseEvent._eventHandler,false); |
||
118 | elm.removeEventListener("mousedown",MouseEvent._eventHandler,false); |
||
119 | elm.removeEventListener("mouseup",MouseEvent._eventHandler,false); |
||
120 | elm.removeEventListener("mouseover",MouseEvent._eventHandler,false); |
||
121 | elm.removeEventListener("mouseout",MouseEvent._eventHandler,false); |
||
122 | elm.removeEventListener("click",MouseEvent._eventHandler,false); |
||
123 | elm.removeEventListener("dblclick",MouseEvent._eventHandler,false);*/ |
||
124 | } |
||
125 | }; |
||
126 | |||
127 | function main() { |
||
128 | dynapi.document._mouseEvent = new MouseEvent(dynapi.document); |
||
129 | }; |
||
130 | if (!dynapi.loaded) main(); |