{"id":"yvxuji","deleted":false,"future_paste":false,"expired":false,"language":"js","created_at":"2018-07-05 19:50:00","expires_at":null,"content":"var each = (a,c)=> Array.prototype.forEach.call(a, c);\r\nvar node = elem => elem instanceof window.$ ? elem[0] : elem;\r\nvar smrm = elem => getComputedStyle(node(elem)).animationName!==\"none\"?node(elem).addEventListener('animationend',node(elem).remove):node(elem).remove();\r\n\r\nfunction beyond(node) {\r\n    var rect = node.getBoundingClientRect();\r\n    return (\r\n        (rect.x + rect.width) < 0 ||\r\n        (rect.y + rect.height) < 0 ||\r\n        (rect.x > window.innerWidth || rect.y > window.innerHeight)\r\n    );\r\n}\r\n\r\nvar\r\n    popup  = 'popup',\r\n    popupA = 'popupA',\r\n    popupF = 'popupF',\r\n    hilite = 'highlighted'\r\n;\r\n\r\nvar nav = {\r\n    setHighlight: (\/*HTMLElement | JQuery*\/ post, \/*boolean*\/ status) => {\r\n        switch (status) {\r\n            case true:\r\n                node(post).classList.add(hilite);\r\n                break;\r\n            case false:\r\n                node(post).classList.remove(hilite);\r\n                break;\r\n            case undefined:\r\n                node(post).classList.contains(hilite)\r\n                    ? node(post).classList.add(hilite)\r\n                    : node(post).classList.add(hilite)\r\n                ;\r\n                break;\r\n            default:\r\n                break;\r\n        }\r\n    },\r\n\r\n    clonePost: (clonedPost, parent, rm) => {\r\n        switch (rm) {\r\n            case true:\r\n            case undefined:\r\n                clonedPost.attr('id', clonedPost.attr('id')+'_copy');\r\n                clonedPost.addClass(popup);\r\n                clonedPost.addClass(popupA);\r\n\r\n                getComputedStyle(node(clonedPost)).animationName != 'none'\r\n                    ? clonedPost.on( 'animationend', e => e.target.classList.remove(popupA) )\r\n                    : clonedPost.removeClass(popupA)\r\n                ;\r\n\r\n                parent.append(clonedPost);\r\n                break;\r\n\r\n            case false:\r\n                clonedPost.addClass(popupF);\r\n                smrm(clonedPost);\r\n                break;\r\n\r\n            default:\r\n                break;\r\n        }\r\n\r\n        return clonedPost;\r\n\r\n    },\r\n\r\n}\r\n\r\nfunction enableFastNavigation() { \/\/ Highlights and popups\r\n\r\n    function highlightOnLinkEnter(\/*JQuery*\/ post, \/*JQuery*\/ link) {\r\n        nav.setHighlight(post, true);\r\n        link.on('mouseleave', function mouseLeave() {\r\n            nav.setHighlight(post, false);\r\n            link.off('mouseleave', mouseLeave);\r\n        });\r\n    }\r\n\r\n    function popup(\/*JQuery*\/ clonedPost, \/*JQuery*\/ link) {\r\n\r\n        var popupDeletionTimer = null;\r\n        var parentPost = link.parent().parent();\r\n\r\n        \/* Callbacks\r\n        * W: Each one assumes that clonedPost and link are valid JQuery objects.*\/\r\n        const cbs = {\r\n            _initiateCountdown: () => {\r\n                popupDeletionTimer = setTimeout( () => {\r\n                    nav.clonePost(clonedPost, parentPost, false);\r\n                    link.removeAttr('locked');\r\n                }, 1000 );\r\n            },\r\n\r\n            \/* Postlink mouseleave callback. *\/\r\n            linkLeave: function linkLeave(e) {\r\n                cbs._initiateCountdown();\r\n                clonedPost.on('mouseenter', cbs.popupEnter);\r\n\r\n                link.off('mouseleave');\r\n            },\r\n\r\n            \/* Fires when cursor leaves a popup. *\/\r\n            popupLeave: function postLeave() {\r\n                cbs._initiateCountdown();\r\n                clonedPost.on('mouseenter', cbs.popupEnter);\r\n            },\r\n\r\n            \/* Fires if cursor returns onto a popup before postDeletionTimer's time is up.\r\n               Otherwise popup will be removed from document. *\/\r\n            popupEnter: function postEnter() {\r\n                clearTimeout(popupDeletionTimer);\r\n                postDeletionTimer = null;\r\n                clonedPost.off('mouseenter', popupEnter);\r\n            }\r\n\r\n        };\r\n\r\n        if (link.attr('locked')) return;\r\n        link.attr('locked', true);\r\n        nav.clonePost(clonedPost, parentPost);\r\n\r\n        let _l = node(link), _ld = _l.getBoundingClientRect();\r\n        clonedPost\r\n            .css('position', 'absolute')\r\n            .css('left', _l.offsetLeft + 'px')\r\n            .css('top',  _l.offsetTop + _ld.height + 'px')\r\n        ;\r\n\r\n        link.on('mouseleave', cbs.linkLeave);\r\n        clonedPost.on('mouseleave', cbs.popupLeave);\r\n    }\r\n\r\n    function show(e) {\r\n\r\n        let link = $(e.target),\r\n            numb = link.text().substr(2),\r\n            post = $(`#reply${numb}`) || null;\r\n\r\n        if (node(post)) {\r\n            if( beyond(node(post)) ) {\r\n                let _embed = node(post).cloneNode(true);\r\n\r\n                each(_embed.children, item => {\r\n                    if (item.classList.contains(popup)) item.remove();\r\n\r\n                });\r\n\r\n                popup($(_embed), link);\r\n            } else {\r\n                highlightOnLinkEnter(post, link);\r\n            }\r\n        }\r\n    }\r\n\r\n    $(document).on('mouseenter', '.message a[href*=\"res\"]', show);\r\n}\r\n\r\ndocument.addEventListener('DOMContentLoaded', enableFastNavigation);\r\n"}