chmod -x
[Plinn.git] / skins / ajax_scripts / javascript_events_api.js
index 7e9e8dd..2083018 100644 (file)
@@ -1,4 +1,4 @@
-// (c) Benoît PIN 2006-2009
+// (c) Benoît PIN 2006-2014
 // http://plinn.org
 // Licence GPL
 // 
 // http://plinn.org
 // Licence GPL
 // 
@@ -6,7 +6,7 @@
 // Meta functions for events management.
 
 var addListener; /* (ob, eventName, listenerFunction, group) add event listener eventName without "on" prefix.
 // Meta functions for events management.
 
 var addListener; /* (ob, eventName, listenerFunction, group) add event listener eventName without "on" prefix.
-                                *  optionally, listeners can be grouped to make removing convenient.
+                                *      optionally, listeners can be grouped to make removing convenient.
                                 */
 var removeListener; // (ob, eventName, listenerFunction, group) remove event listener.
 var removeGroupListeners; // (group) remove all listeners in group.
                                 */
 var removeListener; // (ob, eventName, listenerFunction, group) remove event listener.
 var removeGroupListeners; // (group) remove all listeners in group.
@@ -27,6 +27,11 @@ var getCopyOfNode; /* (node) returns a clone of the given node.
                                                * to inject HMTL code inside tags where innerHtml is read only (IE)
                                        */
 
                                                * to inject HMTL code inside tags where innerHtml is read only (IE)
                                        */
 
