/g,'>').replace(/"/g,""").replace(/'/g,"'")}
function ldialogModalDivCreate(){var div=document.createElement('div');lelementStyleSet(div,'cssText','position:relative;width:28em;max-width:86vw;margin:15% auto;padding:1em 1.5em;background-color:#f4f4f4;border: 2px solid #333;box-shadow:0 0 1em rbga(0,0,0,.3)');return div}
function lelementInnerHTMLSetEscaped(e,content){if(!e){LRDFAULT("lelementInnerHTMLSetEscaped called on invalid element");return}
e.innerHTML=lescapeHTML(content)}
function lelementChildAppend(eParent,eChild){if(!eParent){LRDFAULT("lelementChildAppend called on invalid parent element");return}
if(!eChild){LRDFAULT("lelementChildAppend called on invalid child element");return}
eParent.appendChild(eChild)}
function ldialogCaptionSet(div,caption){var eCaption=document.createElement('h3');lelementInnerHTMLSetEscaped(eCaption,caption);lelementChildAppend(div,eCaption)}
function ldialogAddControl(div,e){if(!e){LRDFAULT('ldialogAddControl called on invalid element');return}
lelementChildAppend(div,e)}
function ldialogAddStaticHTML(div,text){var eStaticText=document.createElement('p');lelementInnerHTMLSet(eStaticText,text);lelementStyleSet(eStaticText,'width','100%');ldialogAddControl(div,eStaticText)}
function lelementOnClickHandlerSet(e,eventHandler){if(!e){LRDFAULT("lelementOnClickHandlerSet called on invalid element");return}
if(e.addEventListener){e.addEventListener('click',eventHandler)}else if(e.attachEvent){e.attachEvent('onclick',eventHandler)}else{LRDFAULT("lelementOnClickHandlerSet cannot set click handler on this element")}}
function lutilsWindowGetWidthCU(){return document.body.clientWidth/parseFloat(getComputedStyle(document.querySelector('html'))['font-size'])}
function lelementIsHidden(e){if(!e){LRDFAULT('The element you\'re trying to check if hidden doesn\'t exist');return}
var style=window.getComputedStyle(e);return(style.display==='none')}
function lutilsGetElementByIdIfRequired(unknownElement){return(typeof unknownElement!=='string')?unknownElement:lgetElementByIdSafe(unknownElement)}
var glmodalActiveElements=[];var modalDiv;var gactiveModalOverlay;function lmodaldivClose(div){div=lutilsGetElementByIdIfRequired(div);if((!gactiveModalOverlay)||(!div.overlay)){return}
var bCloseOther=(!div.overlay.isSameNode(gactiveModalOverlay));if(bCloseOther){}
var eClosedModal=bCloseOther?div.overlay:gactiveModalOverlay;if(lelementIsHidden(eClosedModal)){return}
lelementDisplaySet(eClosedModal,'none');glmodalActiveElements.pop();if(glmodalActiveElements.length===0){lelementDisplaySet(modalDiv,'none');lelementStyleSet(document.body,'overflow-y',modalDiv.modalBodyPreOverflow)}else{if(!bCloseOther)gactiveModalOverlay=glmodalActiveElements[glmodalActiveElements.length - 1].overlay}}
function ldialogClose(dlg){lmodaldivClose(dlg.div)}
var eMouseDownElement;var glmodalKeyDownListener;function lmodaldivOpen(div,closeFunc,bPreventCloseByBackground){div=lutilsGetElementByIdIfRequired(div);div.bPreventCloseByBackground=bPreventCloseByBackground;if(typeof glmodalActiveElements==='undefined'){glmodalActiveElements=[]}
for(var i=0;i0)&&(e.target===this)&&(eMouseDownElement===this)){var element=glmodalActiveElements[glmodalActiveElements.length - 1];if(element.bPreventCloseByBackground)return;if(typeof element.lwindow!=='undefined'){element.lwindow.CloseCancel()}else{element.closeFunc(element)}}});modalDiv.addEventListener('mousedown',function(e){eMouseDownElement=e.target})}
div.onclick='';div.closeFunc=closeFunc||lmodaldivClose;gactiveModalOverlay=div.overlay;if(!gactiveModalOverlay){gactiveModalOverlay=document.createElement('div');lelementClassListAdd(gactiveModalOverlay,'modal_overlay');lelementChildAppend(gactiveModalOverlay,div);lelementChildAppend(modalDiv,gactiveModalOverlay)}
if(!modalDiv.lastElementChild.isSameNode(gactiveModalOverlay))modalDiv.lastElementChild.insertAdjacentElement('afterend',gactiveModalOverlay);lelementDisplaySet(div,'block');lelementDisplaySet(gactiveModalOverlay,'block');lelementDisplaySet(modalDiv,'block');div.overlay=gactiveModalOverlay;if(glmodalActiveElements.length===0){modalDiv.modalBodyPreOverflow=document.body.style.overflowY;lelementStyleSet(document.body,'overflowY','hidden')}
glmodalActiveElements.push(div);if(glmodalKeyDownListener)document.body.removeEventListener('keydown',glmodalKeyDownListener);glmodalKeyDownListener=function(){var eActiveModal=glmodalActiveElements[glmodalActiveElements.length - 1];var keyCode=event.which||event.keyCode;if(keyCode===27){if((eActiveModal)&&(!div.bPreventCloseByBackground))eActiveModal.closeFunc(eActiveModal)}else if((keyCode===13)&&(!event.shiftKey)){if(eActiveModal){if(eActiveModal.querySelector('form'))return;var eActive=document.activeElement;if(eActive){if(eActive.tagName.toLowerCase()==='textarea')return;if((eActive.type==='date')||(eActive.classList.contains('date-picker'))||(eActive.parentNode.classList.contains('datepicker')))return}
var eSubmitBtn=eActiveModal.querySelector('.modal-submit');if((eSubmitBtn)&&(!eSubmitBtn.disabled)){eSubmitBtn.click();event.preventDefault()}}}
if(glmodalActiveElements.length===0){document.body.removeEventListener('keydown',glmodalKeyDownListener);glmodalKeyDownListener=null}}
document.body.addEventListener('keydown',glmodalKeyDownListener)}
function lalertOkCancel(text,caption,textOk,textCancel,callbackFuncOk,callbackFuncCancel){textOk=textOk||"OK";textCancel=textCancel||"Cancel";var div=ldialogModalDivCreate();ldialogCaptionSet(div,caption);if(text)ldialogAddStaticHTML(div,text);lalertAddClosingButton(div,textOk,callbackFuncOk,!0);lalertAddClosingButton(div,textCancel,callbackFuncCancel);lmodaldivOpen(div)}
function ldialogAddButton(div,text,cbOnClick,bBtnPrimary){var eButton=document.createElement('button');if(bBtnPrimary){lelementClassListAdd(eButton,'modal-submit')}else{lelementClassListAdd(eButton,'btn-secondary')}
if(lutilsWindowGetWidthCU()<28){if(bBtnPrimary)lelementStyleSet(eButton,'margin','.5em 0');lelementStyleSet(eButton,'width','100%')}else{if(bBtnPrimary)lelementStyleSet(eButton,'margin','.5em');lelementStyleSet(eButton,'width','auto')}
text=text||'Cancel';lelementInnerHTMLSetEscaped(eButton,text);eButton.control=div;lelementOnClickHandlerSet(eButton,cbOnClick);var eBtnContainer=div.querySelector('.modal-footer__row');if(!eBtnContainer){eBtnContainer=document.createElement('div');lelementClassListAdd(eBtnContainer,'modal-footer__row');lelementChildAppend(div,eBtnContainer)}
lelementChildAppend(eBtnContainer,eButton);return eButton}
function lalertAddClosingButton(div,text,cb,primary){ldialogAddButton(div,text,function(){lmodaldivClose(div);if(typeof cb==='function')cb()},primary)}
function lalertOkInfo(text,caption,textOk,callbackFuncOk){textOk=textOk||'OK';var div=ldialogModalDivCreate();ldialogCaptionSet(div,caption);if(text)ldialogAddStaticHTML(div,text);lalertAddClosingButton(div,textOk,callbackFuncOk,!0);lmodaldivOpen(div)}
function lelementValueSet(e,value){if(!e){LRDFAULT("lelementValueSet called on invalid element");return}
e.value=value}
function lelementValueSetById(id,value){var e=document.getElementById(id);if(!e){LRDFAULT("lelementValueSetById found no element with id: "+id);return}
lelementValueSet(e,value)}
function lscriptCallJSONNodeResultHandler(script,sd,cb){lscriptCallResultJSON(script,JSON.stringify(sd),function(rd){_lscriptCallNodeResultHandler(rd,cb)})}
function lutilsLoadingSpinnerRemove(container){var eContainer=lgetElementByIdSafe(container);var eSpinners=eContainer.getElementsByClassName('async-spinner');for(var i=(eSpinners.length - 1);i>=0;i--)lelementRemove(eSpinners[i])}
function lutilsLoadingSpinnerAdd(container){var eContainer=lgetElementByIdSafe(container);if(eContainer.getElementsByClassName('async-spinner').length===0){var eSpinner=document.createElement('div');eContainer.appendChild(eSpinner);eSpinner.outerHTML=''}}
function lutilsStringTrim(text){return text.trim()}
function lelementValueGetAndTrim(e,defaultVal){if(typeof defaultVal==='undefined')defaultVal='';if(typeof defaultVal!=="string"){defaultVal=''}
if(!e){LRDFAULT("lelementValueGetAndTrim called on invalid element");return defaultVal}
if(typeof e.value==="string")return lutilsStringTrim(e.value);LRDFAULT("lelementValueGetAndTrim: Element's value type is not a string. Returning the default value instead. Element id: "+e.id+" Element class: "+e.className+' Element tag: '+e.tagName+' Value: '+e.value+' Typeof value: '+typeof e.value);return defaultVal}
function lutilsEmailValidate(email){var emailRegex=/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/i;return emailRegex.test(email)}
function lgetElementByIdSafe(id){var el=document.getElementById(id);if(el!==null)return el;LRDFAULT("id "+id+" does not exist on page, empty element returned");return document.createElement('div')}
function lelementAttributeGet(e,name,def){if(typeof def==='undefined')def='';if(!e){LRDFAULT("lelementAttributeGet called on invalid element");return def}
if(typeof name!=='string'){LRDFAULT("attribute name must be string");return def}
var attr=e.getAttribute(name);return(attr!=null)?attr:def}
function lelementFocus(e){setTimeout(function(){e.focus()},0)}
function _lfielderrorMessageSet(eField){var eErrorMessage=document.createElement('span');eField.parentNode.insertBefore(eErrorMessage,eField.nextElementSibling);return eErrorMessage}
function lelementInnerHTMLSet(e,content){if(!e){LRDFAULT("lelementInnerHTMLSet called on invalid element");return}
e.innerHTML=content}
function lelementStyleSet(e,property,value){if(!e){LRDFAULT('The element you\'re trying to set '+property+' on doesn\'t exist');return}
e.style[property]=value}
function lelementClassListAdd(e,sClass){if(!e){LRDFAULT("lelementClassListAdd called on invalid element");return}
if(typeof sClass!=='string'){LRDFAULT("lelementClassListAdd class is not a string");return}
e.classList.add(sClass)}
function lelementDisplaySet(e,d){if(e){e.style.display=d}else{LRDFAULT("lelementDisplaySet called on invalid element")}}
function _lfielderrorSetErrorStyle(eField,sErrorMessage){var eErrorMessage=eField.eMessage;if(!eErrorMessage){return}
lelementClassListAdd(eField,'field-error');lelementStyleSet(eField,'backgroundColor','#fce4e4');lelementStyleSet(eField,'border','1px solid #cc0033');lelementClassListAdd(eErrorMessage,'field-error-message');lelementStyleSet(eErrorMessage,'color','red');lelementDisplaySet(eErrorMessage,'block');lelementInnerHTMLSet(eErrorMessage,sErrorMessage||'Error')}
function lscriptCallResultDiscard(page,senddata){lscriptCall(page,senddata)}
function ldebugRetrieveStack(){var stackRetriever=new Error('');if(stackRetriever.stack)return stackRetriever.stack;return''}
function LRDFAULT(msg){console.log('** LRDFAULT '+msg);lscriptCallResultDiscard('/_fault','msg='+encodeURIComponent(msg)+'&stack='+ldebugRetrieveStack())}
function lfielderrorSet(eField,sErrorMessage){if(!eField){LRDFAULT("lfielderrorSet called on invalid element");return}
var eErrorMessage=_lfielderrorMessageSet(eField);eField.eMessage=eErrorMessage;_lfielderrorSetErrorStyle(eField,sErrorMessage);eField.scrollIntoView();lelementFocus(eField)}
function lelementRemove(e){if(!e){LRDFAULT('The element you\'re trying to remove doesn\'t exist');return}
if(!e.parentNode){LRDFAULT('The parent element of what you\'re trying to remove can\'t be found');return}
e.parentNode.removeChild(e)}
function lelementClassListRemove(e,sClass){if(!e){LRDFAULT("lelementClassListRemove called on invalid element");return}
if(typeof sClass!=='string'){LRDFAULT("lelementClassListRemove class is not a string");return}
e.classList.remove(sClass)}
function lfielderrorClear(eField){if(!eField){LRDFAULT("lfielderrorClear called on invalid element");return}
lelementClassListRemove(eField,'field-error');eField.style.removeProperty('background');eField.style.removeProperty('border');if(!eField.eMessage){return}
lelementRemove(eField.eMessage)}
function lfielderrorClearAll(){var aInputFields=document.querySelectorAll('.field-error');if(!aInputFields){return}
for(var i=0;i=300)&&(errorcode<=399)){if(rd.errorredirect){window.location.href=rd.errorredirect}return}
if(errorcode>=400){if(eh!==undefined)eh(rd);return}
if(cb!==undefined)cb(rd)}
function _lscriptCallNodeResultHandler(rd,cb){if(typeof cb!=='function'){return}
_lscriptCallResultHandler(rd,function(){cb(null,rd)},function(){cb(rd)})}
function lscriptCallNodeResultJSONHandler(script,sd,cb){lscriptCallResultJSON(script,sd,function(rd){_lscriptCallNodeResultHandler(rd,cb)})}
function bfeedbackPageInit(){lscriptCallNodeResultJSONHandler('/api/account/issessionvalid','',function(err,res){if(res.issessionvalid){return}
window.open("mailto:feedback@brisktable.com?subject=Brisk Table Feedback");window.close()})}
function bfeedbackSubmit(){lfielderrorClearAll();var eFeedbackContent=lgetElementByIdSafe('feedback_content');var feedback=lelementValueGetAndTrim(eFeedbackContent,'');if(feedback===''){lfielderrorSet(eFeedbackContent,'Please enter your feedback');return}
var sendData={feedback__agent:window.navigator.userAgent,feedback__os:window.navigator.platform,feedback__text:encodeURIComponent(feedback)};lutilsLoadingSpinnerAdd('form_feedback');lscriptCallJSONNodeResultHandler('/lfeedbacksend',sendData,function(err){lutilsLoadingSpinnerRemove('form_feedback');if(err){lfielderrorSet(eFeedbackContent,err.errormsg);return}
bfeedbackCBSent()})}
function bfeedbackCBSent(){lelementValueSetById('feedback_content','');lalertOkInfo('Thank you for your feedback! We are continuously striving to improve Brisk Cloudware products and value your feedback.','Feedback Sent','Return to Brisk Table',function(){window.close()})}
bfeedbackPageInit();