Team:TU Delft/files/dragscrollable.js
From 2010.igem.org
/*
* jQuery dragscrollable Plugin * version: 1.0 (25-Jun-2009) * Copyright (c) 2009 Miquel Herrera * * Dual licensed under the MIT and GPL licenses: * http://www.opensource.org/licenses/mit-license.php * http://www.gnu.org/licenses/gpl.html * */
- (function($){ // secure $ jQuery alias
/**
* Adds the ability to manage elements scroll by dragging * one or more of its descendant elements. Options parameter * allow to specifically select which inner elements will * respond to the drag events. * * options properties: * ------------------------------------------------------------------------ * dragSelector | jquery selector to apply to each wrapped element * | to find which will be the dragging elements. * | Defaults to '>:first' which is the first child of * | scrollable element * ------------------------------------------------------------------------ * acceptPropagatedEvent| Will the dragging element accept propagated * | events? default is yes, a propagated mouse event * | on a inner element will be accepted and processed. * | If set to false, only events originated on the * | draggable elements will be processed. * ------------------------------------------------------------------------ * preventDefault | Prevents the event to propagate further effectivey * | dissabling other default actions. Defaults to true * ------------------------------------------------------------------------ * * usage examples: * * To add the scroll by drag to the element id=viewport when dragging its * first child accepting any propagated events * $('#viewport').dragscrollable(); * * To add the scroll by drag ability to any element div of class viewport * when dragging its first descendant of class dragMe responding only to * evcents originated on the '.dragMe' elements. * $('div.viewport').dragscrollable({dragSelector:'.dragMe:first', * acceptPropagatedEvent: false}); * * Notice that some 'viewports' could be nested within others but events * would not interfere as acceptPropagatedEvent is set to false. * */
$.fn.dragscrollable = function( options ){
var settings = $.extend( { dragSelector:'>:first', acceptPropagatedEvent: true,
preventDefault: true
},options || {});
var dragscroll= {
mouseDownHandler : function(event) {
// mousedown, left click, check propagation
if (event.which!=1 ||
(!event.data.acceptPropagatedEvent && event.target != this)){
return false;
}
// Initial coordinates will be the last when dragging event.data.lastCoord = {left: event.clientX, top: event.clientY};
$.event.add( document, "mouseup", dragscroll.mouseUpHandler, event.data ); $.event.add( document, "mousemove", dragscroll.mouseMoveHandler, event.data ); if (event.data.preventDefault) {
event.preventDefault(); return false; }
}, mouseMoveHandler : function(event) { // User is dragging // How much did the mouse move? var delta = {left: (event.clientX - event.data.lastCoord.left), top: (event.clientY - event.data.lastCoord.top)};
// 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);
// Save where the cursor is event.data.lastCoord={left: event.clientX, top: event.clientY} if (event.data.preventDefault) {
event.preventDefault(); return false; }
}, mouseUpHandler : function(event) { // Stop scrolling $.event.remove( document, "mousemove", dragscroll.mouseMoveHandler); $.event.remove( document, "mouseup", dragscroll.mouseUpHandler); if (event.data.preventDefault) {
event.preventDefault(); return false; }
} }
// set up the initial events this.each(function() { // closure object data for each scrollable element var data = {scrollable : $(this), acceptPropagatedEvent : settings.acceptPropagatedEvent,
preventDefault : settings.preventDefault }
// Set mouse initiating event on the desired descendant $(this).find(settings.dragSelector). bind('mousedown', data, dragscroll.mouseDownHandler); }); }; //end plugin dragscrollable
})( jQuery ); // confine scope