<script>
(function(){
'use strict';

var state = {
  language:'ru',
  projectName:'',
  icons:{},
  selectedSectionId:null,
  selectedSectionIds:new Set(),
  selectedFileId:null,
  currentHref:'',
  globalQuery:'',
  treeData:[],
  sectionMap:new Map(),
  fileMap:new Map(),
  parentSectionByFile:new Map(),
  fields:[],
  fieldIndices:new Map(),
  omitEmptyDetails:false,
  allFiles:[],
  sequenceRows:[],
  sequenceGuids:null,
  selectedSequenceKey:'',
  sequenceMap:new Map(),
  sequenceViewMode:'sequence',
  sequenceCompact:false,
  sequenceSortKey:'',
  sequenceSortAsc:true,
  sequenceVisibleColumns:['number','country','protection','appliedDate','decisionDate','approved','appType','note'],
  sequenceDateVisibleColumns:['date','submission','decision','approved','appType','note'],
  sequenceColumnOrder:['number','country','protection','appliedDate','decisionDate','approved','appType','note','totalFiles','m1Files','m2Files','m3Files','m4Files','m5Files'],
  sequenceDateColumnOrder:['date','submission','decision','approved','appType','note'],
  sortKey:'name',
  sortAsc:true,
  treeFilesVisible:true,
  contentVisible:true,
  viewerVisible:true,
  allFilesMode:false,
  paneSizes:{tree:320, content:640, viewer:420},
  visibleColumns:['name','otdSection','doccode','sequence','excludeSequence','status'],
  columnOrder:['name','otdSection','doccode','sequence','excludeSequence','status','lastOperation','date','size','path','md5','sha1','sha256','drugName','afsName','manufacturer','vvName','indication']
};

var paneMin = {tree:120, content:280, viewer:260};

var columns = [
  {key:'name', ru:'Файл', en:'File', cls:'name', width:360},
  {key:'otdSection', ru:'Раздел', en:'Section', cls:'otd', width:90},
  {key:'doccode', ru:'DocCode', en:'DocCode', cls:'doccode', width:90},
  {key:'sequence', ru:'ВКЛ', en:'ADD', cls:'seq', width:70},
  {key:'excludeSequence', ru:'ИСКЛ', en:'DEL', cls:'exseq', width:70},
  {key:'status', ru:'Состояние', en:'State', cls:'status', width:120},
  {key:'lastOperation', ru:'Операция', en:'Operation', cls:'operation', width:110},
  {key:'date', ru:'Дата включения', en:'Included', cls:'date', width:150},
  {key:'size', ru:'Размер, МБ', en:'Size, MB', cls:'size', width:90},
  {key:'path', ru:'Путь к файлу', en:'File path', cls:'path', width:260},
  {key:'md5', ru:'Контрольная сумма MD5', en:'MD5 checksum', cls:'md5', width:250},
  {key:'sha1', ru:'Контрольная сумма SHA1', en:'SHA1 checksum', cls:'sha1', width:300},
  {key:'sha256', ru:'Контрольная сумма SHA256', en:'SHA256 checksum', cls:'sha256', width:360},
  {key:'drugName', ru:'Наименование ЛП', en:'Drug name', cls:'drug', width:220},
  {key:'afsName', ru:'Наименование АФС', en:'API name', cls:'afs', width:220},
  {key:'manufacturer', ru:'Производитель', en:'Manufacturer', cls:'manufacturer', width:220},
  {key:'vvName', ru:'Наименование ВВ', en:'Excipient name', cls:'vv', width:220},
  {key:'indication', ru:'Показание', en:'Indication', cls:'indication', width:220}
];

var sequenceColumns = [
  {key:'number', ru:'Номер', en:'Number', width:92},
  {key:'country', ru:'Страна', en:'Country', width:78},
  {key:'protection', ru:'Статус защиты', en:'Protection state', width:220},
  {key:'appliedDate', ru:'Дата подачи', en:'Submission date', width:125},
  {key:'decisionDate', ru:'Дата решения', en:'Decision date', width:125},
  {key:'approved', ru:'Одобрена', en:'Approved', width:95},
  {key:'appType', ru:'Тип заявления', en:'Application type', width:220},
  {key:'note', ru:'Примечание', en:'Note', width:260},
  {key:'totalFiles', ru:'Всего файлов', en:'Total files', width:105},
  {key:'m1Files', ru:'М1', en:'M1', width:70},
  {key:'m2Files', ru:'М2', en:'M2', width:70},
  {key:'m3Files', ru:'М3', en:'M3', width:70},
  {key:'m4Files', ru:'М4', en:'M4', width:70},
  {key:'m5Files', ru:'М5', en:'M5', width:70}
];

var sequenceDateColumns = [
  {key:'date', ru:'Дата', en:'Date', width:120},
  {key:'submission', ru:'Подача', en:'Submission', width:140},
  {key:'decision', ru:'Решение', en:'Decision', width:140},
  {key:'approved', ru:'Одобрена', en:'Approved', width:100},
  {key:'appType', ru:'Тип заявления', en:'Application type', width:240},
  {key:'note', ru:'Примечание', en:'Note', width:320}
];

var texts = {
  ru:{
    eyebrow:'', app:'ARS Dossier Viewer', search:'Поиск по досье', projectFallback:'Проект',
    expand:'Развернуть все', collapse:'Свернуть все', reset:'Сброс', seqBtn:'Таблица последовательностей', seqAll:'Все последовательности',
    hideViewer:'Скрыть просмотр', showViewer:'Показать просмотр',
    hideTreeFiles:'Скрыть файлы в дереве', showTreeFiles:'Показать файлы в дереве',
    hideContent:'Скрыть содержимое раздела', showContent:'Показать содержимое раздела',
    showAllFiles:'Показать все файлы', showSectionFiles:'Показать файлы раздела',
    sections:'Оглавление досье', sectionsSub:'Разделы с файлами', content:'Содержимое раздела', contentSub:'Файлы выбранного раздела',
    contentSubMulti:'Файлы выбранных разделов', contentSubAll:'Все файлы досье',
    copyTable:'Копировать', copyTree:'Копировать', viewer:'Просмотр', viewerSub:'Предпросмотр выбранного файла', viewerEmpty:'Выберите файл, чтобы отобразить его справа.',
    contentEmpty:'Выберите раздел в оглавлении.', noData:'Нет данных', popupTitle:'Сведения о файле', close:'Закрыть', openFile:'Открыть файл в новом окне',
    modalTitle:'Таблица последовательностей', modalCopy:'Копировать', columns:'Колонки',
    sequenceModeSequence:'От номера последовательности', sequenceModeDate:'От даты подачи',
    sequenceCompact:'Сократить текст', sequenceFull:'Показать весь текст'
  },
  en:{
    eyebrow:'', app:'ARS Dossier Viewer', search:'Search dossier', projectFallback:'Project',
    expand:'Expand all', collapse:'Collapse all', reset:'Reset', seqBtn:'Sequence table', seqAll:'All sequences',
    hideViewer:'Hide preview', showViewer:'Show preview',
    hideTreeFiles:'Hide files in tree', showTreeFiles:'Show files in tree',
    hideContent:'Hide section contents', showContent:'Show section contents',
    showAllFiles:'Show all files', showSectionFiles:'Show section files',
    sections:'Dossier contents', sectionsSub:'Sections with files', content:'Section contents', contentSub:'Files in selected section',
    contentSubMulti:'Files in selected sections', contentSubAll:'All dossier files',
    copyTable:'Copy', copyTree:'Copy', viewer:'Preview', viewerSub:'Preview of selected file', viewerEmpty:'Select a file to display it on the right.',
    contentEmpty:'Select a section in the contents.', noData:'No data', popupTitle:'File details', close:'Close', openFile:'Open file in a new window',
    modalTitle:'Sequence table', modalCopy:'Copy', columns:'Columns',
    sequenceModeSequence:'By sequence number', sequenceModeDate:'By submission date',
    sequenceCompact:'Shorten text', sequenceFull:'Show full text'
  }
};

function t(key){ var d=texts[state.language]||texts.ru; return d[key]||key; }
function qs(s,r){ return (r||document).querySelector(s); }
function qsa(s,r){ return Array.prototype.slice.call((r||document).querySelectorAll(s)); }
function escapeHtml(text){ return String(text===undefined || text===null?'':text).replace(/[&<>"']/g,function(ch){ return {'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#39;'}[ch]; }); }
function normalize(text){ return String(text||'').replace(/\s+/g,' ').trim().toLowerCase(); }
function cssEscape(id){ return String(id).replace(/([ #;?%&,.+*~\':"!^$[\]()=>|\/@])/g,'\\$1'); }
function clamp(value,min,max){ return Math.max(min, Math.min(max, value)); }

function iconSrc(index){ return state.icons[isNaN(index) ? 0 : index] || ''; }
function iconHtml(index, cls){
  var source=iconSrc(index);
  return source ? '<img class="' + (cls || 'tree-icon') + '" src="' + escapeHtml(source) + '" alt="">' : '';
}

function seqNo(val){
  if (!val) return '';
  var raw=String(val).trim();
  if (/^\d{1,4}$/.test(raw)) return ('0000'+raw).slice(-4);
  var m=raw.match(/(?:^|\\)(\d{4})(?:\\|$)/);
  if (m) return m[1];
  var key=raw.toLowerCase();
  if (state.sequenceMap.has(raw)) return state.sequenceMap.get(raw);
  if (state.sequenceMap.has(key)) return state.sequenceMap.get(key);
  return '';
}
function getOrderedVisibleColumns(){
  return state.columnOrder.filter(function(key){ return state.visibleColumns.indexOf(key)!==-1; }).map(function(key){ return columns.find(function(c){ return c.key===key; }); }).filter(Boolean);
}
function sequenceColumnList(){
  return state.sequenceViewMode==='date' ? sequenceDateColumns : sequenceColumns;
}
function sequenceColumnOrder(){
  return state.sequenceViewMode==='date' ? state.sequenceDateColumnOrder : state.sequenceColumnOrder;
}
function sequenceVisibleColumns(){
  return state.sequenceViewMode==='date' ? state.sequenceDateVisibleColumns : state.sequenceVisibleColumns;
}
function setSequenceVisibleColumns(keys){
  if (state.sequenceViewMode==='date') state.sequenceDateVisibleColumns=keys;
  else state.sequenceVisibleColumns=keys;
}
function getOrderedVisibleSequenceColumns(){
  var list=sequenceColumnList();
  var visible=sequenceVisibleColumns();
  return sequenceColumnOrder().filter(function(key){ return visible.indexOf(key)!==-1; }).map(function(key){ return list.find(function(c){ return c.key===key; }); }).filter(Boolean);
}

function infoValue(node, keys){
  keys=Array.isArray(keys)?keys:[keys];
  for(var i=0;i<keys.length;i++){
    var index=state.fieldIndices.get(keys[i]);
    if(index!==undefined && node.details) return String(node.details[index]||'').trim();
  }
  return '';
}
function sequenceFromText(value){
  var seq=seqNo(value); if(seq) return seq;
  var match=String(value||'').match(/^\s*(\d{1,4})/);
  return match?('0000'+match[1]).slice(-4):'';
}
function fileInfoHtml(meta){
  if(!meta.details) return '';
  var rows=state.fields.map(function(field,index){
    var value=String(meta.details[index]||'');
    if(state.omitEmptyDetails && !value.trim()) return '';
    return '<tr><td>'+escapeHtml(field.label)+'</td><td>'+escapeHtml(value)+'</td></tr>';
  }).join('');
  return '<table class="info-popup-table"><thead><tr><th>Параметр</th><th>Значение</th></tr></thead><tbody>'+rows+'</tbody></table>';
}

function buildShell(){
  document.body.insertAdjacentHTML('afterbegin',[
    '<div id="appTopBar">',
    '  <div class="topbar-row topbar-row-main">',
    '    <div class="topbar-title">',
    '      <div class="topbar-badge">ARS</div>',
    '      <div class="topbar-text">',
    '        <div class="topbar-eyebrow" id="appEyebrow"></div>',
    '        <div class="topbar-project" id="appProjectName"></div>',
    '      </div>',
    '    </div>',
    '    <div class="topbar-actions-right">',
    '      <button type="button" class="app-btn" id="expandAllButton"></button>',
    '      <button type="button" class="app-btn" id="collapseAllButton"></button>',
    '      <button type="button" class="app-btn" id="toggleTreeFilesButton"></button>',
    '      <button type="button" class="app-btn" id="toggleContentButton"></button>',
    '      <button type="button" class="app-btn" id="toggleViewerButton"></button>',
    '      <button type="button" class="lang-btn active" data-lang="ru">RU</button>',
    '      <button type="button" class="lang-btn" data-lang="en">EN</button>',
    '    </div>',
    '  </div>',
    '  <div class="topbar-row topbar-row-secondary">',
    '    <select id="sequenceSelect" class="app-select"></select>',
    '    <input type="search" id="globalSearchInput">',
    '    <button type="button" class="app-btn" id="resetButton"></button>',
    '    <button type="button" class="app-btn" id="openSequencesButton"></button>',
    '  </div>',
    '</div>',
    '<div id="appWorkspace">',
    '  <section class="pane" id="treePane"><div class="panel-header"><div class="panel-head-text"><div class="panel-title" id="treeTitle"></div><div class="panel-subtitle" id="treeSub"></div></div><div class="panel-tools"><button type="button" class="panel-tool-btn" id="copyTreeButton"></button></div></div><div class="panel-body" id="treeBody"></div></section>',
    '  <div class="resizer" id="leftResizer"></div>',
    '  <section class="pane" id="contentPane"><div class="panel-header"><div class="panel-head-text"><div class="panel-title" id="contentTitle"></div><div class="panel-subtitle" id="contentSub"></div></div><div class="panel-tools"><button type="button" class="panel-tool-btn" id="toggleAllFilesButton"></button><button type="button" class="panel-tool-btn" id="copyContentTableButton"></button><button type="button" class="panel-tool-btn" id="contentColumnsButton"></button><div id="contentColumnsMenu" class="column-menu hidden"></div></div></div><div class="panel-body" id="contentBody"><div id="contentEmpty"></div><div id="contentTableWrap"><table id="contentTable" hidden><thead><tr></tr></thead><tbody></tbody></table></div></div></section>',
    '  <div class="resizer" id="rightResizer"></div>',
    '  <section class="pane" id="viewerPane"><div class="panel-header"><div class="panel-head-text"><div class="panel-title" id="viewerTitle"></div><div class="panel-subtitle" id="viewerSub"></div></div></div><div id="viewerFrameWrap"><div id="viewerEmptyState"></div><iframe id="pdfViewer" class="hidden" src="about:blank"></iframe></div></section>',
    '</div>',
    '<div id="sequenceModal" class="hidden"><div class="modal-card"><div class="modal-header"><div class="modal-title" id="sequenceModalTitle"></div><div class="modal-actions"><button type="button" class="panel-tool-btn" id="sequenceModeButton"></button><button type="button" class="panel-tool-btn" id="toggleSequenceTextButton"></button><button type="button" class="panel-tool-btn" id="sequenceColumnsButton"></button><div id="sequenceColumnsMenu" class="column-menu hidden"></div><button type="button" class="panel-tool-btn" id="copySequenceTableButton"></button><button type="button" class="popup-close-btn" id="sequenceCloseButton"></button></div></div><div class="modal-body"><div id="sequenceTableHost"></div></div></div></div>',
    '<div id="infoPopup" class="hidden"><div id="popupHeader"><div id="popupTitle"></div><button type="button" class="popup-close-btn" id="popupCloseButton"></button></div><div id="popupContent"></div></div>'
  ].join(''));
}

function buildContentHeader(){
  var cols=getOrderedVisibleColumns();
  var tr=qs('#contentTable thead tr');
  tr.innerHTML=cols.map(function(col,idx){
    return '<th draggable="true" data-key="'+col.key+'" style="width:'+col.width+'px"><div class="th-inner"><span class="th-label">'+escapeHtml(col[state.language]||col.ru)+'</span><span class="sort-mark">'+(state.sortKey===col.key?(state.sortAsc?'▲':'▼'):'↕')+'</span><span class="col-resize" data-index="'+idx+'"></span></div></th>';
  }).join('');
  qsa('#contentTable th').forEach(function(th){
    th.addEventListener('click', function(e){
      if (e.target.classList.contains('col-resize')) return;
      var key=th.getAttribute('data-key');
      if (state.sortKey===key) state.sortAsc=!state.sortAsc; else { state.sortKey=key; state.sortAsc=true; }
      buildContentHeader();
      renderContentTable();
      setupColumnResizers();
      setupColumnDrag();
    });
  });
}

function parseSequenceNumber(text, fallbackIdx){
  var m=String(text||'').match(/\d{1,4}/);
  if (m) return ('0000'+m[0]).slice(-4);
  return 'seq-' + fallbackIdx;
}

function normalizeDateDisplay(value){
  var text=String(value||'').trim();
  if (!text) return '';
  var m=text.match(/^(\d{4})-(\d{1,2})-(\d{1,2})(?:[ T]|$)/);
  if(m) return ('0'+m[3]).slice(-2)+'.'+('0'+m[2]).slice(-2)+'.'+m[1];
  m=text.match(/^(\d{1,2})[.\/-](\d{1,2})[.\/-](\d{2,4})(?:\s|$)/);
  if(m){ var y=m[3].length===2?'20'+m[3]:m[3]; return ('0'+m[1]).slice(-2)+'.'+('0'+m[2]).slice(-2)+'.'+y; }
  return text;
}

function dateSortValue(value){
  var text=normalizeDateDisplay(value);
  var m=text.match(/^(\d{2})\.(\d{2})\.(\d{4})$/);
  if (m) return m[3]+m[2]+m[1];
  return text.toLowerCase();
}

function parseSequences(rows){
  state.sequenceRows=rows.map(function(row,idx){
    var data=Object.assign({},row);
    ['number','country','protection','approved','appType','note'].forEach(function(key){data[key]=String(row[key]||'').trim();});
    data.key='seq-'+idx;
    data.seq=parseSequenceNumber(data.number,idx);
    data.label=[data.number,data.country,data.protection].filter(Boolean).join(' | ') || data.seq;
    data.guids=(row.guids||[]).map(normalizeId);
    data.appliedDate=normalizeDateDisplay(row.appliedDate);
    data.decisionDate=normalizeDateDisplay(row.decisionDate);
    data.guids.forEach(function(id){ if(!state.sequenceMap.has(id)) state.sequenceMap.set(id,data.seq); });
    return data;
  });
}
function normalizeId(value){
  var id=String(value||'');
  if(/^[0-9a-f]{32}$/i.test(id)) id=id.slice(0,8)+'-'+id.slice(8,12)+'-'+id.slice(12,16)+'-'+id.slice(16,20)+'-'+id.slice(20);
  return /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(id)?id.toLowerCase():id;
}

function renderSequenceSelect(){
  var select=qs('#sequenceSelect');
  if (!select) return;
  var options=['<option value="">'+escapeHtml(t('seqAll'))+'</option>'];
  state.sequenceRows.forEach(function(row){
    options.push('<option value="'+escapeHtml(row.key)+'">'+escapeHtml(row.label)+'</option>');
  });
  select.innerHTML=options.join('');
  select.value=state.selectedSequenceKey || '';
}

function applySequence(key){
  state.selectedSequenceKey=key || '';
  var row=state.sequenceRows.find(function(item){ return item.key===state.selectedSequenceKey; });
  state.sequenceGuids=row ? new Set(row.guids) : null;
  var select=qs('#sequenceSelect');
  if (select) select.value=state.selectedSequenceKey;
  renderSectionFilter();
  renderContentTable();
}

function metaFromNode(node){
  var doccode=infoValue(node,'MainDrugRegistrationDocCode');
  var match=doccode.match(/\b\d{5}\b/); if(match) doccode=match[0];
  var incl=infoValue(node,['ActualSequenceInGuid','SequenceInGuid']);
  var excl=infoValue(node,['ActualSequenceExGuid','SequenceExGuid']);
  var meta={
    id:normalizeId(node.id), imageIndex:node.imageIndex,
    href:node.href||'', name:infoValue(node,'FileName')||node.title||'',
    otdSection:infoValue(node,'MainCTDNum'), doccode:doccode,
    sequence:seqNo(incl)||sequenceFromText(node.sequence), excludeSequence:seqNo(excl)||sequenceFromText(node.excludeSequence),
    status:infoValue(node,'Status')||node.status||'', lastOperation:infoValue(node,'FileOperationType'),
    date:infoValue(node,'DossierAddDate'), size:infoValue(node,'FileSize'), path:infoValue(node,'FilePath'),
    md5:infoValue(node,'Md5Hash'), sha1:infoValue(node,'Sha1Hash'), sha256:infoValue(node,'Sha256Hash'),
    drugName:infoValue(node,'DrugProductName'), afsName:infoValue(node,'ActiveSubstanceName'), manufacturer:infoValue(node,'AttributeMnf'),
    vvName:infoValue(node,'AuxiliarySubstanceName'), indication:infoValue(node,'IndicationText'),
    nextList:(node.nextList||[]).map(normalizeId), prevList:(node.prevList||[]).map(normalizeId),
    excluded:false, inactive:false, searchText:''
  };
  meta.excluded=!!meta.excludeSequence || /exclude|delete|withdraw|исключ|удален/i.test(meta.lastOperation) || /исключ|удален|недейств/i.test(meta.status);
  meta.inactive=meta.excluded || [6,18,20,24,36].indexOf(meta.imageIndex)!==-1;
  // Поиск охватывает реквизиты и все показанные свойства, без служебной HTML-разметки.
  meta.searchText=normalize(Object.keys(meta).map(function(key){return Array.isArray(meta[key])?meta[key].join(' '):meta[key];}).join(' ')+' '+
    state.fields.map(function(field,index){return node.details?field.label+' '+node.details[index]:'';}).join(' '));
  meta.details=node.details||null;
  return meta;
}
function parseDossier(){
  var source=qs('#dossierData');
  if(!source) throw new Error('Отсутствуют данные досье.');
  var data=JSON.parse(source.textContent);
  if(data.version!==1 || !Array.isArray(data.nodes)) throw new Error('Неподдерживаемый формат досье.');
  state.projectName=data.projectName||t('projectFallback');
  state.icons=data.icons||{};
  state.fields=data.fields||[];
  state.omitEmptyDetails=!!data.omitEmptyDetails;
  state.fields.forEach(function(field,index){if(!state.fieldIndices.has(field.key)) state.fieldIndices.set(field.key,index);});
  parseSequences(data.sequences||[]);
  var nodes=new Map();
  data.nodes.forEach(function(raw){
    var id=normalizeId(raw.id), parentId=normalizeId(raw.parentId);
    var node={id:id,title:String(raw.title||'').trim(),isFile:raw.href!==undefined && raw.href!==null,imageIndex:raw.imageIndex,children:[],hasFiles:false};
    if(nodes.has(id)) throw new Error('Повторяющийся идентификатор узла.');
    nodes.set(id,node);
    var parent=parentId?nodes.get(parentId):null;
    if(parentId && !parent) throw new Error('Не найден родитель узла.');
    if(parent) parent.children.push(node); else state.treeData.push(node);
    if(node.isFile){
      node.meta=metaFromNode(raw); state.fileMap.set(id,node); node.hasFiles=true;
      if(parent) state.parentSectionByFile.set(id,parent.isFile?state.parentSectionByFile.get(parentId):parentId);
    }else state.sectionMap.set(id,node);
  });
  function index(node){
    node.fileStart=state.allFiles.length;
    if(node.isFile) state.allFiles.push(node);
    else node.children.forEach(index);
    node.fileEnd=state.allFiles.length;
    node.hasFiles=node.fileEnd>node.fileStart;
  }
  state.treeData.forEach(index);
  source.remove();
}

function buildSectionTree(){
  var host=qs('#treeBody');
  host.innerHTML='<ul id="treeRootView"></ul>';
  var root=qs('#treeRootView');

  function build(nodes, parent){
    nodes.forEach(function(node){
      if (!node.hasFiles) return;
      if (node.isFile){
        if (!state.treeFilesVisible) return;
        var fileLi=document.createElement('li');
        fileLi.className='tree-file';
        fileLi.dataset.fileId=node.id;
        fileLi.dataset.nodeId=node.id;
        var sequencePair=formatSequencePair(node);
        var sequenceHtml=sequencePair ? '<span class="tree-seq" title="'+escapeHtml(sequencePair)+'">'+escapeHtml(sequencePair)+'</span>' : '';
        var openHtml=node.meta.href ? '<a class="tree-open-link" href="'+escapeHtml(node.meta.href)+'" target="_blank" rel="noopener" title="'+escapeHtml(t('openFile'))+'">↗</a>' : '';
        fileLi.innerHTML='<div class="tree-row file-row">'+iconHtml(node.imageIndex,'tree-icon')+'<span class="tree-label" title="'+escapeHtml(node.title)+'">'+escapeHtml(node.title)+'</span>'+sequenceHtml+openHtml+'</div>';
        parent.appendChild(fileLi);
        return;
      }

      var childSections=node.children.some(function(c){ return !c.isFile && c.hasFiles; });
      var childFiles=node.children.some(function(c){ return c.isFile && c.hasFiles; });
      var hasExpandableChildren=childSections || (state.treeFilesVisible && childFiles);
      var li=document.createElement('li');
      li.className='tree-folder';
      li.dataset.nodeId=node.id;
      li.innerHTML='<div class="tree-row"><span class="tree-caret'+(hasExpandableChildren?'':' placeholder')+'">'+(hasExpandableChildren?'&#9656;':'&#9679;')+'</span>'+iconHtml(node.imageIndex,'tree-icon')+'<span class="tree-label" title="'+escapeHtml(node.title)+'">'+escapeHtml(node.title)+'</span></div><ul></ul>';
      parent.appendChild(li);
      build(node.children, qs(':scope > ul', li));
    });
  }
  build(state.treeData, root);
  qsa('#treeRootView > .tree-folder').forEach(function(li){ li.classList.add('expanded'); setCaret(li,true); });
  if (!state.selectedSectionIds.size){
    var first=qs('#treeRootView > .tree-folder');
    if(first){state.selectedSectionId=first.dataset.nodeId;state.selectedSectionIds.add(state.selectedSectionId);}
  }
  refreshTreeSelection();
}

function setCaret(li, expanded){ var caret=qs(':scope > .tree-row .tree-caret', li); if (!caret || caret.classList.contains('placeholder')) return; caret.innerHTML=expanded?'&#9662;':'&#9656;'; }
function toggleFolder(li, force){ var expanded=typeof force==='boolean'?force:!li.classList.contains('expanded'); li.classList.toggle('expanded', expanded); setCaret(li, expanded); }
function expandPath(id){ var li=qs('#treeRootView .tree-folder[data-node-id="'+cssEscape(id)+'"]'); while(li){ toggleFolder(li,true); li=li.parentElement && li.parentElement.closest('.tree-folder'); } }
function getSelectedSection(){ return state.sectionMap.get(state.selectedSectionId) || null; }
function getSelectedSections(){
  var sections=[];
  state.selectedSectionIds.forEach(function(id){ var section=state.sectionMap.get(id); if (section) sections.push(section); });
  return sections;
}
function firstSelectedSectionId(){
  var first=null;
  state.selectedSectionIds.forEach(function(id){ if (first===null) first=id; });
  return first;
}

function refreshTreeSelection(){
  qsa('#treeRootView .tree-row.selected').forEach(function(el){el.classList.remove('selected');});
  state.selectedSectionIds.forEach(function(id){
    var row=qs('#treeRootView .tree-folder[data-node-id="'+cssEscape(id)+'"] > .tree-row');
    if (row) row.classList.add('selected');
  });
  if (state.selectedFileId){
    var fileRow=qs('#treeRootView .tree-file[data-file-id="'+cssEscape(state.selectedFileId)+'"] > .tree-row');
    if (fileRow) fileRow.classList.add('selected');
  }
}

function selectSection(id, event){
  if (!state.sectionMap.has(id)) return;
  var additive=!!(event && (event.ctrlKey || event.metaKey));
  if (additive){
    if (state.selectedSectionIds.has(id)) state.selectedSectionIds.delete(id);
    else state.selectedSectionIds.add(id);
  } else {
    state.selectedSectionIds.clear();
    state.selectedSectionIds.add(id);
  }
  state.selectedSectionId = state.selectedSectionIds.has(id) ? id : firstSelectedSectionId();
  refreshTreeSelection();
  expandPath(id);
  renderContentTable();
}

function collectFiles(section){ return section?state.allFiles.slice(section.fileStart,section.fileEnd):[]; }
function collectAllFiles(){ return state.allFiles.slice(); }

function dedupeFiles(files){
  var seen=new Set();
  var out=[];
  files.forEach(function(file){
    var key=file.id || (file.meta && file.meta.id) || file.meta.href || file.meta.name;
    if (seen.has(key)) return;
    seen.add(key);
    out.push(file);
  });
  return out;
}
function collectSelectedFiles(){
  if (state.allFilesMode) return collectAllFiles();
  var files=[];
  getSelectedSections().forEach(function(section){ files=files.concat(collectFiles(section)); });
  return dedupeFiles(files);
}

function sequenceAllows(file){ return state.sequenceGuids===null || state.sequenceGuids.has(file.id); }
function matchesGlobal(file){ return sequenceAllows(file) && (!state.globalQuery || file.meta.searchText.indexOf(state.globalQuery)!==-1); }
var collators={};
function textCompare(a,b){
  var collator=collators[state.language]||(collators[state.language]=new Intl.Collator(state.language==='ru'?'ru':'en',{numeric:true,sensitivity:'base'}));
  return collator.compare(String(a),String(b));
}
function compareValues(a,b){
  if(a===b) return 0;
  var sa=String(a),sb=String(b),number=/^-?\d+(?:[.,]\d+)?$/;
  if(number.test(sa) && number.test(sb)){var na=Number(sa.replace(',','.')),nb=Number(sb.replace(',','.'));return na===nb?0:na<nb?-1:1;}
  return textCompare(sa,sb);
}

function renderNameCell(file, value){
  return '<span class="file-name-cell">' + iconHtml(file.meta.imageIndex,'file-icon') + '<span>' + escapeHtml(value) + '</span></span>';
}

function formatSequencePair(file){
  var incl=(file && file.meta && file.meta.sequence) || '';
  var excl=(file && file.meta && file.meta.excludeSequence) || '';
  if (incl && excl) return incl + ' → ' + excl;
  if (incl) return incl + ' →';
  if (excl) return '→ ' + excl;
  return '';
}

function openFileInNewWindow(fileId){
  var file=state.fileMap.get(fileId);
  var href=file && file.meta ? file.meta.href : '';
  if (!href) return;
  window.open(href, '_blank', 'noopener');
}

function renderContentTable(){
  var empty=qs('#contentEmpty'), table=qs('#contentTable'), tbody=qs('#contentTable tbody');
  tbody.innerHTML='';
  clearRelationHighlights();
  var selectedSections=getSelectedSections();
  if (!state.allFilesMode && !selectedSections.length){ empty.textContent=t('contentEmpty'); table.hidden=true; showViewer(''); updateContentSubtitle(0); return; }
  var files=collectSelectedFiles().filter(matchesGlobal);
  files.sort(function(a,b){ var av=a.meta[state.sortKey]||'',bv=b.meta[state.sortKey]||'';var cmp=state.sortKey==='otdSection'?textCompare(av,bv):compareValues(av,bv);return state.sortAsc?cmp:-cmp; });
  updateContentSubtitle(files.length);
  if (!files.length){ empty.textContent=t('noData'); table.hidden=true; showViewer(''); highlightFileContext(null); return; }
  empty.textContent=''; table.hidden=false;
  var cols=getOrderedVisibleColumns(),fragment=document.createDocumentFragment();
  files.forEach(function(file){
    var tr=document.createElement('tr');
    tr.dataset.fileId=file.id;
    tr.classList.add('image-index-' + file.meta.imageIndex);
    if (file.meta.inactive) tr.classList.add('inactive-row');
    tr.innerHTML=cols.map(function(col){
      var val=file.meta[col.key]||'';
      var cellContent=col.key==='name' ? renderNameCell(file, val) : escapeHtml(val);
      return '<td class="'+col.cls+'" title="'+escapeHtml(val)+'">'+cellContent+'</td>';
    }).join('');
    fragment.appendChild(tr);
  });
  tbody.appendChild(fragment);
  if (state.selectedFileId && state.fileMap.has(state.selectedFileId) && files.some(function(f){return f.id===state.selectedFileId;})) {
    selectFile(state.selectedFileId, true);
  } else {
    state.selectedFileId=null; showViewer(''); highlightFileContext(null);
  }
}

function updateContentSubtitle(fileCount){
  var sub=qs('#contentSub');
  if (!sub) return;
  var base;
  if (state.allFilesMode) base=t('contentSubAll');
  else if (state.selectedSectionIds.size>1) base=t('contentSubMulti');
  else base=t('contentSub');
  sub.textContent=base + (typeof fileCount==='number' ? ' (' + fileCount + ')' : '');
}

function clearRelationHighlights(){ qsa('#contentTable tbody tr.related-next, #contentTable tbody tr.related-prev, #treeRootView .tree-row.related-next, #treeRootView .tree-row.related-prev').forEach(function(el){ el.classList.remove('related-next','related-prev'); }); }
function highlightRelatedFileInTree(id, cls){
  var row=qs('#treeRootView .tree-file[data-file-id="'+cssEscape(id)+'"] > .tree-row');
  if (!row) return;
  row.classList.add(cls);
  var sectionId=state.parentSectionByFile.get(id);
  if (sectionId) expandPath(sectionId);
}
function highlightRelations(file){
  clearRelationHighlights();
  if (!file) return;
  file.meta.nextList.forEach(function(id){ var tr=qs('#contentTable tbody tr[data-file-id="'+cssEscape(id)+'"]'); if (tr) tr.classList.add('related-next'); highlightRelatedFileInTree(id,'related-next'); });
  file.meta.prevList.forEach(function(id){ var tr=qs('#contentTable tbody tr[data-file-id="'+cssEscape(id)+'"]'); if (tr) tr.classList.add('related-prev'); highlightRelatedFileInTree(id,'related-prev'); });
}

function highlightFileContext(fileId){
  qsa('#treeRootView .tree-row.file-context').forEach(function(el){ el.classList.remove('file-context'); });
  if (!fileId) { refreshTreeSelection(); return; }
  var sectionId=state.parentSectionByFile.get(fileId);
  if (sectionId){
    var row=qs('#treeRootView .tree-folder[data-node-id="'+cssEscape(sectionId)+'"] > .tree-row');
    if (row){ row.classList.add('file-context'); expandPath(sectionId); row.scrollIntoView({block:'nearest'}); }
  }
  refreshTreeSelection();
}

function selectFileFromTree(fileId){
  var sectionId=state.parentSectionByFile.get(fileId);
  if (sectionId && !state.allFilesMode && !state.selectedSectionIds.has(sectionId)){
    state.selectedSectionIds.clear();
    state.selectedSectionIds.add(sectionId);
    state.selectedSectionId=sectionId;
    renderContentTable();
  }
  selectFile(fileId);
}

function selectFile(fileId, silent){
  var file=state.fileMap.get(fileId); if (!file) return;
  state.selectedFileId=fileId;
  qsa('#contentTable tbody tr.selected').forEach(function(tr){ tr.classList.remove('selected'); });
  var tr=qs('#contentTable tbody tr[data-file-id="'+cssEscape(fileId)+'"]'); if (tr) tr.classList.add('selected');
  refreshTreeSelection();
  highlightRelations(file);
  highlightFileContext(fileId);
  if (!silent) showViewer(file.meta.href || '');
}

function showViewer(href){
  state.currentHref=href||'';
  var frame=qs('#pdfViewer'), empty=qs('#viewerEmptyState');
  if (href){ frame.src=href; frame.classList.remove('hidden'); empty.style.display='none'; }
  else { frame.src='about:blank'; frame.classList.add('hidden'); empty.style.display='flex'; }
}

function showInfo(fileId){
  var file=state.fileMap.get(fileId||state.selectedFileId); if (!file) return;
  qs('#popupTitle').textContent=t('popupTitle');
  qs('#popupContent').innerHTML=fileInfoHtml(file.meta) || '<div class="popup-empty">'+escapeHtml(t('noData'))+'</div>';
  qs('#infoPopup').classList.remove('hidden');
}
function closeInfo(){ qs('#infoPopup').classList.add('hidden'); }

function renderSectionFilter(){
  function mark(node){
    if(node.isFile){node.allowedCount=sequenceAllows(node)?1:0;node.fileHit=!!node.allowedCount && (!state.globalQuery || node.meta.searchText.indexOf(state.globalQuery)!==-1);return;}
    node.allowedCount=0;node.fileHit=false;var childHit=false;
    node.children.forEach(function(child){mark(child);node.allowedCount+=child.allowedCount;node.fileHit=node.fileHit||child.fileHit;childHit=childHit||(!child.isFile && child.filterMatch);});
    node.filterMatch=node.allowedCount>0 && (!state.globalQuery || normalize(node.title).indexOf(state.globalQuery)!==-1 || node.fileHit || childHit);
  }
  state.treeData.forEach(mark);
  qsa('#treeRootView .tree-folder').forEach(function(li){
    var section=state.sectionMap.get(li.dataset.nodeId || '');
    var match=section && section.filterMatch;
    li.style.display=match?'':'none';
    li.classList.toggle('match-branch', !!state.globalQuery && match);
    if (state.globalQuery && match) toggleFolder(li,true);
  });
  qsa('#treeRootView .tree-file').forEach(function(li){
    var file=state.fileMap.get(li.dataset.fileId || '');
    li.style.display=(state.treeFilesVisible && file && matchesGlobal(file))?'':'none';
  });
}

function compareSequenceValues(a,b,key){
  var av=a[key]||'', bv=b[key]||'';
  if (key==='appliedDate' || key==='decisionDate' || key==='date'){
    av=dateSortValue(av); bv=dateSortValue(bv);
  } else if (/Files$/.test(key)) {
    av=parseFloat(String(av).replace(',', '.')) || 0;
    bv=parseFloat(String(bv).replace(',', '.')) || 0;
  } else if (key==='number' || key==='submission' || key==='decision') {
    var an=parseInt(String(av).match(/\d{1,4}/),10);
    var bn=parseInt(String(bv).match(/\d{1,4}/),10);
    if (!isNaN(an) && !isNaN(bn) && an!==bn) return an-bn;
  }
  return compareValues(av,bv);
}

function sortedSequenceRows(rows){
  var out=rows.slice();
  if (!state.sequenceSortKey) return out;
  out.sort(function(a,b){
    var cmp=compareSequenceValues(a,b,state.sequenceSortKey);
    return state.sequenceSortAsc ? cmp : -cmp;
  });
  return out;
}

function buildSequenceDateRows(){
  var groups=new Map();
  function ensure(date){
    var key=normalizeDateDisplay(date);
    if (!key) return null;
    if (!groups.has(key)) groups.set(key,{date:key, submission:[], decision:[], approved:[], appType:[], note:[]});
    return groups.get(key);
  }
  state.sequenceRows.forEach(function(row){
    var applied=ensure(row.appliedDate);
    if (applied){
      applied.submission.push(row.number);
      applied.appType.push(row.appType || '');
      applied.note.push(row.note || '');
    }
    var decided=ensure(row.decisionDate);
    if (decided){
      decided.decision.push(row.number);
      decided.approved.push(row.approved || '');
    }
  });
  return Array.from(groups.values()).map(function(group){
    return {
      key:'date-' + group.date,
      date:group.date,
      submission:group.submission.filter(Boolean).join('\n'),
      decision:group.decision.filter(Boolean).join('\n'),
      approved:group.approved.join('\n'),
      appType:group.appType.join('\n'),
      note:group.note.join('\n')
    };
  });
}

function sequenceCellHtml(value){
  return escapeHtml(value).replace(/\n/g,'<br>');
}

function renderSequenceModal(){
  var host=qs('#sequenceTableHost'); host.innerHTML='';
  var cols=getOrderedVisibleSequenceColumns();
  var rows=state.sequenceViewMode==='date' ? buildSequenceDateRows() : state.sequenceRows.slice();
  rows=sortedSequenceRows(rows);
  if (!rows.length){ host.textContent=t('noData'); return; }
  var table=document.createElement('table');
  table.className='sequence-grid' + (state.sequenceCompact ? ' sequence-compact' : '');
  table.innerHTML='<colgroup>' + cols.map(function(col){ return '<col data-key="'+col.key+'" style="width:'+col.width+'px">'; }).join('') + '</colgroup><thead><tr>' +
    cols.map(function(col,idx){ return '<th data-key="'+col.key+'"><div class="th-inner"><span class="th-label">'+escapeHtml(col[state.language]||col.ru)+'</span><span class="sort-mark">'+(state.sequenceSortKey===col.key?(state.sequenceSortAsc?'▲':'▼'):'↕')+'</span><span class="col-resize" data-index="'+idx+'"></span></div></th>'; }).join('') +
    '</tr></thead><tbody></tbody>';
  var tbody=qs('tbody', table);
  rows.forEach(function(row){
    var tr=document.createElement('tr');
    if (state.sequenceViewMode==='sequence'){
      tr.style.cursor='pointer';
      if (row.key===state.selectedSequenceKey) tr.classList.add('selected');
      tr.addEventListener('click', function(){
        applySequence(row.key);
        closeSequenceModal();
      });
    }
    tr.innerHTML=cols.map(function(col){
      var val=row[col.key]===undefined?'':row[col.key];
      return '<td title="'+escapeHtml(val)+'">'+sequenceCellHtml(val)+'</td>';
    }).join('');
    tbody.appendChild(tr);
  });
  host.appendChild(table);
  qsa('th', table).forEach(function(th){
    th.addEventListener('click', function(e){
      if (e.target.classList.contains('col-resize')) return;
      var key=th.getAttribute('data-key');
      if (state.sequenceSortKey===key) state.sequenceSortAsc=!state.sequenceSortAsc;
      else { state.sequenceSortKey=key; state.sequenceSortAsc=true; }
      renderSequenceModal();
    });
  });
  setupSequenceColumnResizers();
}
function openSequenceModal(){ renderSequenceModal(); renderSequenceColumnMenu(); qs('#sequenceModal').classList.remove('hidden'); }
function closeSequenceModal(){ qs('#sequenceModal').classList.add('hidden'); }

function copyTable(table){
  if (!table) return;
  var rows=qsa('tr', table).map(function(tr){ return qsa('th,td', tr).map(function(td){ return (td.innerText || td.textContent || '').trim(); }).join('\t'); }).join('\n');
  writeClipboard(rows);
}

function copyTree(){
  var root=qs('#treeRootView');
  if (!root) return;
  var lines=[];
  function walk(parent, level){
    qsa(':scope > li', parent).forEach(function(li){
      if (li.style.display==='none') return;
      var label=qs(':scope > .tree-row .tree-label', li);
      if (!label) return;
      var seq=qs(':scope > .tree-row .tree-seq', li);
      var line=new Array(level+1).join('  ') + label.textContent.trim();
      if (seq && seq.textContent.trim()) line += ' [' + seq.textContent.trim() + ']';
      lines.push(line);
      var childList=qs(':scope > ul', li);
      if (childList && (li.classList.contains('expanded') || li.classList.contains('match-branch'))) walk(childList, level+1);
    });
  }
  walk(root,0);
  writeClipboard(lines.join('\n'));
}

function writeClipboard(text){
  if (navigator.clipboard && navigator.clipboard.writeText){
    navigator.clipboard.writeText(text).catch(function(){ fallbackCopy(text); });
  } else {
    fallbackCopy(text);
  }
}

function fallbackCopy(text){
  var ta=document.createElement('textarea');
  ta.value=text;
  ta.setAttribute('readonly','');
  ta.style.position='fixed';
  ta.style.left='-9999px';
  document.body.appendChild(ta);
  ta.select();
  try{ document.execCommand('copy'); }catch(e){}
  document.body.removeChild(ta);
}

function renderColumnMenu(){
  var host=qs('#contentColumnsMenu');
  host.innerHTML='<div class="column-menu-title">'+escapeHtml(t('columns'))+'</div>' + state.columnOrder.map(function(key){ var col=columns.find(function(c){ return c.key===key; }); if (!col) return ''; var checked=state.visibleColumns.indexOf(key)!==-1; return '<label class="column-option"><input type="checkbox" data-key="'+key+'" '+(checked?'checked':'')+'><span>'+escapeHtml(col[state.language]||col.ru)+'</span></label>'; }).join('');
  qsa('input[type="checkbox"]', host).forEach(function(cb){
    cb.addEventListener('change', function(){
      var key=cb.getAttribute('data-key');
      if (cb.checked){ if (state.visibleColumns.indexOf(key)===-1) state.visibleColumns.push(key); }
      else if (state.visibleColumns.length>1){ state.visibleColumns=state.visibleColumns.filter(function(x){ return x!==key; }); }
      else { cb.checked=true; return; }
      buildContentHeader(); renderContentTable(); setupColumnResizers(); setupColumnDrag(); renderColumnMenu();
    });
  });
}

function renderSequenceColumnMenu(){
  var host=qs('#sequenceColumnsMenu');
  if (!host) return;
  var list=sequenceColumnList();
  var visible=sequenceVisibleColumns();
  host.innerHTML='<div class="column-menu-title">'+escapeHtml(t('columns'))+'</div>' + sequenceColumnOrder().map(function(key){
    var col=list.find(function(c){ return c.key===key; });
    if (!col) return '';
    var checked=visible.indexOf(key)!==-1;
    return '<label class="column-option"><input type="checkbox" data-key="'+key+'" '+(checked?'checked':'')+'><span>'+escapeHtml(col[state.language]||col.ru)+'</span></label>';
  }).join('');
  qsa('input[type="checkbox"]', host).forEach(function(cb){
    cb.addEventListener('change', function(){
      var key=cb.getAttribute('data-key');
      var next=sequenceVisibleColumns().slice();
      if (cb.checked){
        if (next.indexOf(key)===-1) next.push(key);
      } else if (next.length>1) {
        next=next.filter(function(x){ return x!==key; });
      } else {
        cb.checked=true;
        return;
      }
      setSequenceVisibleColumns(next);
      renderSequenceModal();
      renderSequenceColumnMenu();
    });
  });
}

function setupColumnDrag(){
  var dragKey=null;
  qsa('#contentTable th').forEach(function(th){
    th.addEventListener('dragstart', function(){ dragKey=th.getAttribute('data-key'); th.classList.add('dragging'); });
    th.addEventListener('dragend', function(){ th.classList.remove('dragging'); qsa('#contentTable th.drag-over').forEach(function(x){x.classList.remove('drag-over');}); });
    th.addEventListener('dragover', function(e){ e.preventDefault(); th.classList.add('drag-over'); });
    th.addEventListener('dragleave', function(){ th.classList.remove('drag-over'); });
    th.addEventListener('drop', function(e){
      e.preventDefault(); th.classList.remove('drag-over');
      var targetKey=th.getAttribute('data-key');
      if (!dragKey || dragKey===targetKey) return;
      var order=state.columnOrder.slice();
      var from=order.indexOf(dragKey), to=order.indexOf(targetKey);
      if (from===-1 || to===-1) return;
      order.splice(to,0,order.splice(from,1)[0]);
      state.columnOrder=order;
      buildContentHeader(); renderContentTable(); setupColumnResizers(); setupColumnDrag(); renderColumnMenu();
    });
  });
}

function applyLanguage(){
  document.documentElement.lang=state.language;
  qs('#appEyebrow').textContent='';
  qs('#appProjectName').textContent=state.projectName||t('projectFallback');
  qs('#globalSearchInput').placeholder=t('search');
  renderSequenceSelect();
  qs('#expandAllButton').textContent=t('expand');
  qs('#collapseAllButton').textContent=t('collapse');
  qs('#resetButton').textContent=t('reset');
  qs('#openSequencesButton').textContent=t('seqBtn');
  qs('#toggleTreeFilesButton').textContent=state.treeFilesVisible?t('hideTreeFiles'):t('showTreeFiles');
  qs('#toggleContentButton').textContent=state.contentVisible?t('hideContent'):t('showContent');
  qs('#toggleViewerButton').textContent=state.viewerVisible?t('hideViewer'):t('showViewer');
  qs('#treeTitle').textContent=t('sections');
  qs('#treeSub').textContent=t('sectionsSub');
  qs('#copyTreeButton').textContent=t('copyTree');
  qs('#contentTitle').textContent=t('content');
  qs('#copyContentTableButton').textContent=t('copyTable');
  qs('#toggleAllFilesButton').textContent=state.allFilesMode?t('showSectionFiles'):t('showAllFiles');
  var colBtn=qs('#contentColumnsButton'); if (colBtn) colBtn.textContent=t('columns');
  qs('#viewerTitle').textContent=t('viewer');
  qs('#viewerSub').textContent=t('viewerSub');
  qs('#viewerEmptyState').textContent=t('viewerEmpty');
  qs('#contentEmpty').textContent=state.allFilesMode || state.selectedSectionIds.size ? (qs('#contentTable').hidden ? t('noData') : '') : t('contentEmpty');
  qs('#sequenceModalTitle').textContent=t('modalTitle');
  qs('#copySequenceTableButton').textContent=t('modalCopy');
  qs('#sequenceModeButton').textContent=state.sequenceViewMode==='sequence'?t('sequenceModeDate'):t('sequenceModeSequence');
  qs('#toggleSequenceTextButton').textContent=state.sequenceCompact?t('sequenceFull'):t('sequenceCompact');
  qs('#sequenceColumnsButton').textContent=t('columns');
  qs('#sequenceCloseButton').textContent=t('close');
  qs('#popupTitle').textContent=t('popupTitle');
  qs('#popupCloseButton').textContent=t('close');
  qsa('.tree-open-link').forEach(function(link){ link.title=t('openFile'); });
  qsa('.lang-btn').forEach(function(btn){ btn.classList.toggle('active', btn.dataset.lang===state.language); });
  buildContentHeader();
  renderContentTable();
  renderColumnMenu();
  renderSequenceColumnMenu();
  if (!qs('#sequenceModal').classList.contains('hidden')) renderSequenceModal();
  setupColumnResizers();
  setupColumnDrag();
  updateLayout();
}

function resetAll(){
  state.globalQuery='';
  state.sequenceGuids=null;
  state.selectedSequenceKey='';
  state.allFilesMode=false;
  qs('#globalSearchInput').value='';
  var select=qs('#sequenceSelect'); if (select) select.value='';
  state.selectedFileId=null;
  closeInfo();
  renderSectionFilter();
  applyLanguage();
}

function toggleTreeFiles(){
  state.treeFilesVisible=!state.treeFilesVisible;
  buildSectionTree();
  renderSectionFilter();
  applyLanguage();
}
function toggleContent(){
  state.contentVisible=!state.contentVisible;
  applyLanguage();
}
function toggleViewer(){
  state.viewerVisible=!state.viewerVisible;
  applyLanguage();
}
function toggleAllFiles(){
  state.allFilesMode=!state.allFilesMode;
  applyLanguage();
}

function getVisiblePaneKeys(){
  var keys=['tree'];
  if (state.contentVisible) keys.push('content');
  if (state.viewerVisible) keys.push('viewer');
  return keys;
}
function paneEl(key){ return key==='tree' ? qs('#treePane') : key==='content' ? qs('#contentPane') : qs('#viewerPane'); }
function updateLayout(){
  qs('#contentPane').classList.toggle('pane-hidden', !state.contentVisible);
  qs('#viewerPane').classList.toggle('pane-hidden', !state.viewerVisible);
  var keys=getVisiblePaneKeys();
  qs('#leftResizer').classList.toggle('resizer-hidden', !(keys.indexOf('tree')!==-1 && keys.length>1));
  qs('#rightResizer').classList.toggle('resizer-hidden', !(state.contentVisible && state.viewerVisible));
  keys.forEach(function(key, idx){
    var el=paneEl(key);
    if (!el) return;
    if (keys.length===1 || idx===keys.length-1){
      el.style.flex='1 1 0';
    } else {
      var max=Math.max(paneMin[key], qs('#appWorkspace').clientWidth - 360);
      state.paneSizes[key]=clamp(state.paneSizes[key], paneMin[key], max);
      el.style.flex='0 0 ' + state.paneSizes[key] + 'px';
    }
  });
}

function getResizePair(handleId){
  var keys=getVisiblePaneKeys();
  if (handleId==='leftResizer'){
    if (keys.length<2 || keys[0]!=='tree') return null;
    return {left:keys[0], right:keys[1]};
  }
  if (handleId==='rightResizer' && state.contentVisible && state.viewerVisible) return {left:'content', right:'viewer'};
  return null;
}

function setupResizer(handle){
  if (!handle) return;
  handle.addEventListener('mousedown', function(e){
    var pair=getResizePair(handle.id);
    if (!pair) return;
    e.preventDefault();
    handle.classList.add('is-active');
    var keys=getVisiblePaneKeys();
    var rightIsFlexible=keys[keys.length-1]===pair.right;
    var startX=e.clientX;
    var leftStart=(paneEl(pair.left)||{}).getBoundingClientRect ? paneEl(pair.left).getBoundingClientRect().width : state.paneSizes[pair.left];
    var rightStart=(paneEl(pair.right)||{}).getBoundingClientRect ? paneEl(pair.right).getBoundingClientRect().width : state.paneSizes[pair.right];
    function onMove(ev){
      var dx=ev.clientX-startX;
      state.paneSizes[pair.left]=clamp(leftStart + dx, paneMin[pair.left], Math.max(paneMin[pair.left], leftStart + rightStart - paneMin[pair.right]));
      if (!rightIsFlexible){
        state.paneSizes[pair.right]=clamp(rightStart - dx, paneMin[pair.right], Math.max(paneMin[pair.right], leftStart + rightStart - paneMin[pair.left]));
      }
      updateLayout();
    }
    function onUp(){ handle.classList.remove('is-active'); document.removeEventListener('mousemove',onMove); document.removeEventListener('mouseup',onUp); }
    document.addEventListener('mousemove', onMove); document.addEventListener('mouseup', onUp);
  });
}

function setupColumnResizers(){
  qsa('#contentTable th .col-resize').forEach(function(handle){
    if (handle.dataset.bound) return;
    handle.dataset.bound='1';
    handle.addEventListener('mousedown', function(e){
      e.preventDefault(); e.stopPropagation();
      var th=handle.closest('th'); var startX=e.clientX; var startW=th.offsetWidth;
      function onMove(ev){ th.style.width=Math.max(60, startW + (ev.clientX-startX))+'px'; }
      function onUp(){ document.removeEventListener('mousemove', onMove); document.removeEventListener('mouseup', onUp); }
      document.addEventListener('mousemove', onMove); document.addEventListener('mouseup', onUp);
    });
  });
}

function setupSequenceColumnResizers(){
  qsa('#sequenceTableHost th .col-resize').forEach(function(handle){
    if (handle.dataset.bound) return;
    handle.dataset.bound='1';
    handle.addEventListener('mousedown', function(e){
      e.preventDefault(); e.stopPropagation();
      var th=handle.closest('th');
      var key=th.getAttribute('data-key');
      var list=sequenceColumnList();
      var col=list.find(function(item){ return item.key===key; });
      var colEl=qs('#sequenceTableHost col[data-key="'+cssEscape(key)+'"]');
      var startX=e.clientX;
      var startW=colEl ? colEl.getBoundingClientRect().width : th.offsetWidth;
      function onMove(ev){
        var width=Math.max(60, startW + (ev.clientX-startX));
        if (col) col.width=width;
        if (colEl) colEl.style.width=width+'px';
      }
      function onUp(){ document.removeEventListener('mousemove', onMove); document.removeEventListener('mouseup', onUp); }
      document.addEventListener('mousemove', onMove); document.addEventListener('mouseup', onUp);
    });
  });
}

function setupEvents(){
  qs('#contentTable tbody').addEventListener('click',function(e){var row=e.target.closest('tr[data-file-id]');if(row) selectFile(row.dataset.fileId);});
  qs('#contentTable tbody').addEventListener('dblclick',function(e){var row=e.target.closest('tr[data-file-id]');if(row) showInfo(row.dataset.fileId);});
  qs('#treeBody').addEventListener('click',function(e){
    if(e.target.closest('.tree-open-link')) return;
    var row=e.target.closest('.tree-row');if(!row) return;
    var li=row.parentElement;
    if(li.classList.contains('tree-file')) selectFileFromTree(li.dataset.fileId);
    else if(e.target.closest('.tree-caret') && !e.target.closest('.placeholder')) toggleFolder(li);
    else selectSection(li.dataset.nodeId,e);
  });
  qs('#treeBody').addEventListener('dblclick',function(e){
    if(e.target.closest('.tree-open-link')) return;
    var row=e.target.closest('.tree-row');if(!row) return;
    var li=row.parentElement;
    if(li.classList.contains('tree-file')) showInfo(li.dataset.fileId);
    else if(!qs(':scope > .tree-row .tree-caret.placeholder',li)) toggleFolder(li);
  });
  qs('#treeBody').addEventListener('contextmenu',function(e){var li=e.target.closest('.tree-file');if(li){e.preventDefault();openFileInNewWindow(li.dataset.fileId);}});
  qs('#expandAllButton').addEventListener('click', function(){ qsa('#treeRootView .tree-folder').forEach(function(li){ toggleFolder(li,true); }); });
  qs('#collapseAllButton').addEventListener('click', function(){ qsa('#treeRootView .tree-folder').forEach(function(li){ toggleFolder(li,false); }); });
  qs('#resetButton').addEventListener('click', resetAll);
  qs('#openSequencesButton').addEventListener('click', openSequenceModal);
  qs('#toggleTreeFilesButton').addEventListener('click', toggleTreeFiles);
  qs('#toggleContentButton').addEventListener('click', toggleContent);
  qs('#toggleViewerButton').addEventListener('click', toggleViewer);
  qs('#toggleAllFilesButton').addEventListener('click', toggleAllFiles);
  qs('#copyTreeButton').addEventListener('click', copyTree);
  qs('#copyContentTableButton').addEventListener('click', function(){ copyTable(qs('#contentTable')); });
  qs('#sequenceSelect').addEventListener('change', function(){ applySequence(this.value); });
  var colBtn=qs('#contentColumnsButton'); if (colBtn) colBtn.addEventListener('click', function(e){ e.stopPropagation(); qs('#contentColumnsMenu').classList.toggle('hidden'); });
  qs('#sequenceModeButton').addEventListener('click', function(e){
    e.stopPropagation();
    state.sequenceViewMode=state.sequenceViewMode==='sequence'?'date':'sequence';
    state.sequenceSortKey='';
    renderSequenceModal();
    renderSequenceColumnMenu();
    applyLanguage();
  });
  qs('#toggleSequenceTextButton').addEventListener('click', function(e){
    e.stopPropagation();
    state.sequenceCompact=!state.sequenceCompact;
    renderSequenceModal();
    applyLanguage();
  });
  qs('#sequenceColumnsButton').addEventListener('click', function(e){ e.stopPropagation(); qs('#sequenceColumnsMenu').classList.toggle('hidden'); });
  qs('#copySequenceTableButton').addEventListener('click', function(){ copyTable(qs('#sequenceTableHost table')); });
  qs('#sequenceCloseButton').addEventListener('click', closeSequenceModal);
  qs('#sequenceModal').addEventListener('click', function(e){ if (e.target.id==='sequenceModal') closeSequenceModal(); });
  qs('#popupCloseButton').addEventListener('click', closeInfo);
  qsa('.lang-btn').forEach(function(btn){ btn.addEventListener('click', function(){ state.language=btn.dataset.lang; applyLanguage(); }); });
  var searchFrame=0;
  qs('#globalSearchInput').addEventListener('input', function(){ state.globalQuery=normalize(this.value); if(searchFrame) cancelAnimationFrame(searchFrame); searchFrame=requestAnimationFrame(function(){searchFrame=0;renderSectionFilter();renderContentTable();}); });
  document.addEventListener('click', function(e){
    var details=e.target.closest && e.target.closest('.details-link');
    if (details){ e.preventDefault(); var li=details.closest('li[data-node-id]'); if(li) showInfo(li.getAttribute('data-node-id')); return; }
    var menu=qs('#contentColumnsMenu');
    if (menu && !menu.classList.contains('hidden') && !menu.contains(e.target) && e.target.id!=='contentColumnsButton') menu.classList.add('hidden');
    var seqMenu=qs('#sequenceColumnsMenu');
    if (seqMenu && !seqMenu.classList.contains('hidden') && !seqMenu.contains(e.target) && e.target.id!=='sequenceColumnsButton') seqMenu.classList.add('hidden');
  });
  document.addEventListener('keydown', function(e){ if (e.key==='Escape'){ closeInfo(); closeSequenceModal(); qs('#contentColumnsMenu').classList.add('hidden'); qs('#sequenceColumnsMenu').classList.add('hidden'); } });
  window.addEventListener('resize', updateLayout);
  setupResizer(qs('#leftResizer'));
  setupResizer(qs('#rightResizer'));
}

try{
  parseDossier();
  buildShell();
  buildSectionTree();
  renderSectionFilter();
  applyLanguage();
  setupEvents();
}catch(error){
  document.body.textContent='Не удалось открыть HTML-представление досье: '+error.message;
}

window.expandall=function(){ qsa('#treeRootView .tree-folder').forEach(function(li){ toggleFolder(li,true); }); };
window.showInfoPopup=function(el){ if (el && el.closest){ var li=el.closest('li[data-node-id]'); if(li) showInfo(li.getAttribute('data-node-id')); } };
})();
</script>
</body>
</html>
