197 lines
4.4 KiB
JavaScript
197 lines
4.4 KiB
JavaScript
/**
|
|
* 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 );
|