refpopup.js
104 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+/); | ||||
//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; | ||||
cln.className = 'post_preview post'; | ||||
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); | ||||
//if(!$x('.//small', cln)) showRefMap(post, p_num, refMap) | ||||
}; | ||||
cln.innerHTML = 'Загрузка...'; | ||||
//если пост найден в дереве. | ||||
if($('div[id='+pNum+']').length > 0) { | ||||
var postdata = $('div[id='+pNum+']').html(); | ||||
//TODO: временно | ||||
//funcInit(postdata); | ||||
//make preview | ||||
mkPreview(cln, postdata); | ||||
} | ||||
//ajax api | ||||
neko259
|
r354 | else { | ||
$.ajax({ | ||||
url: '/api/post/' + pNum | ||||
}) | ||||
.success(function(data) { | ||||
// TODO get a json, not post itself | ||||
var postdata = $(data).html(); | ||||
//make preview | ||||
mkPreview(cln, postdata); | ||||
}) | ||||
.error(function() { | ||||
cln.innerHTML = 'Пост не найден.'; | ||||
}); | ||||
} | ||||
neko259
|
r352 | |||
$del(doc.getElementById(cln.id)); | ||||
neko259
|
r354 | //add preview | ||
$('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)); | ||||
}); | ||||
} | ||||