+var copyPrototype; // (descendant, parent) lightwheight javascript inheritance
+if (!history.pushState) {
+       history.pushState = function(){};
+}
+
 (function(){
 
 function buildMetaFunctions() {
 (function(){
 
 function buildMetaFunctions() {
@@ -40,20 +45,22 @@ function buildMetaFunctions() {
        disablePropagation = _build_disablePropagation();
        getWindowWidth = _build_getWindowWidth();
        getWindowHeight = _build_getWindowHeight();
        disablePropagation = _build_disablePropagation();
        getWindowWidth = _build_getWindowWidth();
        getWindowHeight = _build_getWindowHeight();
+       getWindowScrollX = _build_getWindowScrollX();
+       getWindowScrollY = _build_getWindowScrollY();
        clearSelection = _build_clearSelection();
 }
 
        clearSelection = _build_clearSelection();
 }
 
-__groupListeners = {};
+var __groupListeners = {};
 
 function _build_addListener() {
        var _browserSpecific;
 
 function _build_addListener() {
        var _browserSpecific;
-       if (browser.isIE55 || browser.isIE6up) {
+       if (!browser.isDOM2Event) {
                _browserSpecific = function(ob, eventName, listenerFunction) {
                        eventName = "on" + eventName;
                        ob.attachEvent(eventName, listenerFunction);
                };
        }
                _browserSpecific = function(ob, eventName, listenerFunction) {
                        eventName = "on" + eventName;
                        ob.attachEvent(eventName, listenerFunction);
                };
        }
-       else if (browser.isDOM2Event) {
+       else {
                _browserSpecific = function(ob, eventName, listenerFunction) {
                        ob.addEventListener(eventName, listenerFunction, false); // only bubbling events :-(
                };
                _browserSpecific = function(ob, eventName, listenerFunction) {
                        ob.addEventListener(eventName, listenerFunction, false); // only bubbling events :-(
                };
@@ -61,126 +68,126 @@ function _build_addListener() {
        var common = function(ob, eventName, listenerFunction, group) {
                _browserSpecific(ob, eventName, listenerFunction);
                if (group) {
        var common = function(ob, eventName, listenerFunction, group) {
                _browserSpecific(ob, eventName, listenerFunction);
                if (group) {
-                       if(!__groupListeners[group])
-                               __groupListeners[group] = new Array();
+                       if(!__groupListeners[group]) {
+                               __groupListeners[group] = [];}
                        __groupListeners[group].push([ob, eventName, listenerFunction]);
                }
                        __groupListeners[group].push([ob, eventName, listenerFunction]);
                }
-       }
+       };
        return common;
 }
 
 function _build_removeListener() {
        return common;
 }
 
 function _build_removeListener() {
-       if (browser.isIE55 || browser.isIE6up) {
+       if (!browser.isDOM2Event) {
                var _ie_removeListener = function(ob, eventName, listenerFunction) {
                        eventName = "on" + eventName;
                        ob.detachEvent(eventName, listenerFunction);
                var _ie_removeListener = function(ob, eventName, listenerFunction) {
                        eventName = "on" + eventName;
                        ob.detachEvent(eventName, listenerFunction);
-               }
+               };
                return _ie_removeListener;
        }
                return _ie_removeListener;
        }
-       else if (browser.isDOM2Event) {
+       else {
                var _dom2_removeListener = function(ob, eventName, listenerFunction) {
                        ob.removeEventListener(eventName, listenerFunction, false); // only bubbling events :-(
                var _dom2_removeListener = function(ob, eventName, listenerFunction) {
                        ob.removeEventListener(eventName, listenerFunction, false); // only bubbling events :-(
-               }
+               };
                return _dom2_removeListener;
        }
 }
 
 removeGroupListeners = function(group) {
        var listeners = __groupListeners[group];
                return _dom2_removeListener;
        }
 }
 
 removeGroupListeners = function(group) {
        var listeners = __groupListeners[group];
-       var l;
-       for (var i=0 ; i<listeners.length ; i++){
+       var l, i;
+       for (i=0 ; i<listeners.length ; i++){
                l = listeners[i];
                l = listeners[i];
-               removeListener(l[0], l[1], l[2])
+               removeListener(l[0], l[1], l[2]);
        }
        __groupListeners[group] = null;
                
        }
        __groupListeners[group] = null;
                
-}
+};
 
 function  _build_raiseMouseEvent() {
 
 function  _build_raiseMouseEvent() {
-       if (browser.isIE55 || browser.isIE6up) {
+       if (!browser.isDOM2Event) {
                var _ie_raiseMouseEvent = function(ob, eventName) {
                        ob.fireEvent("on" + eventName);
                var _ie_raiseMouseEvent = function(ob, eventName) {
                        ob.fireEvent("on" + eventName);
-               }
+               };
                return _ie_raiseMouseEvent;
        }
                return _ie_raiseMouseEvent;
        }
-       else if (browser.isDOM2Event) {
+       else {
                var _dom2_raiseMouseEvent = function(ob, eventName) {
                        var event = document.createEvent("MouseEvents");
                        event.initEvent(eventName, true, true);
                        ob.dispatchEvent(event);
                var _dom2_raiseMouseEvent = function(ob, eventName) {
                        var event = document.createEvent("MouseEvents");
                        event.initEvent(eventName, true, true);
                        ob.dispatchEvent(event);
-               }
+               };
                return _dom2_raiseMouseEvent;
        }
 }
 
 function _build_getTargetedObject(){
                return _dom2_raiseMouseEvent;
        }
 }
 
 function _build_getTargetedObject(){
-       if (browser.isIE55 || browser.isIE6up) {
+       if (!browser.isDOM2Event) {
                var _ie_getTargetedObject = function() {
                        return window.event.srcElement;
                var _ie_getTargetedObject = function() {
                        return window.event.srcElement;
-               }
+               };
                return _ie_getTargetedObject;
        }
                return _ie_getTargetedObject;
        }
-       else if (browser.isDOM2Event) {
+       else {
                var _appleWebKit_getTargetedeObject = function(evt) {
                        var target = evt.target;
                        // is it really safe ?...
                var _appleWebKit_getTargetedeObject = function(evt) {
                        var target = evt.target;
                        // is it really safe ?...
-                       return (target.nodeType == 3) ? target.parentNode : target;
-               }
+                       return (target.nodeType === 3) ? target.parentNode : target;
+               };
                var _dom2_getTargetedObject = function(evt) {
                var _dom2_getTargetedObject = function(evt) {
-                       return evt.target
-               }
+                       return evt.target;
+               };
                return (browser.isAppleWebKit) ? _appleWebKit_getTargetedeObject : _dom2_getTargetedObject;
        }
 }
 
 function _build_getEventObject(){
                return (browser.isAppleWebKit) ? _appleWebKit_getTargetedeObject : _dom2_getTargetedObject;
        }
 }
 
 function _build_getEventObject(){
-       if (browser.isIE) {
+       if (!browser.isDOM2Event) {
                var _ie_getEventObject = function() {
                        return window.event;
                var _ie_getEventObject = function() {
                        return window.event;
-               }
+               };
                return _ie_getEventObject;
        }
                return _ie_getEventObject;
        }
-       else if (browser.isDOM2Event) {
+       else {
                var _dom2_getEventObject = function(evt) {
                        return evt;
                var _dom2_getEventObject = function(evt) {
                        return evt;
-               }
+               };
                return _dom2_getEventObject;
        }
 }
 
 
 function _build_disableDefault(){
                return _dom2_getEventObject;
        }
 }
 
 
 function _build_disableDefault(){
-       if (browser.isIE55 || browser.isIE6up) {
+       if (!browser.isDOM2Event) {
                var _ie_disableDefault = function() {
                        window.event.returnValue = false;
                var _ie_disableDefault = function() {
                        window.event.returnValue = false;
-               }
+               };
                return _ie_disableDefault;
        }
                return _ie_disableDefault;
        }
-       else if (browser.isDOM2Event) {
+       else {
                var _dom2_disableDefault = function(evt) {
                        evt.preventDefault();
                var _dom2_disableDefault = function(evt) {
                        evt.preventDefault();
-               }
+               };
                return _dom2_disableDefault;
        }
 }
 
 function _build_disablePropagation() {
                return _dom2_disableDefault;
        }
 }
 
 function _build_disablePropagation() {
-       if (browser.isIE55 || browser.isIE6up) {
+       if (!browser.isDOM2Event) {
                var _ie_disablePropagation = function() {
                        window.event.cancelBubble = true;
                var _ie_disablePropagation = function() {
                        window.event.cancelBubble = true;
-               }
+               };
                return _ie_disablePropagation;
        }
                return _ie_disablePropagation;
        }
-       else if (browser.isDOM2Event) {
+       else {
                var _dom2_disablePropagation = function(evt) {
                        evt.stopPropagation();
                var _dom2_disablePropagation = function(evt) {
                        evt.stopPropagation();
-               }
+               };
                return _dom2_disablePropagation;
        }
 }
 
                return _dom2_disablePropagation;
        }
 }
 
-function _build_getWindowWidth() {
-       if (window.innerWidth != undefined){
+function _build_getWindowWidth() {
+       if (window.innerWidth !== undefined){
                return function(){
                        return window.innerWidth;
                        };
                return function(){
                        return window.innerWidth;
                        };
@@ -193,7 +200,7 @@ function _build_getWindowWidth() {
 }
 
 function _build_getWindowHeight() {
 }
 
 function _build_getWindowHeight() {
-       if (window.innerHeight != undefined) {
+       if (window.innerHeight !== undefined) {
                return function(){
                        return window.innerHeight;
                };
                return function(){
                        return window.innerHeight;
                };
@@ -205,6 +212,32 @@ function _build_getWindowHeight() {
        }
 }
 
        }
 }
 
+function _build_getWindowScrollX() {
+       if (window.scrollX !== undefined) {
+               return function(){
+                       return window.scrollX;
+               };
+       }
+       else {
+               return function(){
+                       return document.documentElement.scrollLeft;
+               };
+       }
+}
+
+function _build_getWindowScrollY() {
+       if (window.scrollY !== undefined) {
+               return function(){
+                       return window.scrollY;
+               };
+       }
+       else {
+               return function(){
+                       return document.documentElement.scrollTop;
+               };
+       }
+}
+
 function _build_clearSelection() {
        if (document.selection) {
                return function() {
 function _build_clearSelection() {
        if (document.selection) {
                return function() {
@@ -214,13 +247,26 @@ function _build_clearSelection() {
        else {
                return function() {
                        window.getSelection().removeAllRanges();
        else {
                return function() {
                        window.getSelection().removeAllRanges();
-               }
+               };
        }
 }
 
        }
 }
 
-
 buildMetaFunctions();
 
 buildMetaFunctions();
 
+addListener(window, 'load', function(evt) {
+       // html5 facade
+       try {
+               if (!document.body.classList) {
+                       var nop = function(){};
+                       var fakeDOMTokenList = {'length':0, 'item':nop, 'contains':nop, 'add':nop, 'remove':nop, 'toggle':nop};
+                       Element.prototype.classList = fakeDOMTokenList;
+               }
+       }
+       catch (e) {}
+});
+
+
+
 var ELEMENT_NODE = 1;
 var TEXT_NODE = 3;
 var _setAttribute;
 var ELEMENT_NODE = 1;
 var TEXT_NODE = 3;
 var _setAttribute;
@@ -233,24 +279,23 @@ getCopyOfNode = function(node) {
        
                        var e = document.createElement(node.nodeName);
 
        
                        var e = document.createElement(node.nodeName);
 
-                       var attribute;
-                       for(var i=0 ; i<attributes.length ; i++) {
+                       var attribute, i;
+                       for(i=0 ; i<attributes.length ; i++) {
                                attribute = attributes[i];
                                _setAttribute(e, attribute.name, attribute.value);
                        }
                        
                                attribute = attributes[i];
                                _setAttribute(e, attribute.name, attribute.value);
                        }
                        
-                       for(var i=0 ; i<childs.length ; i++)
-                               e.appendChild(getCopyOfNode(childs[i]));
+                       for(i=0 ; i<childs.length ; i++) {
+                               e.appendChild(getCopyOfNode(childs[i]));}
                        
                        return e;
                        
                        return e;
-                       break;
+
                case TEXT_NODE:
                        return document.createTextNode(node.nodeValue);
                case TEXT_NODE:
                        return document.createTextNode(node.nodeValue);
-                       break;
        }
        }
-}
+};
 
 
-if (browser.isIE) {
+if (browser.isIE7max) {
        _setAttribute = function(e, name, value) {
                // workarround IE lack of dom implementation.
                switch(name.toLowerCase()) {
        _setAttribute = function(e, name, value) {
                // workarround IE lack of dom implementation.
                switch(name.toLowerCase()) {
@@ -264,36 +309,54 @@ if (browser.isIE) {
                                loadCssText(e, value);
                                break;
                        default:
                                loadCssText(e, value);
                                break;
                        default:
-                               if (name.slice(0,2) == 'on') // event handler
-                                       e[name] = function(){eval(value);};
-                               else
-                                       e.setAttribute(name, value);
+                               if (name.slice(0,2) === 'on') { // event handler
+                                       // A browser normaly eval text code attached to a onXyz attribute. Not IE.
+                                       /*jslint evil: true */
+                                       e[name] = function(){eval(value);};}
+                               else {
+                                       e.setAttribute(name, value);}
                }
        };
        var reCompoundPropName = /^\s*([^\-]+)\-([a-z])([a-z]+)\s*$/;
                }
        };
        var reCompoundPropName = /^\s*([^\-]+)\-([a-z])([a-z]+)\s*$/;
-       function _capitalizeCssPropName(s, g1, g2, g3) { // gN args match above regexp groups 
-               if(g2)
-                       return g1 + g2.toUpperCase() + g3;
-               else
-                       return s;
-       }
+       var _capitalizeCssPropName = function (s) {
+               var g = reCompoundPropName.exec(s);
+               if(g) {
+                       return g[1] + g[2].toUpperCase() + g[3];}
+               else {
+                       return s;}
+       };
 
 
-       function loadCssText(e, cssText) {
+       var loadCssText = function (e, cssText) {
                var pairs = cssText.split(';');
                var pairs = cssText.split(';');
-               var pair, name, value;
+               var pair, name, value, i;
                var style = e.style;
                var style = e.style;
-               for (var i= 0; i < pairs.length; i++) {
+               for (i= 0; i < pairs.length; i++) {
                        pair = pairs[i].split(':');
                        pair = pairs[i].split(':');
-                       if (pair.length != 2)
-                               continue;
-                       name = _capitalizeCssPropName(pair[0]);
-                       value = pair[1];
-                       style[name] = value;
+                       if (pair.length === 2) {
+                               name = _capitalizeCssPropName(pair[0]);
+                               value = pair[1];
+                               style[name] = value;
+                       }
                }
                }
-       }
+       };
 }
 else {
        _setAttribute = function(e, name, value) {e.setAttribute(name, value);};
 }
 
 }
 else {
        _setAttribute = function(e, name, value) {e.setAttribute(name, value);};
 }
 
-})();
+/* 
+* http://www.sitepoint.com/blogs/2006/01/17/javascript-inheritance/
+*/
+
+copyPrototype = function (descendant, parent) { 
+       var sConstructor = parent.toString(); 
+       var aMatch = sConstructor.match( /\s*function (.*)\(/ );
+       if ( aMatch !== null ) { descendant.prototype[aMatch[1]] = parent; }
+       var m;
+       for (m in parent.prototype) {
+               if (parent.prototype.hasOwnProperty(m)) {
+                       descendant.prototype[m] = parent.prototype[m]; }
+       }
+};
+
+}());