<?php
require_once __DIR__ . '/airmax_ui_assets.php';
airmax_ui_prepare_page();
$uaAndroidReceiverMatch = ((string)($_GET['ua_android'] ?? '') === '1') || stripos((string)($_SERVER['HTTP_USER_AGENT'] ?? ''), 'NetworkCustomersAndroid/') !== false;
if ($uaAndroidReceiverMatch) $UA_PAGE_CSS = ['assets/css/android_receiver_match_report.css'];
$page_title = 'تقرير مطابقة المستقبلات مع المشتركين';
require_once __DIR__ . '/auth.php';
if (function_exists('require_login')) require_login('login.php');
require_once __DIR__ . '/db_bootstrap.php';
require_once __DIR__ . '/receiver_subscriber_match_lib.php';
require_once __DIR__ . '/router_port_match_lib.php';
if (function_exists('ensure_db')) ensure_db(true);
$conn = $GLOBALS['conn'] ?? null;
if (!($conn instanceof mysqli)) { die('DB not ready'); }
if (!defined('UA_EMBED')) define('UA_EMBED', isset($_GET['embed']) && $_GET['embed'] == '1');
if (UA_EMBED && function_exists('airmax_ui_print_embed_assets')) { airmax_ui_print_embed_assets(); }
if (!UA_EMBED) {
    require_once __DIR__ . '/header.php';
    require_once __DIR__ . '/sidebar.php';
}
$snap = function_exists('ua_receiver_match_snapshot') ? ua_receiver_match_snapshot($conn, 300, false) : ['ok'=>false,'items'=>[],'summary'=>[]];
$allItems = array_values((array)($snap['items'] ?? []));
$routerPortItems = array_values(array_filter($allItems, static function($it){ return (string)($it['source_type'] ?? '') === 'router_port'; }));
$items = array_values(array_filter($allItems, static function($it){ return (string)($it['source_type'] ?? '') !== 'router_port'; }));
$summary = (array)($snap['receiver_summary'] ?? $snap['summary'] ?? []);
$routerPortSummary = (array)($snap['router_port_summary'] ?? []);
$rxrRouterPortSources = function_exists('ua_rx_router_port_sources_active') ? ua_rx_router_port_sources_active() : [];
$rxrRouters = function_exists('ua_rpm_router_list') ? ua_rpm_router_list($conn) : [];
function rxr_h($v): string { return htmlspecialchars((string)$v, ENT_QUOTES, 'UTF-8'); }
function rxr_age($seconds): string {
    $seconds = max(0, (int)$seconds);
    if ($seconds < 60) return $seconds . ' ث';
    if ($seconds < 3600) return floor($seconds / 60) . ' د';
    if ($seconds < 86400) return floor($seconds / 3600) . ' س';
    return floor($seconds / 86400) . ' يوم';
}
function rxr_conflicts_html(array $it): string {
    $details = (array)($it['conflict_details'] ?? []);
    if (!$details) return '<span class="rxr-muted">—</span>';
    $out = '<details class="rxr-conflict"><summary>' . count($details) . ' سبب</summary><ul>';
    foreach (array_slice($details, 0, 8) as $c) {
        $txt = function_exists('ua_rx_conflict_label') ? ua_rx_conflict_label((array)$c) : (string)($c['reason'] ?? 'تضارب');
        $out .= '<li>' . rxr_h($txt) . '</li>';
    }
    if (count($details) > 8) $out .= '<li>و ' . (count($details) - 8) . ' سبب إضافي...</li>';
    $out .= '</ul></details>';
    return $out;
}
?>

