(function ($){
'use strict';
var GLOBAL=window.PRCHAT_APP||(window.PRCHAT_APP={
pollId: null,
initedOnce: false
});
var LS={
USERNAME: 'prchat_username',
PRIVACY:  'prchat_privacy',
YOB:      'prchat_yob'
};
function lsGet(key, def){ try { var v=localStorage.getItem(key); return (v==null)?def:v; } catch(e){ return def; }}
function lsSet(key, val){ try { localStorage.setItem(key, val); } catch(e){}}
function lsDel(key){ try { localStorage.removeItem(key); } catch(e){}}
function nowYear(){ return (new Date()).getFullYear(); }
function renderMessage(m){
var time=new Date(m.t*1000).toLocaleTimeString();
return '<div class="prchat-rowmsg" data-id="'+m.id+'">' +
'<span class="prchat-time">['+time+']</span> ' +
'<span class="prchat-user">'+m.u+':</span> ' +
'<span class="prchat-text">'+m.m+'</span>' +
'</div>';
}
function getState($wrap){
var st=$wrap.data('prchatState');
if(!st){
st={
lastId: 0,
busy: false,
unlocked: !PRCHAT.agegate,
yob: null,
initialized: false
};
$wrap.data('prchatState', st);
}
return st;
}
function scope($wrap, sel){
return $wrap.find(sel);
}
function buildEmojiPicker($wrap){
var $pop=scope($wrap, '#prchat-emoji-pop');
if(!$pop.length) return;
var list=(window.PRCHAT&&PRCHAT.emojis)||[];
var html='<div class="prchat-emoji-grid">';
for (var i=0;i<list.length;i++){
var e=list[i];
html +='<button type="button" class="prchat-emoji-item" data-emoji="'+e+'">'+e+'</button>';
}
html +='</div>';
$pop.html(html);
}
function buildYOB($wrap){
if(!PRCHAT.agegate) return;
var $sel=scope($wrap, '#prchat-yob');
if(!$sel.length) return;
if($sel.children('option').length===0){
$sel.append('<option value="">'+PRCHAT.strings.yob+'</option>');
var yMax=PRCHAT.yMax||nowYear();
var yMin=PRCHAT.yMin||1900;
for (var y=yMax; y>=yMin; y--) $sel.append('<option value="'+y+'">'+y+'</option>');
}}
function prefillFromLocal($wrap){
var st=getState($wrap);
var u=lsGet(LS.USERNAME, '');
if(u) scope($wrap, '#prchat-username').val(u);
var pv=lsGet(LS.PRIVACY, '');
if(pv==='1') scope($wrap, '#prchat-privacy').prop('checked', true);
var yob=lsGet(LS.YOB, '');
if(yob){
scope($wrap, '#prchat-yob').val(yob);
st.yob=yob;
if(PRCHAT.agegate){
var age=nowYear() - parseInt(yob, 10);
if(PRCHAT.minAge&&age >=PRCHAT.minAge){
st.unlocked=true;
$wrap.removeClass('prchat-locked');
scope($wrap, '#prchat-agegate').remove();
}}
}}
function insertAtCursor($input, text){
var el=$input.get(0);
if(!el) return;
el.focus();
if(typeof el.selectionStart==='number'){
var start=el.selectionStart, end=el.selectionEnd;
var val=el.value;
el.value=val.slice(0,start) + text + val.slice(end);
el.selectionStart=el.selectionEnd=start + text.length;
}else{
el.value +=text;
}
$input.trigger('input');
}
function lockUsername($wrap){
var $u=scope($wrap, '#prchat-username');
if($u.length&&!$u.prop('disabled')){
$u.prop('disabled', true).attr('title', 'Username locked for this session');
}}
function loadMessages($wrap){
var st=getState($wrap);
if(PRCHAT.agegate&&!st.unlocked) return;
if(st.busy) return;
var $body=scope($wrap, '#prchat-body');
if(!$body.length) return;
st.busy=true;
$.post(PRCHAT.ajax, {
action: 'prchat_get',
nonce: PRCHAT.nonce,
since: st.lastId
}, function(resp){
if(resp&&resp.success&&resp.data&&resp.data.messages){
resp.data.messages.forEach(function(m){
$body.append(renderMessage(m));
st.lastId=Math.max(st.lastId, m.id);
});
if(resp.data.messages&&resp.data.messages.length){
$body.scrollTop($body[0].scrollHeight);
}}
}).always(function(){ st.busy=false; });
}
function sendMessage($wrap, u, m, pv, hp){
var st=getState($wrap);
return $.post(PRCHAT.ajax, {
action: 'prchat_post',
nonce: PRCHAT.nonce,
u: u,
m: m,
pv: pv ? '1':'0',
hp: hp||'',
yob: st.yob||''
});
}
function initInstance($wrap){
var st=getState($wrap);
if(st.initialized) return;
buildEmojiPicker($wrap);
buildYOB($wrap);
prefillFromLocal($wrap);
if(st.unlocked) loadMessages($wrap);
st.initialized=true;
$wrap.attr('data-prchat-initialized', 'true');
}
function initAll(){
$('.prchat-wrap').each(function(){
initInstance($(this));
});
}
function bindDelegatedEvents(){
if(GLOBAL.initedOnce) return;
GLOBAL.initedOnce=true;
$(document).on('click', '#prchat-unlock', function(){
var $wrap=$(this).closest('.prchat-wrap');
var st=getState($wrap);
var $yob=scope($wrap, '#prchat-yob');
var yob=$yob.val();
if(!yob){ alert(PRCHAT.strings.yob); return; }
st.yob=yob;
lsSet(LS.YOB, yob);
var age=nowYear() - parseInt(yob, 10);
if(PRCHAT.minAge&&age < PRCHAT.minAge){ alert(PRCHAT.strings.age); return; }
st.unlocked=true;
$wrap.removeClass('prchat-locked');
scope($wrap, '#prchat-agegate').remove();
loadMessages($wrap);
});
$(document).on('click', '#prchat-emoji-btn', function(e){
e.preventDefault();
var $wrap=$(this).closest('.prchat-wrap');
var $pop=scope($wrap, '#prchat-emoji-pop');
var isOpen = !$pop.attr('hidden');
if(isOpen){ $pop.attr('hidden', true); $(this).attr('aria-expanded','false'); }else{ $pop.attr('hidden', false); $(this).attr('aria-expanded','true'); }});
$(document).on('click', function(e){
var $t=$(e.target);
if(!$t.closest('#prchat-emoji-pop').length&&!$t.closest('#prchat-emoji-btn').length){
$('.prchat-emoji-pop').attr('hidden', true);
$('#prchat-emoji-btn').attr('aria-expanded','false');
}});
$(document).on('click', '.prchat-emoji-item', function(){
var $wrap=$(this).closest('.prchat-wrap');
var $input=scope($wrap, '#prchat-message');
insertAtCursor($input, $(this).data('emoji'));
});
$(document).on('input', '#prchat-username', function(){
lsSet(LS.USERNAME, $.trim($(this).val()));
});
$(document).on('change', '#prchat-privacy', function(){
lsSet(LS.PRIVACY, $(this).is(':checked') ? '1':'0');
});
$(document).on('change', '#prchat-yob', function(){
lsSet(LS.YOB, $(this).val()||'');
});
$(document).on('submit', '#prchat-form', function(e){
e.preventDefault();
var $wrap=$(this).closest('.prchat-wrap');
var st=getState($wrap);
if(PRCHAT.agegate&&!st.unlocked){ alert(PRCHAT.strings.unlock); return; }
var $u=scope($wrap, '#prchat-username');
var $m=scope($wrap, '#prchat-message');
var $pv=scope($wrap, '#prchat-privacy');
var $hp=scope($wrap, '#prchat_hp');
var u=$.trim($u.val());
var m=$.trim($m.val());
var pv=$pv.is(':checked');
var hp=$hp.val();
if(!u||!m||!pv){ alert(PRCHAT.strings.required); return; }
lsSet(LS.USERNAME, u);
lsSet(LS.PRIVACY, pv ? '1':'0');
var $btn=$(this).find('.prchat-btn').prop('disabled', true);
sendMessage($wrap, u, m, pv, hp).done(function(resp){
if(resp&&resp.success&&resp.data&&resp.data.message){
var $body=scope($wrap, '#prchat-body');
var msg=resp.data.message;
$body.append(renderMessage(msg));
st.lastId=Math.max(st.lastId, msg.id);
$m.val('');
$body.scrollTop($body[0].scrollHeight);
lockUsername($wrap);
}else if(resp&&resp.data&&resp.data.error==='rate'){
alert(PRCHAT.strings.rate);
}else if(resp&&resp.data&&resp.data.error==='age'){
alert(PRCHAT.strings.age);
}}).fail(function(xhr){
if(xhr&&xhr.responseJSON){
var err=xhr.responseJSON.data&&xhr.responseJSON.data.error;
if(err==='banned') alert(PRCHAT.strings.banned);
else if(err==='rate') alert(PRCHAT.strings.rate);
else if(err==='age') alert(PRCHAT.strings.age);
}}).always(function(){ $btn.prop('disabled', false); });
});
}
function ensurePolling(){
if(GLOBAL.pollId) return;
GLOBAL.pollId=setInterval(function(){
$('.prchat-wrap').each(function(){
var $wrap=$(this);
var st=getState($wrap);
if(!st.initialized) return;
loadMessages($wrap);
});
}, 4000);
}
function boot(){
bindDelegatedEvents();
initAll();
ensurePolling();
}
$(function(){ boot(); });
$(window).on('qtAjaxpageLoadEnd', function(){
boot();
});
try {
var obs=new MutationObserver(function(){
boot();
});
obs.observe(document.body, { childList: true, subtree: true });
} catch(e){  }})(jQuery);