{"id":1901,"date":"2026-07-29T21:10:56","date_gmt":"2026-07-29T14:10:56","guid":{"rendered":"https:\/\/aipnemaptma.org\/?page_id=1901"},"modified":"2026-07-29T21:53:34","modified_gmt":"2026-07-29T14:53:34","slug":"jurnal-ilmiah","status":"publish","type":"page","link":"https:\/\/aipnemaptma.org\/en\/jurnal-ilmiah\/","title":{"rendered":"Jurnal Ilmiah"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"1901\" class=\"elementor elementor-1901\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-095984e elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"095984e\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-d62100e\" data-id=\"d62100e\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-ae7dfee elementor-widget elementor-widget-html\" data-id=\"ae7dfee\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!-- =========================================================\nPAGE JURNAL ILMIAH AIPNEMA\nData dibaca langsung dari Google Sheets melalui Google Visualization API.\n\nSpreadsheet:\nhttps:\/\/docs.google.com\/spreadsheets\/d\/12_7KlAYEih5KElVm9n3zgq6HITNFufYLlVVfE4UP4lU\/edit?usp=sharing\n\nTampilan publik:\n- Cover jurnal\n- Nama jurnal\n- Institusi\/penerbit bila tersedia\n- Peringkat Sinta\n- Status DOAJ\n- Status Scopus\n- Cover dan judul menuju website jurnal\n\nTidak menyertakan header dan footer.\n========================================================= -->\n\n<style>\n:root{\n  --aip-journal-primary:#094528;\n  --aip-journal-primary-2:#0C5A35;\n  --aip-journal-dark:#052F1D;\n  --aip-journal-deep:#032416;\n  --aip-journal-gold:#D8B25C;\n  --aip-journal-gold-soft:#F5E9C9;\n  --aip-journal-blue:#1E6292;\n  --aip-journal-text:#1C2822;\n  --aip-journal-muted:#647169;\n  --aip-journal-border:#DCE5E0;\n  --aip-journal-soft:#EAF3EE;\n  --aip-journal-bg:#F7F9F8;\n  --aip-journal-white:#FFFFFF;\n  --aip-journal-container:1200px;\n  --aip-journal-shadow:0 18px 48px rgba(5,47,29,.10);\n  --aip-journal-shadow-sm:0 10px 28px rgba(5,47,29,.08);\n  --aip-journal-header-offset:120px;\n}\n\n.aip-journal-page,\n.aip-journal-page *{\n  box-sizing:border-box;\n}\n\n.aip-journal-page{\n  position:relative;\n  left:50%;\n  z-index:1;\n  width:100vw;\n  max-width:100vw;\n  margin:0 0 0 -50vw;\n  padding:0!important;\n  overflow-x:clip;\n  color:var(--aip-journal-text);\n  background:var(--aip-journal-white);\n  font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,\"Segoe UI\",Arial,sans-serif;\n}\n\n.aip-journal-page [id]{\n  scroll-margin-top:var(--aip-journal-header-offset);\n}\n\n.aip-journal-page img{\n  display:block;\n  max-width:100%;\n}\n\n.aip-journal-page a{\n  color:inherit;\n}\n\n.aip-journal-page h1,\n.aip-journal-page h2,\n.aip-journal-page h3,\n.aip-journal-page p{\n  margin-top:0;\n}\n\n.aip-journal-container{\n  width:min(var(--aip-journal-container),calc(100% - 48px));\n  margin-inline:auto;\n}\n\n.aip-journal-section{\n  position:relative;\n  padding:86px 0;\n}\n\n.aip-journal-section-soft{\n  background:var(--aip-journal-bg);\n}\n\n.aip-journal-kicker{\n  display:inline-flex;\n  align-items:center;\n  gap:10px;\n  margin:0 0 15px;\n  color:var(--aip-journal-primary);\n  font-size:13px;\n  font-weight:800;\n  letter-spacing:.12em;\n  text-transform:uppercase;\n}\n\n.aip-journal-kicker::before{\n  content:\"\";\n  width:30px;\n  height:3px;\n  border-radius:999px;\n  background:var(--aip-journal-gold);\n}\n\n.aip-journal-heading{\n  max-width:900px;\n  margin:0;\n  color:var(--aip-journal-text);\n  font-size:clamp(32px,4.4vw,52px);\n  font-weight:820;\n  letter-spacing:-.04em;\n  line-height:1.12;\n}\n\n\/* HERO *\/\n.aip-journal-hero{\n  position:relative;\n  isolation:isolate;\n  overflow:hidden;\n  color:var(--aip-journal-white);\n  background:\n    radial-gradient(circle at 85% 16%,rgba(216,178,92,.20),transparent 24%),\n    linear-gradient(125deg,var(--aip-journal-deep),var(--aip-journal-primary) 60%,#0A5A34);\n}\n\n.aip-journal-hero::before{\n  content:\"\";\n  position:absolute;\n  inset:0;\n  z-index:-1;\n  opacity:.11;\n  background-image:\n    linear-gradient(rgba(255,255,255,.28) 1px,transparent 1px),\n    linear-gradient(90deg,rgba(255,255,255,.28) 1px,transparent 1px);\n  background-size:54px 54px;\n  mask-image:linear-gradient(to right,#000,transparent 82%);\n}\n\n.aip-journal-hero-grid{\n  display:grid;\n  grid-template-columns:minmax(0,1.08fr) minmax(330px,.92fr);\n  align-items:center;\n  gap:62px;\n  padding:82px 0 76px;\n}\n\n.aip-journal-breadcrumb{\n  display:flex;\n  flex-wrap:wrap;\n  gap:8px;\n  margin-bottom:24px;\n  color:#CFE0D6;\n  font-size:13px;\n}\n\n.aip-journal-breadcrumb a{\n  text-decoration:none;\n}\n\n.aip-journal-breadcrumb a:hover{\n  color:#F0D99F;\n}\n\n.aip-journal-hero-badge{\n  display:inline-flex;\n  align-items:center;\n  gap:9px;\n  margin-bottom:22px;\n  padding:8px 13px;\n  border:1px solid rgba(255,255,255,.20);\n  border-radius:999px;\n  color:#F7EBCB;\n  background:rgba(255,255,255,.08);\n  font-size:13px;\n  font-weight:760;\n}\n\n.aip-journal-hero-badge::before{\n  content:\"\";\n  width:8px;\n  height:8px;\n  border-radius:50%;\n  background:var(--aip-journal-gold);\n}\n\n.aip-journal-hero h1{\n  max-width:800px;\n  margin:0;\n  color:var(--aip-journal-white);\n  font-size:clamp(42px,5.2vw,66px);\n  font-weight:830;\n  letter-spacing:-.05em;\n  line-height:1.04;\n}\n\n.aip-journal-hero h1 span{\n  color:#F1D99D;\n}\n\n.aip-journal-hero-text{\n  max-width:740px;\n  margin:24px 0 0;\n  color:#DCEBE2;\n  font-size:17px;\n  line-height:1.78;\n}\n\n.aip-journal-hero-panel{\n  padding:30px;\n  border:1px solid rgba(255,255,255,.16);\n  border-radius:24px;\n  background:rgba(255,255,255,.08);\n  box-shadow:0 28px 64px rgba(0,0,0,.17);\n  backdrop-filter:blur(8px);\n}\n\n.aip-journal-logo-wrap{\n  display:inline-flex;\n  padding:13px 15px;\n  border-radius:14px;\n  background:var(--aip-journal-white);\n  box-shadow:0 12px 30px rgba(0,0,0,.15);\n}\n\n.aip-journal-logo-wrap img{\n  width:190px;\n  height:auto;\n}\n\n.aip-journal-hero-panel p{\n  margin:20px 0 0;\n  color:#DCEBE2;\n  font-size:14px;\n  line-height:1.75;\n}\n\n.aip-journal-stat-grid{\n  display:grid;\n  grid-template-columns:repeat(2,1fr);\n  gap:12px;\n  margin-top:22px;\n}\n\n.aip-journal-stat{\n  padding:17px;\n  border:1px solid rgba(255,255,255,.13);\n  border-radius:14px;\n  background:rgba(255,255,255,.07);\n}\n\n.aip-journal-stat strong{\n  display:block;\n  color:#F2DCA5;\n  font-size:25px;\n  font-weight:840;\n  line-height:1.05;\n}\n\n.aip-journal-stat span{\n  display:block;\n  margin-top:7px;\n  color:#DCEBE2;\n  font-size:12px;\n  line-height:1.45;\n}\n\n\/* TOOLBAR *\/\n.aip-journal-toolbar{\n  display:grid;\n  grid-template-columns:minmax(260px,1fr) 160px 155px 155px 175px;\n  gap:13px;\n  margin-top:38px;\n}\n\n.aip-journal-search-wrap{\n  position:relative;\n}\n\n.aip-journal-search-icon{\n  position:absolute;\n  top:50%;\n  left:15px;\n  width:20px;\n  height:20px;\n  transform:translateY(-50%);\n  color:var(--aip-journal-primary);\n  pointer-events:none;\n}\n\n.aip-journal-input,\n.aip-journal-select{\n  width:100%;\n  min-height:50px;\n  border:1px solid var(--aip-journal-border);\n  border-radius:12px;\n  color:var(--aip-journal-text);\n  background:var(--aip-journal-white);\n  font-family:inherit;\n  font-size:14px;\n  outline:none;\n}\n\n.aip-journal-input{\n  padding:0 15px 0 44px;\n}\n\n.aip-journal-select{\n  padding:0 38px 0 14px;\n}\n\n.aip-journal-input:focus,\n.aip-journal-select:focus{\n  border-color:var(--aip-journal-primary);\n  box-shadow:0 0 0 4px rgba(9,69,40,.10);\n}\n\n.aip-journal-result-bar{\n  display:flex;\n  align-items:center;\n  justify-content:space-between;\n  gap:20px;\n  margin:25px 0 20px;\n  color:var(--aip-journal-muted);\n  font-size:13px;\n}\n\n.aip-journal-reset{\n  border:0;\n  color:var(--aip-journal-primary);\n  background:transparent;\n  font-family:inherit;\n  font-size:12px;\n  font-weight:760;\n  cursor:pointer;\n}\n\n\/* GRID *\/\n.aip-journal-grid{\n  display:grid;\n  grid-template-columns:repeat(4,minmax(0,1fr));\n  gap:20px;\n}\n\n.aip-journal-card{\n  display:flex;\n  flex-direction:column;\n  min-width:0;\n  overflow:hidden;\n  border:1px solid var(--aip-journal-border);\n  border-radius:19px;\n  background:var(--aip-journal-white);\n  transition:.22s ease;\n}\n\n.aip-journal-card:hover{\n  transform:translateY(-6px);\n  border-color:rgba(9,69,40,.30);\n  box-shadow:var(--aip-journal-shadow-sm);\n}\n\n.aip-journal-cover-link{\n  position:relative;\n  display:block;\n  overflow:hidden;\n  aspect-ratio:3\/4;\n  padding:18px;\n  background:\n    radial-gradient(circle at 50% 25%,rgba(216,178,92,.14),transparent 28%),\n    linear-gradient(145deg,#EEF5F1,#DCEAE2);\n  text-decoration:none!important;\n}\n\n.aip-journal-cover-link::after{\n  content:\"Buka Jurnal\";\n  position:absolute;\n  inset:auto 16px 16px;\n  display:flex;\n  align-items:center;\n  justify-content:center;\n  min-height:42px;\n  border-radius:10px;\n  color:var(--aip-journal-white);\n  background:rgba(5,47,29,.92);\n  font-size:12px;\n  font-weight:780;\n  opacity:0;\n  transform:translateY(8px);\n  transition:.22s ease;\n}\n\n.aip-journal-card:hover .aip-journal-cover-link::after{\n  opacity:1;\n  transform:translateY(0);\n}\n\n.aip-journal-cover{\n  width:100%;\n  height:100%;\n  object-fit:contain;\n  object-position:center;\n  border-radius:7px;\n  background:var(--aip-journal-white);\n  box-shadow:0 16px 30px rgba(5,47,29,.16);\n  transition:transform .35s ease;\n}\n\n.aip-journal-card:hover .aip-journal-cover{\n  transform:scale(1.025);\n}\n\n.aip-journal-cover-fallback{\n  position:absolute;\n  inset:18px;\n  display:none;\n  place-items:center;\n  border-radius:7px;\n  background:\n    radial-gradient(circle at 50% 25%,rgba(216,178,92,.17),transparent 24%),\n    linear-gradient(145deg,var(--aip-journal-dark),var(--aip-journal-primary));\n  box-shadow:0 16px 30px rgba(5,47,29,.16);\n}\n\n.aip-journal-cover-fallback img{\n  width:70%;\n  height:auto;\n  object-fit:contain;\n  filter:drop-shadow(0 10px 20px rgba(0,0,0,.16));\n}\n\n.aip-journal-card-body{\n  display:flex;\n  flex-direction:column;\n  flex:1;\n  padding:22px;\n}\n\n.aip-journal-card h3{\n  overflow-wrap:anywhere;\n  margin:0;\n  color:var(--aip-journal-text);\n  font-size:18px;\n  line-height:1.48;\n}\n\n.aip-journal-card h3 a{\n  text-decoration:none!important;\n}\n\n.aip-journal-card h3 a:hover{\n  color:var(--aip-journal-primary);\n}\n\n.aip-journal-institution{\n  margin:9px 0 0;\n  color:var(--aip-journal-muted);\n  font-size:12px;\n  line-height:1.58;\n}\n\n.aip-journal-badges{\n  display:flex;\n  flex-wrap:wrap;\n  gap:8px;\n  margin-top:18px;\n}\n\n.aip-journal-badge{\n  display:inline-flex;\n  align-items:center;\n  justify-content:center;\n  min-height:31px;\n  padding:0 10px;\n  border:1px solid transparent;\n  border-radius:999px;\n  font-size:10px;\n  font-weight:820;\n  letter-spacing:.04em;\n  line-height:1.2;\n  text-transform:uppercase;\n}\n\n.aip-journal-sinta-1{\n  color:#FFFFFF;\n  background:#7B1FA2;\n}\n\n.aip-journal-sinta-2{\n  color:#FFFFFF;\n  background:#1565C0;\n}\n\n.aip-journal-sinta-3{\n  color:#FFFFFF;\n  background:#00897B;\n}\n\n.aip-journal-sinta-4{\n  color:#FFFFFF;\n  background:#558B2F;\n}\n\n.aip-journal-sinta-5{\n  color:#4B3A0A;\n  background:#F2D16B;\n}\n\n.aip-journal-sinta-6{\n  color:#5F420D;\n  background:#E8C38B;\n}\n\n.aip-journal-sinta-other{\n  color:var(--aip-journal-primary);\n  background:var(--aip-journal-soft);\n  border-color:rgba(9,69,40,.18);\n}\n\n.aip-journal-doaj-active{\n  color:#FFFFFF;\n  background:#F47920;\n}\n\n.aip-journal-scopus-active{\n  color:#FFFFFF;\n  background:#1E6292;\n}\n\n.aip-journal-index-inactive{\n  color:#7A8580;\n  background:#EEF1EF;\n  border-color:#D8DFDB;\n}\n\n.aip-journal-card-link{\n  display:inline-flex;\n  align-items:center;\n  gap:7px;\n  width:max-content;\n  margin-top:auto;\n  padding-top:22px;\n  color:var(--aip-journal-primary)!important;\n  text-decoration:none!important;\n  font-size:12px;\n  font-weight:780;\n}\n\n.aip-journal-card-link svg{\n  width:16px;\n  height:16px;\n  transition:transform .2s ease;\n}\n\n.aip-journal-card-link:hover svg{\n  transform:translateX(4px);\n}\n\n\/* STATE *\/\n.aip-journal-state{\n  grid-column:1\/-1;\n  padding:43px;\n  border:1px dashed var(--aip-journal-border);\n  border-radius:17px;\n  color:var(--aip-journal-muted);\n  background:var(--aip-journal-white);\n  text-align:center;\n  font-size:14px;\n  line-height:1.75;\n}\n\n.aip-journal-state strong{\n  display:block;\n  margin-bottom:7px;\n  color:var(--aip-journal-text);\n  font-size:17px;\n}\n\n.aip-journal-loading{\n  display:inline-flex;\n  gap:5px;\n  margin-top:13px;\n}\n\n.aip-journal-loading span{\n  width:7px;\n  height:7px;\n  border-radius:50%;\n  background:var(--aip-journal-primary);\n  animation:aipJournalPulse 1.15s infinite ease-in-out;\n}\n\n.aip-journal-loading span:nth-child(2){\n  animation-delay:.16s;\n}\n\n.aip-journal-loading span:nth-child(3){\n  animation-delay:.32s;\n}\n\n@keyframes aipJournalPulse{\n  0%,80%,100%{opacity:.25;transform:scale(.8)}\n  40%{opacity:1;transform:scale(1)}\n}\n\n\/* CTA *\/\n.aip-journal-cta{\n  padding-top:0;\n  background:var(--aip-journal-bg);\n}\n\n.aip-journal-cta-card{\n  display:flex;\n  align-items:center;\n  justify-content:space-between;\n  gap:38px;\n  padding:38px 42px;\n  border:1px solid var(--aip-journal-border);\n  border-radius:20px;\n  background:var(--aip-journal-white);\n  box-shadow:var(--aip-journal-shadow-sm);\n}\n\n.aip-journal-cta-card h2{\n  margin:0;\n  color:var(--aip-journal-text);\n  font-size:clamp(26px,3.2vw,38px);\n  letter-spacing:-.03em;\n  line-height:1.2;\n}\n\n.aip-journal-cta-card p{\n  margin:10px 0 0;\n  color:var(--aip-journal-muted);\n  font-size:15px;\n  line-height:1.7;\n}\n\n.aip-journal-cta-button{\n  display:inline-flex;\n  align-items:center;\n  justify-content:center;\n  min-height:50px;\n  padding:0 22px;\n  border:1px solid var(--aip-journal-primary);\n  border-radius:11px;\n  color:var(--aip-journal-white)!important;\n  background:var(--aip-journal-primary);\n  text-decoration:none!important;\n  font-size:15px;\n  font-weight:760;\n  transition:.22s ease;\n}\n\n.aip-journal-cta-button:hover{\n  transform:translateY(-2px);\n  background:var(--aip-journal-primary-2);\n}\n\n@media(max-width:1100px){\n  .aip-journal-grid{\n    grid-template-columns:repeat(3,minmax(0,1fr));\n  }\n\n  .aip-journal-toolbar{\n    grid-template-columns:minmax(240px,1fr) repeat(4,minmax(145px,.42fr));\n  }\n}\n\n@media(max-width:920px){\n  .aip-journal-hero-grid{\n    grid-template-columns:1fr;\n  }\n\n  .aip-journal-hero-grid{\n    gap:38px;\n    padding:68px 0;\n  }\n\n  .aip-journal-hero-panel{\n    max-width:620px;\n  }\n\n  .aip-journal-section{\n    padding:68px 0;\n  }\n\n  .aip-journal-toolbar{\n    grid-template-columns:1fr 1fr;\n  }\n\n  .aip-journal-search-wrap{\n    grid-column:1\/-1;\n  }\n}\n\n@media(max-width:760px){\n  .aip-journal-grid{\n    grid-template-columns:repeat(2,minmax(0,1fr));\n  }\n}\n\n@media(max-width:560px){\n  :root{\n    --aip-journal-header-offset:105px;\n  }\n\n  .aip-journal-container{\n    width:min(var(--aip-journal-container),calc(100% - 30px));\n  }\n\n  .aip-journal-section{\n    padding:56px 0;\n  }\n\n  .aip-journal-hero-grid{\n    padding:52px 0;\n  }\n\n  .aip-journal-hero h1{\n    font-size:clamp(38px,11vw,50px);\n  }\n\n  .aip-journal-hero-text{\n    font-size:16px;\n  }\n\n  .aip-journal-toolbar{\n    grid-template-columns:1fr;\n  }\n\n  .aip-journal-search-wrap{\n    grid-column:auto;\n  }\n\n  .aip-journal-result-bar{\n    align-items:flex-start;\n    flex-direction:column;\n  }\n\n  .aip-journal-grid{\n    grid-template-columns:1fr;\n  }\n\n  .aip-journal-cover-link{\n    max-height:560px;\n  }\n\n  .aip-journal-cta-card{\n    flex-direction:column;\n    align-items:flex-start;\n    padding:30px 24px;\n  }\n\n  .aip-journal-cta-button{\n    width:100%;\n  }\n}\n<\/style>\n\n<main class=\"aip-journal-page\" id=\"aipJournalPage\">\n\n  <header class=\"aip-journal-hero\">\n    <div class=\"aip-journal-container aip-journal-hero-grid\">\n      <div>\n        <nav class=\"aip-journal-breadcrumb\" aria-label=\"Breadcrumb\">\n          <a href=\"https:\/\/aipnemaptma.org\/\">Beranda<\/a>\n          <span>\/<\/span>\n          <span>Jurnal Ilmiah<\/span>\n        <\/nav>\n\n        <div class=\"aip-journal-hero-badge\">\n          Publikasi Ilmiah Institusi Anggota\n        <\/div>\n\n        <h1>\n          Jurnal Ilmiah <span>AIPNEMA<\/span>\n        <\/h1>\n\n        <p class=\"aip-journal-hero-text\">\n          Direktori jurnal ilmiah yang dikelola oleh institusi anggota,\n          dilengkapi peringkat Sinta serta informasi pengindeksan DOAJ\n          dan Scopus.\n        <\/p>\n      <\/div>\n\n      <aside class=\"aip-journal-hero-panel\">\n        <div class=\"aip-journal-logo-wrap\">\n          <img fetchpriority=\"high\" decoding=\"async\"\n            src=\"https:\/\/aipnemaptma.org\/wp-content\/uploads\/2023\/07\/logo-aipnema2.png\"\n            alt=\"Logo AIPNEMA\"\n            width=\"500\"\n            height=\"150\"\n            loading=\"eager\"\n          >\n        <\/div>\n\n        <p>\n          Klik cover atau nama jurnal untuk mengunjungi website jurnal\n          dan membaca informasi publikasi secara langsung.\n        <\/p>\n\n        <div class=\"aip-journal-stat-grid\">\n          <div class=\"aip-journal-stat\">\n            <strong id=\"aipJournalTotal\">\u2013<\/strong>\n            <span>Jurnal terdata<\/span>\n          <\/div>\n\n          <div class=\"aip-journal-stat\">\n            <strong id=\"aipJournalSintaCount\">\u2013<\/strong>\n            <span>Terakreditasi Sinta<\/span>\n          <\/div>\n\n          <div class=\"aip-journal-stat\">\n            <strong id=\"aipJournalDoajCount\">\u2013<\/strong>\n            <span>Terindeks DOAJ<\/span>\n          <\/div>\n\n          <div class=\"aip-journal-stat\">\n            <strong id=\"aipJournalScopusCount\">\u2013<\/strong>\n            <span>Terindeks Scopus<\/span>\n          <\/div>\n        <\/div>\n      <\/aside>\n    <\/div>\n  <\/header>\n\n  <section class=\"aip-journal-section aip-journal-section-soft\" id=\"direktori-jurnal\">\n    <div class=\"aip-journal-container\">\n      <p class=\"aip-journal-kicker\">Direktori Jurnal<\/p>\n\n      <h2 class=\"aip-journal-heading\">\n        Jurnal diurutkan dari peringkat terbaik hingga terendah.\n      <\/h2>\n\n      <div class=\"aip-journal-toolbar\">\n        <div class=\"aip-journal-search-wrap\">\n          <svg class=\"aip-journal-search-icon\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n            <circle cx=\"11\" cy=\"11\" r=\"7\" stroke=\"currentColor\" stroke-width=\"2\"\/>\n            <path d=\"M20 20l-3.5-3.5\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\/>\n          <\/svg>\n\n          <input\n            class=\"aip-journal-input\"\n            id=\"aipJournalSearch\"\n            type=\"search\"\n            placeholder=\"Cari nama jurnal atau institusi\u2026\"\n            autocomplete=\"off\"\n          >\n        <\/div>\n\n        <select class=\"aip-journal-select\" id=\"aipJournalSinta\">\n          <option value=\"\">Semua Sinta<\/option>\n        <\/select>\n\n        <select class=\"aip-journal-select\" id=\"aipJournalDoaj\">\n          <option value=\"\">Semua DOAJ<\/option>\n          <option value=\"indexed\">Terindeks DOAJ<\/option>\n          <option value=\"not-indexed\">Belum\/Tidak terindeks<\/option>\n        <\/select>\n\n        <select class=\"aip-journal-select\" id=\"aipJournalScopus\">\n          <option value=\"\">Semua Scopus<\/option>\n          <option value=\"indexed\">Terindeks Scopus<\/option>\n          <option value=\"not-indexed\">Belum\/Tidak terindeks<\/option>\n        <\/select>\n\n        <select class=\"aip-journal-select\" id=\"aipJournalSort\">\n          <option value=\"ranking\">Peringkat Terbaik<\/option>\n          <option value=\"name-asc\">Nama A\u2013Z<\/option>\n          <option value=\"name-desc\">Nama Z\u2013A<\/option>\n        <\/select>\n      <\/div>\n\n      <div class=\"aip-journal-result-bar\">\n        <span id=\"aipJournalResultText\">Memuat data jurnal\u2026<\/span>\n\n        <button\n          class=\"aip-journal-reset\"\n          id=\"aipJournalReset\"\n          type=\"button\"\n        >\n          Reset pencarian\n        <\/button>\n      <\/div>\n\n      <div class=\"aip-journal-grid\" id=\"aipJournalGrid\" aria-live=\"polite\">\n        <div class=\"aip-journal-state\">\n          <strong>Memuat daftar jurnal\u2026<\/strong>\n          Sistem sedang membaca data jurnal.\n          <span class=\"aip-journal-loading\" aria-hidden=\"true\">\n            <span><\/span><span><\/span><span><\/span>\n          <\/span>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <section class=\"aip-journal-section aip-journal-cta\">\n    <div class=\"aip-journal-container\">\n      <div class=\"aip-journal-cta-card\">\n        <div>\n          <h2>Data jurnal belum tercantum atau perlu diperbarui?<\/h2>\n\n          <p>\n            Sampaikan pemutakhiran cover, website, peringkat Sinta,\n            atau status pengindeksan kepada sekretariat AIPNEMA.\n          <\/p>\n        <\/div>\n\n        <a\n          class=\"aip-journal-cta-button\"\n          href=\"https:\/\/aipnemaptma.org\/kontak\/\"\n        >\n          Hubungi Sekretariat\n        <\/a>\n      <\/div>\n    <\/div>\n  <\/section>\n\n<\/main>\n\n<script>\n(function(){\n  \/* =======================================================\n     KONFIGURASI GOOGLE SHEETS\n     Ganti SHEET_GID apabila data berada pada tab selain tab pertama.\n  ======================================================= *\/\n  const SHEET_ID =\n    '12_7KlAYEih5KElVm9n3zgq6HITNFufYLlVVfE4UP4lU';\n  const SHEET_GID = '0';\n\n  const SHEET_BASE =\n    'https:\/\/docs.google.com\/spreadsheets\/d\/' +\n    SHEET_ID +\n    '\/gviz\/tq';\n\n  const FALLBACK_LOGO =\n    'https:\/\/aipnemaptma.org\/wp-content\/uploads\/2023\/07\/logo-aipnema2.png';\n\n  const FIELD_ALIASES = {\n    name:[\n      'nama jurnal','jurnal','journal name','nama journal',\n      'title','judul jurnal'\n    ],\n    institution:[\n      'institusi','institusi pengelola','penerbit','publisher',\n      'perguruan tinggi','afiliasi','pengelola','universitas',\n      'asal institusi'\n    ],\n    cover:[\n      'cover','cover jurnal','sampul','sampul jurnal',\n      'thumbnail','tumbnail','gambar cover','url cover',\n      'link cover','logo jurnal','image','gambar'\n    ],\n    website:[\n      'website','website jurnal','url jurnal','link jurnal',\n      'alamat jurnal','journal website','url','link',\n      'ojs','website ojs'\n    ],\n    sinta:[\n      'sinta','peringkat sinta','rank sinta','sinta rank',\n      'akreditasi sinta','peringkat','sinta score'\n    ],\n    doaj:[\n      'doaj','indexing doaj','indeks doaj',\n      'terindeks doaj','status doaj'\n    ],\n    scopus:[\n      'scopus','indexing scopus','indeks scopus',\n      'terindeks scopus','status scopus'\n    ]\n  };\n\n  const pageElement = document.getElementById('aipJournalPage');\n  const gridElement = document.getElementById('aipJournalGrid');\n  const searchElement = document.getElementById('aipJournalSearch');\n  const sintaElement = document.getElementById('aipJournalSinta');\n  const doajElement = document.getElementById('aipJournalDoaj');\n  const scopusElement = document.getElementById('aipJournalScopus');\n  const sortElement = document.getElementById('aipJournalSort');\n  const resetElement = document.getElementById('aipJournalReset');\n  const resultTextElement =\n    document.getElementById('aipJournalResultText');\n\n  const totalElement = document.getElementById('aipJournalTotal');\n  const sintaCountElement =\n    document.getElementById('aipJournalSintaCount');\n  const doajCountElement =\n    document.getElementById('aipJournalDoajCount');\n  const scopusCountElement =\n    document.getElementById('aipJournalScopusCount');\n\n  let headers = [];\n  let records = [];\n  let keys = {\n    name:null,\n    institution:null,\n    cover:null,\n    website:null,\n    sinta:null,\n    doaj:null,\n    scopus:null\n  };\n\n  function setHeaderOffset(){\n    if(!pageElement) return;\n\n    const header =\n      document.getElementById('aipnemaSiteHeader') ||\n      document.querySelector('#masthead, .site-header');\n\n    if(!header) return;\n\n    const style = window.getComputedStyle(header);\n    const overlay =\n      ['absolute','fixed','sticky'].includes(style.position);\n\n    pageElement.style.paddingTop =\n      overlay ? header.offsetHeight + 'px' : '0px';\n\n    pageElement.style.setProperty(\n      '--aip-journal-header-offset',\n      (header.offsetHeight + 24) + 'px'\n    );\n  }\n\n  function normalize(value){\n    return String(value || '')\n      .trim()\n      .toLowerCase()\n      .normalize('NFD')\n      .replace(\/[\\u0300-\\u036f]\/g,'')\n      .replace(\/[^a-z0-9]+\/g,' ')\n      .replace(\/\\s+\/g,' ')\n      .trim();\n  }\n\n  function escapeHtml(value){\n    return String(value || '')\n      .replace(\/&\/g,'&amp;')\n      .replace(\/<\/g,'&lt;')\n      .replace(\/>\/g,'&gt;')\n      .replace(\/\"\/g,'&quot;')\n      .replace(\/'\/g,'&#039;');\n  }\n\n  function valueOf(value){\n    if(value === null || typeof value === 'undefined') return '';\n    return String(value).trim();\n  }\n\n  function ensureUrl(value){\n    const text = valueOf(value);\n\n    if(!text) return '';\n\n    if(\/^https?:\\\/\\\/\/i.test(text)){\n      return text;\n    }\n\n    if(\/^www\\.\/i.test(text)){\n      return 'https:\/\/' + text;\n    }\n\n    if(\n      \/^[a-z0-9.-]+\\.[a-z]{2,}(\\\/.*)?$\/i.test(text)\n    ){\n      return 'https:\/\/' + text;\n    }\n\n    return '';\n  }\n\n  function directImageUrl(value){\n    const url = ensureUrl(value);\n\n    if(!url) return '';\n\n    let match = url.match(\n      \/drive\\.google\\.com\\\/file\\\/d\\\/([^\/?#]+)\/\n    );\n\n    if(!match){\n      match = url.match(\/[?&]id=([^&#]+)\/);\n    }\n\n    if(match){\n      return 'https:\/\/drive.google.com\/uc?export=view&id=' +\n        match[1];\n    }\n\n    return url;\n  }\n\n  function cellValue(cell){\n    if(!cell) return '';\n\n    if(cell.f !== null && typeof cell.f !== 'undefined'){\n      return valueOf(cell.f);\n    }\n\n    if(cell.v !== null && typeof cell.v !== 'undefined'){\n      return valueOf(cell.v);\n    }\n\n    return '';\n  }\n\n  function rowHeaderScore(row){\n    const allAliases = Object.values(FIELD_ALIASES)\n      .flat()\n      .map(normalize);\n\n    return row.reduce(function(score,value){\n      const normalizedValue = normalize(value);\n\n      if(!normalizedValue) return score;\n\n      const matched = allAliases.some(function(alias){\n        return normalizedValue === alias ||\n          normalizedValue.includes(alias) ||\n          alias.includes(normalizedValue);\n      });\n\n      return score + (matched ? 1 : 0);\n    },0);\n  }\n\n  function uniqueHeaders(headerRow){\n    const used = {};\n\n    return headerRow.map(function(header,index){\n      let candidate =\n        valueOf(header) || 'Kolom ' + (index + 1);\n\n      const normalizedCandidate =\n        normalize(candidate) || 'kolom';\n\n      used[normalizedCandidate] =\n        (used[normalizedCandidate] || 0) + 1;\n\n      if(used[normalizedCandidate] > 1){\n        candidate += ' ' + used[normalizedCandidate];\n      }\n\n      return candidate;\n    });\n  }\n\n  function parseResponse(response){\n    if(!response || response.status === 'error'){\n      throw new Error(\n        response &&\n        response.errors &&\n        response.errors[0]\n          ? response.errors[0].detailed_message ||\n            response.errors[0].message\n          : 'Spreadsheet tidak dapat dibaca.'\n      );\n    }\n\n    const table = response.table;\n\n    if(\n      !table ||\n      !Array.isArray(table.cols) ||\n      !Array.isArray(table.rows)\n    ){\n      throw new Error('Format spreadsheet tidak dikenali.');\n    }\n\n    const columnCount = table.cols.length;\n\n    const matrix = table.rows.map(function(row){\n      return Array.from({length:columnCount},function(_,index){\n        return cellValue(row.c ? row.c[index] : null);\n      });\n    });\n\n    if(!matrix.length){\n      throw new Error('Spreadsheet belum berisi data jurnal.');\n    }\n\n    let bestIndex = 0;\n    let bestScore = -1;\n\n    matrix.slice(0,15).forEach(function(row,index){\n      const score = rowHeaderScore(row);\n\n      if(score > bestScore){\n        bestScore = score;\n        bestIndex = index;\n      }\n    });\n\n    if(bestScore < 2){\n      bestIndex = matrix.findIndex(function(row){\n        return row.filter(Boolean).length >= 2;\n      });\n\n      if(bestIndex < 0) bestIndex = 0;\n    }\n\n    const parsedHeaders =\n      uniqueHeaders(matrix[bestIndex]);\n\n    const parsedRecords = matrix\n      .slice(bestIndex + 1)\n      .map(function(row){\n        const record = {};\n\n        parsedHeaders.forEach(function(header,index){\n          record[header] = valueOf(row[index]);\n        });\n\n        return record;\n      })\n      .filter(function(record){\n        return parsedHeaders.some(function(header){\n          return valueOf(record[header]);\n        });\n      });\n\n    return {\n      headers:parsedHeaders,\n      records:parsedRecords\n    };\n  }\n\n  function parseVisualizationText(text){\n    const match = String(text || '').match(\n      \/google\\.visualization\\.Query\\.setResponse\\(([\\s\\S]*)\\);?\\s*$\/\n    );\n\n    if(!match){\n      throw new Error(\n        'Respons Google Sheets tidak dapat diproses.'\n      );\n    }\n\n    return JSON.parse(match[1]);\n  }\n\n  function findHeader(aliases){\n    const normalizedAliases = aliases.map(normalize);\n\n    const exact = headers.find(function(header){\n      return normalizedAliases.includes(normalize(header));\n    });\n\n    if(exact) return exact;\n\n    return headers.find(function(header){\n      const normalizedHeader = normalize(header);\n\n      return normalizedAliases.some(function(alias){\n        return normalizedHeader.includes(alias) ||\n          alias.includes(normalizedHeader);\n      });\n    }) || null;\n  }\n\n  function configureFields(){\n    keys.name = findHeader(FIELD_ALIASES.name);\n    keys.institution = findHeader(FIELD_ALIASES.institution);\n    keys.cover = findHeader(FIELD_ALIASES.cover);\n    keys.website = findHeader(FIELD_ALIASES.website);\n    keys.sinta = findHeader(FIELD_ALIASES.sinta);\n    keys.doaj = findHeader(FIELD_ALIASES.doaj);\n    keys.scopus = findHeader(FIELD_ALIASES.scopus);\n\n    if(!keys.name){\n      keys.name = headers[0] || null;\n    }\n\n    if(!keys.website){\n      keys.website = headers.find(function(header){\n        return records.some(function(record){\n          const url = ensureUrl(record[header]);\n          return Boolean(url);\n        });\n      }) || null;\n    }\n  }\n\n  function normalizeSinta(value){\n    const text = valueOf(value);\n\n    if(!text) return '';\n\n    const normalizedText = normalize(text);\n    const rankMatch = normalizedText.match(\n      \/(?:sinta|s)\\s*([1-6])\\b\/\n    ) || normalizedText.match(\/^([1-6])$\/);\n\n    if(rankMatch){\n      return 'Sinta ' + rankMatch[1];\n    }\n\n    if(\n      \/tidak|belum|non|none|n\\\/a|na\/.test(normalizedText)\n    ){\n      return '';\n    }\n\n    return text;\n  }\n\n  function sintaRank(value){\n    const normalizedValue = normalizeSinta(value);\n    const match = normalizedValue.match(\/([1-6])\/);\n\n    return match ? Number(match[1]) : 99;\n  }\n\n  function indexStatus(value){\n    const text = valueOf(value);\n    const normalizedText = normalize(text);\n\n    if(!text) return false;\n\n    if(\n      \/tidak|belum|no|non|not indexed|none|n\\\/a|na|-\/.test(\n        normalizedText\n      )\n    ){\n      return false;\n    }\n\n    if(\n      \/^https?:\\\/\\\/\/i.test(text) ||\n      \/ya|yes|terindeks|indexed|aktif|scopus|doaj\/.test(\n        normalizedText\n      )\n    ){\n      return true;\n    }\n\n    return false;\n  }\n\n  function sintaClass(value){\n    const rank = sintaRank(value);\n\n    return rank >= 1 && rank <= 6\n      ? 'aip-journal-sinta-' + rank\n      : 'aip-journal-sinta-other';\n  }\n\n  function cardMarkup(record){\n    const name =\n      valueOf(record[keys.name]) ||\n      'Nama jurnal belum dicantumkan';\n\n    const institution =\n      keys.institution\n        ? valueOf(record[keys.institution])\n        : '';\n\n    const website =\n      keys.website\n        ? ensureUrl(record[keys.website])\n        : '';\n\n    const cover =\n      keys.cover\n        ? directImageUrl(record[keys.cover])\n        : '';\n\n    const sinta =\n      keys.sinta\n        ? normalizeSinta(record[keys.sinta])\n        : '';\n\n    const doaj =\n      keys.doaj\n        ? indexStatus(record[keys.doaj])\n        : false;\n\n    const scopus =\n      keys.scopus\n        ? indexStatus(record[keys.scopus])\n        : false;\n\n    const link =\n      website || '#';\n\n    const linkAttributes = website\n      ? 'target=\"_blank\" rel=\"noopener\"'\n      : 'aria-disabled=\"true\" onclick=\"return false\"';\n\n    return `\n      <article class=\"aip-journal-card\">\n        <a\n          class=\"aip-journal-cover-link\"\n          href=\"${escapeHtml(link)}\"\n          ${linkAttributes}\n          aria-label=\"Buka website ${escapeHtml(name)}\"\n        >\n          ${cover\n            ? `\n              <img decoding=\"async\"\n                class=\"aip-journal-cover\"\n                src=\"${escapeHtml(cover)}\"\n                alt=\"Cover ${escapeHtml(name)}\"\n                loading=\"lazy\"\n                onerror=\"this.style.display='none';this.nextElementSibling.style.display='grid'\"\n              >\n              <span class=\"aip-journal-cover-fallback\">\n                <img decoding=\"async\" src=\"${FALLBACK_LOGO}\" alt=\"Logo AIPNEMA\">\n              <\/span>\n            `\n            : `\n              <span\n                class=\"aip-journal-cover-fallback\"\n                style=\"display:grid\"\n              >\n                <img decoding=\"async\" src=\"${FALLBACK_LOGO}\" alt=\"Logo AIPNEMA\">\n              <\/span>\n            `\n          }\n        <\/a>\n\n        <div class=\"aip-journal-card-body\">\n          <h3>\n            <a\n              href=\"${escapeHtml(link)}\"\n              ${linkAttributes}\n            >\n              ${escapeHtml(name)}\n            <\/a>\n          <\/h3>\n\n          ${institution\n            ? `\n              <p class=\"aip-journal-institution\">\n                ${escapeHtml(institution)}\n              <\/p>\n            `\n            : ''\n          }\n\n          <div class=\"aip-journal-badges\">\n            ${sinta\n              ? `\n                <span class=\"aip-journal-badge ${sintaClass(sinta)}\">\n                  ${escapeHtml(sinta)}\n                <\/span>\n              `\n              : `\n                <span class=\"aip-journal-badge aip-journal-index-inactive\">\n                  Sinta \u2014\n                <\/span>\n              `\n            }\n\n            <span class=\"aip-journal-badge ${\n              doaj\n                ? 'aip-journal-doaj-active'\n                : 'aip-journal-index-inactive'\n            }\">\n              ${doaj ? 'DOAJ' : 'DOAJ \u2014'}\n            <\/span>\n\n            <span class=\"aip-journal-badge ${\n              scopus\n                ? 'aip-journal-scopus-active'\n                : 'aip-journal-index-inactive'\n            }\">\n              ${scopus ? 'Scopus' : 'Scopus \u2014'}\n            <\/span>\n          <\/div>\n\n          ${website\n            ? `\n              <a\n                class=\"aip-journal-card-link\"\n                href=\"${escapeHtml(website)}\"\n                target=\"_blank\"\n                rel=\"noopener\"\n              >\n                Kunjungi website jurnal\n                <svg viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n                  <path d=\"M5 12h14M13 6l6 6-6 6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/>\n                <\/svg>\n              <\/a>\n            `\n            : ''\n          }\n        <\/div>\n      <\/article>\n    `;\n  }\n\n  function uniqueSintaValues(){\n    if(!keys.sinta) return [];\n\n    return Array.from(\n      new Set(\n        records\n          .map(function(record){\n            return normalizeSinta(record[keys.sinta]);\n          })\n          .filter(Boolean)\n      )\n    ).sort(function(a,b){\n      return sintaRank(a) - sintaRank(b);\n    });\n  }\n\n  function populateSintaFilter(){\n    sintaElement.innerHTML =\n      '<option value=\"\">Semua Sinta<\/option>';\n\n    uniqueSintaValues().forEach(function(value){\n      sintaElement.insertAdjacentHTML(\n        'beforeend',\n        '<option value=\"' +\n        escapeHtml(value) +\n        '\">' +\n        escapeHtml(value) +\n        '<\/option>'\n      );\n    });\n  }\n\n  function updateStats(){\n    totalElement.textContent = records.length;\n\n    sintaCountElement.textContent =\n      keys.sinta\n        ? records.filter(function(record){\n            return Boolean(normalizeSinta(record[keys.sinta]));\n          }).length\n        : '\u2013';\n\n    doajCountElement.textContent =\n      keys.doaj\n        ? records.filter(function(record){\n            return indexStatus(record[keys.doaj]);\n          }).length\n        : '\u2013';\n\n    scopusCountElement.textContent =\n      keys.scopus\n        ? records.filter(function(record){\n            return indexStatus(record[keys.scopus]);\n          }).length\n        : '\u2013';\n  }\n\n  function journalRankData(record){\n    const sinta =\n      keys.sinta\n        ? normalizeSinta(record[keys.sinta])\n        : '';\n\n    const scopus =\n      keys.scopus\n        ? indexStatus(record[keys.scopus])\n        : false;\n\n    const doaj =\n      keys.doaj\n        ? indexStatus(record[keys.doaj])\n        : false;\n\n    \/*\n      Hierarki urutan default:\n      1. Scopus\n      2. Sinta 1\u20136\n      3. DOAJ tanpa Scopus\/Sinta\n      4. Belum memiliki indeks\/peringkat tersebut\n    *\/\n    let group = 3;\n\n    if(scopus){\n      group = 0;\n    }else if(sinta){\n      group = 1;\n    }else if(doaj){\n      group = 2;\n    }\n\n    return {\n      group:group,\n      sintaRank:sintaRank(sinta),\n      scopus:scopus,\n      doaj:doaj\n    };\n  }\n\n  function compareByRanking(a,b){\n    const rankA = journalRankData(a);\n    const rankB = journalRankData(b);\n\n    if(rankA.group !== rankB.group){\n      return rankA.group - rankB.group;\n    }\n\n    \/*\n      Di dalam kelompok Scopus, jurnal dengan peringkat Sinta lebih baik\n      ditempatkan lebih dahulu bila datanya tersedia.\n    *\/\n    if(rankA.sintaRank !== rankB.sintaRank){\n      return rankA.sintaRank - rankB.sintaRank;\n    }\n\n    \/*\n      DOAJ menjadi pembeda tambahan bila posisi Scopus\/Sinta setara.\n    *\/\n    if(rankA.doaj !== rankB.doaj){\n      return rankA.doaj ? -1 : 1;\n    }\n\n    return valueOf(recordName(a)).localeCompare(\n      valueOf(recordName(b)),\n      'id',\n      {sensitivity:'base'}\n    );\n  }\n\n  function filteredRecords(){\n    const term = normalize(searchElement.value);\n    const selectedSinta = sintaElement.value;\n    const selectedDoaj = doajElement.value;\n    const selectedScopus = scopusElement.value;\n\n    const filtered = records.filter(function(record){\n      const name = valueOf(record[keys.name]);\n      const institution =\n        keys.institution\n          ? valueOf(record[keys.institution])\n          : '';\n\n      const sinta =\n        keys.sinta\n          ? normalizeSinta(record[keys.sinta])\n          : '';\n\n      const doaj =\n        keys.doaj\n          ? indexStatus(record[keys.doaj])\n          : false;\n\n      const scopus =\n        keys.scopus\n          ? indexStatus(record[keys.scopus])\n          : false;\n\n      const matchesSearch =\n        !term ||\n        normalize(name + ' ' + institution).includes(term);\n\n      const matchesSinta =\n        !selectedSinta ||\n        sinta === selectedSinta;\n\n      const matchesDoaj =\n        !selectedDoaj ||\n        (\n          selectedDoaj === 'indexed'\n            ? doaj\n            : !doaj\n        );\n\n      const matchesScopus =\n        !selectedScopus ||\n        (\n          selectedScopus === 'indexed'\n            ? scopus\n            : !scopus\n        );\n\n      return matchesSearch &&\n        matchesSinta &&\n        matchesDoaj &&\n        matchesScopus;\n    });\n\n    filtered.sort(function(a,b){\n      if(sortElement.value === 'name-asc'){\n        return valueOf(recordName(a)).localeCompare(\n          valueOf(recordName(b)),\n          'id',\n          {sensitivity:'base'}\n        );\n      }\n\n      if(sortElement.value === 'name-desc'){\n        return valueOf(recordName(b)).localeCompare(\n          valueOf(recordName(a)),\n          'id',\n          {sensitivity:'base'}\n        );\n      }\n\n      return compareByRanking(a,b);\n    });\n\n    return filtered;\n  }\n\n  function recordName(record){\n    return record[keys.name] || '';\n  }\n\n  function render(){\n    const items = filteredRecords();\n\n    resultTextElement.textContent =\n      items.length +\n      ' dari ' +\n      records.length +\n      ' jurnal ditampilkan';\n\n    if(!items.length){\n      gridElement.innerHTML = `\n        <div class=\"aip-journal-state\">\n          <strong>Jurnal tidak ditemukan.<\/strong>\n          Ubah kata kunci atau pilihan filter.\n        <\/div>\n      `;\n      return;\n    }\n\n    gridElement.innerHTML =\n      items.map(cardMarkup).join('');\n  }\n\n  function initializeData(parsed){\n    headers = parsed.headers;\n    records = parsed.records;\n\n    configureFields();\n\n    records = records.filter(function(record){\n      return valueOf(record[keys.name]);\n    });\n\n    if(!records.length){\n      throw new Error(\n        'Spreadsheet belum berisi daftar jurnal.'\n      );\n    }\n\n    populateSintaFilter();\n    updateStats();\n    render();\n  }\n\n  function showError(error){\n    const message =\n      error && error.message\n        ? error.message\n        : 'Data jurnal belum dapat dibaca.';\n\n    gridElement.innerHTML = `\n      <div class=\"aip-journal-state\">\n        <strong>Data jurnal belum dapat dimuat.<\/strong>\n        ${escapeHtml(message)}\n        <br><br>\n        Pastikan spreadsheet dapat dilihat oleh\n        siapa saja yang memiliki link dan data berada\n        pada tab dengan GID ${escapeHtml(SHEET_GID)}.\n      <\/div>\n    `;\n\n    resultTextElement.textContent =\n      'Data jurnal belum dapat dimuat';\n\n    totalElement.textContent = '\u2013';\n    sintaCountElement.textContent = '\u2013';\n    doajCountElement.textContent = '\u2013';\n    scopusCountElement.textContent = '\u2013';\n  }\n\n  function visualizationUrl(includeCallback){\n    const parameters = new URLSearchParams();\n\n    parameters.set('gid',SHEET_GID);\n    parameters.set('headers','0');\n    parameters.set('_',String(Date.now()));\n\n    if(includeCallback){\n      parameters.set(\n        'tqx',\n        'out:json;responseHandler:aipnemaJournalReceive'\n      );\n    }else{\n      parameters.set('tqx','out:json');\n    }\n\n    return SHEET_BASE + '?' + parameters.toString();\n  }\n\n  function loadWithJsonp(){\n    return new Promise(function(resolve,reject){\n      const script = document.createElement('script');\n      let completed = false;\n\n      const timeout = window.setTimeout(function(){\n        if(completed) return;\n\n        completed = true;\n        script.remove();\n\n        reject(new Error(\n          'Waktu pemuatan spreadsheet telah habis.'\n        ));\n      },15000);\n\n      window.aipnemaJournalReceive = function(response){\n        if(completed) return;\n\n        completed = true;\n        window.clearTimeout(timeout);\n        script.remove();\n        resolve(response);\n      };\n\n      script.onerror = function(){\n        if(completed) return;\n\n        completed = true;\n        window.clearTimeout(timeout);\n        script.remove();\n\n        reject(new Error(\n          'Google Sheets tidak dapat dihubungi.'\n        ));\n      };\n\n      script.src = visualizationUrl(true);\n      document.head.appendChild(script);\n    });\n  }\n\n  async function loadSheet(){\n    try{\n      let responseObject;\n\n      try{\n        const response = await fetch(\n          visualizationUrl(false),\n          {cache:'no-store'}\n        );\n\n        if(!response.ok){\n          throw new Error(\n            'Permintaan spreadsheet gagal.'\n          );\n        }\n\n        responseObject =\n          parseVisualizationText(await response.text());\n      }catch(fetchError){\n        responseObject = await loadWithJsonp();\n      }\n\n      initializeData(parseResponse(responseObject));\n    }catch(error){\n      showError(error);\n    }\n  }\n\n  searchElement.addEventListener('input',render);\n  sintaElement.addEventListener('change',render);\n  doajElement.addEventListener('change',render);\n  scopusElement.addEventListener('change',render);\n  sortElement.addEventListener('change',render);\n\n  resetElement.addEventListener('click',function(){\n    searchElement.value = '';\n    sintaElement.value = '';\n    doajElement.value = '';\n    scopusElement.value = '';\n    sortElement.value = 'ranking';\n    render();\n  });\n\n  setHeaderOffset();\n  loadSheet();\n\n  window.addEventListener('load',setHeaderOffset);\n  window.addEventListener('resize',setHeaderOffset);\n})();\n<\/script>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Beranda \/ Jurnal Ilmiah Publikasi Ilmiah Institusi Anggota Jurnal Ilmiah AIPNEMA Direktori jurnal ilmiah yang dikelola oleh institusi anggota, dilengkapi peringkat Sinta serta informasi pengindeksan DOAJ dan Scopus. Klik cover atau nama jurnal untuk mengunjungi website jurnal dan membaca informasi publikasi secara langsung. \u2013 Jurnal terdata \u2013 Terakreditasi Sinta \u2013 Terindeks DOAJ \u2013 Terindeks Scopus&#8230;<\/p>","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"_kadence_starter_templates_imported_post":false,"_kad_post_transparent":"disable","_kad_post_title":"hide","_kad_post_layout":"fullwidth","_kad_post_sidebar_id":"","_kad_post_content_style":"unboxed","_kad_post_vertical_padding":"hide","_kad_post_feature":"hide","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"class_list":["post-1901","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/aipnemaptma.org\/en\/wp-json\/wp\/v2\/pages\/1901","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/aipnemaptma.org\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/aipnemaptma.org\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/aipnemaptma.org\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/aipnemaptma.org\/en\/wp-json\/wp\/v2\/comments?post=1901"}],"version-history":[{"count":7,"href":"https:\/\/aipnemaptma.org\/en\/wp-json\/wp\/v2\/pages\/1901\/revisions"}],"predecessor-version":[{"id":1917,"href":"https:\/\/aipnemaptma.org\/en\/wp-json\/wp\/v2\/pages\/1901\/revisions\/1917"}],"wp:attachment":[{"href":"https:\/\/aipnemaptma.org\/en\/wp-json\/wp\/v2\/media?parent=1901"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}