<?php if (!UA_EMBED): ?><div class="content-wrapper ua-extracted-page"><section class="content p-3"><?php endif; ?>
<div class="rxr-page ua-airmax-scope" dir="rtl">
  <div class="rxr-head rxr-head-compact">
    <div class="rxr-title-block">
      <h2>تقرير مطابقة المستقبلات مع المشتركين</h2>
      <span class="rxr-title-meta" id="rxrStatus">
        آخر Snapshot معتمد: <strong><?= !empty($snap['ts']) ? rxr_h(date('Y-m-d H:i:s', (int)$snap['ts'])) : 'غير متوفر' ?></strong>
        <?php if (isset($snap['age'])): ?><span>منذ: <strong><?= rxr_h(rxr_age((int)$snap['age'])) ?></strong></span><?php endif; ?>
        <?php if (empty($snap['ts']) && !empty($snap['message'])): ?><span><?= rxr_h($snap['message']) ?></span><?php endif; ?>
      </span>
    </div>
    <div class="rxr-actions rxr-actions-compact">
      <details class="rxr-help">
        <summary aria-label="شرح التقرير" title="شرح التقرير">؟</summary>
        <div class="rxr-help-panel">
          <strong>آلية القراءة المعتمدة:</strong>
          <ol>
            <li>يتم اعتماد أجهزة Station / مستقبل فقط، واستثناء أجهزة Access / قطاع من المطابقة.</li>
            <li>يتم جمع MAC الخام من المستقبل، ثم اعتماد MAC منفذ العميل فقط.</li>
            <li>تتم المطابقة مع MACات المشتركين المعروفة. تعارض ملكية المشترك لا يمنع المطابقة، بل يُحوّل للمراقبة الأمنية.</li>
            <li>الرقم الرسمي هو <b>مطابق نهائي</b> فقط، أما باقي الأرقام فهي للتشخيص.</li>
            <li>يمكن إضافة قراءة منفذ مخصص من راوتر MikroTik كصف مستقل أسفل جدول المستقبلات؛ لا تدخل أرقامه في ملخص المستقبلات.</li>
          </ol>
        </div>
      </details>
      <a href="airmax_monitor_settings.php" class="rxr-btn rxr-btn-secondary">إعدادات المستقبلات</a>
      <button type="button" class="rxr-btn rxr-btn-primary" id="rxrApplyBtn">تطبيق المطابقة من الكاش</button>
    </div>
  </div>

  <div class="rxr-summary-strip" aria-label="ملخص المطابقة">
    <div class="rxr-stat rxr-stat-primary"><span>مطابق نهائي</span><strong id="rxrMatched"><?= (int)($summary['matched_total'] ?? 0) ?></strong></div>
    <div class="rxr-stat"><span>أجهزة Station</span><strong id="rxrDevices"><?= (int)($summary['stations'] ?? $summary['devices'] ?? count($items)) ?></strong></div>
    <div class="rxr-stat"><span>MAC منفذ العميل</span><strong><?= (int)($summary['client_mac_total'] ?? 0) ?></strong></div>
    <div class="rxr-stat"><span>MAC معروف</span><strong><?= (int)($summary['known_mac_total'] ?? 0) ?></strong></div>
    <div class="rxr-stat"><span>MAC خام</span><strong><?= (int)($summary['raw_mac_total'] ?? 0) ?></strong></div>
    <div class="rxr-stat"><span>تعارض</span><strong id="rxrAmbiguous"><?= (int)($summary['ambiguous_total'] ?? 0) ?></strong></div>
    <div class="rxr-stat"><span>Access مستثنى</span><strong><?= (int)($summary['access_skipped'] ?? 0) ?></strong></div>
    <div class="rxr-stat"><span>حُسم للأقرب</span><strong><?= (int)($summary['topology_shadow_total'] ?? 0) ?></strong></div>
    <div class="rxr-stat rxr-stat-port"><span>منافذ راوتر</span><strong><?= (int)($routerPortSummary['ports'] ?? $routerPortSummary['devices'] ?? 0) ?></strong></div>
  </div>

  <div class="table-responsive rxr-table-wrap">
    <table class="table table-sm table-bordered rxr-table rxr-table-clean rxr-main-table">
      <thead>
        <tr>
          <th class="rxr-col-id">#</th>
          <th class="rxr-col-name">المستقبل</th>
          <th class="rxr-col-ip">IP</th>
          <th>متصل خلف</th>
          <th>MAC خام</th>
          <th>منفذ العميل</th>
          <th>MAC معروف</th>
          <th>مطابق نهائي</th>
          <th>غير معروف</th>
          <th>تعارض</th>
          <th class="rxr-col-conflict">سبب التعارض / الأطراف</th>
          <th>حُسم للأقرب</th>
          <th>المصدر</th>
        </tr>
      </thead>
      <tbody id="rxrBody">
      <?php if (!$items): ?>
        <tr><td colspan="13" class="text-center text-muted">لا توجد بيانات مستقبلات بعد. شغّل فحص المستقبلات أولاً حتى يتوفر كاش MAC.</td></tr>
      <?php else: foreach ($items as $it): ?>
        <?php
          $raw = (int)($it['raw_mac_count'] ?? 0);
          $client = (int)($it['client_mac_count'] ?? 0);
          $known = (int)($it['known_mac_count'] ?? 0);
          $matched = (int)($it['matched_count'] ?? 0);
          $unknown = (int)($it['unknown_count'] ?? 0);
          $amb = (int)($it['ambiguous_count'] ?? 0);
          $shadow = (int)($it['topology_shadow_count'] ?? 0);
        ?>
        <tr>
          <td class="rxr-col-id"><span class="rxr-id-badge"><?= (int)($it['device_id'] ?? 0) ?></span></td>
          <td class="rxr-col-name"><strong><?= rxr_h($it['name'] ?? '') ?></strong></td>
          <td class="ltr-cell rxr-col-ip"><?= rxr_h($it['host'] ?? '') ?></td>
          <td><?= !empty($it['parent_device_id']) ? ('#' . (int)$it['parent_device_id'] . ' / عمق ' . (int)($it['topology_depth'] ?? 0)) : 'مباشر' ?></td>
          <td><span class="rxr-count rxr-count-raw"><?= $raw ?></span></td>
          <td><span class="rxr-count rxr-count-client"><?= $client ?></span></td>
          <td><span class="rxr-count rxr-count-known"><?= $known ?></span></td>
          <td><span class="rxr-count rxr-count-final"><?= $matched ?></span></td>
          <td><span class="rxr-count rxr-count-muted"><?= $unknown ?></span></td>
          <td><span class="rxr-count <?= $amb > 0 ? 'rxr-count-warn' : 'rxr-count-muted' ?>"><?= $amb ?></span></td>
          <td class="rxr-conflict-cell"><?= rxr_conflicts_html((array)$it) ?></td>
          <td><span class="rxr-count rxr-count-muted"><?= $shadow ?></span></td>
          <td class="ltr-cell small rxr-source-cell"><?= rxr_h($it['source'] ?? '') ?></td>
        </tr>
      <?php endforeach; endif; ?>
      </tbody>
    </table>
  </div>

  <details class="rxr-router-port-card rxr-router-port-card-compact" aria-label="إضافة أو تحديث منفذ راوتر مخصص">
    <summary><span>إضافة / تحديث منفذ راوتر</span><b>لا تدخل أرقامه في ملخص المستقبلات</b></summary>
    <div class="rxr-router-port-controls">
      <label>الراوتر
        <select id="rxrRouterSelect">
          <option value="">اختر الراوتر...</option>
          <?php foreach ($rxrRouters as $r): ?>
            <option value="<?= (int)($r['id'] ?? 0) ?>"><?= rxr_h(($r['name'] ?? '') . ' — ' . ($r['host'] ?? '')) ?></option>
          <?php endforeach; ?>
        </select>
      </label>
      <label>المنفذ
        <select id="rxrInterfaceSelect" disabled>
          <option value="">اختر المنفذ...</option>
        </select>
      </label>
      <button type="button" class="rxr-btn rxr-btn-primary" id="rxrPortMatchBtn" disabled>جلب ومطابقة</button>
    </div>
    <div class="rxr-router-port-status" id="rxrPortStatus">جاهز.</div>
    <div class="rxr-router-port-summary" id="rxrPortSummary" hidden></div>
    <div class="table-responsive rxr-port-table-wrap" id="rxrPortTableWrap" hidden>
      <table class="table table-sm table-bordered rxr-table rxr-table-clean rxr-port-table">
        <thead><tr><th>MAC</th><th>الحالة</th><th>المشترك</th><th>PPP</th><th>مصدر الهوية</th><th>أمن</th></tr></thead>
        <tbody id="rxrPortTableBody"></tbody>
      </table>
    </div>
  </details>

  <div class="rxr-router-port-official" aria-label="منافذ الراوتر المعتمدة ضمن المطابقة الرسمية">
    <h3>منافذ الراوتر المعتمدة ضمن المطابقة الرسمية</h3>
    <p class="rxr-muted">هذه النتائج محفوظة داخل Snapshot الرسمي وتظهر في الداشبورد كصفوف مستقلة، بينما تبقى تعارضات ملكية MAC في مراقب الشبكة ولا تمنع المطابقة.</p>
    <div class="table-responsive rxr-table-wrap">
      <table class="table table-sm table-bordered rxr-table rxr-table-clean rxr-official-table">
        <thead>
          <tr>
            <th>#</th>
            <th>الراوتر / المنفذ</th>
            <th>IP</th>
            <th>MAC خام</th>
            <th>MAC منفذ</th>
            <th>MAC معروف</th>
            <th>مطابق</th>
            <th>غير معروف</th>
            <th>تعارض أمني</th>
            <th>المصدر</th>
            <th>إدارة</th>
          </tr>
        </thead>
        <tbody>
        <?php if (!$routerPortItems): ?>
          <tr><td colspan="11" class="text-center text-muted">لا توجد منافذ راوتر معتمدة بعد. اختر الراوتر والمنفذ ثم اضغط جلب ومطابقة المنفذ.</td></tr>
        <?php else: foreach ($routerPortItems as $it): ?>
          <?php
            $rxrPseudoId = (int)($it['device_id'] ?? $it['pseudo_id'] ?? 0);
            $rxrSource = $rxrPseudoId > 0 ? (array)($rxrRouterPortSources[$rxrPseudoId] ?? []) : [];
            $rxrKey = (string)($it['key'] ?? $rxrSource['key'] ?? '');
          ?>
          <tr data-router-port-key="<?= rxr_h($rxrKey) ?>" data-router-port-pseudo-id="<?= $rxrPseudoId ?>">
            <td><span class="rxr-id-badge"><?= (int)($it['device_id'] ?? 0) ?></span></td>
            <td><strong><?= rxr_h($it['name'] ?? '') ?></strong><br><small class="ltr-cell"><?= rxr_h($it['interface_label'] ?? $it['interface'] ?? '') ?></small></td>
            <td class="ltr-cell"><?= rxr_h($it['host'] ?? $it['router_host'] ?? '') ?></td>
            <td><span class="rxr-count rxr-count-raw"><?= (int)($it['raw_mac_count'] ?? 0) ?></span></td>
            <td><span class="rxr-count rxr-count-client"><?= (int)($it['client_mac_count'] ?? 0) ?></span></td>
            <td><span class="rxr-count rxr-count-known"><?= (int)($it['known_mac_count'] ?? 0) ?></span></td>
            <td><span class="rxr-count rxr-count-final"><?= (int)($it['matched_count'] ?? 0) ?></span></td>
            <td><span class="rxr-count rxr-count-muted"><?= (int)($it['unknown_count'] ?? 0) ?></span></td>
            <td><span class="rxr-count <?= ((int)($it['ambiguous_count'] ?? 0) > 0) ? 'rxr-count-warn' : 'rxr-count-muted' ?>"><?= (int)($it['ambiguous_count'] ?? 0) ?></span></td>
            <td class="ltr-cell small"><?= rxr_h($it['source'] ?? '') ?></td>
            <td class="rxr-port-manage-cell">
              <button type="button" class="rxr-port-rename-btn" data-key="<?= rxr_h($rxrKey) ?>" data-pseudo-id="<?= $rxrPseudoId ?>" data-name="<?= rxr_h($it['name'] ?? '') ?>" title="تعديل اسم المنفذ" aria-label="تعديل اسم المنفذ"><i class="fa fa-pencil" aria-hidden="true"></i></button>
              <button type="button" class="rxr-port-remove-btn" data-key="<?= rxr_h($rxrKey) ?>" data-pseudo-id="<?= $rxrPseudoId ?>" title="إزالة" aria-label="إزالة"><i class="fa fa-trash" aria-hidden="true"></i></button>
            </td>
          </tr>
        <?php endforeach; endif; ?>
        </tbody>
      </table>
    </div>
  </div>
