Вход Регистрация
Файл: contao-3.5.8/assets/mootools/core/1.5.1/mootools-mobile-uncompressed.js
Строк: 293
<?php
// packager build Custom-Event/* Mobile/Browser.Features.Touch Mobile/Swipe
/*
---

name: Element.defineCustomEvent

description: Allows to create custom events based on other custom events.

authors: Christoph Pojer (@cpojer)

license: MIT-style license.

requires: [Core/Element.Event]

provides: Element.defineCustomEvent

...
*/

(function(){

[
Element, Window, Document].invoke('implement', {hasEvent: function(event){
    var 
events = this.retrieve('events'),
        list = (
events && events[event]) ? events[event].values : null;
    if (list){
        var 
i = list.length;
        while (
i--) if (i in list){
            return 
true;
        }
    }
    return 
false;
}});

var 
wrap = function(custom, method, extended){
    
method = custom[method];
    
extended = custom[extended];

    return function(
fn, name){
        if (
extended && !this.hasEvent(name)) extended.call(this, fn, name);
        if (
method) method.call(this, fn, name);
    };
};

var 
inherit = function(custom, base, method){
    return function(
fn, name){
        
base[method].call(this, fn, name);
        
custom[method].call(this, fn, name);
    };
};

var 
events = Element.Events;

Element.defineCustomEvent = function(name, custom){
    var 
base = events[custom.base];

    
custom.onAdd = wrap(custom, 'onAdd', 'onSetup');
    
custom.onRemove = wrap(custom, 'onRemove', 'onTeardown');

    
events[name] = base ? Object.append({}, custom, {

        
base: base.base,

        
condition: function(event, name){
            return (!
base.condition || base.condition.call(this, event, name)) &&
                (!
custom.condition || custom.condition.call(this, event, name));
        },

        
onAdd: inherit(custom, base, 'onAdd'),
        
onRemove: inherit(custom, base, 'onRemove')

    }) : 
custom;

    return 
this;
};

Element.enableCustomEvents = function(){
  
Object.each(events, function(event, name){
    if (
event.onEnable) event.onEnable.call(event, name);
  });
};

Element.disableCustomEvents = function(){
  
Object.each(events, function(event, name){
    if (
event.onDisable) event.onDisable.call(event, name);
  });
};

})();


/*
---

name: Browser.Features.Touch

description: Checks whether the used Browser has touch events

authors: Christoph Pojer (@cpojer)

license: MIT-style license.

requires: [Core/Browser]

provides: Browser.Features.Touch

...
*/

Browser.Features.Touch = (function(){
    try {
        
document.createEvent('TouchEvent').initTouchEvent('touchstart');
        return 
true;
    } catch (
exception){}
    
    return 
false;
})();

// Android doesn't have a touch delay and dispatchEvent does not fire the handler
Browser.Features.iOSTouch = (function(){
    var 
name = 'cantouch', // Name does not matter
        
html = document.html,
        
hasTouch = false;

    if (!
html.addEventListener) return false;

    var 
handler = function(){
        
html.removeEventListener(name, handler, true);
        
hasTouch = true;
    };

    try {
        
html.addEventListener(name, handler, true);
        var 
event = document.createEvent('TouchEvent');
        
event.initTouchEvent(name);
        
html.dispatchEvent(event);
        return 
hasTouch;
    } catch (
exception){}

    
handler(); // Remove listener
    
return false;
})();


/*
---

name: Swipe

description: Provides a custom swipe event for touch devices

authors: Christopher Beloch (@C_BHole), Christoph Pojer (@cpojer), Ian Collins (@3n)

license: MIT-style license.

requires: [Core/Element.Event, Custom-Event/Element.defineCustomEvent, Browser.Features.Touch]

provides: Swipe

...
*/

(function(){

var 
name = 'swipe',
    
distanceKey = name + ':distance',
    
cancelKey = name + ':cancelVertical',
    
dflt = 50;

var 
start = {}, disabled, active;

var 
clean = function(){
    
active = false;
};

var 
events = {

    
touchstart: function(event){
        if (
event.touches.length > 1) return;

        var 
touch = event.touches[0];
        
active = true;
        
start = {x: touch.pageX, y: touch.pageY};
    },
    
    
touchmove: function(event){
        if (
disabled || !active) return;
        
        var 
touch = event.changedTouches[0],
            
end = {x: touch.pageX, y: touch.pageY};
        if (
this.retrieve(cancelKey) && Math.abs(start.y - end.y) > 10){
            
active = false;
            return;
        }
        
        var 
distance = this.retrieve(distanceKey, dflt),
            
delta = end.x - start.x,
            
isLeftSwipe = delta < -distance,
            
isRightSwipe = delta > distance;

        if (!
isRightSwipe && !isLeftSwipe)
            return;
        
        
event.preventDefault();
        
active = false;
        
event.direction = (isLeftSwipe ? 'left' : 'right');
        
event.start = start;
        
event.end = end;
        
        
this.fireEvent(name, event);
    },

    
touchend: clean,
    
touchcancel: clean

};

Element.defineCustomEvent(name, {

    
onSetup: function(){
        
this.addEvents(events);
    },

    
onTeardown: function(){
        
this.removeEvents(events);
    },

    
onEnable: function(){
        
disabled = false;
    },

    
onDisable: function(){
        
disabled = true;
        
clean();
    }

});

})();
?>
Онлайн: 2
Реклама