added jstore path
[bookreader.git] / BookReader / dragscrollable.js
index 24b7977..c48c7cd 100644 (file)
@@ -35,6 +35,9 @@
  *  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) {
@@ -112,7 +124,8 @@ $.fn.dragscrollable = function( options ) {
                        dragcontinue: 'mousemove touchmove',
                        dragend: 'mouseup mouseleave touchend',
                        dragMinDistance: 5,
-                       namespace: '.ds'
+                       namespace: '.ds',
+                       scrollWindow: false
                },options || {});
        
        settings.dragstart = append_namespace(settings.dragstart, settings.namespace);
@@ -121,6 +134,7 @@ $.fn.dragscrollable = function( options ) {
 
        var dragscroll= {
                dragStartHandler : function(event) {
+                   // console.log('dragstart');
                        
                        // mousedown, left click, check propagation
                        if (event.which > 1 ||
@@ -142,6 +156,7 @@ $.fn.dragscrollable = function( options ) {
             }
                },
                dragContinueHandler : function(event) { // User is dragging
+                   // console.log('drag continue');
                        
                        var lt = left_top(event);
                        
@@ -149,11 +164,19 @@ $.fn.dragscrollable = function( options ) {
                        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;
@@ -165,6 +188,8 @@ $.fn.dragscrollable = function( options ) {
 
                },
                dragEndHandler : function(event) { // Stop scrolling
+                   // console.log('drag END');
+               
                        handling_element
                                .unbind(settings.dragcontinue)
                                .unbind(settings.dragend);
@@ -173,11 +198,12 @@ $.fn.dragscrollable = function( options ) {
                        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
@@ -193,7 +219,8 @@ $.fn.dragscrollable = function( options ) {
                // 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);