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 = '';
}
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 standard table display
function renderStandardTable(checkerId, res) {
var thisChecker = $('#checker-' + checkerId);
var 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 += '