refpopup.js
99 lines
| 2.8 KiB
| application/javascript
|
JavascriptLexer
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); | ||||
} | ||||
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; | ||||
//ref id | ||||
var pNum = $(this).text().match(/\d+/); | ||||
neko259
|
r376 | if (pNum == null || pNum.length == 0) { | ||
neko259
|
r361 | return; | ||
neko259
|
r355 | } | ||
neko259
|
r352 | //position | ||
//var x = e.clientX + (doc.documentElement.scrollLeft || doc.body.scrollLeft) - doc.documentElement.clientLeft + 1; | ||||
//var y = e.clientY + (doc.documentElement.scrollTop || doc.body.scrollTop) - doc.documentElement.clientTop; | ||||
var x = e.clientX + (doc.documentElement.scrollLeft || doc.body.scrollLeft) + 2; | ||||
var y = e.clientY + (doc.documentElement.scrollTop || doc.body.scrollTop); | ||||
var cln = doc.createElement('div'); | ||||
cln.id = 'pstprev_' + pNum; | ||||
neko259
|
r359 | cln.className = 'post_preview'; | ||
neko259
|
r352 | |||
cln.style.cssText = 'top:' + y + 'px;' + (x < doc.body.clientWidth/2 ? 'left:' + x + 'px' : 'right:' + parseInt(doc.body.clientWidth - x + 1) + 'px'); | ||||
cln.addEventListener('mouseout', delPostPreview, false); | ||||
var mkPreview = function(cln, html) { | ||||
cln.innerHTML = html; | ||||
addRefLinkPreview(cln); | ||||
}; | ||||
neko259
|
r368 | cln.innerHTML = "<div class=\"post\">" + gettext('Loading...') + "</div>"; | ||
neko259
|
r352 | |||
if($('div[id='+pNum+']').length > 0) { | ||||
neko259
|
r475 | var postdata = $('div[id='+pNum+']').clone().wrap("<div/>").parent().html(); | ||
neko259
|
r352 | |||
mkPreview(cln, postdata); | ||||
neko259
|
r421 | } else { | ||
neko259
|
r354 | $.ajax({ | ||
neko259
|
r368 | url: '/api/post/' + pNum + '/?truncated' | ||
neko259
|
r361 | }) | ||
.success(function(data) { | ||||
var postdata = $(data).wrap("<div/>").parent().html(); | ||||
neko259
|
r354 | |||
neko259
|
r361 | //make preview | ||
mkPreview(cln, postdata); | ||||
neko259
|
r354 | |||
neko259
|
r361 | }) | ||
.error(function() { | ||||
neko259
|
r368 | cln.innerHTML = "<div class=\"post\">" | ||
+ gettext('Post not found') + "</div>"; | ||||
neko259
|
r361 | }); | ||
neko259
|
r354 | } | ||
neko259
|
r352 | |||
$del(doc.getElementById(cln.id)); | ||||
neko259
|
r354 | //add preview | ||
neko259
|
r422 | $(cln).fadeIn(200); | ||
neko259
|
r354 | $('body').append(cln); | ||
neko259
|
r352 | } | ||
function delPostPreview(e) { | ||||
var el = $x('ancestor-or-self::*[starts-with(@id,"pstprev")]', e.relatedTarget); | ||||
if(!el) $each($X('.//div[starts-with(@id,"pstprev")]'), function(clone) { | ||||
$del(clone) | ||||
}); | ||||
else while(el.nextSibling) $del(el.nextSibling); | ||||
} | ||||
function addPreview() { | ||||
$('.post').find('a').each(function() { | ||||
showPostPreview($(this)); | ||||
}); | ||||
} | ||||