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