PageSourceSearch

https://breeds-info.ru/dogmem/PostEdit.js?1778832154

js breeds-info.ru collected 2026-10-08 13:25:08 UTC 51,402 bytes, 1,231 lines download raw bytes

1let  hashtagsSrc = []
2
3document.addEventListener('DOMContentLoaded', function ()
4{
5    onLoadDocumentEditPost()
6}, false);
7function onLoadDocumentEditPost()
8{
9    let maskEditPost = document.getElementById('maskEditPost')
10    maskEditPost.querySelector('.post.editpost .post_fotopanel').addEventListener('click', getfotoUpload)
11    maskEditPost.querySelector('.fotoupload').addEventListener('change', fotoUpload)
12    maskEditPost.querySelector('.addfoto').addEventListener('click', getfotoUpload)
13    maskEditPost.querySelector('textarea').addEventListener('paste', pastePhoto);
14    maskEditPost.querySelector('.addvideo').addEventListener('click', winLinkVideoShow)
15    maskEditPost.querySelector('.tools').addEventListener('click', winToolsShow)
16    document.querySelector('#fotopaneleditphoto .uphotptools .savesetimg').addEventListener('click', crop_saveImg)
17    document.querySelector('#fotopaneleditphoto .uphotptools .rotate').addEventListener('click', rotateimg)
18    document.querySelector('#fotopaneleditphoto .uphotptools .rotate_l').addEventListener('click', rotateimg)
19    document.querySelectorAll('#fotopaneleditphoto .uphotptools .a_r').forEach(function (el) {
20        el.addEventListener('click', setaspect)
21    })
22    maskEditPost.querySelector('.inserthashtag').addEventListener('keyup', setNewHashTag)
23    maskEditPost.querySelector('.addvideolink .linkVideoY').addEventListener('input', enableAddVideo)
24    document.getElementById('btnAddLinkVideo').addEventListener('click', addVideoIframe)
25    document.getElementById('btnLoadVideo').addEventListener('click', addLoadVideoFile)
26
27    //maskEditPost.querySelector('textarea[data-field="posttext"]').addEventListener('keydown', resizetexarea);
28
29    maskEditPost.querySelectorAll('.post_title textarea, .post_content textarea').forEach(function (el)
30    {
31        el.addEventListener('paste', pastePhoto)
32    })
33    maskEditPost.querySelectorAll('.editpost .endedit, .editpost .sendpost').forEach(function (el)
34    {
35        el.addEventListener('click', savePost)
36    })
37    maskEditPost.querySelector('.closediv').addEventListener('click', closeMaskEditPost)
38    maskEditPost.querySelectorAll('.editfield, .edittosocial').forEach(function (el)
39    {
40        el.addEventListener('input', changeField)
41    })
42    document.querySelector('.inserthashtag').addEventListener('keyup', function ()
43    {
44        if (event.keyCode === 13)
45        {
46            setHashTag(event.target, event.target.value)
47        }
48    })
49}
50
51let setHashtags = function (data)
52{
53    let dataHt = JSON.parse(data);
54    for (var i = 0; i < dataHt.length; ++i)
55    {
56        hashtagsSrc.push(dataHt[i]);
57    }
58}
59
60const autoCompleteJS = new autoComplete({
61    data: {selector: ".inserthashtag", placeHolder: "Начните вводить хештег", src: hashtagsSrc, keys: ["value"]}, highlight: true, maxResults: 20,
62    events: {
63        input: {
64            selection(event)
65            {
66                const feedback = event.detail;
67                const selection = feedback.selection.value[feedback.selection.key];
68                setHashTag(autoCompleteJS.input, selection)
69            },
70        },
71    }
72});
73
74
75let setHashTag = function (t, v)
76{
77    event.preventDefault();
78    v = v.trim()
79    if (v != '')
80    {
81        let hts = t.closest('.post_hashtags').querySelector('.hashtags')
82
83        let foundel = false
84        if (hts.querySelectorAll('.hashtag .hashtegtext')) {
85        hts.querySelectorAll('.hashtag .hashtegtext').forEach(function (el)
86        {
87            if (el.innerText == v)
88            {
89                selectColorAria(el.closest('.hashtag'))
90                foundel = true
91                return true
92            }
93        })}
94        if (!foundel)
95        {
96            let ht = document.querySelector('.hashtag.shablon').cloneNode(true)
97            ht.classList.remove('shablon')
98            ht.querySelector('.hashtegtext').innerText = v
99            ht.querySelector('.closediv').addEventListener('click', closediv)
100            selectColorAria(ht.closest('.hashtag'))
101            hts.insertAdjacentElement('beforeend', ht)
102            t.value = ''
103        }
104    }
105     t.closest('.post').classList.add('changed');
106
107}
108
109function dragDrop()
110{
111    var el = event.currentTarget, parentEl = el.closest('.postStoryBlock, .post_fotopanel')
112    el.insertAdjacentElement('beforebegin', parentEl.querySelector('.dragselect'))
113    parentEl.querySelector('.dragselect').classList.remove('dragselect');
114    parentEl.querySelectorAll('.dragover').forEach(function(el){el.classList.remove('dragover');})
115    event.stopPropagation();
116    return false;
117}
118function dragEnter()
119{
120    event.preventDefault();
121    return true;
122}
123function dragOver()
124
125{ let t=event.target;
126    if (!t.draggable)
127    {
128        t=t.closest([draggable="true"])
129    }
130    if ( t) {
131    t.closest('.postStoryBlock, .post_fotopanel').querySelectorAll('.dragover').forEach(function(el){el.classList.remove('dragover');})
132    t.classList.add("dragover"); }
133    event.preventDefault();
134    return true;
135}
136function dragStart()
137{
138    event.dataTransfer.effectAllowed = 'move';
139    event.currentTarget.classList.add('dragselect');
140    return true;
141}
142function dragEnd()
143{
144    event.target.classList.remove("dragselect");
145}
146 function dragLeave()
147 {
148     event.target.classList.remove("dragselect");
149
150 }
151
152function winToolsShow()
153{
154    var blockTools = event.target.closest('.post.editpost').querySelector('.panelAdmin')
155//    if (blockTools.closest('.post.editpost')!=event.target.closest('.post.editpost'))
156//    {
157//        event.target.closest('.post.editpost').insertAdjacentElement('beforeend',blockTools)
158//    }
159    if (blockTools.classList.toggle('show'))
160    {
161        event.stopPropagation();
162        outsidePopupEvent(blockTools)
163
164    }
165
166}
167function addLoadVideoFile()
168{
169    var bl = this.closest('.post.editpost'), fpanel = bl.querySelector('.post_fotopanel')
170    var file = document.getElementById('filevideo').files[0];
171    if (file.size / 1024 / 1024 > 15)
172    {
173        winMessage.show({content: 'Ошибка. Слишком большой файл'});
174        return
175    }
176    var url = URL.createObjectURL(file);
177
178    var newVideo = document.querySelector('.uploadedvideo.video.shablon').cloneNode(true), iframe = newVideo.querySelector('video');
179
180    iframe.setAttribute('src', url);
181    iframe.onload = function () {        window.URL.revokeObjectURL(this.src);    }
182    newVideo.classList.remove('shablon');
183
184    fpanel.insertAdjacentElement('beforeend', newVideo);
185    var finput = document.getElementById('filevideo').cloneNode(true);
186    document.getElementById('filevideo').value = [];
187    finput.removeAttribute('id');
188    finput.style.display = 'none';
189    newVideo.insertAdjacentElement('beforeend', finput)
190    PhotoPanelAddEventListener(newVideo)
191}
192
193function addVideoIframe()
194{
195    let  bl = this.closest('.post.editpost'), fpanel = bl.querySelector('.post_fotopanel'),
196            idy = linkvideo_parser(document.querySelector('#maskEditPost  .addvideolink .linkVideoY').value);
197    if (!idy)
198        return;
199    if (fpanel.querySelector('.video iframe[data-id="' + idy.id + '"]'))
200        return
201
202
203    var newVideo = document.querySelector('.uploadedvideo.shablon').cloneNode(true), iframe = newVideo.querySelector('iframe');
204    if (idy.n === 'youtube') {
205        iframe.setAttribute('src', 'https://www.youtube.com/embed/' + idy.id);
206    }
207    if (idy.n === 'vk')
208    {
209        iframe.setAttribute('src', 'https://vk.com/video_ext.php?oid=' + idy.all[2] + '&id=' + idy.all[3] + '&hd=2');
210    }
211        if (idy.n === 'rutube')
212    {
213        iframe.setAttribute('src', 'https://www.rutube.com/play/embed/' + idy.id);
214    }
215
216    newVideo.classList.remove('shablon');
217    iframe.setAttribute('data-id', idy.id);
218    iframe.setAttribute('data-type', idy.n);
219    document.querySelector('#maskEditPost  .addvideolink .linkVideoY').value = '';
220    fpanel.insertAdjacentElement('beforeend', newVideo)
221    PhotoPanelAddEventListener(newVideo)
222
223}
224function linkvideo_parser(url)
225{
226    var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#&?]*).*/;
227    var match = url.match(regExp);
228    var rez = {};
229    if (match && match[7].length == 11) {
230        rez.n = 'youtube';
231        rez.id = match[7];
232        return rez;
233    }
234
235        regExp =/^https:\/\/vk\.com\/(?:video|clip)((.\d+)_(\d+))/i;
236        match = url.match(regExp);
237        if (match && match[3]) {
238            rez.n = 'vk';
239            rez.id = match[1];
240            rez.all = match;
241            return rez
242        }
243
244            regExp =/^https:\/\/rutube\.ru\/(:video|shorts)\/([^#]*)\//i;
245        match = url.match(regExp);
246        if (match && match[2]) {
247            rez.n = 'rutube';
248            rez.id = match[2];
249            return rez
250        } else
251        { return false}
252
253
254//rutube.ru/video/
255
256
257}
258
259function youtube_parser(url)
260{
261    var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#&?]*).*/;
262    var match = url.match(regExp);
263    return (match && match[7].length == 11) ? match[7] : false;
264}
265
266function enableAddVideo()
267{
268    document.querySelector('.addvideolink  .messagealert').classList.add('hiden');
269    if (this.value != '')
270    {
271        let  idy = linkvideo_parser(this.value);
272        if (idy)
273        {
274            if (document.querySelector('#maskEditPost .video iframe[data-id="' + idy.id + '"]'))
275            {
276                document.querySelector('.addvideolink .messagealert').innerText = 'Это видео уже добавлено.';
277                document.querySelector('.addvideolink .messagealert').classList.remove('hiden');
278
279            }
280            document.querySelector('.addvideolink .messagealert').classList.add('hiden');
281            document.getElementById('btnAddLinkVideo').disabled = false
282        } else
283        {
284            document.getElementById('btnAddLinkVideo').disabled = true;
285            document.getElementById('btnAddLinkVideo').classList.add('noshow');
286        }
287
288    }
289}
290function PhotoPanelAddEventListener(el)
291{
292    el.addEventListener('click', showWinEditPhoto)
293    el.querySelector('.closediv').addEventListener('click', closediv)
294    el.setAttribute('draggable', "true")
295  // el.querySelectorAll('img,video,iframe').forEach(function(e){e.setAttribute('draggable', "true")})
296    el.addEventListener('dragstart', dragStart);
297    el.addEventListener('dragend', dragEnter);
298    el.addEventListener('drop', dragDrop);
299    el.addEventListener('dragover', dragOver);
300}
301function editPost(postFrom, id, idStory = 0)
302{
303    if (curUser > 0)
304    {
305        if (postFrom && postFrom.closest('.post').getAttribute('data-typepost') === 'story')
306        {
307            editStory(postFrom, id)
308            return;
309        }
310        if (postFrom)
311        {
312            if (postFrom.getAttribute('data-typepost') === 'sale')
313            {
314                window.open("../sale/editAD/" + postFrom.getAttribute('data-a'));
315                return;
316            }
317        }
318        if (hashtagsSrc.length === 0)
319        {
320            postAjax('../dogmem/aj/gethashteg.php', '', setHashtags);
321        }
322        let maskedit = document.getElementById('maskEditPost')
323        let editPostbl = maskedit.querySelector('.post.editpost')
324        editPostbl.setAttribute('data-id', id)
325        if (idStory > 0)
326        {
327            editPostbl.setAttribute('data-idStory', idStory)
328            editPostbl.setAttribute('data-typepost', 'storyPiece')
329        } else {
330            editPostbl.setAttribute('data-typepost', 'post')
331        }
332        maskedit.style.height = window.innerHeight + 'px';
333        editPostbl.querySelectorAll(' .post_fotopanel .uploadedfoto,.post_fotopanel .uploadedvideo, .hashtag').forEach(function (el)
334        {
335            el.remove()
336        })
337
338        editPostbl.querySelectorAll('input,textarea').forEach(function (el)
339        {
340            el.value = '';
341        })
342        document.getElementById('btnAddLinkVideo').disabled = true
343        if (id == 0)                           ///////////////////////////////НОВЫЙ ///////////////////////////////////////////
344        {
345            editPostbl.classList.add('new')
346
347        } else                                  ///////////////////////////////РЕДАКТОР ///////////////////////////////////////////
348        {
349            if (postFrom)
350            {
351                editPostbl.setAttribute('data-typepost', postFrom.getAttribute('data-typepost'))
352
353                if (postFrom.getAttribute('data-onlyMyLenta') && editPostbl.querySelector('input[data-field="onlyMyLenta"]')) {
354                    editPostbl.querySelector('input[data-field="onlyMyLenta"]').checked = postFrom.getAttribute('data-onlyMyLenta') == 1;
355                } else {
356                    editPostbl.querySelector('input[data-field="onlyMyLenta"]').checked = false;
357                }
358                editPostbl.querySelector('textarea[data-field="posttext"]').value = postFrom.querySelector('.post_content').innerHTML.replace(/<br\s*\/?>/mg, "\n").trim().replace(/<button(.+?)<\/button>/ismg, '').replace(/(<([^>]+)>)/ig, "")
359                editPostbl.querySelector('.post_title textarea').value = postFrom.querySelector('.post_title').innerText;
360                if ((postFrom.getAttribute('data-typepost') === 'post' || postFrom.getAttribute('data-typepost') === 'storyPiece'))   ///////////////////Доступны фото и видео
361                {
362                    postFrom.querySelectorAll('.post_fotopanel .slider__items>*').forEach(function (el)
363                    {
364                        let newPhotopanel = el.cloneNode(true)
365                        if (newPhotopanel.classList.contains('video'))
366                        {
367                            var vframe = null;
368                            if (newPhotopanel.querySelector('iframe'))
369                            {
370                                vframe = newPhotopanel.querySelector('iframe');
371                                newPhotopanel.insertAdjacentHTML('afterbegin', '<div class="closediv" type-close="remove"></div>')
372                                newPhotopanel.classList.add('iframe')
373                            } else
374                            {
375                                if (newPhotopanel.querySelector('video'))
376                                {
377                                    vframe = newPhotopanel.querySelector('video');
378                                    newPhotopanel.insertAdjacentHTML('afterbegin', '<div class="closediv" type-close="deletephoto"></div>')
379                                    newPhotopanel.classList.add('video')
380                                }
381                            }
382                            vframe.onload = function () {
383                                videoPause(vframe);
384                            }
385                            newPhotopanel.classList.add('uploadedvideo')
386                            vframe.setAttribute('width', 150)
387                            vframe.setAttribute('height', 120)
388                        } else //picture
389                        {
390                            newPhotopanel.classList.add('uploadedfoto')
391
392                            newPhotopanel.insertAdjacentHTML('afterbegin', '<div class="closediv" type-close="deletephoto"></div>')
393                        }
394
395                        newPhotopanel.classList.remove('hiden')
396                        newPhotopanel.classList.remove('slider__item')
397                        editPostbl.querySelector('.post_fotopanel ').insertAdjacentElement("beforeend", newPhotopanel)
398
399                        PhotoPanelAddEventListener(newPhotopanel)
400
401                    })
402
403                }
404
405                setHashtag(postFrom, editPostbl)
406                let avtor = postFrom.querySelector('.avtorlink')
407                if (avtor)
408                {
409                    if (avtor.innerText != '')
410                    {
411                        editPostbl.querySelector('#avtor').value = avtor.innerText
412                    }
413                    if (avtor.tagName == 'A')
414                    {
415                        editPostbl.querySelector('#avtorlink').value = avtor.getAttribute('href')
416                    }
417                } else
418                {
419                    if (postFrom.querySelector('.avtor'))
420                    {
421                        editPostbl.querySelector('#avtor').value = postFrom.querySelector('.avtor').innerText
422                    }
423                }
424            } else
425            {
426                if (idStory > 0)
427                {
428                    postAjax("../dogmem/aj/getPieceStory.php", 'idPiece=' + id, fillDataPiece);
429                    function fillDataPiece(d)
430                    {
431                        var data = JSON.parse(d)
432                        editPostbl.setAttribute('data-typepost', 'storyPiece');
433                        editPostbl.querySelector('input[data-field="suspendDate"]').value = data.post.suspendDate;
434                        editPostbl.querySelector('input[data-field="onlyMyLenta"]').checked = (data.post.onlyMyLenta == 1);
435                        editPostbl.querySelector('textarea[data-field="posttext"]').value =(data.post.posttext)? data.post.posttext.replace(/<br\s*\/?>/mg, "\n").trim().replace(/(<([^>]+)>)/ig, ""):'';
436                        editPostbl.querySelector('textarea[data-field="title"]').value = data.post.title;
437                        editPostbl.querySelector('#avtorlink').value = data.post.avtorlink;
438                        editPostbl.querySelector('#avtor').value = data.post.avtor;
439                        for (let i = 0; i < data.media.length; i++) {
440                            var blockMedia = null, blockMediaImg = null;
441                            switch (data.media[i].mediatype) {
442                                case 'picture':
443                                {
444                                    blockMedia = document.querySelector('.uploadedfoto.shablon').cloneNode(true);
445                                    blockMediaImg = blockMedia.querySelector('img');
446                                    blockMediaImg.setAttribute('src', '../' + data.media[i].path + data.media[i].media)
447                                    break;
448                                }
449                                case 'video':
450                                {
451                                    blockMedia = document.querySelector('.uploadedvideo.video.shablon').cloneNode(true);
452                                    blockMediaImg = blockMedia.querySelector('video');
453                                    blockMediaImg.setAttribute('src', '../' + data.media[i].path + data.media[i].media)
454                                    break;
455                                }
456                                case 'iframeYoutube':
457                                {
458                                    blockMedia = document.querySelector('.uploadedvideo.iframe.shablon').cloneNode(true);
459                                    blockMediaImg = blockMedia.querySelector('iframe');
460                                    blockMedia.querySelector('iframe').setAttribute('data-type', 'youtube')
461                                     blockMedia.querySelector('iframe').setAttribute('data-id', data.media[i].media)
462                                    blockMediaImg.setAttribute('src', 'https://www.youtube.com/embed/'+data.media[i].media+'?enablejsapi=1&rel=0&iv_load_policy=3')
463                                    break;
464                                }
465                                case 'iframeVK':
466                                {
467                                    blockMedia = document.querySelector('.uploadedvideo.iframe.shablon').cloneNode(true);
468                                    blockMediaImg = blockMedia.querySelector('iframe');
469                                    blockMedia.querySelector('iframe').setAttribute('data-type', 'vk')
470                                    blockMedia.querySelector('iframe').setAttribute('data-id', data.media[i].media)
471                                    let   m = data.media[i].media.split("_");
472                                     blockMediaImg.setAttribute('src', 'https://vk.com/video_ext.php/?oid='+m[0]+'&id='+m[1])
473                                    break;
474                                }
475                            }
476                            blockMedia.setAttribute('data-num', data.media[i].n)
477                            blockMedia.querySelector('.photo_caption').innerText = data.media[i].caption;
478                            blockMedia.classList.remove('hiden', 'new', 'shablon')
479                            blockMediaImg.setAttribute('data-filename', data.media[i].media)
480                            editPostbl.querySelector('.post_fotopanel').insertAdjacentElement('beforeend', blockMedia)
481                            PhotoPanelAddEventListener(blockMedia)
482                        }
483                    }
484
485                }
486            }
487
488        }
489            if (typeof setBlockPostToSocial === 'function')
490        {
491            setBlockPostToSocial(editPostbl,postFrom)
492        }
493
494
495
496
497        document.body.style.overflow = 'hidden';
498        maskedit.classList.remove('hiden')
499        lentaHistory.push({type: 'hash', name: "editpost", el: "maskslider", f: "closeMaskEditPost()"})
500        history.pushState(null, "", window.location.origin + window.location.pathname + getSearchHash());
501        maskedit.querySelector('.panelfullpost').style.width = document.querySelector('.lenta').offsetWidth + 'px';
502        setEmoji(editPostbl)
503        enbleAddPhoto(editPostbl)
504        enabledBlockPost(editPostbl)
505    } else
506    {
507        if (typeof showPanelReg === 'function')
508        {
509            showPanelReg()
510        }
511}
512}
513
514function enabledBlockPost(editPostbl)
515{
516    let toolsblock = editPostbl.parentNode.querySelector('.toolspanel.bottom')
517
518    if (!(editPostbl.getAttribute('data-typepost') === 'post' || editPostbl.getAttribute('data-typepost') === 'storyPiece'))
519    {
520//        editPostbl.querySelector('.post_fotopanel').classList.add('hiden')
521//        editPostbl.querySelector('#avtor').classList.add('hiden')
522//        editPostbl.querySelector('#avtorlink').classList.add('hiden')
523//
524//        toolsblock.querySelector('.addvideo').classList.add('hiden')
525//        toolsblock.querySelector('.addfoto').classList.add('hiden')
526    } else
527    {
528        editPostbl.querySelector('.post_fotopanel').classList.remove('hiden')
529        editPostbl.querySelector('#avtor').classList.remove('hiden')
530        editPostbl.querySelector('#avtorlink').classList.remove('hiden')
531
532        toolsblock.querySelector('.addvideo').classList.remove('hiden')
533        toolsblock.querySelector('.addfoto').classList.remove('hiden')
534    }
535    if (editPostbl.getAttribute('data-typepost') === 'storyPiece')
536    {
537        editPostbl.querySelector('.toolspanel .tools').classList.add('hiden')
538        editPostbl.querySelector('.toolspanel.bottom .sendpost').innerText = 'Сохранить эпизод'
539    } else
540    {
541        editPostbl.querySelector('.toolspanel .tools').classList.remove('hiden')
542        editPostbl.querySelector('.toolspanel.bottom .sendpost').innerText = 'Опубликовать'
543    }
544}
545
546
547function showWinEditPhoto()
548{
549    if (event.target.classList.contains('closediv'))
550    {
551        return false;
552    }
553    p = event.target.closest('.uploadedvideo, .uploadedfoto');
554    event.preventDefault()
555    let fotopaneleditphoto = document.getElementById('fotopaneleditphoto');
556    fotopaneleditphoto.querySelector('.closediv').addEventListener('click', closePhotoPanelEdit)
557    lentaHistory.push({type: 'hash', name: "fotopaneleditphoto", f: "closePhotoPanelEdit()"})
558    history.pushState(null, "", window.location.origin + window.location.pathname + getSearchHash());
559    var paneledit = fotopaneleditphoto.querySelector('.uploadedfoto')
560    if (p.classList.contains('uploadedfoto')) {
561
562
563        if (paneledit.querySelectorAll('img').length == 0)
564        {
565            paneledit.insertAdjacentHTML('afterbegin', '<img src="">')
566        }
567        let img = paneledit.querySelector('img')
568
569        croppable = false;
570
571        img.setAttribute('src', "")
572        img.setAttribute('src', p.querySelector('img').getAttribute('src'))
573        let    uphotptools = paneledit.querySelector('.uphotptools'), displaybtn = 'block'
574        if (p.classList.contains('new'))
575        {
576            img.onload = setcrop;
577        } else {
578            displaybtn = 'none'
579        }
580        uphotptools.querySelectorAll('button:not(.savesetimg)').forEach(function (el) {
581            el.style.display = displaybtn;
582        })
583
584
585
586    } else
587    {
588        if (p.querySelector('iframe'))
589        {
590
591            p.querySelector('iframe').setAttribute('width', 400)
592            p.querySelector('iframe').setAttribute('height', 300)
593            paneledit.insertAdjacentElement('afterbegin', p.querySelector('iframe'))
594        }
595        if (p.querySelector('video'))
596        {
597
598            p.querySelector('video').setAttribute('width', 400)
599            p.querySelector('video').setAttribute('height', 300)
600            paneledit.insertAdjacentElement('afterbegin', p.querySelector('video'))
601        }
602        if (paneledit.querySelector('img'))
603        {
604            paneledit.querySelector('img').remove()
605        }
606        paneledit.querySelector('.uphotptools .rotate_l').style.display = 'none'
607        paneledit.querySelector('.uphotptools .rotate').style.display = 'none'
608
609    }
610    document.querySelector('#fotopaneleditphoto .captionPhoto').value = p.querySelector('.photo_caption').innerHTML;
611    p.classList.add('edit')
612    fotopaneleditphoto.classList.remove('hiden')
613    function setcrop()
614    {
615        if (!croppable)
616        {
617            var pr = this.width / this.naturalWidth
618            var minpx = pr * 400 + 2;
619            cropper = new Cropper(this, {
620                viewMode: 2, background: false, modal: false, minCropBoxHeight: minpx, minCropBoxWidth: minpx,
621                ready: function ()
622                {
623                    croppable = true;
624                },
625            });
626        }
627    }
628}
629function setHashtag(from, to)
630{
631    let  httegs = from.querySelectorAll('.post_hashtags a')
632    if (httegs.length)
633        httegs.forEach(function (el)
634        {
635            let ht = document.querySelector('.hashtag.shablon').cloneNode(true)
636            ht.classList.remove('shablon')
637            ht.querySelector('.hashtegtext').innerText = el.innerText;
638            to.querySelector('.hashtags').insertAdjacentElement('beforeend', ht)
639            ht.querySelector('.closediv').addEventListener('click', function ()
640            {
641                this.closest('.hashtag').remove()
642            })
643        })
644}
645function closePhotoPanelEdit()
646{
647    let parentimg = document.querySelector('.editpost  .post_fotopanel .edit')
648    document.getElementById('fotopaneleditphoto').classList.add('hiden')
649    parentimg.classList.remove('edit')
650
651
652    if (parentimg.classList.contains('uploadedvideo')) {
653        if (document.querySelector(' #fotopaneleditphoto iframe'))
654        {
655            parentimg.insertAdjacentElement('afterbegin', document.querySelector(' #fotopaneleditphoto iframe'))
656            parentimg.querySelector('iframe').setAttribute('width', 150)
657            parentimg.querySelector('iframe').setAttribute('height', 120)
658        }
659        if (document.querySelector(' #fotopaneleditphoto video'))
660        {
661            parentimg.insertAdjacentElement('afterbegin', document.querySelector(' #fotopaneleditphoto video'))
662            parentimg.querySelector('video').setAttribute('width', 150)
663            parentimg.querySelector('video').setAttribute('height', 120)
664        }
665    }
666
667
668
669
670    if (typeof cropper !== "undefined" && cropper !== null) {
671        cropper.destroy();
672        croppable = false
673        cropper = null
674    }
675    lentaHistoryBack()
676
677}
678
679
680function  crop_saveImg()
681{
682    let parentimg = document.querySelector('.editpost  .post_fotopanel .edit'), img = null
683    if (!parentimg) {
684        return
685    }
686
687    if (parentimg.classList.contains('new') && parentimg.classList.contains('uploadedfoto'))
688    {
689        img = parentimg.querySelector('img');
690        if (!croppable || (!img))
691        {
692            return;
693        }
694        let  croppedCanvas = cropper.getCroppedCanvas();
695        img.src = croppedCanvas.toDataURL();
696        cropper.destroy()
697        cropper = null
698
699    }
700    if (parentimg.querySelector('.photo_caption').innerHTML != document.querySelector('#fotopaneleditphoto .captionPhoto').value)
701    {
702        parentimg.querySelector('.photo_caption').innerHTML = document.querySelector('#fotopaneleditphoto .captionPhoto').value;
703        parentimg.classList.add('changenum')
704    }
705    document.querySelector('#fotopaneleditphoto .captionPhoto').value = '';
706    closePhotoPanelEdit()
707}
708function setaspect()
709{
710    let parentBtn = event.target.closest('.uphotptools')
711    if (event.target.classList.toggle('selected'))
712    {
713        parentBtn.querySelectorAll('.selected').forEach(function (el)
714        {
715            if (event.target !== el) el.classList.remove('selected')
716        })
717        if (event.target.classList.contains('aspect4_3'))
718        {
719            cropper.setAspectRatio(4 / 3)
720        }
721        if (event.target.classList.contains('aspect3_4'))
722        {
723            cropper.setAspectRatio(3 / 4)
724        }
725    } else
726    {
727        if (parentBtn.querySelectorAll('.selected').length === 0)
728        {
729            cropper.setAspectRatio(null)
730        }
731    }
732}
733
734function rotateimg()
735{
736    if (event.target.classList.contains('rotate_l'))
737    {
738        cropper.rotate(-90)
739    } else
740    {
741        cropper.rotate(90)
742    }
743}
744
745
746
747
748
749
750function changeField()
751{
752    event.target.classList.add('changed');
753}
754
755
756
757
758function closeMaskEditPost()
759{
760
761    document.body.style.overflow = '';
762    document.getElementById('maskEditPost').classList.add('hiden')
763    removeEmoji(document.getElementById('maskEditPost').querySelector('.post'))
764    lentaHistoryBack()
765}
766
767function savePost()
768{
769    if (this.classList.contains('endedit'))
770    {
771        closeMaskEditPost()
772        return
773    }
774    let  arrf = [], arrv = [], arrt = [], arrvideo = [], posteditblock = this.closest('.post.editpost'), postType = posteditblock.getAttribute('data-typepost');
775    posteditblock.querySelectorAll('.post_fotopanel .new.deletephoto').forEach(function (el) {
776        el.remove()
777    })
778    posteditblock.querySelectorAll('.post_fotopanel .deletephoto').forEach(function (el) {
779        posteditblock.querySelector('.post_fotopanel').insertAdjacentElement('beforeend', el)
780    })
781    posteditblock.querySelectorAll('.post_fotopanel>*').forEach(function (el, index) {
782
783        if (Number(el.getAttribute('data-num')) != index + 1) {
784            el.classList.add('changenum');
785            el.setAttribute('data-num', index + 1);
786        }
787
788    })
789    let numAction = posteditblock.querySelectorAll('.post_fotopanel>*').length + 1;
790    posteditblock.querySelectorAll('.editfield.changed').forEach(function (el)
791    {
792        arrf.push(el.getAttribute('data-field'));
793        arrv.push(setvalfield(el));
794        arrt.push(el.getAttribute('data-type'));
795    });
796
797    if (postType === 'storyPiece')
798    {
799        arrf.push('namearticle');
800        arrv.push('storyPiece');
801        arrt.push('text');
802
803        arrf.push('mainPost');
804        arrv.push(posteditblock.getAttribute('data-idStory'));
805        arrt.push('int');
806
807    }
808    let htags = [], htO = posteditblock.querySelectorAll('.hashtags .hashtag .hashtegtext');
809    if (htO.length > 0)
810    {
811        htO.forEach(function (el)
812        {
813            htags.push(el.innerText)
814        })
815
816        arrf.push('hashtag');
817        arrv.push(htags.join("; "));
818        arrt.push('text');
819    }
820    var videobl = posteditblock.querySelectorAll('.uploadedvideo iframe ');
821    if (videobl.length > 0)
822    {
823        videobl.forEach(function (el)
824        {
825            var datav = {};
826            datav['id'] = el.getAttribute('data-id');
827            datav['type'] = el.getAttribute('data-type');
828            datav['n'] = el.closest('.uploadedvideo').getAttribute('data-num');
829            datav['caption'] = el.closest('.uploadedvideo').querySelector('.photo_caption').innerHTML
830            arrvideo.push(datav);
831        })
832    }
833
834
835    if (arrf.length > 0 || arrvideo.length > 0 || posteditblock.querySelectorAll('.uploadedfoto,.uploadedvideo,.changenum').length > 0)
836    {
837
838        winMessage.show({ProgressBarPos: 0, SetnumAction: numAction});
839        winMessage.show({content: 'Отправляю'});
840        let id = posteditblock.getAttribute('data-id')
841        var data = {};
842        data['id'] = id;
843        data['fields'] = arrf;
844        data['values'] = arrv;
845        data['types'] = arrt;
846        data['video'] = arrvideo;
847        data['table'] = 'postlenta';
848        postAjaxJson("../dogmem/aj/edittablefields.php", data, saveResult);
849        function saveResult(data)
850        {
851            winMessage.show({ProgressBarPosPlus: 1});
852            let d = JSON.parse(data);
853            if (Number(d['id']) > 0)
854            {
855                var postblock = null;
856                posteditblock.setAttribute('data-id', d['id'])
857                if (postType != 'storyPiece') {
858                    if (id == 0)
859                    {  ////////////НОВЫЙ ПОСТ
860                        postblock = document.querySelector('.post.shablon').cloneNode(true)
861                        postblock.setAttribute('post_cuser', "")
862                        postblock.classList.remove('shablon')
863                        document.querySelector('.lenta').insertAdjacentElement('afterbegin', postblock)
864                        postblock.setAttribute('data-id', d['id'])
865                        postblock.setAttribute('data-n', 1)
866                        seteventToPost();
867                        postblock.querySelector('.flexdiv[post_owner]').setAttribute('data-id', document.querySelector('#maindiv').getAttribute('data-iduser'))
868                        postblock.querySelector('.postfooter .menucomment').setAttribute('data-id', d['id'])
869
870                    } else
871                    { //////////// ПОСТ ОТРЕДАКТИРОВАН
872                        postblock = document.querySelector('.post[post_cuser]:not(.editpost)[data-id="' + id + '"]')
873                    }
874                }
875                videobl.forEach(function (el)
876                {
877                    el.classList.remove('loading', 'changenum')
878                })
879                saveMedia(posteditblock, postblock)
880                if (posteditblock.querySelector('.plan_posttosocial')&&typeof (savePostToSocial) === "function")
881                {savePostToSocial(posteditblock)}
882            } else
883            {
884                winMessage.show({content: 'Ошибка при сохранении. ' + d['error'], append: true});
885            }
886
887        }
888
889    } else
890    {  if (posteditblock.querySelector('.plan_posttosocial')&&typeof (savePostToSocial) === "function")
891                {savePostToSocial(posteditblock)}
892        winMessage.close({CloseAfter: 1000})
893    }
894
895    function saveMedia(posteditblock, post)
896    {
897        posteditblock.querySelectorAll('.post_fotopanel .new.deletephoto').forEach(function (el)
898        {
899            el.remove()
900        })
901
902        let id = posteditblock.getAttribute('data-id'), mediaBlocks = posteditblock.querySelectorAll('.post_fotopanel>*'), action = 10, num = 1;
903
904        mediaBlocks.forEach(function (el, index)
905        {
906            action = 10;
907            num = el.getAttribute('data-num');
908            var caption = el.querySelector('.photo_caption').innerHTML
909            if (el.classList.contains('uploadedvideo') && el.classList.contains('iframe'))
910            {
911// ничего, уже отправлено
912            } else
913            {
914                if (el.classList.contains('changenum'))
915                {
916                    action = 0;
917                }
918                if (el.classList.contains('deletephoto'))
919                {
920                    action = -1;
921                }
922                if (el.classList.contains('new'))
923                {
924                    action = 1;
925                }
926            }
927
928            if (action < 10) {
929                el.classList.add('loading');
930                if (el.classList.contains('uploadedfoto'))
931                {
932                    var valuesrc = el.querySelector('img').getAttribute('src'), filename = el.querySelector('img').getAttribute('data-filename');
933                    winMessage.show({content: 'Загружаю фото №' + num, append: false, possiblClose: false});
934                    postAjax("../breedadmin/aj/uploadfotocrop.php", 'id=' + id + '&action=' + action + '&ownerphoto=post&value=' + valuesrc + '&fotoname=фото к пост ' + id + '&filename=' + filename + '&num=' + num + '&caption=' + caption, photoOnLoad);
935                }
936                ///////////////////*************************************************/////////////////////////////********
937                if (el.classList.contains('uploadedvideo') && el.classList.contains('video'))
938                {
939                    var formData = new FormData(document.getElementById('forvideo'));
940                    if (action === 1)
941                    {formData.append("file", el.querySelector('input').files[0]);}
942                    if (action < 1) {
943                        formData.append("filename", el.querySelector('video').getAttribute('src').replace(/^.*[\\/]/, ''));}
944                    formData.append("id", id);
945                    formData.append("action", action);
946                    formData.append("num", num);
947                    formData.append("caption", caption);
948                    winMessage.show({content: 'Загружаю видео файл №' + el.getAttribute('data-num'), append: true, possiblClose: false});
949                    var xhttp = new XMLHttpRequest();
950                    xhttp.open("POST", "aj/uploadVideo.php", true);
951                    xhttp.onreadystatechange = function ()
952                    {
953                        if (this.readyState === 4 && this.status == 200) {
954                            VideoOnLoad(this.responseText)
955
956                        }
957                    };
958                    xhttp.send(formData);
959                }
960            }
961        });
962        endLoadMedia(posteditblock, post)
963        function photoOnLoad(datafrom)
964        {
965            if (datafrom && datafrom != 'error') {
966                var data = JSON.parse(datafrom);
967                var arrok = data['ok'], arrerror = data['error'], ermes = '', c_img = null;
968                // let bl = posteditblock.querySelectorAll('.uploadedfoto[data-num="' + arrok['num'] + '"]')
969                if (arrerror.length > 0)
970                {
971                    for (var item in arrerror)
972                    {
973                        ermes = ermes + arrerror[item].num + ' -  ' + arrerror[item].text + '<br>';
974                    }
975                    if (ermes !== '')
976                    {
977                        winMessage.show({content: ermes, append: true, scroll: true, color: 'red'});
978                    }
979                }
980                winMessage.show({ProgressBarPosPlus: 1});
981
982                if (arrok['rezult'] >= 0)
983                {
984                    posteditblock.querySelector('.post_fotopanel .uploadedfoto[data-num="' + arrok.num + '"] ').classList.remove('loading', 'new', 'changenum');
985                    if (arrok['rezult'] == 1)
986                    {
987                        c_img = posteditblock.querySelector('.post_fotopanel .uploadedfoto[data-num="' + arrok.num + '"] img')
988                        c_img.setAttribute('src', '../photo/post/S/' + arrok['filename'])
989                        c_img.setAttribute('data-srcset', '../photo/post/' + arrok['filename'])
990                        c_img.setAttribute('data-filename', arrok['filename'])
991                        //  posteditblock.querySelector('.post_fotopanel .uploadedfoto[data-num="' + arrok.num + '"] .uphotptools').remove()
992                    }
993                }
994                if (arrok['rezult'] == -1)
995                {
996                    posteditblock.querySelector('.post_fotopanel .uploadedfoto[data-num="' + arrok.num + '"] ').remove();
997                }
998                endLoadMedia(posteditblock, post)
999            } else
1000            {
1001                winMessage.show({content: 'При загрузке изображения произошла ошибка. Попробуйте изменить фото ', append: false});
1002            }
1003        }
1004
1005        function    VideoOnLoad(responseText)
1006        {
1007            var response;
1008            if (responseText) {
1009
1010                try {
1011                    response = JSON.parse(responseText);
1012                } catch (e) {
1013                    winMessage.show({content: ' На сервере произошла ошибка.', append: true, possiblClose: false});
1014                    console.error(responseText);
1015                    return
1016                }
1017
1018            }
1019
1020            winMessage.show({ProgressBarPosPlus: 1});
1021            var c_el = posteditblock.querySelector('.post_fotopanel [data-num="' + response.num + '"]');
1022            if (response.upload) {
1023                if (Number(response.action) == 1) {
1024                    winMessage.show({content: ' Видео файл №' + response.num + ' загружен успешно.', append: false, possiblClose: false});
1025                    c_el.classList.remove('loading', 'new');
1026                    c_el.querySelector('video').setAttribute('src', '../shortvideo/dogmem/' + response.filename)
1027                }
1028                if (Number(response.action) == -1) {
1029                    c_el.remove()
1030                }
1031                if (Number(response.action) == 0) {
1032                    c_el.classList.remove('loading', 'changenum');
1033                }
1034
1035            } else {
1036                c_el.classList.add('error');
1037                winMessage.show({content: ' Видео файл №' + response.num + ' не загружен или загружен с ошибкой. Вероятно, он слишком большой или произошел сбой при передаче на сервер.', append: true, possiblClose: false});
1038            }
1039            endLoadMedia(posteditblock, post)
1040        }
1041
1042
1043
1044
1045    }//saveMedia
1046
1047    endLoadMedia = function (posteditblock, post)
1048    {
1049        if (posteditblock.querySelectorAll('.post_fotopanel .loading').length === 0)
1050        {
1051            fillValues(posteditblock, post)
1052            if (posteditblock.querySelectorAll('.post_fotopanel .error').length > 0)
1053            {
1054                winMessage.show({content: 'Данные загружены с ошибками.', append: false});
1055                winMessage.close({CloseAfter: 4000})
1056                mediaToPost(posteditblock, post)
1057
1058            } else {
1059                var id = posteditblock.getAttribute('data-id')
1060                winMessage.show({ProgressBarPos: numAction});
1061                winMessage.show({content: 'Данные загружены.', append: false});
1062                winMessage.close({CloseAfter: 4000})
1063                mediaToPost(posteditblock, post)
1064                if (post) {
1065                    post.scrollIntoView({block: "center", inline: "center"});
1066                }
1067                closeMaskEditPost()
1068            }
1069
1070        }
1071
1072        function      mediaToPost(posteditblock, post)
1073        {
1074            if (posteditblock.getAttribute('data-typepost') != 'storyPiece') {
1075                var caption_ = '', num = '';
1076                post.querySelectorAll(' .post_fotopanel .slider__item').forEach(function (el)
1077                {
1078                    el.remove()
1079                })
1080                posteditblock.querySelectorAll(' .post_fotopanel >*').forEach(function (el)
1081                {
1082                    num = el.getAttribute('data-num');
1083                    caption_ = posteditblock.querySelector('.post_fotopanel [data-num="' + num + '"] .photo_caption').innerHTML;
1084                    if (el.classList.contains('video') || el.classList.contains('iframe')) {
1085                        var iframe = el.querySelector('video,iframe').cloneNode(true);
1086                        iframe.setAttribute('width', 560)
1087                        iframe.setAttribute('height', 315)
1088                        var newvideo = document.createElement('div');
1089                        newvideo.classList.add('slider__item', 'video')
1090                        newvideo.setAttribute('data-num', num)
1091                        newvideo.insertAdjacentElement('beforeend', iframe)
1092                        post.querySelector('.post_fotopanel .slider__items').insertAdjacentElement('beforeend', newvideo)
1093                        post.querySelector('.post_fotopanel .slider__items [data-num="' + num + '"]').insertAdjacentHTML('beforeend', '<div class="photo_caption">' + caption_ + '</div>')
1094                    }
1095                    if (el.classList.contains('uploadedfoto')) {
1096                        var f_name = el.querySelector('img').getAttribute('data-filename')
1097                        post.querySelector('.post_fotopanel .slider__items').insertAdjacentHTML('beforeend', '<picture class="slider__item" data-num="' + num + '"><img src="../photo/post/S/' + f_name + '" data-srcset="../photo/post/' + f_name + '" data-filename="' + f_name + '"><div class="photo_caption">' + caption_ + '</div></picture>')
1098
1099                    }
1100                });
1101                if (posteditblock.classList.contains('new'))
1102                {
1103                    slideShow('.post[data-id="' + id + '"] .slider');
1104                    posteditblock.classList.remove('new')
1105                } else
1106                {
1107                    if (post.querySelector('.slider').reorganize)
1108                    {
1109                        post.querySelector('.slider').reorganize();
1110                    }
1111                }
1112            }
1113        }
1114    }
1115    function fillValues(from, to)
1116    {
1117        if (from.getAttribute('data-typepost') == 'storyPiece') {
1118            var idPiece = from.getAttribute('data-id');
1119            var p_item = null, media = null;
1120            if (from.querySelector('.post_fotopanel img,.post_fotopanel iframe, .post_fotopanel video'))
1121            {
1122                media = from.querySelector('.post_fotopanel img,.post_fotopanel iframe, .post_fotopanel video').cloneNode()
1123            }
1124            p_item = document.querySelector('#maskEditStory .postStoryBlock .minipiece[data-idPiece="' + idPiece + '"]')
1125            if (p_item == null)
1126            {
1127                p_item = document.querySelector('.minipiece.shablon').cloneNode(true)
1128                document.querySelector('#maskEditStory .postStoryBlock .addPiece').insertAdjacentElement('beforebegin', p_item) // мы же еще в редакторе
1129                p_item.addEventListener('click', editStoryPiecebtn)
1130                p_item.querySelector('.closediv').addEventListener('click', closediv)
1131                p_item.classList.remove('hiden', 'shablon')
1132                p_item.setAttribute('data-idPiece', idPiece);
1133
1134            } else
1135            {
1136                p_item.querySelectorAll('.media>*').forEach(function (el) {
1137                    el.remove()
1138                })
1139            }
1140            if (media) p_item.querySelector('.media').insertAdjacentElement('beforeend', media)
1141            if (from.querySelector('.post_title textarea') && from.querySelector('.post_title textarea').value != '') {
1142                p_item.querySelector('.piece_text').innerText = from.querySelector('.post_title textarea').value.substring(0, 40);
1143            } else
1144            {
1145                p_item.querySelector('.piece_text').innerText = from.querySelector('.post_content textarea').value.substring(0, 40);
1146            }
1147
1148        } else {
1149            to.setAttribute('data-typepost', from.getAttribute('data-typepost'))
1150            to.querySelector('.post_content').innerText = (from.querySelector('textarea[data-field="posttext"]')) ? from.querySelector('textarea[data-field="posttext"]').value : '';
1151            to.querySelector('.post_title').innerText = from.querySelector('textarea[data-field="title"]').value.replace(/\n/g, '');
1152            if (from.querySelector('input[data-field="suspendDate"]'))             to.setAttribute('data-suspendDate', setvalfield(from.querySelector('input[data-field="suspendDate"]')));
1153            if (from.querySelector('input[data-field="onlyMyLenta"]'))      to.setAttribute('data-onlymylenta', setvalfield(from.querySelector('input[data-field="onlyMyLenta"]')));
1154              if (from.querySelector('input[data-field="noshow"]'))      to.setAttribute('data-noshow', setvalfield(from.querySelector('input[data-field="noshow"]')));
1155
1156            setHashTagsToPost(from, to)
1157
1158            if (from.querySelector('#avtor').value.trim() != '' && from.querySelector('#avtorlink').value.trim() != '')
1159            {
1160                to.querySelector('.avtor').innerHTML = '<a class="avtorlink" href="' + from.querySelector('#avtorlink').value.trim() + '">' + from.querySelector('#avtor').value.trim() + '</a> ';
1161            } else
1162            {
1163                if (from.querySelector('#avtor').value.trim() != '')
1164                {
1165                    to.querySelector('.avtor').innerHTML = from.querySelector('#avtor').value.trim();
1166                }
1167                if (from.querySelector('#avtorlink').value.trim() != '')
1168                {
1169                    to.querySelector('.avtor').innerHTML = '<a class="avtorlink" href="' + from.querySelector('#avtorlink').value.trim() + '">Автор</a> ';
1170                }
1171            }
1172            from.querySelectorAll('.editfield.changed').forEach(function (el)
1173            {
1174                el.classList.remove('changed')
1175            })
1176        }
1177    }
1178
1179}
1180
1181function setHashTagsToPost(from, to)
1182{
1183    var htO = from.querySelectorAll('.hashtags .hashtag .hashtegtext');
1184    if (htO.length > 0)
1185    {
1186        var post_hashtags = to.querySelector('.post_hashtags')
1187        if (post_hashtags == null)
1188        {
1189            to.querySelector('.post_content').insertAdjacentHTML('afterend', '<div class="post_hashtags"></div>')
1190            post_hashtags = to.querySelector('.post_hashtags')
1191        } else
1192        {
1193            post_hashtags.querySelectorAll('a').forEach(function (el)
1194            {
1195                el.remove()
1196            });
1197        }
1198        htO.forEach(function (el)
1199        {
1200            post_hashtags.insertAdjacentHTML('beforeend', '<a href="../dogmem/?findstr=' + el.innerText + '" >' + el.innerText + '</a>');
1201        })
1202    }
1203}
1204
1205
1206function setNewHashTag()
1207{
1208    if (event.keyCode === 13)
1209    {
1210        if (this.value.trim() != '')
1211        {
1212            let newHashtag = document.querySelector('.hashtag.shablon').cloneNode(true)
1213            newHashtag.classList.remove('shablon')
1214            newHashtag.querySelector('.hashtegtext').innerText = this.value
1215            this.closest('.post_hashtags').querySelector('.hashtags').append(newHashtag)
1216            this.value = '';
1217        }
1218    }
1219}
1220
1221
1222function winLinkVideoShow()
1223{
1224    document.querySelector('.addvideolink').classList.remove('noshow')
1225}
1226
1227//function closeWinAddVideoLink()
1228//{
1229//
1230//    document.querySelector('.addvideolink').classList.add('noshow')
1231//}

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.