jQuery(function($){
const activeRequests={};
let timer=null;
function getWrapperState($wrapper){
const $search=$wrapper.find('.emh-app-search input[type="search"]');
const $activePage=$wrapper.find('.emh-app-pagination a.is-active').first();
return {
page: parseInt($activePage.data('page'), 10)||1,
search: $search.val()||''
};}
function replaceFrame($wrapper, html){
const $html=$('<div>').html(html);
const $newFrame=$html.find('.emh-device-frame').first();
if($newFrame.length&&$wrapper.find('.emh-device-frame').length){
$wrapper.find('.emh-device-frame').first().replaceWith($newFrame);
}else{
$wrapper.html(html);
}}
function restoreSearchFocus($wrapper, searchValue){
const $newInput=$wrapper.find('.emh-app-search input[type="search"]').first();
if(!$newInput.length) return;
$newInput.val(searchValue);
try {
$newInput.trigger('focus');
const input=$newInput.get(0);
if(input&&input.setSelectionRange){
const len=String(searchValue).length;
input.setSelectionRange(len, len);
}} catch(err){}}
function fetchResults($wrapper, page, search, options){
options=options||{};
const perPage=$wrapper.data('per-page')||12;
const showSearch=$wrapper.data('show-search')||'yes';
const wrapperId=$wrapper.attr('id');
if(activeRequests[wrapperId]){
try { activeRequests[wrapperId].abort(); } catch(err){}}
activeRequests[wrapperId]=$.ajax({
url: EMHAppLauncher.ajaxUrl,
type: 'POST',
dataType: 'json',
data: {
action: 'emh_app_search',
nonce: EMHAppLauncher.nonce,
search: search,
page: page,
per_page: perPage,
wrapper_id: wrapperId,
show_search: showSearch
},
beforeSend: function(){ $wrapper.addClass('emh-is-loading'); },
success: function(resp){
if(resp&&resp.success&&resp.data&&resp.data.html){
replaceFrame($wrapper, resp.data.html);
if(options.keepFocus){
restoreSearchFocus($wrapper, search);
}}
},
complete: function(){
$wrapper.removeClass('emh-is-loading');
delete activeRequests[wrapperId];
}});
}
$(document).on('input', '.emh-app-search input[type="search"]', function(){
const $input=$(this);
const $wrapper=$input.closest('.emh-app-launcher-wrap');
const searchValue=$input.val();
clearTimeout(timer);
timer=setTimeout(function(){
fetchResults($wrapper, 1, searchValue, {keepFocus: true});
}, 180);
});
$(document).on('keydown', '.emh-app-search input[type="search"]', function(e){
if(e.key==='Enter'){
e.preventDefault();
const $input=$(this);
const $wrapper=$input.closest('.emh-app-launcher-wrap');
fetchResults($wrapper, 1, $input.val(), {keepFocus: true});
}});
$(document).on('submit', '.emh-app-search', function(e){
e.preventDefault();
const $form=$(this);
const $wrapper=$form.closest('.emh-app-launcher-wrap');
const searchValue=$form.find('input[type="search"]').val()||'';
fetchResults($wrapper, 1, searchValue, {keepFocus: true});
});
$(document).on('click', '.emh-app-pagination a', function(e){
e.preventDefault();
const $a=$(this);
const $wrapper=$a.closest('.emh-app-launcher-wrap');
const page=parseInt($a.data('page'), 10)||1;
const search=$wrapper.find('.emh-app-search input[type="search"]').val()||'';
fetchResults($wrapper, page, search, {keepFocus: false});
});
$('.emh-app-launcher-wrap').each(function(){
const $wrapper=$(this);
if(($wrapper.data('show-search')||'yes')!=='yes') return;
const state=getWrapperState($wrapper);
fetchResults($wrapper, state.page, state.search, {keepFocus: false});
});
});