mirror of
				https://github.com/flynx/pWiki.git
				synced 2025-11-04 13:00:10 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			210 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			210 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
	
	
/**
 | 
						|
* jQuery.UI.iPad plugin
 | 
						|
* Copyright (c) 2010 Stephen von Takach
 | 
						|
* licensed under MIT.
 | 
						|
* Date: 27/8/2010
 | 
						|
*
 | 
						|
* Project Home: 
 | 
						|
* http://code.google.com/p/jquery-ui-for-ipad-and-iphone/
 | 
						|
*
 | 
						|
* Modified: 19/01/2012 
 | 
						|
* Organized as a proper plugin and added addTouch()
 | 
						|
*/
 | 
						|
 | 
						|
(function (factory) {
 | 
						|
    if (typeof define === 'function' && define.amd) {
 | 
						|
        // AMD. Register as an anonymous module.
 | 
						|
        define(['jquery'], factory);
 | 
						|
    } else if (typeof module === 'object' && module.exports) {
 | 
						|
        // Node/CommonJS
 | 
						|
        module.exports = factory(require('jquery'));
 | 
						|
    } else {
 | 
						|
        // Browser globals
 | 
						|
        factory(jQuery);
 | 
						|
    }
 | 
						|
}(function ($) {
 | 
						|
	
 | 
						|
	var lastTap = null;				// Holds last tapped element (so we can compare for double tap)
 | 
						|
	var tapValid = false;			// Are we still in the .6 second window where a double tap can occur
 | 
						|
	var tapTimeout = null;			// The timeout reference
 | 
						|
	var rightClickPending = false;	// Is a right click still feasible
 | 
						|
	var rightClickEvent = null;		// the original event
 | 
						|
	var holdTimeout = null;			// timeout reference
 | 
						|
	var cancelMouseUp = false;		// prevents a click from occuring as we want the context menu
 | 
						|
 | 
						|
	function cancelTap() {
 | 
						|
		tapValid = false;
 | 
						|
	};
 | 
						|
	
 | 
						|
	function cancelHold() {
 | 
						|
		if (rightClickPending) {
 | 
						|
			window.clearTimeout(holdTimeout);
 | 
						|
			rightClickPending = false;
 | 
						|
			rightClickEvent = null;
 | 
						|
		}
 | 
						|
	};
 | 
						|
 | 
						|
	function startHold(event) {
 | 
						|
		if (rightClickPending)
 | 
						|
			return;
 | 
						|
 | 
						|
		rightClickPending = true; // We could be performing a right click
 | 
						|
		rightClickEvent = (event.changedTouches)[0];
 | 
						|
		holdTimeout = window.setTimeout(doRightClick, 800);
 | 
						|
	};
 | 
						|
 | 
						|
	function doRightClick() {
 | 
						|
		rightClickPending = false;
 | 
						|
 | 
						|
		// We need to mouse up (as we were down)
 | 
						|
		var first = rightClickEvent,
 | 
						|
			simulatedEvent = document.createEvent("MouseEvent");
 | 
						|
		simulatedEvent.initMouseEvent("mouseup", true, true, window, 1, first.screenX, first.screenY, first.clientX, first.clientY,
 | 
						|
				false, false, false, false, 0, null);
 | 
						|
		first.target.dispatchEvent(simulatedEvent);
 | 
						|
 | 
						|
		// Emulate a right click
 | 
						|
		simulatedEvent = document.createEvent("MouseEvent");
 | 
						|
		simulatedEvent.initMouseEvent("mousedown", true, true, window, 1, first.screenX, first.screenY, first.clientX, first.clientY,
 | 
						|
				false, false, false, false, 2, null);
 | 
						|
		first.target.dispatchEvent(simulatedEvent);
 | 
						|
 | 
						|
		// Show a context menu
 | 
						|
		simulatedEvent = document.createEvent("MouseEvent");
 | 
						|
		simulatedEvent.initMouseEvent("contextmenu", true, true, window, 1, first.screenX + 50, first.screenY + 5, first.clientX + 50, first.clientY + 5,
 | 
						|
	                                  false, false, false, false, 2, null);
 | 
						|
		first.target.dispatchEvent(simulatedEvent);
 | 
						|
 | 
						|
		// Note: I don't mouse up the right click here however feel free to add if required
 | 
						|
		cancelMouseUp = true;
 | 
						|
		rightClickEvent = null; // Release memory
 | 
						|
	};
 | 
						|
 | 
						|
	// mouse over event then mouse down
 | 
						|
	function iPadTouchStart(event) {
 | 
						|
		var touches = event.changedTouches,
 | 
						|
			first = touches[0],
 | 
						|
			type = "mouseover",
 | 
						|
			simulatedEvent = document.createEvent("MouseEvent");
 | 
						|
 | 
						|
		// Mouse over first - I have live events attached on mouse over
 | 
						|
		simulatedEvent.initMouseEvent(type, true, true, window, 1, first.screenX, first.screenY, first.clientX, first.clientY,
 | 
						|
	                            false, false, false, false, 0, null);
 | 
						|
		first.target.dispatchEvent(simulatedEvent);
 | 
						|
 | 
						|
		type = "mousedown";
 | 
						|
		simulatedEvent = document.createEvent("MouseEvent");
 | 
						|
 | 
						|
		simulatedEvent.initMouseEvent(type, true, true, window, 1, first.screenX, first.screenY, first.clientX, first.clientY,
 | 
						|
	                            false, false, false, false, 0, null);
 | 
						|
		first.target.dispatchEvent(simulatedEvent);
 | 
						|
 | 
						|
 | 
						|
		if (!tapValid) {
 | 
						|
			lastTap = first.target;
 | 
						|
			tapValid = true;
 | 
						|
			tapTimeout = window.setTimeout(cancelTap, 600);
 | 
						|
			startHold(event);
 | 
						|
		}
 | 
						|
		else {
 | 
						|
			window.clearTimeout(tapTimeout);
 | 
						|
 | 
						|
			// If a double tap is still a possibility and the elements are the same then perform a double click
 | 
						|
			if (first.target == lastTap) {
 | 
						|
				lastTap = null;
 | 
						|
				tapValid = false;
 | 
						|
 | 
						|
				type = "click";
 | 
						|
				simulatedEvent = document.createEvent("MouseEvent");
 | 
						|
 | 
						|
				simulatedEvent.initMouseEvent(type, true, true, window, 1, first.screenX, first.screenY, first.clientX, first.clientY,
 | 
						|
	                         	false, false, false, false, 0/*left*/, null);
 | 
						|
				first.target.dispatchEvent(simulatedEvent);
 | 
						|
 | 
						|
				type = "dblclick";
 | 
						|
				simulatedEvent = document.createEvent("MouseEvent");
 | 
						|
 | 
						|
				simulatedEvent.initMouseEvent(type, true, true, window, 1, first.screenX, first.screenY, first.clientX, first.clientY,
 | 
						|
	                         	false, false, false, false, 0/*left*/, null);
 | 
						|
				first.target.dispatchEvent(simulatedEvent);
 | 
						|
			}
 | 
						|
			else {
 | 
						|
				lastTap = first.target;
 | 
						|
				tapValid = true;
 | 
						|
				tapTimeout = window.setTimeout(cancelTap, 600);
 | 
						|
				startHold(event);
 | 
						|
			}
 | 
						|
		}
 | 
						|
	};
 | 
						|
 | 
						|
	function iPadTouchHandler(event) {
 | 
						|
		var type = "",
 | 
						|
			button = 0; /*left*/
 | 
						|
 | 
						|
		if (event.touches.length > 1)
 | 
						|
			return;
 | 
						|
 | 
						|
		switch (event.type) {
 | 
						|
			case "touchstart":
 | 
						|
				if ($(event.changedTouches[0].target).is("select")) {
 | 
						|
					return;
 | 
						|
				}
 | 
						|
				iPadTouchStart(event); /*We need to trigger two events here to support one touch drag and drop*/
 | 
						|
				event.preventDefault();
 | 
						|
				return false;
 | 
						|
				break;
 | 
						|
 | 
						|
			case "touchmove":
 | 
						|
				cancelHold();
 | 
						|
				type = "mousemove";
 | 
						|
				event.preventDefault();
 | 
						|
				break;
 | 
						|
 | 
						|
			case "touchend":
 | 
						|
				if (cancelMouseUp) {
 | 
						|
					cancelMouseUp = false;
 | 
						|
					event.preventDefault();
 | 
						|
					return false;
 | 
						|
				}
 | 
						|
				cancelHold();
 | 
						|
				type = "mouseup";
 | 
						|
				break;
 | 
						|
 | 
						|
			default:
 | 
						|
				return;
 | 
						|
		}
 | 
						|
 | 
						|
		var touches = event.changedTouches,
 | 
						|
			first = touches[0],
 | 
						|
			simulatedEvent = document.createEvent("MouseEvent");
 | 
						|
 | 
						|
		simulatedEvent.initMouseEvent(type, true, true, window, 1, first.screenX, first.screenY, first.clientX, first.clientY,
 | 
						|
	                            false, false, false, false, button, null);
 | 
						|
 | 
						|
		first.target.dispatchEvent(simulatedEvent);
 | 
						|
 | 
						|
		if (type == "mouseup" && tapValid && first.target == lastTap) {	// This actually emulates the ipads default behaviour (which we prevented)
 | 
						|
			simulatedEvent = document.createEvent("MouseEvent");		// This check avoids click being emulated on a double tap
 | 
						|
 | 
						|
			simulatedEvent.initMouseEvent("click", true, true, window, 1, first.screenX, first.screenY, first.clientX, first.clientY,
 | 
						|
	                            false, false, false, false, button, null);
 | 
						|
 | 
						|
			first.target.dispatchEvent(simulatedEvent);
 | 
						|
		}
 | 
						|
	};
 | 
						|
	
 | 
						|
	var touchAvailable = ("ontouchend" in document);
 | 
						|
 | 
						|
	$.fn.addTouch = function() {
 | 
						|
	    if (touchAvailable) {
 | 
						|
            this.each(function(i,el){
 | 
						|
                el.addEventListener("touchstart", iPadTouchHandler, false);
 | 
						|
                el.addEventListener("touchmove", iPadTouchHandler, false);
 | 
						|
                el.addEventListener("touchend", iPadTouchHandler, false);
 | 
						|
                el.addEventListener("touchcancel", iPadTouchHandler, false);
 | 
						|
            });
 | 
						|
	    }
 | 
						|
	};
 | 
						|
 | 
						|
}));
 |