{"version":3,"sources":["jsdelivr-header.js","/gh/fatlinesofcode/ngDraggable@0.1.11/ngDraggable.js"],"names":[],"mappings":"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","file":"/gh/fatlinesofcode/ngDraggable@0.1.11/ngDraggable.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /gh/fatlinesofcode/ngDraggable@0.1.11/ngDraggable.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","/*\n *\n * https://github.com/fatlinesofcode/ngDraggable\n */\nangular.module(\"ngDraggable\", [])\n    .service('ngDraggable', [function() {\n\n\n        var scope = this;\n        scope.inputEvent = function(event) {\n            if (angular.isDefined(event.touches)) {\n                return event.touches[0];\n            }\n            //Checking both is not redundent. If only check if touches isDefined, angularjs isDefnied will return error and stop the remaining scripty if event.originalEvent is not defined.\n            else if (angular.isDefined(event.originalEvent) && angular.isDefined(event.originalEvent.touches)) {\n                return event.originalEvent.touches[0];\n            }\n            return event;\n        };\n\n        scope.touchTimeout = 100;\n\n    }])\n    .directive('ngDrag', ['$rootScope', '$parse', '$document', '$window', 'ngDraggable', function ($rootScope, $parse, $document, $window, ngDraggable) {\n        return {\n            restrict: 'A',\n            link: function (scope, element, attrs) {\n                scope.value = attrs.ngDrag;\n                var offset,_centerAnchor=false,_mx,_my,_tx,_ty,_mrx,_mry;\n                var _hasTouch = ('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch;\n                var _pressEvents = 'touchstart mousedown';\n                var _moveEvents = 'touchmove mousemove';\n                var _releaseEvents = 'touchend mouseup';\n                var _dragHandle;\n\n                // to identify the element in order to prevent getting superflous events when a single element has both drag and drop directives on it.\n                var _myid = scope.$id;\n                var _data = null;\n\n                var _dragOffset = null;\n\n                var _dragEnabled = false;\n\n                var _pressTimer = null;\n\n                var onDragStartCallback = $parse(attrs.ngDragStart) || null;\n                var onDragStopCallback = $parse(attrs.ngDragStop) || null;\n                var onDragSuccessCallback = $parse(attrs.ngDragSuccess) || null;\n                var allowTransform = angular.isDefined(attrs.allowTransform) ? scope.$eval(attrs.allowTransform) : true;\n\n                var getDragData = $parse(attrs.ngDragData);\n\n                // deregistration function for mouse move events in $rootScope triggered by jqLite trigger handler\n                var _deregisterRootMoveListener = angular.noop;\n\n                var initialize = function () {\n                    element.attr('draggable', 'false'); // prevent native drag\n                    // check to see if drag handle(s) was specified\n                    // if querySelectorAll is available, we use this instead of find\n                    // as JQLite find is limited to tagnames\n                    if (element[0].querySelectorAll) {\n                        var dragHandles = angular.element(element[0].querySelectorAll('[ng-drag-handle]'));\n                    } else {\n                        var dragHandles = element.find('[ng-drag-handle]');\n                    }\n                    if (dragHandles.length) {\n                        _dragHandle = dragHandles;\n                    }\n                    toggleListeners(true);\n                };\n\n                var toggleListeners = function (enable) {\n                    if (!enable)return;\n                    // add listeners.\n\n                    scope.$on('$destroy', onDestroy);\n                    scope.$watch(attrs.ngDrag, onEnableChange);\n                    scope.$watch(attrs.ngCenterAnchor, onCenterAnchor);\n                    // wire up touch events\n                    if (_dragHandle) {\n                        // handle(s) specified, use those to initiate drag\n                        _dragHandle.on(_pressEvents, onpress);\n                    } else {\n                        // no handle(s) specified, use the element as the handle\n                        element.on(_pressEvents, onpress);\n                    }\n                    // if(! _hasTouch && element[0].nodeName.toLowerCase() == \"img\"){\n                    if( element[0].nodeName.toLowerCase() == \"img\"){\n                        element.on('mousedown', function(){ return false;}); // prevent native drag for images\n                    }\n                };\n                var onDestroy = function (enable) {\n                    toggleListeners(false);\n                };\n                var onEnableChange = function (newVal, oldVal) {\n                    _dragEnabled = (newVal);\n                };\n                var onCenterAnchor = function (newVal, oldVal) {\n                    if(angular.isDefined(newVal))\n                        _centerAnchor = (newVal || 'true');\n                };\n\n                var isClickableElement = function (evt) {\n                    return (\n                        angular.isDefined(angular.element(evt.target).attr(\"ng-cancel-drag\"))\n                    );\n                };\n                /*\n                 * When the element is clicked start the drag behaviour\n                 * On touch devices as a small delay so as not to prevent native window scrolling\n                 */\n                var onpress = function(evt) {\n                    // console.log(\"110\"+\" onpress: \"+Math.random()+\" \"+ evt.type);\n                    if(! _dragEnabled)return;\n\n                    if (isClickableElement(evt)) {\n                        return;\n                    }\n\n                    if (evt.type == \"mousedown\" && evt.button != 0) {\n                        // Do not start dragging on right-click\n                        return;\n                    }\n\n                    var useTouch = evt.type === 'touchstart' ? true : false;\n\n\n                    if(useTouch){\n                        cancelPress();\n                        _pressTimer = setTimeout(function(){\n                            cancelPress();\n                            onlongpress(evt);\n                        },ngDraggable.touchTimeout);\n                        $document.on(_moveEvents, cancelPress);\n                        $document.on(_releaseEvents, cancelPress);\n                    }else{\n                        onlongpress(evt);\n                    }\n\n                };\n\n                var cancelPress = function() {\n                    clearTimeout(_pressTimer);\n                    $document.off(_moveEvents, cancelPress);\n                    $document.off(_releaseEvents, cancelPress);\n                };\n\n                var onlongpress = function(evt) {\n                    if(! _dragEnabled)return;\n                    evt.preventDefault();\n\n                    offset = element[0].getBoundingClientRect();\n                    if(allowTransform)\n                        _dragOffset = offset;\n                    else{\n                        _dragOffset = {left:document.body.scrollLeft, top:document.body.scrollTop};\n                    }\n\n\n                    element.centerX = element[0].offsetWidth / 2;\n                    element.centerY = element[0].offsetHeight / 2;\n\n                    _mx = ngDraggable.inputEvent(evt).pageX;//ngDraggable.getEventProp(evt, 'pageX');\n                    _my = ngDraggable.inputEvent(evt).pageY;//ngDraggable.getEventProp(evt, 'pageY');\n                    _mrx = _mx - offset.left;\n                    _mry = _my - offset.top;\n                    if (_centerAnchor) {\n                        _tx = _mx - element.centerX - $window.pageXOffset;\n                        _ty = _my - element.centerY - $window.pageYOffset;\n                    } else {\n                        _tx = _mx - _mrx - $window.pageXOffset;\n                        _ty = _my - _mry - $window.pageYOffset;\n                    }\n\n                    $document.on(_moveEvents, onmove);\n                    $document.on(_releaseEvents, onrelease);\n                    // This event is used to receive manually triggered mouse move events\n                    // jqLite unfortunately only supports triggerHandler(...)\n                    // See http://api.jquery.com/triggerHandler/\n                    // _deregisterRootMoveListener = $rootScope.$on('draggable:_triggerHandlerMove', onmove);\n                    _deregisterRootMoveListener = $rootScope.$on('draggable:_triggerHandlerMove', function(event, origEvent) {\n                        onmove(origEvent);\n                    });\n                };\n\n                var onmove = function (evt) {\n                    if (!_dragEnabled)return;\n                    evt.preventDefault();\n\n                    if (!element.hasClass('dragging')) {\n                        _data = getDragData(scope);\n                        element.addClass('dragging');\n                        $rootScope.$broadcast('draggable:start', {x:_mx, y:_my, tx:_tx, ty:_ty, event:evt, element:element, data:_data});\n\n                        if (onDragStartCallback ){\n                            scope.$apply(function () {\n                                onDragStartCallback(scope, {$data: _data, $event: evt});\n                            });\n                        }\n                    }\n\n                    _mx = ngDraggable.inputEvent(evt).pageX;//ngDraggable.getEventProp(evt, 'pageX');\n                    _my = ngDraggable.inputEvent(evt).pageY;//ngDraggable.getEventProp(evt, 'pageY');\n\n                    if (_centerAnchor) {\n                        _tx = _mx - element.centerX - _dragOffset.left;\n                        _ty = _my - element.centerY - _dragOffset.top;\n                    } else {\n                        _tx = _mx - _mrx - _dragOffset.left;\n                        _ty = _my - _mry - _dragOffset.top;\n                    }\n\n                    moveElement(_tx, _ty);\n\n                    $rootScope.$broadcast('draggable:move', { x: _mx, y: _my, tx: _tx, ty: _ty, event: evt, element: element, data: _data, uid: _myid, dragOffset: _dragOffset });\n                };\n\n                var onrelease = function(evt) {\n                    if (!_dragEnabled)\n                        return;\n                    evt.preventDefault();\n                    $rootScope.$broadcast('draggable:end', {x:_mx, y:_my, tx:_tx, ty:_ty, event:evt, element:element, data:_data, callback:onDragComplete, uid: _myid});\n                    element.removeClass('dragging');\n                    element.parent().find('.drag-enter').removeClass('drag-enter');\n                    reset();\n                    $document.off(_moveEvents, onmove);\n                    $document.off(_releaseEvents, onrelease);\n\n                    if (onDragStopCallback ){\n                        scope.$apply(function () {\n                            onDragStopCallback(scope, {$data: _data, $event: evt});\n                        });\n                    }\n\n                    _deregisterRootMoveListener();\n                };\n\n                var onDragComplete = function(evt) {\n\n\n                    if (!onDragSuccessCallback )return;\n\n                    scope.$apply(function () {\n                        onDragSuccessCallback(scope, {$data: _data, $event: evt});\n                    });\n                };\n\n                var reset = function() {\n                    if(allowTransform)\n                        element.css({transform:'', 'z-index':'', '-webkit-transform':'', '-ms-transform':''});\n                    else\n                        element.css({'position':'',top:'',left:''});\n                };\n\n                var moveElement = function (x, y) {\n                    if(allowTransform) {\n                        element.css({\n                            transform: 'matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, ' + x + ', ' + y + ', 0, 1)',\n                            'z-index': 99999,\n                            '-webkit-transform': 'matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, ' + x + ', ' + y + ', 0, 1)',\n                            '-ms-transform': 'matrix(1, 0, 0, 1, ' + x + ', ' + y + ')'\n                        });\n                    }else{\n                        element.css({'left':x+'px','top':y+'px', 'position':'fixed'});\n                    }\n                };\n                initialize();\n            }\n        };\n    }])\n\n    .directive('ngDrop', ['$parse', '$timeout', '$window', '$document', 'ngDraggable', function ($parse, $timeout, $window, $document, ngDraggable) {\n        return {\n            restrict: 'A',\n            link: function (scope, element, attrs) {\n                scope.value = attrs.ngDrop;\n                scope.isTouching = false;\n\n                var _lastDropTouch=null;\n\n                var _myid = scope.$id;\n\n                var _dropEnabled=false;\n\n                var onDropCallback = $parse(attrs.ngDropSuccess);// || function(){};\n\n                var onDragStartCallback = $parse(attrs.ngDragStart);\n                var onDragStopCallback = $parse(attrs.ngDragStop);\n                var onDragMoveCallback = $parse(attrs.ngDragMove);\n\n                var initialize = function () {\n                    toggleListeners(true);\n                };\n\n                var toggleListeners = function (enable) {\n                    // remove listeners\n\n                    if (!enable)return;\n                    // add listeners.\n                    scope.$watch(attrs.ngDrop, onEnableChange);\n                    scope.$on('$destroy', onDestroy);\n                    scope.$on('draggable:start', onDragStart);\n                    scope.$on('draggable:move', onDragMove);\n                    scope.$on('draggable:end', onDragEnd);\n                };\n\n                var onDestroy = function (enable) {\n                    toggleListeners(false);\n                };\n                var onEnableChange = function (newVal, oldVal) {\n                    _dropEnabled=newVal;\n                };\n                var onDragStart = function(evt, obj) {\n                    if(! _dropEnabled)return;\n                    isTouching(obj.x,obj.y,obj.element);\n\n                    if (attrs.ngDragStart) {\n                        $timeout(function(){\n                            onDragStartCallback(scope, {$data: obj.data, $event: obj});\n                        });\n                    }\n                };\n                var onDragMove = function(evt, obj) {\n                    if(! _dropEnabled)return;\n                    isTouching(obj.x,obj.y,obj.element);\n\n                    if (attrs.ngDragMove) {\n                        $timeout(function(){\n                            onDragMoveCallback(scope, {$data: obj.data, $event: obj});\n                        });\n                    }\n                };\n\n                var onDragEnd = function (evt, obj) {\n\n                    // don't listen to drop events if this is the element being dragged\n                    // only update the styles and return\n                    if (!_dropEnabled || _myid === obj.uid) {\n                        updateDragStyles(false, obj.element);\n                        return;\n                    }\n                    if (isTouching(obj.x, obj.y, obj.element)) {\n                        // call the ngDraggable ngDragSuccess element callback\n                        if(obj.callback){\n                            obj.callback(obj);\n                        }\n\n                        if (attrs.ngDropSuccess) {\n                            $timeout(function(){\n                                onDropCallback(scope, {$data: obj.data, $event: obj, $target: scope.$eval(scope.value)});\n                            });\n                        }\n                    }\n\n                    if (attrs.ngDragStop) {\n                        $timeout(function(){\n                            onDragStopCallback(scope, {$data: obj.data, $event: obj});\n                        });\n                    }\n\n                    updateDragStyles(false, obj.element);\n                };\n\n                var isTouching = function(mouseX, mouseY, dragElement) {\n                    var touching= hitTest(mouseX, mouseY);\n                    scope.isTouching = touching;\n                    if(touching){\n                        _lastDropTouch = element;\n                    }\n                    updateDragStyles(touching, dragElement);\n                    return touching;\n                };\n\n                var updateDragStyles = function(touching, dragElement) {\n                    if(touching){\n                        element.addClass('drag-enter');\n                        dragElement.addClass('drag-over');\n                    }else if(_lastDropTouch == element){\n                        _lastDropTouch=null;\n                        element.removeClass('drag-enter');\n                        dragElement.removeClass('drag-over');\n                    }\n                };\n\n                var hitTest = function(x, y) {\n                    var bounds = element[0].getBoundingClientRect();// ngDraggable.getPrivOffset(element);\n                    x -= $document[0].body.scrollLeft + $document[0].documentElement.scrollLeft;\n                    y -= $document[0].body.scrollTop + $document[0].documentElement.scrollTop;\n                    return  x >= bounds.left\n                        && x <= bounds.right\n                        && y <= bounds.bottom\n                        && y >= bounds.top;\n                };\n\n                initialize();\n            }\n        };\n    }])\n    .directive('ngDragClone', ['$parse', '$timeout', 'ngDraggable', function ($parse, $timeout, ngDraggable) {\n        return {\n            restrict: 'A',\n            link: function (scope, element, attrs) {\n                var img, _allowClone=true;\n                var _dragOffset = null;\n                scope.clonedData = {};\n                var initialize = function () {\n\n                    img = element.find('img');\n                    element.attr('draggable', 'false');\n                    img.attr('draggable', 'false');\n                    reset();\n                    toggleListeners(true);\n                };\n\n\n                var toggleListeners = function (enable) {\n                    // remove listeners\n\n                    if (!enable)return;\n                    // add listeners.\n                    scope.$on('draggable:start', onDragStart);\n                    scope.$on('draggable:move', onDragMove);\n                    scope.$on('draggable:end', onDragEnd);\n                    preventContextMenu();\n\n                };\n                var preventContextMenu = function() {\n                    //  element.off('mousedown touchstart touchmove touchend touchcancel', absorbEvent_);\n                    img.off('mousedown touchstart touchmove touchend touchcancel', absorbEvent_);\n                    //  element.on('mousedown touchstart touchmove touchend touchcancel', absorbEvent_);\n                    img.on('mousedown touchstart touchmove touchend touchcancel', absorbEvent_);\n                };\n                var onDragStart = function(evt, obj, elm) {\n                    _allowClone=true;\n                    if(angular.isDefined(obj.data.allowClone)){\n                        _allowClone=obj.data.allowClone;\n                    }\n                    if(_allowClone) {\n                        scope.$apply(function () {\n                            scope.clonedData = obj.data;\n                        });\n                        element.css('width', obj.element[0].offsetWidth);\n                        element.css('height', obj.element[0].offsetHeight);\n\n                        moveElement(obj.tx, obj.ty);\n                    }\n\n                };\n                var onDragMove = function(evt, obj) {\n                    if(_allowClone) {\n\n                        _tx = obj.tx + obj.dragOffset.left;\n                        _ty = obj.ty + obj.dragOffset.top;\n\n                        moveElement(_tx, _ty);\n                    }\n                };\n                var onDragEnd = function(evt, obj) {\n                    //moveElement(obj.tx,obj.ty);\n                    if(_allowClone) {\n                        reset();\n                    }\n                };\n\n                var reset = function() {\n                    element.css({left:0,top:0, position:'fixed', 'z-index':-1, visibility:'hidden'});\n                };\n                var moveElement = function(x,y) {\n                    element.css({\n                        transform: 'matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, '+x+', '+y+', 0, 1)', 'z-index': 99999, 'visibility': 'visible',\n                        '-webkit-transform': 'matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, '+x+', '+y+', 0, 1)',\n                        '-ms-transform': 'matrix(1, 0, 0, 1, '+x+', '+y+')'\n                        //,margin: '0'  don't monkey with the margin,\n                    });\n                };\n\n                var absorbEvent_ = function (event) {\n                    var e = event;//.originalEvent;\n                    e.preventDefault && e.preventDefault();\n                    e.stopPropagation && e.stopPropagation();\n                    e.cancelBubble = true;\n                    e.returnValue = false;\n                    return false;\n                };\n\n                initialize();\n            }\n        };\n    }])\n    .directive('ngPreventDrag', ['$parse', '$timeout', function ($parse, $timeout) {\n        return {\n            restrict: 'A',\n            link: function (scope, element, attrs) {\n                var initialize = function () {\n\n                    element.attr('draggable', 'false');\n                    toggleListeners(true);\n                };\n\n\n                var toggleListeners = function (enable) {\n                    // remove listeners\n\n                    if (!enable)return;\n                    // add listeners.\n                    element.on('mousedown touchstart touchmove touchend touchcancel', absorbEvent_);\n                };\n\n\n                var absorbEvent_ = function (event) {\n                    var e = event.originalEvent;\n                    e.preventDefault && e.preventDefault();\n                    e.stopPropagation && e.stopPropagation();\n                    e.cancelBubble = true;\n                    e.returnValue = false;\n                    return false;\n                };\n\n                initialize();\n            }\n        };\n    }])\n    .directive('ngCancelDrag', [function () {\n        return {\n            restrict: 'A',\n            link: function (scope, element, attrs) {\n                element.find('*').attr('ng-cancel-drag', 'ng-cancel-drag');\n            }\n        };\n    }])\n    .directive('ngDragScroll', ['$window', '$interval', '$timeout', '$document', '$rootScope', function($window, $interval, $timeout, $document, $rootScope) {\n        return {\n            restrict: 'A',\n            link: function(scope, element, attrs) {\n                var intervalPromise = null;\n                var lastMouseEvent = null;\n\n                var config = {\n                    verticalScroll: attrs.verticalScroll || true,\n                    horizontalScroll: attrs.horizontalScroll || true,\n                    activationDistance: attrs.activationDistance || 75,\n                    scrollDistance: attrs.scrollDistance || 15\n                };\n\n\n                var reqAnimFrame = (function() {\n                    return window.requestAnimationFrame ||\n                        window.webkitRequestAnimationFrame ||\n                        window.mozRequestAnimationFrame ||\n                        window.oRequestAnimationFrame ||\n                        window.msRequestAnimationFrame ||\n                        function( /* function FrameRequestCallback */ callback, /* DOMElement Element */ element ) {\n                            window.setTimeout(callback, 1000 / 60);\n                        };\n                })();\n\n                var animationIsOn = false;\n                var createInterval = function() {\n                    animationIsOn = true;\n\n                    function nextFrame(callback) {\n                        var args = Array.prototype.slice.call(arguments);\n                        if(animationIsOn) {\n                            reqAnimFrame(function () {\n                                $rootScope.$apply(function () {\n                                    callback.apply(null, args);\n                                    nextFrame(callback);\n                                });\n                            })\n                        }\n                    }\n\n                    nextFrame(function() {\n                        if (!lastMouseEvent) return;\n\n                        var viewportWidth = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);\n                        var viewportHeight = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);\n\n                        var scrollX = 0;\n                        var scrollY = 0;\n\n                        if (config.horizontalScroll) {\n                            // If horizontal scrolling is active.\n                            if (lastMouseEvent.clientX < config.activationDistance) {\n                                // If the mouse is on the left of the viewport within the activation distance.\n                                scrollX = -config.scrollDistance;\n                            }\n                            else if (lastMouseEvent.clientX > viewportWidth - config.activationDistance) {\n                                // If the mouse is on the right of the viewport within the activation distance.\n                                scrollX = config.scrollDistance;\n                            }\n                        }\n\n                        if (config.verticalScroll) {\n                            // If vertical scrolling is active.\n                            if (lastMouseEvent.clientY < config.activationDistance) {\n                                // If the mouse is on the top of the viewport within the activation distance.\n                                scrollY = -config.scrollDistance;\n                            }\n                            else if (lastMouseEvent.clientY > viewportHeight - config.activationDistance) {\n                                // If the mouse is on the bottom of the viewport within the activation distance.\n                                scrollY = config.scrollDistance;\n                            }\n                        }\n\n\n\n                        if (scrollX !== 0 || scrollY !== 0) {\n                            // Record the current scroll position.\n                            var currentScrollLeft = ($window.pageXOffset || $document[0].documentElement.scrollLeft);\n                            var currentScrollTop = ($window.pageYOffset || $document[0].documentElement.scrollTop);\n\n                            // Remove the transformation from the element, scroll the window by the scroll distance\n                            // record how far we scrolled, then reapply the element transformation.\n                            var elementTransform = element.css('transform');\n                            element.css('transform', 'initial');\n\n                            $window.scrollBy(scrollX, scrollY);\n\n                            var horizontalScrollAmount = ($window.pageXOffset || $document[0].documentElement.scrollLeft) - currentScrollLeft;\n                            var verticalScrollAmount =  ($window.pageYOffset || $document[0].documentElement.scrollTop) - currentScrollTop;\n\n                            element.css('transform', elementTransform);\n\n                            lastMouseEvent.pageX += horizontalScrollAmount;\n                            lastMouseEvent.pageY += verticalScrollAmount;\n\n                            $rootScope.$emit('draggable:_triggerHandlerMove', lastMouseEvent);\n                        }\n\n                    });\n                };\n\n                var clearInterval = function() {\n                    animationIsOn = false;\n                };\n\n                scope.$on('draggable:start', function(event, obj) {\n                    // Ignore this event if it's not for this element.\n                    if (obj.element[0] !== element[0]) return;\n\n                    if (!animationIsOn) createInterval();\n                });\n\n                scope.$on('draggable:end', function(event, obj) {\n                    // Ignore this event if it's not for this element.\n                    if (obj.element[0] !== element[0]) return;\n\n                    if (animationIsOn) clearInterval();\n                });\n\n                scope.$on('draggable:move', function(event, obj) {\n                    // Ignore this event if it's not for this element.\n                    if (obj.element[0] !== element[0]) return;\n\n                    lastMouseEvent = obj.event;\n                });\n            }\n        };\n    }]);\n"]}