document.addEventListener("DOMContentLoaded", function (){
const btnCreative=document.getElementById("btn-cv-creative");
const btnATS=document.getElementById("btn-cv-ats");
const cvCreative=document.querySelector(".cv-options");
const cvATS=document.querySelector(".cv-ats-layout");
const downloadCreative=document.getElementById("download-pdf");
const downloadATSWrapper=document.getElementById("ats-download-wrapper");
if(btnCreative&&btnATS&&cvCreative&&cvATS){
cvCreative.style.display="block";
cvATS.style.display="none";
btnCreative.classList.add("active");
btnATS.classList.remove("active");
if(downloadCreative&&downloadATSWrapper){
downloadCreative.style.display="inline-block";
downloadATSWrapper.style.display="none";
}
btnCreative.addEventListener("click", function (){
cvCreative.style.display="block";
cvATS.style.display="none";
btnCreative.classList.add("active");
btnATS.classList.remove("active");
if(downloadCreative&&downloadATSWrapper){
downloadCreative.style.display="inline-block";
downloadATSWrapper.style.display="none";
}});
btnATS.addEventListener("click", function (){
cvCreative.style.display="none";
cvATS.style.display="block";
btnATS.classList.add("active");
btnCreative.classList.remove("active");
if(downloadCreative&&downloadATSWrapper){
downloadCreative.style.display="none";
downloadATSWrapper.style.display="inline-block";
}});
}});
jQuery(document).ready(function($){
$('.btn-ats').on('click', function(){
var versi=$(this).data('versi');
$('.btn-ats').removeClass('active');
$(this).addClass('active');
$('#ats-preview').html('Memuat template...');
$('#btn-download-pdf').hide();
$('#input-versi').val(versi);
$.post(ats_data.ajax_url, {
action: 'get_ats_template',
versi: versi
}, function(response){
$('#ats-preview').html(response);
$('#btn-download-pdf').show();
});
});
$('#btn-download-pdf').on('click', function(e){
e.preventDefault();
$('#form-download-pdf').submit();
});
});
jQuery(document).ready(function($){
$('#btn-download-pdf').on('click', function(e){
e.preventDefault();
const versi=$('#input-versi').val();
const user_token=$('#user_token').val();
$('#ats-download-wrapper').html(`
<div class="ats-download-progress">
<div class="ats-download-bar"><div class="bar"></div></div>
<p>Mengunduh CV... Mohon tunggu</p>
</div>
`);
fetch(ats_data.ajax_url, {
method: 'POST',
body: new URLSearchParams({
action: 'download_ats_pdf',
versi: versi,
eksekusi_token: 1,
user_token: user_token
})
})
.then(response=> {
if(!response.ok) throw new Error('Gagal mengunduh CV');
const filename=response.headers.get('X-Filename')||'cv_ats.pdf';
return response.blob().then(blob=> ({ blob, filename }));
})
.then(({ blob, filename })=> {
const url=window.URL.createObjectURL(blob);
const a=document.createElement('a');
a.href=url;
a.download=filename;
document.body.appendChild(a);
a.click();
a.remove();
window.URL.revokeObjectURL(url);
setTimeout(()=> location.reload(), 1500);
})
.catch(error=> {
$('#ats-download-wrapper').html(`<p style="color:red;">${error.message}</p>`);
});
});
});
(async function (){
if(!('serviceWorker' in navigator)||!('PushManager' in window)){
console.log('Push not supported.');
return;
}
let publicKey='';
try {
const res=await fetch(JobnasNotif.ajax_url + '?action=jobnas_get_vapid');
const json=await res.json();
if(json.success) publicKey=json.data.publicKey;
} catch (e){
console.error('Gagal ambil VAPID', e);
return;
}
if(!publicKey){
console.log('Public key kosong.');
return;
}
const permission=await Notification.requestPermission();
if(permission!=='granted'){
console.log('User tidak memberi izin notif.');
return;
}
const reg=await navigator.serviceWorker.ready;
let sub=await reg.pushManager.getSubscription();
if(!sub){
try {
sub=await reg.pushManager.subscribe({
userVisibleOnly: true,
applicationServerKey: urlBase64ToUint8Array(publicKey)
});
} catch (e){
console.error('Gagal subscribe push', e);
return;
}}
try {
const ua=navigator.userAgent;
const payload={
subscription: sub.toJSON(),
browser: detectBrowser(ua),
platform: detectPlatform(ua)
};
await fetch(JobnasNotif.ajax_url + '?action=jobnas_subscribe', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(payload)
});
} catch (e){
console.error('Gagal kirim subscription', e);
}
function urlBase64ToUint8Array(base64String){
const padding='='.repeat((4 - (base64String.length % 4)) % 4);
const base64=(base64String + padding).replace(/-/g, '+').replace(/_/g, '/');
const rawData=atob(base64);
const outputArray=new Uint8Array(rawData.length);
for (let i=0; i < rawData.length; ++i){
outputArray[i]=rawData.charCodeAt(i);
}
return outputArray;
}
function detectBrowser(ua){
if(ua.includes('Chrome')) return 'Chrome';
if(ua.includes('Firefox')) return 'Firefox';
if(ua.includes('Safari')) return 'Safari';
if(ua.includes('Edge')) return 'Edge';
return 'Unknown';
}
function detectPlatform(ua){
if(ua.includes('Android')) return 'Android';
if(ua.includes('iPhone')||ua.includes('iPad')) return 'iOS';
if(ua.includes('Windows')) return 'Windows';
if(ua.includes('Mac')) return 'Mac';
return 'Unknown';
}})();
if('serviceWorker' in navigator){
window.addEventListener('load', function(){
navigator.serviceWorker.register(superpwa_sw.url)
.then(function(registration){ if(typeof superpwa_sw!=='undefined'&&superpwa_sw.script_debug){ console.log('SuperPWA service worker ready'); }
if(registration.active){
registration.update();
}
if(typeof firebase!='undefined'&&typeof pushnotification_load_messaging=='function'){
const messaging=firebase.messaging();
messaging.useServiceWorker(registration);
pushnotification_load_messaging();
}
subOnlineOfflineIndicator();
})
.catch(function(error){ if(typeof superpwa_sw!=='undefined'&&superpwa_sw.script_debug){ console.log('Registration failed with ' + error); }});
const snackbarTimeToHide=5000;
let isOffline=false,
snackbarTimeoutHide=null,
goOfflineMsg=superpwa_sw.offline_message_txt,
backOnlineMsg=superpwa_sw.online_message_txt;
function subOnlineOfflineIndicator(){
injectSnackbarHtml();
injectSnackbarCss();
runOnlineOfflineIndicator();
}
function injectSnackbarHtml(){
if(document.querySelector('.snackbar')) return;
const container=document.createElement('div');
container.className='snackbar';
const parag=document.createElement('p');
parag.id='snackbar-msg';
container.appendChild(parag);
const button=document.createElement('button');
button.type='button';
button.className='snackbar-close';
button.setAttribute('aria-label', 'Close ×');
button.addEventListener('click', hideSnackbar);
button.innerHTML='&times;';
container.appendChild(button);
document.body.appendChild(container);
window.addEventListener('online', runOnlineOfflineIndicator);
window.addEventListener('offline', runOnlineOfflineIndicator);
window.addEventListener('fetch',()=> { if(typeof superpwa_sw!=='undefined'&&superpwa_sw.script_debug){ console.log("fetch"); }});
container.addEventListener('mouseover', function (){
if(snackbarTimeoutHide!==null)
clearTimeout(snackbarTimeoutHide);
});
container.addEventListener('mouseout', function (){
if(snackbarTimeoutHide!==null)
snackbarTimeoutHide=setTimeout(hideSnackbar, snackbarTimeToHide / 2);
});
}
function injectSnackbarCss(){
const css=`body.snackbar--show .snackbar {
-webkit-transform: translateY(0);
transform: translateY(0);
}
.snackbar {
box-sizing: border-box;
background-color: #121213;
color: #fff;
padding: 10px 55px 10px 10px;
position: fixed;
z-index: 9999999999999999;
left: 15px;
bottom: 15px;
border-radius: 5px 8px 8px 5px;
max-width: 90%;
min-height: 48px;
line-height: 28px;
font-size: 16px;
-webkit-transform: translateY(150%);
transform: translateY(150%);
will-change: transform;
-webkit-transition: -webkit-transform 200ms ease-in-out;
-webkit-transition-delay: 0s;
transition-delay: 0s;
-webkit-transition: -webkit-transform 200ms ease-in-out false;
transition: -webkit-transform 200ms ease-in-out false;
transition: transform 200ms ease-in-out false;
transition: transform 200ms ease-in-out false, -webkit-transform 200ms ease-in-out false;
}
.snackbar p {
margin: 0;
color: #fff;
text-align: center;
}
.snackbar .snackbar-close {
position: absolute;
top: 0;
right: 0;
width: 45px;
height: 100%;
padding: 0;
background: #2a2a2a;
border: none;
font-size: 28px;
font-weight: normal;
border-radius: 0 5px 5px 0;
color: #FFF;
font-family: Arial, Helvetica, sans-serif;
}
.snackbar .snackbar-close:hover,
.snackbar .snackbar-close:focus {
background: #3f3f3f;
}
.snackbar a {
color: #FFF;
font-weight: bold;
text-decoration: underline;
}`;
const head=document.head||document.getElementsByTagName('head')[0];
const style=document.createElement('style');
style.type='text/css';
if(style.styleSheet){
style.styleSheet.cssText=css;
}else{
style.appendChild(document.createTextNode(css));
}
head.appendChild(style);
}
function runOnlineOfflineIndicator(){
if(navigator.onLine){
if(superpwa_sw.offline_message==1&&isOffline===true){
showSnackbar(backOnlineMsg);
}
isOffline=false;
}else{
if(superpwa_sw.offline_message==1){
showSnackbar(goOfflineMsg);
isOffline=true;
}}
}
function showSnackbar(msg){
document.getElementById('snackbar-msg').innerHTML=msg;
document.body.classList.add('snackbar--show');
clearTimeout(snackbarTimeoutHide);
snackbarTimeoutHide=setTimeout(hideSnackbar, snackbarTimeToHide);
}
function hideSnackbar(){
document.body.classList.remove('snackbar--show');
}
var deferredPrompt;
window.addEventListener('beforeinstallprompt', function(e){
deferredPrompt=e;
if(deferredPrompt!=null||deferredPrompt!=undefined){
if(superpwa_sw.disable_addtohome==1){
deferredPrompt.preventDefault();
}
var a2hsBanner=document.getElementsByClassName("superpwa-sticky-banner");
if(a2hsBanner.length){
deferredPrompt.preventDefault();
if(superpwa_sw.enableOnDesktop!=1&&!window.mobileCheck()){return ;}
if(typeof super_check_bar_closed_or_not=='function'&&!super_check_bar_closed_or_not()){return ;}
for (var i=0; i < a2hsBanner.length; i++){
var showbanner=a2hsBanner[i].getAttribute("data-show");
a2hsBanner[i].style.display="flex";
}}
document.cookie="hidecta=no";
}})
window.addEventListener('appinstalled', function(evt){
var a2hsBanner=document.getElementsByClassName("superpwa-sticky-banner");
if(a2hsBanner.length){
for (var i=0; i < a2hsBanner.length; i++){
var showbanner=a2hsBanner[i].getAttribute("data-show");
document.cookie="hidecta=yes";
a2hsBanner[i].style.display="none";
}}
});
var a2hsviaClass=document.getElementsByClassName("superpwa-add-via-class");
if(a2hsviaClass!==null){
for (var i=0; i < a2hsviaClass.length; i++){
a2hsviaClass[i].addEventListener("click", addToHome);
}}
function addToHome(){
if(!deferredPrompt){return ;}
deferredPrompt.prompt();
deferredPrompt.userChoice.then(function(choiceResult){
if(choiceResult.outcome==="accepted"){
var a2hsBanner=document.getElementsByClassName("superpwa-sticky-banner");
if(a2hsBanner){
for (var i=0; i < a2hsBanner.length; i++){
var showbanner=a2hsBanner[i].getAttribute("data-show");
a2hsBanner[i].style.display="none";
}}
if(typeof superpwa_sw!=='undefined'&&superpwa_sw.script_debug){ console.log("User accepted the prompt"); }}else{
if(typeof superpwa_sw!=='undefined'&&superpwa_sw.script_debug){ console.log("User dismissed the prompt"); }}
deferredPrompt=null;
});
}});
}
window.mobileCheck=function(){
let check=false;
(function(a){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm(os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s)|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp(i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac(|\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt(|\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg(g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v)|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v)|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-|)|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4))) check=true;})(navigator.userAgent||navigator.vendor||window.opera);
return check;
};
window.addEventListener('load', function(){
let manifest_name=superpwa_sw.manifest_name ?? 'superpwa-manifest.json';
var manifestLink=document.querySelectorAll("link[rel='manifest']");
if(manifestLink.length > 1){
for (var i=0; i < manifestLink.length; i++){
var href=manifestLink[i].getAttribute("href");
if(href.indexOf(manifest_name)==-1){
manifestLink[i].remove();
}}
}
var ua=window.navigator.userAgent;
var iOS=ua.match(/iPad/i)||ua.match(/iPhone/i);
var webkit=ua.match(/WebKit/i);
var iOSSafari=iOS&&webkit&&!ua.match(/CriOS/i);
if(iOSSafari&&(window.matchMedia('(display-mode: standalone)').matches)){
setTimeout(function(){
const anchor_fix=document.querySelectorAll("a[href='#']");
if(anchor_fix.length > 1){
for (var i=0; i < anchor_fix.length; i++){
anchor_fix[i].setAttribute("href","javascript:void(0);");
}}
},600);
}});
document.addEventListener('DOMContentLoaded', function (){
if(typeof pnScriptSetting!=='undefined'&&pnScriptSetting.superpwa_apk_only!==undefined&&pnScriptSetting.superpwa_apk_only==1){
const reffer=document.referrer;
if(reffer&&reffer.includes('android-app://')){
sessionStorage.setItem('superpwa_mode', 'apk');
}}
});
if(superpwa_sw.offline_form_addon_active){
navigator.serviceWorker.ready.then(function (registration){
return registration.sync.register('superpwa_form_sendFormData')
}).then(function (){
if(typeof superpwa_sw!=='undefined'&&superpwa_sw.script_debug){ console.log('sync event registered'); }}).catch(function (){
if(typeof superpwa_sw!=='undefined'&&superpwa_sw.script_debug){ console.log('sync registration failed'); }});
function superpwa_formSubmitOptions(event){
var finalData={};
var inputElements=document.querySelectorAll('input, textarea, select');
for (let elem of inputElements){
if(elem.getAttribute('type')=='radio'){
let chk_name_radio=elem.getAttribute('name');
var parent_div=elem.closest('.frm_opt_container')
if(parent_div.getAttribute('aria-required')=='true'){
let chk_value=parent_div.querySelectorAll('input[name=\"' + chk_name_radio + '\"]:checked');
if(chk_value.length==0){
event.preventDefault();
event.stopPropagation();
alert('Please fill all mandatory fields');
return;
}}
}
if(!elem.value&&((elem.getAttribute('aria-required')=='true'||elem.getAttribute('required'))&&elem.offsetParent!==null)){
event.preventDefault();
event.stopPropagation();
alert('Please fill all mandatory fields');
return;
}
var name=elem.getAttribute('name');
if(name){
if(elem.getAttribute('type')=='checkbox'){
if(elem.checked){
finalData[name]=elem.value;
}}else if(elem.getAttribute('type')=='radio'){
if(elem.checked){
finalData[name]=elem.value;
}}else{
finalData[name]=elem.value;
}}
}
if(JSON.stringify(finalData)!=='{}'){
var allData={
'form_data': finalData,
'action': 'form_submit_data'
};
navigator.serviceWorker.ready.then((registration)=> {
registration.active.postMessage(allData);
event.stopPropagation();
});
}else{
event.preventDefault();
event.stopPropagation();
alert('Error occured during form submission, please try again');
return;
}}
function handleGravityMultistep(btn_type, event){
let target_parent=event.parentNode.parentNode;
let go_next=false;
if(btn_type=='previous'){
target_parent.style.display='none';
let prev_id=target_parent.previousElementSibling.id;
let source_page=document.querySelector('input[name^=\"gform_source_page_number_\"]');
let target_page=document.querySelector('input[name^=\"gform_target_page_number_\"]');
source_page.value=parseInt(source_page.value) - 1;
target_page.value=parseInt(target_page.value) - 1;
if(prev_id){
document.getElementById(prev_id).style.display='block';
}}else{
let inputs=target_parent.querySelectorAll('input, textarea, select');
for (let elem of inputs){
let req_flag=elem.getAttribute('aria-required');
if(req_flag=='true'&&(elem.getAttribute('type')=='checkbox'||elem.getAttribute('type')=='radio')){
let chk_name=elem.getAttribute('name');
let chk_value=target_parent.querySelectorAll('input[name=\"' + chk_name + '\"]:checked');
if(!chk_value.length){
go_next=false;
break;
}else{
go_next=true;
}}else{
if(!elem.value){
go_next=false;
break;
}else{
go_next=true;
}}
}
if(go_next==true){
target_parent.style.display='none';
let next_id=target_parent.nextElementSibling.id;
let source_page=document.querySelector('input[name^=\"gform_source_page_number_\"]');
let target_page=document.querySelector('input[name^=\"gform_target_page_number_\"]');
let gform_wrapper=document.querySelector('.gform_wrapper');
let total_page=gform_wrapper.getAttribute('id').split('_')[2];
source_page.value=parseInt(source_page.value) + 1;
if(target_page < total_page){ target_page.value=parseInt(target_page.value) + 1; }else{ target_page.value=0; }
if(next_id){
document.getElementById(next_id).style.display='block';
}}else{
alert('Please fill correct values in all mandatory fields');
}}
}
window.addEventListener('online', (e)=> { updateOnlineStatus(e) });
function updateOnlineStatus(event){
setTimeout(window.location.reload(),3000);
}
window.onload=function (event){
if(typeof superpwa_sw!=='undefined'&&superpwa_sw.script_debug){ console.log('Page Load'); }
if(!navigator.onLine){
updateOfflineStatus(event);
superpwapro_woo_xtheme_compat();
}
window.addEventListener('offline', (e)=> {
updateOfflineStatus(e);
superpwapro_woo_xtheme_compat();
reRenderPage();
});
fallbackForIosSync();
var our_db;
function fallbackForIosSync(){
var isSyncSupported=('serviceWorker' in navigator&&'SyncManager' in window);
if(!isSyncSupported&&navigator.onLine){
var indexedDBOpenRequest=indexedDB.open('superpwaForm', 2);
indexedDBOpenRequest.onerror=function (error){
console.error('IndexedDB error:', error)
}
indexedDBOpenRequest.onupgradeneeded=function (){
if(!this.result.objectStoreNames.contains('post_requests')){
this.result.createObjectStore('post_requests', { autoIncrement: true, keyPath: 'id' })
}}
indexedDBOpenRequest.onsuccess=function (){
our_db=this.result;
sendPostToServerAjax();
}}
}
function reRenderPage(){
var condition=navigator.onLine ? 'online':'offline';
if(condition=='offline'){
var formElement=document.querySelector('form[method=\"post\"]');
if(formElement&&(formElement.classList.contains('frm-fluent-form')||formElement.querySelector('.frm_dropzone'))){
}}
}
function updateOfflineStatus(event){
var condition=navigator.onLine ? 'online':'offline';
if(condition=='offline'){
setTimeout(()=> {
var formElement=document.querySelectorAll('form[method=\"post\"]');
if(formElement&&formElement.length > 0){
for (var i=0; i < formElement.length; i++){
if(formElement[i].hasAttribute('data-form_instance')&&formElement[i].classList.contains('frm-fluent-form')){
var class_to_remove=formElement[i].getAttribute('data-form_instance');
formElement[i].classList.remove(class_to_remove)
}
if(formElement[i].hasAttribute('data-token')){
const antispamInput=document.createElement('input');
antispamInput.type='hidden';
antispamInput.value=formElement[i].getAttribute('data-token');
antispamInput.name='antispam_token';
formElement[i].appendChild(antispamInput);
}
if(formElement[i].querySelector('button[type=\"submit\"]')){ let ourEle=formElement[i].querySelector('button[type=\"submit\"]'); ourEle.removeAttribute('onclick'); ourEle.removeAttribute('onkeypress'); ourEle.replaceWith(ourEle.cloneNode(true)); }
if(formElement[i].querySelector('button[type=\"button\"]')){ let ourEle=formElement[i].querySelector('button[type=\"button\"]'); ourEle.removeAttribute('onclick'); ourEle.removeAttribute('onkeypress'); ourEle.replaceWith(ourEle.cloneNode(true)); }
if(formElement[i].querySelector('input[type=\"submit\"]')){ let ourEle=formElement[i].querySelector('input[type=\"submit\"]'); ourEle.removeAttribute('onclick'); ourEle.removeAttribute('onkeypress'); ourEle.replaceWith(ourEle.cloneNode(true)); }
formElement[i].addEventListener('submit', superpwa_formSubmitOptions, true);
}}
var inputs=document.getElementsByTagName('input');
if(inputs&&inputs.length){
for (var i=0; i < inputs.length; i++){
if(inputs[i].type.toLowerCase()=='file'){
if(document.querySelector('.dz-error-message')){
document.querySelector('.dz-error-message').remove();
setTimeout(
function (){
document.querySelector('.dz-error-message').innerHTML='';
},
500);
}}
}}
var frm_dropzone_attrs=document.querySelectorAll('.frm_dropzone');
if(frm_dropzone_attrs&&frm_dropzone_attrs.length > 0){
frm_dropzone_attrs.forEach(ele=> {
var container_id=ele.id;
container_id=container_id.match(/\d+/);
const upload_input_parent=ele.closest('.frm_form_field');
var upload_input=upload_input_parent.querySelector('.dz-hidden-input');
if(upload_input){
upload_input.setAttribute("data-containerid", container_id);
}});
}
var frm_dropzone_ele=document.querySelectorAll('.dz-hidden-input');
if(frm_dropzone_ele&&frm_dropzone_ele.length > 0){
frm_dropzone_ele.forEach(ele=> {
ele.addEventListener('change', (function (e){
if(e.target.files[0]||e.target){
var formElement=document.querySelector('form[method="post"]');
var field_id=e.target.getAttribute("data-containerid");
var field_id_label='file' + field_id;
var object1={};
object1['action']='frm_submit_dropzone';
object1['field_id']=field_id;
object1['form_id']=document.querySelector('[name="form_id"]').value;
object1['nonce']=frm_js.nonce;
object1['antispam_token']=formElement.getAttribute('data-token');
object1[field_id_label]=e.target.files[0];
saveAddlAjaxSubmits(frm_js.ajax_url, object1);
}}));
});
}
let gform_next_buttons=document.querySelectorAll('.gform_next_button');
let gform_previous_button=document.querySelectorAll('.gform_previous_button');
if(gform_next_buttons.length > 0){
gform_next_buttons.forEach(button=> {
button.setAttribute('onclick', 'handleGravityMultistep("next",this)');
button.setAttribute('onkeypress', 'handleGravityMultistep("next",this)');
button.setAttribute('type', 'button');
});
}
if(gform_previous_button.length > 0){
gform_previous_button.forEach(button=> {
button.setAttribute('onclick', 'handleGravityMultistep(\"previous\",this)');
button.setAttribute('onkeypress', 'handleGravityMultistep(\"previous\",this)');
button.setAttribute('type', 'button');
});
}}, 500);
}}
function sendPostToServerAjax(){
var savedRequests=[];
var objStore=getObjectStore('ajax_requests');
if(!!objStore){
var req=getObjectStore('ajax_requests').openCursor()
req.onsuccess=async function (event){
var cursor=event.target.result
if(cursor){
savedRequests.push(cursor.value)
cursor.continue()
}else{
if(savedRequests&&savedRequests.length){
for (let savedRequest of savedRequests){
var formData=new FormData();
for (const [key, value] of Object.entries(savedRequest.payload)){
formData.append(key, value);
}
var requestUrl=savedRequest.url
var payload=JSON.stringify(savedRequest.payload)
var method=savedRequest.method
var headers={
'Accept': 'application/json, text/javascript, */*; q=0.01',
}
fetch(superpwa_sw.ajax_url+'?action=superpwa_form_store_send', {
headers: headers,
method: method,
body: formData
}).then(function (response){
if(response.status < 400){
getObjectStore('ajax_requests', 'readwrite').delete(savedRequest.id);
return response.json();
}
return false;
}).then(function (response){
if(response){
sendPostToServer([response[0], savedRequest.payload.field_id]);
if(typeof superpwa_sw!=='undefined'&&superpwa_sw.script_debug){ console.log('Form Submitted with ajax fields:success'); }}else{
sendPostToServer();
if(typeof superpwa_sw!=='undefined'&&superpwa_sw.script_debug){ console.log('Form Submitted without ajax fields:ajax fields present but their saving failed to db'); }}
});
}}else{
sendPostToServer();
if(typeof superpwa_sw!=='undefined'&&superpwa_sw.script_debug){ console.log('Form Submitted without ajax fields:no values present in ajax_requests object'); }}
}}
req.onerror=function (error){
sendPostToServer();
}}else{
sendPostToServer();
}}
function sendPostToServer(ajax_params=null){
var savedRequests=[];
var objStore=getObjectStore('post_requests');
if(!!objStore){
var req=getObjectStore('post_requests').openCursor();
req.onsuccess=async function (event){
var cursor=event.target.result;
if(cursor){
savedRequests.push(cursor.value);
cursor.continue();
}else{
for (let savedRequest of savedRequests){
var formData=new FormData();
for (const [key, value] of Object.entries(savedRequest.payload)){
formData.append(key, value);
}
if(ajax_params&&ajax_params.length&&ajax_params[0]){
formData.set('item_meta[' + ajax_params[1] + ']', ajax_params[0]);
}
var requestUrl=savedRequest.url;
var method=savedRequest.method;
/* Request to admin-ajax.php */
var headers={
'Accept': 'application/json, text/javascript, */*; q=0.01',
};
try {
const response=await fetch(requestUrl, {
headers: headers,
method: method,
body: formData
});
if(typeof superpwa_sw!=='undefined'&&superpwa_sw.script_debug){ console.log('server response', response); }
if(response.status < 400){
try {
var forDataSave={};
formData.forEach(function (value, key){
forDataSave[key]=value;
});
var forDataSaveJson=JSON.stringify(forDataSave);
const response=await fetch(superpwa_sw.ajax_url+'?action=superpwa_form_store_send', {
headers: headers,
method: method,
body: forDataSaveJson,
});
if(typeof superpwa_sw!=='undefined'&&superpwa_sw.script_debug){ console.log('saved request', savedRequest); }
if(response.status < 400){
await getObjectStore('post_requests', 'readwrite').delete(savedRequest.id);
}} catch (error){
console.error('Send to Server failed:', error);
throw error;
}}else{
console.error('Server responded with an error:', response.status);
}} catch (error){
console.error('Send to Server failed:', error);
throw error;
}}
}};}}
function getObjectStore(storeName, mode){
if(!our_db){ return null; }
return our_db.transaction(storeName, mode).objectStore(storeName)
}
function saveAddlAjaxSubmits(submit_url, obj){
/*send data in serviceWorker*/
var indexedDBOpenRequest=indexedDB.open('superpwaForm', 2);
indexedDBOpenRequest.onerror=(event)=> {
console.error('a post form request has been not added to IndexedDB');
};
indexedDBOpenRequest.onupgradeneeded=(event)=> {
const db=event.target.result;
if(!db.objectStoreNames.contains('ajax_requests')){
db.createObjectStore('ajax_requests', { autoIncrement: true, keyPath: 'id' });
}}
indexedDBOpenRequest.onsuccess=(event)=> {
const db=event.target.result;
var request=db.transaction('ajax_requests', 'readwrite').objectStore('ajax_requests').add({
url: submit_url,
payload: obj,
method: 'POST'
})
request.onsuccess=function (event){
if(typeof superpwa_sw!=='undefined'&&superpwa_sw.script_debug){ console.log('a post form request has been added to indexedb'); }}
request.onerror=function (error){
console.error(error)
}}
}
function superpwapro_woo_xtheme_compat(){
if(document.querySelector('.add_to_cart_button')){
document.addEventListener("click", function (event){
if(event.target.closest(".add_to_cart_button")){
event.preventDefault();
event.stopPropagation();
const button=event.target.closest(".add_to_cart_button");
const parentele=button.parentNode;
const qty_wrapper=parentele.querySelector(".quantity-wrapper");
const qty=qty_wrapper.querySelector(".qty");
qty.value=1;
if(qty_wrapper){
qty_wrapper.classList.add('is-added');
}
const addToCartUrl=location.href+'?wc-ajax=add_to_cart';
var object_payload={};
object_payload['product_name']=button.getAttribute("data-product_name");
object_payload['success_message']=button.getAttribute("data-success_message");
object_payload['product_sku']=button.getAttribute("data-product_sku");
object_payload['product_id']=button.getAttribute("data-product_id");
object_payload['quantity']=1;
saveAddlAjaxSubmits(addToCartUrl, object_payload);
}});
}else{
if(typeof superpwa_sw!=='undefined'&&superpwa_sw.script_debug){ console.log('add_to_cart_button not found'); }}
if(document.querySelector('.quantity-wrapper .minus')){
document.addEventListener('click', function (event){
if(event.target.closest('.quantity-wrapper .minus')){
event.preventDefault();
event.stopPropagation();
const minus=event.target.closest('.quantity-wrapper .minus');
const minus_parent=minus.parentNode.parentNode.parentNode;
const button=minus_parent.querySelector('.add_to_cart_button');
const qty_wrapper=minus_parent.querySelector('.quantity-wrapper');
const qty_input=minus_parent.querySelector('.quantity-wrapper .qty');
const product_id=button.getAttribute('data-product_id');
if(qty_input.value==0){
qty_wrapper.classList.remove('is-added');
}
setTimeout(
function (){
qty_wrapper.querySelectorAll('.blockUI').forEach(el=> el.remove());
},
5000);
const addToCartUrl='/wp-admin/admin-ajax.php';
var object_payload={};
object_payload['action']='etheme_update_cart_item_quantity_by_id';
object_payload['item_id']=product_id;
object_payload['qty']=qty_input.value;
saveAddlAjaxSubmits(addToCartUrl, object_payload);
}});
}
if(document.querySelector('.quantity-wrapper .plus')){
document.addEventListener('click', function (event){
if(event.target.closest('.quantity-wrapper .plus')){
event.preventDefault();
event.stopPropagation();
const plus=event.target.closest('.quantity-wrapper .plus');
const plus_parent=plus.parentNode.parentNode.parentNode;
const button=plus_parent.querySelector('.add_to_cart_button');
const qty_wrapper=plus_parent.querySelector('.quantity-wrapper');
const qty_input=plus_parent.querySelector('.quantity-wrapper .qty');
const product_id=button.getAttribute('data-product_id');
setTimeout(
function (){
qty_wrapper.querySelectorAll('.blockUI').forEach(el=> el.remove());
},
5000);
qty_wrapper.classList.add('is-added');
const addToCartUrl='/wp-admin/admin-ajax.php';
var object_payload={};
object_payload['action']='etheme_update_cart_item_quantity_by_id';
object_payload['item_id']=product_id;
object_payload['qty']=qty_input.value;
saveAddlAjaxSubmits(addToCartUrl, object_payload);
}});
}}
}};
document.addEventListener('scroll', function onScroll(){
document.removeEventListener('scroll', onScroll);
var gtmScript=document.createElement('script');
gtmScript.async=true;
gtmScript.src='https://www.googletagmanager.com/gtm.js?id=GTM-T33LNG2Z';
document.head.appendChild(gtmScript);
window.dataLayer=window.dataLayer||[];
window.dataLayer.push({ 'gtm.start': new Date().getTime(), event: 'gtm.js' });
var html2CanvasScript=document.createElement('script');
html2CanvasScript.async=true;
html2CanvasScript.src='https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js';
html2CanvasScript.onload=function (){
console.log('html2canvas loaded');
};
document.head.appendChild(html2CanvasScript);
});
window.downloadDivAsJPG=async function (postId){
const container=document.querySelector('.thumb-home-blog[data-post-id="' + postId + '"]');
if(!container) return console.error('Container not found for post', postId);
if(typeof html2canvas==='undefined') return console.error('html2canvas not loaded');
const swiper=container.querySelector('.swiper');
let targetToClone=null;
if(swiper){
targetToClone =
container.querySelector('.swiper-slide-active .slide-inner') ||
container.querySelector('.swiper-slide .slide-inner') ||
container.querySelector('.swiper-slide-active') ||
container.querySelector('.swiper-slide');
}else{
targetToClone=container.querySelector('.slide-inner')||container;
}
if(!targetToClone) return console.error('No element to capture');
const rect=targetToClone.getBoundingClientRect();
const origWidth=Math.round(rect.width)||targetToClone.offsetWidth||800;
const origHeight=Math.round(rect.height)||targetToClone.offsetHeight||450;
const targetWidth=1080;
const scaleFactor=targetWidth / origWidth;
const targetHeight=1350;
const clone=targetToClone.cloneNode(true);
clone.querySelectorAll('iframe, video, embed, object').forEach(el=> el.remove());
const imgs=Array.from(clone.querySelectorAll('img'));
imgs.forEach(origImg=> {
try {
const newImg=new Image();
newImg.crossOrigin='anonymous';
newImg.alt=origImg.alt||'';
newImg.loading='eager';
newImg.style.maxWidth='100%';
newImg.style.display='block';
newImg.src=origImg.src;
origImg.parentNode.replaceChild(newImg, origImg);
} catch (e){}});
const h2Title=clone.querySelector('h2.post-title-blog');
if(h2Title){
h2Title.style.fontSize='78px';
h2Title.style.fontWeight='900';
h2Title.style.lineHeight='1.2';
h2Title.style.margin='auto 0';
h2Title.style.padding='48px 62px';
h2Title.style.color='#fff';
}
const judulteksQuote=clone.querySelector('p.judul-teksquot');
if(judulteksQuote){
judulteksQuote.style.fontSize='62px';
judulteksQuote.style.fontWeight='900';
judulteksQuote.style.color='#fff';
judulteksQuote.style.lineHeight='1.3';
judulteksQuote.style.padding='48px 62px 0';
judulteksQuote.style.margin='20px 0';
judulteksQuote.style.display='flex';
judulteksQuote.style.alignItems='center';
judulteksQuote.style.justifyContent='center';
}
const teksQuote=clone.querySelector('p.teksquot');
if(teksQuote){
teksQuote.style.fontSize='42px';
teksQuote.style.lineHeight='1.3';
teksQuote.style.padding='18px 62px';
teksQuote.style.color='#fff';
teksQuote.style.margin='30px 0 auto';
teksQuote.style.display='flex';
teksQuote.style.alignItems='center';
teksQuote.style.justifyContent='center';
}
const tempWrap=document.createElement('div');
tempWrap.style.position='fixed';
tempWrap.style.left='-99999px';
tempWrap.style.top='0';
tempWrap.style.zIndex='999999';
clone.style.width=targetWidth + 'px';
clone.style.height=targetHeight + 'px';
clone.style.boxSizing='border-box';
clone.style.backgroundColor='#000';
tempWrap.appendChild(clone);
document.body.appendChild(tempWrap);
const cloneImgs=Array.from(clone.querySelectorAll('img'));
await Promise.all(cloneImgs.map(img=> new Promise(resolve=> {
if(img.complete) return resolve();
img.onload=img.onerror=()=> resolve();
})));
try {
const canvas=await html2canvas(clone, {
backgroundColor: null,
useCORS: true,
scale: 1,
width: targetWidth,
height: targetHeight
});
const link=document.createElement('a');
link.download='screenshot-' + postId + '.jpg';
link.href=canvas.toDataURL('image/jpeg', 0.95);
link.click();
} catch (err){
console.error('Capture failed:', err);
} finally {
if(tempWrap&&tempWrap.parentNode) tempWrap.parentNode.removeChild(tempWrap);
}};
function showCommentPopup(event, postId){
event.preventDefault();
var popup=document.getElementById('comment-popup-' + postId);
if(popup){
popup.style.display='block';
}}
function closePopup(postId){
var popup=document.getElementById('comment-popup-' + postId);
if(popup){
popup.style.display='none';
}}
function submitComment(postId){
var name=document.getElementById('name-' + postId).value;
var comment=document.getElementById('comment-' + postId).value;
if(name&&comment){
var data={
action: 'save_comment',
post_id: postId,
name: name,
comment: comment
};
fetch(ajax_object.ajax_url, {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
body: new URLSearchParams(data)
})
.then(response=> response.json())
.then(data=> {
if(data.success){
var commentsDiv=document.getElementById('comments-' + postId);
if(commentsDiv){
commentsDiv.innerHTML +='<div class="comment pending"><strong>' + name + ':</strong> ' + comment + ' <em>(pending approval)</em></div>';
}
document.getElementById('comment-form-' + postId).reset();
}else{
alert('Failed to save comment');
}});
}}
document.addEventListener('DOMContentLoaded', function(){
window.onclick=function(event){
var popups=document.getElementsByClassName('popup');
for (var i=0; i < popups.length; i++){
if(event.target==popups[i]){
popups[i].style.display='none';
}}
};});
document.addEventListener('DOMContentLoaded', function (){
const toggleBtn=document.querySelector('.menu-toggle');
const menuContainer=document.querySelector('.mobile-menu-container');
const toggleIcon=toggleBtn.querySelector('.menu-site');
toggleBtn.addEventListener('click', function (){
const isActive=menuContainer.classList.contains('active');
if(!isActive){
menuContainer.style.display='block';
void menuContainer.offsetWidth;
menuContainer.classList.add('active');
toggleIcon.src="https://jobnas.com/wp-content/uploads/2025/08/close.png";
toggleIcon.alt="Close Menu";
toggleBtn.setAttribute("aria-expanded", "true");
}else{
menuContainer.classList.remove('active');
menuContainer.addEventListener('transitionend', function hideMenu(){
menuContainer.style.display='none';
menuContainer.removeEventListener('transitionend', hideMenu);
});
toggleIcon.src="https://jobnas.com/wp-content/uploads/2025/08/menu-1.png";
toggleIcon.alt="Menu";
toggleBtn.setAttribute("aria-expanded", "false");
}});
document.querySelectorAll('.menu-link .caret').forEach(caret=> {
caret.addEventListener('click', function (e){
e.preventDefault();
e.stopPropagation();
const menuItem=caret.closest('.menu-item-has-children');
const siblings=Array.from(menuItem.parentElement.children).filter(el=> el!==menuItem&&el.classList.contains('menu-item-has-children')
);
siblings.forEach(sib=> sib.classList.remove('menu-open'));
menuItem.classList.toggle('menu-open');
});
});
const buttons=document.querySelectorAll(".icon-btn");
const sections=document.querySelectorAll(".konten-toggle");
buttons.forEach(button=> {
button.addEventListener("click", ()=> {
sections.forEach(section=> section.classList.remove("active"));
if(button.classList.contains("history")){
document.querySelector(".konten-riwayat").classList.add("active");
}else if(button.classList.contains("saved")){
document.querySelector(".konten-tersimpan").classList.add("active");
}else if(button.classList.contains("menu")){
document.querySelector(".konten-menu").classList.add("active");
}else if(button.classList.contains("filter")){
document.querySelector(".konten-filter").classList.add("active");
}else if(button.classList.contains("quote")){
document.querySelector(".konten-quote").classList.add("active");
}else if(button.classList.contains("quiz")){
document.querySelector(".konten-quiz").classList.add("active");
}});
});
});
document.addEventListener('DOMContentLoaded', function (){
document.body.addEventListener('click', function (event){
const icon=event.target;
if(icon.classList.contains('like-icon')){
handleLike(icon);
}});
});
function handleLike(icon){
const postId=icon.getAttribute('data-post-id');
const likeCount=icon.parentNode.querySelector('.like-count');
if(icon.classList.contains('liked')){
showPopup(icon);
return;
}
fetch(ajax_object.ajax_url, {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
body: 'action=add_like&post_id=' + encodeURIComponent(postId)
})
.then(response=> response.text())
.then(data=> {
likeCount.textContent=data;
icon.classList.add('liked');
icon.src='https://jobnas.com/wp-content/uploads/2025/08/liked.png';
showPopup(icon);
saveLikedPostToCookie(postId);
})
.catch(error=> {
console.error('Error:', error);
});
}
function showPopup(icon){
const postId=icon.getAttribute('data-post-id');
const popup=document.querySelector('.popliked[data-post-popup="' + postId + '"], .popliked-single');
if(popup){
popup.style.display='block';
setTimeout(function (){
popup.style.display='none';
}, 2000);
}}
function saveLikedPostToCookie(postId){
const cookieName='liked_posts';
let likedPosts=[];
const cookie=document.cookie.split('; ').find(row=> row.startsWith(cookieName + '='));
if(cookie){
try {
likedPosts=JSON.parse(cookie.split('=')[1]);
} catch (e){
console.warn('Gagal parse liked_posts:', e);
}}
if(!likedPosts.includes(postId)){
likedPosts.push(postId);
document.cookie=`${cookieName}=${JSON.stringify(likedPosts)};path=/;max-age=${86400 * 30}`;
}}
document.addEventListener('DOMContentLoaded', function (){
const tombolAtas=document.querySelectorAll('.tombol-cari-dihead');
const tombolBawah=document.querySelectorAll('.tombol-bawah .mobile-bawah');
const daftarDiv=document.querySelector('.daftar-like');
const contentLike=document.querySelector('.content-like');
const contentHistory=document.querySelector('.content-history');
const contentSearch=document.querySelector('.content-search');
if(tombolBawah.length > 0&&daftarDiv){
const tombolLiker=tombolBawah[0];
const tombolRiwayat=tombolBawah[1];
const tombolCari=tombolBawah[2];
const tombolCariAtas=tombolAtas[0];
function resetAktif(){
tombolAtas.forEach(btn=> btn.classList.remove('aktif'));
tombolBawah.forEach(btn=> btn.classList.remove('aktif'));
tombolLiker.innerHTML='<img class="menu-site" src="https://jobnas.com/wp-content/uploads/2025/08/bookmark-2.png" alt="Tersimpan" loading="lazy">';
tombolRiwayat.innerHTML='<img class="menu-site" src="https://jobnas.com/wp-content/uploads/2025/08/graph-2.png" alt="Riwayat" loading="lazy">';
tombolCari.innerHTML='<img class="menu-site" src="https://jobnas.com/wp-content/uploads/2025/08/cari.png" alt="Cari Loker" loading="lazy">';
tombolCariAtas.innerHTML='<img class="menu-site" src="https://jobnas.com/wp-content/uploads/2025/08/cari.png" alt="Cari Loker" loading="lazy">';
}
function hideAllContent(){
contentLike.style.display='none';
contentHistory.style.display='none';
contentSearch.style.display='none';
}
tombolLiker.addEventListener('click', function (){
if(tombolLiker.classList.contains('aktif')){
daftarDiv.style.display='none';
hideAllContent();
resetAktif();
}else{
resetAktif();
hideAllContent();
tombolLiker.classList.add('aktif');
tombolLiker.innerHTML='<img class="menu-site" src="https://jobnas.com/wp-content/uploads/2025/08/close.png" alt="tutup" loading="lazy">';
daftarDiv.style.display='block';
contentLike.style.display='block';
showLikedPosts('.content-like');
}});
tombolRiwayat.addEventListener('click', function (){
if(tombolRiwayat.classList.contains('aktif')){
daftarDiv.style.display='none';
hideAllContent();
resetAktif();
}else{
resetAktif();
hideAllContent();
tombolRiwayat.classList.add('aktif');
tombolRiwayat.innerHTML='<img class="menu-site" src="https://jobnas.com/wp-content/uploads/2025/08/close.png" alt="tutup" loading="lazy">';
daftarDiv.style.display='block';
contentHistory.style.display='block';
showVisitHistory('.content-history');
}});
tombolCariAtas.addEventListener('click', function (){
if(tombolCariAtas.classList.contains('aktif')){
daftarDiv.style.display='none';
hideAllContent();
resetAktif();
}else{
resetAktif();
hideAllContent();
tombolCariAtas.classList.add('aktif');
tombolCariAtas.innerHTML='<img class="menu-site" src="https://jobnas.com/wp-content/uploads/2025/08/close.png" alt="tutup" loading="lazy">';
daftarDiv.style.display='block';
contentSearch.style.display='block';
}});
tombolCari.addEventListener('click', function (){
if(tombolCari.classList.contains('aktif')){
daftarDiv.style.display='none';
hideAllContent();
resetAktif();
}else{
resetAktif();
hideAllContent();
tombolCari.classList.add('aktif');
tombolCari.innerHTML='<img class="menu-site" src="https://jobnas.com/wp-content/uploads/2025/08/close.png" alt="tutup" loading="lazy">';
daftarDiv.style.display='block';
contentSearch.style.display='block';
}});
}});
function getCookieArray(cookieName){
const cookie=document.cookie
.split('; ')
.find(row=> row.startsWith(cookieName + '='));
if(!cookie) return [];
try {
const value=decodeURIComponent(cookie.split('=').slice(1).join('='));
const parsed=JSON.parse(value);
if(!Array.isArray(parsed)) return [];
return parsed.map(id=> String(id)).filter(Boolean);
} catch (e){
console.warn('Cookie rusak:', cookieName, e);
return [];
}}
function setCookieArray(cookieName, arr, maxAge=86400 * 30){
const clean=Array.from(new Set(arr.map(id=> String(id)).filter(Boolean)));
if(!clean.length){
document.cookie=`${cookieName}=;path=/;max-age=0`;
return;
}
document.cookie=`${cookieName}=${encodeURIComponent(JSON.stringify(clean))};path=/;max-age=${maxAge}`;
}
function removeIdFromCookieArray(cookieName, postId){
const id=String(postId);
const current=getCookieArray(cookieName);
const updated=current.filter(item=> String(item)!==id);
setCookieArray(cookieName, updated);
return updated;
}
const STORAGE_CONFIG={
liked: {
cookieName: 'liked_posts',
action: 'get_liked_posts',
emptyText: 'Belum ada postingan yang dilike.',
errorText: 'Gagal memuat daftar like.',
title: 'Loker Tersimpan',
selector: '.daftar-like-menu'
},
visited: {
cookieName: 'terakhir_dilihat',
action: 'get_visited_posts',
emptyText: 'Belum ada riwayat kunjungan.',
errorText: 'Gagal memuat riwayat kunjungan.',
title: 'Terakhir Dilihat',
selector: '.daftar-riwayat-menu'
}};
function renderEmptyState(container, text){
if(!container) return;
container.innerHTML=`<div class="tidak-ada"><p>${text}</p></div>`;
container.style.display='block';
}
function renderStoragePosts(type, targetSelector=null){
const config=STORAGE_CONFIG[type];
if(!config) return;
const selector=targetSelector||config.selector;
const container=document.querySelector(selector);
if(!container) return;
const ids=getCookieArray(config.cookieName);
if(!ids.length){
renderEmptyState(container, config.emptyText);
return;
}
fetch(ajax_object.ajax_url, {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
},
body: new URLSearchParams({
action: config.action,
ids: JSON.stringify(ids)
})
})
.then(response=> response.text())
.then(html=> {
container.innerHTML=`<div class="judul-dimenu">${config.title}</div>${html}`;
container.style.display='block';
const items=container.querySelectorAll('.post-thumbnail-list');
if(!items.length){
renderEmptyState(container, config.emptyText);
}})
.catch(error=> {
console.error(`Gagal memuat ${type}:`, error);
renderEmptyState(container, config.errorText);
});
}
function showLikedPosts(targetSelector='.daftar-like-menu'){
renderStoragePosts('liked', targetSelector);
}
function showVisitHistory(targetSelector='.daftar-riwayat-menu'){
renderStoragePosts('visited', targetSelector);
}
function saveLikedPostToCookie(postId){
const current=getCookieArray('liked_posts');
const id=String(postId);
if(!current.includes(id)){
current.push(id);
setCookieArray('liked_posts', current);
}}
function removeStoragePost(postId, storageType){
const type=storageType==='visited' ? 'visited':'liked';
const config=STORAGE_CONFIG[type];
removeIdFromCookieArray(config.cookieName, postId);
if(type==='liked'){
document.cookie=`liked_${postId}=;path=/;max-age=0`;
}}
function refreshContainerAfterRemove(storageType, container){
const type=storageType==='visited' ? 'visited':'liked';
const config=STORAGE_CONFIG[type];
if(!container) return;
const remaining=container.querySelectorAll('.post-thumbnail-list');
if(!remaining.length){
renderEmptyState(container, config.emptyText);
}}
document.addEventListener('DOMContentLoaded', function (){
document.body.addEventListener('click', function (e){
const removeBtn=e.target.closest('.remove-storage-post, .remove-liked-post, .remove-visited-post');
if(!removeBtn) return;
e.preventDefault();
const postId=removeBtn.getAttribute('data-post-id');
let storageType=removeBtn.getAttribute('data-storage-type');
if(!storageType){
if(removeBtn.classList.contains('remove-visited-post')){
storageType='visited';
}else{
storageType='liked';
}}
removeStoragePost(postId, storageType);
const item=removeBtn.closest('.post-thumbnail-list');
const parentBox=removeBtn.closest('.daftar-like-menu, .daftar-riwayat-menu, .content-like, .content-history, .daftar-like, .daftar-riwayat-menu');
if(item){
item.remove();
}
refreshContainerAfterRemove(storageType, parentBox);
});
});
document.addEventListener('DOMContentLoaded', function (){
showLikedPosts('.daftar-like-menu');
showVisitHistory('.daftar-riwayat-menu');
});
document.addEventListener('DOMContentLoaded', function (){
const header=document.querySelector('.header-site');
const menuIcon=document.getElementById('menu-icon');
const headerMenu=document.querySelector('.header-menu-class');
if(header){
window.addEventListener('scroll', function (){
if(window.scrollY > 2){
header.classList.add('scrolled');
}else{
header.classList.remove('scrolled');
}});
}
if(menuIcon&&headerMenu){
menuIcon.addEventListener('click', function (){
headerMenu.classList.toggle('show');
});
}});
document.addEventListener("DOMContentLoaded", function (){
document.body.classList.add("loaded");
});
(function (){
const url=new URL(window.location.href);
if(url.searchParams.get('utm_source')) return;
const ref=document.referrer;
if(!ref) return;
const refURL=new URL(ref);
const host=refURL.hostname;
if(host===window.location.hostname) return;
let source='direct';
let medium='none';
let campaign='auto_campaign';
if(host.includes('facebook.com')){
source='facebook';
medium='social';
}else if(host.includes('instagram.com')){
source='instagram';
medium='social';
}else if(host.includes('t.co')||host.includes('twitter.com')){
source='twitter';
medium='social';
}else if(host.includes('t.me')||host.includes('telegram.org')){
source='telegram';
medium='social';
}else if(host.includes('google.com')){
source='google';
medium='organic';
}else{
source=host.replace('www.', '');
medium='referral';
}
url.searchParams.set('utm_source', source);
url.searchParams.set('utm_medium', medium);
url.searchParams.set('utm_campaign', campaign);
url.searchParams.set('utm_source_platform', source);
url.searchParams.set('utm_content', 'auto');
url.searchParams.set('utm_term', 'none');
url.searchParams.set('lang', navigator.language||'id');
url.searchParams.set('region', Intl.DateTimeFormat().resolvedOptions().timeZone||'Asia/Jakarta');
window.history.replaceState({}, '', url);
})();
function updateShareCount(postId){
fetch(jobnas_ajax.ajax_url, {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
body: 'action=update_share_count&post_id=' + encodeURIComponent(postId)
})
.then(response=> response.json())
.then(data=> {
if(data.success){
const shareCountSpan=document.querySelector(`#share-icon-${postId} .share-count`);
if(shareCountSpan){
shareCountSpan.textContent=data.data.share_count;
}}
});
}
document.addEventListener('DOMContentLoaded', function (){
const postId=document.body.dataset.postId;
fetch(jobnas_ajax.ajax_url + '?action=get_share_count&post_id=' + encodeURIComponent(postId))
.then(res=> res.json())
.then(data=> {
if(data.success){
const el=document.querySelector(`#share-icon-${postId} .share-count`);
if(el){
el.textContent=data.data.share_count;
}}
});
});
function copyShareUrl(postId, url){
navigator.clipboard.writeText(url)
.then(()=> {
updateShareCount(postId);
alert("Link disalin!");
})
.catch(()=> {
alert("Gagal menyalin link.");
});
}
document.addEventListener('DOMContentLoaded', function (){
document.querySelectorAll('.share-buttons').forEach(trigger=> {
trigger.addEventListener('click', function (e){
const parent=trigger.closest('.share-buttons');
const tooltip=parent.querySelector('.tombol-share');
if(tooltip.classList.contains('active-tooltip')){
tooltip.classList.remove('active-tooltip');
}else{
document.querySelectorAll('.tombol-share.active-tooltip').forEach(t=> t.classList.remove('active-tooltip'));
tooltip.classList.add('active-tooltip');
}});
});
document.addEventListener('click', function (e){
if(!e.target.closest('.share-buttons')){
document.querySelectorAll('.tombol-share.active-tooltip').forEach(t=> t.classList.remove('active-tooltip'));
}});
});
document.addEventListener("DOMContentLoaded", function(){
const containers=document.querySelectorAll(".jobnas-postlist-container");
const observer=new IntersectionObserver(entries=> {
entries.forEach(entry=> {
if(entry.isIntersecting){
const container=entry.target;
const settings=container.dataset.settings;
fetch(jobnasPostlist.ajaxurl, {
method: "POST",
headers: {"Content-Type": "application/x-www-form-urlencoded"},
body: "action=jobnas_load_postlist&settings=" + encodeURIComponent(settings)
})
.then(res=> res.text())
.then(html=> container.innerHTML=html);
observer.unobserve(container);
}});
}, {threshold: 0.2});
containers.forEach(c=> observer.observe(c));
});
function submitComment(postId){
const form=document.getElementById('comment-form-' + postId);
const nameField=document.getElementById('name-' + postId);
const commentField=document.getElementById('comment-' + postId);
const emailField=document.getElementById('email-' + postId);
const messageBox=document.getElementById('comment-message-' + postId);
if(!form||!nameField||!commentField){
alert('Form komentar tidak ditemukan.');
return false;
}
const name=nameField.value.trim();
const comment=commentField.value.trim();
const email=emailField ? emailField.value.trim():'';
if(!name){
alert('Nama wajib diisi.');
nameField.focus();
return false;
}
if(!comment){
alert('Komentar wajib diisi.');
commentField.focus();
return false;
}
const submitButton=form.querySelector('button[type="submit"]');
if(submitButton){
submitButton.disabled=true;
submitButton.dataset.originalText=submitButton.textContent;
submitButton.textContent='Mengirim...';
}
if(messageBox){
messageBox.innerHTML='';
}
const data=new URLSearchParams();
data.append('action', 'jobnas_save_custom_comment');
data.append('security', jobnasComments.nonce);
data.append('post_id', postId);
data.append('name', name);
data.append('email', email);
data.append('comment', comment);
fetch(jobnasComments.ajax_url, {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
},
body: data.toString()
})
.then(response=> response.json())
.then(result=> {
if(result.success){
if(messageBox){
messageBox.innerHTML='<div class="comment-success">' + result.data.message + '</div>';
}else{
alert(result.data.message);
}
commentField.value='';
}else{
const errorMessage=(result.data&&result.data.message)
? result.data.message
: 'Gagal mengirim komentar.';
if(messageBox){
messageBox.innerHTML='<div class="comment-error">' + errorMessage + '</div>';
}else{
alert(errorMessage);
}}
})
.catch(()=> {
if(messageBox){
messageBox.innerHTML='<div class="comment-error">Terjadi kesalahan saat mengirim komentar.</div>';
}else{
alert('Terjadi kesalahan saat mengirim komentar.');
}})
.finally(()=> {
if(submitButton){
submitButton.disabled=false;
submitButton.textContent=submitButton.dataset.originalText||'Submit';
}});
return false;
};