</div>
<script>
(function(){
  var btn = document.getElementById('rxrApplyBtn');
  var status = document.getElementById('rxrStatus');
  function setStatus(text){ if(status) status.textContent = text; }
  if (btn) btn.addEventListener('click', function(){
    btn.disabled = true;
    var old = btn.textContent;
    btn.textContent = 'جارٍ التطبيق...';
    fetch('api/receiver_match_apply.php?force=1', {headers:{'X-Requested-With':'XMLHttpRequest'}})
      .then(function(r){return r.json();})
      .then(function(data){
        setStatus((data && data.message ? data.message : 'تم تحديث Snapshot المعتمد') + (data && data.summary ? ' — مطابق نهائي: ' + (data.summary.matched_total || 0) : ''));
        setTimeout(function(){ window.location.reload(); }, 900);
      })
      .catch(function(){ setStatus('تعذر تطبيق المطابقة من الكاش.'); })
      .finally(function(){ btn.disabled = false; btn.textContent = old; });
  });

  var routerSelect = document.getElementById('rxrRouterSelect');
  var ifaceSelect = document.getElementById('rxrInterfaceSelect');
  var portBtn = document.getElementById('rxrPortMatchBtn');
  var portStatus = document.getElementById('rxrPortStatus');
  var portSummary = document.getElementById('rxrPortSummary');
  var portWrap = document.getElementById('rxrPortTableWrap');
  var portBody = document.getElementById('rxrPortTableBody');

  function ps(text){ if(portStatus) portStatus.textContent = text; }
  function esc(v){
    return String(v == null ? '' : v).replace(/[&<>"']/g, function(c){ return {'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#039;'}[c]; });
  }
  function fillInterfaces(list){
    if(!ifaceSelect) return;
    ifaceSelect.innerHTML = '<option value="">اختر المنفذ...</option>';
    (list || []).forEach(function(it){
      var opt = document.createElement('option');
      opt.value = it.name || '';
      opt.textContent = it.label || it.name || '';
      ifaceSelect.appendChild(opt);
    });
    ifaceSelect.disabled = !(list && list.length);
    if(portBtn) portBtn.disabled = true;
  }
  if(routerSelect){
    routerSelect.addEventListener('change', function(){
      var id = routerSelect.value || '';
      fillInterfaces([]);
      if(!id){ ps('اختر الراوتر أولاً.'); return; }
      ps('جارٍ جلب المنافذ من الراوتر...');
      fetch('api/router_port_interfaces.php?router_id=' + encodeURIComponent(id), {headers:{'X-Requested-With':'XMLHttpRequest'}})
        .then(function(r){ return r.json(); })
        .then(function(data){
          if(!data || !data.ok){ throw new Error((data && data.message) || 'تعذر جلب المنافذ'); }
          fillInterfaces(data.interfaces || []);
          ps('تم جلب ' + ((data.interfaces || []).length) + ' منفذ.');
        })
        .catch(function(e){ ps(e && e.message ? e.message : 'تعذر جلب المنافذ.'); });
    });
  }
  if(ifaceSelect){
    ifaceSelect.addEventListener('change', function(){
      if(portBtn) portBtn.disabled = !(routerSelect && routerSelect.value && ifaceSelect.value);
    });
  }
  function renderPortResult(data){
    var s = data.summary || {};
    if(portSummary){
      portSummary.hidden = false;
      portSummary.innerHTML =
        '<span>MAC خام: <b>' + esc(s.raw_mac_total || 0) + '</b></span>' +
        '<span>MAC منفذ: <b>' + esc(s.client_mac_total || 0) + '</b></span>' +
        '<span>MAC معروف: <b>' + esc(s.known_mac_total || 0) + '</b></span>' +
        '<span>مطابق: <b>' + esc(s.matched_total || 0) + '</b></span>' +
        '<span>غير معروف: <b>' + esc(s.unknown_total || 0) + '</b></span>' +
        '<span>تعارض أمني: <b>' + esc(s.conflict_total || 0) + '</b></span>';
    }
    if(portBody){
      portBody.innerHTML = '';
      (data.matched || []).forEach(function(row){
        var tr = document.createElement('tr');
        tr.innerHTML =
          '<td class="ltr-cell">' + esc(row.mac) + '</td>' +
          '<td><span class="rxr-count rxr-count-final">مطابق</span></td>' +
          '<td>' + esc(row.full_name || row.username || '') + '</td>' +
          '<td class="ltr-cell">' + esc(row.ppp_username || row.ppp_user || '') + '</td>' +
          '<td class="ltr-cell small">' + esc(row.mac_source || '') + '</td>' +
          '<td>' + (row.ownership_conflict ? '<span class="rxr-count rxr-count-warn">ملكية تحتاج مراجعة مراقب الشبكة</span>' : '<span class="rxr-muted">—</span>') + '</td>';
        portBody.appendChild(tr);
      });
      (data.unknown || []).forEach(function(mac){
        var tr = document.createElement('tr');
        tr.innerHTML =
          '<td class="ltr-cell">' + esc(mac) + '</td>' +
          '<td><span class="rxr-count rxr-count-muted">غير معروف</span></td>' +
          '<td colspan="4" class="rxr-muted">لا يوجد مشترك مطابق في مصادر الهوية الحالية</td>';
        portBody.appendChild(tr);
      });
    }
    if(portWrap) portWrap.hidden = false;
  }
  if(portBtn){
    portBtn.addEventListener('click', function(){
      if(!routerSelect || !ifaceSelect || !routerSelect.value || !ifaceSelect.value){ ps('اختر الراوتر والمنفذ.'); return; }
      portBtn.disabled = true;
      var old = portBtn.textContent;
      portBtn.textContent = 'جارٍ الجلب...';
      ps('جارٍ قراءة Bridge Host من المنفذ المختار وحفظه ضمن المطابقة الرسمية...');
      var fd = new FormData();
      fd.append('router_id', routerSelect.value);
      fd.append('interface', ifaceSelect.value);
      fetch('api/router_port_match.php', {method:'POST', body:fd, headers:{'X-Requested-With':'XMLHttpRequest'}})
        .then(function(r){ return r.json(); })
        .then(function(data){
          if(!data || !data.ok){ throw new Error((data && data.message) || 'فشل قراءة المنفذ'); }
          renderPortResult(data);
          ps('تمت قراءة المنفذ ' + (data.interface || '') + ' ومطابقته وحفظه ضمن Snapshot الرسمي. سيتم تحديث الصفحة...');
          setTimeout(function(){ window.location.reload(); }, 900);
        })
        .catch(function(e){ ps(e && e.message ? e.message : 'فشل قراءة المنفذ.'); })
        .finally(function(){ portBtn.disabled = false; portBtn.textContent = old; });
    });
  }

  document.querySelectorAll('.rxr-port-remove-btn').forEach(function(btn){
    btn.addEventListener('click', function(){
      var key = btn.getAttribute('data-key') || '';
      var pseudoId = btn.getAttribute('data-pseudo-id') || '';
      if(!key && !pseudoId){
        alert('تعذر تحديد المنفذ المراد إزالته. أعد تطبيق المطابقة ثم حاول مرة أخرى.');
        return;
      }
      if(!confirm('إزالة هذا المنفذ من المطابقة الرسمية والداشبورد؟')) return;
      btn.disabled = true;
      var old = btn.textContent;
      btn.textContent = 'جارٍ...';
      var fd = new FormData();
      fd.append('key', key);
      fd.append('pseudo_id', pseudoId);
      fetch('api/router_port_remove.php', {method:'POST', body:fd, headers:{'X-Requested-With':'XMLHttpRequest'}})
        .then(function(r){ return r.json(); })
        .then(function(data){
          if(!data || !data.ok){ throw new Error((data && data.message) || 'فشل إزالة المنفذ'); }
          ps(data.message || 'تمت إزالة المنفذ وإعادة بناء Snapshot.');
          setTimeout(function(){ window.location.reload(); }, 700);
        })
        .catch(function(e){ alert(e && e.message ? e.message : 'فشل إزالة المنفذ.'); btn.disabled = false; btn.textContent = old; });
    });
  });

  document.querySelectorAll('.rxr-port-rename-btn').forEach(function(btn){
    btn.addEventListener('click', function(){
      var key = btn.getAttribute('data-key') || '';
      var pseudoId = btn.getAttribute('data-pseudo-id') || '';
      var current = btn.getAttribute('data-name') || '';
      var name = prompt('اسم المنفذ داخل البرنامج:', current);
      if(name === null) return;
      name = String(name || '').replace(/\s+/g, ' ').trim();
      if(!name){ alert('اكتب اسم المنفذ أولاً.'); return; }
      var fd = new FormData();
      fd.append('key', key);
      fd.append('pseudo_id', pseudoId);
      fd.append('name', name);
      btn.disabled = true;
      fetch('api/router_port_rename.php', {method:'POST', body:fd, headers:{'X-Requested-With':'XMLHttpRequest'}})
        .then(function(r){ return r.json(); })
        .then(function(data){
          if(!data || !data.ok){ throw new Error((data && data.message) || 'فشل تعديل اسم المنفذ'); }
          setTimeout(function(){ window.location.reload(); }, 500);
        })
        .catch(function(e){ alert(e && e.message ? e.message : 'فشل تعديل اسم المنفذ.'); btn.disabled = false; });
    });
  });
})();
</script>
<?php if (!UA_EMBED): ?></section></div><?php require_once __DIR__ . '/footer.php'; endif; ?>
