(function($) {
	var methods = {
		init: function(offset, duration, callback) {
			return this.each(function() {
				var target = $(this);
				var newOffset = {};
				var oldOffset = target.data('offset');
				
				if (typeof oldOffset == 'undefined') {
					oldOffset = {};
				}
				
				if ((typeof oldOffset.x != 'undefined') || (typeof offset.x != 'undefined')) {
					var oldOffsetX = typeof oldOffset.x == 'undefined'? 0: oldOffset.x;
					var offsetX = typeof offset.x == 'undefined'? 0: offset.x;
					newOffset.x = oldOffsetX + offsetX;
				}
				
				if ((typeof oldOffset.y != 'undefined') || (typeof offset.y != 'undefined')) {
					var oldOffsetY = typeof oldOffset.y == 'undefined'? 0: oldOffset.y;
					var offsetY = typeof offset.y == 'undefined'? 0: offset.y;
					newOffset.y = oldOffsetY + offsetY;
				}
				
				target.translate(newOffset, duration, callback);
				target.data('offset', newOffset);
			});
		}
	}
	
	$.fn.move = function(method) {
		if (methods[method]) {
			return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
		} else if (typeof method === 'object' || !method) {
			return methods.init.apply(this, arguments);
		} else {
			$.error('Method ' +  method + ' does not exist on jQuery.move');
		}
		return false;
	}
})(jQuery);
