Siber Risk Değerlendirme ve Yönetici Karar Formu

Form; bir siber güvenlik riskini tehdit, zafiyet, olasılık, etki ve mevcut kontrollerle birlikte değerlendirerek yönetim kararına dönüştürmek için kullanılır.

Formda önce riskin kapsamı ve senaryosu tanımlanır. Ardından Doğal Risk hesaplanır, mevcut güvenlik kontrolleri değerlendirilir ve kontroller sonrasında Kalan Risk belirlenir. Kalan risk, kurumun risk toleransıyla karşılaştırılarak uygun cevap seçilir: Azaltma, Kaçınma, Paylaşma/Transfer veya Kabul.

Excel Dışarı Aktar form verilerini Excel’e kaydeder, Excel İçeri Aktar mevcut kaydı forma yükler, PDF / Yazdır ise rapor çıktısı oluşturur.

Bir Not defteri açarak, aşağıdaki (Mavi satırlar) html kodu içine kaydedin. Not defteri uzantısını .txt yerine ".html" olarak değiştirip kaydedin. Ör: "Siber Risk Değerlendirme ve Yönetici Karar Formu.html" sayfayı kapatıp tekrar açtığınızda, web browser üzerinden sayfanız açılacaktır. 

Sol tarafta görünen logo için, html dosyanız nerede ise, masaüstü veya oluşturulan bir klasör. Logonuzda aynı yerde olursa forma yansır. Logo ismi "logo.jpg" olmalı. Çift tıklayarak açtığınızda, browser üzerinde form açılışı gerçekleşir. Veya alanına 5 kez peş peşe tıklayarak çalışma esnasında logo değişimi de yapılabilir.

Başlık, başlığın altındaki, başlığın sağındaki ve alttaki yazıları, not defteri içinde "Ctrl + F" tuşları ile kelime yazarak bulabilir, ilgili metinleri kendinize göre uyarlayarak kaydederek kullanabilirsiniz. Başlık alanındaki "OLGUN BAŞKANLIĞI" alanına 5 kez peş peşe tıklayarak; Departman, Müdürlük veya Başkanlığınıza ait bilgiyi manuel girebilirsiniz.

Formun boş hali;

Formun dolu hali:

Dışarı Aktarılan Excel Verisi:

PDF / Yazdır


