jQuery(document).ready(function($){ // Global variables for filter mode var allDataCache = {}; var currentCheckerId = null; // Initialize checker on page load initializeChecker(); function initializeChecker() { $('.dw-checker-container').each(function() { var checkerId = $(this).attr('id').replace('checker-', ''); var settingsEl = $('#checker-settings-' + checkerId); if (settingsEl.length) { var settings = JSON.parse(settingsEl.text()); currentCheckerId = checkerId; // Handle URL parameters if (settings.url_params_enabled === 'yes') { handleUrlParameters(checkerId, settings); } // Handle initial display mode if (settings.initial_display !== 'hidden') { loadAllData(checkerId, settings); } } }); } // Get URL parameters function getUrlParams() { var params = {}; var queryString = window.location.search.substring(1); if (!queryString) return params; var pairs = queryString.split('&'); for (var i = 0; i < pairs.length; i++) { var pair = pairs[i].split('='); if (pair[0]) { params[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1] || ''); } } return params; } // Handle URL parameters function handleUrlParameters(checkerId, settings) { var urlParams = getUrlParams(); if (Object.keys(urlParams).length === 0) return; var thisChecker = $('#checker-' + checkerId); var filled = false; // Fill form fields from URL params thisChecker.find('.dw-checker-inputs').each(function() { var fieldName = $(this).data('kolom'); if (urlParams[fieldName]) { $(this).val(urlParams[fieldName]); filled = true; } }); // Auto-submit if enabled and fields were filled if (filled && settings.url_params_auto_search === 'yes') { setTimeout(function() { thisChecker.find('.search-button').trigger('click'); }, 500); } } // Load all data for show all mode function loadAllData(checkerId, settings) { var limit = settings.initial_display === 'limited' ? 10 : settings.max_records; $.ajax({ type: 'post', url: '/wp-admin/admin-ajax.php', data: { action: 'checker_load_all_data', checker_id: checkerId, limit: limit }, beforeSend: function() { showLoadingState(checkerId); }, success: function(res) { if (res.count > 0) { allDataCache[checkerId] = res; renderResults(checkerId, res); // Enable filter mode if configured if (settings.filter_mode === 'filter') { enableFilterMode(checkerId); } } else { showEmptyState(checkerId); } }, error: function(xhr) { showErrorState(checkerId, 'Failed to load data'); } }); } // Enable real-time filter mode function enableFilterMode(checkerId) { var thisChecker = $('#checker-' + checkerId); var allData = allDataCache[checkerId]; if (!allData) return; // Listen to input changes thisChecker.find('.dw-checker-inputs').on('input', function() { var filters = {}; var hasFilters = false; // Collect all filter values thisChecker.find('.dw-checker-inputs').each(function() { var field = $(this).data('kolom'); var value = $(this).val(); if (value) { filters[field] = value.toLowerCase(); hasFilters = true; } }); // If no filters, show all data if (!hasFilters) { renderResults(checkerId, allData); return; } // Filter data client-side var filtered = allData.rows.filter(function(row) { var match = true; for (var field in filters) { var rowValue = (row[field] || '').toLowerCase(); var filterValue = filters[field]; // Check if contains (you can make this configurable) if (rowValue.indexOf(filterValue) === -1) { match = false; break; } } return match; }); // Update display with filtered results var filteredRes = { count: filtered.length, rows: filtered, settings: allData.settings, output: allData.output }; if (filtered.length > 0) { renderResults(checkerId, filteredRes); } else { showEmptyState(checkerId, 'No results match your filters'); } }); // Hide search button in filter mode thisChecker.find('.search-button').hide(); } // Show loading state function showLoadingState(checkerId) { var thisChecker = $('#checker-' + checkerId); thisChecker.find('.dw-checker-results').html(`
Loading...

Loading data...

`); } // Show empty state function showEmptyState(checkerId, message) { message = message || 'No results found'; var thisChecker = $('#checker-' + checkerId); thisChecker.find('.dw-checker-results').html(`

` + message + `

Try adjusting your search criteria

`); } // Show error state function showErrorState(checkerId, message) { var thisChecker = $('#checker-' + checkerId); thisChecker.find('.dw-checker-results').html(`

Error: ` + message + `

`); } // Render results (unified function for all display types) function renderResults(checkerId, res) { var thisChecker = $('#checker-' + checkerId); var displayType = res.settings.display; // Show result container thisChecker.find('.dw-checker-result').show(); thisChecker.find('.dw-checker-form').hide(); // Render based on display type if (displayType === 'vertical-table') { renderVerticalTable(checkerId, res); } else if (displayType === 'standard-table') { renderStandardTable(checkerId, res); } else if (displayType === 'div') { renderDivDisplay(checkerId, res); } else if (displayType === 'cards') { renderCardDisplay(checkerId, res); } } // Render vertical table display function renderVerticalTable(checkerId, res) { var thisChecker = $('#checker-' + checkerId); var resultDiv = ''; var perPage = 1; // One record per page for vertical table var totalPages = Math.ceil(res.count / perPage); $.each(res.rows, function(index, row) { var isFirst = index === 0; resultDiv += ''; $.each(row, function(q, r) { var id = q.replace(/\s/g, '_').replace(/\./g, '_').toLowerCase(); var outputSetting = res.output.find(function(o) { return o.key === q; }); if (!outputSetting || outputSetting.hide === 'yes') return; var prefix = outputSetting.prefix || ''; var type = outputSetting.type || 'text'; var button_text = outputSetting.button_text || 'Click'; var bg_color = outputSetting.bg_color || '#333333'; var text_color = outputSetting.text_color || '#ffffff'; if (type == 'link_button') { r = ''+button_text+''; } else if (type == 'whatsapp_button') { r = ''+button_text+''; } else if (type == 'image') { r = ''+q+''; } resultDiv += ''; resultDiv += ''; resultDiv += ''; resultDiv += ''; }); resultDiv += '
'+q+''+prefix+r+'
'; }); // Add enhanced pagination if (totalPages > 1) { resultDiv += createEnhancedPagination(totalPages, 1); } thisChecker.find('.dw-checker-results').html(resultDiv); } // Render standard table display function renderStandardTable(checkerId, res) { var thisChecker = $('#checker-' + checkerId); var resultDiv = ''; // Headers if (res.rows.length > 0) { $.each(res.rows[0], function(q, r) { var outputSetting = res.output.find(function(o) { return o.key === q; }); if (!outputSetting || outputSetting.hide === 'yes') return; resultDiv += ''; }); } resultDiv += ''; // Rows $.each(res.rows, function(index, row) { resultDiv += ''; $.each(row, function(q, r) { var id = q.replace(/\s/g, '_').replace(/\./g, '_').toLowerCase(); var outputSetting = res.output.find(function(o) { return o.key === q; }); if (!outputSetting || outputSetting.hide === 'yes') return; var prefix = outputSetting.prefix || ''; var type = outputSetting.type || 'text'; var button_text = outputSetting.button_text || 'Click'; var bg_color = outputSetting.bg_color || '#333333'; var text_color = outputSetting.text_color || '#ffffff'; if (type == 'link_button') { r = ''+button_text+''; } else if (type == 'whatsapp_button') { r = ''+button_text+''; } else if (type == 'image') { r = ''+q+''; } resultDiv += ''; }); resultDiv += ''; }); resultDiv += '
'+q+'
'+prefix+r+'
'; thisChecker.find('.dw-checker-results').html(resultDiv); // Initialize DataTable setTimeout(function() { thisChecker.find('.dw-checker-result-container').DataTable({ responsive: true, scrollX: true }); }, 100); } // Render div display function renderDivDisplay(checkerId, res) { var thisChecker = $('#checker-' + checkerId); var resultDiv = ''; var perPage = 1; var totalPages = Math.ceil(res.count / perPage); $.each(res.rows, function(index, row) { var isFirst = index === 0; resultDiv += '
'; $.each(row, function(q, r) { var id = q.replace(/\s/g, '_').replace(/\./g, '_').toLowerCase(); var outputSetting = res.output.find(function(o) { return o.key === q; }); if (!outputSetting || outputSetting.hide === 'yes') return; var prefix = outputSetting.prefix || ''; var type = outputSetting.type || 'text'; var button_text = outputSetting.button_text || 'Click'; var bg_color = outputSetting.bg_color || '#333333'; var text_color = outputSetting.text_color || '#ffffff'; if (type == 'link_button') { r = ''+button_text+''; } else if (type == 'whatsapp_button') { r = ''+button_text+''; } else if (type == 'image') { r = ''+q+''; } resultDiv += '
'; resultDiv += '
'+q+'
'; resultDiv += '
'+prefix+r+'
'; resultDiv += '
'; }); resultDiv += '
'; }); // Add enhanced pagination if (totalPages > 1) { resultDiv += createEnhancedPagination(totalPages, 1); } thisChecker.find('.dw-checker-results').html(resultDiv); } // Render card display function renderCardDisplay(checkerId, res) { var thisChecker = $('#checker-' + checkerId); var resultDiv = ''; var perPage = 1; var totalPages = Math.ceil(res.count / perPage); $.each(res.rows, function(index, row) { var isFirst = index === 0; resultDiv += '
'; $.each(row, function(q, r) { var id = q.replace(/\s/g, '_').replace(/\./g, '_').toLowerCase(); var outputSetting = res.output.find(function(o) { return o.key === q; }); if (!outputSetting || outputSetting.hide === 'yes') return; var prefix = outputSetting.prefix || ''; var type = outputSetting.type || 'text'; var button_text = outputSetting.button_text || 'Click'; var bg_color = outputSetting.bg_color || '#333333'; var text_color = outputSetting.text_color || '#ffffff'; if (type == 'link_button') { r = ''+button_text+''; } else if (type == 'whatsapp_button') { r = ''+button_text+''; } else if (type == 'image') { r = ''+q+''; } resultDiv += '
'; resultDiv += ''+q+''; resultDiv += ''+prefix+r+''; resultDiv += '
'; }); resultDiv += '
'; }); // Add enhanced pagination if (totalPages > 1) { resultDiv += createEnhancedPagination(totalPages, 1); } thisChecker.find('.dw-checker-results').html(resultDiv); } // Create enhanced pagination with Previous/Next buttons function createEnhancedPagination(totalPages, currentPage) { var html = '
'; // Previous button html += ''; // Page numbers (show max 5 pages) var startPage = Math.max(1, currentPage - 2); var endPage = Math.min(totalPages, startPage + 4); if (endPage - startPage < 4) { startPage = Math.max(1, endPage - 4); } for (var i = startPage; i <= endPage; i++) { var active = i === currentPage ? ' style="background: #333; color: #fff;"' : ''; html += ''; } // Next button html += ''; html += '
'; return html; } // Handle pagination clicks (delegated event) $(document).on('click', '.pagination-btn', function() { if ($(this).prop('disabled')) return; var page = parseInt($(this).data('page')); var containers = $(this).closest('.dw-checker-results').find('.dw-checker-result-container'); // Hide all containers containers.hide(); // Show selected page (0-indexed) containers.eq(page - 1).show(); // Update pagination buttons var totalPages = containers.length; var newPagination = createEnhancedPagination(totalPages, page); $(this).closest('.dw-checker-pagination').replaceWith(newPagination); }); $('.dw-checker-inputs').on('input change blur', function(){ $(this).siblings('.dw-checker-input-validator').remove(); if($(this).val().length == 0){ $(this).parents('.dw-checker-field').append('
'+$(this).data('kolom')+' is required!
'); } }); $('.search-button').on('click', function(e){ e.preventDefault(); var $this = $(this); var $id = $this.data('checker'); var this_checker = $('#checker-'+$id); var inputs = this_checker.find('.dw-checker-inputs'); var inputs_count = inputs.length; var validator = []; var submission = []; if(inputs.length > 0){ $.each(inputs, function(m, n){ if($(n).val().length == 0){ $(n).parents('.dw-checker-field').append('
'+$(n).data('kolom')+' is required!
'); $(n).addClass('dw-checker-input-validator-border'); return false; } validator.push({ kolom: $(n).data('kolom'), value: $(n).val() }); submission.push($(n).val()); }); var validator_count = validator.length; if(validator_count == inputs_count) { $.ajax({ type: 'post', url: '/wp-admin/admin-ajax.php', data: { action: 'checker_public_validation', checker_id: $this.data('checker'), validate: validator }, beforeSend: function(){ $this.attr('data-text', $(this).text()); $this.text('Searching...').prop('disabled', true); this_checker.find('.dw-checker-result').find('.dw-checker-title').html(''); this_checker.find('.dw-checker-result').find('.dw-checker-description').html(''); this_checker.find('.dw-checker-result').find('.dw-checker-results').html(''); this_checker.find('.dw-checker-result').find('.dw-checker-bottom-results').html(''); }, success: function (res) { console.log(res); $this.text($this.attr('data-btn-text')).prop('disabled', false); var title = ''; var desc = ''; if(res.count == 0){ title = 'Not Found!'; desc = 'Recheck your request and click search again' }else{ var records = 'record'; if(res.count>1){ records = 'records'; } title = res.count+' '+records+' found'; desc = 'You got '+res.count+' '+records+' matching '+submission.join(' - ')+''; } $this.text($(this).attr('data-text')).prop('disabled', false); this_checker.find('.dw-checker-form').hide(); this_checker.find('.dw-checker-result').find('.dw-checker-title').html(title); this_checker.find('.dw-checker-result').find('.dw-checker-description').html(desc); this_checker.find('.dw-checker-result').show(); if(res.rows.length > 0){ var resultDiv = ''; var pagination = ''; if(res.rows.length > 1){ resultDiv += '
'; var list = []; for (var i = 1; i <= res.rows.length; i++) { list.push(i); } $.each(list, function(r, o){ var active = ''; if(r == 0){ active = ' active'; } resultDiv += ''; }); resultDiv += '
'; } if(res.settings.display == 'vertical-table'){ $.each(res.rows, function(index, item) { resultData = item; if(index == 0){ resultDiv += ''; }else{ resultDiv += '
'; } var header_color = res.settings.header; var value_color = res.settings.value; $.each(item, function(q,r){ var id = q.replace(' ', '_').replace('.', '_').toLowerCase(); var prefix = ''; var type = ''; var button_text = ''; var hidden = 'no'; $.each(res.output, function(o,p){ if(q == p.key){ prefix = p.prefix; type = p.type; button_text = p.button_text; if('hide' in p){ hidden = p.hide; } } }); if(hidden == 'yes'){ return; } if(type == 'link_button'){ r = ''+button_text+''; }else if(type == 'whatsapp_button'){ r = ''+button_text+''; }else if(type == 'image'){ r = ''+q+''; } resultDiv += ''; resultDiv += ''; resultDiv += ''; resultDiv += ''; }); resultDiv += ''; }); this_checker.find('.dw-checker-result').find('.dw-checker-results').html(resultDiv); }else if(res.settings.display == 'div') { $.each(res.rows, function(index, item) { resultData = item; var header_color = res.settings.header; var value_color = res.settings.value; // Create container div for this row if(index == 0){ resultDiv += '
'; }else{ resultDiv += ''; }); this_checker.find('.dw-checker-result').find('.dw-checker-results').html(resultDiv); }else if(res.settings.display == 'standard-table') { this_checker.find('.dw-checker-divider:nth-child(3)').hide(); resultDiv = ''; var header_color = res.settings.header; var value_color = res.settings.value; resultDiv += ''; $.each(res.output, function(header, value){ var hidden = 'no'; if('hide' in value){ hidden = value.hide; } if(hidden !== 'yes'){ resultDiv += ''; } }); resultDiv += ''; resultDiv += ''; $.each(res.rows, function(index, item) { resultData = item; resultDiv += ''; $.each(item, function(q,r){ var id = q.replace(' ', '_').replace('.', '_').toLowerCase(); var prefix = ''; var type = ''; var button_text = ''; var hidden = 'no'; $.each(res.output, function(o,p){ if(q == p.key){ prefix = p.prefix; type = p.type; button_text = p.button_text; if('hide' in p){ hidden = p.hide; } } }); if(hidden == 'yes'){ return; } if(type == 'link_button'){ r = ''+button_text+''; }else if(type == 'whatsapp_button'){ r = ''+button_text+''; }else if(type == 'image'){ r = ''+q+''; } resultDiv += ''; }); resultDiv += ''; }); resultDiv += ''; resultDiv += '
'+value.key+'
'+prefix+r+'
'; this_checker.next('.dw-checker-bottom-results').html(resultDiv); this_checker.next('.dw-checker-bottom-results').find('table.dw-checker-result-container').DataTable( { responsive: true, scrollX: true } ); }else if(res.settings.display == 'card'){ this_checker.find('.dw-checker-divider:nth-child(3)').hide(); $.each(res.rows, function(index, item) { resultData = item; resultDiv += ` `; resultDiv += ''; this_checker.next('.dw-checker-bottom-results').html(resultDiv); }); } } } }); } } }); $(document).on('click', '.dw-checker-result-pagination-button', function(e){ e.preventDefault(); var container = $(this).data('target-pagination'); var page = container - 1; $('.dw-checker-result-pagination-button').removeClass('active'); $(this).addClass('active'); $('.dw-checker-result-container').hide(); $('[data-pagination='+page+']').show(); }); $('.back-button').on('click', function() { var checker_id = $(this).data('checker'); $('#checker-'+checker_id).find('.dw-checker-result').hide(); $('#checker-'+checker_id).find('.dw-checker-result').find('.dw-checker-title').html(''); $('#checker-'+checker_id).find('.dw-checker-result').find('.dw-checker-description').html(''); $('#checker-'+checker_id).find('.dw-checker-result').find('.dw-checker-results').html(''); $('#checker-'+checker_id).find('.dw-checker-inputs').val(''); $('#checker-'+checker_id).find('.dw-checker-form').show(); $('#checker-'+checker_id).find('.dw-checker-divider').show(); }); }); // Image Lightbox Function function openImageLightbox(img) { var fullsizeUrl = img.getAttribute('data-fullsize'); var alt = img.getAttribute('alt'); // Create lightbox overlay var lightbox = document.createElement('div'); lightbox.id = 'dw-checker-lightbox'; lightbox.style.cssText = 'position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.9);z-index:99999;display:flex;align-items:center;justify-content:center;cursor:pointer;'; // Create image element var lightboxImg = document.createElement('img'); lightboxImg.src = fullsizeUrl; lightboxImg.alt = alt; lightboxImg.style.cssText = 'max-width:90%;max-height:90%;object-fit:contain;'; // Create close button var closeBtn = document.createElement('span'); closeBtn.innerHTML = '×'; closeBtn.style.cssText = 'position:absolute;top:20px;right:40px;color:#fff;font-size:40px;font-weight:bold;cursor:pointer;'; // Append elements lightbox.appendChild(lightboxImg); lightbox.appendChild(closeBtn); document.body.appendChild(lightbox); // Close on click lightbox.onclick = function() { document.body.removeChild(lightbox); }; // Prevent image click from closing lightboxImg.onclick = function(e) { e.stopPropagation(); }; }