X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=BookReader%2Fjquery.ui.ipad.js;h=e2a4739c9aea1e19bc8795b2904f11ae11661251;hb=330bfb3ff7712d6be7b9105d96b6e986c3f99631;hp=6ee5160338a82517552f6e790d87a5212459a89b;hpb=f46f1f50b0e5f87c7ab744f2e6bbf867a2502c59;p=bookreader.git diff --git a/BookReader/jquery.ui.ipad.js b/BookReader/jquery.ui.ipad.js index 6ee5160..e2a4739 100644 --- a/BookReader/jquery.ui.ipad.js +++ b/BookReader/jquery.ui.ipad.js @@ -6,218 +6,434 @@ * * Project Home: * http://code.google.com/p/jquery-ui-for-ipad-and-iphone/ -*/ - - -$(function() { - // - // Extend jQuery feature detection - // - $.extend($.support, { - touch: typeof Touch == "object" - }); - - // - // Hook up touch events - // - if ($.support.touch) { - document.addEventListener("touchstart", iPadTouchHandler, false); - document.addEventListener("touchmove", iPadTouchHandler, false); - document.addEventListener("touchend", iPadTouchHandler, false); - document.addEventListener("touchcancel", iPadTouchHandler, false); - } -}); - - -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 - -function cancelTap() { - tapValid = false; -} - - -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 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); - } -} - - +*/ + + + + + +$(function() { + + // + + // Extend jQuery feature detection + + // + + $.extend($.support, { + + touch: typeof Touch == "object" + + }); + + + + // + + // Hook up touch events + + // + + if ($.support.touch) { + + document.addEventListener("touchstart", iPadTouchHandler, false); + + document.addEventListener("touchmove", iPadTouchHandler, false); + + document.addEventListener("touchend", iPadTouchHandler, false); + + document.addEventListener("touchcancel", iPadTouchHandler, false); + + } + +}); + + + + + +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 + + + +function cancelTap() { + + tapValid = false; + +} + + + + + +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 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; // XXXmang this was preventing swipe from working! make sure rest of code is okay with setting this false + cancelMouseUp = false; +// 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); + + } + +} + + + + +