1 /* ----------------------------------
3 * Licensed under The MIT License
4 * http://opensource.org/licenses/MIT
5 * ---------------------------------- */
10 var touchMove = false;
11 var distanceX = false;
14 var findToggle = function (target) {
15 var i, toggles = document.querySelectorAll('.toggle');
16 for (; target && target !== document; target = target.parentNode) {
17 for (i = toggles.length; i--;) { if (toggles[i] === target) return target; }
21 window.addEventListener('touchstart', function (e) {
22 e = e.originalEvent || e;
24 toggle = findToggle(e.target);
28 var handle = toggle.querySelector('.toggle-handle');
29 var toggleWidth = toggle.offsetWidth;
30 var handleWidth = handle.offsetWidth;
31 var offset = toggle.classList.contains('active') ? toggleWidth - handleWidth : 0;
33 start = { pageX : e.touches[0].pageX - offset, pageY : e.touches[0].pageY };
36 // todo: probably should be moved to the css
37 toggle.style['-webkit-transition-duration'] = 0;
40 window.addEventListener('touchmove', function (e) {
41 e = e.originalEvent || e;
43 if (e.touches.length > 1) return; // Exit if a pinch
47 var handle = toggle.querySelector('.toggle-handle');
48 var current = e.touches[0];
49 var toggleWidth = toggle.offsetWidth;
50 var handleWidth = handle.offsetWidth;
51 var offset = toggleWidth - handleWidth;
54 distanceX = current.pageX - start.pageX;
56 if (Math.abs(distanceX) < Math.abs(current.pageY - start.pageY)) return;
60 if (distanceX < 0) return handle.style.webkitTransform = 'translate3d(0,0,0)';
61 if (distanceX > offset) return handle.style.webkitTransform = 'translate3d(' + offset + 'px,0,0)';
63 handle.style.webkitTransform = 'translate3d(' + distanceX + 'px,0,0)';
65 toggle.classList[(distanceX > (toggleWidth/2 - handleWidth/2)) ? 'add' : 'remove']('active');
68 window.addEventListener('touchend', function (e) {
71 var handle = toggle.querySelector('.toggle-handle');
72 var toggleWidth = toggle.offsetWidth;
73 var handleWidth = handle.offsetWidth;
74 var offset = toggleWidth - handleWidth;
75 var slideOn = (!touchMove && !toggle.classList.contains('active')) || (touchMove && (distanceX > (toggleWidth/2 - handleWidth/2)));
77 if (slideOn) handle.style.webkitTransform = 'translate3d(' + offset + 'px,0,0)';
78 else handle.style.webkitTransform = 'translate3d(0,0,0)';
80 toggle.classList[slideOn ? 'add' : 'remove']('active');
82 e = new CustomEvent('toggle', {
83 detail: { isActive: slideOn },
88 toggle.dispatchEvent(e);