"use strict";
document.addEventListener('DOMContentLoaded', function(){
/*document.addEventListener('wpcf7invalid', function(event){
var form_id=event.detail.id;
var form=document.getElementById(form_id);
var send_btn=form.querySelectorAll('.vmwpmdp-send-rec-btn')[0];
if(send_btn){
var cform=form.querySelectorAll('.vmwpmdp-wpvoicemessage-form-box')[0];
if(cform){
var cform_id=cform.getAttribute('cform-id');
var cform_name=cform.getAttribute('cform-name');
form.setAttribute("cform-id", cform_id);
form.setAttribute("cform-name", cform_name);
sendButtonClick(form);
}}
}, false);*/
URL=window.URL||window.webkitURL;
let gumStream;
let rec;
let input;
let AudioContext=window.AudioContext||window.webkitAudioContext;
let audioContext;
let audioBlob;
let drawVisual;
let draw;
let timerInterval;
let countdownInterval;
let isTimerPaused=false;
let isCountdownPaused=false;
let form;
let sampleRate;
var record_object={};
record_object.record_id=[];
record_object.type='qccf7wpvoicemessage';
let fbutton=document.getElementById('vmwpmdp-wpvoicemessage-fbutton');
if(null!==fbutton){
fbutton.addEventListener('click', openPopup);
}
let overlay=document.querySelector('.vmwpmdp-wpvoicemessage-fbutton-overlay');
if(null!==overlay){
overlay.addEventListener('click', closePopup, false);
overlay.querySelectorAll('.vmwpmdp-wpvoicemessage-fbutton-modal .vmwpmdp-wpvoicemessage-close')[0].addEventListener('click', closePopup, false);
}
let popup=document.querySelector('.vmwpmdp-wpvoicemessage-fbutton-modal');
if(null!==popup){
popup.addEventListener('click',(event)=> { event.stopPropagation(); }, false);
}
let startRecordButtons=document.querySelectorAll('.vmwpmdp-wpvoicemessage-form-box .vmwpmdp-wpvoicemessage-start-btn');
for(const recordBtn of startRecordButtons){
const cForm=recordBtn.parentNode.parentNode.parentNode;
recordBtn.addEventListener('click', ()=> { startRecordingButtonClick(cForm); });
const resetBtn=cForm.querySelector('.vmwpmdp-speak-now-btns .vmwpmdp-reset-rec-btn');
resetBtn.addEventListener('click', ()=> { resetButtonClick(cForm) });
const stopBtn=cForm.querySelector('.vmwpmdp-speak-now-btns .vmwpmdp-stop-rec-btn');
stopBtn.addEventListener('click', ()=> { stopButtonClick(cForm); });
const resetSendBtn=cForm.querySelector('.vmwpmdp-send-btns .vmwpmdp-reset-rec-btn');
resetSendBtn.addEventListener('click', ()=> { resetSendButtonClick(cForm); });
const startNewMessageBtn=cForm.querySelector('.vmwpmdp-wpvoicemessage-thanks-box .vmwpmdp-restart');
startNewMessageBtn.addEventListener('click', ()=> { yesResetButtonClick(cForm) });
const sendBtn=cForm.querySelector('.vmwpmdp-send-btns .vmwpmdp-send-rec-btn');
sendBtn.addEventListener('click', ()=> { sendButtonClick(cForm); });
const yesResetBtn=cForm.querySelector('.vmwpmdp-speak-now-btns .vmwpmdp-reset-rec-yes');
yesResetBtn.addEventListener('click', ()=> { yesResetButtonClick(cForm); });
const noResetBtn=cForm.querySelector('.vmwpmdp-speak-now-btns .vmwpmdp-reset-rec-no');
noResetBtn.addEventListener('click',(e)=> { noResetButtonClick(e.target, cForm); });
form=cForm.querySelector('.vmwpmdp-wpvoicemessage-send-box form');
if(form){
form.addEventListener('submit',(e)=> {
e.preventDefault();
});
}}
let micTryAgainBts=document.querySelectorAll('.vmwpmdp-wpvoicemessage-form-box .vmwpmdp-mic-access-err-reload-btn');
for(const micTryAgainBtn of micTryAgainBts){
micTryAgainBtn.addEventListener('click', ()=>{ location.reload(); });
}
function openPopup(){
let root=document.getElementsByTagName('html')[0];
let overlay=document.querySelector('.vmwpmdp-wpvoicemessage-fbutton-overlay');
overlay.style.display='block';
root.classList.add('vmwpmdp-wpvoicemessage-modal-opened');
}
function closePopup(){
btn.classList.remove('popup-open');
let root=document.getElementsByTagName('html')[0];
let overlay=document.querySelector('.vmwpmdp-wpvoicemessage-fbutton-overlay');
root.classList.add('vmwpmdp-wpvoicemessage-reverse');
setTimeout(function (){
overlay.style.display='none';
root.classList.remove('vmwpmdp-wpvoicemessage-modal-opened');
root.classList.remove('vmwpmdp-wpvoicemessage-reverse');
let pop_cForm=document.querySelector('.vmwpmdp-wpvoicemessage-fbutton-modal .vmwpmdp-wpvoicemessage-form-box');
showStartRecordingStep(pop_cForm);
stopAllStreams();
}, 600);
}
function noResetButtonClick(target, cForm){
if('showSendStep'===target.getAttribute('show-step')){
showSendStep(cForm);
target.setAttribute('show-step', '');
}else{
rec.record();
log('Recording resumed.');
isTimerPaused=false;
isCountdownPaused=false;
drawVisual=window.requestAnimationFrame(draw);
showSpeakNowStep(cForm);
}}
function yesResetButtonClick(cForm){
rec.stop();
gumStream.getAudioTracks()[0].stop();
showStartRecordingStep(cForm);
}
function sendButtonClick(cForm){
fillCurrentURL(cForm);
fillUserDetails(cForm);
let formData;
cForm.classList.add('vmwpmdp-busy');
let form=cForm.querySelector('.vmwpmdp-wpvoicemessage-send-box form');
if(form){
if(! form.checkValidity()){
form.reportValidity();
cForm.classList.remove('vmwpmdp-busy');
return;
}
formData=new FormData(form);
}else{
formData=new FormData();
}
formData.append('vmwpmdp-wpvoicemessage-audio', audioBlob);
formData.append('vmwpmdp-wpvoicemessage-audio-sample-rate', sampleRate);
if(cForm.parentNode.classList.contains('wpcf7-form')){
formData.append('action', 'cf7wpvoicemessage_send');
}else{
formData.append('action', 'wpvoicemessage_send');
}
formData.append('nonce', vmwpmdpContacterWP.nonce);
formData.append('cform-id', cForm.getAttribute('cform-id'));
let xhr=new XMLHttpRequest();
xhr.onreadystatechange=function(){
if(xhr.readyState===4&&xhr.status===200){
log(xhr.responseText);
cForm.classList.remove('vmwpmdp-busy');
var response=JSON.parse(xhr.response)
if(response.status=='ok'&&response.post_id > 0){
var url_field=cForm.querySelectorAll('.cf7-wpvoicemessage-field')[0];
if(url_field){
var records_ids=record_object.record_id;
records_ids.pop();
records_ids.push(response.post_id);
url_field.setAttribute('value', JSON.stringify(record_object));
}
showThanksStep(cForm);
}else{
cForm.classList.remove('vmwpmdp-busy');
log('Network Error.', 'error', true);
showErrorStep(cForm);
}}
};
xhr.onload=function(){
cForm.classList.remove('vmwpmdp-busy');
};
xhr.onerror=function(){
cForm.classList.remove('vmwpmdp-busy');
log('Network Error.', 'error', true);
showErrorStep(cForm);
};
cForm.classList.add('vmwpmdp-busy');
xhr.open('POST', vmwpmdpContacterWP.ajaxurl, true);
xhr.send(formData);
}
function fillCurrentURL(cForm){
let vmwpmdpCurrentURL=cForm.querySelectorAll('#vmwpmdpCurrentURL')[0];
if('undefined'===typeof vmwpmdpCurrentURL){ return; }
vmwpmdpCurrentURL.value=window.location.href;
}
function fillUserDetails(cForm){
let vmwpmdpUserDetails=cForm.querySelectorAll('#vmwpmdpUserDetails')[0];
if('undefined'===typeof vmwpmdpUserDetails){ return; }
let login=cForm.querySelectorAll('.vmwpmdp-wpvoicemessage-additional-fields')[0].getAttribute('user-login');
let ip=cForm.querySelectorAll('.vmwpmdp-wpvoicemessage-additional-fields')[0].getAttribute('user-ip');
if(! login){
login='Guest';
}
vmwpmdpUserDetails.value=login + ' (' + ip + ')';
}
function resetSendButtonClick(cForm){
cForm.querySelector('.vmwpmdp-speak-now-btns .vmwpmdp-reset-rec-no').setAttribute('show-step', 'showSendStep');
showResetStep(cForm);
}
function stopButtonClick(cForm){
if(rec.recording){ rec.stop(); }
log('Recording stopped.');
clearInterval(timerInterval);
clearInterval(countdownInterval);
window.cancelAnimationFrame(drawVisual);
showSendStep(cForm);
showAdditionalFields(cForm);
gumStream.getAudioTracks()[0].stop();
rec.exportWAV(( blob)=> { createPayer(blob, cForm) });
}
function resetButtonClick(cForm){
if(rec.recording){ rec.stop(); }
log('Recording paused.');
isTimerPaused=true;
isCountdownPaused=true;
window.cancelAnimationFrame(drawVisual);
showResetStep(cForm);
}
function startRecordingButtonClick(cForm){
showAllowAccessStep(cForm);
navigator.mediaDevices.getUserMedia({ audio: true, video: false }).then(function(stream){
log('getUserMedia() success. Stream created. Initializing Recorder.');
audioContext=new AudioContext();
sampleRate=audioContext.sampleRate;
log('Format: 1 channel pcm @ ' + sampleRate/1000 + 'kHz');
gumStream=stream;
input=audioContext.createMediaStreamSource(stream);
rec=new Recorder(input,{ numChannels: 1 });
rec.record();
log('Recording started.');
showSpeakNowStep(cForm);
createTimer(cForm);
createCountdown(cForm);
createAnimation(cForm);
}).catch(function(err){
log('Error getUserMedia() fails. See details below.', 'warn', true);
log(err, 'error', true);
showMicrophoneAccessErrStep(cForm)
});
}
function stopAllStreams(){
if(typeof gumStream!=='undefined'){
gumStream.getTracks().forEach(function(track){
track.stop();
});
}}
function createAnimation(cForm){
let analyser=audioContext.createAnalyser();
input.connect(analyser);
analyser.fftSize=2048;
let bufferLength=analyser.frequencyBinCount;
let dataArray=new Uint8Array(bufferLength);
let animation=cForm.querySelector('.vmwpmdp-wpvoicemessage-recording-animation canvas');
let animationCtx=animation.getContext("2d");
animationCtx.clearRect(0, 0, animation.width, animation.height);
draw=function(){
drawVisual=requestAnimationFrame(draw);
analyser.getByteTimeDomainData(dataArray);
animationCtx.clearRect(0, 0, animation.width, animation.height);
animationCtx.fillStyle='rgba(255, 255, 255, 0.01)';
animationCtx.fillRect(0, 0, animation.width, animation.height);
animationCtx.lineWidth=2;
let startColor=vmwpmdpContacterWP.accentColor.replace(/[^,]+(?=\))/, '0');
let endColor=vmwpmdpContacterWP.accentColor.replace(/[^,]+(?=\))/, '1');
const gradient=animationCtx.createLinearGradient(0, 0, 384, 0);
gradient.addColorStop(0, startColor);
gradient.addColorStop(.25 , endColor);
gradient.addColorStop(.75 , endColor);
gradient.addColorStop(1, startColor);
animationCtx.strokeStyle=gradient;
animationCtx.beginPath();
let sliceWidth=animation.width * 1.0 / bufferLength;
let x=0;
for(let i=0; i < bufferLength; i++){
let v=dataArray[i] / 128.0;
let y=v * animation.height/2;
if(i===0){
animationCtx.moveTo(x, y);
}else{
animationCtx.lineTo(x, y);
}
x +=sliceWidth;
}
animationCtx.lineTo(animation.width, animation.height/2);
animationCtx.stroke();
};
draw();
}
function createCountdown(cForm){
const countdownElement=cForm.querySelector('.vmwpmdp-wpvoicemessage-recording-countdown');
if(null===countdownElement){ return; }
let maxDuration=parseInt(cForm.getAttribute('max-duration'));
if(maxDuration===0){ return; }
let countdown=maxDuration;
clearInterval(countdownInterval);
isCountdownPaused=false;
let resetMinutes=Math.floor(maxDuration / 60);
let resetSeconds=maxDuration - resetMinutes * 60;
countdownElement.innerHTML=resetMinutes.pad(2) + ':' + resetSeconds.pad(2);
countdownInterval=setInterval(function (){
if(isCountdownPaused){ return; }
countdown--;
if(maxDuration!==0&&countdown < 0){
cForm.querySelector('.vmwpmdp-speak-now-btns .vmwpmdp-stop-rec-btn').click();
}
let minutes=Math.floor(countdown / 60);
let seconds=countdown - minutes * 60;
countdownElement.innerHTML=minutes.pad(2) + ':' + seconds.pad(2);
}, 1000);
}
function createTimer(cForm){
let timer=0;
const timerElement=cForm.querySelector('.vmwpmdp-wpvoicemessage-recording-timer');
if(null===timerElement){ return; }
let maxDuration=parseInt(cForm.getAttribute('max-duration'));
clearInterval(timerInterval);
isTimerPaused=false;
timerElement.innerHTML='00:00';
timerInterval=setInterval(function (){
if(isTimerPaused){ return; }
timer++;
if(maxDuration!==0&&timer > maxDuration){
cForm.querySelector('.vmwpmdp-speak-now-btns .vmwpmdp-stop-rec-btn').click();
}
let minutes=Math.floor(timer / 60);
let seconds=timer - minutes * 60;
timerElement.innerHTML=minutes.pad(2) + ':' + seconds.pad(2);
}, 1000);
}
function createPayer(blob, cForm){
let url=URL.createObjectURL(blob);
audioBlob=blob;
let audioEl=document.createElement('audio');
audioEl.src=url;
const playerBox=cForm.querySelector('.vmwpmdp-wpvoicemessage-send-box .vmwpmdp-wpvoicemessage-player-box');
playerBox.innerHTML='';
playerBox.appendChild(audioEl);
new GreenAudioPlayer(playerBox);
let downloadBtn=cForm.querySelector('.vmwpmdp-wpvoicemessage-download-link-box > a');
if(null!==downloadBtn){
downloadBtn.setAttribute('href', url);
downloadBtn.setAttribute('download', 'record.wav');
}}
function showThanksStep(cForm){
hideAllViews(cForm);
cForm.classList.add('vmwpmdp-step-thanks');
}
function showErrorStep(cForm){
hideAllViews(cForm);
cForm.classList.add('vmwpmdp-step-error');
}
function showSendStep(cForm){
hideAllViews(cForm);
cForm.classList.add('vmwpmdp-step-send');
}
function showStartRecordingStep(cForm){
hideAllViews(cForm);
cForm.classList.add('vmwpmdp-step-start');
}
function showAllowAccessStep(cForm){
hideAllViews(cForm);
cForm.classList.add('vmwpmdp-step-allow-access');
}
function showResetStep(cForm){
hideAllViews(cForm);
cForm.classList.add('vmwpmdp-step-reset');
}
function showMicrophoneAccessErrStep(cForm){
hideAllViews(cForm);
cForm.classList.add('vmwpmdp-step-mic-access-err');
}
function showSpeakNowStep(cForm){
hideAllViews(cForm);
cForm.classList.add('vmwpmdp-step-recording');
}
function showAdditionalFields(cForm){
const additionalFieldsBox=cForm.querySelector('.vmwpmdp-wpvoicemessage-send-box .vmwpmdp-wpvoicemessage-additional-fields');
if(! additionalFieldsBox){ return; }
let additionalFields=additionalFieldsBox.getAttribute('additional-fields');
additionalFieldsBox.innerHTML=atobUTF8(additionalFields);
}
function hideAllViews(el){
el.classList.remove('vmwpmdp-step-start');
el.classList.remove('vmwpmdp-step-allow-access');
el.classList.remove('vmwpmdp-step-mic-access-err');
el.classList.remove('vmwpmdp-step-recording');
el.classList.remove('vmwpmdp-step-reset');
el.classList.remove('vmwpmdp-step-error');
el.classList.remove('vmwpmdp-step-send');
el.classList.remove('vmwpmdp-step-thanks');
}
function getUrlVars(){
let vars={};
window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m, key, value){
vars[key]=value;
});
return vars;
}
function log(msg, level='log', always=false){
let debug=getUrlVars()['debug'];
debug=typeof debug!=='undefined';
if(always){
debug=true;
}
if(! debug){ return; }
msg='QCvoicemssg: ' + msg;
if('log'===level){
console.log(msg);
}else if('warn'===level){
console.warn(msg);
}else if('error'===level){
console.error(msg);
}}
Number.prototype.pad=function(size){
let s=String(this);
while(s.length <(size||2)){ s='0' + s; }
return s;
}
function randomRGBA(){
let o=Math.round, r=Math.random, s=255;
return 'rgba(' + o(r()*s) + ',' + o(r()*s) + ',' + o(r()*s) + ',' + r().toFixed(1) + ')';
}});
(function(window){
"use strict";
var log=Math.log;
var LN2=Math.LN2;
var clz32=Math.clz32||function(x){return 31 - log(x >>> 0) / LN2 | 0};
var fromCharCode=String.fromCharCode;
var originalAtob=atob;
var originalBtoa=btoa;
function btoaReplacer(nonAsciiChars){
var point=nonAsciiChars.charCodeAt(0);
if(point >=0xD800&&point <=0xDBFF){
var nextcode=nonAsciiChars.charCodeAt(1);
if(nextcode!==nextcode)
return fromCharCode(0xef, 0xbf, 0xbd);
if(nextcode >=0xDC00&&nextcode <=0xDFFF){
point=(point - 0xD800) * 0x400 + nextcode - 0xDC00 + 0x10000;
if(point > 0xffff)
return fromCharCode(
(0x1e<<3) | (point>>>18),
(0x2<<6) | ((point>>>12)&0x3f),
(0x2<<6) | ((point>>>6)&0x3f),
(0x2<<6) | (point&0x3f)
);
} else return fromCharCode(0xef, 0xbf, 0xbd);
}
if(point <=0x007f) return nonAsciiChars;
else if(point <=0x07ff){
return fromCharCode((0x6<<5)|(point>>>6), (0x2<<6)|(point&0x3f));
} else return fromCharCode(
(0xe<<4) | (point>>>12),
(0x2<<6) | ((point>>>6)&0x3f),
(0x2<<6) | (point&0x3f)
);
}
window["btoaUTF8"]=function(inputString, BOMit){
return originalBtoa((BOMit ? "\xEF\xBB\xBF":"") + inputString.replace(/[\x80-\uD7ff\uDC00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]?/g, btoaReplacer
));
}
function atobReplacer(encoded){
var codePoint=encoded.charCodeAt(0) << 24;
var leadingOnes=clz32(~codePoint);
var endPos=0, stringLen=encoded.length;
var result="";
if(leadingOnes < 5&&stringLen >=leadingOnes){
codePoint=(codePoint<<leadingOnes)>>>(24+leadingOnes);
for (endPos=1; endPos < leadingOnes; ++endPos)
codePoint=(codePoint<<6) | (encoded.charCodeAt(endPos)&0x3f);
if(codePoint <=0xFFFF){
result +=fromCharCode(codePoint);
}else if(codePoint <=0x10FFFF){
codePoint -=0x10000;
result +=fromCharCode(
(codePoint >> 10) + 0xD800,
(codePoint & 0x3ff) + 0xDC00 
);
} else endPos=0;
}
for (; endPos < stringLen; ++endPos) result +="\ufffd";
return result;
}
window["atobUTF8"]=function(inputString, keepBOM){
if(!keepBOM&&inputString.substring(0,3)==="\xEF\xBB\xBF")
inputString=inputString.substring(3);
return originalAtob(inputString).replace(/[\xc0-\xff][\x80-\xbf]*/g, atobReplacer);
};})(typeof global=="" + void 0 ? typeof self=="" + void 0 ? this:self:global);
/*jQuery(window).on('load', function(){
jQuery(document).on('click', '.wpbd_voice_message', function(){
jQuery('#vmwpmdp-wpvoicemessage-fbutton').trigger('click');
});
});*/;