([\s\S]*?)
<\/div>\s+?<\/div>[\s\S]+?(
|)\s*([\s\S]*?)\s*(<\/div>|<\/ul>)[\s\S]*?
(это сообщение в формате "
Внутренний Голос ⇗ " от лидера рейтинга пользователей или администрации)
';
for(var i in lukes){ //скрытие ненужных шаринг-кнопок
var lui = lukes[i];
if(lui.parentNode)
lui.appendChild(o);
}
}
var hsh ={noTwit:'twitter', noVk:'vkontakte', noFb:'facebook', noGP:'googleplus'};
for(var i in hsh){ if(hS[i].val){ //скрытие ненужных шаринг-кнопок
var shars = $qA('.infopanel_wrapper .'+ hsh[i]);
if(shars && shars.length)
for(var j in shars)
if(shars[j].style)
shars[j].style.display ='none';
}}
if(hS.shortDates.val) //укорочение дат
datesShorten(document,'.post .published, .conversation_page .messages .info .time');
if(comments && comments.length){
correctCommentsAfter(comments[0], document.body); //==== обработка комментариев ====
var topic = $q('.post')
,panel = $q('.infopanel_wrapper')
,date = topic && $q('.published', topic)
,author = panel && $q('.author', panel)
,issue = panel && $q('.original-author', panel)
,topicTitle = topic && $q('.title', topic)
,doubleDataAuthor = document.createElement('SPAN')
,voting = panel && $q('.voting', panel)
,voteRO = voting && $q('.plus', voting)
,isRO = voteRO && /read-only/i.test(voteRO.title);
//=== точка "одна статья" ===
byTextNodes(topic, haReplace); // обработка слов статьи (без комментариев)
extLinks($q('.content', topic));
extLinks($q('.original-author', topic));
(function(voteA){if(voteA)
voteA.addEventListener('click',function(){ //место события "проверка оценок"
if(!$q('canvas', this))
win.setTimeout(function(){evtChangeDom(voteA);}, 2999);
}, !1);})(voting);
doubleDataAuthor.className ='dblAuthor'; //дублирование даты-автора вверху
if(date){
doubleDataAuthor.appendChild($e({clone: date, cs:{display:'inline'} }) );
$e({el: date
,aft: !issue && author ? author : issue && author ? issue : $q('.share', panel) });
}
if(author){
var rating = $q('.rating', author);
if(rating)
rating.innerHTML = Math.round(parseFloat(rating.innerHTML.replace(/,/,'.').replace(/–/,'-') ));
doubleDataAuthor.appendChild(document.createTextNode(' — '));
doubleDataAuthor.appendChild($e({clone: author, cs:{display:'inline'} }) );
}
if(issue){
$q('a', issue).style.color ='#a33';
/*issue.querySelector('a').setAttribute('target','_blank'); //ссылка в новое окно*/
doubleDataAuthor.appendChild(document.createTextNode('; '));
doubleDataAuthor.appendChild($e({clone: issue, cs:{display:'inline'} }) );
}
doubleDataAuthor.style.cssFloat ='right';
doubleDataAuthor.style.marginLeft ='-100%';
doubleDataAuthor.style.position ='relative';
doubleDataAuthor.style.top ='-1.1em';
topicTitle && topicTitle.parentNode.insertBefore(doubleDataAuthor, topicTitle);
var lnkA = topic && $qA('.dblAuthor a', topic);
if(lnkA)
for(var i =0, lA = lnkA.length; i < lA; i++){
lnkA[i].style.color = i <1 ?'#cf0000':'#a33';
lnkA[i].style.textDecoration ='none';
if(i ==1) lnkA[i].setAttribute('target','_blank'); //ссылка в новое окно
}
var topicTitleSpan = topicTitle && $q('span.post_title', topicTitle)
,author = topic && $q('.author a', topic)
,autName = topic && author && $q('.author a', topic).innerHTML
,hubs = topic && $qA('.hubs >.hub', topic);
//'lNAV'.wcl(autName, topicHaCut, topicTitle, hubs)
if(hS.colorTopic.val && topicTitle && hubs){
for(var j in hubs) if(hubs[j].innerHTML =='Переводы'){
topicTitleSpan.style.backgroundColor ='#f0f4fa'; //топик-перевод (светло-синий)
break;
}
if(topic && / translation/.test(topic.className) && topicTitleSpan){
topicTitleSpan.style.backgroundColor ='#f0f4fa'; //топик-перевод (светло-синий)
topicTitleSpan.style.paddingRight ='8px';
}
var lNAV = hS.listNewsAuthors.val
,topicHaCut = $q('a[name="habracut"]', topic)
,flagNews = $q('.flag_news', parents('^title$', topicTitle));
for(var j in lNAV) if(autName == lNAV[j] || !topicHaCut){
topicTitleSpan.style.backgroundColor ='#fafdf2'; //новость (жёлтый)#f2f6e8
$e({cl:'recov1'
,cs:{marginLeft:'8px'}
,at:{title:'новость'}
,ht:'
н
н'
,aft: topicTitleSpan
});
if(flagNews) flagNews.style.display ='none';
break;
}
if(topic && / link/.test(topic.className) && topicTitleSpan){
topicTitleSpan.style.backgroundColor ='#f0faf4'; //топик-ссылка (зеленоватый)
topicTitleSpan.style.backgroundImage ='url(http://456)';
topicTitleSpan.style.paddingRight ='8px';
}
}
if(isRO){ //скрыть стрелки оцениваний для read-only
var votes = $qA('.comments_list .info .voting a');
if(votes) for(var i in votes) if(votes[i].attributes)
votes[i].style.display ='none';
}
}
var fileBase64Post = function(){
var dataURL = this.canvas.toDataURL(this.getImageType()) // grab the snapshot as base64
,imgData = atob(dataURL.substring(13 + this.getImageType().length)) // convert to binary
,filenameTimestamp = (new Date().getTime())
,separator = '----------12345-multipart-boundary-' + filenameTimestamp;
// Javascript munges binary data when it undergoes string operations (such as concatenation), so we need
// to jump through a bunch of hoops with streams to make sure that doesn't happen
// Create a string input stream with the form preamble
var prefixStringInputStream = Components.classes['@mozilla.org/io/string-input-stream;1']
.createInstance(Components.interfaces.nsIStringInputStream);
var formData ='--'+ separator +'\\r\\nContent-Disposition: form-data; name="data"; filename="snapshot_'
+ filenameTimestamp + (this.getImageType() =='image/jpeg'?'.jpg':'.png') +'"\\r\\nContent-Type: '
+ this.getImageType() +'\\r\\n\\r\\n';
prefixStringInputStream.setData(formData, formData.length);
// write the image data via a binary output stream, to a storage stream
var binaryOutputStream = Components.classes['@mozilla.org/binaryoutputstream;1']
.createInstance(Components.interfaces.nsIBinaryOutputStream);
var storageStream = Components.classes['@mozilla.org/storagestream;1']
.createInstance(Components.interfaces.nsIStorageStream);
storageStream.init(4096, imgData.length, null);
binaryOutputStream.setOutputStream(storageStream.getOutputStream(0));
binaryOutputStream.writeBytes(imgData, imgData.length);
binaryOutputStream.close();
// write out the rest of the form to another string input stream
var suffixStringInputStream = Components.classes['@mozilla.org/io/string-input-stream;1']
.createInstance(Components.interfaces.nsIStringInputStream);
formData ='\\r\\n--'+ separator +'\\r\\nContent-Disposition: form-data; name="description"\\r\\n\\r\\n'
+ description +'\\r\\n--'+ separator +'--\\r\\n';
suffixStringInputStream.setData(formData, formData.length);
// multiplex the streams together
var multiStream = Components.classes['@mozilla.org/io/multiplex-input-stream;1']
.createInstance(Components.interfaces.nsIMultiplexInputStream);
multiStream.appendStream(prefixStringInputStream);
multiStream.appendStream(storageStream.newInputStream(0));
multiStream.appendStream(suffixStringInputStream);
// post it
req.open('POST','http://yoursite.com/upload_endpoint', true);
req.setRequestHeader('Accept','*/*, application/xml');
req.setRequestHeader('Content-type','multipart/form-data; boundary='+ separator);
req.setRequestHeader('Content-length', multiStream.available());
req.setRequestHeader('Authorization','Basic '+ btoa(username +':'+ password));
req.setRequestHeader('User-Agent','YourUserAgent/1.0.0');
req.send(multiStream);
};
/*
var addAdReq = new XMLHttpRequest();
addAdReq.open('POST', postAdUrl, false);
addAdReq.setRequestHeader("Content-Type", "multipart/form-data; boundary="+boundary);
var stringStream = Components.classes["@mozilla.org/io/string-input-stream;1"].createInstance(Components.interfaces.nsIStringInputStream);
var data = "";
data += boundary;
data += "\r\n";
data += 'Content-Disposition: form-data; name="category_id"\r\n\r\n';
data += categoryId;
data += "\r\n";
data += boundary;
data += "\r\n";
.......[и т.д.].......
data += boundary;
data += "--\r\n";
stringStream.setData(data, data.length);
addAdReq.send(stringStream);//в хедере строка boundary должна содержать на два символа '-' меньше чем в остальных случаях.
http://igstan.ro/posts/2009-01-11-ajax-file-upload-with-pure-javascript.html */
var fPanel = $q('form .panel')
,formTA;
if(fPanel)
for(formTA = fPanel; formTA !=null && !/form/i.test(formTA.tagName); formTA = formTA.parentNode);
if((comments && comments.length || $q('#post_form') )&& !isRO && h.uName && typeof window.FileReader !=u){
$e({cl:'habrAjaxInfo droppedF for_authors'
,cs:{paddingLeft:'14px'}
,ht:'
'
+'
(?)
'
+'
Публиковать '
+'
abcde.png
'
+'
1234567 б.
'
+'
пре- вью X '
+'
'
+'
'
+''
,apT: $e({cs:{position:'relative', height:0}
,apT: sidebar})
});
$e({cl:'habrAjaxInfo pixList for_authors'
,cs:{paddingLeft:'14px'}
,ht:'
'
+' затащите файл картинки
(?)
'
+'сюда или в поле ввода комментария (статьи, вопроса, ответа, письма), чтобы разместить на
habrastorage.org (тег появится под курсором).'
+'
Макс. ширина - 1920 без ужатия
'
+'
'
+'
последние (NN),
'
+'
избранные (N),
'
+'
удалённые (NNN).
'
,apT: sidebar
});
if(formTA){
var preImgSend = $e({cl:'preImgSend habrAjaxInfo'
,ht:'
'
+'
X '
+'
'
+'
'
+''
+'(имя файла) . '
+'пре- вью '
+'Публиковать '
,bef: fPanel
});
}
var fileDrop3 = $q('#text_textarea')||$q('#comment_text')
,centPrevi = $q('.imgPrevi .centered'), fitPrevi = $q('.imgPrevi .fit');
if(fileDrop3){
$e({
el: fileDrop3
,on:{
dragover: function(ev){'dragover0'.wcl();this.classList.add('hover'); $pdsp(ev);}
,dragend: function(){'dragend0'.wcl();this.className =''; return!1;}
,drop: function(ev){
this.classList.remove('hover');
$pdsp(ev);
var file = ev.dataTransfer.files[0]
,reader = new FileReader();
reader.onload = function(ev){
'fileDrop3-target'.wcl(ev.target);
preImgSend.style.display ='block';
fileDrop3.style.background = centPrevi.style.background = fitPrevi.style.background ='url('+ ev.target.result +') no-repeat center';
centPrevi.style.backgroundColor ='#F0F6F0';
fitPrevi.style.backgroundSize ='contain';
fitPrevi.style.backgroundColor ='#F0F0F0';
var resu = ev.target.result;
handlImgViews(preImgSend,'.aPrevi.imgL');
var previLink = $q('.aPrevi img', preImgSend)
previLink &&(previLink.src = resu);
win.addEventListener('loadImg',function(){
var dimS = previLink.title.match(/(\d+)x(\d+)$/);
if(dimS){
dimS = dimS.slice(1);
$q('#resizeWidth2', preImgSend).setAttribute('placeholder',dimS[0]);
$q('#resizeHeight2', preImgSend).setAttribute('placeholder',dimS[1]);
}},!1);
$q('.imgDimens .weight',preImgSend).innerHTML = file.size;
$q('.fileName',preImgSend).innerHTML = file.name;
var fD = new Date(file.lastModifiedDate);
$q('.imgDate',preImgSend).innerHTML = fD.getFullYear()
+'-'+ (fD.getMonth()+1<=9?'0':'') +(fD.getMonth()+1)
+'-'+(fD.getDate()<=9?'0':'')+ fD.getDate()
+','+ getDay([0,fD.getDate(),0,fD.getFullYear()], fD.getMonth())
+' '+ (fD.getHours()<=9?'0':'') + getHourMins(fD)+
':'+(fD.getSeconds()<=9?'0':'')+fD.getSeconds();
};
var formData = new FormData();
formData.append('Filedata', file);
'fileDrop3-file'.wcl(file.size, file.lastModifiedDate, file.mozFullPath, formData);
reader.readAsDataURL(file);
return!1;
}
}
});
$e({el:'.aPrevi.imgL button', blck: preImgSend
,on:{click:function(ev){
var img = this.parentNode.previousSibling.firstChild
dimS = img.title.match(/(\d+)x(\d+)$/);
dimS && addFullImg(img, dimS.slice(1));
$pdsp(ev);
return!1}
} });
$e({el:'.previCancel', blck: preImgSend
,on:{click:function(ev){
fileDrop3.style.backgroundImage ='none';
preImgSend.style.display ='none';
$pdsp(ev);
}} });
$e({el:'.publish', blck: preImgSend
,on:{click:function(ev){
openInFrame({clientY: ev.clientY}, {href:HSO+'/'});
$pdsp(ev);
}} });
}
}
var menuA = $qA('.main_menu a');
if(menuA.length ==0)
menuA = [$q('#navbar .tab_menu .g-icon-burger')];
menuA && menuA[0] && $e({el: menuA[0]
,cl:'date'
,at:{title: menuA.length ==1 ?'Разделы':'лента'+(hS.postsLinkNew.val ?'-все-новое':'')}
,ht: getHourMins().replace(/(\d\d):/,'$1') +' '+ getDay([0,NOWdate.getDate(),0,NOWdate.getFullYear()], NOWdate.getMonth())});
$e({el: $q('#navbar .tab_menu')
,on:{click: function(){
var menuTab = $q('#menu_tab')
,el = $q('.global_search_form input', menuTab);
'menuTab'.wcl(menuTab && /hidden/.test(menuTab.className) && el)
menuTab && /hidden/.test(menuTab.className) && el && setTimeout(function(){el.focus();},199);}} });
if(menuA && menuA[0] && hS.postsLinkNew.val || hS.allFeed.val){
if(menuA[0].href)
menuA[0].href = ROOT + (/(\/feed\/)/.test(menuA[0].href) ?'/feed/'
+ (hS.allFeed.val ?'/posts/':''): (h.uName ?'':'/posts') + (hS.allFeed.val && hS.postsLinkNew.val ?'/corporative/':'/collective/') );
if(hS.postsLinkNew.val && menuA[0].href)
menuA[0].href +='new/'; //ссылки 'Лента", "Посты" - на "новые"
}
if(comments && comments.length || fPanel )
addTaButtons(comments[0] || formTA ); //добавление кнопок над полем ввода
h.uName2 = $q('.user_header .username') || h.uName; //выбор чужого юзера с приоритетом
h.uName2 = h.uName2 && h.uName2.innerHTML;
authorClicks(document); //обраб-к кликов на авторах, избранном, настройках, авторизации
authorClicks($q('#search_form input[type="submit"][value=""]')); //на кнопке поиска
handlImgViews(document); //показ увеличенных картинок
if(inFrame){ //удаление персонального меню в фрейме
var footer = $q('#footer');
if(footer) footer.style.display ='none';
var panelPers = $q('#header .userpanel');
if(panelPers){
panelPers.style.display ='none';
$e({ //кнопка закрывания фрейма
cl:'closeButt'
,ht: 'X '
//document.activeElement.removeChild(document.activeElement.firstChild);
,cs:{cssText:'position: fixed; z-index:2; right:0; top:2px; cursor:pointer'}
,bef: panelPers.parentNode
});
}
}
if(win.commentForm)
win.commentForm.sendOnEnter = function(){}; //убрать отправку по Ctrl+Enter (устарело, но может работать в блогах компаний (?))
if(hS.innerTab.val){ // ====== вставка спецсимволов =======
var tArea = $qA('.editor textarea')
,inTag = win.habraWYG && win.habraWYG.insertTag;
if(tArea.length && inTag)
for(var j in tArea){var taJ = tArea[j]; if(taJ.attributes){
$e({el: taJ, on:{keydown: function(ev){
var th = ev.target;
if(ev.shiftKey && ev.keyCode ==9){ //вставка таба по Shift-Tab
inTag(th,' ');
$pd(ev);
}
if(ev.ctrlKey && ev.keyCode ==32){ //вставка NBSP по Ctrl-Space
inTag(th,' ');
$pd(ev);
}
}} });
}}}
if(hS.autoGrow.val){
var tAGrow = function(tA){ //авторост-обработчик
if(!tA) return;
var tSHPrev =0, tAInh, tATout
,maxH = Math.floor(win.innerHeight *0.8)
,tAF = function(ev){
if(tSHPrev < maxH && tAInh)
win.clearTimeout(tATout), tA.style.overflow ='hidden', tAInh =0;
var tSH = tA.scrollHeight - (isChrome||isFx ? 0 :win.opera?2:6);
//'tA'.wcl(tSHPrev, tSH, ev.type, tA.offsetHeight);
if(win.opera){
tA.blur();
tA.style.height = 0;
tA.style.marginBottom = tSH +'px';
tSH = tA.scrollHeight -2;
tA.style.height = tSH +'px';
tA.style.marginBottom = 0;
tA.focus();
}
if(tSHPrev <= tSH && tSHPrev < maxH){
tA.style.height = tSH +'px';
if(tSHPrev < maxH && tAInh)
win.clearTimeout(tATout), tA.style.overflow ='hidden', tAInh =0;
}else if(!tAInh)
win.clearTimeout(tATout), tATout = win.setTimeout(function(){tA.style.overflow ='inherit'; tAInh =1}, 230);
tSHPrev = tSH;
};
tA.addEventListener('keypress',tAF,!1); //контроль за ростом блока данных
tA.addEventListener('keyup',tAF,!1);
tA.style.maxHeight = maxH +'px';
};
tAGrow($q('.editor #comment_text')||$q('.editor #text_textarea') );
tAGrow($q('.editor #text') );
}
$q('.inbox_page_write')&&($q('.inbox_page_write').className ='inbox_page_write2'); //разблок_ресайза поля ввода в почте
$q('.inbox_page_read')&&($q('.inbox_page_read').className ='inbox_page_read2');
if(hS.reformal.val && !inFrame){ // добавление виджета reformal.ru для отправки багрепортов (можно то же из настроек)
addJs(function reformal_preload(){
reformal_wdg_w = "713";
reformal_wdg_h = "460";
reformal_wdg_domain = "habrajax";
reformal_wdg_mode = 0;
reformal_wdg_title ='HabrAjax - чтобы сайт стал удобным';
reformal_wdg_ltitle = "БАГИ";
reformal_wdg_lfont = "";
reformal_wdg_lsize = "";
reformal_wdg_color = "#269bd1";
reformal_wdg_bcolor = "#73859e";
reformal_wdg_tcolor = "#FFFFFF";
reformal_wdg_align = "right";
reformal_wdg_charset = "utf-8";
reformal_wdg_waction = 0;
reformal_wdg_vcolor = "#559ecf";
reformal_wdg_cmline = "#d3d8df";
reformal_wdg_glcolor = "#105895";
reformal_wdg_tbcolor = "#FFFFFF";
reformal_wdg_tcolor_aw4 = "#3F4543";
reformal_wdg_bimage = "cac7b640e87a20ba02df24d613d54a1d.png";
reformal_html ='';
document.write = function(a){reformal_html +=a;};//обход doc.write
});
addJs('http://reformal.ru/tabn2v4.js?charset=utf-8' //виджет reformal.ru и его постобработчик
,hS.versionNumb
,'MyOtziv'
,function reformal_postload(){ //загрузка после doc.write и подгонка стилей, текстов
var elem = document.createElement('DIV');
elem.id ='reformal_holder';
elem.innerHTML = reformal_html;
document.body.insertBefore(elem, document.body.childNodes[0]);
document.getElementById('myotziv_box').style.zIndex = 3001;
var reformal_butt = document.querySelector('#reformal_holder .frgtd'); //кнопка открывания виджета, |.frby
reformal_butt.style.right='-4px';reformal_butt.style.width ='17px';
reformal_butt.querySelector('img').style.position='relative';
reformal_butt.querySelector('img').style.left='-4px';
reformal_butt.style.overflow ='hidden';
reformal_butt.querySelector('a').title ='Пожелания и баги HabrAjax';
reformal_butt.querySelector('a').style.marginBottom ='3em';
var reformal_closeButt = document.querySelector('#reformal_holder .pokusijy'); //кнопка закрытия
var reformal_goto = document.createElement('DIV');
reformal_goto.innerHTML ='смотреть всё ';
reformal_closeButt.parentNode.insertBefore(reformal_goto, reformal_closeButt.nextSibling);
reformal_goto.style.cssFloat ='right';
reformal_goto.style.marginRight ='10px';
var reformal_foot1 = document.querySelector('#reformal_holder .drsdtf');
reformal_foot1.style.width ='auto';
var reformal_note1 = document.createElement('DIV');
reformal_note1.innerHTML ='При баге пишите браузер , версию , ОС и версию скрипта (@). ';
reformal_foot1.parentNode.appendChild(reformal_note1);
reformal_note1.style.padding ='3px 0 0 5px';
reformal_note1.style.cursor ='pointer';
});
}
if(hS.gPlus.val && !/\/sandbox/.test(location.href && !inFrame)) // добавление скрипта Google+
addJs('https://apis.google.com/js/plusone.js','{"parsetags": "explicit"}', 'gapi', loadGPlus);
//linkCommFavor(); //дин.ссылки избранного и комментариев
var submenu = $q('.submenu')
,forSand = $qA('.item a[href*="/sandbox/"],.item a[href*="/notes/"]', submenu);
//'forSand'.wcl(forSand , !forSand.length , !isCompa)
if(forSand && !forSand.length && !isCompa)
$e({cl:'item'
,ht:'Песочница '
,apT: submenu
});
$e({cl:'item'
,ht:'Storage '
,apT: submenu
});
var userpanel = $q('.userpanel');
if(userpanel){ //кнопка настроек [и тест ошибок юзерскрипта]
var hMailLink = $q('a[href*="conversations/"]', userpanel)
,favors = $q('a[href*="favorites/"]', userpanel)
,trac = $q('a[href*="tracker/"]', userpanel)
,nastr = $q('a.nav-settings', userpanel)
,exit = $q('a[href*="logout"]', userpanel)
,cntTrac = $q('a.count[href*="tracker"]', userpanel)
,cntMail = $q('a.count[href*="conversations"]', userpanel)
,bottom = $q('.bottom', userpanel);
if(exit)
exit.title ='выход';
if(trac)
trac.innerHTML ='трек';
if(cntTrac && trac){
trac.style.display ='none';
cntTrac.title ='трекер';
}
if(cntMail && hMailLink){
hMailLink.style.display ='none';
cntMail.title ='сообщения в почте';
}
if(RO){
RO.title = RO.innerHTML; RO.innerHTML ='RO';}
if(hMailLink){
hMailLink.innerHTML ='сооб';
$e({el: hMailLink, prT: bottom});
}
var habrAjaxSettButt = $e({el:'A'
,cl:'habrAjaxSettButt'
,at:{href: URLCSS, title:'Настройки просмотра сайта'}
,ht:'HAjax'
,on:{click: hS.edit} });
h.inZen ? $e({el: habrAjaxSettButt, prT: bottom}) : $e({el: habrAjaxSettButt, apT: bottom});
if(favors){
favors.innerHTML ='избр';
favors.title ='Избранные мною статьи';
$e({el: favors, prT: bottom});
}
var login = $q('.userpanel >a[href*="login/"]');
if(nastr){
nastr.innerHTML ='настр';
nastr.title ='настройки пользователя на сайте';
$e({el: nastr, prT: bottom});
}else //для неавторизованных
login && login.parentNode.insertBefore(habrAjaxSettButt, login);
if(login && !nastr && /googleusercontent.com/.test(lh))
login.innerHTML ='googleUserContent';
var chargeDiv, replaceCharge;
if( chargeDiv = $q('.charge', userpanel) ){
(replaceCharge = function(){ //перевод описания оставшихся голосов в иное представление
var chrgNums = chargeDiv.innerHTML.match(/\d+/g);
if(chrgNums && !chrgNums[1]) chrgNums[1] ='--';
chargeDiv.style.fontSize ='12px';
var dd = $e({ht:''
+ (chrgNums && chrgNums.length ? chrgNums[0]:'') +' '
+' Блог '
+' QAQ '
+''
+ (chrgNums && chrgNums.length ? chrgNums[1]:'') +' '
+'Комм. '
+' QAA '});
var chlds = chargeDiv.childNodes;
//'chlds'.wcl(chlds, chlds.length);
for(var i in chlds){ var chI = chlds[i]; if(chI.parentNode){
//'chldsI'.wcl(chI, chI.nodeType, chI.nodeValue)
if(chI.nodeType ==3 && chI.nodeValue && chI.nodeValue.length >19)
chargeDiv.replaceChild(dd, chI);
}}
})();
}
}
var panelNav = $q('#header .main_menu')
,tops = panelNav && $q('a[href*=top]', panelNav)
,events = panelNav && $q('a[href*=events]', panelNav);
if(tops) tops.innerHTML ='хит';
if(events) events.innerHTML ='соб';
var contSelect;
//{ Данные цитаты:
//contextBefore //примерно строка до выделенного (в письме отображается серым)
//contextAfter //примерно строка после выделенного
//author //автор статьи-комментария
//date //дата (статьи, комментария)
//title //название статьи (для использ. в письме)
//link: //ссылка URL на элемент
//source //источник (перевода, ссылки)
//sourceLink
//тип контекста цитаты: статья, коммент, QA, песочн.};
//(contSelect = function(){ //========== обработка выделения текста ================
if(hS.contextSelect.val || hS.hQuotes && hS.hQuotes.val || hS.correctCite.val){ //=== контролы на выделения текста ===
var selectOp = function(ev){ //сбор данных по выдел_
if(parents('^citeBtns$',ev.target))
return;
if(parents('citeBtns', ev.target) && ev.target.tagName !='A'){
$pdsp(ev);
}
if(win.getSelection && hNE && !parents('js-field-data', ev.target) /*&& !parents('topic_add', ev.target)*/ ){
var sR = win.getSelection();
//sR.modify && sR.modify("extend", "forward", "word"); //граница слова в конце выделения
var sRA = sR.anchorNode
,sRF = sR.focusNode
,commElemStart = parents('^comment_item', sRA)
,commElemEnd = parents('^comment_item', sRF)
,artiElemStart = parents('^content[^_]', sRA)
,artiElemEnd = parents('^content[^_]', sRF)
,sel ={commCount: 1 //параметры выделения
,elemTop: 9e9, elemRight: -9e9, elemBottom: -9e9, elemLeft: 9e9}
try{
var sRR = sR.getRangeAt && sR.getRangeAt(0)
,nodeAncestor = sRR.commonAncestorContainer
,nodeStart = sRR.startContainer
,nodeEnd = sRR.endContainer
// вычисление текстового сдвига относительно общей ноды, чтобы:
// 1) найти контекст; 2) отвязаться от пересекающих нод. Корневая нода - сообщение
,rAncestorStart = sRR.cloneRange();
rAncestorStart.selectNodeContents(nodeAncestor);
//rAncestorStart.setStartAfter(nodeAncestor);
//rAncestorStart.setEndBefore(nodeStart);
//,rAncestorEnd = (document.createRange()).selectNode(nodeAncestor);
//rAncestorStart.setEndBefore(nodeStart);
//rAncestorEnd.setEndBefore(nodeEnd);
}catch(er){;}
if(sRR && sRR.getClientRects && sRR.getClientRects()[0]){ //границы выделения
var sRRB = sRR.getClientRects();
for(var i=0, iL = sRRB.length; i < iL; i++){
if(sRRB[i].top < sel.elemTop) sel.elemTop = sRRB[i].top;
if(sRRB[i].right > sel.elemRight) sel.elemRight = sRRB[i].right;
if(sRRB[i].bottom > sel.elemBottom) sel.elemBottom = sRRB[i].bottom;
if(sRRB[i].left < sel.elemLeft) sel.elemLeft = sRRB[i].left;
}
$x(sel, {startX: sRRB[0].left //координаты "старта-конца" (верха-низа)
,startY: sRRB[0].top
,endX: sRRB[sRRB.length-1].right
,endY: sRRB[sRRB.length-1].bottom
});}
//TEST
/*sel.posStart = sRR.startOffset;
sel.posEnd = sRR.endOffset;
sel.nodeAncestor = nodeAncestor;
sel.rAncestorStart = rAncestorStart.startOffset +'/'+ rAncestorStart.endOffset;*/
if(sRA ==sRF) //направление выделения
sel.direction = sR.anchorOffset < sR.focusOffset;
else{
var posA = getPosition(sRA), posF = getPosition(sRF);
sel.direction = posA.y == posF.y ? posA.x < posF.x : posA.y < posF.y;
}
//'direction'.wcl(sel.direction, sel.elemTop, sel.elemBottom)
$x(sel, {commElemTop: sel.direction ? commElemStart || commElemEnd
: commElemEnd || commElemStart //тег с идом первого коммента
,commElemBottom: !sel.direction ? commElemStart || commElemEnd
: commElemEnd || commElemStart
,artiElemTop: sel.direction ? artiElemStart || artiElemEnd
: artiElemEnd || artiElemStart
,artiElemBottom: !sel.direction ? artiElemStart || artiElemEnd
: artiElemEnd || artiElemStart
});
sel.postElem = parents('^post($| )', sel.artiElemTop || sel.commElemTop)
|| prev('^post($| )', parents('^(comments_list( )?|comments c2)', sel.artiElemTop || sel.commElemTop)); //тег с идом поста - !!!будет сильно зависеть от вида записи класса!, источник ошибок волатильности
if(commElemStart && commElemEnd && commElemStart != commElemEnd){
var commsStart = parents('^(comments_list|comments c2)', sel.commElemTop) || parents('^comments c2$', sel.commElemTop)
,commsEnd = parents('^(comments_list|comments c2)', sel.commElemBottom) || parents('^comments c2$', sel.commElemBottom);
if(commsStart == commsEnd){ //если в одной статье - считать выделенные комм-ы
var cInArt = $qA('.comment_item', commsStart)
,j =0;
for(var i in cInArt){
if(j >0)
j++;
if(j && cInArt[i] == sel.commElemBottom)
j = -j;
if(!j && cInArt[i] == sel.commElemTop)
j =1;
}
sel.commCount = -j; //число выделенных комментариев (для "HQ")
}
}
if(sR)
var s = ''+ sR +' '
,sTechLen = s.length - (sR+'').length;
if(s && (sR+'').length >0){
var sele = $q('.list .sele', hNE) //строка выделения - в список цитат
,newSele = $e({el: sele
,cl:'sele'
,ht: s +' '+ ((sR+'').length||'') +' '});
if(newSele != sele)
$q('.list', hNE).appendChild(newSele);
//'commElemTop'.wcl(sel.commElemTop , sel.artiElemTop)
var commTime = $q('.info time', sel.commElemBottom) || $q('.info .time', sel.commElemBottom);
$x(sel, {text: s //выделение; и далее - сопутствующая инф.
,textR: sR+'' //чистый текст выделения
,dateCopy: +new Date() //дата снятия копии пользователем
,articleId: sel.postElem && sel.postElem.id && sel.postElem.id.replace(/\D/g,'')
,item: sel.commElemTop || sel.artiElemTop // ссылка на элемент с идом - статью или комментарий
,commAuthor: sel.commElemBottom
? ($q('.info .username', sel.commElemBottom) || $q('.info a', sel.commElemBottom) ).textContent.trim()
: undefined
,commDate: sel.commElemBottom && commTime
? commTime.textContent.trim() + (commTime.title ?', '+ commTime.title.replace(/,/,', ') :'')
: undefined
,author: sel.postElem
? $q('infopanel_wrapper .author a[href*="/users/"]', sel.postElem) && $q('.infopanel_wrapper .author a[href*="/users/"]', sel.postElem).textContent.trim()
: undefined
,title: sel.postElem
? $q('.title span', sel.postElem) && $q('.title span', sel.postElem).textContent.trim()
: undefined
,date: sel.postElem
? $q('.infopanel_wrapper .published', sel.postElem) && $q('.infopanel_wrapper .published', sel.postElem).textContent.trim() + ($q('.infopanel_wrapper .published', sel.postElem).title ?', '+ $q('.infopanel_wrapper .published', sel.postElem).title :'')
:undefined
});
//'sel'.wcl(sel);
if(sel.articleId)
sel.url = ROOT +'/post/'+ sel.articleId +'/';
if(sel.commElemBottom)
sel.commId = sel.commElemBottom.id.replace(/\D+/,'');
//разместить контекстную кнопку
var edit = $q('.title .edit', sel.postElem); //===== кнопка "Edit" ========
$q('.edit', hNBs).style.display
= (!edit || sel.commElemBottom) && !/\/(edit|add)\//.test(lh)
?'none':'';
$x(hNBs.style, {left: ((ev.type=='keyup'&& ev.pageX + sel.endX || ev.pageX) +6) +'px'
,top: ((ev.type=='keyup'&& ev.pageY + sel.endY || ev.pageY) +16) +'px'
,display:'block'});
selS.ww && win.clearTimeout(selS.ww);
var hideNBs;
selS.ww = win.setTimeout(hideNBs = function(){
if(!selS.noAutoHide && ! selS.hover) hNBs.style.display ='none';
}, 2999); //hide
hNBs.style.display ='block';
$q('.citeTxTa', hNBs) && ($q('.citeTxTa', hNBs).style.display ='none');
selS.noAutoHide =0; //автоскрытие через 3 с.
}else{ //===== сохранение прежде набранного при нулевом выделении =====
hNBs.style.display ='none';
if(!selS.prev) selS.prev ={};
$x(selS.prev, { //сохранение прежде набранного
citeComm: $q('.ta', hNBs).value
,textR: selS && selS.textR ||''
//TODO и много другого контекста
});
$q('.ta', hNBs).value = $q('.taAbs', hNBs).value =''; //очистка по закрытию
selS.ww && win.clearTimeout(selS.ww);
}
$e({el: hNBs, on:{ //поведение автоскрытия кнопки при неактивности
mouseover: function(){selS.ww && win.clearTimeout(selS.ww); selS.hover =1;}
,mouseup: function(){selS.noAutoHide =1;}
,mouseout: function(){
selS.hover =0;
selS.ww && win.clearTimeout(selS.ww);
selS.ww = win.setTimeout(hideNBs, 2999);
}} });
selS = sel; //всё о выделении
if(s.replace(/^\s+/,'').length <= sTechLen) //если пустая строка выделения
hN.retainView(); //скрыть, если внутри нет блоков...
else
hNE.style.display ='block';
hNE.style.opacity = s.length >22 || $q('.hlp', hNE) ? 1 : 0.85;
}
}
$e({el: document.body, on:{mouseup: selectOp, keyup: selectOp} });
}
var bt =' '
+bt+'Комментарий с цитатой" data="reply">Ответ '
+bt+'Начать письмо с цитатой; Ctrl - в новой вкладке" data="letter">Письмо'
+bt+'Начать письмо выделенному или контекстному автору" data="toUser">Юзеру'
+''+bt+'Поиск по сайту (вывод в фрейме)" data="search" style="display:block">Поиск'
+bt+'Поиск по сайту через Google; Ctrl - в новой вкладке" data="searchGoo">Goo'
+bt+'Поиск по сайту через Yandex" data="searchYa">Ya
'
+' '
+(hS.correctCite.val ? '
'
+bt+'Отметить как ошибку" data="mistake" class="pre">Грамматика'
+bt+'Ошибка в знаках препинания" data="punctuation" class="pre">Пунктуация'
+bt+'" data="misprint" class="pre">Опечатка'
+bt+'Ошибка в стилистике" data="stylistic" class="pre">Стиль'
+'
':'')
+'
'
+'
'
+bt+'Подготовка цитаты" data="citeComm" class="pre"><_>'
+'<E> '
+(hS.correctCite.val ? bt+'Ошибка содержания" data="wrongData" class="pre">Ош.':'')
+(hS.hQuotes && hS.hQuotes.val ? bt+'Отправить в HabraQuotes (выделенные 1-10 комментариев)" data="hQuotes">HQ':'')
+bt+'восстановить набранное в прежнем контексте" data="repair"><_'
+'
',
on:{
mousedown: function(ev){ //перемещение конт.кнопок
if(ev.target.className =='ta'|| parents('^citeTxTa$',ev.target))
return;
document.addEventListener('mousemove', citeButF,!1);
document.addEventListener('mouseup', function(ev){
document.removeEventListener('mousemove', citeButF)});
citeButF.xy = {x: parseInt(hNBs.style.left), y: parseInt(hNBs.style.top)};
$x(citeButF.mou0={}, citeButF.mou ={x: ev.pageX, y: ev.pageY});
//'citeButF.mou0'.wcl(citeButF.mou0)
},
mouseup: function(ev){
'33'.wcl(ev.target)
selS.cmd = ev.target.getAttribute('data'); //имя кликнутой кнопки
selS.subSelect = parents('^citeTxTa$',ev.target) ?1:0; //выделение в цитате или в поле ввода
/*return;*/
//hN.ciCom = {misType: ev.target.getAttribute('data')};
document.removeEventListener('mousemove', citeButF);
hN.moveMin =4;
hNBs.wasMoved = Math.abs(citeButF.mou0.x - ev.pageX) + Math.abs(citeButF.mou0.y - ev.pageY) /*< hN.moveMin*/; //признак перемещения
'44'.wcl('tx',hNBs.wasMoved)
},
click: function(ev){
selS.hN = hN; //TODO обратная ссылка
if(!h.uName && !(hS.hQuotes && hS.hQuotes.val))
hN.addNote(this.title +' - требуется авторизация на сайте.');
else{ //передвижение или исполнение по кнопке
selS.ww && win.clearTimeout(selS.ww);
if(hNBs.wasMoved > hN.moveMin){
'moved'.wcl(hNBs.wasMoved);
}else{
'hN.sel0'.wcl(selS, selS.subSelect)
if(!selS.subSelect)
cmd[ selS.cmd ](selS, ev); //=== действие (клик кнопки) ===
}
}
}
},apT: document.body
}),
cmd ={ //=== команды обработки выделений ===
insertComm: function(s, clarifShow){
var repl = s.commElemBottom
? $q('.reply .reply_link', s.commElemBottom) || $q('.reply >a.reply', s.commElemBottom) //цитата из комментария
: $q('.comments_form .title a'); //..из статьи
'isRepl'.wcl(repl, s.commElemBottom)
var tA = $q('textarea#comment_' +'text')
, taVal = tA.value;
if(repl){
'+|+'.wcl(!$q('textarea', repl.parentNode.parentNode))
/*if(1 || s.commElemBottom && (!$q('textarea', repl.parentNode.parentNode) || !s.commElemBottom);*/
tA.value = taVal;
}
'cshow'.wcl(s.commElemBottom)
tA.value += (/\n$/.test(tA.value) || tA.value.length ==0 ?'':'\n') //с новой строки
+ (s.textR.trim().length <=1 ?'':'
'+ s.textR +' \n') //удалять 0-1-символьные цитаты
+ (s.text0 || this.citeComm() ||''); //текст из плавающего комментария
tA.focus();
},
reply: function(s, ev){ //ответ в корневой комм., или раскр.отв. в текущий (последн.выд.), прокрут.
if(s==0){
var lStor = getLocStor('composeLetter');
'lStor'.wcl(lStor);
if(lStor){
var sRF = $q('#reply_comments_'+ lStor.commId) || $q('#comment_'+ lStor.commId);
s ={
commElemBottom: parents('^comment_item', sRF)
,textR: lStor.cite ||''
,text0: lStor.text ||''
};
removeLocStor('composeLetter');
}}
var tAs = $qA('textarea#comment_text')
,clarifShow = null; //в QA открыто уточн.или отв.в комм
'repl'.wcl(tAs, s);
if(s !=0 && (s.commElemBottom && parents('comments c2', s.commElemBottom) //цитата с комм.
|| s.artiElemBottom && /content c2/.test(s.artiElemBottom.className)
|| topics && topics.length && s.artiElemBottom && /^content /.test(s.artiElemBottom.className) ))
this.letter(s, ev,'comm');
else if(tAs.length)
this.insertComm(s, clarifShow);
},
letter: function(s, ev, isComm){ //письмо с одиночной цитатой
if(selS)
this.initLetter(ev, {to: s.author, subj: s.title ?'Re: '+ s.title :'', cite: s.textR}, isComm);
else
this.initLetter(ev,{cite: s.textR}, isComm);
},
toUser: function(s, ev){ //письмо пользователю (явное имя или контекстное)
'selS'.wcl(selS, s.textR, userNameMaxLen, allASCII(s.textR))
var shortSel = s.textR.length >2 && s.textR.length <= userNameMaxLen && allASCII(s.textR);
if(selS){
'++'.wcl(shortSel ? s.textR.trim().replace(',$','') : s.commAuthor || s.author, s.title ?'Re: '+ s.title :'', !shortSel ? s.textR : null)
this.initLetter(ev, {to: shortSel ? s.textR.trim().replace(',$','') :'Enter username'
, subj: s.title ?'Re: '+ s.title :'', cite: !shortSel ? s.textR : null} ); //контекстному автору из преж. команды
// (оформляются все цитаты и ошибки автора, отмеченные в чекбоксах)
}else
this.initLetter(ev, {to: shortSel ? s.textR.trim().replace(',$','') : null
, cite: !shortSel ? s.textR : null} );
},
search: function(s, ev, FFind){
if(srchBut){
if(srchField) srchField.value = s.textR;
var evt = document.createEvent("MouseEvents");
evt.initMouseEvent('click',!0,!0, window, 0, 0, 0, 0, ev.clientY,
ev.ctrlKey, !1, ev.shiftKey, !1, 0, null);//(type, canBubble, cancelable, view,
// detail, screenX, screenY, clientX, clientY,
// ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget)
(FFind || srchBut).dispatchEvent(evt);
}},
searchGoo: function(s, ev){
this.search(s, ev, srchButGoo);
},
searchYa: function(s, ev){
this.search(s, ev, srchButYa);
},
hQuotes: function(s, ev){ //комментарий - ->на habraQuotes.ru
'hQuotes'.wcl(0, win.GM_xmlhttpRequest);
if(typeof GM_xmlhttpRequest !=u){
hN.addNote(imgWait +' ');
var itemId = s.item && s.item.id
,linkHQ ='
Перейти на сайт ';
'items'.wcl(s, s.postElem, s.articleId, s.commCount, itemId);
if(itemId){
var waitHQ = win.setTimeout(function(){ //таймаут по неответу
//alert(305)
hN.addNote('Ошибка: нет ответа от habraquotes.ru долгое время. '+ linkHQ);
}, 14000);
GM_xmlhttpRequest({ //отправка данных для публикации
url: 'http://habraquotes.ru/api/2.0/quotes/add'
,method:'post'
,data:'link='+ ROOT +'/post/'+ s.articleId +'/#'+ itemId +'&count='+ s.commCount +'&is_habrajax=1'
,headers:{"Content-Type":"application/x-www-form-urlencoded; charset=UTF-8", "X-Requested-With":"XMLHttpRequest"}
,onload: function(dat2){
if(/"url":/.test(dat2.responseText) && !/"error":/i.test(dat2.responseText) ||/{"state":"ok"}/i.test(dat2.responseText) ){
win.clearTimeout(waitHQ);
'dat2'.wcl(dat2.responseText,'{"state":"ok"}'==dat2.responseText)
if(/"url":/.test(dat2.responseText) || /{"state":"ok"}/i.test(dat2.responseText) ){
datJson = win.JSON.parse(dat2.responseText);
hN.addNote('Публикация выполнена успешно.
Посетить сайт с местом публикации ');
}}else if(/"err":/.test(dat2.responseText)){
win.clearTimeout(waitHQ);
datJson = win.JSON.parse(dat2.responseText);
hN.addNote('Ошибка: '+ datJson.error +'. '+ linkHQ);
}else
hN.addNote('Неопознанный ответ: ', dat2.responseText, linkHQ);
}, onerror: function(dat2){
win.clearTimeout(waitHQ);
'Err:'.wcl('habraQuotes ', dat2); //TODO по таймауту - повторить
hN.addNote('
Err: ошибка обмена (2-й запрос) с сервисом habraQuotes '+ linkHQ);
},
onreadystatechange: function(datRS){
if(datRS && datRS.readyState ==4 && datRS.status !='200'&& datRS.status !='304' || /error/i.test(datRS.responseText) ){
win.clearTimeout(waitHQ);
'Error habraquotes.ru: status='.wcl(datRS.status +', ошибка ответа. '+ datRS.responseText +' '+ linkHQ);
hN.addNote(' Ошибка: статус ответа - '+ datRS.status +'. '+ linkHQ);
}
}
});
}else
hN.addNote('
(был выбран не комментарий, действия нет) ');
}},
repair: function(s, ev){ if(selS.prev){ //восст_контекста и набранного, случайно закрытого ранее
var ss = $q('.ta', hNBs).value;
s.citeComm = selS.prev.citeComm;
selS.prev.citeComm = ss; //swap
ss = s.textR;
s.textR = selS.prev.textR;
s.text = '
'+ s.textR +' ';
selS.prev.textR = ss; //swap
this.citeComm(s, ev,'repair');
}},
//Дополненное к цитате:
//copier //пользователь-копировщик (автор цитаты и дополнений к ней)
//misType: //тип ошибки (5 типов или просто цитата) - предваряющая или заверш-я кнопка
//subSels: [] //суб-выделения - детализации ошибок или выделений в цитате
//removes: [] //удаления (исправления)
//adds: [] //добавления пользователя (исправления)
// тип оценки (к цитате): -3 - свернуть и никому не показывать; -2 - свернуть; -1 - не очень; 0 - ну, смотрел; 1 - интересно, 2 - надо вернуться 3 - смотреть всем
//оценка - эмоции, оценка - содержание
//userComments: [] //ответы пользователя - текст, дата
mistake: function(a, b){this.citeComm(a, b)}, //группа обработки ошибок (отмеч-с тип)
punctuation: function(a, b){this.citeComm(a, b)},
misprint: function(a, b){this.citeComm(a, b)},
stylistic: function(a, b){this.citeComm(a, b)},
wrongData: function(a, b){this.citeComm(a, b)},
citeComm: function(s, ev, noFill){ //=== комментирование цитаты (и субвыделения) =(s==selS)
var citeTxTa = $q('.citeTxTa', hNBs) //блок контекстного ввода (общий)
,citeTx = $q('.citeTx', citeTxTa) //блок цитат
,citeLst = $q('.citeLst', citeTxTa) //список цитат
,citeLst2 = $q('.citeLst2', citeLst) //список цитат
,citeTxt = $q('.citeTxt', citeTxTa) //цитата
,citeTa = $q('.citeTa', citeTxTa) //блок комментария
,citeTaT = $q('.ta', citeTa); //поле контекстного комментария
if(!ev && !s) //вернуть написанное в комментарии
return citeTaT.value;
var citeTaA = $q('.taAbs', citeTa)
,areaSymb = 140 //средняя площадь символа
,areaTaSymb = 130
,areaText = s.text && Math.sqrt(areaSymb * s.textR.length) ||0
,areaTaText = s.comm && Math.sqrt(areaTaSymb * s.comm.length) || 1;
s.hN.ciCom ={copier: h.uName, misType: s.cmd} //дополнения копировщика к цитате
$x(citeTx.style, {width: Math.floor(areaText)+50 +'px'
,marginLeft: -Math.floor(areaText /2 -10) +'px'
,marginRight: -Math.floor(areaText /2 +10) +'px'
});
citeTxt.innerHTML = s.text;
/*$e({el:'b', cl:'cite'
,ht:'='+ s.posStart +'_'+ s.posEnd +';'+ s.nodeAncestor.textContent +';'+ s.rAncestorStart
,apT: citeLst2});*/
//this.normTa(areaTaText, citeTaT);
//this.normTa(areaTaText, citeTaA);
$x(citeTxt.style, {textAlign: s.textR.length >13 ?'left':'center'
,wordWrap: s.textR.length >13 || /\s/.test(s.text) ?'normal':'break-word'
});
$q('.selText', citeTx).style.left = s.textR.length >13 ?'1.1em':'0'
var hh;
$x(citeTaT.style, hh={width: Math.floor(areaTaText)+50 +'px'
//, height:'1em'
//, marginLeft: -Math.floor(areaTaText /2 -10) +'px'
//, marginRight: -Math.floor(areaTaText /2 +10) +'px'
,overflow:'hidden'
});
$x(citeTaA.style
,{width: Math.floor(areaTaText)+50 +'px'
,height:'1em', overflow:'hidden'});
var initCite
,selC = selS;
(initCite = function(){ //сброс набора прежней цитаты
citeTaT.value = citeTaA.value = s.citeComm ||''; //восстановление поля
if(!selC)
selC ={chgLenPrev:0};
selC.taH1 =0;
})();
selC.tFI =0; //состояние selC.taFloat[]
var taH1 = selC.taH1 ||16 //высота _одной_ строки в textarea
,taParams;
(taParams = function(ev){ //подгонка размеров растущей области ввода в контексте
var tx = selC.val = ev ? citeTaT.value : s.citeComm||''
,txL = tx.length
,tASH = citeTaA.scrollHeight; //реальная высота введённого текста
citeTaA.value = tx;
s.hN.ciCom.userComments = tx; //фиксация набранного
selC.taFloat =[{h:{n:4,w:50}},{h:{n:10,w:128}},{h:{n:16,w:159}},{h:{n:24,w:238}}
,{v:{r:4,w:238}},{v:{r:5,w:375}},{v:{r:12,w:530}},{v:{r:16,w:690}}]; //Правила: 1) сохранять равенство ширин (w) соседних h и v; 2) состояния (h, v) располагать по возрастанию; 3) вначале всегда h (однострочные градации ширины). w - ширина поля, n - число символов, r - число строк
selC.taFlNmax =0; //поиск максимума .h.n
for(var i =0, iL = selC.taFloat.length; i < iL; i++)
if(selC.taFloat[i].h && selC.taFloat[i].h.n > selC.taFlNmax){
selC.taFlNmax = selC.taFloat[i].h.n;
selC.taFlImax = i;
}
if(!ev && selC){ //начальная установка (taH1 и фокус)
citeTa.style.left =0;
selC.lenPrev2 = selC.lenPrev = txL;
win.setTimeout(function(){
//citeTaT.focus();
selC.taH1 = citeTaA.scrollHeight -1 -2*isFx;
},1);
}
//'ev'.wcl(ev, !ev, {tx:tx, tASH:tASH || taH1},selC.tFI)
if( (function(h2){ //chkGrow=== проверка размеров содержимого поля ввода ===
var taS = selC.taFloat[selC.tFI];
for(var j in taS) var taSkey = j; //имя ключа состояния
if(taSkey !='h' && taSkey !='v')
wcl('Err: '+ 'ош. в выборе типа поля ввода');
txL = h2.tx.length;
taNS = Math.floor((h2.tASH +0.5)/ taH1); //(реальное) чис.строк поля ввода
//'taNS,tx'.wcl(taNS,tx, selC.taH1, taH1)
if(txL <= selC.taFlNmax){ //выбор 1-строчного варианта поля
for(var i =0, iL = selC.taFlImax +1; i < iL; i++)
if(txL <= selC.taFloat[i].h.n && (i==0 || i >0 && txL > selC.taFloat[i-1].h.n)){
selC.tFINew = i; break;}
}else{
for(var i = selC.taFlImax+1, iL = selC.taFloat.length+1; i < iL; i++)
if(taNS <= selC.taFloat[i].v.r && (i==selC.taFlImax+1 || i >selC.taFlImax+1 && taNS > selC.taFloat[i-1].v.r) ){
selC.tFINew = i; break;}
}
if(s.citeComm)
selC.tFI = Math.max(0, selC.tFINew -1);
//'i,txL,taFlNmax'.wcl(i, txL, selC.taFlNmax)
if( (selC.lenPrev2 < txL ^ selC.tFINew > selC.tFI) || Math.abs(txL - selC.chgLenPrev) < txL/8){ //консервативность смены
selC.tFINew = selC.tFI;
selC.lenPrev2 = selC.lenPrev;
selC.lenPrev = txL;
}
//'taNS'.wcl(h2.tASH, taNS, selC.tFINew)
if(selC.tFINew != selC.tFI){
selC.chgLenPrev = txL;
return!0;}
})({tx:tx, tASH:tASH || taH1})
|| !ev || Math.abs(tASH - selC.taHprev) < 6 ){ //обновл_ размеров
var taH2 = tASH ||16; //далее - высота (px) всех строк в поле ввода
citeTaA.style.height = (taH1 -1) +'px';
win.setTimeout(function(){
citeTaT.style.height = citeTa.style.height = ((selC.taHprev = citeTaA.scrollHeight) -1)+'px';
//'=citeTaA'.wcl(tASH, citeTaA.scrollHeight, citeTaA.value, selC.taHprev
// ,'||',taS, selC.tFINew);
citeTa.style.width = (taS && (taS.h && taS.h.w || taS.v.w))+'px';
citeTx.style.bottom = (selC.taHprev -3) +'px';
},1);
citeTa.style.height = (taH2 -1) +'px';
citeTx.style.bottom = (taH2 -3) +'px';
//'tFINew==='.wcl(selC.tFINew, taS, tASH, selC.taHprev, tASH / selC.taH1, selC.taH1)
if(typeof selC.tFINew =='number'&& ev || s.citeComm){
var taS = selC.taFloat[selC.tFINew];
citeTaT.style.width = citeTaA.style.width
= citeTa.style.width = (taS && (taS.h && taS.h.w || taS.v.w))+'px';
citeTa.style.left = Math.min(-((taS && (taS.h && taS.h.w || taS.v.w))/2 -43),0) +'px';
selC.tFI = selC.tFINew;
}
selC.taHprev = taH2;
}
})();
citeTaT.addEventListener('keypress',taParams,!1); //контроль за вводом символов
citeTaT.addEventListener('keyup',taParams,!1);
$x(citeTa.style, hh);
citeTxTa.style.display ='block';
$x(citeLst.style, {MaxWidth: Math.floor(areaText)+54 +'px'
,top: -citeLst.offsetHeight -2 +'px'});
},
normTa: function(s, t){ //нормализация поля ввода: вычисление ширины и высоты по содержимому
var citeTa = t.parentNode
,citeTxTa = citeTa.parentNode;
if(s !=null)
t.value = s;
},
htmlSelect: function(s, ev){ //===== оформить с захваченным HTML =====
$sp(ev);
},
edit: function(s, ev){ //===== редактировать область цитаты =====
setLocStor('composeLetter', {cite: s.textR});
if(/\/topic\/(add|edit)\//.test(lh)){
win.clearTimeout(wwPrevi);
fillLetter();
return;}
if((ev.ctrlKey || ev.cmdKey) ^ ev.shiftKey)
win.open(ROOT +'/topic/edit/'+ s.articleId +'/','_blank');
else
openInFrame({clientY: ev.clientY},{href: ROOT +'/topic/edit/'+ s.articleId +'/'});
$sp(ev);
},
mis: function(s){ //оформление ошибки
//hN.selContext = s; //сохранено состояние выделения (для след.оп. типа "письма")
var misType = s.misType = {mistake: 0, punctuation: 1, misprint: 2, stylistic: 3, wrongData: 4, citeComm: -1}
,selField = $q('.sele .selText', hNCiteList)
,selText = selField && selField.innerHTML; //текст выделения (возм-о, обраб-ный)
hNCiteList.removeChild($q('.sele', hNCiteList)); //удалить копию выделения
if(!hN.misId)
hN.misId = 1;
s.misId = hN.misId; //очередной Id выделения
$e({cl:'item'
,ht:'
'
+ '
'
+ (misType[s.cmd] >=0 ? misType[s.cmd]:'') +' '
+'
'+ (selText || s.textR) +' '
,apT: hNCiteList });
},
initLetter: function(ev, g, isComm){ //===== составить письмо ===== //g:{to,subj,cite}
//text, addressee, date, title, link, source, sourceLink //загрузить форму отправки письма
//для публикации письма в другом окне передаётся адрес с меткой времени и создаётся элемент хранилища с той же меткой. По получению элемент проверяется, используется и удаляется. Одновременно существует не более 1 объекта публикации письма. Формирование письма - ПЕРЕД отправкой, поэтому передаются 3 поля и метка времени. На случай отсутствия хранилища передаются 2 поля (укороченный текст и автор) и метка времени.
g = $x({to:'', subj:'', cite:'' }, g);
var s = selS
,receiver = g.to=='Enter username' || g.to== h.uName ?''
: (g.to && !g.cite && g.to || s.commAuthor || g.to);
'initLet'.wcl(g, receiver)
setLocStor('composeLetter',
$x(g, {cite: g.cite
+ (/\n$/.test(g.cite) || g.cite && g.cite.length ==0 || !g.cite ?'':'\n')
,noReceiver: !receiver
,text: s.val ||'' //введённый комментарий
,date: s.date
,commDate: s.commDate
,url: s.url
,commId: s.commId
,commAuthor: s.commAuthor}) );
var timeStmp = (+new Date()+'').replace(/(^\d{3}|\d{3}$)/g,'')
,hrf = (!isComm
? ROOT +'/conversations/'+(receiver?receiver+'/':'')
: s.url
)+'?time33='+ timeStmp
+(isComm ?'&cmd=insertComm':'')
+(!win.localStorage?'#'
+(g.to?'to='+ encodeURIComponent(g.to):'')
+(g.cite?(g.to?'&':'')+'text='+ encodeURIComponent( g.cite
+(g.cite && g.cite.length >500?'...':'') ):'')
:(s.commElemBottom ?'#'+ s.commElemBottom.id :'') );
'letter'.wcl(s, hrf)
if((ev.ctrlKey || ev.cmdKey) ^ ev.shiftKey)
win.open(hrf,'_blank');
else
openInFrame({clientY: ev.clientY},{href: hrf});
//внести шаблон данных
},
buildCite: function(s){
var cLIs = $qA('.item', hNCiteList);
for(var i =0, iL = cLIs.length; i < iL; i++)
$q('input[type="checkbox"][checked="checked"]', cLIs[i]);
var subj ='Замечания к "'+ s.title.substr(0, 40)+ (s.title.length >40?'...':'')+'"'
,foundMulti = 0//более 1 или тип 4
,foundSemi = 0 //не по одной ош. в категориях 1-3
,foundShe = 0 //1 шт. и ж. рода (тип 1-2)
,mistakE = 0
,misPrinT = 0
,stylisT = 0.0
,isSubSel =0 //есть ли суб-селекты
,isWrongSel =0 //есть ли механизм подчёркиваний и пометок ошибок
,mistSel =['ошибк'+ (mistakE?'а':'и') //перечислитель типов ошибок
,'опечатк'+ (misPrinT?'а':'и')
,'неверны'+ (stylisT?'й':'е') +' стилистически'+ (stylisT?'й':'е') +' оборот'+ (stylisT?'':'ы')
,'неверные данные'];
for(var i=3; i >= 0; i--) //удаление пустых строк
if(0)
mistSel.splice(i, 1);
var x = ' Здравствуйте, '+ s.author +'!\n'
+' В Вашей статье "
'
+ s.title.substr(0, 60) + (s.title.length >60 ?'...':'')
+' " от
'+ s.date +' обнаружен'
+ (foundMulti ?'ы'+ (foundSemi ?':':''):(foundShe ?'а':''))
+ mistSel.split(', ')
+ (isSubSel ?'(выделено синим цветом в цитате)':'') +'.\n'
+' На мой взгляд, текст следовало бы писать так, как отмечено'
+ (isWrongSel ?' красным цветом или подчёркиванием':'') +' в последующей строке.';
var aa='текст-цитата скорректированный текст (<текст_дополнительных пояснений>)'
+'С уважением, <своё_имя>.'
+'(К|Поправки к) статье|комментарию "<название>", <дата>';
}
};
if(/cmd=insertComm/.test(lh) && !win.opera) //дообработка комментария из localStorage
cmd.reply(0);
if(hS.killToTop.val)
addRules('.to_top{display:none!important}');
showSourceLang(topic,'add_label_lang'); //только метки языков к блокам кодов
showSourceLang(comments,'add_label_lang');
(function(){ //единый таймер контроля: показ оставшихся голосов после отправки оценок и т.д.
if(chargeDiv && !/