1 // (c) BenoƮt PIN 2006-2014
6 // Meta functions for events management.
8 var addListener
; /* (ob, eventName, listenerFunction, group) add event listener eventName without "on" prefix.
9 * optionally, listeners can be grouped to make removing convenient.
11 var removeListener
; // (ob, eventName, listenerFunction, group) remove event listener.
12 var removeGroupListeners
; // (group) remove all listeners in group.
13 var raiseMouseEvent
; // (ob, eventName) raise mouse event (without "on" prefix) on object.
15 var getTargetedObject
; // (event) retrieves the object that fired the event. Event parameter is optional.
16 var getEventObject
; // (event) return the event object. Event parameter is optional.
17 var disableDefault
; // (event) disable default event's action. Event parameter is optional.
18 var disablePropagation
; // (event) disable event propagation or bubbling.
21 var getWindowWidth
; // returns browser's window width
22 var getWindowHeight
; // returns browser's window height
23 var clearSelection
; // clear current selection (useful on drag and drop)
24 var getCopyOfNode
; /* (node) returns a clone of the given node.
26 * the node came from a foreign document (eg. XmlHttpRequest xml reponse)
27 * to inject HMTL code inside tags where innerHtml is read only (IE)
30 var copyPrototype
; // (descendant, parent) lightwheight javascript inheritance
31 if (!history
.pushState
) {
32 history
.pushState = function(){};
37 function buildMetaFunctions() {
38 addListener
= _build_addListener();
39 removeListener
= _build_removeListener();
40 raiseMouseEvent
= _build_raiseMouseEvent();
42 getTargetedObject
= _build_getTargetedObject();
43 getEventObject
= _build_getEventObject();
44 disableDefault
= _build_disableDefault();
45 disablePropagation
= _build_disablePropagation();
46 getWindowWidth
= _build_getWindowWidth();
47 getWindowHeight
= _build_getWindowHeight();
48 getWindowScrollX
= _build_getWindowScrollX();
49 getWindowScrollY
= _build_getWindowScrollY();
50 clearSelection
= _build_clearSelection();
53 var __groupListeners
= {};
55 function _build_addListener() {
57 if (!browser
.isDOM2Event
) {
58 _browserSpecific = function(ob
, eventName
, listenerFunction
) {
59 eventName
= "on" + eventName
;
60 ob
.attachEvent(eventName
, listenerFunction
);
64 _browserSpecific = function(ob
, eventName
, listenerFunction
) {
65 ob
.addEventListener(eventName
, listenerFunction
, false); // only bubbling events :-(
68 var common = function(ob
, eventName
, listenerFunction
, group
) {
69 _browserSpecific(ob
, eventName
, listenerFunction
);
71 if(!__groupListeners
[group
]) {
72 __groupListeners
[group
] = [];}
73 __groupListeners
[group
].push([ob
, eventName
, listenerFunction
]);
79 function _build_removeListener() {
80 if (!browser
.isDOM2Event
) {
81 var _ie_removeListener = function(ob
, eventName
, listenerFunction
) {
82 eventName
= "on" + eventName
;
83 ob
.detachEvent(eventName
, listenerFunction
);
85 return _ie_removeListener
;
88 var _dom2_removeListener = function(ob
, eventName
, listenerFunction
) {
89 ob
.removeEventListener(eventName
, listenerFunction
, false); // only bubbling events :-(
91 return _dom2_removeListener
;
95 removeGroupListeners = function(group
) {
96 var listeners
= __groupListeners
[group
];
100 for (i
=0 ; i
<listeners
.length
; i
++){
102 removeListener(l
[0], l
[1], l
[2]);
104 __groupListeners
[group
] = null;
108 function _build_raiseMouseEvent() {
109 if (!browser
.isDOM2Event
) {
110 var _ie_raiseMouseEvent = function(ob
, eventName
) {
111 ob
.fireEvent("on" + eventName
);
113 return _ie_raiseMouseEvent
;
116 var _dom2_raiseMouseEvent = function(ob
, eventName
) {
117 var event
= document
.createEvent("MouseEvents");
118 event
.initEvent(eventName
, true, true);
119 ob
.dispatchEvent(event
);
121 return _dom2_raiseMouseEvent
;
125 function _build_getTargetedObject(){
126 if (!browser
.isDOM2Event
) {
127 var _ie_getTargetedObject = function() {
128 return window
.event
.srcElement
;
130 return _ie_getTargetedObject
;
133 var _appleWebKit_getTargetedeObject = function(evt
) {
134 var target
= evt
.target
;
135 // is it really safe ?...
136 return (target
.nodeType
=== 3) ? target
.parentNode
: target
;
138 var _dom2_getTargetedObject = function(evt
) {
141 return (browser
.isAppleWebKit
) ? _appleWebKit_getTargetedeObject
: _dom2_getTargetedObject
;
145 function _build_getEventObject(){
146 if (!browser
.isDOM2Event
) {
147 var _ie_getEventObject = function() {
150 return _ie_getEventObject
;
153 var _dom2_getEventObject = function(evt
) {
156 return _dom2_getEventObject
;
161 function _build_disableDefault(){
162 if (!browser
.isDOM2Event
) {
163 var _ie_disableDefault = function() {
164 window
.event
.returnValue
= false;
166 return _ie_disableDefault
;
169 var _dom2_disableDefault = function(evt
) {
170 evt
.preventDefault();
172 return _dom2_disableDefault
;
176 function _build_disablePropagation() {
177 if (!browser
.isDOM2Event
) {
178 var _ie_disablePropagation = function() {
179 window
.event
.cancelBubble
= true;
181 return _ie_disablePropagation
;
184 var _dom2_disablePropagation = function(evt
) {
185 evt
.stopPropagation();
187 return _dom2_disablePropagation
;
191 function _build_getWindowWidth() {
192 if (window
.innerWidth
!== undefined){
194 return window
.innerWidth
;
199 return document
.documentElement
.clientWidth
;
204 function _build_getWindowHeight() {
205 if (window
.innerHeight
!== undefined) {
207 return window
.innerHeight
;
212 return document
.documentElement
.clientHeight
;
217 function _build_getWindowScrollX() {
218 if (window
.scrollX
!== undefined) {
220 return window
.scrollX
;
225 return document
.documentElement
.scrollLeft
;
230 function _build_getWindowScrollY() {
231 if (window
.scrollY
!== undefined) {
233 return window
.scrollY
;
238 return document
.documentElement
.scrollTop
;
243 function _build_clearSelection() {
244 if (document
.selection
) {
246 document
.selection
.clear();
251 window
.getSelection().removeAllRanges();
256 buildMetaFunctions();
258 addListener(window
, 'load', function(evt
) {
261 if (!document
.body
.classList
) {
262 var nop = function(){};
263 var fakeDOMTokenList
= {'length':0, 'item':nop
, 'contains':nop
, 'add':nop
, 'remove':nop
, 'toggle':nop
};
264 Element
.prototype.classList
= fakeDOMTokenList
;
272 var ELEMENT_NODE
= 1;
275 getCopyOfNode = function(node
) {
277 switch(node
.nodeType
) {
279 var attributes
= node
.attributes
;
280 var childs
= node
.childNodes
;
282 var e
= document
.createElement(node
.nodeName
);
285 for(i
=0 ; i
<attributes
.length
; i
++) {
286 attribute
= attributes
[i
];
287 _setAttribute(e
, attribute
.name
, attribute
.value
);
290 for(i
=0 ; i
<childs
.length
; i
++) {
291 e
.appendChild(getCopyOfNode(childs
[i
]));}
296 return document
.createTextNode(node
.nodeValue
);
300 if (browser
.isIE7max
) {
301 _setAttribute = function(e
, name
, value
) {
302 // workarround IE lack of dom implementation.
303 switch(name
.toLowerCase()) {
311 loadCssText(e
, value
);
314 if (name
.slice(0,2) === 'on') { // event handler
315 // A browser normaly eval text code attached to a onXyz attribute. Not IE.
316 /*jslint evil: true */
317 e
[name
] = function(){eval(value
);};}
319 e
.setAttribute(name
, value
);}
322 var reCompoundPropName
= /^\s*([^\-]+)\-([a-z])([a-z]+)\s*$/;
323 var _capitalizeCssPropName = function (s
) {
324 var g
= reCompoundPropName
.exec(s
);
326 return g
[1] + g
[2].toUpperCase() + g
[3];}
331 var loadCssText = function (e
, cssText
) {
332 var pairs
= cssText
.split(';');
333 var pair
, name
, value
, i
;
335 for (i
= 0; i
< pairs
.length
; i
++) {
336 pair
= pairs
[i
].split(':');
337 if (pair
.length
=== 2) {
338 name
= _capitalizeCssPropName(pair
[0]);
346 _setAttribute = function(e
, name
, value
) {e
.setAttribute(name
, value
);};
350 * http://www.sitepoint.com/blogs/2006/01/17/javascript-inheritance/
353 copyPrototype = function (descendant
, parent
) {
354 var sConstructor
= parent
.toString();
355 var aMatch
= sConstructor
.match( /\s*function (.*)\(/ );
356 if ( aMatch
!== null ) { descendant
.prototype[aMatch
[1]] = parent
; }
358 for (m
in parent
.prototype) {
359 if (parent
.prototype.hasOwnProperty(m
)) {
360 descendant
.prototype[m
] = parent
.prototype[m
]; }