diff options
Diffstat (limited to 'library/jslider/js/draggable-0.1.js')
-rw-r--r-- | library/jslider/js/draggable-0.1.js | 196 |
1 files changed, 196 insertions, 0 deletions
diff --git a/library/jslider/js/draggable-0.1.js b/library/jslider/js/draggable-0.1.js new file mode 100644 index 000000000..dd2688da5 --- /dev/null +++ b/library/jslider/js/draggable-0.1.js @@ -0,0 +1,196 @@ +/** + * draggable - Class allows to make any element draggable + * + * Written by + * Egor Khmelev (hmelyoff@gmail.com) + * + * Licensed under the MIT (MIT-LICENSE.txt). + * + * @author Egor Khmelev + * @version 0.1.0-BETA ($Id$) + * + **/ + +(function( $ ){ + + function Draggable(){ + this._init.apply( this, arguments ); + }; + + Draggable.prototype.oninit = function(){ + + }; + + Draggable.prototype.events = function(){ + + }; + + Draggable.prototype.onmousedown = function(){ + this.ptr.css({ position: "absolute" }); + }; + + Draggable.prototype.onmousemove = function( evt, x, y ){ + this.ptr.css({ left: x, top: y }); + }; + + Draggable.prototype.onmouseup = function(){ + + }; + + Draggable.prototype.isDefault = { + drag: false, + clicked: false, + toclick: true, + mouseup: false + }; + + Draggable.prototype._init = function(){ + if( arguments.length > 0 ){ + this.ptr = $(arguments[0]); + this.outer = $(".draggable-outer"); + + this.is = {}; + $.extend( this.is, this.isDefault ); + + var _offset = this.ptr.offset(); + this.d = { + left: _offset.left, + top: _offset.top, + width: this.ptr.width(), + height: this.ptr.height() + }; + + this.oninit.apply( this, arguments ); + + this._events(); + } + }; + + Draggable.prototype._getPageCoords = function( event ){ + if( event.targetTouches && event.targetTouches[0] ){ + return { x: event.targetTouches[0].pageX, y: event.targetTouches[0].pageY }; + } else + return { x: event.pageX, y: event.pageY }; + }; + + Draggable.prototype._bindEvent = function( ptr, eventType, handler ){ + var self = this; + + if( this.supportTouches_ ) + ptr.get(0).addEventListener( this.events_[ eventType ], handler, false ); + + else + ptr.bind( this.events_[ eventType ], handler ); + }; + + Draggable.prototype._events = function(){ + var self = this; + + this.supportTouches_ = ( $.browser.webkit && navigator.userAgent.indexOf("Mobile") != -1 ); + this.events_ = { + "click": this.supportTouches_ ? "touchstart" : "click", + "down": this.supportTouches_ ? "touchstart" : "mousedown", + "move": this.supportTouches_ ? "touchmove" : "mousemove", + "up" : this.supportTouches_ ? "touchend" : "mouseup" + }; + + this._bindEvent( $( document ), "move", function( event ){ + if( self.is.drag ){ + event.stopPropagation(); + event.preventDefault(); + self._mousemove( event ); + } + }); + this._bindEvent( $( document ), "down", function( event ){ + if( self.is.drag ){ + event.stopPropagation(); + event.preventDefault(); + } + }); + this._bindEvent( $( document ), "up", function( event ){ + self._mouseup( event ); + }); + + this._bindEvent( this.ptr, "down", function( event ){ + self._mousedown( event ); + return false; + }); + this._bindEvent( this.ptr, "up", function( event ){ + self._mouseup( event ); + }); + + this.ptr.find("a") + .click(function(){ + self.is.clicked = true; + + if( !self.is.toclick ){ + self.is.toclick = true; + return false; + } + }) + .mousedown(function( event ){ + self._mousedown( event ); + return false; + }); + + this.events(); + }; + + Draggable.prototype._mousedown = function( evt ){ + this.is.drag = true; + this.is.clicked = false; + this.is.mouseup = false; + + var _offset = this.ptr.offset(); + var coords = this._getPageCoords( evt ); + this.cx = coords.x - _offset.left; + this.cy = coords.y - _offset.top; + + $.extend(this.d, { + left: _offset.left, + top: _offset.top, + width: this.ptr.width(), + height: this.ptr.height() + }); + + if( this.outer && this.outer.get(0) ){ + this.outer.css({ height: Math.max(this.outer.height(), $(document.body).height()), overflow: "hidden" }); + } + + this.onmousedown( evt ); + }; + + Draggable.prototype._mousemove = function( evt ){ + this.is.toclick = false; + var coords = this._getPageCoords( evt ); + this.onmousemove( evt, coords.x - this.cx, coords.y - this.cy ); + }; + + Draggable.prototype._mouseup = function( evt ){ + var oThis = this; + + if( this.is.drag ){ + this.is.drag = false; + + if( this.outer && this.outer.get(0) ){ + + if( $.browser.mozilla ){ + this.outer.css({ overflow: "hidden" }); + } else { + this.outer.css({ overflow: "visible" }); + } + + if( $.browser.msie && $.browser.version == '6.0' ){ + this.outer.css({ height: "100%" }); + } else { + this.outer.css({ height: "auto" }); + } + } + + this.onmouseup( evt ); + } + }; + + window.Draggable = Draggable; + +})( jQuery ); |