added Browser.version to the docs
[mootools/dkf.git] / Source / Types / Event.js
blob7104d5c69aa275d9951ffc20d8439af6175cdb10
1 /*
2 ---
4 name: Event
6 description: Contains the Event Class, to make the event object cross-browser.
8 license: MIT-style license.
10 requires: [Window, Document, Array, Function, String, Object]
12 provides: Event
14 ...
17 var Event = new Type('Event', function(event, win){
18         if (!win) win = window;
19         var doc = win.document;
20         event = event || win.event;
21         if (event.$extended) return event;
22         this.$extended = true;
23         var type = event.type,
24                 target = event.target || event.srcElement,
25                 page = {},
26                 client = {};
27         while (target && target.nodeType == 3) target = target.parentNode;
29         if (type.indexOf('key') != -1){
30                 var code = event.which || event.keyCode;
31                 var key = Object.keyOf(Event.Keys, code);
32                 if (type == 'keydown'){
33                         var fKey = code - 111;
34                         if (fKey > 0 && fKey < 13) key = 'f' + fKey;
35                 }
36                 if (!key) key = String.fromCharCode(code).toLowerCase();
37         } else if ((/click|mouse|menu/i).test(type)){
38                 doc = (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body;
39                 page = {
40                         x: (event.pageX != null) ? event.pageX : event.clientX + doc.scrollLeft,
41                         y: (event.pageY != null) ? event.pageY : event.clientY + doc.scrollTop
42                 };
43                 client = {
44                         x: (event.pageX != null) ? event.pageX - win.pageXOffset : event.clientX,
45                         y: (event.pageY != null) ? event.pageY - win.pageYOffset : event.clientY
46                 };
47                 if ((/DOMMouseScroll|mousewheel/).test(type)){
48                         var wheel = (event.wheelDelta) ? event.wheelDelta / 120 : -(event.detail || 0) / 3;
49                 }
50                 var rightClick = (event.which == 3) || (event.button == 2),
51                         related = null;
52                 if ((/over|out/).test(type)){
53                         related = event.relatedTarget || event[(type == 'mouseover' ? 'from' : 'to') + 'Element'];
54                         var testRelated = function(){
55                                 while (related && related.nodeType == 3) related = related.parentNode;
56                                 return true;
57                         };
58                         var hasRelated = (Browser.firefox2) ? testRelated.attempt() : testRelated();
59                         related = (hasRelated) ? related : null;
60                 }
61         } else if ((/gesture|touch/i).test(type)){
62                 this.rotation = event.rotation;
63                 this.scale = event.scale;
64                 this.targetTouches = event.targetTouches;
65                 this.changedTouches = event.changedTouches;
66                 var touches = this.touches = event.touches;
67                 if (touches && touches[0]){
68                         var touch = touches[0];
69                         page = {x: touch.pageX, y: touch.pageY};
70                         client = {x: touch.clientX, y: touch.clientY};
71                 }
72         }
74         return Object.append(this, {
75                 event: event,
76                 type: type,
78                 page: page,
79                 client: client,
80                 rightClick: rightClick,
82                 wheel: wheel,
84                 relatedTarget: document.id(related),
85                 target: document.id(target),
87                 code: code,
88                 key: key,
90                 shift: event.shiftKey,
91                 control: event.ctrlKey,
92                 alt: event.altKey,
93                 meta: event.metaKey
94         });
95 });
97 Event.Keys = {
98         'enter': 13,
99         'up': 38,
100         'down': 40,
101         'left': 37,
102         'right': 39,
103         'esc': 27,
104         'space': 32,
105         'backspace': 8,
106         'tab': 9,
107         'delete': 46
110 //<1.2compat>
112 Event.Keys = new Hash(Event.Keys);
114 //</1.2compat>
116 Event.implement({
118         stop: function(){
119                 return this.stopPropagation().preventDefault();
120         },
122         stopPropagation: function(){
123                 if (this.event.stopPropagation) this.event.stopPropagation();
124                 else this.event.cancelBubble = true;
125                 return this;
126         },
128         preventDefault: function(){
129                 if (this.event.preventDefault) this.event.preventDefault();
130                 else this.event.returnValue = false;
131                 return this;
132         }