HTML Kod:
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Siber Risk Değerlendirme ve Yönetici Karar Formu</title>
<style>
:root{
  --bg:#f8fafc;--panel:#ffffff;--line:#dbe3ea;--text:#172033;--muted:#64748b;
  --blue:#0284c7;--blue-soft:#e0f2fe;--blue-deep:#075985;
  --low:#dcfce7;--low-b:#86efac;--mid:#fef3c7;--mid-b:#fcd34d;
  --high:#ffedd5;--high-b:#fdba74;--crit:#fee2e2;--crit-b:#fca5a5;
  --shadow:0 2px 8px rgba(15,23,42,.06);--radius:6px;
}
*{box-sizing:border-box}
body{margin:0;min-width:1180px;padding:12px;background:var(--bg);color:var(--text);font-family:"Segoe UI",Arial,sans-serif;font-size:13px}
.app{width:100%;max-width:1600px;margin:0 auto;padding:10px;background:#ffffff;border:1px solid var(--line);border-radius:8px;box-shadow:var(--shadow)}
.header{
  width:100%;
  max-width:100%;
  margin-left:0;
  margin-right:0;
  display:grid;
  grid-template-columns:60px minmax(0,1fr) max-content;
  align-items:center;
  gap:12px;
  background:#fff;
  border:1px solid var(--line);
  border-left:5px solid var(--blue);
  border-radius:6px;
  padding:10px 14px;
  box-shadow:var(--shadow);
  margin-top:0;
  margin-bottom:10px
}
.logo-box{
  width:60px;
  height:60px;
  display:flex;
  align-items:center;
  justify-content:center;
  overflow:hidden;
  cursor:pointer;
  margin:0;
  padding:0
}
.logo-box:hover{
  outline:1px dashed #94a3b8;
  border-radius:4px
}
.logo-box:focus-visible{
  outline:2px solid var(--blue);
  outline-offset:2px
}
.logo-box img{
  width:100%;
  height:100%;
  object-fit:contain;
  display:block
}
.logo-fallback{
  font-weight:700;
  color:var(--blue);
  font-size:11px;
  text-align:center;
  line-height:1.15
}
.headerTitleBlock{
  align-self:center;
  min-width:0
}
.title-main{
  font-size:21px;
  font-weight:750;
  line-height:1.15;
  margin:0;
  padding:0;
  color:#0f172a;
  text-align:left
}
.title-sub{
  margin-top:4px;
  color:var(--muted);
  font-size:11.5px;
  line-height:1.35;
  font-weight:400;
  text-align:left
}
.org-title{
  justify-self:end;
  align-self:center;
  width:max-content;
  max-width:40vw;
  min-width:0;
  text-align:right;
  color:#000;
  font-size:15px;
  font-weight:700;
  white-space:nowrap;
  overflow:hidden;
  text-overflow:ellipsis;
  outline:none
}
.org-title.editing{
  max-width:min(55vw,760px);
  min-width:180px;
  width:max-content;
  margin-left:auto;
  overflow:visible;
  text-overflow:clip;
  white-space:nowrap;
  outline:1px dashed var(--blue);
  background:#f0f9ff;
  border-radius:3px;
  padding:2px 4px;
  cursor:text
}

.toolbar{
  display:flex;
  flex-wrap:nowrap;
  align-items:center;
  gap:8px;
  overflow-x:auto;
  scrollbar-width:thin;
  width:100%;
  max-width:100%;
  margin-left:0;
  margin-right:0;
  background:#fff;
  border:1px solid var(--line);
  border-radius:6px;
  box-shadow:var(--shadow);
  padding:9px 14px;
  margin-top:0;
  margin-bottom:10px
}
button,.button-like{
  height:36px;
  display:inline-flex;
  flex:0 0 auto;
  align-items:center;
  justify-content:center;
  margin:0;
  white-space:nowrap;
  border:1px solid #cbd5e1;
  border-radius:6px;
  padding:8px 12px;
  background:#f1f5f9;
  color:#334155;
  font:700 12px "Segoe UI",Arial,sans-serif;
  cursor:pointer
}
button:hover,.button-like:hover{
  filter:brightness(.97)
}
button.primary{
  background:var(--blue-soft);
  border-color:#bae6fd;
  color:var(--blue-deep)
}
button.primary:hover{
  background:var(--blue-soft)
}
button.soft{
  background:var(--blue-soft);
  border-color:#bae6fd;
  color:var(--blue-deep)
}
button.excel-export{
  background:var(--blue-soft);
  border-color:#bae6fd;
  color:var(--blue-deep)
}
button.excel-export:hover{
  background:var(--blue-soft)
}
.button-like.excel-import{
  background:#dcfce7;
  border-color:#bbf7d0;
  color:#166534
}
.button-like.excel-import:hover{
  background:#dcfce7
}
.toolbar .spacer{
  flex:1
}
.statusline{
  flex:0 0 auto;
  margin-left:auto;
  color:var(--muted);
  font-size:11px;
  white-space:nowrap
}

.section{
  width:100%;max-width:100%;margin-left:0;margin-right:0;
  background:#fff;border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow);
  margin-bottom:10px;overflow:hidden;break-inside:avoid
}
.section-title{
  display:flex;align-items:center;justify-content:space-between;gap:10px;
  padding:8px 10px 8px 12px;
  background:#f8fbfd;
  border-bottom:1px solid #dbe3ea;
  border-left:4px solid #0284c7;
  color:#075985;
  font-weight:700;
  font-size:13px;
  line-height:1.2
}
.section-title span{display:block}
.section-title small{
  font-weight:500;
  color:#64748b;
  font-size:11px;
  text-align:right;
  line-height:1.25
}
.section-body{padding:10px}
.grid{display:grid;gap:8px}
.g2{grid-template-columns:repeat(2,minmax(0,1fr))}
.g3{grid-template-columns:repeat(3,minmax(0,1fr))}
.g4{grid-template-columns:repeat(4,minmax(0,1fr))}
.g5{grid-template-columns:repeat(5,minmax(0,1fr))}
.field{min-width:0}
label{display:block;font-size:11.5px;font-weight:650;color:#334155;margin:0 0 4px}
input,select,textarea{
  width:100%;border:1px solid #cbd5e1;border-radius:5px;background:#fff;color:#0f172a;
  padding:7px 8px;font:12.5px "Segoe UI",Arial,sans-serif;outline:none
}
input:focus,select:focus,textarea:focus{border-color:#38bdf8;box-shadow:0 0 0 2px rgba(14,165,233,.10)}
textarea{min-height:66px;resize:none;overflow:hidden;line-height:1.45}
textarea.tall{min-height:90px}
.readonly{background:#f8fafc;color:#334155}
.hint{font-size:10.5px;color:var(--muted);margin-top:4px;line-height:1.35}
.inline-check{display:flex;align-items:center;gap:6px;padding:6px 8px;border:1px solid #e2e8f0;border-radius:5px;background:#f8fafc}
.inline-check input{width:auto}
.inline-check label{margin:0;font-weight:500}
.chips{display:flex;flex-wrap:wrap;gap:6px}
.chip{padding:5px 8px;border:1px solid #cbd5e1;border-radius:999px;background:#fff;font-size:11.5px;cursor:pointer;user-select:none}
.chip input{display:none}
.chip:has(input:checked){background:#e0f2fe;border-color:#7dd3fc;color:#075985;font-weight:650}

.score-card{
  border:1px solid #cbd5e1;border-radius:6px;background:#f8fafc;padding:9px;text-align:center;min-height:70px
}
.score-label{font-size:10.5px;color:var(--muted);margin-bottom:4px}
.score-value{font-size:22px;font-weight:800;line-height:1}
.score-level{font-size:11.5px;font-weight:700;margin-top:5px}
.risk-low{background:var(--low);border-color:var(--low-b);color:#166534}
.risk-mid{background:var(--mid);border-color:var(--mid-b);color:#854d0e}
.risk-high{background:var(--high);border-color:var(--high-b);color:#9a3412}
.risk-critical{background:var(--crit);border-color:var(--crit-b);color:#991b1b}
.risk-na{background:#f8fafc;border-color:#cbd5e1;color:#475569}

.risk-layout{display:grid;grid-template-columns:minmax(0,1.25fr) minmax(360px,.75fr);gap:10px}
.matrix-wrap{border:1px solid #dbe3ea;border-radius:6px;padding:9px;background:#fff}
.matrix-title{text-align:center;font-size:11.5px;font-weight:700;margin-bottom:6px}
.matrix{display:grid;grid-template-columns:50px repeat(5,1fr);gap:3px;align-items:stretch}
.m-head,.m-axis,.m-cell{display:flex;align-items:center;justify-content:center;min-height:34px;border-radius:4px;font-size:10.5px}
.m-head,.m-axis{background:#f1f5f9;color:#475569;font-weight:700;text-align:center;padding:3px}
.m-cell{border:1px solid transparent;font-weight:700;position:relative}
.m-cell .marks{position:absolute;right:3px;top:2px;font-size:9px;display:flex;gap:2px}
.mark{display:inline-flex;width:14px;height:14px;border-radius:50%;align-items:center;justify-content:center;background:#0f172a;color:#fff;font-size:8px}
.legend{display:flex;flex-wrap:wrap;gap:7px;margin-top:7px;font-size:10px;color:#475569}
.legend span{display:inline-flex;align-items:center;gap:4px}
.swatch{width:11px;height:11px;border-radius:3px;border:1px solid #cbd5e1}
.info{
  padding:8px 10px;border-left:3px solid #38bdf8;background:#f0f9ff;color:#0c4a6e;
  font-size:11.5px;line-height:1.45;border-radius:4px
}
.warning{border-left-color:#f59e0b;background:#fffbeb;color:#78350f}
.decision{
  border:1px solid #bae6fd;background:#f0f9ff;border-radius:6px;padding:10px;line-height:1.5;
  white-space:pre-wrap;min-height:82px
}
.badge{display:inline-flex;align-items:center;border-radius:999px;padding:4px 7px;font-size:10.5px;font-weight:700;border:1px solid #cbd5e1}
.badge.ok{background:#dcfce7;border-color:#86efac;color:#166534}
.badge.bad{background:#fee2e2;border-color:#fca5a5;color:#991b1b}
.hidden{display:none!important}
.footer-note{padding:0 2px 2px;color:#64748b;font-size:10.5px;line-height:1.4}

@media print{
  .header,.toolbar{width:100%!important;max-width:100%!important;margin-left:0!important;margin-right:0!important;border-radius:6px!important}
  @page{size:A4 landscape;margin:8mm 8mm 14mm 8mm; @bottom-right{content:"Sayfa " counter(page) " / " counter(pages);font-family:"Segoe UI",Arial,sans-serif;font-size:8pt;color:#64748b;}}
  body{background:#fff;font-size:9.5pt;padding:0;-webkit-print-color-adjust:exact;print-color-adjust:exact}
  .app{width:100%;max-width:none;margin:0;padding:6px;border:1px solid var(--line);border-radius:6px;box-shadow:none;background:#fff}
  .header,.toolbar,.section{width:100%;max-width:100%;margin-left:0;margin-right:0}
  .toolbar,.no-print,.footer-note{display:none!important}
  .header,.section{box-shadow:none}
  .header{grid-template-columns:46px minmax(0,1fr) max-content;gap:8px;margin:0 0 7px;padding:7px 10px;border-left:5px solid var(--blue);break-inside:avoid}
  .section{margin-bottom:4mm}
  .section-title{padding:5px 7px 5px 9px;border-left-width:3px}
  .section-body{padding:7px}
  input,select,textarea{font-size:9pt;padding:4px 5px;border-color:#bfc8d2}
  textarea{min-height:42px}
  textarea.tall{min-height:56px}
  .hint{font-size:7.5pt}
  .score-value{font-size:16pt}
  .m-head,.m-axis,.m-cell{min-height:25px}
  .logo-box{width:46px;height:46px}\n  .title-main{font-size:17px}\n  .title-sub{font-size:10px}\n  .org-title{max-width:42vw;font-size:13px}
  .section,.matrix-wrap,.score-card{break-inside:avoid}
}
</style>
<script src="https://cdn.sheetjs.com/xlsx-0.20.3/package/dist/xlsx.full.min.js"></script>
</head>
<body>
<div class="app">

  <header class="header">
    <div id="logoBox" class="logo-box" role="button" tabindex="0" aria-label="Logoyu değiştirmek için beş kez tıklayın" title="Logo.jpg varsa başlıkta gösterilir. Değiştirmek için 5 kez art arda tıklayın">
      <img id="headerLogo" src="logo.jpg" alt="Logo" onerror="this.style.display='none';document.getElementById('logoFallback').style.display='block'">
      <div id="logoFallback" class="logo-fallback" style="display:none">KURUM<br>LOGOSU</div>
    </div>
    <div class="headerTitleBlock">
      <div class="title-main">Siber Risk Değerlendirme ve Yönetici Karar Formu</div>
      <div class="title-sub">(Teknik bulguyu kritik görev, iş etkisi, kalan risk ve yönetim kararına dönüştürme)</div>
    </div>
    <div id="orgTitle" class="org-title" title="Düzenlemek için art arda 5 kez tıklayın">OLGUN BAŞKANLIĞI</div>
  </header>

  <nav class="toolbar" aria-label="Form işlemleri">
    <button type="button" class="excel-export" onclick="exportExcel()">Excel Dışarı Aktar</button>
    <label class="button-like excel-import" for="excelFile">Excel İçeri Aktar</label>
    <input id="excelFile" type="file" accept=".xlsx,.xls,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel" class="hidden" onchange="importExcel(event)">
    <button type="button" id="printButton" onclick="window.print()" title="PDF olarak kaydetmek veya yazdırmak için kullanın.">PDF / Yazdır</button>
    <div class="spacer"></nav>
    <div id="saveState" class="statusline">Form hazır</div>
  </div>
  <input id="logoFile" type="file" accept="image/png,image/jpeg,image/webp" class="hidden" onchange="changeLogo(event)">

  <section class="section">
    <div class="section-title"><span>1. Kayıt ve Kurumsal Bağlam</span><small>Önce “neyi koruyoruz?” sorusunu cevaplayın.</small></div>
    <div class="section-body">
      <div class="grid g4">
        <div class="field"><label>Risk ID</label><input id="riskId" placeholder="Risk kayıt numarası"></div>
        <div class="field"><label>Değerlendirme Tarihi</label><input id="assessmentDate" type="date"></div>
        <div class="field"><label>Değerlendiren Birim / Kişi</label><input id="assessor" placeholder="Birim veya ad-soyad"></div>
        <div class="field"><label>Risk Sahibi</label><input id="riskOwner" placeholder="Hizmetten/riskten sorumlu yönetici"></div>
      </div>
      <div class="grid g3" style="margin-top:8px">
        <div class="field"><label>Kritik Görev / Kurumsal Hedef</label><input id="mission" placeholder="Risk hangi kritik görevi etkiliyor?"></div>
        <div class="field"><label>Kritik Hizmet / İş Süreci</label><input id="service" placeholder="Görevi hangi hizmet gerçekleştiriyor?"></div>
        <div class="field"><label>Etkilenen Varlık / Sistem</label><input id="asset" placeholder="Uygulama, sunucu, ağ bileşeni, veri vb."></div>
      </div>
      <div class="grid g3" style="margin-top:8px">
        <div class="field"><label>Varlık / Hizmet Kritiklik Seviyesi</label>
          <select id="criticality">
            <option value="">Seçiniz</option><option>Düşük</option><option>Orta</option><option>Yüksek</option><option>Kritik</option>
          </select>
        </div>
        <div class="field"><label>Varlık Sahibi / İş Birimi</label><input id="assetOwner" placeholder="İlgili birim"></div>
        <div class="field"><label>Veri / Hizmet Sınıfı</label>
          <select id="dataClass"><option value="">Seçiniz</option><option>Genel</option><option>Kurum İçi</option><option>Hassas</option><option>Kritik / Düzenlemeye Tabi</option></select>
        </div>
      </div>
    </div>
  </section>

  <section class="section">
    <div class="section-title"><span>2. Risk Senaryosu, Tehdit ve Zafiyet</span><small>Zafiyet tek başına risk değildir.</small></div>
    <div class="section-body">
      <div class="field">
        <label>Risk Senaryosu</label>
        <textarea id="scenario" class="tall" placeholder="Kim / hangi tehdit, hangi zayıflığı, hangi koşullarda kullanırsa ne olur ve hangi kritik görev/hizmet nasıl etkilenir?"></textarea>
      </div>
      <div class="grid g3" style="margin-top:8px">
        <div class="field"><label>Tehdit Kaynağı / Aktörü</label>
          <select id="threatSource">
            <option value="">Seçiniz</option>
            <option>Siber suç grubu</option><option>Devlet destekli aktör</option><option>İç tehdit</option>
            <option>Dikkatsiz / yetkisiz personel</option><option>Otomatik saldırı araçları / botnet</option>
            <option>Tedarikçi / üçüncü taraf</option><option>Diğer</option>
          </select>
        </div>
        <div class="field"><label>Tehdit Olayı / Saldırı Tekniği</label><input id="threatEvent" placeholder="Örn. kimlik avı, RCE, ransomware, veri sızdırma"></div>
        <div class="field"><label>Zafiyet / Zayıflık</label><input id="vulnerability" placeholder="CVE, yanlış yapılandırma, süreç zayıflığı vb."></div>
      </div>
      <div class="grid g4" style="margin-top:8px">
        <div class="field"><label>CVSS Base Score (Referans)</label><input id="cvss" type="number" min="0" max="10" step="0.1" placeholder="0.0 - 10.0"><div class="hint">Risk puanı değildir; teknik şiddet referansıdır.</div></div>
        <div class="field"><label>İnternet / Dış Ağ Maruziyeti</label>
          <select id="exposure"><option value="">Seçiniz</option><option>Yok / İzole</option><option>Sınırlı / Dolaylı</option><option>Kurum ağı içi</option><option>Dış ağdan erişilebilir</option><option>Doğrudan internete açık</option></select>
        </div>
        <div class="field"><label>Exploit Kullanılabilirliği</label>
          <select id="exploit"><option value="">Bilinmiyor</option><option>Bilinen exploit yok</option><option>PoC mevcut</option><option>Çalışır exploit mevcut</option><option>Kolay / otomatik istismar</option></select>
        </div>
        <div class="field"><label>Aktif İstismar Bilgisi</label>
          <select id="activeExploit"><option value="">Bilinmiyor</option><option>Hayır</option><option>Şüpheli / sınırlı işaret</option><option>Evet - sektörde</option><option>Evet - kurumda gözlendi</option></select>
        </div>
      </div>
      <div class="grid g3" style="margin-top:8px">
        <div class="field"><label>Erişim / Ön Koşul</label><input id="preconditions" placeholder="Kimlik doğrulama, yerel erişim, ağ konumu vb."></div>
        <div class="field"><label>Tehdit Aktörünün Kapasitesi</label><select id="capability"><option value="">Seçiniz</option><option>Düşük</option><option>Orta</option><option>Yüksek</option><option>Çok Yüksek</option></select></div>
        <div class="field"><label>Benzer Olay / Tehdit İstihbaratı</label><input id="threatIntel" placeholder="Kaynak, tarih, olay veya gözlem"></div>
      </div>
    </div>
  </section>

  <section class="section">
    <div class="section-title"><span>3. Doğal Risk (Kontroller Öncesi)</span><small>Varsayılan model: Olasılık × Etki. Kurum metodolojinize göre eşikleri uyarlayın.</small></div>
    <div class="section-body">
      <div class="risk-layout">
        <div>
          <div class="grid g2">
            <div class="field">
              <label>Doğal Olasılık (1–5)</label>
              <select id="inherentLikelihood" onchange="recalc()">
                <option value="">Seçiniz</option><option value="1">1 - Çok Düşük</option><option value="2">2 - Düşük</option><option value="3">3 - Orta</option><option value="4">4 - Yüksek</option><option value="5">5 - Çok Yüksek</option>
              </select>
              <div class="hint">Maruziyet, exploit, aktif istismar, tehdit kapasitesi ve geçmiş olaylar birlikte değerlendirilmelidir.</div>
            </div>
            <div class="field">
              <label>Doğal Etki (1–5)</label>
              <select id="inherentImpact" onchange="recalc()">
                <option value="">Seçiniz</option><option value="1">1 - Önemsiz</option><option value="2">2 - Düşük</option><option value="3">3 - Orta</option><option value="4">4 - Yüksek</option><option value="5">5 - Kritik / Felaket</option>
              </select>
              <div class="hint">Aşağıdaki iş etkisi boyutlarının en yüksek veya kurumunuzca belirlenen birleşik sonucunu kullanın.</div>
            </div>
          </div>

          <div class="grid g5" style="margin-top:8px">
            <div class="field"><label>Operasyonel</label><select class="impact-dim"><option value="">-</option><option>1</option><option>2</option><option>3</option><option>4</option><option>5</option></select></div>
            <div class="field"><label>Finansal</label><select class="impact-dim"><option value="">-</option><option>1</option><option>2</option><option>3</option><option>4</option><option>5</option></select></div>
            <div class="field"><label>Hukuki / Düzenleyici</label><select class="impact-dim"><option value="">-</option><option>1</option><option>2</option><option>3</option><option>4</option><option>5</option></select></div>
            <div class="field"><label>İtibar</label><select class="impact-dim"><option value="">-</option><option>1</option><option>2</option><option>3</option><option>4</option><option>5</option></select></div>
            <div class="field"><label>Stratejik</label><select class="impact-dim"><option value="">-</option><option>1</option><option>2</option><option>3</option><option>4</option><option>5</option></select></div>
          </div>
          <div class="grid g3" style="margin-top:8px">
            <div class="field"><label>Toplumsal / Kamu Hizmeti</label><select class="impact-dim"><option value="">-</option><option>1</option><option>2</option><option>3</option><option>4</option><option>5</option></select></div>
            <div class="field"><label>İnsan / Fiziksel Güvenlik</label><select class="impact-dim"><option value="">-</option><option>1</option><option>2</option><option>3</option><option>4</option><option>5</option></select></div>
            <div class="field"><label>Etki Açıklaması</label><input id="impactNarrative" placeholder="Yönetici açısından somut sonuç"></div>
          </div>
        </div>
        <div class="grid g2">
          <div id="inherentCard" class="score-card risk-na"><div class="score-label">Doğal Risk Skoru</div><div id="inherentScore" class="score-value">—</div><div id="inherentLevel" class="score-level">Değerlendirme bekliyor</div></div>
          <div class="score-card risk-na"><div class="score-label">CVSS Teknik Şiddet</div><div id="cvssView" class="score-value">—</div><div class="score-level">Risk skoru yerine kullanılmaz</div></div>
        </div>
      </div>
    </div>
  </section>

  <section class="section">
    <div class="section-title"><span>4. Mevcut Kontroller ve Etkinlik</span><small>“Kontrol var mı?” kadar “çalıştığı kanıtlandı mı?” sorusu da önemlidir.</small></div>
    <div class="section-body">
      <div class="chips">
        <label class="chip"><input type="checkbox" class="control-chip" value="MFA">MFA</label>
        <label class="chip"><input type="checkbox" class="control-chip" value="EDR/XDR">EDR/XDR</label>
        <label class="chip"><input type="checkbox" class="control-chip" value="WAF">WAF</label>
        <label class="chip"><input type="checkbox" class="control-chip" value="Ağ segmentasyonu">Ağ segmentasyonu</label>
        <label class="chip"><input type="checkbox" class="control-chip" value="SIEM / log izleme">SIEM / Log</label>
        <label class="chip"><input type="checkbox" class="control-chip" value="Yedekleme">Yedekleme</label>
        <label class="chip"><input type="checkbox" class="control-chip" value="Sıkı yetkilendirme">Yetkilendirme</label>
        <label class="chip"><input type="checkbox" class="control-chip" value="Yama / güncelleme">Yama / Güncelleme</label>
        <label class="chip"><input type="checkbox" class="control-chip" value="IDS/IPS/NDR">IDS/IPS/NDR</label>
      </div>
      <div class="grid g3" style="margin-top:8px">
        <div class="field"><label>Diğer Mevcut Kontroller</label><textarea id="controls" placeholder="Teknik, idari ve fiziksel kontroller"></textarea></div>
        <div class="field"><label>Kontrol Etkinliği</label>
          <select id="controlEffectiveness"><option value="">Değerlendirilmedi</option><option>1 - Etkisiz</option><option>2 - Zayıf</option><option>3 - Kısmen Etkili</option><option>4 - Etkili</option><option>5 - Güçlü / Kanıtlanmış</option></select>
          <div class="hint">Bu alan kalan riski otomatik hesaplamaz; kontrol sonrası olasılık ve etki ayrıca değerlendirilir.</div>
        </div>
        <div class="field"><label>Etkinlik Kanıtı / Doğrulama</label><textarea id="controlEvidence" placeholder="Log, test sonucu, yapılandırma doğrulaması, denetim kanıtı, tarih vb."></textarea></div>
      </div>
    </div>
  </section>

  <section class="section">
    <div class="section-title"><span>5. Kalan Risk ve Risk Toleransı</span><small>Kontroller sonrasında kalan riskin kabul sınırıyla karşılaştırılması.</small></div>
    <div class="section-body">
      <div class="risk-layout">
        <div>
          <div class="grid g3">
            <div class="field"><label>Kalan Risk Olasılığı (1–5)</label>
              <select id="residualLikelihood" onchange="recalc()"><option value="">Seçiniz</option><option value="1">1 - Çok Düşük</option><option value="2">2 - Düşük</option><option value="3">3 - Orta</option><option value="4">4 - Yüksek</option><option value="5">5 - Çok Yüksek</option></select>
            </div>
            <div class="field"><label>Kalan Risk Etkisi (1–5)</label>
              <select id="residualImpact" onchange="recalc()"><option value="">Seçiniz</option><option value="1">1 - Önemsiz</option><option value="2">2 - Düşük</option><option value="3">3 - Orta</option><option value="4">4 - Yüksek</option><option value="5">5 - Kritik / Felaket</option></select>
            </div>
            <div class="field"><label>Risk Tolerans Eşiği (Skor)</label><input id="tolerance" type="number" min="1" max="25" placeholder="1 - 25" onchange="recalc()"><div class="hint">Kurumunuzun onaylı risk matrisi ve risk toleransına göre girilmelidir.</div></div>
          </div>
          <div class="grid g2" style="margin-top:8px">
            <div id="residualCard" class="score-card risk-na"><div class="score-label">Kalan Risk Skoru</div><div id="residualScore" class="score-value">—</div><div id="residualLevel" class="score-level">Değerlendirme bekliyor</div></div>
            <div id="toleranceCard" class="score-card risk-na"><div class="score-label">Tolerans Durumu</div><div id="toleranceValue" class="score-value">—</div><div id="toleranceText" class="score-level">Karşılaştırma bekliyor</div></div>
          </div>
          <div class="info warning" style="margin-top:8px">Aynı toplam skor farklı risk karakterlerini gizleyebilir. Olasılık ve etki değerlerini ayrı ayrı yönetim kararında görünür tutun; düşük olasılıklı fakat çok yüksek etkili senaryoları yalnızca toplam skor nedeniyle göz ardı etmeyin.</div>
        </div>
        <div class="matrix-wrap">
          <div class="matrix-title">5 × 5 Risk Matrisi <span style="font-weight:400;color:#64748b">(D: Doğal, K: Kalan)</span></div>
          <div id="matrix" class="matrix"></div>
          <div class="legend">
            <span><i class="swatch" style="background:#dcfce7"></i>Düşük 1–4</span>
            <span><i class="swatch" style="background:#fef3c7"></i>Orta 5–9</span>
            <span><i class="swatch" style="background:#ffedd5"></i>Yüksek 10–16</span>
            <span><i class="swatch" style="background:#fee2e2"></i>Kritik 17–25</span>
          </div>
        </div>
      </div>
    </div>
  </section>

  <section class="section">
    <div class="section-title"><span>6. Risk Cevabı ve Aksiyon Planı</span><small>Risk değerlendirmesinin amacı karar üretmektir.</small></div>
    <div class="section-body">
      <div class="grid g4">
        <div class="field"><label>Risk Cevabı</label>
          <select id="riskResponse" onchange="toggleAcceptance();buildSummary()">
            <option value="">Seçiniz</option><option>Azaltma</option><option>Kaçınma</option><option>Paylaşma / Transfer</option><option>Kabul</option>
          </select>
        </div>
        <div class="field"><label>Aksiyon Sorumlusu</label><input id="actionOwner" placeholder="Ad-soyad / birim"></div>
        <div class="field"><label>Hedef Tarih</label><input id="targetDate" type="date"></div>
        <div class="field"><label>Yeniden Değerlendirme Tarihi</label><input id="reviewDate" type="date"></div>
      </div>
      <div class="grid g3" style="margin-top:8px">
        <div class="field"><label>Planlanan İşlem / Risk Azaltma Aksiyonu</label><textarea id="plannedAction" placeholder="Yama, mimari değişiklik, telafi edici kontrol, hizmeti kaldırma vb."></textarea></div>
        <div class="field"><label>İzleme Göstergesi</label><textarea id="monitorIndicator" placeholder="Exploit faaliyeti, saldırı girişimleri, kontrol alarmı, hata oranı vb."></textarea></div>
        <div class="field"><label>Başarı / Kapanış Kriteri</label><textarea id="successCriteria" placeholder="Riskin gerçekten azaldığını nasıl kanıtlayacağız?"></textarea></div>
      </div>

      <div id="acceptanceBlock" class="section hidden" style="margin:10px 0 0;box-shadow:none;border-color:#fcd34d">
        <div class="section-title" style="background:#fffaf0;border-bottom-color:#fde68a;border-left-color:#f59e0b;color:#92400e"><span>Risk Kabulü</span><small>Kabul, süreli ve yetkili kararı olmalıdır.</small></div>
        <div class="section-body">
          <div class="grid g3">
            <div class="field"><label>Kabul Gerekçesi</label><textarea id="acceptanceReason" placeholder="Neden ek önlem alınmıyor / erteleniyor?"></textarea></div>
            <div class="field"><label>Kabul Eden Yetkili</label><input id="acceptedBy" placeholder="Ad-soyad / unvan"></div>
            <div class="field"><label>Kabul Geçerlilik Tarihi</label><input id="acceptUntil" type="date"></div>
          </div>
        </div>
      </div>
    </div>
  </section>

  <section class="section">
    <div class="section-title"><span>7. Yönetici Karar Özeti</span><small>Teknik ayrıntıyı kaybetmeden karar verilebilir bilgiye dönüştürün.</small></div>
    <div class="section-body">
      <div class="toolbar no-print" style="box-shadow:none;margin:0 0 8px;padding:0;border:none;background:transparent">
        <button type="button" class="soft" onclick="buildSummary()">Özeti Güncelle</button>
        <span class="statusline">Özet otomatik oluşturulur; aşağıdaki metni isterseniz düzenleyebilirsiniz.</span>
      </div>
      <textarea id="executiveSummary" class="tall" style="min-height:120px" placeholder="Yönetici karar özeti"></textarea>
      <div class="grid g3" style="margin-top:8px">
        <div class="field"><label>Karar / Onay Notu</label><textarea id="decisionNote" placeholder="Yönetim kararı, onay, koşul veya yönlendirme"></textarea></div>
        <div class="field"><label>Karar Veren / Onaylayan</label><input id="decisionBy" placeholder="Ad-soyad / unvan"></div>
        <div class="field"><label>Karar Tarihi</label><input id="decisionDate" type="date"></div>
      </div>
    </div>
  </section>

  <div class="footer-note">
    Bu formdaki 1–25 puanlama ve eşikler örnek yarı nicel risk matrisi mantığıdır. Kurumun onaylı risk metodolojisi, risk iştahı, toleransları ve mevzuat gereksinimleri esas alınmalıdır. CVSS Base Score teknik şiddeti gösterir; tek başına kurumsal risk puanı olarak kullanılmaz.
  </div>
</div>

<script>
const $=id=>document.getElementById(id);
const fieldIds=[
"riskId","assessmentDate","assessor","riskOwner","mission","service","asset","criticality","assetOwner","dataClass",
"scenario","threatSource","threatEvent","vulnerability","cvss","exposure","exploit","activeExploit","preconditions","capability","threatIntel",
"inherentLikelihood","inherentImpact","impactNarrative","controls","controlEffectiveness","controlEvidence",
"residualLikelihood","residualImpact","tolerance","riskResponse","actionOwner","targetDate","reviewDate","plannedAction","monitorIndicator","successCriteria",
"acceptanceReason","acceptedBy","acceptUntil","executiveSummary","decisionNote","decisionBy","decisionDate"
];

function levelFor(score){
  if(!score) return {name:"Değerlendirme bekliyor", cls:"risk-na"};
  if(score<=4) return {name:"Düşük", cls:"risk-low"};
  if(score<=9) return {name:"Orta", cls:"risk-mid"};
  if(score<=16) return {name:"Yüksek", cls:"risk-high"};
  return {name:"Kritik", cls:"risk-critical"};
}
function paintCard(cardId,scoreId,levelId,score){
  const lev=levelFor(score), card=$(cardId);
  card.className="score-card "+lev.cls;
  $(scoreId).textContent=score||"—";
  $(levelId).textContent=lev.name;
}
function recalc(){
  const il=+($("inherentLikelihood").value||0), ii=+($("inherentImpact").value||0);
  const rl=+($("residualLikelihood").value||0), ri=+($("residualImpact").value||0);
  const inherent=il&&ii?il*ii:0, residual=rl&&ri?rl*ri:0;
  paintCard("inherentCard","inherentScore","inherentLevel",inherent);
  paintCard("residualCard","residualScore","residualLevel",residual);

  const tol=+($("tolerance").value||0), tc=$("toleranceCard");
  if(residual && tol){
    const over=residual>tol;
    tc.className="score-card "+(over?"risk-critical":"risk-low");
    $("toleranceValue").textContent=over?"ÜSTÜNDE":"İÇİNDE";
    $("toleranceText").textContent=over?"Yönetim kararı / ek işlem gerekiyor":"İzleme ve periyodik gözden geçirme";
  }else{
    tc.className="score-card risk-na";$("toleranceValue").textContent="—";$("toleranceText").textContent="Karşılaştırma bekliyor";
  }
  updateMatrix(il,ii,rl,ri);
  buildSummary(false);
}
function buildMatrix(){
  const matrix=$("matrix"); matrix.innerHTML="";
  const corner=document.createElement("div");corner.className="m-head";corner.textContent="Olasılık ↓ / Etki →";matrix.appendChild(corner);
  for(let i=1;i<=5;i++){const h=document.createElement("div");h.className="m-head";h.textContent=i;matrix.appendChild(h);}
  for(let likelihood=5;likelihood>=1;likelihood--){
    const a=document.createElement("div");a.className="m-axis";a.textContent=likelihood;matrix.appendChild(a);
    for(let impact=1;impact<=5;impact++){
      const score=likelihood*impact, lev=levelFor(score), c=document.createElement("div");
      c.className="m-cell "+lev.cls;c.dataset.l=likelihood;c.dataset.i=impact;c.innerHTML=`${score}<span class="marks"></span>`;matrix.appendChild(c);
    }
  }
}
function updateMatrix(il,ii,rl,ri){
  document.querySelectorAll(".m-cell .marks").forEach(x=>x.innerHTML="");
  if(il&&ii){
    const c=document.querySelector(`.m-cell[data-l="${il}"][data-i="${ii}"] .marks`);
    if(c)c.innerHTML+='<span class="mark" title="Doğal Risk">D</span>';
  }
  if(rl&&ri){
    const c=document.querySelector(`.m-cell[data-l="${rl}"][data-i="${ri}"] .marks`);
    if(c)c.innerHTML+='<span class="mark" title="Kalan Risk">K</span>';
  }
}
function selectedText(id){
  const el=$(id); if(!el) return ""; return el.tagName==="SELECT" ? (el.selectedIndex>=0?el.options[el.selectedIndex].text:"") : el.value.trim();
}
function buildSummary(force=true){
  const scenario=$("scenario").value.trim(), mission=$("mission").value.trim(), service=$("service").value.trim(), asset=$("asset").value.trim();
  const il=+($("inherentLikelihood").value||0), ii=+($("inherentImpact").value||0), rl=+($("residualLikelihood").value||0), ri=+($("residualImpact").value||0);
  const inherent=il&&ii?il*ii:0, residual=rl&&ri?rl*ri:0, tol=+($("tolerance").value||0);
  const controls=getControls(), response=$("riskResponse").value;
  const parts=[];
  if(scenario) parts.push("Risk senaryosu: "+scenario);
  else if(asset||service) parts.push(`Değerlendirilen ${asset||"sistem"}${service?`, ${service} hizmetini desteklemektedir`:""}.`);
  if(mission) parts.push(`Etkilenen kritik görev / hedef: ${mission}.`);
  if($("vulnerability").value.trim()) parts.push(`Zafiyet / zayıflık: ${$("vulnerability").value.trim()}.`);
  if($("exposure").value) parts.push(`Maruziyet: ${$("exposure").value}.`);
  if($("activeExploit").value) parts.push(`Aktif istismar durumu: ${$("activeExploit").value}.`);
  if(inherent) parts.push(`Kontroller öncesi doğal risk ${il} × ${ii} = ${inherent} (${levelFor(inherent).name}).`);
  if(controls) parts.push(`Mevcut kontroller: ${controls}.`);
  if(residual){
    const t = tol ? (residual>tol ? "kurumun girilen tolerans eşiğinin üzerindedir" : "kurumun girilen tolerans eşiği içindedir") : "risk toleransıyla karşılaştırılmalıdır";
    parts.push(`Kontroller sonrası kalan risk ${rl} × ${ri} = ${residual} (${levelFor(residual).name}) ve ${t}.`);
  }
  if(response) parts.push(`Seçilen risk cevabı: ${response}.`);
  if($("plannedAction").value.trim()) parts.push(`Planlanan işlem: ${$("plannedAction").value.trim()}.`);
  if($("targetDate").value) parts.push(`Hedef tarih: ${formatDate($("targetDate").value)}.`);
  if($("riskOwner").value.trim()) parts.push(`Risk sahibi: ${$("riskOwner").value.trim()}.`);
  const txt=parts.join("\n");
  if(force || !$("executiveSummary").value.trim()) $("executiveSummary").value=txt;
  autoGrow($("executiveSummary"));
}
function getControls(){
  const chips=[...document.querySelectorAll(".control-chip:checked")].map(x=>x.value);
  const other=$("controls").value.trim(); if(other) chips.push(other);
  return chips.join(", ");
}
function formatDate(v){if(!v)return"";const [y,m,d]=v.split("-");return `${d}.${m}.${y}`;}
function toggleAcceptance(){
  $("acceptanceBlock").classList.toggle("hidden",$("riskResponse").value!=="Kabul");
}
function autoGrow(el){if(!el||el.tagName!=="TEXTAREA")return;el.style.height="auto";el.style.height=Math.max(el.scrollHeight,66)+"px";}
document.addEventListener("input",e=>{
  if(e.target.tagName==="TEXTAREA") autoGrow(e.target);
  if(e.target.id==="cvss"){
    const v=parseFloat(e.target.value);$("cvssView").textContent=Number.isFinite(v)?v.toFixed(1):"—";
  }
  if(fieldIds.includes(e.target.id) || e.target.classList.contains("control-chip")) {
    $("saveState").textContent="Kaydedilmemiş değişiklikler";
  }
});
document.querySelectorAll(".impact-dim").forEach(s=>s.addEventListener("change",()=>{
  const vals=[...document.querySelectorAll(".impact-dim")].map(x=>+x.value||0);
  const max=Math.max(...vals);
  if(max){$("inherentImpact").value=String(max);recalc();}
}));
document.querySelectorAll(".control-chip").forEach(x=>x.addEventListener("change",()=>buildSummary(false)));

function collectData(){
  const data={};
  fieldIds.forEach(id=>data[id]=$(id).value);
  data.impactDimensions=[...document.querySelectorAll(".impact-dim")].map(x=>x.value);
  data.controlChips=[...document.querySelectorAll(".control-chip:checked")].map(x=>x.value);
  data.orgTitle=$("orgTitle").textContent.trim();
  return data;
}
function applyData(data){
  fieldIds.forEach(id=>{if(data[id]!==undefined && $(id)) $(id).value=data[id]});
  if(Array.isArray(data.impactDimensions)) document.querySelectorAll(".impact-dim").forEach((x,i)=>x.value=data.impactDimensions[i]||"");
  document.querySelectorAll(".control-chip").forEach(x=>x.checked=Array.isArray(data.controlChips)&&data.controlChips.includes(x.value));
  if(data.orgTitle) $("orgTitle").textContent=data.orgTitle;
  document.querySelectorAll("textarea").forEach(autoGrow);
  const cv=parseFloat($("cvss").value);$("cvssView").textContent=Number.isFinite(cv)?cv.toFixed(1):"—";
  toggleAcceptance();recalc();$("saveState").textContent="Kayıt yüklendi";
}
function saveLocal(){
  localStorage.setItem("olgunCyberRiskForm",JSON.stringify(collectData()));
  $("saveState").textContent="Taslak bu tarayıcıya kaydedildi";
}
function loadLocal(){
  const raw=localStorage.getItem("olgunCyberRiskForm");
  if(!raw){$("saveState").textContent="Kayıtlı taslak bulunamadı";return}
  try{applyData(JSON.parse(raw))}catch(e){$("saveState").textContent="Taslak okunamadı"}
}
function ensureExcelLibrary(){
  if(typeof XLSX==="undefined"){
    alert("Excel kütüphanesi yüklenemedi. Excel içe/dışa aktarma için internet bağlantısını kontrol edip sayfayı yeniden açın.");
    return false;
  }
  return true;
}
function fieldCategory(el){
  const section=el.closest(".section");
  if(!section) return "Genel";
  const title=section.querySelector(".section-title span");
  return title ? title.textContent.trim() : "Genel";
}
function fieldLabel(el){
  const field=el.closest(".field");
  if(!field) return el.id || "Alan";
  const label=field.querySelector("label");
  return label ? label.textContent.trim() : (el.id || "Alan");
}
function exportExcel(){
  if(!ensureExcelLibrary()) return;

  const rows=[["Kategori","Alan ID","Alan","Değer"]];

  rows.push(["Başlık","orgTitle","Kurum / Başkanlık Başlığı",$("orgTitle").textContent.trim()]);

  fieldIds.forEach(id=>{
    const el=$(id);
    if(!el) return;
    rows.push([fieldCategory(el),id,fieldLabel(el),el.value]);
  });

  document.querySelectorAll(".impact-dim").forEach((el,index)=>{
    rows.push([
      "3. Doğal Risk (Kontroller Öncesi)",
      "impactDimension"+index,
      fieldLabel(el),
      el.value
    ]);
  });

  const selectedControls=[...document.querySelectorAll(".control-chip:checked")].map(x=>x.value);
  rows.push([
    "4. Mevcut Kontroller ve Etkinlik",
    "controlChips",
    "Seçili Hazır Kontroller",
    selectedControls.join(" | ")
  ]);

  const il=+($("inherentLikelihood").value||0), ii=+($("inherentImpact").value||0);
  const rl=+($("residualLikelihood").value||0), ri=+($("residualImpact").value||0);
  const inherent=il&&ii?il*ii:"";
  const residual=rl&&ri?rl*ri:"";
  const tolerance=+($("tolerance").value||0);

  rows.push(["Hesaplanan Sonuç","__inherentScore","Doğal Risk Skoru",inherent]);
  rows.push(["Hesaplanan Sonuç","__inherentLevel","Doğal Risk Seviyesi",inherent?levelFor(inherent).name:""]);
  rows.push(["Hesaplanan Sonuç","__residualScore","Kalan Risk Skoru",residual]);
  rows.push(["Hesaplanan Sonuç","__residualLevel","Kalan Risk Seviyesi",residual?levelFor(residual).name:""]);
  rows.push([
    "Hesaplanan Sonuç",
    "__toleranceStatus",
    "Risk Toleransı Durumu",
    residual&&tolerance ? (residual>tolerance ? "Toleransın Üstünde" : "Tolerans İçinde") : ""
  ]);

  const ws=XLSX.utils.aoa_to_sheet(rows);
  ws["!cols"]=[
    {wch:38},
    {wch:28},
    {wch:38},
    {wch:90}
  ];
  ws["!autofilter"]={ref:"A1:D"+rows.length};

  const wb=XLSX.utils.book_new();
  XLSX.utils.book_append_sheet(wb,ws,"Risk Kaydı");

  const filename="Siber Risk Değerlendirme.xlsx";
  XLSX.writeFile(wb,filename);
  $("saveState").textContent="Excel dosyası dışarı aktarıldı";
}
function excelCellToText(value){
  if(value===null || value===undefined) return "";
  if(value instanceof Date){
    const y=value.getFullYear();
    const m=String(value.getMonth()+1).padStart(2,"0");
    const d=String(value.getDate()).padStart(2,"0");
    return `${y}-${m}-${d}`;
  }
  return String(value).trim();
}
function importExcel(e){
  const file=e.target.files && e.target.files[0];
  if(!file) return;
  if(!ensureExcelLibrary()){ e.target.value=""; return; }

  const reader=new FileReader();
  reader.onload=event=>{
    try{
      const data=new Uint8Array(event.target.result);
      const wb=XLSX.read(data,{type:"array",cellDates:true});
      const sheetName=wb.SheetNames.includes("Risk Kaydı") ? "Risk Kaydı" : wb.SheetNames[0];
      const ws=wb.Sheets[sheetName];
      const rows=XLSX.utils.sheet_to_json(ws,{defval:"",raw:true});

      const imported={};
      const impactValues=[];
      let selectedControls=[];

      rows.forEach(row=>{
        const id=excelCellToText(row["Alan ID"]);
        const value=row["Değer"];

        if(!id || id.startsWith("__")) return;

        if(id==="orgTitle"){
          imported.orgTitle=excelCellToText(value);
          return;
        }
        if(id==="controlChips"){
          selectedControls=excelCellToText(value)
            .split("|")
            .map(x=>x.trim())
            .filter(Boolean);
          return;
        }
        if(id.startsWith("impactDimension")){
          const index=parseInt(id.replace("impactDimension",""),10);
          if(Number.isInteger(index)) impactValues[index]=excelCellToText(value);
          return;
        }
        if(fieldIds.includes(id)){
          imported[id]=excelCellToText(value);
        }
      });

      imported.impactDimensions=impactValues;
      imported.controlChips=selectedControls;
      applyData(imported);
      $("saveState").textContent="Excel dosyası içeri aktarıldı";
    }catch(err){
      console.error(err);
      alert("Excel dosyası okunamadı. Bu formdan dışarı aktarılan .xlsx/.xls yapısını kullandığınızdan emin olun.");
      $("saveState").textContent="Excel içeri aktarma başarısız";
    }finally{
      e.target.value="";
    }
  };
  reader.readAsArrayBuffer(file);
}
function newForm(){
  if(!confirm("Formdaki mevcut bilgiler temizlensin mi?"))return;
  document.querySelectorAll("input,textarea,select").forEach(el=>{
    if(el.type==="checkbox")el.checked=false;
    else el.value="";
  });
    $("cvssView").textContent="—";document.querySelectorAll("textarea").forEach(autoGrow);
  toggleAcceptance();recalc();$("executiveSummary").value="";$("saveState").textContent="Yeni kayıt açıldı";
}
function bindFiveClick(target, action){
  let count=0, timer=null;
  target.addEventListener("click",()=>{
    count++;
    clearTimeout(timer);
    timer=setTimeout(()=>count=0,2500);
    if(count>=5){
      count=0;
      clearTimeout(timer);
      action();
    }
  });
}

bindFiveClick($("orgTitle"),()=>{
  $("orgTitle").contentEditable="true";
  $("orgTitle").classList.add("editing");
  $("orgTitle").focus();
  $("saveState").textContent="Kurum başlığı düzenleme açık";
});
$("orgTitle").addEventListener("blur",()=>{
  $("orgTitle").contentEditable="false";
  $("orgTitle").classList.remove("editing");
});
$("orgTitle").addEventListener("keydown",e=>{
  if(e.key==="Enter"){
    e.preventDefault();
    $("orgTitle").blur();
  }
});

bindFiveClick($("logoBox"),()=>{
  $("logoFile").click();
  $("saveState").textContent="Logo seçimi açıldı";
});
$("logoBox").addEventListener("keydown",e=>{
  if(e.key==="Enter"||e.key===" "){
    e.preventDefault();
    $("logoBox").click();
  }
});

function changeLogo(e){
  const file=e.target.files && e.target.files[0];
  if(!file) return;
  if(!file.type.startsWith("image/")){
    alert("Lütfen PNG, JPG/JPEG veya WEBP türünde bir logo seçin.");
    e.target.value="";
    return;
  }
  const reader=new FileReader();
  reader.onload=()=>{
    const img=$("headerLogo");
    img.src=reader.result;
    img.style.display="block";
    $("logoFallback").style.display="none";
    try{
      localStorage.setItem("olgunHeaderLogo", reader.result);
    }catch(err){}
    $("saveState").textContent="Logo güncellendi";
  };
  reader.readAsDataURL(file);
  e.target.value="";
}

try{
  const savedLogo=localStorage.getItem("olgunHeaderLogo");
  if(savedLogo){
    $("headerLogo").src=savedLogo;
    $("headerLogo").style.display="block";
    $("logoFallback").style.display="none";
  }
}catch(err){}

buildMatrix();
document.querySelectorAll("textarea").forEach(autoGrow);
recalc();
</script>
</body>
</html>