refpopup.js
134 lines
| 3.7 KiB
| application/javascript
|
JavascriptLexer
neko259
|
r1474 | var LOADING_MSG = "<div class=\"post\">" + gettext('Loading...') + "</div>"; | ||
neko259
|
r1476 | var CLS_PREVIEW = 'post_preview'; | ||
neko259
|
r352 | function $X(path, root) { | ||
return document.evaluate(path, root || document, null, 6, null); | ||||
} | ||||
function $x(path, root) { | ||||
return document.evaluate(path, root || document, null, 8, null).singleNodeValue; | ||||
} | ||||
function $del(el) { | ||||
if(el) el.parentNode.removeChild(el); | ||||
} | ||||
function $each(list, fn) { | ||||
if(!list) return; | ||||
var i = list.snapshotLength; | ||||
if(i > 0) while(i--) fn(list.snapshotItem(i), i); | ||||
} | ||||
neko259
|
r1035 | function mkPreview(cln, html) { | ||
cln.innerHTML = html; | ||||
neko259
|
r1432 | addScriptsToPost($(cln)); | ||
neko259
|
r1405 | } | ||
neko259
|
r1035 | |||
function isElementInViewport (el) { | ||||
//special bonus for those using jQuery | ||||
if (typeof jQuery === "function" && el instanceof jQuery) { | ||||
el = el[0]; | ||||
} | ||||
var rect = el.getBoundingClientRect(); | ||||
return ( | ||||
rect.top >= 0 && | ||||
rect.left >= 0 && | ||||
rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && /*or $(window).height() */ | ||||
rect.right <= (window.innerWidth || document.documentElement.clientWidth) /*or $(window).width() */ | ||||
); | ||||
} | ||||
neko259
|
r352 | function addRefLinkPreview(node) { | ||
$each($X('.//a[starts-with(text(),">>")]', node || document), function(link) { | ||||
link.addEventListener('mouseover', showPostPreview, false); | ||||
link.addEventListener('mouseout', delPostPreview, false); | ||||
}); | ||||
} | ||||
function showPostPreview(e) { | ||||
var doc = document; | ||||
neko259
|
r1456 | |||
var reflink = $(this); | ||||
var pNum = reflink.text().match(/\d+/); | ||||
neko259
|
r352 | |||
neko259
|
r376 | if (pNum == null || pNum.length == 0) { | ||
neko259
|
r361 | return; | ||
neko259
|
r355 | } | ||
neko259
|
r1035 | var post = $('#' + pNum); | ||
if (post.length > 0 && isElementInViewport(post)) { | ||||
neko259
|
r1474 | // If post is on the same page and visible, just highlight it | ||
neko259
|
r1035 | post.addClass('highlight'); | ||
} else { | ||||
neko259
|
r1456 | var x = reflink.offset().left; | ||
var y = reflink.offset().top; | ||||
neko259
|
r352 | |||
neko259
|
r1035 | var cln = doc.createElement('div'); | ||
cln.id = 'pstprev_' + pNum; | ||||
neko259
|
r1476 | cln.className = CLS_PREVIEW; | ||
neko259
|
r352 | |||
neko259
|
r1457 | cln.style.cssText = 'left:' + x + 'px; top:' + y + 'px'; | ||
neko259
|
r352 | |||
neko259
|
r1035 | cln.addEventListener('mouseout', delPostPreview, false); | ||
neko259
|
r352 | |||
neko259
|
r1474 | cln.innerHTML = LOADING_MSG; | ||
neko259
|
r352 | |||
neko259
|
r1474 | if (post.length > 0) { | ||
// If post is on the same page but not visible, generate preview from it | ||||
var postClone = post.clone(); | ||||
postClone.removeAttr('style'); | ||||
var postdata = postClone.wrap("<div/>").parent().html(); | ||||
neko259
|
r352 | |||
neko259
|
r1035 | mkPreview(cln, postdata); | ||
} else { | ||||
neko259
|
r1474 | // If post is from other page, load it | ||
neko259
|
r1035 | $.ajax({ | ||
url: '/api/post/' + pNum + '/?truncated' | ||||
}) | ||||
neko259
|
r1474 | .success(function(data) { | ||
var postdata = $(data).wrap("<div/>").parent().html(); | ||||
neko259
|
r354 | |||
neko259
|
r1474 | //make preview | ||
mkPreview(cln, postdata); | ||||
}) | ||||
.error(function() { | ||||
cln.innerHTML = "<div class=\"post\">" | ||||
+ gettext('Post not found') + "</div>"; | ||||
}); | ||||
neko259
|
r1035 | } | ||
neko259
|
r354 | |||
neko259
|
r1035 | $del(doc.getElementById(cln.id)); | ||
//add preview | ||||
$(cln).fadeIn(200); | ||||
$('body').append(cln); | ||||
neko259
|
r354 | } | ||
neko259
|
r352 | } | ||
function delPostPreview(e) { | ||||
var el = $x('ancestor-or-self::*[starts-with(@id,"pstprev")]', e.relatedTarget); | ||||
neko259
|
r1035 | if(!el) { | ||
$each($X('.//div[starts-with(@id,"pstprev")]'), function(clone) { | ||||
$del(clone) | ||||
}); | ||||
} else { | ||||
neko259
|
r1474 | while (el.nextSibling) { | ||
neko259
|
r1476 | if (el.nextSibling.className == CLS_PREVIEW) { | ||
neko259
|
r1474 | $del(el.nextSibling); | ||
} else { | ||||
break; | ||||
} | ||||
} | ||||
neko259
|
r1035 | } | ||
$('.highlight').removeClass('highlight'); | ||||
neko259
|
r352 | } | ||
function addPreview() { | ||||
$('.post').find('a').each(function() { | ||||
showPostPreview($(this)); | ||||
}); | ||||
} | ||||