* preventDefault | Prevents the event to propagate further effectivey
* | dissabling other default actions. Defaults to true
* ------------------------------------------------------------------------
+ * scrollWindow | Scroll the window rather than the element
+ * | Defaults to false
+ * ------------------------------------------------------------------------
*
* usage examples:
*
* would not interfere as acceptPropagatedEvent is set to false.
*
*/
-
+
var append_namespace = function (string_of_events, ns) {
+
+ /* IE doesn't have map
return string_of_events
.split(' ')
.map(function (name) { return name + ns; })
.join(' ');
+ */
+ var pieces = string_of_events.split(' ');
+ var ret = new Array();
+ for (var i = 0; i < pieces.length; i++) {
+ ret.push(pieces[i] + ns);
+ }
+ return ret.join(' ');
};
var left_top = function(event) {
dragcontinue: 'mousemove touchmove',
dragend: 'mouseup mouseleave touchend',
dragMinDistance: 5,
- namespace: '.ds'
+ namespace: '.ds',
+ scrollWindow: false
},options || {});
settings.dragstart = append_namespace(settings.dragstart, settings.namespace);
var dragscroll= {
dragStartHandler : function(event) {
+ // console.log('dragstart');
// mousedown, left click, check propagation
if (event.which > 1 ||
}
},
dragContinueHandler : function(event) { // User is dragging
+ // console.log('drag continue');
var lt = left_top(event);
var delta = {left: (lt.left - event.data.lastCoord.left),
top: (lt.top - event.data.lastCoord.top)};
+ /*
+ console.log(event.data.scrollable);
+ console.log('delta.left - ' + delta.left);
+ console.log('delta.top - ' + delta.top);
+ */
+
+ var scrollTarget = event.data.scrollable;
+ if (event.data.scrollWindow) {
+ scrollTarget = $(window);
+ }
// Set the scroll position relative to what ever the scroll is now
- event.data.scrollable.scrollLeft(
- event.data.scrollable.scrollLeft() - delta.left);
- event.data.scrollable.scrollTop(
- event.data.scrollable.scrollTop() - delta.top);
+ scrollTarget.scrollLeft( scrollTarget.scrollLeft() - delta.left );
+ scrollTarget.scrollTop( scrollTarget.scrollTop() - delta.top );
// Save where the cursor is
event.data.lastCoord = lt;
},
dragEndHandler : function(event) { // Stop scrolling
+ // console.log('drag END');
+
handling_element
.unbind(settings.dragcontinue)
.unbind(settings.dragend);
var delta = {left: Math.abs(event.data.lastCoord.left - event.data.firstCoord.left),
top: Math.abs(event.data.lastCoord.top - event.data.firstCoord.top)};
var distance = Math.max(delta.left, delta.top);
-
+
// Trigger 'tap' if did not meet drag distance
// $$$ does not differentiate single vs multi-touch
if (distance < settings.dragMinDistance) {
- $(event.originalEvent.target).trigger('tap');
+ //$(event.originalEvent.target).trigger('tap');
+ $(event.target).trigger('tap'); // $$$ always the right target?
}
// Allow event to propage if min distance was not achieved
// closure object data for each scrollable element
var data = {scrollable : $(this),
acceptPropagatedEvent : settings.acceptPropagatedEvent,
- preventDefault : settings.preventDefault }
+ preventDefault : settings.preventDefault,
+ scrollWindow : settings.scrollWindow }
// Set mouse initiating event on the desired descendant
$(this).find(settings.dragSelector).
bind(settings.dragstart, data, dragscroll.dragStartHandler);