let wakeLock = null;
function ajax_form(_form, _response_message_container, _callback){
try{
var rr = _form;
if(_response_message_container != null && _response_message_container != undefined) rr=_response_message_container;
cj(rr)
rr.find(':button,.btn,.bt').attr('disabled', 'disabled').addClass('disabled');
$.ajax({
url: _form.attr('action'),
data: _form.serialize(),
cache: false,
dataType: 'json',
method: 'POST',
success: function(_d){
process_ajax_response(rr, _d);
if(_callback != null && _callback != undefined) _callback(_d);
}
});
}catch(ex){
handle_error(ex);
}
}
function handle_error(_ex,_alert){
try{
if(_ex!=null&&_ex!=undefined){
console.log(_ex);
if(_alert!=undefined && _alert!=null && _alert==true) alert(_ex.message);
}
}catch(exx){}
}
function process_ajax_response(_parent,_d,_no_scroll){
try{
clear_ajax_response(_parent);
if(_no_scroll==null||_no_scroll==undefined)_no_scroll=0;
if(_d.success&&_d.redirect_url!=null&&_d.redirect_url!=undefined&&_d.redirect_url.length>0){
if(_d.redirect_url.indexOf('blank::')>-1){
url=_d.redirect_url.substr(_d.redirect_url.indexOf('blank::')+7,_d.redirect_url.length); //add blank:: to beginning of URL to open in new window
window.open(url);
}else{
window.location=_d.redirect_url;
}
}
if(_parent.find('.alert-ajax-response').length==0){
_parent.prepend('');
}
_parent.find('.alert-ajax-response').removeClass('alert-danger').removeClass('alert-success').addClass(_d.success ? 'alert-success' : 'alert-danger').html(_d.message != undefined && _d.message != '' ? _d.message : '');
if(_d.message!=undefined&&_d.message!=''){
_parent.find('.alert-ajax-response').fadeIn('fast',function(){
var npos=_parent.find('.alert-ajax-response:first').offset().top-75;
if(_no_scroll==0){
$('html,body').animate({
scrollTop: npos
});
}
});
}else{
_parent.find('.alert-ajax-response').hide();
}
return _d.success;
}catch(ex){
handle_error(ex);
}
return false;
}
function pp(_parent,_d,_no_scroll){return process_ajax_response(_parent,_d,_no_scroll)};
function clear_ajax_response(_parent){
try{
if(_parent != null && _parent != undefined && _parent.length > 0){
if(_parent.find('.err-misc').length>0) _parent.find('.err-misc').hide();
if(_parent.find('.alert-ajax-response').length>0) _parent.find('.alert-ajax-response').removeClass('alert-danger').removeClass('alert-success').html('').hide();
$('.field-group').removeClass('mdn-error'); //field specific errors, ex: register/account pages
}
}catch(ex){}
}
function cj(_parent){clear_ajax_response(_parent)};
function clean(_parent){clear_ajax_response(_parent)};
//show ajax style message, where parent is the container and _message is the message
function show_message(_parent,_message,_success,_no_scroll){
try{
if(_message&&_parent){
if(_parent.find('.alert-ajax-response').length==0) _parent.prepend('');
_parent.find('.alert-ajax-response').removeClass('alert-danger').removeClass('alert-success').addClass(_success?'alert-success':'alert-danger').html(_message);
_parent.find('.alert-ajax-response').fadeIn('fast',function(){
if(_no_scroll==null||_no_scroll==undefined||_no_scroll==false){
$('html,body').animate({
scrollTop: _parent.find('.alert-ajax-response:first').offset().top-75
});
}
});
}
}catch(ex){
handle_error(ex);
}
}
function ordinal(_n) {
var s=["th","st","nd","rd"],
v=_n%100;
return _n+(s[(v-20)%10]||s[v]||s[0]);
}
function ucfirst(_str) {
return _str.charAt(0).toUpperCase()+_str.slice(1);
}
function prep_arr(_d){
if(_d!=null&&_d.success&&_d.results.count==1){
var tmp=_d.results.data;
_d.results.data=[];
_d.results.data.push(tmp);
}
return _d;
}
function unflatten(_d){return prep_arr(_d)};
function fallback_copy_text_to_clipboard(text) {
var textArea = document.createElement("textarea");
textArea.value = text;
// Avoid scrolling to bottom
textArea.style.top = "0";
textArea.style.left = "0";
textArea.style.position = "fixed";
document.body.appendChild(textArea);
textArea.focus();
textArea.select();
try {
var successful = document.execCommand('copy');
var msg = successful ? 'successful' : 'unsuccessful';
} catch (err) {
}
document.body.removeChild(textArea);
}
function copy_to_clipboard(text) {
if (!navigator.clipboard) {
fallback_copy_text_to_clipboard(text);
return;
}
navigator.clipboard.writeText(text).then(function() {
}, function(err) {
});
}
function plur(_word,_count){
if(_count!=null&&parseInt(_count)>1){
return _word+'s';
}else{
return _word;
}
}
var entityMap = {
"&": "&",
"<": "<",
">": ">",
'"': '"',
"'": ''',
"/": '/'
};
function escape_html(string) {
return String(string).replace(/[&<>"'\/]|[\n]/g, function (s) {
return entityMap[s];
});
}
function format_bytes(a,b){if(0==a)return"0 Bytes";var c=1024,d=b||2,e=["Bytes","KB","MB","GB","TB","PB","EB","ZB","YB"],f=Math.floor(Math.log(a)/Math.log(c));return parseFloat((a/Math.pow(c,f)).toFixed(d))+" "+e[f]}
//if number is invalid or undefined or null, return a dash
function prep_num(_num){
if(_num == null || _num == undefined || _num == 'null'){
return '-';
}else{
return _num;
}
}
//gets a string between a string
function gbs(str_in,str_start,str_end){
var m_start = str_in.indexOf(str_start, 0);
var m_end = str_in.indexOf(str_end, m_start + str_start.length);
if(m_start == -1 || m_end == -1 || m_start > m_end){
return "";
}else{
return str_in.substr(m_start + str_start.length, m_end - (m_start + str_start.length));
}
}
//gets a string between a string, ignore case
function gbsi(str_in, str_start, str_end){
var m_start = str_in.toLowerCase().indexOf(str_start.toLowerCase(), 0);
var m_end = str_in.toLowerCase().indexOf(str_end.toLowerCase(), m_start + str_start.length);
if(m_start == -1 || m_end == -1 || m_start > m_end){
return "";
}else{
return str_in.substr(m_start + str_start.length, m_end - (m_start + str_start.length));
}
}
//add commas to numbers
function add_commas(nStr){
nStr += '';
x = nStr.split('.');
x1 = x[0];
x2 = x.length > 1 ? '.' + x[1] : '';
var rgx = /(\d+)(\d{3})/;
while (rgx.test(x1)) {
x1 = x1.replace(rgx, '$1' + ',' + '$2');
}
return x1 + x2;
}
//convert number from something like 19437675 to 1.93m, 1935 to 1.9K, designed for INTs
function nice_num(_num,_digits){
if(_digits == null || _digits == undefined) _digits = 1;
if(_num != null && _num != undefined && _num != '-'){
if(_num < 10){
return _num;
}else if(_num >= 10 && _num < 1000){
return parseInt(_num);
}else{
var ff=nFormatter(_num,1);
if(ff.indexOf('.')>1){
ff=nFormatter(_num,0);
}
return ff;
}
}else{
return _num;
}
}
function nFormatter(num, digits) {
var si = [
{ value: 1E18, symbol: "E" },
{ value: 1E15, symbol: "P" },
{ value: 1E12, symbol: "T" },
{ value: 1E9, symbol: "B" },
{ value: 1E6, symbol: "M" },
{ value: 1E3, symbol: "K" }
], i;
for (i = 0; i < si.length; i++) {
if (num >= si[i].value) {
return (num / si[i].value).toFixed(digits).replace(/\.0+$|(\.[0-9]*[1-9])0+$/, "$1") + si[i].symbol;
}
}
return num.toString();
}
(function (original) {
jQuery.fn.clone = function () {
var result = original.apply(this, arguments),
my_textareas = this.find('textarea').add(this.filter('textarea')),
result_textareas = result.find('textarea').add(result.filter('textarea')),
my_selects = this.find('select').add(this.filter('select')),
result_selects = result.find('select').add(result.filter('select'));
for (var i = 0, l = my_textareas.length; i < l; ++i) $(result_textareas[i]).val($(my_textareas[i]).val());
for (var i = 0, l = my_selects.length; i < l; ++i) {
for (var j = 0, m = my_selects[i].options.length; j < m; ++j) {
if (my_selects[i].options[j].selected === true) {
result_selects[i].options[j].selected = true;
}
}
}
return result;
};
}) (jQuery.fn.clone);
//shrinks a field down to a specific length or returns N/A if it contains invalid data
function shorten_field(_f,_lowercase,_uppercase,_len){
if(_f!=null&&_f.length>0){
if(_lowercase)_f=_f.toLowerCase();
if(_uppercase)_f=_f.toUpperCase();
if(_f==null||_f==''){
_f='N/A';
}else if(_f.length>_len){
_f=_f.substr(0,_len)+'...';
}
return _f;
}else{
return 'N/A';
}
}
function simplify_error(_err,_response_code){
try{
if(_err){
if(_err.indexOf('Unexpected token < in JSON')>-1){
_err='Invalid response received from server. Please try again.';
}
}else if(_response_code&&_response_code==404) {
_err='Page not found. Please try again later or contact support if problem persists.';
}else if(_response_code&&_response_code==500) {
_err='Internal server error. Please try again later or contact support if problem persists.';
}
}catch(ex){
}
return _err;
}
function set_cookie(key, value, expiry) {
var expires = new Date();
expires.setTime(expires.getTime() + (expiry * 24 * 60 * 60 * 1000));
document.cookie = key + '=' + value + ';expires=' + expires.toUTCString();
}
function get_cookie(key) {
var keyValue = document.cookie.match('(^|;) ?' + key + '=([^;]*)(;|$)');
return keyValue ? keyValue[2] : null;
}
function erase_cookie(key) {
var keyValue = getCookie(key);
setCookie(key, keyValue, '-1');
}
/*2023-03-27*/
function isi(_val){
if(_val===undefined||_val===null||_val.length==0){
return false;
}else{
return true;
}
}
/*2023-03-27, expecting jquery selector item like $(item)*/
function is_checkbox(_item) {
if(_item){
return _item.attr('type')==='checkbox';
}else{
return false;
}
};
function proc_form(_form,_button,_url,_data,_callback){
try{
if(_data===null||_data===undefined||_data==='')_data=_form.not('.skip-disable').serialize();
if(_button===null||_button===undefined||_button==='')_button=_form.find('submit:first');
if(_button===null||_button===undefined||_button==='')_button=_form.find('.btn:first');
if(_form){
$.ajax({
method:'POST',
url:_url,
data:_data,
dataType:'json',
beforeSend:function(_xhr){
_form.find('.required').removeClass('incomplete-field');
_form.find('.required').each(function(){
if($(this).val().length==0){//validate required fields and quit without submitting if incomplete
$(this).addClass('incomplete-field');
show_message(_form,'Please complete the required fields marked with a red border.',false);
_xhr.abort();
return false;
}
});
if(_button.hasClass('btn-dots')){//buttons that we want to swap ... for text to indicate loading
var op=_button.html();
_button.html('...').attr('op',op);
}
_form.find(':button,:input,.btn').not('.skip-disable').attr('disabled','disabled').addClass('disabled');
}
}).done(function(_d){
_form.find(':button,:input,.btn').not('.skip-disable').removeAttr('disabled').removeClass('disabled');
_form.find('.btn-dots').each(function(){
var attr=$(this).attr('op');
if (typeof attr !== typeof undefined && attr !== false){
$(this).text($(this).attr('op'));
}
});
pp(_form,_d);
if(_callback!=null&&_callback!=undefined){
_callback(_d);
}
}).fail(function(_xhr,_status,_err) {
show_message(_form,simplify_error(_err.message,_xhr.status),false);
}).always(function() {
_form.find(':button,:input,.btn').not('.skip-disable').removeAttr('disabled').removeClass('disabled');
_form.find('.btn-dots').each(function(){
var attr=$(this).attr('op');
if (typeof attr !== typeof undefined && attr !== false){
$(this).text($(this).attr('op'));
}
});
});
}else{
console.log('no form detected');
}
}catch(ex){
}
}
/*https://developer.chrome.com/articles/wake-lock/*/
const requestWakeLock = async () => {
try {
wakeLock = await navigator.wakeLock.request('screen');
wakeLock.addEventListener('release', (e) => {
console.log('Wake Lock was released');
});
console.log('Wake Lock is active');
} catch (e) {
console.error(`${e.name}, ${e.message}`);
}
};
const releaseWakeLock = async () => {
try{
if(wakeLock !== null){
wakeLock.release();
wakeLock = null;
}
}catch(e){
console.error(`${e.name}, ${e.message}`);
}
};
async function get_wakelock(){
setTimeout(function(){
requestWakeLock();
},100);
}