{"version":3,"sources":["../../node_modules/@babel/runtime/regenerator/index.js","../../node_modules/regenerator-runtime/runtime.js","../../build/js/FormData.js","../../build/js/Validators.js","../../node_modules/@babel/runtime/helpers/createClass.js","../../node_modules/@babel/runtime/helpers/assertThisInitialized.js","../../node_modules/@babel/runtime/helpers/setPrototypeOf.js","../../node_modules/@babel/runtime/helpers/inheritsLoose.js","../../node_modules/@babel/runtime/helpers/defineProperty.js","../../node_modules/@babel/runtime/helpers/asyncToGenerator.js","../../build/js/FormBase.js","../../build/js/Field.js","../../build/js/Form.js","../../build/js/AjaxLookup.js","../../build/js/SelectionListOption.js","../../build/js/AutoSuggest.js","../../build/js/Forms.js","../../build/js/functions.js","../../build/js/Select2CustomOption.js","../../build/js/main.js","../../build/js/multipage.js","../../build/js/jquery.js","../../build/js/fields.js","../../build/js/adminlte.js"],"names":["regenerator","runtime","exports","undefined","Op","Object","prototype","hasOwn","hasOwnProperty","$Symbol","Symbol","iteratorSymbol","iterator","asyncIteratorSymbol","asyncIterator","toStringTagSymbol","toStringTag","define","obj","key","value","defineProperty","enumerable","configurable","writable","err","wrap","innerFn","outerFn","self","tryLocsList","protoGenerator","Generator","generator","create","context","Context","_invoke","state","GenStateSuspendedStart","method","arg","GenStateExecuting","Error","GenStateCompleted","doneResult","delegate","delegateResult","maybeInvokeDelegate","ContinueSentinel","sent","_sent","dispatchException","abrupt","record","tryCatch","type","done","GenStateSuspendedYield","makeInvokeMethod","fn","call","GeneratorFunction","GeneratorFunctionPrototype","IteratorPrototype","this","getProto","getPrototypeOf","NativeIteratorPrototype","values","Gp","defineIteratorMethods","forEach","AsyncIterator","PromiseImpl","invoke","resolve","reject","result","__await","then","unwrapped","error","previousPromise","callInvokeWithMethodAndArg","TypeError","info","resultName","next","nextLoc","pushTryEntry","locs","entry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","push","resetTryEntry","completion","reset","iterable","iteratorMethod","isNaN","length","i","constructor","displayName","isGeneratorFunction","genFun","ctor","name","mark","setPrototypeOf","__proto__","awrap","async","Promise","iter","toString","keys","object","reverse","pop","skipTempReset","prev","charAt","slice","stop","rootRecord","rval","exception","handle","loc","caught","hasCatch","hasFinally","finallyEntry","complete","finish","catch","thrown","delegateYield","module","regeneratorRuntime","accidentalStrictMode","Function","Blob","FormData","normalizeValue","_ref","filename","File","lastModified","ensureArgs","args","expected","normalizeArgs","String","each","arr","cb","global","window","_FormData","_send","XMLHttpRequest","send","_fetch","Request","fetch","_sendBeacon","navigator","sendBeacon","stringTag","a","b","d","c","blob","t","Date","defineProperties","lastModifiedDate","FormDataPolyfill","form","_data","elements","elm","disabled","files","file","append","options","opt","selected","checked","replace","normalizeLinefeeds","_proto","arguments","_normalizeArgs$apply","apply","map","delete","entries","_iterator","_step","_context","t0","t1","_createForOfIteratorHelperLoose$3","callback","thisArg","_step2","_iterator2","_step2$value","get","getAll","has","_iterator3","_step3","_step3$value","_context2","set","_iterator4","_step4","_step4$value","_context3","_step5","fd","_iterator5","_step5$value","_step6","boundary","Math","random","chunks","_iterator6","_step6$value","setRequestHeader","toLowerCase","_hasContentType","data","input","init","body","url","el","ew","checkInteger","userLevelId","language","phrase","parseInt","id","elId","document","getElementById","trim","level","sameText","userLevelName","includes","fieldName","_$el$data","$el","$","$p","closest","substr","css","hasValue","required","elFn","fileRequired","startsWith","elPwd","mismatchPassword","x","z","val","between","isMaskedPassword","hasClass","passwordStrength","raw","match","RegExp","escapeRegExChars","INVALID_USERNAME_CHARACTERS","username","ENCRYPTED_PASSWORD","INVALID_PASSWORD_CHARACTERS","password","getValue","checkEmail","email","cnt","checkEmails","dateFormat","phraseId","newSubStr","DATE_SEPARATOR","checkShortDate","checkDate","checkShortEuroDate","checkEuroDate","checkShortUSDate","checkUSDate","checkDateDef","DATE_FORMAT","datetime","checkTime","time","checkNumber","min","max","checkRange","range","integer","checkPhone","phone","checkZip","zip","checkCreditCard","creditCard","checkSsn","ssn","checkGuid","guid","pattern","checkByRegEx","regex","_len","Array","_key","concat","custom","captcha","_grecaptcha","grecaptcha","getResponse","dataset","recaptcha","_defineProperties","target","props","descriptor","Constructor","protoProps","staticProps","__esModule","ReferenceError","_setPrototypeOf","o","p","subClass","superClass","asyncGeneratorStep","gen","_next","_throw","FormBase","pageId","_initiated","$element","htmlForm","initSearchPanel","modified","validateRequired","validate","emptyRow","multiPage","autoSuggests","lists","disableForm","getForm","find","prop","addClass","enableForm","$form","removeClass","appendHidden","$dp","attr","ar","serializeArray","appendTo","canSubmit","updateTextArea","$dps","dp","j","test","$els","not","submit","_asyncToGenerator","_callee","e","action","f","trigger","isBoolean","isObject","_x","_x2","getList","compileTemplates","_i","_lists","list","template","isString","templates","is","getElement","getElements","selector","updateLists","rowindex","isNumber","confirm","querySelector","removeSpinner","fixId","multiple","split","prefix","endsWith","_ref2","join","actions","promises","_i2","_Object$entries","_Object$entries$_i","parents","parentFields","parent","ajax","pvalues","getOptionValues","updateOptions","setTimeout","shift","AJAX_DELAY","all","source","console","log","createAutoSuggest","settings","assign","limit","AUTO_SUGGEST_MAX_ENTRIES","autoSuggestSettings","AutoSuggest","initEditors","filter","ed","active","save","destroyEditor","destroy","onError","msg","initUpload","index","later","upload","setupFilters","filters","filterList","$sf","toggleClass","$df","$delete","$save","saveFilters","SEARCH_FILTER_OPTION","localStorage","setItem","JSON","stringify","$body","currentPage","dataType","success","always","off","on","prompt","sanitize","prevAll","remove","$submenu","isArray","splice","insertBefore","TOKEN_NAME_KEY","TOKEN_NAME","ANTIFORGERY_TOKEN_KEY","ANTIFORGERY_TOKEN","IS_LOGGEDIN","IS_SYS_ADMIN","CURRENT_USER_NAME","item","getItem","parseJson","grep","show","hide","isSearch","hasFormData","collapse","text","render","loadjs","ready","bind","$tab","getAttribute","$panel","$container","width","CONFIRM_CANCEL","href","location","forms","add","Field","fldvar","validators","invalid","_defineProperty","_createForOfIteratorHelperLoose$2","validator","addValidator","addError","_this$_error","_error","_objectSpread$2","clearErrors","clearValidators","_element","shouldValidate","updateFeedback","errorMessage","jQuery","html","setInvalid","focus","setFocus","from","_checkbox","_this$_element","_this$_element$id","Form","_this","_FormBase","_assertThisInitialized","addField","fields","getField","addFields","_createForOfIteratorHelperLoose$1","field","addCustomError","makeVisible","element","gotoPageByElement","$pane","click","validateFields","rowIndex","row","_Object$values","_objectSpread$1","_i3","_Object$values2","AjaxLookup","elementId","formElement","m","pf","debounce","recordCount","formatResult","isAutoSuggest","jsRenderHelpers","displayValue","generateRequest","page","LANGUAGE_ID","getUserParams","arp","MULTIPLE_OPTION_SEPARATOR","getUrl","query","start","params","URLSearchParams","q","n","rnd","getApiUrl","API_LOOKUP_ACTION","prepare","transform","results","totalRecordCount","records","_isAutoSuggest","SelectionListOption","emptyObj","typeahead","timer","$input","minWidth","maxHeight","highlight","hint","minLength","delay","display","forceSelection","forceSelect","setValue","v","findIndex","option","lf","syncResults","asyncResults","cancel","count","menu","$node","more","ta","datasets","_append","scrollTop","$lastSuggestion","outerHeight","isOpen","empty","$item","getActiveSelectable","close","tpl","$more","one","preventDefault","stopPropagation","$menu","$dataset","max-height","overflow-y","Forms","_forms","ids","_fixLayoutHeightTimer","currentUrl","URL","$document","_removeSpinner","initIcons","tooltip","container","IS_MOBILE","placement","sanitizeFn","initPasswordOptions","pStrength","MIN_PASSWORD_STRENGTH","$this","changeBackground","backgrounds","passwordValidFrom","onPasswordStrengthChanged","strength","percentage","$pst","$pb","outerWidth","pct","pGenerator","passwordLength","GENERATE_PASSWORD_LENGTH","uppercase","GENERATE_PASSWORD_UPPERCASE","lowercase","GENERATE_PASSWORD_LOWERCASE","numbers","GENERATE_PASSWORD_NUMBER","specialChars","GENERATE_PASSWORD_SPECIALCHARS","onPasswordGenerated","pwd","triggerHandler","PATH_BASE","API_URL","qs","route","encodeURIComponent","sanitizeUrl","search","searchParams","initExportLinks","fileDownload","initMultiSelectCheckboxes","$cbs","_update","len","win","jq","swal","Swal","doc","$doc","isHtml","fire","_objectSpread","sweetAlertSettings","allowOutsideClick","allowEscapeKey","onBeforeOpen","showLoading","cache","xhrFields","responseType","textStatus","jqXHR","createObjectURL","createElement","getResponseHeader","style","download","appendChild","objectUrl","revokeObjectURL","fail","showValidationMessage","response","lazyLoad","LAZY_LOAD","src","initLightboxes","USE_COLORBOX","lightboxSettings","title","current","previous","xhrError","imgError","colorbox","rel","initPdfObjects","EMBED_PDF","PDFObjectOptions","PDFObject","embed","fallbackLink","initTooltips","popover","parse","isFunction","_prompt","confirmButtonText","showCancelButton","cancelButtonText","inputValidator","toast","toastOptions","Toasts","position","toUpperCase","substring","children","first","showToast","class","autohide","autoHideSuccessMessage","autoHideSuccessMessageDelay","$f","parentId","change","isUndefined","childFields","promise","els","getId","names","$elf","typ","elf","_updateOptions","autoFillTargetFields","autoFill","fo","frmo","$obj","clearOptions","addOpt","valid","newOption","selectOption","_updateSibling","lookupOptions","ds","isModalLookup","root","convertToBool","_export","sel","fobj","keySelected","_alert","serialize","end","isHiddenTextArea","isHidden","selectAll","setColor","$row","$tbl","ROWTYPE_ADD","ROWTYPE_EDIT","clearSelected","tbl","rows","r","$r","clearDelete","$tr","siblings","addBack","clickDelete","setupTable","force","$rows","tBodies","mouseOver","mouseOut","$target","cells","last","div","parentsUntil","RESPONSIVE_TABLE_CLASS","rowSpan","clientHeight","offsetHeight","attach","edit","sw","setupGrid","grid","$grid","USE_OVERLAY_SCROLLBARS","overlayScrollbars","overlayScrollbarsOptions","table","getAncestorBy","node","parentNode","nodeType","classList","contains","o1","o2","lookup","getOptionTexts","lo","hasAttribute","removeAll","valueSeparator","sep","df","isValue","optionHtml","OPTION_HTML_TEMPLATE","optionsHtml","MAX_OPTION_COUNT","frm","df1","df2","df3","df4","innerHTML","selectedIndex","_createForOfIteratorHelperLoose","vals","opts","isAutoSelect","_ajaxStop","lastPageSubmit","executeScript","matches","matchAll","addScript","stripScript","scr","removeScript","getContent","getOptions","modalDialogHide","$dlg","removeData","$bd","ewjtable","className","reload","dest_array","destEl","v0","pid","post","$tt","trig","dir","CSS_FLIP","content","wd","$tip","getTipElement","object_value","checkDateEx","format","arDT","re","sYear","sMonth","sDay","exec","wrksep","arD","unformatYear","checkDay","yr","UNFORMAT_YEAR","checkYear","checkMonth","maxDay","ts","THOUSANDS_SEP","DECIMAL_POINT","stringToFloat","parseFloat","str","min_value","max_value","isNull","TIME_SEPARATOR","showMessage","_arg$target","$div","$alert","$heading","detach","$content","w","$toast","floor","redirect","newUrl","ajaxSend","event","jqxhr","apiUrl","isApi","allowed","hostname","API_JWT_TOKEN","IS_WINDOWS_AUTHENTICATION","API_JWT_AUTHORIZATION_HEADER","ajaxStart","addSpinner","ajaxStop","ajaxError","selectId","select2","amd","require","Utils","ResultsList","InfiniteScroll","HidePlaceholder","SelectOnClose","selectOptions","resultsAdapter","dropdown","columns","customOption","Decorate","Select2CustomOption","decorated","$results","displayMessage","escapeMarkup","clear","hideLoading","$message","message","sort","cols","$option","attrs","role","aria-selected","Element","msMatchesSelector","webkitMatchesSelector","_resultId","setAttribute","StoreData","getSelect2CustomOptionClass","iconClass","templateResult","placeholder","selectOnClose","term","processResults","pagination","minimumResultsForSearch","Infinity","timeoutTime","keepAliveTimer","counter","useKeepAlive","SESSION_KEEP_ALIVE_INTERVAL","IS_AUTOLOGIN","keepAlive","API_SESSION_ACTION","token","resetTimer","SESSION_TIMEOUT_COUNTDOWN","SESSION_TIMEOUT","timeout","timerInterval","showConfirmButton","timerProgressBar","setInterval","sec","timeleft","round","getTimerLeft","textContent","onClose","clearInterval","setTimer","dismiss","DismissReason","TIMEOUT_URL","keepAliveInterval","select","_positionDropdown","_resizeDropdown","parm","$fld","$fld2","hasY","$cond","hasCond","$and","opr","$opr2","opr2","isBetween","isNullOpr","isNullOpr2","hideOpr2","hideX","hideY","divId","tmplId","classId","exportType","export","enabled","replaceWith","querySelectorAll","subtmpl","rowspan","childNodes","views","hasTag","jsRenderAttributes","scripts","tmpl","$meta","PDF_STYLESHEET_FILENAME","PROJECT_STYLESHEET_FILENAME","responseText","customexport","param","idx","infix","fld","bool","nelm","oelm","fnelm","srcElement","currentForm","isPost","isMultiple","_success","_submit","k","jquery","shiftKey","ctrlKey","$cb","$tpl","$lastrow","clone","suffix","$elkeycnt","keycnt","data-rowindex","attributes","after","scrollHeight","rowidx","keycntname","_delete","$keyact","addOptionDialog","_submitSuccess","_results","lnk","objName","API_OBJECT_NAME","modal","linkField","dfs","displayFields","ffs","filterFields","pfs","lfv","ff","txt","$lu","nv","arOpt","obj2","ar2","_results2","_results$error","description","_results3","failureMessage","_fail","status","statusText","btn","$btn","API_ADD_ACTION","filterFieldVars","nodeName","modalDialog","showing","size","_caption","$lnk","caption","_button","_always","handleResult","pathname","_current","view","warningMessage","successMessage","_result$error","_result$error2","footer","cf","ct","alert","modalLookupDialog","_timer","$search","oid","_format","setAutoSuggest","txts","useText","srch","arLinkValue","linkValue","paging","pageSize","pageSizes","pageSizeChangeArea","pageList","selecting","selectingCheckboxes","multiselect","listAction","postData","jtParams","recperpage","messages","serverCommunicationError","loadingMessage","spinnerClass","noDataAvailable","pagingInfo","pageSizeChangeLabel","gotoPageLabel","recordsLoaded","selectedRows","selectionChanged","indexOf","toggle","LOOKUP_DELAY","sv","importDialog","$data","$progress","classname","$msg","hideMessage","showProgress","pc","updateProgress","tcnt","totalCount","importProgress","API_PROGRESS_ACTION","API_FILE_TOKEN_NAME","importComplete","fileResults","fileResult","scnt","successCount","fcnt","failCount","showLog","failList","ecnt","importFail","formData","session","SESSION_ID","importUploadOptions","acceptFileTypes","IMPORT_FILE_ALLOWED_EXT","fileupload","API_UPLOAD_ACTION","autoUpload","singleFileUploads","maxFileSize","maxNumberOfFiles","minFileSize","beforeSend","importfiles","ok","filetoken","API_ACTION_NAME","xhr","importFiles","processfail","errorThrown","progressall","loaded","total","uploadProgress","hdr","emailDialog","Validators","emails","MAX_EMAIL_RECIPIENT","exportid","exportWithCharts","arUrl","pos","height","ypos","offset","top","pageY","xpos","left","pageX","drillDownCharts","cht","dispose","_convert","API_LIST_ACTION","API_VIEW_ACTION","API_DELETE_ACTION","responseJSON","creditcard_string","tempdigit","doubledigit","checkdigit","email_cnt","arEmails","nid","readonly","$ft","$fn","$fa","$fs","$exts","$maxsize","$maxfilecount","$label","label","_confirmDelete","_downloadTemplate","_uploadTemplate","uploadUrl","API_JQUERY_UPLOAD_ACTION","exts","maxsize","maxfilecount","multipart","loadImageFileTypes","loadVideoFileTypes","loadAudioFileTypes","filesContainer","uploadTemplateId","downloadTemplateId","uploadTemplate","downloadTemplate","previewMaxWidth","UPLOAD_THUMBNAIL_WIDTH","previewMaxHeight","UPLOAD_THUMBNAIL_HEIGHT","dropZone","pasteZone","readOnly","MULTIPLE_UPLOAD_SEPARATOR","originalEvent","fid","_data$files","l","_data$files2","_data$result","_data$result$files","_data$files3","updateDropdownPosition","Event","config","regexBits","separator","thousandsSeparator","decimalSeparator","decimal","isFinite","decIndex","newOutput","isNeg","output","decPlaces","decimalPlaces","decSep","thouSep","toFixed","lastIndexOf","makeArray","def","timesep","moment","$tables","initGridPanel","renderJsTemplates","initForms","adminlte","Treeview","_jQueryInterface","$window","IS_SCREEN_SM_MIN","$rpt","mh","toggleGroup","USE_JAVASCRIPT_MESSAGE","currentTarget","$i","exportId","exportUrl","now","exp","exportCharts","charts","toBase64Image","chart_engine","stream_type","stream","parameters","API_EXPORT_CHART_ACTION","layout","fixLayoutHeight","tblVar","events","fldVar","matchMedia","MOBILE_DETECT","MobileDetect","userAgent","mobile","IS_IE","version","MultiPage","formid","formID","pageIndex","maxPageIndex","minPageIndex","pageIndexes","$pages","$collapses","isTab","isCollapse","hideDisabledButton","hideInactivePages","lockTabs","hideTabs","showPagerTop","showPagerBottom","pagerTemplate","_show","_properties","before","pageShow","gotoPage","$page","eq","gotoPageByIndex","gotoPageByElementId","togglePage","$tabs","googleMaps","google","maps","setCenter","$bodies","functions","debugMode","DEBUG","setSessionTimer","initPage","hash","animate","zIndex","extend","isDate","when","periodic","interval","clearTimeout","rec","_this$data","visible","_this$data2","toNumber","parseNumber","toDate","parseDate","toJsDate","_toggle","$relativeTarget","treeviewMenu","$text"],"mappings":"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","sourcesContent":["module.exports = require(\"regenerator-runtime\");\n","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nvar runtime = (function (exports) {\n  \"use strict\";\n\n  var Op = Object.prototype;\n  var hasOwn = Op.hasOwnProperty;\n  var undefined; // More compressible than void 0.\n  var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n  var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n  var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n  var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n  function define(obj, key, value) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n    return obj[key];\n  }\n  try {\n    // IE 8 has a broken Object.defineProperty that only works on DOM objects.\n    define({}, \"\");\n  } catch (err) {\n    define = function(obj, key, value) {\n      return obj[key] = value;\n    };\n  }\n\n  function wrap(innerFn, outerFn, self, tryLocsList) {\n    // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n    var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n    var generator = Object.create(protoGenerator.prototype);\n    var context = new Context(tryLocsList || []);\n\n    // The ._invoke method unifies the implementations of the .next,\n    // .throw, and .return methods.\n    generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n    return generator;\n  }\n  exports.wrap = wrap;\n\n  // Try/catch helper to minimize deoptimizations. Returns a completion\n  // record like context.tryEntries[i].completion. This interface could\n  // have been (and was previously) designed to take a closure to be\n  // invoked without arguments, but in all the cases we care about we\n  // already have an existing method we want to call, so there's no need\n  // to create a new function object. We can even get away with assuming\n  // the method takes exactly one argument, since that happens to be true\n  // in every case, so we don't have to touch the arguments object. The\n  // only additional allocation required is the completion record, which\n  // has a stable shape and so hopefully should be cheap to allocate.\n  function tryCatch(fn, obj, arg) {\n    try {\n      return { type: \"normal\", arg: fn.call(obj, arg) };\n    } catch (err) {\n      return { type: \"throw\", arg: err };\n    }\n  }\n\n  var GenStateSuspendedStart = \"suspendedStart\";\n  var GenStateSuspendedYield = \"suspendedYield\";\n  var GenStateExecuting = \"executing\";\n  var GenStateCompleted = \"completed\";\n\n  // Returning this object from the innerFn has the same effect as\n  // breaking out of the dispatch switch statement.\n  var ContinueSentinel = {};\n\n  // Dummy constructor functions that we use as the .constructor and\n  // .constructor.prototype properties for functions that return Generator\n  // objects. For full spec compliance, you may wish to configure your\n  // minifier not to mangle the names of these two functions.\n  function Generator() {}\n  function GeneratorFunction() {}\n  function GeneratorFunctionPrototype() {}\n\n  // This is a polyfill for %IteratorPrototype% for environments that\n  // don't natively support it.\n  var IteratorPrototype = {};\n  IteratorPrototype[iteratorSymbol] = function () {\n    return this;\n  };\n\n  var getProto = Object.getPrototypeOf;\n  var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n  if (NativeIteratorPrototype &&\n      NativeIteratorPrototype !== Op &&\n      hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n    // This environment has a native %IteratorPrototype%; use it instead\n    // of the polyfill.\n    IteratorPrototype = NativeIteratorPrototype;\n  }\n\n  var Gp = GeneratorFunctionPrototype.prototype =\n    Generator.prototype = Object.create(IteratorPrototype);\n  GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n  GeneratorFunctionPrototype.constructor = GeneratorFunction;\n  GeneratorFunction.displayName = define(\n    GeneratorFunctionPrototype,\n    toStringTagSymbol,\n    \"GeneratorFunction\"\n  );\n\n  // Helper for defining the .next, .throw, and .return methods of the\n  // Iterator interface in terms of a single ._invoke method.\n  function defineIteratorMethods(prototype) {\n    [\"next\", \"throw\", \"return\"].forEach(function(method) {\n      define(prototype, method, function(arg) {\n        return this._invoke(method, arg);\n      });\n    });\n  }\n\n  exports.isGeneratorFunction = function(genFun) {\n    var ctor = typeof genFun === \"function\" && genFun.constructor;\n    return ctor\n      ? ctor === GeneratorFunction ||\n        // For the native GeneratorFunction constructor, the best we can\n        // do is to check its .name property.\n        (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n      : false;\n  };\n\n  exports.mark = function(genFun) {\n    if (Object.setPrototypeOf) {\n      Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n    } else {\n      genFun.__proto__ = GeneratorFunctionPrototype;\n      define(genFun, toStringTagSymbol, \"GeneratorFunction\");\n    }\n    genFun.prototype = Object.create(Gp);\n    return genFun;\n  };\n\n  // Within the body of any async function, `await x` is transformed to\n  // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n  // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n  // meant to be awaited.\n  exports.awrap = function(arg) {\n    return { __await: arg };\n  };\n\n  function AsyncIterator(generator, PromiseImpl) {\n    function invoke(method, arg, resolve, reject) {\n      var record = tryCatch(generator[method], generator, arg);\n      if (record.type === \"throw\") {\n        reject(record.arg);\n      } else {\n        var result = record.arg;\n        var value = result.value;\n        if (value &&\n            typeof value === \"object\" &&\n            hasOwn.call(value, \"__await\")) {\n          return PromiseImpl.resolve(value.__await).then(function(value) {\n            invoke(\"next\", value, resolve, reject);\n          }, function(err) {\n            invoke(\"throw\", err, resolve, reject);\n          });\n        }\n\n        return PromiseImpl.resolve(value).then(function(unwrapped) {\n          // When a yielded Promise is resolved, its final value becomes\n          // the .value of the Promise<{value,done}> result for the\n          // current iteration.\n          result.value = unwrapped;\n          resolve(result);\n        }, function(error) {\n          // If a rejected Promise was yielded, throw the rejection back\n          // into the async generator function so it can be handled there.\n          return invoke(\"throw\", error, resolve, reject);\n        });\n      }\n    }\n\n    var previousPromise;\n\n    function enqueue(method, arg) {\n      function callInvokeWithMethodAndArg() {\n        return new PromiseImpl(function(resolve, reject) {\n          invoke(method, arg, resolve, reject);\n        });\n      }\n\n      return previousPromise =\n        // If enqueue has been called before, then we want to wait until\n        // all previous Promises have been resolved before calling invoke,\n        // so that results are always delivered in the correct order. If\n        // enqueue has not been called before, then it is important to\n        // call invoke immediately, without waiting on a callback to fire,\n        // so that the async generator function has the opportunity to do\n        // any necessary setup in a predictable way. This predictability\n        // is why the Promise constructor synchronously invokes its\n        // executor callback, and why async functions synchronously\n        // execute code before the first await. Since we implement simple\n        // async functions in terms of async generators, it is especially\n        // important to get this right, even though it requires care.\n        previousPromise ? previousPromise.then(\n          callInvokeWithMethodAndArg,\n          // Avoid propagating failures to Promises returned by later\n          // invocations of the iterator.\n          callInvokeWithMethodAndArg\n        ) : callInvokeWithMethodAndArg();\n    }\n\n    // Define the unified helper method that is used to implement .next,\n    // .throw, and .return (see defineIteratorMethods).\n    this._invoke = enqueue;\n  }\n\n  defineIteratorMethods(AsyncIterator.prototype);\n  AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n    return this;\n  };\n  exports.AsyncIterator = AsyncIterator;\n\n  // Note that simple async functions are implemented on top of\n  // AsyncIterator objects; they just return a Promise for the value of\n  // the final result produced by the iterator.\n  exports.async = function(innerFn, outerFn, self, tryLocsList, PromiseImpl) {\n    if (PromiseImpl === void 0) PromiseImpl = Promise;\n\n    var iter = new AsyncIterator(\n      wrap(innerFn, outerFn, self, tryLocsList),\n      PromiseImpl\n    );\n\n    return exports.isGeneratorFunction(outerFn)\n      ? iter // If outerFn is a generator, return the full iterator.\n      : iter.next().then(function(result) {\n          return result.done ? result.value : iter.next();\n        });\n  };\n\n  function makeInvokeMethod(innerFn, self, context) {\n    var state = GenStateSuspendedStart;\n\n    return function invoke(method, arg) {\n      if (state === GenStateExecuting) {\n        throw new Error(\"Generator is already running\");\n      }\n\n      if (state === GenStateCompleted) {\n        if (method === \"throw\") {\n          throw arg;\n        }\n\n        // Be forgiving, per 25.3.3.3.3 of the spec:\n        // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n        return doneResult();\n      }\n\n      context.method = method;\n      context.arg = arg;\n\n      while (true) {\n        var delegate = context.delegate;\n        if (delegate) {\n          var delegateResult = maybeInvokeDelegate(delegate, context);\n          if (delegateResult) {\n            if (delegateResult === ContinueSentinel) continue;\n            return delegateResult;\n          }\n        }\n\n        if (context.method === \"next\") {\n          // Setting context._sent for legacy support of Babel's\n          // function.sent implementation.\n          context.sent = context._sent = context.arg;\n\n        } else if (context.method === \"throw\") {\n          if (state === GenStateSuspendedStart) {\n            state = GenStateCompleted;\n            throw context.arg;\n          }\n\n          context.dispatchException(context.arg);\n\n        } else if (context.method === \"return\") {\n          context.abrupt(\"return\", context.arg);\n        }\n\n        state = GenStateExecuting;\n\n        var record = tryCatch(innerFn, self, context);\n        if (record.type === \"normal\") {\n          // If an exception is thrown from innerFn, we leave state ===\n          // GenStateExecuting and loop back for another invocation.\n          state = context.done\n            ? GenStateCompleted\n            : GenStateSuspendedYield;\n\n          if (record.arg === ContinueSentinel) {\n            continue;\n          }\n\n          return {\n            value: record.arg,\n            done: context.done\n          };\n\n        } else if (record.type === \"throw\") {\n          state = GenStateCompleted;\n          // Dispatch the exception by looping back around to the\n          // context.dispatchException(context.arg) call above.\n          context.method = \"throw\";\n          context.arg = record.arg;\n        }\n      }\n    };\n  }\n\n  // Call delegate.iterator[context.method](context.arg) and handle the\n  // result, either by returning a { value, done } result from the\n  // delegate iterator, or by modifying context.method and context.arg,\n  // setting context.delegate to null, and returning the ContinueSentinel.\n  function maybeInvokeDelegate(delegate, context) {\n    var method = delegate.iterator[context.method];\n    if (method === undefined) {\n      // A .throw or .return when the delegate iterator has no .throw\n      // method always terminates the yield* loop.\n      context.delegate = null;\n\n      if (context.method === \"throw\") {\n        // Note: [\"return\"] must be used for ES3 parsing compatibility.\n        if (delegate.iterator[\"return\"]) {\n          // If the delegate iterator has a return method, give it a\n          // chance to clean up.\n          context.method = \"return\";\n          context.arg = undefined;\n          maybeInvokeDelegate(delegate, context);\n\n          if (context.method === \"throw\") {\n            // If maybeInvokeDelegate(context) changed context.method from\n            // \"return\" to \"throw\", let that override the TypeError below.\n            return ContinueSentinel;\n          }\n        }\n\n        context.method = \"throw\";\n        context.arg = new TypeError(\n          \"The iterator does not provide a 'throw' method\");\n      }\n\n      return ContinueSentinel;\n    }\n\n    var record = tryCatch(method, delegate.iterator, context.arg);\n\n    if (record.type === \"throw\") {\n      context.method = \"throw\";\n      context.arg = record.arg;\n      context.delegate = null;\n      return ContinueSentinel;\n    }\n\n    var info = record.arg;\n\n    if (! info) {\n      context.method = \"throw\";\n      context.arg = new TypeError(\"iterator result is not an object\");\n      context.delegate = null;\n      return ContinueSentinel;\n    }\n\n    if (info.done) {\n      // Assign the result of the finished delegate to the temporary\n      // variable specified by delegate.resultName (see delegateYield).\n      context[delegate.resultName] = info.value;\n\n      // Resume execution at the desired location (see delegateYield).\n      context.next = delegate.nextLoc;\n\n      // If context.method was \"throw\" but the delegate handled the\n      // exception, let the outer generator proceed normally. If\n      // context.method was \"next\", forget context.arg since it has been\n      // \"consumed\" by the delegate iterator. If context.method was\n      // \"return\", allow the original .return call to continue in the\n      // outer generator.\n      if (context.method !== \"return\") {\n        context.method = \"next\";\n        context.arg = undefined;\n      }\n\n    } else {\n      // Re-yield the result returned by the delegate method.\n      return info;\n    }\n\n    // The delegate iterator is finished, so forget it and continue with\n    // the outer generator.\n    context.delegate = null;\n    return ContinueSentinel;\n  }\n\n  // Define Generator.prototype.{next,throw,return} in terms of the\n  // unified ._invoke helper method.\n  defineIteratorMethods(Gp);\n\n  define(Gp, toStringTagSymbol, \"Generator\");\n\n  // A Generator should always return itself as the iterator object when the\n  // @@iterator function is called on it. Some browsers' implementations of the\n  // iterator prototype chain incorrectly implement this, causing the Generator\n  // object to not be returned from this call. This ensures that doesn't happen.\n  // See https://github.com/facebook/regenerator/issues/274 for more details.\n  Gp[iteratorSymbol] = function() {\n    return this;\n  };\n\n  Gp.toString = function() {\n    return \"[object Generator]\";\n  };\n\n  function pushTryEntry(locs) {\n    var entry = { tryLoc: locs[0] };\n\n    if (1 in locs) {\n      entry.catchLoc = locs[1];\n    }\n\n    if (2 in locs) {\n      entry.finallyLoc = locs[2];\n      entry.afterLoc = locs[3];\n    }\n\n    this.tryEntries.push(entry);\n  }\n\n  function resetTryEntry(entry) {\n    var record = entry.completion || {};\n    record.type = \"normal\";\n    delete record.arg;\n    entry.completion = record;\n  }\n\n  function Context(tryLocsList) {\n    // The root entry object (effectively a try statement without a catch\n    // or a finally block) gives us a place to store values thrown from\n    // locations where there is no enclosing try statement.\n    this.tryEntries = [{ tryLoc: \"root\" }];\n    tryLocsList.forEach(pushTryEntry, this);\n    this.reset(true);\n  }\n\n  exports.keys = function(object) {\n    var keys = [];\n    for (var key in object) {\n      keys.push(key);\n    }\n    keys.reverse();\n\n    // Rather than returning an object with a next method, we keep\n    // things simple and return the next function itself.\n    return function next() {\n      while (keys.length) {\n        var key = keys.pop();\n        if (key in object) {\n          next.value = key;\n          next.done = false;\n          return next;\n        }\n      }\n\n      // To avoid creating an additional object, we just hang the .value\n      // and .done properties off the next function object itself. This\n      // also ensures that the minifier will not anonymize the function.\n      next.done = true;\n      return next;\n    };\n  };\n\n  function values(iterable) {\n    if (iterable) {\n      var iteratorMethod = iterable[iteratorSymbol];\n      if (iteratorMethod) {\n        return iteratorMethod.call(iterable);\n      }\n\n      if (typeof iterable.next === \"function\") {\n        return iterable;\n      }\n\n      if (!isNaN(iterable.length)) {\n        var i = -1, next = function next() {\n          while (++i < iterable.length) {\n            if (hasOwn.call(iterable, i)) {\n              next.value = iterable[i];\n              next.done = false;\n              return next;\n            }\n          }\n\n          next.value = undefined;\n          next.done = true;\n\n          return next;\n        };\n\n        return next.next = next;\n      }\n    }\n\n    // Return an iterator with no values.\n    return { next: doneResult };\n  }\n  exports.values = values;\n\n  function doneResult() {\n    return { value: undefined, done: true };\n  }\n\n  Context.prototype = {\n    constructor: Context,\n\n    reset: function(skipTempReset) {\n      this.prev = 0;\n      this.next = 0;\n      // Resetting context._sent for legacy support of Babel's\n      // function.sent implementation.\n      this.sent = this._sent = undefined;\n      this.done = false;\n      this.delegate = null;\n\n      this.method = \"next\";\n      this.arg = undefined;\n\n      this.tryEntries.forEach(resetTryEntry);\n\n      if (!skipTempReset) {\n        for (var name in this) {\n          // Not sure about the optimal order of these conditions:\n          if (name.charAt(0) === \"t\" &&\n              hasOwn.call(this, name) &&\n              !isNaN(+name.slice(1))) {\n            this[name] = undefined;\n          }\n        }\n      }\n    },\n\n    stop: function() {\n      this.done = true;\n\n      var rootEntry = this.tryEntries[0];\n      var rootRecord = rootEntry.completion;\n      if (rootRecord.type === \"throw\") {\n        throw rootRecord.arg;\n      }\n\n      return this.rval;\n    },\n\n    dispatchException: function(exception) {\n      if (this.done) {\n        throw exception;\n      }\n\n      var context = this;\n      function handle(loc, caught) {\n        record.type = \"throw\";\n        record.arg = exception;\n        context.next = loc;\n\n        if (caught) {\n          // If the dispatched exception was caught by a catch block,\n          // then let that catch block handle the exception normally.\n          context.method = \"next\";\n          context.arg = undefined;\n        }\n\n        return !! caught;\n      }\n\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        var record = entry.completion;\n\n        if (entry.tryLoc === \"root\") {\n          // Exception thrown outside of any try block that could handle\n          // it, so set the completion value of the entire function to\n          // throw the exception.\n          return handle(\"end\");\n        }\n\n        if (entry.tryLoc <= this.prev) {\n          var hasCatch = hasOwn.call(entry, \"catchLoc\");\n          var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n          if (hasCatch && hasFinally) {\n            if (this.prev < entry.catchLoc) {\n              return handle(entry.catchLoc, true);\n            } else if (this.prev < entry.finallyLoc) {\n              return handle(entry.finallyLoc);\n            }\n\n          } else if (hasCatch) {\n            if (this.prev < entry.catchLoc) {\n              return handle(entry.catchLoc, true);\n            }\n\n          } else if (hasFinally) {\n            if (this.prev < entry.finallyLoc) {\n              return handle(entry.finallyLoc);\n            }\n\n          } else {\n            throw new Error(\"try statement without catch or finally\");\n          }\n        }\n      }\n    },\n\n    abrupt: function(type, arg) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.tryLoc <= this.prev &&\n            hasOwn.call(entry, \"finallyLoc\") &&\n            this.prev < entry.finallyLoc) {\n          var finallyEntry = entry;\n          break;\n        }\n      }\n\n      if (finallyEntry &&\n          (type === \"break\" ||\n           type === \"continue\") &&\n          finallyEntry.tryLoc <= arg &&\n          arg <= finallyEntry.finallyLoc) {\n        // Ignore the finally entry if control is not jumping to a\n        // location outside the try/catch block.\n        finallyEntry = null;\n      }\n\n      var record = finallyEntry ? finallyEntry.completion : {};\n      record.type = type;\n      record.arg = arg;\n\n      if (finallyEntry) {\n        this.method = \"next\";\n        this.next = finallyEntry.finallyLoc;\n        return ContinueSentinel;\n      }\n\n      return this.complete(record);\n    },\n\n    complete: function(record, afterLoc) {\n      if (record.type === \"throw\") {\n        throw record.arg;\n      }\n\n      if (record.type === \"break\" ||\n          record.type === \"continue\") {\n        this.next = record.arg;\n      } else if (record.type === \"return\") {\n        this.rval = this.arg = record.arg;\n        this.method = \"return\";\n        this.next = \"end\";\n      } else if (record.type === \"normal\" && afterLoc) {\n        this.next = afterLoc;\n      }\n\n      return ContinueSentinel;\n    },\n\n    finish: function(finallyLoc) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.finallyLoc === finallyLoc) {\n          this.complete(entry.completion, entry.afterLoc);\n          resetTryEntry(entry);\n          return ContinueSentinel;\n        }\n      }\n    },\n\n    \"catch\": function(tryLoc) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.tryLoc === tryLoc) {\n          var record = entry.completion;\n          if (record.type === \"throw\") {\n            var thrown = record.arg;\n            resetTryEntry(entry);\n          }\n          return thrown;\n        }\n      }\n\n      // The context.catch method must only be called with a location\n      // argument that corresponds to a known catch block.\n      throw new Error(\"illegal catch attempt\");\n    },\n\n    delegateYield: function(iterable, resultName, nextLoc) {\n      this.delegate = {\n        iterator: values(iterable),\n        resultName: resultName,\n        nextLoc: nextLoc\n      };\n\n      if (this.method === \"next\") {\n        // Deliberately forget the last sent value so that we don't\n        // accidentally pass it on to the delegate.\n        this.arg = undefined;\n      }\n\n      return ContinueSentinel;\n    }\n  };\n\n  // Regardless of whether this script is executing as a CommonJS module\n  // or not, return the runtime object so that we can declare the variable\n  // regeneratorRuntime in the outer scope, which allows this module to be\n  // injected easily by `bin/regenerator --include-runtime script.js`.\n  return exports;\n\n}(\n  // If this script is executing as a CommonJS module, use module.exports\n  // as the regeneratorRuntime namespace. Otherwise create a new empty\n  // object. Either way, the resulting object will be used to initialize\n  // the regeneratorRuntime variable at the top of this file.\n  typeof module === \"object\" ? module.exports : {}\n));\n\ntry {\n  regeneratorRuntime = runtime;\n} catch (accidentalStrictMode) {\n  // This module should not be running in strict mode, so the above\n  // assignment should always work unless something is misconfigured. Just\n  // in case runtime.js accidentally runs in strict mode, we can escape\n  // strict mode using a global Function call. This could conceivably fail\n  // if a Content Security Policy forbids using Function, but in that case\n  // the proper solution is to fix the accidental strict mode problem. If\n  // you've misconfigured your bundler to force strict mode and applied a\n  // CSP to forbid Function, and you're not willing to fix either of those\n  // problems, please detail your unique predicament in a GitHub issue.\n  Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n}\n","/* global FormData self Blob File */\r\n/* eslint-disable no-inner-declarations */\r\n\r\nif (typeof Blob !== 'undefined' && (typeof FormData === 'undefined' || !FormData.prototype.keys)) {\r\n  const global = typeof window === 'object'\r\n    ? window\r\n    : typeof self === 'object' ? self : this\r\n\r\n  // keep a reference to native implementation\r\n  const _FormData = global.FormData\r\n\r\n  // To be monkey patched\r\n  const _send = global.XMLHttpRequest && global.XMLHttpRequest.prototype.send\r\n  const _fetch = global.Request && global.fetch\r\n  const _sendBeacon = global.navigator && global.navigator.sendBeacon\r\n\r\n  // Unable to patch Request constructor correctly\r\n  // const _Request = global.Request\r\n  // only way is to use ES6 class extend\r\n  // https://github.com/babel/babel/issues/1966\r\n\r\n  const stringTag = global.Symbol && Symbol.toStringTag\r\n\r\n  // Add missing stringTags to blob and files\r\n  if (stringTag) {\r\n    if (!Blob.prototype[stringTag]) {\r\n      Blob.prototype[stringTag] = 'Blob'\r\n    }\r\n\r\n    if ('File' in global && !File.prototype[stringTag]) {\r\n      File.prototype[stringTag] = 'File'\r\n    }\r\n  }\r\n\r\n  // Fix so you can construct your own File\r\n  try {\r\n    new File([], '') // eslint-disable-line\r\n  } catch (a) {\r\n    global.File = function File (b, d, c) {\r\n      const blob = new Blob(b, c)\r\n      const t = c && void 0 !== c.lastModified ? new Date(c.lastModified) : new Date()\r\n\r\n      Object.defineProperties(blob, {\r\n        name: {\r\n          value: d\r\n        },\r\n        lastModifiedDate: {\r\n          value: t\r\n        },\r\n        lastModified: {\r\n          value: +t\r\n        },\r\n        toString: {\r\n          value () {\r\n            return '[object File]'\r\n          }\r\n        }\r\n      })\r\n\r\n      if (stringTag) {\r\n        Object.defineProperty(blob, stringTag, {\r\n          value: 'File'\r\n        })\r\n      }\r\n\r\n      return blob\r\n    }\r\n  }\r\n\r\n  function normalizeValue ([value, filename]) {\r\n    if (value instanceof Blob) {\r\n      // Should always returns a new File instance\r\n      // console.assert(fd.get(x) !== fd.get(x))\r\n      value = new File([value], filename, {\r\n        type: value.type,\r\n        lastModified: value.lastModified\r\n      })\r\n    }\r\n\r\n    return value\r\n  }\r\n\r\n  function ensureArgs (args, expected) {\r\n    if (args.length < expected) {\r\n      throw new TypeError(`${expected} argument required, but only ${args.length} present.`)\r\n    }\r\n  }\r\n\r\n  function normalizeArgs (name, value, filename) {\r\n    return value instanceof Blob\r\n      // normalize name and filename if adding an attachment\r\n      ? [String(name), value, filename !== undefined\r\n        ? filename + '' // Cast filename to string if 3th arg isn't undefined\r\n        : typeof value.name === 'string' // if name prop exist\r\n          ? value.name // Use File.name\r\n          : 'blob'] // otherwise fallback to Blob\r\n\r\n      // If no attachment, just cast the args to strings\r\n      : [String(name), String(value)]\r\n  }\r\n\r\n  // normalize linefeeds for textareas\r\n  // https://html.spec.whatwg.org/multipage/form-elements.html#textarea-line-break-normalisation-transformation\r\n  function normalizeLinefeeds (value) {\r\n    return value.replace(/\\r\\n/g, '\\n').replace(/\\n/g, '\\r\\n')\r\n  }\r\n\r\n  function each (arr, cb) {\r\n    for (let i = 0; i < arr.length; i++) {\r\n      cb(arr[i])\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @implements {Iterable}\r\n   */\r\n  class FormDataPolyfill {\r\n    /**\r\n     * FormData class\r\n     *\r\n     * @param {HTMLElement=} form\r\n     */\r\n    constructor (form) {\r\n      this._data = Object.create(null)\r\n\r\n      if (!form) return this\r\n\r\n      const self = this\r\n\r\n      each(form.elements, elm => {\r\n        if (!elm.name || elm.disabled || elm.type === 'submit' || elm.type === 'button') return\r\n\r\n        if (elm.type === 'file') {\r\n          const files = elm.files && elm.files.length\r\n            ? elm.files\r\n            : [new File([], '', { type: 'application/octet-stream' })] // #78\r\n\r\n          each(files, file => {\r\n            self.append(elm.name, file)\r\n          })\r\n        } else if (elm.type === 'select-multiple' || elm.type === 'select-one') {\r\n          each(elm.options, opt => {\r\n            !opt.disabled && opt.selected && self.append(elm.name, opt.value)\r\n          })\r\n        } else if (elm.type === 'checkbox' || elm.type === 'radio') {\r\n          if (elm.checked) self.append(elm.name, elm.value)\r\n        } else {\r\n          const value = elm.type === 'textarea' ? normalizeLinefeeds(elm.value) : elm.value\r\n          self.append(elm.name, value)\r\n        }\r\n      })\r\n    }\r\n\r\n    /**\r\n     * Append a field\r\n     *\r\n     * @param   {string}           name      field name\r\n     * @param   {string|Blob|File} value     string / blob / file\r\n     * @param   {string=}          filename  filename to use with blob\r\n     * @return  {undefined}\r\n     */\r\n    append (name, value, filename) {\r\n      ensureArgs(arguments, 2)\r\n      ;[name, value, filename] = normalizeArgs.apply(null, arguments)\r\n      const map = this._data\r\n\r\n      if (!map[name]) map[name] = []\r\n\r\n      map[name].push([value, filename])\r\n    }\r\n\r\n    /**\r\n     * Delete all fields values given name\r\n     *\r\n     * @param   {string}  name  Field name\r\n     * @return  {undefined}\r\n     */\r\n    delete (name) {\r\n      ensureArgs(arguments, 1)\r\n      delete this._data[String(name)]\r\n    }\r\n\r\n    /**\r\n     * Iterate over all fields as [name, value]\r\n     *\r\n     * @return {Iterator}\r\n     */\r\n    * entries () {\r\n      const map = this._data\r\n\r\n      for (const name in map) {\r\n        for (const value of map[name]) {\r\n          yield [name, normalizeValue(value)]\r\n        }\r\n      }\r\n    }\r\n\r\n    /**\r\n     * Iterate over all fields\r\n     *\r\n     * @param   {Function}  callback  Executed for each item with parameters (value, name, thisArg)\r\n     * @param   {Object=}   thisArg   `this` context for callback function\r\n     * @return  {undefined}\r\n     */\r\n    forEach (callback, thisArg) {\r\n      ensureArgs(arguments, 1)\r\n      for (const [name, value] of this) {\r\n        callback.call(thisArg, value, name, this)\r\n      }\r\n    }\r\n\r\n    /**\r\n     * Return first field value given name\r\n     * or null if non existen\r\n     *\r\n     * @param   {string}  name      Field name\r\n     * @return  {string|File|null}  value Fields value\r\n     */\r\n    get (name) {\r\n      ensureArgs(arguments, 1)\r\n      const map = this._data\r\n      name = String(name)\r\n      return map[name] ? normalizeValue(map[name][0]) : null\r\n    }\r\n\r\n    /**\r\n     * Return all fields values given name\r\n     *\r\n     * @param   {string}  name  Fields name\r\n     * @return  {Array}         [{String|File}]\r\n     */\r\n    getAll (name) {\r\n      ensureArgs(arguments, 1)\r\n      return (this._data[String(name)] || []).map(normalizeValue)\r\n    }\r\n\r\n    /**\r\n     * Check for field name existence\r\n     *\r\n     * @param   {string}   name  Field name\r\n     * @return  {boolean}\r\n     */\r\n    has (name) {\r\n      ensureArgs(arguments, 1)\r\n      return String(name) in this._data\r\n    }\r\n\r\n    /**\r\n     * Iterate over all fields name\r\n     *\r\n     * @return {Iterator}\r\n     */\r\n    * keys () {\r\n      for (const [name] of this) {\r\n        yield name\r\n      }\r\n    }\r\n\r\n    /**\r\n     * Overwrite all values given name\r\n     *\r\n     * @param   {string}    name      Filed name\r\n     * @param   {string}    value     Field value\r\n     * @param   {string=}   filename  Filename (optional)\r\n     * @return  {undefined}\r\n     */\r\n    set (name, value, filename) {\r\n      ensureArgs(arguments, 2)\r\n      const args = normalizeArgs.apply(null, arguments)\r\n      this._data[args[0]] = [[args[1], args[2]]]\r\n    }\r\n\r\n    /**\r\n     * Iterate over all fields\r\n     *\r\n     * @return {Iterator}\r\n     */\r\n    * values () {\r\n      for (const [, value] of this) {\r\n        yield value\r\n      }\r\n    }\r\n\r\n    /**\r\n     * Return a native (perhaps degraded) FormData with only a `append` method\r\n     * Can throw if it's not supported\r\n     *\r\n     * @return {FormData}\r\n     */\r\n    ['_asNative'] () {\r\n      const fd = new _FormData()\r\n\r\n      for (const [name, value] of this) {\r\n        fd.append(name, value)\r\n      }\r\n\r\n      return fd\r\n    }\r\n\r\n    /**\r\n     * [_blob description]\r\n     *\r\n     * @return {Blob} [description]\r\n     */\r\n    ['_blob'] () {\r\n      const boundary = '----formdata-polyfill-' + Math.random()\r\n      const chunks = []\r\n\r\n      for (const [name, value] of this) {\r\n        chunks.push(`--${boundary}\\r\\n`)\r\n\r\n        if (value instanceof Blob) {\r\n          chunks.push(\r\n            `Content-Disposition: form-data; name=\"${name}\"; filename=\"${value.name}\"\\r\\n`,\r\n            `Content-Type: ${value.type || 'application/octet-stream'}\\r\\n\\r\\n`,\r\n            value,\r\n            '\\r\\n'\r\n          )\r\n        } else {\r\n          chunks.push(\r\n            `Content-Disposition: form-data; name=\"${name}\"\\r\\n\\r\\n${value}\\r\\n`\r\n          )\r\n        }\r\n      }\r\n\r\n      chunks.push(`--${boundary}--`)\r\n\r\n      return new Blob(chunks, {\r\n        type: 'multipart/form-data; boundary=' + boundary\r\n      })\r\n    }\r\n\r\n    /**\r\n     * The class itself is iterable\r\n     * alias for formdata.entries()\r\n     *\r\n     * @return  {Iterator}\r\n     */\r\n    [Symbol.iterator] () {\r\n      return this.entries()\r\n    }\r\n\r\n    /**\r\n     * Create the default string description.\r\n     *\r\n     * @return  {string} [object FormData]\r\n     */\r\n    toString () {\r\n      return '[object FormData]'\r\n    }\r\n  }\r\n\r\n  if (stringTag) {\r\n    /**\r\n     * Create the default string description.\r\n     * It is accessed internally by the Object.prototype.toString().\r\n     */\r\n    FormDataPolyfill.prototype[stringTag] = 'FormData'\r\n  }\r\n\r\n  // Patch xhr's send method to call _blob transparently\r\n  if (_send) {\r\n    const setRequestHeader = global.XMLHttpRequest.prototype.setRequestHeader\r\n\r\n    /**\r\n     * @param {string} name\r\n     * @param {string} value\r\n     * @returns {undefined}\r\n     * @see https://xhr.spec.whatwg.org/#dom-xmlhttprequest-setrequestheader\r\n     */\r\n    global.XMLHttpRequest.prototype.setRequestHeader = function (name, value) {\r\n      setRequestHeader.call(this, name, value)\r\n      if (name.toLowerCase() === 'content-type') this._hasContentType = true\r\n    }\r\n\r\n    /**\r\n     * @param {ArrayBuffer|ArrayBufferView|Blob|Document|FormData|string=} data\r\n     * @return {undefined}\r\n     * @see https://xhr.spec.whatwg.org/#the-send()-method\r\n     */\r\n    global.XMLHttpRequest.prototype.send = function (data) {\r\n      // need to patch send b/c old IE don't send blob's type (#44)\r\n      if (data instanceof FormDataPolyfill) {\r\n        const blob = data['_blob']()\r\n        if (!this._hasContentType) this.setRequestHeader('Content-Type', blob.type)\r\n        _send.call(this, blob)\r\n      } else {\r\n        _send.call(this, data)\r\n      }\r\n    }\r\n  }\r\n\r\n  // Patch fetch's function to call _blob transparently\r\n  if (_fetch) {\r\n    const _fetch = global.fetch\r\n\r\n    global.fetch = function (input, init) {\r\n      if (init && init.body && init.body instanceof FormDataPolyfill) {\r\n        init.body = init.body['_blob']()\r\n      }\r\n\r\n      return _fetch.call(this, input, init)\r\n    }\r\n  }\r\n\r\n  // Patch navigator.sendBeacon to use native FormData\r\n  if (_sendBeacon) {\r\n    global.navigator.sendBeacon = function (url, data) {\r\n      if (data instanceof FormDataPolyfill) {\r\n        data = data['_asNative']()\r\n      }\r\n      return _sendBeacon.call(this, url, data)\r\n    }\r\n  }\r\n\r\n  global['FormData'] = FormDataPolyfill\r\n}\r\n","import $ from 'jquery';\r\n\r\n/**\r\n * User level ID validator\r\n */\r\nexport function userLevelId(el) {\r\n    if (el && !ew.checkInteger(el.value))\r\n        return { userLevelId: ew.language.phrase(\"UserLevelIDInteger\") };\r\n    var level = parseInt(el.value, 10);\r\n    if (level < 1)\r\n        return { userLevelId: ew.language.phrase(\"UserLevelIDIncorrect\") };\r\n    return false;\r\n}\r\n\r\n/**\r\n * User level name validator\r\n * @param {string} id User ID Field input element ID\r\n */\r\nexport function userLevelName(id) {\r\n    return function(el) {\r\n        let elId = document.getElementById(\"x_\" + id);\r\n        if (elId && el) {\r\n            let name = el.value.trim(),\r\n                level = parseInt(elId.value.trim(), 10);\r\n            if (level === 0 && !ew.sameText(name, \"Default\")) {\r\n                return { userLevelName: ew.language.phrase(\"UserLevelDefaultName\") };\r\n            } else if (level === -1 && !ew.sameText(name, \"Administrator\")) {\r\n                return { userLevelName: ew.language.phrase(\"UserLevelAdministratorName\") };\r\n            } else if (level === -2 && !ew.sameText(name, \"Anonymous\")) {\r\n                return { userLevelName: ew.language.phrase(\"UserLevelAnonymousName\") };\r\n            } else if (level > 0 && [\"anonymous\", \"administrator\", \"default\"].includes(name.toLowerCase())) {\r\n                return { userLevelName: ew.language.phrase(\"UserLevelNameIncorrect\") };\r\n            }\r\n        }\r\n        return false;\r\n    };\r\n}\r\n\r\n/**\r\n * Required validator\r\n */\r\nexport function required(fieldName) {\r\n    return function(el) {\r\n        let $el = $(el),\r\n            $p = $el.closest(\"#r_\" + $el.data(\"field\")?.substr(2)); // Find the row\r\n        if (!$p[0])\r\n            $p = $el.closest(\"[id^=el]\"); // Find the span\r\n        if ($p.css(\"display\") == \"none\") { // Hidden by .visible()\r\n            return false;\r\n        }\r\n        if (el && !ew.hasValue(el)) {\r\n            return { required: ew.language.phrase(\"EnterRequiredField\").replace(\"%s\", fieldName) };\r\n        }\r\n        return false;\r\n    }\r\n}\r\n\r\n/**\r\n * File required validator\r\n */\r\nexport function fileRequired(fieldName) {\r\n    return function(el) {\r\n        let elFn = document.getElementById(\"fn_\" + el.id);\r\n        if (elFn && !ew.hasValue(elFn)) {\r\n            return { fileRequired: ew.language.phrase(\"EnterRequiredField\").replace(\"%s\", fieldName) };\r\n        }\r\n        return false;\r\n    }\r\n}\r\n\r\n/**\r\n * Mismatch password validator\r\n */\r\nexport function mismatchPassword(el) {\r\n    let id;\r\n    if (el.id.startsWith(\"c_\")) // Confirm Password field in Register page\r\n        id = el.id.replace(/^c_/, \"x_\");\r\n    else if (el.id == \"cpwd\") // Change Password page\r\n        id = \"npwd\";\r\n    let elPwd = document.getElementById(id);\r\n    if (el.value !== elPwd.value) {\r\n        return { mismatchPassword: ew.language.phrase(\"MismatchPassword\") };\r\n    }\r\n    return false;\r\n}\r\n\r\n/**\r\n * Between validator\r\n */\r\nexport function between(el) {\r\n    let x, z;\r\n    if (el.id.startsWith(\"y_\")) {\r\n        x = document.getElementById(el.id.replace(/^y_/, \"x_\"));\r\n        z = document.getElementById(el.id.replace(/^y_/, \"z_\"));\r\n    }\r\n    if (ew.hasValue(x) && $(z).val() == \"BETWEEN\" && !ew.hasValue(el)) {\r\n        return { between: ew.language.phrase(\"EnterValue2\") };\r\n    }\r\n    return false;\r\n}\r\n\r\n/**\r\n * Password strength validator\r\n */\r\nexport function passwordStrength(el) {\r\n    let $el = $(el);\r\n    if (!ew.isMaskedPassword(el) && $el.hasClass(\"ew-password-strength\") && !$el.data(\"validated\")) {\r\n        return { passwordStrength: ew.language.phrase(\"PasswordTooSimple\") };\r\n    }\r\n    return false;\r\n}\r\n\r\n/**\r\n * User name validator\r\n */\r\nexport function username(raw) {\r\n    return function(el) {\r\n        if (!raw && el.value.match(new RegExp('[' + ew.escapeRegExChars(ew.INVALID_USERNAME_CHARACTERS) + ']')))\r\n            return { username: ew.language.phrase(\"InvalidUsernameChars\") };\r\n        return false;\r\n    }\r\n}\r\n\r\n/**\r\n * Password validator\r\n */\r\nexport function password(raw) {\r\n    return function(el) {\r\n        if (!raw && !ew.ENCRYPTED_PASSWORD && el.value.match(new RegExp('[' + ew.escapeRegExChars(ew.INVALID_PASSWORD_CHARACTERS) + ']')))\r\n            return { password: ew.language.phrase(\"InvalidPasswordChars\") };\r\n        return false;\r\n    }\r\n}\r\n\r\n/**\r\n * Email validator\r\n */\r\nexport function email(el) {\r\n    let value = ew.getValue(el);\r\n    if (!ew.checkEmail(value)) {\r\n        return { email: ew.language.phrase(\"IncorrectEmail\") };\r\n    }\r\n    return false;\r\n}\r\n\r\n/**\r\n * Emails validator\r\n */\r\nexport function emails(cnt, err) {\r\n    return function(el) {\r\n        let value = ew.getValue(el);\r\n        if (!ew.checkEmails(value, cnt)) {\r\n            return { email: err };\r\n        }\r\n        return false;\r\n    }\r\n}\r\n\r\n/**\r\n * DateTime validator\r\n * @param {number} dateFormat DateTime format ID\r\n */\r\nexport function datetime(dateFormat) {\r\n    return function(el) {\r\n        let fn,\r\n            phraseId,\r\n            value = ew.getValue(el),\r\n            newSubStr = ew.DATE_SEPARATOR;\r\n        if ([12, 15, 115].includes(dateFormat)) {\r\n            fn = ew.checkShortDate;\r\n            phraseId = \"IncorrectShortDateYMD\";\r\n        } else if ([5, 9, 109].includes(dateFormat)) {\r\n            fn = ew.checkDate;\r\n            phraseId = \"IncorrectDateYMD\";\r\n        } else if ([14, 17, 117].includes(dateFormat)) {\r\n            fn = ew.checkShortEuroDate;\r\n            phraseId = \"IncorrectShortDateDMY\";\r\n        } else if ([7, 11, 111].includes(dateFormat)) {\r\n            fn = ew.checkEuroDate;\r\n            phraseId = \"IncorrectDateDMY\";\r\n        } else if ([13, 16, 116].includes(dateFormat)) {\r\n            fn = ew.checkShortUSDate;\r\n            phraseId = \"IncorrectShortDateMDY\";\r\n        } else if ([6, 10, 110].includes(dateFormat)) {\r\n            fn = ew.checkUSDate;\r\n            phraseId = \"IncorrectDateMDY\";\r\n        } else { // Default date format\r\n            fn = ew.checkDateDef;\r\n            phraseId = \"IncorrectDate\";\r\n            newSubStr = ew.DATE_FORMAT;\r\n        }\r\n        if (fn && !fn(value)) {\r\n            return { datetime: ew.language.phrase(phraseId).replace(/%s/g, newSubStr) };\r\n        }\r\n       return false;\r\n    };\r\n}\r\n\r\n/**\r\n * Time validator\r\n */\r\nexport function time(el) {\r\n    let value = ew.getValue(el);\r\n    if (!ew.checkTime(value)) {\r\n        return { time: ew.language.phrase(\"IncorrectTime\") };\r\n    }\r\n    return false;\r\n}\r\n\r\n/**\r\n * Float validator\r\n */\r\nexport function float(el) {\r\n    let value = ew.getValue(el);\r\n    if (!ew.checkNumber(value)) {\r\n        return { time: ew.language.phrase(\"IncorrectFloat\") };\r\n    }\r\n    return false;\r\n}\r\n\r\n/**\r\n * Range validator\r\n * @param {number} min Min value\r\n * @param {number} max Max value\r\n */\r\nexport function range(min, max) {\r\n    return function(el) {\r\n        let value = ew.getValue(el);\r\n        if (!ew.checkRange(value, min, max)) {\r\n            return { range: ew.language.phrase(\"IncorrectRange\").replace(\"%1\", min).replace(\"%2\", max) };\r\n        }\r\n       return false;\r\n    };\r\n}\r\n\r\n/**\r\n * Integer validator\r\n */\r\nexport function integer(el) {\r\n    let value = ew.getValue(el);\r\n    if (!ew.checkInteger(value)) {\r\n        return { integer: ew.language.phrase(\"IncorrectInteger\") };\r\n    }\r\n    return false;\r\n}\r\n\r\n/**\r\n * US phone validator\r\n */\r\nexport function phone(el) {\r\n    let value = ew.getValue(el);\r\n    if (!ew.checkPhone(value)) {\r\n        return { phone: ew.language.phrase(\"IncorrectPhone\") };\r\n    }\r\n    return false;\r\n}\r\n\r\n/**\r\n * US ZIP validator\r\n */\r\nexport function zip(el) {\r\n    let value = ew.getValue(el);\r\n    if (!ew.checkZip(value)) {\r\n        return { zip: ew.language.phrase(\"IncorrectZip\") };\r\n    }\r\n    return false;\r\n}\r\n\r\n/**\r\n * Credit card validator\r\n */\r\nexport function creditCard(el) {\r\n    let value = ew.getValue(el);\r\n    if (!ew.checkCreditCard(value)) {\r\n        return { creditCard: ew.language.phrase(\"IncorrectCreditCard\") };\r\n    }\r\n    return false;\r\n}\r\n\r\n/**\r\n * US SSN validator\r\n */\r\nexport function ssn(el) {\r\n    let value = ew.getValue(el);\r\n    if (!ew.checkSsn(value)) {\r\n        return { ssn: ew.language.phrase(\"IncorrectSSN\") };\r\n    }\r\n    return false;\r\n}\r\n\r\n/**\r\n * GUID validator\r\n */\r\nexport function guid(el) {\r\n    let value = ew.getValue(el);\r\n    if (!ew.checkGuid(value)) {\r\n        return { guid: ew.language.phrase(\"IncorrectGUID\") };\r\n    }\r\n    return false;\r\n}\r\n/**\r\n * Regular expression validator\r\n * @param {string} pattern Regular expression pattern\r\n */\r\nexport function regex(pattern) {\r\n    return function(el) {\r\n        let value = ew.getValue(el);\r\n        if (!ew.checkByRegEx(value, pattern)) {\r\n            return { regex: ew.language.phrase(\"IncorrectField\") };\r\n        }\r\n       return false;\r\n    };\r\n}\r\n\r\n/**\r\n  * Custom validator\r\n  * @param {*} fn Function(value, ...args)\r\n  * @param  {...any} args Additional arguments for the function\r\n  */\r\nexport function custom(fn, ...args) {\r\n    return function(el) {\r\n        if (typeof fn == \"function\") {\r\n            let value = ew.getValue(el);\r\n            if (fn(value, ...args))\r\n                return { custom: ew.language.phrase(\"IncorrectField\") };\r\n        }\r\n        return false;\r\n    };\r\n}\r\n\r\n/**\r\n * Captcha validator\r\n */\r\nexport function captcha(el) {\r\n    if (el && !ew.hasValue(el)) {\r\n        return { captcha: ew.language.phrase(\"EnterValidateCode\") };\r\n    }\r\n    return false;\r\n}\r\n\r\n/**\r\n * reCaptcha validator\r\n * @param {number} id reCaptcha ID\r\n */\r\nexport function recaptcha(el) {\r\n    if (el && !ew.hasValue(el) && grecaptcha?.getResponse(el.dataset.id) === \"\") {\r\n        return { recaptcha: ew.language.phrase(\"ClickReCaptcha\") };\r\n    }\r\n    return false;\r\n}","function _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nmodule.exports = _createClass;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;","function _assertThisInitialized(self) {\n  if (self === void 0) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return self;\n}\n\nmodule.exports = _assertThisInitialized;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;","function _setPrototypeOf(o, p) {\n  module.exports = _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n    o.__proto__ = p;\n    return o;\n  };\n\n  module.exports[\"default\"] = module.exports, module.exports.__esModule = true;\n  return _setPrototypeOf(o, p);\n}\n\nmodule.exports = _setPrototypeOf;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;","var setPrototypeOf = require(\"./setPrototypeOf.js\");\n\nfunction _inheritsLoose(subClass, superClass) {\n  subClass.prototype = Object.create(superClass.prototype);\n  subClass.prototype.constructor = subClass;\n  setPrototypeOf(subClass, superClass);\n}\n\nmodule.exports = _inheritsLoose;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;","function _defineProperty(obj, key, value) {\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n\n  return obj;\n}\n\nmodule.exports = _defineProperty;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;","function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n  try {\n    var info = gen[key](arg);\n    var value = info.value;\n  } catch (error) {\n    reject(error);\n    return;\n  }\n\n  if (info.done) {\n    resolve(value);\n  } else {\n    Promise.resolve(value).then(_next, _throw);\n  }\n}\n\nfunction _asyncToGenerator(fn) {\n  return function () {\n    var self = this,\n        args = arguments;\n    return new Promise(function (resolve, reject) {\n      var gen = fn.apply(self, args);\n\n      function _next(value) {\n        asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n      }\n\n      function _throw(err) {\n        asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n      }\n\n      _next(undefined);\n    });\n  };\n}\n\nmodule.exports = _asyncToGenerator;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;","import $ from 'jquery';\r\n\r\n// Form class\r\nexport default function FormBase(id, pageId) {\r\n    var self = this;\r\n\r\n    this._initiated = false;\r\n    this.id = id; // Same ID as the form\r\n    this.pageId = pageId;\r\n    this.$element = null; // jQuery object of the form or div\r\n    this.htmlForm = null; // HTML form element\r\n    this.initSearchPanel = false; // Expanded by default\r\n    this.modified = false;\r\n    this.validateRequired = true;\r\n    this.validate = null;\r\n    this.emptyRow = null; // Check empty row\r\n    this.multiPage = null; // Multi-page\r\n    this.autoSuggests = {}; // AutoSuggests\r\n    this.lists = {}; // Dynamic selection lists\r\n\r\n    // Disable form\r\n    this.disableForm = function() {\r\n        var form = this.getForm();\r\n        $(form).find(\":submit:not(.dropdown-toggle)\").prop(\"disabled\", true).addClass(\"disabled\");\r\n    }\r\n\r\n    // Enable form\r\n    this.enableForm = function() {\r\n        var form = this.getForm(),\r\n            $form = $(form);\r\n        $form.find(\".ew-disabled-element\").removeClass(\"ew-disabled-element\").prop(\"disabled\", false);\r\n        $form.find(\".ew-enabled-element\").removeClass(\"ew-enabled-element\").prop(\"disabled\", true);\r\n        $form.find(\":submit:not(.dropdown-toggle)\").prop(\"disabled\", false).removeClass(\"disabled\");\r\n    }\r\n\r\n    // Append hidden element with form name\r\n    this.appendHidden = function(el) {\r\n        var form = this.getForm(), $form = $(form), $dp = $(el).closest(\".ew-form\"), name = $dp.attr(\"id\") + \"$\" + el.name;\r\n        if ($form.find(\"input:hidden[name='\" + name + \"']\")[0]) // Already appended\r\n            return;\r\n        var ar = $dp.find('[name=\"' + el.name + '\"]').serializeArray();\r\n        if (ar.length) {\r\n            ar.forEach(function(o, i) {\r\n                $('<input type=\"hidden\" name=\"' + name + '\">').val(o.value).appendTo($form);\r\n            });\r\n        } else {\r\n            $('<input type=\"hidden\" name=\"' + name + '\">').val(\"\").appendTo($form);\r\n        }\r\n    }\r\n\r\n    // Can submit\r\n    this.canSubmit = function() {\r\n        var form = this.getForm(),\r\n            $form = $(form);\r\n        this.disableForm();\r\n        this.updateTextArea();\r\n        if (!this.validate || this.validate() && !$form.find(\".is-invalid\")[0]) {\r\n            $form.find(\"input[name^=sv_], input[name^=p_], .ew-template input\") // Do not submit these values\r\n                .prop(\"disabled\", true)\r\n                .addClass(\"ew-disabled-element\");\r\n            $form.find(\"[data-readonly=1][disabled]\")\r\n                .prop(\"disabled\", false)\r\n                .addClass(\"ew-enabled-element\"); // Submit readonly values\r\n            var $dps = $($form.find(\"input[name='detailpage']\").map(function(i, el) {\r\n                return $form.find(\"#\" + el.value).get();\r\n            }));\r\n            if ($dps.length > 1) { // Multiple Master/Detail, check element names\r\n                $dps.each(function(i, dp) {\r\n                    $(dp).find(\":input\").each(function(j, el) {\r\n                        if (/^(fn_)?(x|o)\\d*_/.test(el.name)) {\r\n                            var $els = $dps.not(dp).find(\":input[name='\" + el.name + \"']\");\r\n                            if ($els.length) { // Elements with same name found\r\n                                self.appendHidden(el); // Append element with form name\r\n                                $els.each(function() {\r\n                                    self.appendHidden(this); // Append elements with same name and form name\r\n                                });\r\n                            }\r\n                        }\r\n                    });\r\n                });\r\n            }\r\n            return true;\r\n        } else {\r\n            this.enableForm();\r\n        }\r\n        return false;\r\n    }\r\n\r\n    // Submit\r\n    this.submit = async function(e, action) {\r\n        var form = this.getForm();\r\n        if (this.canSubmit()) {\r\n            if (action)\r\n                form.action = action;\r\n            let args = { f: this, form: form, result: true };\r\n            $(form).trigger(\"beforesubmit\", [args]);\r\n            let result = await args.result; // Support Promise\r\n            if ($.isBoolean(result) && result || $.isObject(result) && result.value) // Support Swal.fire()\r\n                form.submit();\r\n        } else {\r\n            this.enableForm();\r\n        }\r\n    }\r\n\r\n    // Get dynamic selection list by element name or id\r\n    this.getList = function(name) {\r\n        name = name.replace(/^(sv_)?[xy](\\d*|\\$rowindex\\$)_|\\[\\]$/g, \"\"); // Remove element name prefix/suffix\r\n        return this.lists[name];\r\n    }\r\n\r\n    // Compile templates\r\n    this.compileTemplates = function() {\r\n        let lists = Object.values(this.lists);\r\n        for (let list of lists) {\r\n            if (list.template && $.isString(list.template))\r\n                list.template = $.templates(list.template);\r\n        }\r\n    }\r\n\r\n    // Get the HTML form element\r\n    this.getForm = function() {\r\n        if (!this.htmlForm) {\r\n            this.$element = $(\"#\" + this.id);\r\n            if (this.$element.is(\"form\")) { // HTML form\r\n                this.htmlForm = this.$element[0];\r\n            } else if (this.$element.is(\"div\")) { // HTML div => Grid page\r\n                this.htmlForm = this.$element.closest(\"form\")[0];\r\n            }\r\n        }\r\n        return this.htmlForm;\r\n    }\r\n\r\n    // Get form element as single element\r\n    this.getElement = function(name) {\r\n        if (!this.$element)\r\n            this.$element = $(\"#\" + this.id);\r\n        return (name) ? ew.getElement(name, this.$element) : this.$element[0];\r\n    }\r\n\r\n    // Get form element(s) as single element or array of radio/checkbox\r\n    this.getElements = function(name) {\r\n        if (!this.$element)\r\n            this.$element = $(\"#\" + this.id);\r\n        var selector = \"[name='\" + name + \"']\";\r\n        selector = \"input\" + selector + \",select\" + selector + \",textarea\" + selector + \",button\" + selector;\r\n        var $els = this.$element.find(selector);\r\n        return ($els.length == 0) ? null : ($els.length == 1 && $els.is(\":not([type=checkbox]):not([type=radio])\")) ? $els[0] : $els.get();\r\n    }\r\n\r\n    // Update selection lists\r\n    // @param {(null|undefined|number)*} rowindex Row index\r\n    this.updateLists = function(rowindex) {\r\n        if (rowindex === null) // rowindex == $rowindex$ == null\r\n            return;\r\n        if (!$.isNumber(rowindex) && this.pageId == \"grid\")\r\n            return;\r\n        var form = this.getForm(), // Set up $element and htmlForm\r\n            confirm = form.querySelector(\"input#confirm\");\r\n        if (confirm && confirm.value == \"confirm\") { // Confirm page\r\n            ew.removeSpinner();\r\n            return;\r\n        }\r\n        var fixId = (id, multiple) => {\r\n            var t = \"\",\r\n                i = rowindex,\r\n                ar = id.split(\" \");\r\n            if (ar.length > 1) {\r\n                t = ar[0];\r\n                i = \"\";\r\n                id = ar[1];\r\n            }\r\n            let prefix = $.isNumber(i) ? \"x\" + i + \"_\" : \"x_\"; // Add row index\r\n            if (id.startsWith(\"x_\")) // Field element name\r\n                id = id.replace(/^x_/, prefix);\r\n            else // Field var\r\n                id = prefix + id;\r\n            if (multiple && !id.endsWith(\"[]\")) // Add [] if select-multiple\r\n                id += \"[]\";\r\n            return t ? t + \" \" + id : id;\r\n        };\r\n        var selector = Object.entries(this.lists).map(([id, list]) => {\r\n            return \"[name='\" + fixId(id, list.multiple) + \"']\";\r\n        }).join();\r\n        if (!selector || !form.querySelector(selector)) { // Lists not found\r\n            ew.removeSpinner();\r\n            return;\r\n        }\r\n        var actions = [],\r\n            promises = [];\r\n        this.compileTemplates(); // For grid where updateList() called before init()\r\n        for (let [id, list] of Object.entries(this.lists)) {\r\n            let parents = list.parentFields.slice().map(parent => fixId(parent)), // Clone and fix index\r\n                ajax = list.ajax;\r\n            id = fixId(id, list.multiple);\r\n            if ($.isBoolean(ajax)) { // Ajax\r\n                let pvalues = parents.map(parent => ew.getOptionValues(parent, form)); // Save the initial values of the parent lists\r\n                actions.push([id, pvalues, ajax, false]);\r\n            } else { // Non-Ajax\r\n                ew.updateOptions.call(this, id, parents, null, false);\r\n            }\r\n        }\r\n        // Update the Ajax lists\r\n        for (var i = 0; i < actions.length; i++) {\r\n            promises.push(new Promise(function(resolve, reject) {\r\n                setTimeout(function() {\r\n                    resolve(ew.updateOptions.apply(self, actions.shift()));\r\n                }, ew.AJAX_DELAY * i); // Delay a little in case of large number of lists\r\n            }));\r\n        }\r\n        Promise.all(promises).then(function() {\r\n            $(document).trigger(\"updatedone\", [{source: self, target: form}]);\r\n        }).catch(function(error) {\r\n            console.log(error);\r\n        });\r\n    }\r\n\r\n    // Create AutoSuggest\r\n    this.createAutoSuggest = function(settings) {\r\n        var options = Object.assign({\r\n            limit: ew.AUTO_SUGGEST_MAX_ENTRIES,\r\n            form: this\r\n        }, ew.autoSuggestSettings, settings); // Global settings + field specific settings\r\n        self.autoSuggests[settings.id] = new ew.AutoSuggest(options);\r\n    }\r\n\r\n    // Init editors\r\n    this.initEditors = function() {\r\n        var form = this.getForm();\r\n        $(form.elements).filter(\"textarea.editor\").each(function(i, el) {\r\n            var ed = $(el).data(\"editor\");\r\n            if (ed && !ed.active && !ed.name.includes(\"$rowindex$\"))\r\n                ed.create();\r\n        });\r\n    }\r\n\r\n    // Update textareas\r\n    this.updateTextArea = function(name) {\r\n        var form = this.getForm();\r\n        $(form.elements).filter(\"textarea.editor\").each(function(i, el) {\r\n            var ed = $(el).data(\"editor\");\r\n            if (!ed || name && ed.name != name)\r\n                return true; // Continue\r\n            ed.save();\r\n            if (name)\r\n                return false; // Break\r\n        });\r\n    }\r\n\r\n    // Destroy editor(s)\r\n    this.destroyEditor = function(name) {\r\n        var form = this.getForm();\r\n        $(form.elements).filter(\"textarea.editor\").each(function(i, el) {\r\n            var ed = $(el).data(\"editor\");\r\n            if (!ed || name && ed.name != name)\r\n                return true; // Continue\r\n            ed.destroy();\r\n            if (name)\r\n                return false; // Break\r\n        });\r\n    }\r\n\r\n    // Show error message\r\n    this.onError = function(el, msg) {\r\n        return ew.onError(this, el, msg);\r\n    }\r\n\r\n    // Init file upload\r\n    this.initUpload = function() {\r\n        var form = this.getForm();\r\n        $(form.elements).filter(\"input:file:not([name*='$rowindex$'],[id='importfiles'])\").each(function(index) {\r\n            $.later(ew.AJAX_DELAY * index, null, ew.upload, this); // Delay a little in case of large number of upload fields\r\n        });\r\n    }\r\n\r\n    // Set up filters\r\n    this.setupFilters = function(e, filters) {\r\n        var id = this.id, data = this.filterList ? this.filterList.data : null, $sf = $(\".ew-save-filter[data-form=\" + id + \"]\").toggleClass(\"disabled\", !data),\r\n            $df = $(\".ew-delete-filter[data-form=\" + id + \"]\").toggleClass(\"disabled\", !filters.length).toggleClass(\"dropdown-toggle\", !!filters.length),\r\n            $delete = $df.parent(\"li\").toggleClass(\"dropdown-submenu dropdown-hover\", !!filters.length).toggleClass(\"disabled\", !filters.length),\r\n            $save = $sf.parent(\"li\").toggleClass(\"disabled\", !data),\r\n            $btn = $(e.target);\r\n        var saveFilters = function(id, filters) {\r\n            if (ew.SEARCH_FILTER_OPTION == \"Client\") {\r\n                window.localStorage.setItem(id + \"_filters\", JSON.stringify(filters));\r\n            } else if (ew.SEARCH_FILTER_OPTION == \"Server\") {\r\n                var $body = $(\"body\");\r\n                $body.css(\"cursor\", \"wait\");\r\n                $.ajax(ew.currentPage(), {\r\n                    type: \"POST\",\r\n                    dataType: \"json\",\r\n                    data: { \"ajax\": \"savefilters\", \"filters\": JSON.stringify(filters) }\r\n                }).done(function(result) {\r\n                    if (result[0] && result[0].success)\r\n                        self.filterList.filters = filters; // Save filters\r\n                }).always(function() {\r\n                    $body.css(\"cursor\", \"default\");\r\n                });\r\n            }\r\n        }\r\n        $save.off(\"click.ew\").on(\"click.ew\", function(e) { // Save filter\r\n            if ($save.hasClass(\"disabled\"))\r\n                return false;\r\n            ew.prompt(ew.language.phrase(\"EnterFilterName\"), (name) => {\r\n                name = ew.sanitize(name);\r\n                if (name) {\r\n                    filters.push([name, data]);\r\n                    saveFilters(id, filters);\r\n                }\r\n            }, true);\r\n        }).prevAll().remove();\r\n        $df.next(\"ul.dropdown-menu\").remove();\r\n        if (filters.length) {\r\n            var $submenu = $(\"<ul class='dropdown-menu'></ul>\");\r\n            for (var i in filters) {\r\n                if (!Array.isArray(filters[i]))\r\n                    continue;\r\n                $('<li><a class=\"dropdown-item\" data-index=\"' + i + '\" href=\"#\" onclick=\"return false;\">' + filters[i][0] + '</a></li>').on(\"click\", function(e) { // Delete\r\n                    var i = $(this).find(\"a[data-index]\").data(\"index\");\r\n                    ew.prompt(ew.language.phrase(\"DeleteFilterConfirm\").replace(\"%s\", filters[i][0]), (result) => {\r\n                        if (result) {\r\n                            filters.splice(i, 1);\r\n                            saveFilters(id, filters);\r\n                        }\r\n                    });\r\n                }).appendTo($submenu);\r\n                $('<li><a class=\"dropdown-item ew-filter-list\" data-index=\"' + i + '\" href=\"#\" onclick=\"return false;\">' + filters[i][0] + '</a></li>').insertBefore($save).on(\"click\", function(e) {\r\n                    var i = $(this).find(\"a[data-index]\").data(\"index\");\r\n                    $(\"<form>\").attr({method: \"post\", action: ew.currentPage()})\r\n                        .append($(\"<input type='hidden'>\").attr({name: \"cmd\", value: \"resetfilter\"}),\r\n                            $(\"<input type='hidden'>\").attr({name: ew.TOKEN_NAME_KEY, value: ew.TOKEN_NAME}), // PHP\r\n                            $(\"<input type='hidden'>\").attr({name: ew.ANTIFORGERY_TOKEN_KEY, value: ew.ANTIFORGERY_TOKEN}), // PHP\r\n                            $(\"<input type='hidden'>\").attr({name: \"filter\", value: JSON.stringify(filters[i][1])}))\r\n                        .appendTo(\"body\").trigger(\"submit\");\r\n                });\r\n            }\r\n            $(\"<li class='dropdown-divider'></li>\").insertBefore($save);\r\n            $delete.append($submenu);\r\n        }\r\n    }\r\n\r\n    // Init form\r\n    this.init = function() {\r\n        if (this._initiated)\r\n            return;\r\n\r\n        // Filters button\r\n        if (ew.SEARCH_FILTER_OPTION == \"Client\" && window.localStorage || ew.SEARCH_FILTER_OPTION == \"Server\" && ew.IS_LOGGEDIN && !ew.IS_SYS_ADMIN && ew.CURRENT_USER_NAME != \"\") {\r\n            $(\".ew-filter-option.\" + this.id + \" .ew-btn-dropdown\").on(\"show.bs.dropdown\", function(e) {\r\n                var filters = [];\r\n                if (ew.SEARCH_FILTER_OPTION == \"Client\") {\r\n                    var item = window.localStorage.getItem(self.id + \"_filters\");\r\n                    if (item)\r\n                        filters = ew.parseJson(item) || [];\r\n                } else if (ew.SEARCH_FILTER_OPTION == \"Server\")\r\n                    filters = self.filterList && self.filterList.filters ? self.filterList.filters : [];\r\n                var ar = $.grep(filters, function(val) {\r\n                    if (Array.isArray(val) && val.length == 2)\r\n                        return val;\r\n                });\r\n                self.setupFilters(e, ar);\r\n            });\r\n            $(\".ew-filter-option\").show();\r\n        } else {\r\n            $(\".ew-filter-option\").hide();\r\n        }\r\n\r\n        // Check form\r\n        var form = this.getForm(),\r\n            $form = $(form);\r\n        if (!form)\r\n            return;\r\n\r\n        // Compile templates\r\n        this.compileTemplates();\r\n\r\n        // Check if Search panel\r\n        var isSearch = /s(ea)?rch$/.test(this.id);\r\n\r\n        // Search panel\r\n        if (isSearch && this.initSearchPanel && !ew.hasFormData(form))\r\n            $(\"#\" + this.id + \"-search-panel\").removeClass(\"show\");\r\n\r\n        // Search panel toggle\r\n        $(\".ew-search-toggle[data-form=\" + this.id + \"]\").on(\"click.bs.button\", function() {\r\n            $(\"#\" + $(this).data(\"form\") + \"-search-panel\").collapse(\"toggle\");\r\n        });\r\n\r\n        // Hide search operator column\r\n        if (!$(\".ew-table .ew-search-operator\").text().trim())\r\n            $(\".ew-table .ew-search-operator\").parent(\"td\").hide();\r\n\r\n        // Highlight button\r\n        if (isSearch) {\r\n            $(\".ew-highlight[data-form=\" + this.id + \"]\").on(\"click.bs.button\", function() {\r\n                $(\"span.\" + $(this).data(\"name\")).toggleClass(\"ew-highlight-search\");\r\n            });\r\n        }\r\n\r\n        // Search operators\r\n        if (isSearch) { // Search form\r\n            $form.find(\"select[id^=z_]\").each(function() {\r\n                var $this = $(this).trigger(\"change\");\r\n                if ($this.val() != \"BETWEEN\")\r\n                    $form.find(\"#w_\" + this.id.substr(2)).trigger(\"change\");\r\n            });\r\n        }\r\n\r\n        // Multi-page\r\n        if (this.multiPage)\r\n            this.multiPage.render();\r\n\r\n        // HTML editors\r\n        loadjs.ready([\"editor\"], this.initEditors.bind(this));\r\n\r\n        // Dynamic selection lists\r\n        this.updateLists();\r\n\r\n        // Init file upload\r\n        this.initUpload();\r\n\r\n        // Submit/Cancel\r\n        if (this.$element.is(\"form\")) { // Not Grid page\r\n            // Detail pages\r\n            this.$element.find(\".ew-detail-pages .ew-nav-tabs a[data-toggle=tab]\").on(\"shown.bs.tab\", function(e) {\r\n                var $tab = $(e.target.getAttribute(\"href\")),\r\n                    $panel = $tab.find(\".table-responsive.ew-grid-middle-panel\"),\r\n                    $container = $tab.closest(\".container-fluid\");\r\n                if ($panel.width() >= $container.width())\r\n                    $panel.width($container.width() + \"px\");\r\n                else\r\n                    $panel.width(\"auto\");\r\n            });\r\n            $form.on(\"submit\", function(e) { // Bind submit event\r\n                self.submit(e);\r\n                return false; // Disable normal submission\r\n            });\r\n            $form.find(\"[data-field], .ew-priv\").on(\"change\", function() {\r\n                if (ew.CONFIRM_CANCEL)\r\n                    self.modified = true;\r\n            });\r\n            $form.find(\"#btn-cancel[data-href]\").on(\"click\", function() { // Cancel\r\n                self.updateTextArea();\r\n                var href = $(this).data(\"href\");\r\n                if (self.modified && ew.hasFormData(form)) {\r\n                    ew.prompt(ew.language.phrase(\"ConfirmCancel\"), (result) => {\r\n                        if (result) {\r\n                            $form.find(\"#btn-action\").prop(\"disabled\", true); // Disable the save button\r\n                            window.location = href;\r\n                        }\r\n                    });\r\n                } else {\r\n                    $form.find(\"#btn-action\").prop(\"disabled\", true); // Disable the save button\r\n                    window.location = href;\r\n                }\r\n            });\r\n        }\r\n\r\n        this._initiated = true;\r\n\r\n        // Store form object as data\r\n        this.$element.data(\"form\", this);\r\n    }\r\n\r\n    // Add to the global forms object\r\n    ew.forms.add(this);\r\n}","/**\r\n * Class Field\r\n */\r\nexport default class Field {\r\n    name = \"\";\r\n    validators = [];\r\n    _error;\r\n    _element;\r\n    _checkbox;\r\n    _validate = true;\r\n    list;\r\n    invalid;\r\n\r\n    /**\r\n     * Constructor\r\n     * @param {string} fldvar Field variable name\r\n     * @param {Function[]|Function} validators Validators\r\n     * @param {bool} invalid Initial valid status (e.g. server side)\r\n     */\r\n    constructor(fldvar, validators, invalid) {\r\n        this.name = fldvar;\r\n        if (Array.isArray(validators)) {\r\n            for (let validator of validators)\r\n                this.addValidator(validator);\r\n        } else if (typeof validators === \"function\") {\r\n            this.addValidator(validators);\r\n        }\r\n        this.invalid = invalid;\r\n    }\r\n\r\n    /**\r\n     * Add validator\r\n     * @param {Function} validator Validator function\r\n     */\r\n    addValidator(validator) {\r\n        if (typeof validator === \"function\")\r\n            this.validators.push(validator);\r\n    }\r\n\r\n    /**\r\n     * Get error\r\n     * @returns {Object}\r\n     */\r\n    get error() {\r\n        return this._error;\r\n    }\r\n\r\n    /**\r\n     * Add error\r\n     * @param {Object} err Error\r\n     */\r\n    addError(err) {\r\n        if (err) {\r\n            let error = this._error ?? {};\r\n            this._error = { ...error, ...err };\r\n            this.invalid = true;\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Clear all errors\r\n     */\r\n    clearErrors() {\r\n        this._error = null;\r\n        this.invalid = false;\r\n    }\r\n\r\n    /**\r\n     * Clear all validators\r\n     */\r\n    clearValidators() {\r\n        this.validators = [];\r\n    }\r\n\r\n    /**\r\n     * Get error message\r\n     * @returns {string} HTML\r\n     */\r\n    get errorMessage() {\r\n        if (this._error) {\r\n            return Array.from(Object.values(this._error)).join(\"<br>\");\r\n        }\r\n        return \"\";\r\n    }\r\n\r\n    /**\r\n     * Check if the field should be validated\r\n     */\r\n    get shouldValidate() {\r\n        return !this._checkbox || this._checkbox.checked;\r\n    }\r\n\r\n    /**\r\n     * Set form element\r\n     */\r\n    set element(el) {\r\n        this._element = el;\r\n        this._checkbox = this._element?.id?.match(/^[xy]_/) ? document.getElementById(this._element.id.replace(/^[xy]_/, \"u_\")) : null; // Find the checkbox for the field in Update page\r\n    }\r\n\r\n    /**\r\n     * Get form element\r\n     * @returns {HTMLElement|HTMLElement[]}\r\n     */\r\n    get element() {\r\n        return this._element;\r\n    }\r\n\r\n    /**\r\n     * Get field value from form element\r\n     * @returns {string|Array}\r\n     */\r\n    get value() {\r\n        return this._element ? ew.getValue(this._element) : \"\";\r\n    }\r\n\r\n    /**\r\n     * Validate field value\r\n     * @returns {boolean}\r\n     */\r\n    validate() {\r\n        let result = true;\r\n        this.clearErrors(); // Reset error\r\n        if (this._element && this.shouldValidate) {\r\n            if (Array.isArray(this.validators)) {\r\n                for (let validator of this.validators) {\r\n                    let err = validator(this._element);\r\n                    if (err !== false) {\r\n                        this.addError(err);\r\n                        result = false;\r\n                    }\r\n                }\r\n                this.updateFeedback();\r\n            }\r\n        }\r\n        return result;\r\n    }\r\n\r\n    /**\r\n     * Update the error message to feedback element\r\n     */\r\n    updateFeedback() {\r\n        let err = this.errorMessage;\r\n        if (this._element && err) {\r\n            jQuery(this._element).closest(\"[id^=el_], .form-group\").find(\".invalid-feedback\").html(err);\r\n            ew.setInvalid(this._element);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Set focus\r\n     */\r\n    focus() {\r\n        if (this._element)\r\n            ew.setFocus(this._element);\r\n    }\r\n}","import FormBase from \"./FormBase\";\r\nimport Field from \"./Field\";\r\n\r\n/**\r\n * Class Form\r\n */\r\nexport default class Form extends FormBase {\r\n    row = {};\r\n    fields = {};\r\n    rowIndex;\r\n    value;\r\n    _error;\r\n\r\n    /**\r\n     * Constructor\r\n     * @param {string} id Form ID\r\n     * @param {string} pageId Page ID\r\n     */\r\n    constructor(id, pageId) {\r\n        super(id, pageId);\r\n    }\r\n\r\n    /**\r\n     * Add field\r\n     * @param {string} fldvar Field variable name\r\n     * @param {Function[]} validators Validators\r\n     * @param {bool} invalid Invalid\r\n     */\r\n    addField(fldvar, validators, invalid) {\r\n        if (!(fldvar in this.fields))\r\n            this.fields[fldvar] = new Field(fldvar, validators, invalid);\r\n    }\r\n\r\n    /**\r\n     * Get field\r\n     * @param {string} fldvar Field variable name\r\n     * @returns Field\r\n     */\r\n    getField(fldvar) {\r\n        return this.fields[fldvar];\r\n    }\r\n\r\n    /**\r\n     * Add fields by field definitions\r\n     * @param {Array} fields\r\n     */\r\n    addFields(fields) {\r\n        if (Array.isArray(fields)) {\r\n            for (let field of fields) {\r\n                if (Array.isArray(field)) {\r\n                    this.addField.apply(this, field);\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Add error\r\n     * @param {string} fldvar Field variable name\r\n     * @param {Object} err Error\r\n     */\r\n    addError(fldvar, err) {\r\n        if (err) {\r\n            this._error = this._error ?? {};\r\n            this._error[fldvar] = err;\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Add custom error\r\n     * @param {string} fldvar Field variable name \r\n     * @param {string} msg Error message \r\n     */\r\n    addCustomError(fldvar, msg) {\r\n        if (fldvar in this.fields) {\r\n            let field = this.fields[fldvar],\r\n                err = { custom: msg };\r\n            field.addError(err);\r\n            field.updateFeedback();\r\n            this.addError(fldvar, err);\r\n        }\r\n        return false;\r\n    }\r\n\r\n    /**\r\n     * Get error\r\n     */\r\n    get error() {\r\n        return this._error;\r\n    }\r\n\r\n    /**\r\n     * Set focus to the first field with error\r\n     */\r\n    focus() {\r\n        for (let [fldvar, field] of Object.entries(this.fields)) {\r\n            if (field.invalid || this._error && this._error[fldvar]) {\r\n                field.focus();\r\n                this.makeVisible(field.element);\r\n                break;\r\n            }\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Make the form visible\r\n     * @param {HTMLElement} el Focused element \r\n     */\r\n    makeVisible(el) {\r\n        if (this.multiPage) { // Multi-page\r\n            this.multiPage.gotoPageByElement(el);\r\n        } else if (this.$element.is(\"div\")) { // Multiple Master/Detail\r\n            let $pane = this.$element.closest(\".tab-pane\");\r\n            if ($pane[0] && !$pane.hasClass(\"active\"))\r\n                $pane.closest(\".tabbable, .ew-nav-tabs\").find(\"a[data-toggle=tab][href='#\" + $pane.attr(\"id\") + \"']\").click();\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Validate all fields of the specified row\r\n     * @param {number} rowIndex Row index\r\n     */\r\n    validateFields(rowIndex) {\r\n        this.rowIndex = rowIndex ?? \"\";\r\n        this.row = {};\r\n        this._error = null; // Reset\r\n        let result = true;\r\n        for (let field of Object.values(this.fields)) {\r\n            field.element = this.getElements(`x${this.rowIndex}_${field.name}`); // Set element\r\n            if (!field.element)\r\n                field.element = this.getElements(`x${this.rowIndex}_${field.name}[]`); // Field with []\r\n            if (!field.element)\r\n                field.element = this.getElements(field.name); // Field by name directly (e.g. email form)\r\n            this.row[field.name] = field.value; // Get field value\r\n            if (field.element && !field.validate()) { // Invalid field value\r\n                this.addError(field.name, field.error);\r\n                result = false;\r\n            }\r\n        }\r\n        // Save the field values of the row\r\n        if (!this.value) {\r\n            this.value = { ...this.row };\r\n        } else {\r\n            if (!Array.isArray(this.value))\r\n                this.value = [this.value];\r\n            let index = parseInt(rowIndex, 10) || 0;\r\n            index = (index > 1) ? index - 1 : 0;\r\n            this.value[index] = { ...this.row };\r\n        }\r\n        this.focus();\r\n\r\n        return result;\r\n    }\r\n\r\n    /**\r\n     * Set invalid fields of the specified row\r\n     * @param {number} rowIndex Row index\r\n     */\r\n    setInvalid(rowIndex) {\r\n        this.rowIndex = rowIndex ?? \"\";\r\n        for (let field of Object.values(this.fields)) {\r\n            if (!field.invalid)\r\n                continue;\r\n            field.element = this.getElements(`x${this.rowIndex}_${field.name}`); // Set element\r\n            if (!field.element)\r\n                field.element = this.getElements(`x${this.rowIndex}_${field.name}[]`); // Fields with []\r\n            if (!field.element)\r\n                field.element = this.getElements(field.name); // Fields without prefix (e.g. email form)\r\n            ew.setInvalid(field.element);\r\n        }\r\n    }\r\n}","import $ from 'jquery';\r\n\r\n// AjaxLookup class\r\nexport default class AjaxLookup {\r\n    _isAutoSuggest = null;\r\n\r\n    /**\r\n     * Constructor\r\n     * @param {Object} settings Settings\r\n     * @param {string} settings.id - Input element ID\r\n     * @param {string|Form} settings.form - Form of the input element\r\n     * @param {Number} settings.limit - Options per page\r\n     * @param {Object} settings.data - Data submitted by Ajax\r\n     */\r\n    constructor(settings) {\r\n        this.elementId = settings.id; // Id\r\n        this.form = settings.form; // Form\r\n        if ($.isString(this.form)) // Form is string => Form id\r\n            this.form = ew.forms.get(this.form);\r\n        this.element = this.form.getElement(this.elementId); // Actual HTML element\r\n        this.formElement = this.form.getElement(); // HTML form or DIV\r\n        this.list = this.form.getList(this.elementId);\r\n        let m = this.elementId.match(/^[xy](\\d*|\\$rowindex\\$)_/),\r\n            rowindex = m ? m[1] : \"\";\r\n        this.parentFields = this.list.parentFields.slice() // Clone\r\n            .map(pf => (pf.split(\" \").length == 1) ? pf.replace(/^x_/, \"x\" + rowindex + \"_\") : pf); // Parent field in the same table, add row index\r\n        this.limit = settings.limit;\r\n        this.debounce = settings.debounce;\r\n        this.data = settings.data;\r\n        this.recordCount = 0;\r\n    }\r\n\r\n    /**\r\n     * Is AutoSuggest\r\n     */\r\n    get isAutoSuggest() {\r\n        if (this._isAutoSuggest === null)\r\n            this._isAutoSuggest = ew.isAutoSuggest(this.element);\r\n        return this._isAutoSuggest;\r\n    }\r\n\r\n    /**\r\n     * Format display value\r\n     * @param {Array} opt Option\r\n     */\r\n    formatResult(opt) {\r\n        if (this.list.template && !this.isAutoSuggest) {\r\n            return this.list.template.render(opt, ew.jsRenderHelpers);\r\n        } else {\r\n            return ew.displayValue(opt, this.element) || opt[0];\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Generate request\r\n     */\r\n    generateRequest() {\r\n        var data = Object.assign({}, this.data, {\r\n            name: this.element.name,\r\n            page: this.list.page,\r\n            field: this.list.field,\r\n            ajax: \"autosuggest\",\r\n            language: ew.LANGUAGE_ID\r\n        }, ew.getUserParams(\"#p_\" + this.elementId, this.formElement));\r\n        if (this.parentFields.length > 0) {\r\n            this.parentFields.forEach((pf, i) => {\r\n                let arp = ew.getOptionValues(pf, this.formElement);\r\n                data[\"v\" + (i + 1)] = arp.join(ew.MULTIPLE_OPTION_SEPARATOR);\r\n            });\r\n        }\r\n        return data;\r\n    }\r\n\r\n    /**\r\n     * Get URL\r\n     */\r\n    getUrl(query, start) {\r\n        let params = new URLSearchParams({\r\n            q: query,\r\n            n: this.limit,\r\n            rnd: ew.random(),\r\n            start: $.isNumber(start) ? start : -1\r\n        });\r\n        return ew.getApiUrl(ew.API_LOOKUP_ACTION, params.toString());\r\n    }\r\n\r\n    /**\r\n     * Prepare URL and data for sending request\r\n     * @param {string} query Search term\r\n     * @param {Number} start Start page\r\n     */\r\n    prepare(query, start) {\r\n        return {\r\n            url: this.getUrl(query, start),\r\n            type: \"POST\",\r\n            dataType: \"json\",\r\n            data: this.generateRequest()\r\n        };\r\n    }\r\n\r\n    /**\r\n     * Transform options (virtual)\r\n     * @param {Object[]} data Data from server\r\n     */\r\n    transform(data) {\r\n        let results = [];\r\n        if (data && data.result == \"OK\") {\r\n            this.recordCount = data.totalRecordCount;\r\n            results = data.records;\r\n        }\r\n        return results;\r\n    }\r\n\r\n}\r\n","/**\r\n * Class selection list option\r\n */\r\nexport default class SelectionListOption {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    constructor(value, text, selected) {\r\n        this.value = String(value || \"\");\r\n        this.text = String(text || \"\");\r\n        this.selected = !!selected;\r\n    }\r\n\r\n}","import $ from 'jquery';\r\nimport SelectionListOption from './SelectionListOption';\r\nimport AjaxLookup from './AjaxLookup';\r\n\r\n// AutoSuggest class\r\nfunction AutoSuggest(settings) {\r\n    AjaxLookup.call(this, settings); // Extends AjaxLookup\r\n\r\n    var emptyObj = { typeahead: {} }; // Empty Auto-Suggest object\r\n\r\n    if (this.elementId.includes(\"$rowindex$\"))\r\n        return emptyObj;\r\n\r\n    this.input = this.form.getElement(\"sv_\" + this.elementId); // User input\r\n    if (!this.input)\r\n        return emptyObj;\r\n\r\n    var self = this,\r\n        $input = $(this.input),\r\n        $element = $(this.element),\r\n        timer;\r\n\r\n    // Properties\r\n    this.minWidth = settings.minWidth;\r\n    this.maxHeight = settings.maxHeight;\r\n    this.highlight = settings.highlight;\r\n    this.hint = settings.hint;\r\n    this.minLength = settings.minLength;\r\n    this.templates = Object.assign({}, settings.templates); // Clone\r\n    this.trigger = settings.trigger; // For loading more results\r\n    this.delay = settings.delay; // For loading more results\r\n    this.debounce = settings.debounce;\r\n    this.display = settings.display || \"text\";\r\n    this.forceSelection = settings.forceSelect;\r\n    this.$input = $input;\r\n    this.$element = $element;\r\n\r\n    // Save initial option\r\n    if ($input.val() && $element.val())\r\n        this.element.add($element.val(), $input.val(), true);\r\n\r\n    // Set the selected item to the actual field\r\n    this.setValue = function(v) {\r\n        v = v || $input.val();\r\n        let index = this.element.options.findIndex(option => option.text == v);\r\n        if (index < 0) { // Not found in results\r\n            if (this.forceSelection && v) { // Force selection and query not empty => error\r\n                $input.typeahead(\"val\", \"\").attr(\"placeholder\", ew.language.phrase(\"ValueNotExist\")).addClass(\"is-invalid\");\r\n                $element.val(\"\").trigger(\"change\");\r\n                return;\r\n            }\r\n        } else { // Found in results\r\n            this.element.options[index].selected = true;\r\n            if (!/s(ea)?rch$/.test(this.formElement.id) || this.forceSelection) // Force selection or not search form\r\n                v = this.element.options[index].value; // Replace the display value by Link Field value\r\n        }\r\n        if (v !== $element.attr(\"value\"))\r\n            $element.attr(\"value\", v).trigger(\"change\"); // Set value to the actual field\r\n    };\r\n\r\n    // Transform suggestion\r\n    this.transform = function(data) {\r\n        let results = AjaxLookup.prototype.transform.call(this, data);\r\n        this.element.options = results.map(item => new SelectionListOption(item.lf || item[0], self.formatResult(item)));\r\n        return this.element.options;\r\n    };\r\n\r\n    // Get suggestions by Ajax\r\n    this.source = function(query, syncResults, asyncResults) {\r\n        if (timer)\r\n            timer.cancel();\r\n        timer = $.later(self.debounce, null, function() {\r\n            self.recordCount = 0; // Reset\r\n            var settings = self.prepare(query);\r\n            $.ajax(settings).done(function(data) {\r\n                asyncResults(self.transform(data));\r\n            });\r\n        });\r\n    };\r\n\r\n    // Get current suggestion count\r\n    this.count = function() {\r\n        return self.typeahead.menu.$node.find(\".tt-suggestion.tt-selectable\").length;\r\n    };\r\n\r\n    // Get more suggestions by Ajax\r\n    this.more = function() {\r\n        var $body = $(\"body\");\r\n        $body.css(\"cursor\", \"wait\");\r\n        var ta = self.typeahead, query = ta.menu.query, dataset = ta.menu.datasets[0];\r\n        var start = self.count();\r\n        var settings = self.prepare(query, start);\r\n        $.ajax(settings).done(function(data) {\r\n            data = self.transform(data);\r\n            dataset._append(query, data);\r\n            ta.menu.$node.find(\".tt-dataset\").scrollTop(dataset.$lastSuggestion.outerHeight() * start);\r\n        }).always(function() {\r\n            $body.css(\"cursor\", \"default\");\r\n        });\r\n    };\r\n\r\n    // Add events\r\n    $input.on(\"typeahead:select\", function(e, d) {\r\n        self.setValue(d[self.display]);\r\n    }).on(\"change\", function(e) {\r\n        var ta = $input.data(\"tt-typeahead\");\r\n        if (ta && ta.isOpen() && !ta.menu.empty()) {\r\n            var $item = ta.menu.getActiveSelectable();\r\n            if ($item) { // A suggestion is highlighted\r\n                let i = $item.index(),\r\n                    val = self.element.options[i].text;\r\n                $input.typeahead(\"val\", val);\r\n            }\r\n        }\r\n        self.setValue();\r\n    }).on(\"blur\", function(e) { // \"change\" fires before blur\r\n        var ta = $input.data(\"tt-typeahead\");\r\n        if (ta && ta.isOpen())\r\n            ta.menu.close();\r\n    }).on(\"focus\", function(e) {\r\n        $input.attr(\"placeholder\", $input.data(\"placeholder\")).removeClass(\"is-invalid\");\r\n    });\r\n\r\n    // Option template (\"suggestion\" template)\r\n    var tpl = self.list.template || self.templates[\"suggestion\"];\r\n    if (tpl && $.isString(tpl))\r\n        tpl = $.templates(tpl);\r\n    if (tpl)\r\n        self.templates[\"suggestion\"] = tpl.render.bind(tpl);\r\n\r\n    // Save\r\n    $element.data(\"autosuggest\", this);\r\n\r\n    // Create Typeahead\r\n    $(function() {\r\n        // Typeahead options and dataset\r\n        var options = {\r\n            highlight: self.highlight,\r\n            minLength: self.minLength,\r\n            hint: self.hint,\r\n            trigger: self.trigger,\r\n            delay: self.delay\r\n        };\r\n        var dataset = {\r\n            name: self.form.id + \"-\" + self.elementId,\r\n            source: self.source,\r\n            templates: self.templates,\r\n            display: self.display,\r\n            limit: self.limit,\r\n            async: true\r\n        };\r\n        var args = [options, dataset];\r\n        // Trigger \"typeahead\" event\r\n        $element.trigger(\"typeahead\", [args]);\r\n        self.limit = dataset.limit;\r\n        // Create Typeahead\r\n        $input.typeahead.apply($input, args);\r\n        $input.on(\"typeahead:rendered\", function() {\r\n            var $node = self.typeahead.menu.$node;\r\n            var $more = $node.find(\".tt-more\").html(ew.language.phrase(\"More\"));\r\n            if (arguments.length > 1 && // Arguments: event, suggestion, suggestion, ...\r\n                self.recordCount > self.count()) {\r\n                $more.one(options.trigger, function(e) {\r\n                    setTimeout(function() {\r\n                        self.more();\r\n                    }, options.delay);\r\n                    e.preventDefault();\r\n                    e.stopPropagation();\r\n                });\r\n            } else {\r\n                $more.hide();\r\n            }\r\n        });\r\n        $input.off(\"blur.tt\");\r\n        self.typeahead = $input.data(\"tt-typeahead\");\r\n        var $menu = self.typeahead.menu.$node.css(\"z-index\", 1000);\r\n        if (self.minWidth)\r\n            $menu.css(\"min-width\", self.minWidth);\r\n        var $dataset = $menu.find(\".tt-dataset\");\r\n        var maxHeight = self.maxHeight ||\r\n            (parseInt($dataset.css(\"line-height\"), 10) + 6) * (dataset.limit + 1); // Match .tt-suggestion padding\r\n        $dataset.css({ \"max-height\": maxHeight, \"overflow-y\": \"auto\" });\r\n    });\r\n}\r\n\r\nAutoSuggest.prototype = Object.create(AjaxLookup.prototype);\r\n\r\nexport default AutoSuggest;","import $ from 'jquery';\r\n\r\n/**\r\n * Class Forms\r\n */\r\nexport default class Forms {\r\n    _forms = {};\r\n\r\n    /**\r\n     * Get form by element or id\r\n     * @param {HTMLElement|string} el Element or id\r\n     */\r\n    get(el) {\r\n        let id = ($.isString(el)) ? el : ew.getForm(el).id;\r\n        return this._forms[id];\r\n    }\r\n\r\n    /**\r\n     * Add form\r\n     * @param {Form} f Form\r\n     */\r\n    add(f) {\r\n        this._forms[f.id] = f;\r\n    }\r\n\r\n    /**\r\n     * Get all ids\r\n     * @returns {string[]}\r\n     */\r\n    ids() {\r\n        return Object.keys(this._forms);\r\n    }\r\n\r\n}","import $ from 'jquery';\r\nimport AjaxLookup from './AjaxLookup';\r\nimport AutoSuggest from './AutoSuggest';\r\nimport Form from './Form';\r\nimport Forms from './Forms';\r\nimport Field from './Field';\r\nimport SelectionListOption from './SelectionListOption';\r\nimport getSelect2CustomOptionClass from './Select2CustomOption';\r\n\r\nexport let currentUrl = new URL(window.location);\r\nexport let forms = new Forms();\r\nexport { AjaxLookup, AutoSuggest, Form, SelectionListOption };\r\n\r\nlet $document = $(document),\r\n    $body = $(\"body\");\r\n\r\n// Remove spinner (immediately)\r\nlet _removeSpinner = ew.removeSpinner;\r\n\r\n// Remove spinner\r\nexport function removeSpinner() {\r\n    var timer = $body.data(\"_spinner\");\r\n    if (timer)\r\n        timer.cancel();\r\n    timer = $.later(500, null, function() {\r\n        if ($document.data(\"_ajax\") !== true) { // Ajax not running\r\n            _removeSpinner();\r\n            $(\"form.ew-form\").each(function() {\r\n                var frm = forms.get(this.id);\r\n                if (frm) {\r\n                    frm.focus();\r\n                    return false;\r\n                }\r\n            });\r\n        }\r\n    });\r\n    $body.data(\"_spinner\", timer);\r\n}\r\n\r\n// Create select2\r\nexport function createSelect(options) {\r\n    if (options.selectId.includes(\"$rowindex$\"))\r\n        return;\r\n    $.fn.select2.amd.require(\r\n        [\"select2/utils\", \"select2/results\", \"select2/dropdown/infiniteScroll\", \"select2/dropdown/hidePlaceholder\", \"select2/dropdown/selectOnClose\"],\r\n        (function(opts) {\r\n            return function (Utils, ResultsList, InfiniteScroll, HidePlaceholder, SelectOnClose) {\r\n                let options = Object.assign({}, ew.selectOptions, opts);\r\n                if (options.resultsAdapter == null) {\r\n                    options.resultsAdapter = ResultsList;\r\n                    if (options.dropdown && options.columns && options.customOption) {\r\n                        options.resultsAdapter = Utils.Decorate(\r\n                            options.resultsAdapter,\r\n                            getSelect2CustomOptionClass(Utils)\r\n                        );\r\n                        if (options.iconClass && options.multiple && !options.templateResult) {\r\n                            options.templateResult = (result) => '<label class=\"' + options.iconClass + ' ew-dropdown-label\">' + result.text + '</label>';\r\n                        }\r\n                    }\r\n                    if (options.ajax != null) {\r\n                        options.resultsAdapter = Utils.Decorate(\r\n                            options.resultsAdapter,\r\n                            InfiniteScroll\r\n                        );\r\n                    }\r\n                    if (options.placeholder != null) {\r\n                        options.resultsAdapter = Utils.Decorate(\r\n                            options.resultsAdapter,\r\n                            HidePlaceholder\r\n                        );\r\n                    }\r\n                    if (options.selectOnClose) {\r\n                        options.resultsAdapter = Utils.Decorate(\r\n                            options.resultsAdapter,\r\n                            SelectOnClose\r\n                        );\r\n                    }\r\n                }\r\n                if ($.isObject(options.ajax)) {\r\n                    let lookup = new ew.AjaxLookup(options.ajax)\r\n                    options.ajax = {\r\n                        url: (params) => {\r\n                            let start = params.page ? (params.page - 1) * (settings.limit || ew.AUTO_SUGGEST_MAX_ENTRIES) : -1;\r\n                            return lookup.getUrl(params.term, start);\r\n                        },\r\n                        type: \"POST\",\r\n                        dataType: \"json\",\r\n                        data: lookup.generateRequest.bind(lookup),\r\n                        delay: options.debounce,\r\n                        processResults: (data) => {\r\n                            return {\r\n                                results: lookup.transform(data).map(item => {\r\n                                    return {\r\n                                        id: item.lf,\r\n                                        text: lookup.formatResult({ lf: item.lf, df: item.df, df2: item.df2, df3: item.df3, df4: item.df4 })\r\n                                    };\r\n                                }),\r\n                                pagination: {\r\n                                    more: data.length < lookup.recordCount\r\n                                }\r\n                            }\r\n                        }\r\n                    };\r\n                }\r\n                $(\"select[data-select2-id='\" + options.selectId + \"']\").select2(options);\r\n                if (options.multiple && options.minimumResultsForSearch === Infinity) {\r\n                    $(\"select[id='\" + options.name + \"']\").on(\"select2:opening select2:closing\", function(event) {\r\n                        $(this).parent().find(\".select2-search__field\").prop(\"disabled\", true);\r\n                    });\r\n                }\r\n            };\r\n        })(options)\r\n    );\r\n}\r\n\r\n// Init icon tooltip\r\nexport function initIcons(e) {\r\n    var el = (e && e.target) ? e.target : document;\r\n    $(el).find(\".ew-icon\").closest(\"a, button\").add(\".ew-tooltip\").tooltip({\r\n        container: \"body\",\r\n        trigger: (ew.IS_MOBILE) ? \"manual\" : \"hover\",\r\n        placement: \"bottom\",\r\n        sanitizeFn: ew.sanitizeFn\r\n    });\r\n}\r\n\r\n// Init password options\r\nexport function initPasswordOptions(e) {\r\n    var el = (e && e.target) ? e.target : document;\r\n    if ($.fn.pStrength && typeof ew.MIN_PASSWORD_STRENGTH != \"undefined\") {\r\n        $(el).find(\".ew-password-strength\").each(function() {\r\n            var $this = $(this);\r\n            if (!$this.data(\"pStrength\"))\r\n                $this.pStrength({\r\n                    \"changeBackground\": false,\r\n                    \"backgrounds\": [],\r\n                    \"passwordValidFrom\": ew.MIN_PASSWORD_STRENGTH,\r\n                    \"onPasswordStrengthChanged\": function(strength, percentage) {\r\n                        var $this = $(this), $pst = $(\"[id='\" + $this.attr(\"data-password-strength\") + \"']\"), // Do not use #\r\n                            $pb = $pst.find(\".progress-bar\");\r\n                        $pst.width($this.outerWidth());\r\n                        if ($this.val() && !ew.isMaskedPassword(this)) {\r\n                            var pct = percentage + \"%\";\r\n                            if (percentage < 25) {\r\n                                $pb.addClass(\"bg-danger\").removeClass(\"bg-warning bg-info bg-success\");\r\n                            } else if (percentage < 50) {\r\n                                $pb.addClass(\"bg-warning\").removeClass(\"bg-danger bg-info bg-success\");\r\n                            } else if (percentage < 75) {\r\n                                $pb.addClass(\"bg-info\").removeClass(\"bg-danger bg-warning bg-success\");\r\n                            } else {\r\n                                $pb.addClass(\"bg-success\").removeClass(\"bg-danger bg-warning bg-info\");\r\n                            }\r\n                            $pb.css(\"width\", pct);\r\n                            if (percentage > 25)\r\n                                pct = ew.language.phrase(\"PasswordStrength\").replace(\"%p\", pct);\r\n                            $pb.html(pct);\r\n                            $pst.removeClass(\"d-none\").show();\r\n                            $this.data(\"validated\", percentage >= ew.MIN_PASSWORD_STRENGTH);\r\n                        } else {\r\n                            $pst.addClass(\"d-none\").hide();\r\n                            $this.data(\"validated\", null);\r\n                        }\r\n                    }\r\n                });\r\n        });\r\n    }\r\n    if ($.fn.pGenerator) {\r\n        $(el).find(\".ew-password-generator\").each(function() {\r\n            var $this = $(this);\r\n            if (!$this.data(\"pGenerator\"))\r\n                $this.pGenerator({\r\n                    \"passwordLength\": ew.GENERATE_PASSWORD_LENGTH,\r\n                    \"uppercase\": ew.GENERATE_PASSWORD_UPPERCASE,\r\n                    \"lowercase\": ew.GENERATE_PASSWORD_LOWERCASE,\r\n                    \"numbers\": ew.GENERATE_PASSWORD_NUMBER,\r\n                    \"specialChars\": ew.GENERATE_PASSWORD_SPECIALCHARS,\r\n                    \"onPasswordGenerated\": function(pwd) {\r\n                        var $this = $(this);\r\n                        $(\"#\" + $this.attr(\"data-password-field\")).val(pwd).trigger(\"change\").trigger(\"focus\").triggerHandler(\"click\"); // Trigger click to remove \"is-invalid\" class (Do not use $this.data)\r\n                        $(\"#\" + $this.attr(\"data-password-confirm\")).val(pwd);\r\n                        $(\"#\" + $this.attr(\"data-password-strength\")).addClass(\"d-none\").hide();\r\n                    }\r\n                });\r\n        });\r\n    }\r\n}\r\n\r\n/**\r\n * Get API action URL\r\n * @param {string|string[]} action Route as string or array, e.g. \"foo\", [\"foo\", \"1\"]\r\n * @param {string|string[]|object} query Search params, e.g. \"foo=1&bar=2\", [[\"foo\", \"1\"], [\"bar\", \"2\"]], {\"foo\": \"1\", \"bar\": \"2\"}\r\n */\r\nexport function getApiUrl(action, query) {\r\n    var url = ew.PATH_BASE + ew.API_URL,\r\n        params = new URLSearchParams(query),\r\n        qs = params.toString();\r\n    if ($.isString(action)) { // Route as string\r\n        url += action ? action : \"\";\r\n    } else if (Array.isArray(action)) { // Route as array\r\n        var route = action.map(function(v) {\r\n            return encodeURIComponent(v);\r\n        }).join(\"/\");\r\n        url += route ? route : \"\";\r\n    }\r\n    return url + (qs ? \"?\" + qs : \"\");\r\n}\r\n\r\n// Sanitize URL\r\nexport function sanitizeUrl(url) {\r\n    var ar = url.split(\"?\"),\r\n        search = ar[1];\r\n    if (search) {\r\n        var searchParams = new URLSearchParams(search);\r\n        searchParams.forEach((value, key) => searchParams.set(key, ew.sanitize(value)));\r\n        search = searchParams.toString();\r\n    }\r\n    return ar[0] + (search ? \"?\" + search : \"\");\r\n}\r\n\r\n// Set session timer\r\nexport function setSessionTimer() {\r\n    var timeoutTime, timer, keepAliveTimer, counter,\r\n        useKeepAlive = (ew.SESSION_KEEP_ALIVE_INTERVAL > 0 || ew.IS_LOGGEDIN && ew.IS_AUTOLOGIN);\r\n    // Keep alive\r\n    var keepAlive = () => {\r\n        $.get(getApiUrl(ew.API_SESSION_ACTION), { \"rnd\": random() }, (token) => {\r\n            if (token && $.isObject(token)) { // PHP\r\n                ew.TOKEN_NAME = token[ew.TOKEN_NAME_KEY];\r\n                ew.ANTIFORGERY_TOKEN = token[ew.ANTIFORGERY_TOKEN_KEY];\r\n                if (token[\"JWT\"])\r\n                    ew.API_JWT_TOKEN = token[\"JWT\"];\r\n            }\r\n        });\r\n    };\r\n    // Reset timer\r\n    var resetTimer = () => {\r\n        counter = ew.SESSION_TIMEOUT_COUNTDOWN;\r\n        timeoutTime = ew.SESSION_TIMEOUT - ew.SESSION_TIMEOUT_COUNTDOWN;\r\n        if (timeoutTime < 0) { // Timeout now\r\n            timeoutTime = 0;\r\n            counter = ew.SESSION_TIMEOUT;\r\n        }\r\n        if (timer)\r\n            timer.cancel(); // Clear timer\r\n    };\r\n    // Timeout\r\n    var timeout = () => {\r\n        if (keepAliveTimer)\r\n            keepAliveTimer.cancel(); // Stop keep alive\r\n        if (counter > 0) {\r\n            let timerInterval;\r\n            let message = '<p class=\"text-danger\">' + ew.language.phrase(\"SessionWillExpire\") + '</p>';\r\n            if (message.includes(\"%m\") && message.includes(\"%s\")) {\r\n                message = message.replace(\"%m\", '<span class=\"ew-session-counter-minute\">' + Math.floor(counter / 60) + '</span>')\r\n                message = message.replace(\"%s\", '<span class=\"ew-session-counter-second\">' + (counter % 60) + '</span>')\r\n            } else if (message.includes(\"%s\")) {\r\n                message = message.replace(\"%s\", '<span class=\"ew-session-counter-second\">' + counter + '</span>');\r\n            }\r\n            Swal.fire({\r\n                ...ew.sweetAlertSettings,\r\n                html: message,\r\n                showConfirmButton: true,\r\n                confirmButtonText: ew.language.phrase(\"OKBtn\"),\r\n                timer: counter * 1000,\r\n                timerProgressBar: true,\r\n                allowOutsideClick: false,\r\n                allowEscapeKey: false,\r\n                onBeforeOpen: () => {\r\n                    timerInterval = setInterval(() => {\r\n                        let content = Swal.getContent(),\r\n                            min = content.querySelector(\".ew-session-counter-minute\"),\r\n                            sec = content.querySelector(\".ew-session-counter-second\"),\r\n                            timeleft = Math.round(Swal.getTimerLeft() / 1000);\r\n                        if (min && sec) {\r\n                            min.textContent = Math.floor(timeleft / 60);\r\n                            sec.textContent = timeleft % 60;\r\n                        } else if (sec) {\r\n                            sec.textContent = timeleft;\r\n                        }\r\n                    }, 1000)\r\n                },\r\n                onClose: () => {\r\n                    clearInterval(timerInterval);\r\n                }\r\n            }).then((result) => {\r\n                if (result.value) { // OK button pressed\r\n                    keepAlive();\r\n                    if (!useKeepAlive && ew.SESSION_TIMEOUT > 0)\r\n                        setTimer();\r\n                } else if (result.dismiss === Swal.DismissReason.timer) { // Timeout\r\n                    resetTimer();\r\n                    window.location = sanitizeUrl(ew.TIMEOUT_URL + \"?expired=1\");\r\n                }\r\n            });\r\n        }\r\n    };\r\n    // Set timer\r\n    var setTimer = () => {\r\n        resetTimer(); // Reset timer first\r\n        timer = $.later(timeoutTime * 1000, null, timeout);\r\n    };\r\n    if (useKeepAlive) { // Keep alive\r\n        var keepAliveInterval = (ew.SESSION_KEEP_ALIVE_INTERVAL > 0) ? ew.SESSION_KEEP_ALIVE_INTERVAL : ew.SESSION_TIMEOUT - ew.SESSION_TIMEOUT_COUNTDOWN;\r\n        if (keepAliveInterval <= 0)\r\n            keepAliveInterval = 60;\r\n        keepAliveTimer = $.later(keepAliveInterval * 1000, null, keepAlive, null, true); // Periodic\r\n    } else {\r\n        if (ew.SESSION_TIMEOUT > 0) // Set session timeout\r\n            setTimer();\r\n    }\r\n}\r\n\r\n// Init export links\r\nexport function initExportLinks(e) {\r\n    var el = (e && e.target) ? e.target : document;\r\n    $(el).find(\".ew-export-link[href]:not(.ew-email):not(.ew-print):not(.ew-xml)\").on(\"click\", function(e) {\r\n        var href = $(this).attr(\"href\");\r\n        if (href && href != \"#\")\r\n            fileDownload(href);\r\n        e.preventDefault();\r\n    });\r\n}\r\n\r\n// Init multi-select checkboxes\r\nexport function initMultiSelectCheckboxes(e) {\r\n    var el = (e && e.target) ? e.target : document,\r\n        $el = $(el),\r\n        $cbs = $el.find(\"input[type=checkbox].ew-multi-select\");\r\n    var _update = function(id) {\r\n        var $els = $cbs.filter(\"[name^='\" + id + \"_']\"), cnt = $els.length, len = $els.filter(\":checked\").length;\r\n        $els.closest(\"form\").find(\"input[type=checkbox]#\" + id)\r\n            .prop(\"checked\", len == cnt).prop(\"indeterminate\", len != cnt && len != 0);\r\n    };\r\n    $cbs.on(\"click\", function(e) {\r\n        _update(this.name.split(\"_\")[0]);\r\n    });\r\n    $el.find(\"input[type=checkbox].ew-priv:not(.ew-multi-select)\").each(function() {\r\n        _update(this.id); // Init\r\n    });\r\n}\r\n\r\n// Download file\r\nexport function fileDownload(href, data) {\r\n    let win = window.parent,\r\n        jq = win.jQuery,\r\n        swal = win.Swal,\r\n        doc = win.document,\r\n        $doc = jq(doc),\r\n        method = data ? \"POST\" : \"GET\",\r\n        isHtml = href.includes(\"export=html\");\r\n    return swal.fire({\r\n        ...ew.sweetAlertSettings,\r\n        html: \"<p>\" + ew.language.phrase(\"Exporting\") + \"</p>\",\r\n        allowOutsideClick: false,\r\n        allowEscapeKey: false,\r\n        onBeforeOpen: () => {\r\n            swal.showLoading(),\r\n            jq.ajax({\r\n                url: href,\r\n                type: method,\r\n                cache: false,\r\n                data: data || null,\r\n                xhrFields: {\r\n                    responseType: isHtml ? \"text\" : \"blob\"\r\n                }\r\n            }).done((data, textStatus, jqXHR) => {\r\n                var url = win.URL.createObjectURL(isHtml ? new Blob([data], { type: \"text/html\" }) : data),\r\n                    a = doc.createElement(\"a\"),\r\n                    cd = jqXHR.getResponseHeader(\"Content-Disposition\"),\r\n                    m = cd.match(/\\bfilename=((['\"])(.+)\\2|([^;]+))/i);\r\n                a.style.display = \"none\";\r\n                a.href = url;\r\n                if (m)\r\n                    a.download = m[3] || m[4];\r\n                doc.body.appendChild(a);\r\n                a.click();\r\n                $doc.trigger(\"export\", [{ \"type\": \"done\", \"url\": href, \"objectUrl\": url }]);\r\n                win.URL.revokeObjectURL(url);\r\n                swal.close();\r\n            }).fail(() => {\r\n                swal.showValidationMessage(\"<div class='text-danger'><h4>\" + ew.language.phrase(\"FailedToExport\") + \"</h4>\" + response + \"</div>\");\r\n                $doc.trigger(\"export\", [{ \"type\": \"fail\", \"url\": href }]);\r\n            }).always(() => {\r\n                $doc.trigger(\"export\", [{ \"type\": \"always\", \"url\": href }]);\r\n            });\r\n        }\r\n    });\r\n}\r\n\r\n// Lazy load images\r\nexport function lazyLoad(e) {\r\n    if (!ew.LAZY_LOAD)\r\n        return;\r\n    var el = (e && e.target) ? e.target : document;\r\n    $(el).find(\"img.ew-lazy\").each(function () {\r\n        this.src = this.dataset.src;\r\n    });\r\n    $document.trigger(\"lazyload\"); // All images loaded\r\n}\r\n\r\n// Update select2 dropdown position\r\nexport function updateDropdownPosition() {\r\n    var select = $(\".select2-container--open\").prev(\".ew-select\").data(\"select2\");\r\n    if (select) {\r\n        select.dropdown._positionDropdown();\r\n        select.dropdown._resizeDropdown();\r\n    }\r\n}\r\n\r\n// Colorboxes\r\nexport function initLightboxes(e) {\r\n    if (!ew.USE_COLORBOX)\r\n        return;\r\n    var el = (e && e.target) ? e.target : document;\r\n    var settings = Object.assign({}, ew.lightboxSettings, {\r\n        title: ew.language.phrase(\"LightboxTitle\"),\r\n        current: ew.language.phrase(\"LightboxCurrent\"),\r\n        previous: ew.language.phrase(\"LightboxPrevious\"),\r\n        next: ew.language.phrase(\"LightboxNext\"),\r\n        close: ew.language.phrase(\"LightboxClose\"),\r\n        xhrError: ew.language.phrase(\"LightboxXhrError\"),\r\n        imgError: ew.language.phrase(\"LightboxImgError\")\r\n    });\r\n    $(el).find(\".ew-lightbox\").each(function() {\r\n        var $this = $(this);\r\n        $this.colorbox(Object.assign({ rel: $this.data(\"rel\") }, settings));\r\n    });\r\n}\r\n\r\n// PDFObjects\r\nexport function initPdfObjects(e) {\r\n    if (!ew.EMBED_PDF)\r\n        return;\r\n    var el = (e && e.target) ? e.target : document,\r\n        options = Object.assign({}, ew.PDFObjectOptions);\r\n    $(el).find(\".ew-pdfobject\").not(\":has(.pdfobject)\").each(function() { // Not already embedded\r\n        var $this = $(this), url = $this.data(\"url\"), html = $this.html();\r\n        if (url)\r\n            PDFObject.embed(url, this, Object.assign(options, { fallbackLink: html }));\r\n    });\r\n}\r\n\r\n// Tooltips and popovers\r\nexport function initTooltips(e) {\r\n    var el = (e && e.target) ? e.target : document, $el = $(el);\r\n    $el.find(\"input[data-toggle=tooltip],textarea[data-toggle=tooltip],select[data-toggle=tooltip]\").each(function() {\r\n        var $this = $(this);\r\n        $this.tooltip(Object.assign({ html: true, placement: \"bottom\", sanitizeFn: ew.sanitizeFn }, $this.data()));\r\n    });\r\n    $el.find(\"a.ew-tooltip-link\").each(tooltip); // Init tooltips\r\n    $el.find(\".ew-tooltip\").tooltip({ placement: \"bottom\", sanitizeFn: ew.sanitizeFn });\r\n    $el.find(\".ew-popover\").popover({ sanitizeFn: ew.sanitizeFn });\r\n}\r\n\r\n// Parse JSON\r\nexport function parseJson(data) {\r\n    if ($.isString(data)) {\r\n        try {\r\n            return JSON.parse(data);\r\n        } catch(e) {\r\n            return undefined;\r\n        }\r\n    }\r\n    return data;\r\n}\r\n\r\n// Change search operator\r\nexport function searchOperatorChanged(el) {\r\n    var $el = $(el),\r\n        $p = $el.closest(\"[id^=r_], [id^=xsc_]\"),\r\n        parm = el.id.substr(2),\r\n        $fld = $p.find(\".ew-search-field\"),\r\n        $fld2 = $p.find(\".ew-search-field2\"),\r\n        $y = $fld2.find(\"[name='y_\" + parm + \"'], [name='y_\" + parm + \"[]']\"),\r\n        hasY = $y.length,\r\n        $cond = $p.find(\".ew-search-cond\"),\r\n        hasCond = $cond.length, // Has condition and operator 2\r\n        $and = $p.find(\".ew-search-and\"),\r\n        $opr = $p.find(\".ew-search-operator\"),\r\n        opr = $opr.find(\"[name='z_\" + parm + \"']\").val(),\r\n        $opr2 = $p.find(\".ew-search-operator2\"),\r\n        opr2 = $opr2.find(\"[name='w_\" + parm + \"']\").val(),\r\n        isBetween = opr == \"BETWEEN\", // Can only be operator 1\r\n        isNullOpr = [\"IS NULL\", \"IS NOT NULL\"].includes(opr),\r\n        isNullOpr2 = [\"IS NULL\", \"IS NOT NULL\"].includes(opr2),\r\n        hideOpr2 = !hasY || isBetween,\r\n        hideX = isNullOpr,\r\n        hideY = !isBetween && (!hasCond || isNullOpr2);\r\n    $cond.toggleClass(\"d-none\", hideOpr2).find(\":input\").prop(\"disabled\", hideOpr2);\r\n    $and.toggleClass(\"d-none\", !isBetween);\r\n    $opr2.toggleClass(\"d-none\", hideOpr2).find(\":input\").prop(\"disabled\", hideOpr2);\r\n    $fld.toggleClass(\"d-none\", hideX).find(\":input\").prop(\"disabled\", hideX);\r\n    $fld2.toggleClass(\"d-none\", hideY).find(\":input\").prop(\"disabled\", hideY);\r\n}\r\n\r\n// Init forms\r\nfunction initForms(e) {\r\n    let el = (e && e.target) ? e.target : document,\r\n        $el = $(el),\r\n        ids = ew.forms.ids();\r\n    for (let id of ids) {\r\n        if ($el.find(\"#\" + id))\r\n            forms.get(id).init();\r\n    }\r\n}\r\n\r\n// Is function\r\nexport function isFunction(x) {\r\n    return typeof x === \"function\";\r\n}\r\n\r\n// Prompt/Confirm/Alert\r\nfunction _prompt(text, cb, input, validator) {\r\n    if (input) { // Prompt\r\n        return Swal.fire({\r\n            ...ew.sweetAlertSettings,\r\n            html: text,\r\n            input: \"text\",\r\n            confirmButtonText: ew.language.phrase(\"OKBtn\"),\r\n            showCancelButton: isFunction(cb),\r\n            cancelButtonText: ew.language.phrase(\"CancelBtn\"),\r\n            inputValidator: validator || ((value) => {\r\n                if (!value)\r\n                    return ew.language.phrase(\"EnterValue\");\r\n            })\r\n        }).then(result => {\r\n            if (isFunction(cb))\r\n                cb(result.value);\r\n        });\r\n    } else { // Confirm or Alert\r\n        return Swal.fire({\r\n            ...ew.sweetAlertSettings,\r\n            html: \"<div>\" + text + \"</div>\",\r\n            confirmButtonText: ew.language.phrase(\"OKBtn\"),\r\n            showCancelButton: isFunction(cb),\r\n            cancelButtonText: ew.language.phrase(\"CancelBtn\"),\r\n        }).then(result => {\r\n            if (isFunction(cb))\r\n                cb(result.value);\r\n        });\r\n    }\r\n}\r\n\r\nexport { _prompt as prompt };\r\n\r\n// Toast\r\nexport function toast(options) {\r\n    options = Object.assign({}, ew.toastOptions, options);\r\n    $document.Toasts(\"create\", options);\r\n    var position = options.position,\r\n        $container = $(\"#toastsContainer\" + position[0].toUpperCase() + position.substring(1));\r\n    return $container.children().first();\r\n}\r\n\r\n/**\r\n * Show toast\r\n *\r\n * @param {string} msg - Message\r\n * @param {string} type - CSS class: \"muted|primary|success|info|warning|danger\"\r\n */\r\nexport function showToast(msg, type) {\r\n    type = type || \"danger\";\r\n    return toast({\r\n        class: \"ew-toast bg-\" + type,\r\n        title: ew.language.phrase(type),\r\n        body: msg,\r\n        autohide: (type == \"success\") ? ew.autoHideSuccessMessage : false, // Autohide for success message\r\n        delay: (type == \"success\") ? ew.autoHideSuccessMessageDelay: 500\r\n    });\r\n}\r\n\r\n// Get form.ew-form or div.ew-form HTML element\r\nexport function getForm(el) {\r\n    if (el instanceof Form)\r\n        return el.$element[0];\r\n    var $el = $(el), $f = $el.closest(\".ew-form\");\r\n    if (!$f[0]) // Element not inside form\r\n        $f = $el.closest(\".ew-grid, .ew-multi-column-grid\").find(\".ew-form\").not(\".ew-pager-form\");\r\n    return $f[0];\r\n}\r\n\r\n// Check form data\r\nexport function hasFormData(form) {\r\n    var selector = \"[name^=x_],[name^=y_],[name^=z_],[name^=w_],[name=psearch]\",\r\n        els = $(form).find(selector).filter(\":enabled\").get();\r\n    for (var i = 0, len = els.length; i < len; i++) {\r\n        var el = els[i];\r\n        if (/^(z|w)_/.test(el.name)) {\r\n            if (/^IS/.test($(el).val()))\r\n                return true;\r\n        } else if (el.type == \"checkbox\" || el.type == \"radio\") {\r\n            if (el.checked)\r\n                return true;\r\n        } else if (el.type == \"select-one\" || el.type == \"select-multiple\") {\r\n            if (!!$(el).val())\r\n                return true;\r\n        } else if (el.type == \"text\" || el.type == \"hidden\" || el.type == \"textarea\") {\r\n            if (el.value)\r\n                return true;\r\n        }\r\n    }\r\n    return false;\r\n}\r\n\r\n// Set search type\r\nexport function setSearchType(el, val) {\r\n    var $this = $(el), $form = $this.closest(\"form\"), text = \"\";\r\n    $form.find(\"input[name=psearchtype]\").val(val || \"\");\r\n    if (val == \"=\") {\r\n        text = ew.language.phrase(\"QuickSearchExactShort\");\r\n    } else if (val == \"AND\") {\r\n        text = ew.language.phrase(\"QuickSearchAllShort\");\r\n    } else if (val == \"OR\") {\r\n        text = ew.language.phrase(\"QuickSearchAnyShort\");\r\n    } else {\r\n        text = ew.language.phrase(\"QuickSearchAutoShort\");\r\n    }\r\n    $form.find(\"#searchtype\").html(text + ((text) ? \"&nbsp;\" : \"\"));\r\n    $this.closest(\"ul\").find(\"li\").removeClass(\"active\");\r\n    $this.closest(\"li\").addClass(\"active\");\r\n    return false;\r\n}\r\n\r\n/**\r\n * Update a dynamic selection list\r\n *\r\n * @param {(HTMLElement|HTMLElement[]|string|string[])} obj - Target HTML element(s) or the ID of the element(s)\r\n * @param {(string[]|array[])} parentId - Parent field element names or data\r\n * @param {(boolean|null)} async - async(true) or sync(false) or non-Ajax(null)\r\n * @param {boolean} change - Trigger onchange event\r\n * @returns\r\n */\r\nexport function updateOptions(obj, parentId, async, change) {\r\n    var f = (this.$element) ? this.$element[0] : (this.form) ? this.form : null; // Get form/div element from this\r\n    if (!f)\r\n        return;\r\n    var frm = (this.htmlForm) ? this : forms.get(f.id); // Get Form object\r\n    if (!frm)\r\n        return;\r\n    if (this.form && $.isUndefined(obj)) // Target unspecified\r\n        obj = forms.get(this).getList(this.name).childFields.slice(); // Clone\r\n    else if ($.isString(obj))\r\n        obj = getElements(obj, f);\r\n    if (!obj || Array.isArray(obj) && obj.length == 0)\r\n        return;\r\n    var self = this, promise = Promise.resolve();\r\n    if (Array.isArray(obj) && $.isString(obj[0])) { // Array of id (onchange/onclick event)\r\n        var els = [];\r\n        for (var i = 0, len = obj.length; i < len; i++) {\r\n            var ar = obj[i].split(\" \");\r\n            if (ar.length == 1 && self.form) { // Parent/Child fields in the same table\r\n                var m = getId(self, false).match(/^([xy]\\d*_)/);\r\n                if (m)\r\n                    obj[i] = obj[i].replace(/^([xy]\\d*_)/, m[1]);\r\n            }\r\n            var el = getElements(obj[i], f), names = [];\r\n            els.push(el);\r\n            if (ar.length == 2 && Array.isArray(el)) { // Check if id is \"tblvar fldvar\" and multiple inputs\r\n                var $el = $(el);\r\n                $el.each(function() {\r\n                    if (!names.includes(this.name)) {\r\n                        names.push(this.name);\r\n                        var $elf = $el.filter(\"[name='\" + this.name + \"']\"), typ = $elf.attr(\"type\"),\r\n                            elf = [\"radio\", \"checkbox\"].includes(typ) ? $elf.get() : $elf[0];\r\n                        promise = promise.then(_updateOptions.bind(self, elf, parentId, async, change));\r\n                    }\r\n                });\r\n            } else {\r\n                promise = promise.then(_updateOptions.bind(self, el, parentId, async, change));\r\n            }\r\n        }\r\n        obj = els;\r\n        var list = forms.get(self).getList(self.name);\r\n        if (list && Array.isArray(list.autoFillTargetFields) && list.autoFillTargetFields[0]) // AutoFill\r\n            promise = promise.then(autoFill.bind(null, self));\r\n    } else {\r\n        promise = promise.then(_updateOptions.bind(self, obj, parentId, async, change));\r\n    }\r\n    return promise.then(function() {\r\n        $document.trigger(\"updatedone\", [{ source: self, target: obj }]); // Document \"updatedone\" event fired after all the target elements are updated\r\n    });\r\n}\r\n\r\n/**\r\n * Update a dynamic selection list\r\n *\r\n * @param {(HTMLElement|HTMLElement[]} obj - Target HTML element(s) or the ID of the element(s)\r\n * @param {(string[]|array[])} parentId - Parent field element names or data\r\n * @param {(boolean|null)} async - async(true) or sync(false) or non-Ajax(null)\r\n * @param {boolean} change - Trigger onchange event\r\n * @returns Promise\r\n */\r\nfunction _updateOptions(obj, parentId, async, change) {\r\n    var id = getId(obj, false);\r\n    if (!id)\r\n        return;\r\n    var fo = getForm(obj); // Get form/div element from obj\r\n    if (!fo || !fo.id)\r\n        return;\r\n    var frmo = forms.get(fo.id);\r\n    if (!frmo)\r\n        return;\r\n    var self = this,\r\n        args = Array.from(arguments),\r\n        ar = getOptionValues(obj),\r\n        m = id.match(/^([xy])(\\d*)_/),\r\n        prefix = m ? m[1] : \"\",\r\n        rowindex = m ? m[2] : \"\",\r\n        arp = [],\r\n        list = frmo.getList(id),\r\n        $obj = $(obj).data(\"updating\", true);\r\n    if ($obj.data(\"hidden\")) // Skip data-hidden field, e.g. detail key\r\n        return;\r\n    if ($.isUndefined(parentId)) { // Parent IDs not specified, use default\r\n        parentId = list.parentFields.slice(); // Clone\r\n        if (rowindex != \"\") {\r\n            for (var i = 0, len = parentId.length; i < len; i++) {\r\n                var arr = parentId[i].split(\" \");\r\n                if (arr.length == 1) // Parent field in the same table, add row index\r\n                    parentId[i] = parentId[i].replace(/^x_/, \"x\" + rowindex + \"_\");\r\n            }\r\n        }\r\n    }\r\n    if (Array.isArray(parentId) && parentId.length > 0) {\r\n        if (Array.isArray(parentId[0])) { // Array of array => data\r\n            arp = parentId;\r\n        } else if ($.isString(parentId[0])) { // Array of string => Parent IDs\r\n            for (var i = 0, len = parentId.length; i < len; i++)\r\n                arp.push(getOptionValues(parentId[i], fo));\r\n        }\r\n    }\r\n    if (!isAutoSuggest(obj)) // Do not clear Auto-Suggest\r\n        clearOptions(obj);\r\n    var addOpt = function(results) {\r\n        var name = getId(obj);\r\n        results.forEach(function(result) {\r\n            let args = {\"data\": result, \"parents\": arp, \"valid\": true, \"name\": name, \"form\": fo};\r\n            $document.trigger(\"addoption\", [args]);\r\n            if (args.valid)\r\n                newOption(obj, result, fo);\r\n        });\r\n        if (obj.list)\r\n            obj.render();\r\n        selectOption(obj, ar);\r\n        if (change !== false) {\r\n            if (!obj.options && obj.length)\r\n                $obj.first().triggerHandler(\"click\");\r\n            else\r\n                $obj.first().trigger(\"change\");\r\n        }\r\n    }\r\n    if ($.isUndefined(async)) // Async not specified, use default\r\n        async = list.ajax;\r\n    var _updateSibling = function() { // Update the y_* element\r\n        if (/s(ea)?rch$/.test(fo.id) && prefix == \"x\") { // Search form\r\n            args[0] = id.replace(/^x_/, \"y_\");\r\n            updateOptions.apply(self, args); // args[0] is string, use updateOptions()\r\n        }\r\n    }\r\n    if (!$.isBoolean(async) || Array.isArray(list.lookupOptions) && list.lookupOptions.length > 0) { // Non-Ajax or Options loaded\r\n        var ds = list.lookupOptions;\r\n        addOpt(ds);\r\n        _updateSibling();\r\n        return ds;\r\n    } else { // Ajax\r\n        var name = getId(obj), data = Object.assign({\r\n            page: list.page,\r\n            field: list.field,\r\n            ajax: \"updateoption\",\r\n            language: ew.LANGUAGE_ID,\r\n            name: name // Name of the target element\r\n        }, getUserParams(\"#p_\" + id, fo)); // Add user parameters\r\n        if (isAutoSuggest(obj) && self.htmlForm) // Auto-Suggest (init form or auto-fill)\r\n            data[\"v0\"] = ar[0] || random(); // Filter by the current value\r\n        else if (isModalLookup(obj)) // Modal-Lookup\r\n            data[\"v0\"] = ar[0] ? (obj.multiple ? ar.join(ew.MULTIPLE_OPTION_SEPARATOR) : ar[0]) : random(); // Filter by the current value\r\n        for (var i = 0, cnt = arp.length; i < cnt; i++) // Filter by parent fields\r\n            data[\"v\" + (i + 1)] = arp[i].join(ew.MULTIPLE_OPTION_SEPARATOR);\r\n        return $.ajax(getApiUrl(ew.API_LOOKUP_ACTION), {\r\n                \"type\": \"POST\", \"dataType\": \"json\", \"data\": data, \"async\": async\r\n            }).done((result) => {\r\n                var ds = result.records || [];\r\n                addOpt(ds);\r\n                _updateSibling();\r\n                $obj.first().trigger(\"updated\", [Object.assign({}, result, { target: obj })]); // Object \"updatedone\" event fired after the object is updated\r\n                return ds;\r\n            }).always(() => $obj.data(\"updating\", false));\r\n    }\r\n}\r\n\r\n// Get user parameters from id\r\nexport function getUserParams(id, root) {\r\n    var id = id.replace(/\\[\\]$/, \"\"), o = {};\r\n    var root = !$.isString(root) ? root : /^#/.test(root) ? root : \"#\" + root;\r\n    var $els = (root) ? $(root).find(id) : $(id);\r\n    var val = $els.val();\r\n    if (val) {\r\n        var params = new URLSearchParams(val);\r\n        params.forEach(function(value, key) {\r\n            o[key] = value;\r\n        });\r\n    }\r\n    return o;\r\n}\r\n\r\n// Apply client side template to a DIV\r\nexport function applyTemplate(divId, tmplId, classId, exportType, data) { // Note: classId = fileName\r\n    var args = {\"data\": data || {}, \"id\": divId, \"template\": tmplId, \"class\": classId, \"export\": exportType, \"enabled\": true};\r\n    $document.trigger(\"rendertemplate\", [args]);\r\n    if (args.enabled) {\r\n        if (document.body.replaceWith) { // Not IE\r\n            var template = document.getElementById(tmplId).content;\r\n            template.querySelectorAll(\".ew-slot\").forEach(el => {\r\n                var subtmpl = document.getElementById(el.name || el.id);\r\n                if (subtmpl && subtmpl.content) {\r\n                    if (el.dataset.rowspan > 1)\r\n                        Array.prototype.slice.call(subtmpl.content.childNodes).forEach(node => node.rowSpan = el.dataset.rowspan);\r\n                    el.replaceWith(subtmpl.content);\r\n                } else {\r\n                    el.remove();\r\n                }\r\n            });\r\n            if ($.views) {\r\n                var textContent = template.textContent,\r\n                    hasTag = textContent.includes(\"{{\") && textContent.includes(\"}}\");\r\n                if (!hasTag) {\r\n                    var selector = ew.jsRenderAttributes.map(attr => \"[\" + attr + \"*='{{'][\" + attr + \"*='}}']\").join(\",\");\r\n                    hasTag = template.querySelector(selector);\r\n                }\r\n                if (hasTag) { // Includes JsRender template\r\n                    var scripts = Array.prototype.slice.call(template.querySelectorAll(\"script\")); // Extract scripts\r\n                    scripts.forEach(item => item.remove());\r\n                    var div = document.createElement(\"div\");\r\n                    div.appendChild(template);\r\n                    var html = div.innerHTML, tmpl = $.templates(html);\r\n                    document.getElementById(divId).innerHTML = tmpl.render(args.data, ew.jsRenderHelpers);\r\n                    scripts.forEach(item => document.body.appendChild(item)); // Add scripts\r\n                } else {\r\n                    document.getElementById(divId).appendChild(template);\r\n                }\r\n            } else {\r\n                document.getElementById(divId).appendChild(template);\r\n            }\r\n        } else { // IE\r\n            _alert(ew.language.phrase(\"UnsupportedBrowser\") || \"Your browser is not supported by this page.\");\r\n        }\r\n    }\r\n    if (exportType && exportType != \"print\") { // Export custom\r\n        $(function() {\r\n            var $meta = $(\"meta[http-equiv='Content-Type']\"),\r\n                html = \"<html><head>\",\r\n                $div = $(\"#\" + divId);\r\n            if ($div.children(0).is(\"div[id^=ct_]\")) // Remove first div tag\r\n                $div = $div.children(0);\r\n            if ($meta[0])\r\n                html += \"<meta http-equiv='Content-Type' content='\" + $meta.attr(\"content\") + \"'>\";\r\n            if (exportType == \"pdf\") {\r\n                html += \"<link rel='stylesheet' href='\" + ew.PDF_STYLESHEET_FILENAME + \"'>\";\r\n            } else {\r\n                html += \"<style>\" + $.ajax({async: false, type: \"GET\", url: ew.PROJECT_STYLESHEET_FILENAME}).responseText + \"</style>\";\r\n            }\r\n            html += \"</\" + \"head><body>\";\r\n            $(\".ew-chart-top\").each(function() {\r\n                html += $(this).html();\r\n            });\r\n            html += $div.html();\r\n            $(\".ew-chart-bottom\").each(function() {\r\n                html += $(this).html();\r\n            });\r\n            html += \"</body></html>\";\r\n            var url = currentPage(),\r\n                data = { \"customexport\": exportType, \"data\": html, \"filename\": args.class };\r\n            data[ew.TOKEN_NAME] = ew.ANTIFORGERY_TOKEN;\r\n            if (exportType == \"email\") {\r\n                var str = currentUrl.searchParams.toString() + \"&\" + $.param(data); // Add data\r\n                $.post(url, str, function(result) {\r\n                    showMessage(result);\r\n                });\r\n            } else {\r\n                fileDownload(url, data);\r\n            }\r\n            window.parent.jQuery(\"body\").css(\"cursor\", \"default\"); // Use window.parent in case in iframe\r\n        });\r\n    }\r\n}\r\n\r\n// Toggle group\r\nexport function toggleGroup(el) {\r\n    var $el = $(el), $tr = $el.closest(\"tr\"), selector = \"tr\", level;\r\n    for (var i = 1; i <= 6; i++) {\r\n        var idx = (i == 1) ? \"\" : \"-\" + i;\r\n        var data = $tr.data(\"group\" + idx);\r\n        if ($.isValue(data)) {\r\n            level = i;\r\n            if (data != \"\")\r\n                selector += \"[data-group\" + idx + \"='\" + String(data).replace(/'/g, \"\\\\'\") + \"']\";\r\n        }\r\n    }\r\n    if ($el.hasClass(\"icon-collapse\")) { // Hide\r\n        $(selector).slice(1).addClass(\"ew-rpt-grp-hide-\" + level);\r\n        $el.toggleClass(\"icon-expand icon-collapse\");\r\n    } else {\r\n        $(selector).slice(1).removeClass(\"ew-rpt-grp-hide-\" + level);\r\n        $el.toggleClass(\"icon-expand icon-collapse\");\r\n    }\r\n}\r\n\r\n// Check if boolean value is true\r\nexport function convertToBool(value) {\r\n    return value && [\"1\", \"y\", \"t\", \"true\"].includes(value.toLowerCase());\r\n}\r\n\r\n// Check if element value changed\r\nexport function valueChanged(fobj, infix, fld, bool) {\r\n    var nelm = getElements(\"x\" + infix + \"_\" + fld, fobj);\r\n    var oelm = getElement(\"o\" + infix + \"_\" + fld, fobj); // Hidden element\r\n    var fnelm = getElement(\"fn_x\" + infix + \"_\" + fld, fobj); // Hidden element\r\n    if (nelm?.type == \"hidden\" && !oelm) // For example, detail key\r\n        return false;\r\n    if (!oelm && (!nelm || Array.isArray(nelm) && nelm.length == 0))\r\n        return false;\r\n    var getValue = (obj) => getOptionValues(obj).join();\r\n    if (oelm && nelm) {\r\n        if (bool) {\r\n            if (convertToBool(getValue(oelm)) === convertToBool(getValue(nelm)))\r\n                return false;\r\n        } else {\r\n            var oldvalue = getValue(oelm);\r\n            var newvalue = (fnelm) ? getValue(fnelm) : getValue(nelm);\r\n            if (oldvalue == newvalue)\r\n                return false;\r\n        }\r\n    }\r\n    return true;\r\n}\r\n\r\n// Set language\r\nexport function setLanguage(el) {\r\n    var $el = $(el),\r\n        val = $el.val() || $el.data(\"language\");\r\n    if (!val)\r\n        return;\r\n    currentUrl.searchParams.set(\"language\", val);\r\n    window.location = sanitizeUrl(currentUrl.toString());\r\n}\r\n\r\n/**\r\n * Submit action\r\n *\r\n * @param {Event} e\r\n * @param {Object} args - Arguments\r\n * @param {HTMLElement} args.f - HTML form (default is the form of the source element)\r\n * @param {string} args.url - URL to which the request is sent (default is current page)\r\n * @param {Object} args.key - Key as object (for single record only)\r\n * @param {string} args.msg - Confirm message\r\n * @param {string} args.action - Custom action name\r\n * @param {string} args.select - \"single\"|\"s\" (single record) or \"multiple\"|\"m\" (multiple records, default)\r\n * @param {string} args.method - \"ajax\"|\"a\" (Ajax by HTTP POST) or \"post\"|\"p\" (HTTP POST, default)\r\n * @param {Object} args.data - Object of user data that is sent to the server\r\n * @param {string|callback|Object} success - Function to be called if the request succeeds, or settings for jQuery.ajax() (for Ajax only)\r\n * @returns\r\n */\r\nexport function submitAction(e, args) {\r\n    var el = e.target || e.srcElement, $el = $(el),\r\n        f = args.f || $el.closest(\"form\")[0] || currentForm, $f = $(f),\r\n        key = args.key, action = args.action, url = args.url || currentPage(),\r\n        msg = args.msg, data = args.data, success = args.success,\r\n        isPost = !args.method || sameText(args.method[0], \"p\"),\r\n        isMultiple = !args.select && !args.key || args.select && sameText(args.select[0], \"m\");\r\n    if (isMultiple && !$f[0])\r\n        return false;\r\n    if (isMultiple && !keySelected($f[0])) {\r\n        _prompt(\"<p class=\\\"text-danger\\\">\" + ew.language.phrase(\"NoRecordSelected\") + \"</p>\");\r\n        return false;\r\n    }\r\n    var _success = function(result) {\r\n        showMessage(result);\r\n    };\r\n    var _submit = function() {\r\n        if (isPost) { // Post back\r\n            if (action) // Action\r\n                $(\"<input>\").attr({type: \"hidden\", name: \"useraction\", value: action}).appendTo($f);\r\n            if ($.isObject(data)) { // User data\r\n                for (var k in data) {\r\n                    var $input = $f.find(\"input[type=hidden][name='\" + k + \"']\");\r\n                    if ($input[0])\r\n                        $input.val(data[k]);\r\n                    else\r\n                        $(\"<input>\").attr({type: \"hidden\", name: k, value: data[k]}).appendTo($f);\r\n                }\r\n            }\r\n            if (!isMultiple && $.isObject(key)) { // Key\r\n                for (var k in key)\r\n                    $(\"<input>\").attr({type: \"hidden\", name: k, value: key[k]}).appendTo($f);\r\n            }\r\n            $f.prop(\"action\", url).trigger(\"submit\");\r\n            // if (action) // Action\r\n            //     $f.find(\"input[type=hidden][name=useraction]\").remove(); // Remove the \"useraction\" element\r\n        } else { // Ajax\r\n            data = $.isObject(data) ? $.param(data) : $.isString(data) ? data : \"\"; // User data\r\n            if (action)\r\n                data += \"&useraction=\" + action + \"&ajax=\" + action; // Action\r\n            if (isMultiple) // Multiple records\r\n                data += \"&\" + $f.find(\"input[name='key_m[]']:checked\").serialize(); // Keys\r\n            else if (key) // Single record\r\n                data += \"&\" + ($.isObject(key) ? $.param(key) : key); // Key\r\n            if (success && $.isString(success))\r\n                success = window[success];\r\n            if (isFunction(success)) {\r\n                $.post(url, data, success);\r\n            } else if ($.isObject(success)) { // \"success\" is Ajax settings\r\n                success.data = data;\r\n                success.method = success.method || \"POST\";\r\n                success.success = success.success || _success;\r\n                $.ajax(url, success);\r\n            } else {\r\n                $.post(url, data, _success);\r\n            }\r\n        }\r\n    };\r\n    if (msg) {\r\n        _prompt(msg, (result) => {\r\n            if (result)\r\n                _submit();\r\n        });\r\n    } else {\r\n        _submit();\r\n    }\r\n    return false;\r\n}\r\n\r\n/**\r\n * Export with selected records and/or Custom Template\r\n *\r\n * @param {string} f - Form ID\r\n * @param {string} url - Form action\r\n * @param {string} type - Export type\r\n * @param {boolean} custom - Using Custom Template\r\n * @param {boolean} sel - Selected records only\r\n * @param {Object} fobj - email form object\r\n * @returns false\r\n */\r\nfunction _export(f, url, type, custom, sel, fobj) {\r\n    if (!f)\r\n        return false;\r\n    var $f = $(f),\r\n        target = $f.attr(\"target\"),\r\n        action = $f.attr(\"action\"),\r\n        cb = sel && $f.find(\"input[type=checkbox][name='key_m[]']\")[0];\r\n    if (cb && !keySelected(f)) {\r\n        _alert(ew.language.phrase(\"NoRecordSelected\"));\r\n        return false;\r\n    }\r\n    if (custom) { // Use Custom Template\r\n        $(\"iframe.ew-export\").remove();\r\n        if (type == \"email\")\r\n            url += (\"&\" + $(fobj).serialize()).replace(/&export=email/i, \"\"); // Remove duplicate export=email\r\n        if (cb) {\r\n            $(\"<iframe>\").attr(\"name\", \"ew-export-frame\").addClass(\"ew-export d-none\").appendTo($body);\r\n            try {\r\n                $f.append($(\"<input type='hidden'>\").attr({name: \"custom\", value: \"1\"}))\r\n                    .attr({ \"action\": url, \"target\": \"ew-export-frame\" }).find(\"input[name=exporttype]\").val(type).end().trigger(\"submit\");\r\n            } finally { // Reset\r\n                $f.attr({ \"target\": target || \"\", \"action\": action }).find(\"input[name=custom]\").remove();\r\n            }\r\n        } else {\r\n            $(\"<iframe>\").attr({ name: \"ew-export-frame\", src: url }).addClass(\"ew-export d-none\").appendTo($body);\r\n        }\r\n    } else { // No Custom Template\r\n        $f.find(\"input[name=exporttype]\").val(type);\r\n        if ([\"xml\", \"print\"].includes(type))\r\n            $f.trigger(\"submit\"); // Submit the form directly\r\n        else\r\n            fileDownload(action, $f.serialize());\r\n    }\r\n    return false;\r\n}\r\n\r\nexport { _export as export };\r\n\r\n/**\r\n * Remove spaces\r\n * @param {string} value\r\n * @returns {string}\r\n */\r\nexport function removeSpaces(value) {\r\n    return (/^(<(p|br)\\/?>(&nbsp;)?(<\\/p>)?)?$/i.test(value.replace(/\\s/g, \"\"))) ? \"\" : value;\r\n}\r\n\r\n/**\r\n * Check if hidden text area (HTML editor)\r\n * @param {HTMLElement|jQuery} el HTML element or jQuery object\r\n * @returns {boolean}\r\n */\r\nexport function isHiddenTextArea(el) {\r\n    var $el = $(el);\r\n    return $el.is(\":hidden\") && $el.data(\"editor\");\r\n}\r\n\r\n/**\r\n * Check if modal lookup\r\n * @param {HTMLElement|jQuery} el HTML element or jQuery object\r\n * @returns {boolean}\r\n */\r\nexport function isModalLookup(el) {\r\n    var $el = $(el);\r\n    return $el.is(\":hidden\") && $el.data(\"lookup\");\r\n}\r\n\r\n/**\r\n * Check if hidden textbox (Auto-Suggest)\r\n * @param {HTMLElement|jQuery} el HTML element or jQuery object\r\n * @returns {boolean}\r\n */\r\nexport function isAutoSuggest(el) {\r\n    var $el = $(el);\r\n    return $el.is(\":hidden\") && $el.data(\"autosuggest\");\r\n}\r\n\r\n/**\r\n * Alert\r\n *\r\n * @param {string} msg - Message\r\n * @param {callback} cb - Callback function\r\n * @param {string} type - CSS class (see https://getbootstrap.com/docs/4.5/utilities/colors/#color)\r\n */\r\nfunction _alert(msg, cb, type) {\r\n    return Swal.fire({\r\n        ...ew.sweetAlertSettings,\r\n        html: '<p class=\"text-' + (type || 'danger') + '\">' + msg + '</p>',\r\n        confirmButtonText: ew.language.phrase(\"OKBtn\")\r\n    }).then(result => {\r\n        if (isFunction(cb))\r\n            cb(result.value);\r\n    });\r\n}\r\n\r\nexport { _alert as alert };\r\n\r\n/**\r\n * Clear error message\r\n * @param {HTMLElement|HTMLElement[]|jQuery} el HTML element(s) or jQuery\r\n */\r\nexport function clearError(el) {\r\n    if (el.jquery) { // el is jQuery object\r\n        let typ = el.attr(\"type\");\r\n        el = (typ == \"checkbox\" || typ == \"radio\") ? el.get() : el[0];\r\n    }\r\n    $(el).closest(\"[id^=el_], .form-group\").find(\".invalid-feedback\").html(\"\");\r\n}\r\n\r\n/**\r\n * Show error message\r\n * @param {Form} frm Form object\r\n * @param {HTMLElement|HTMLElement[]|jQuery} el HTML element(s) or jQuery\r\n * @param {string} msg Error message\r\n * @param {boolean} focus Set focus\r\n */\r\nexport function onError(frm, el, msg, focus) {\r\n    if (el.jquery) { // el is jQuery object\r\n        let typ = el.attr(\"type\");\r\n        el = (typ == \"checkbox\" || typ == \"radio\") ? el.get() : el[0];\r\n    } else if (el instanceof Field) { // el is Field object\r\n        el = el.element;\r\n    }\r\n    $(el).closest(\"[id^=el_], .form-group\").find(\".invalid-feedback\").append(\"<p>\" + msg + \"</p>\");\r\n    if (focus)\r\n        setFocus(el);\r\n    frm?.makeVisible(el);\r\n    return false;\r\n}\r\n\r\n/**\r\n * Set focus\r\n * @param {HTMLElement|HTMLElement[]} obj HTML element(s)\r\n */\r\nexport function setFocus(obj) {\r\n    if (!obj)\r\n        return;\r\n    var $obj = $(obj);\r\n    if (isHidden($obj))\r\n        return;\r\n    if (isHiddenTextArea(obj)) { // HTML editor\r\n        return $obj.data(\"editor\").focus();\r\n    } else if (isModalLookup(obj)) { // Modal lookup\r\n        return $obj.parent().find(\".ew-lookup-text\").trigger(\"focus\");\r\n    } else if (!obj.options && obj.length) { // Radio/Checkbox list\r\n        obj = $obj[0];\r\n    } else if (isAutoSuggest(obj)) { // Auto-Suggest\r\n        obj = obj.input;\r\n    }\r\n    $(obj).trigger(\"focus\");\r\n}\r\n\r\n/**\r\n * Set invalid\r\n * @param {HTMLElement|HTMLElement[]} obj HTML element(s)\r\n */\r\nexport function setInvalid(obj) {\r\n    if (!obj)\r\n        return;\r\n    var $obj = $(obj);\r\n    if (isHidden($obj))\r\n        return;\r\n    if (!obj.options && obj.length) // Radio/Checkbox list\r\n        obj = $obj[0];\r\n    var $p = $obj.closest(\".form-group, [id^='el']\");\r\n    if (isAutoSuggest(obj)) {\r\n        $p.find(\".ew-auto-suggest\").addClass(\"is-invalid\").one(\"click keydown\", function() {\r\n            $p.find(\".is-invalid\").removeClass(\"is-invalid\");\r\n        });\r\n    } else if (isModalLookup(obj)) {\r\n        $p.find(\".input-group\").addClass(\"is-invalid\").one(\"click keydown\", function() {\r\n            $p.find(\".is-invalid\").removeClass(\"is-invalid\");\r\n        });\r\n    } else {\r\n        if (obj.type == \"checkbox\" || obj.type == \"radio\") {\r\n            $obj.addClass(\"is-invalid\").one(\"click keydown\", function() {\r\n                $p.find(\".is-invalid\").removeClass(\"is-invalid\");\r\n            });\r\n        } else {\r\n            $obj.addClass(\"is-invalid\").parent().one(\"click keydown\", function() {\r\n                $p.find(\".is-invalid\").removeClass(\"is-invalid\");\r\n            })\r\n            $obj.closest(\".input-group\").addClass(\"is-invalid\");\r\n        }\r\n    }\r\n}\r\n\r\n// Check if object has value\r\nexport function hasValue(obj) {\r\n    return getOptionValues(obj).join(\"\") != \"\";\r\n}\r\n\r\n// Check if object value is a masked password\r\nexport function isMaskedPassword(obj) {\r\n    var val = $(obj).val();\r\n    return val && val.match(/^\\*+$/);\r\n}\r\n\r\n// Get Ctrl key for multiple column sort\r\nexport function sort(e, url, type) {\r\n    if (e.shiftKey && !e.ctrlKey)\r\n        url = url.split(\"?\")[0] + \"?cmd=resetsort\";\r\n    else if (type == 2 && e.ctrlKey)\r\n        url += \"&ctrl=1\";\r\n    window.location = sanitizeUrl(url);\r\n    return true;\r\n}\r\n\r\n// Confirm Delete Message\r\nexport function confirmDelete(el) {\r\n    clickDelete(el);\r\n    _prompt(ew.language.phrase(\"DeleteConfirmMsg\"), (result) => {\r\n        (result && el.href) ? window.location = sanitizeUrl(el.href) : clearDelete(el);\r\n    });\r\n    return false;\r\n}\r\n\r\n// Check if any key selected // PHP\r\nexport function keySelected(f) {\r\n    return $(f).find(\"input[type=checkbox][name='key_m[]']:checked\", f).length > 0;\r\n}\r\n\r\n// Select all key\r\nexport function selectAllKey(cb) {\r\n    selectAll(cb);\r\n    var tbl = $(cb).closest(\".ew-table\")[0];\r\n    if (!tbl)\r\n        return;\r\n    $(tbl.tBodies).each(function() {\r\n        $(this.rows).each(function(i, r) {\r\n            var $r = $(r);\r\n            if ($r.is(\":not(.ew-template):not(.ew-table-preview-row)\")) {\r\n                $r.data({ selected: cb.checked, checked: cb.checked });\r\n                setColor(i, r);\r\n            }\r\n        });\r\n    });\r\n}\r\n\r\n// Select all related checkboxes\r\nexport function selectAll(cb) {\r\n    if (!cb || !cb.form)\r\n        return;\r\n    $(cb.form.elements).filter(\"input[type=checkbox][name^=\" + cb.name + \"_], [type=checkbox][name=\" + cb.name + \"]\").not(cb).not(\":disabled\").prop(\"checked\", cb.checked);\r\n}\r\n\r\n// Update selected checkbox\r\nexport function updateSelected(f) {\r\n    return $(f).find(\"input[type=checkbox][name^=u_]:checked,input:hidden[name^=u_][value=1]\").length > 0;\r\n}\r\n\r\n// Set row color\r\nexport function setColor(index, row) {\r\n    var $row = $(row), $tbl = $row.closest(\".ew-table\");\r\n    if (!$tbl[0])\r\n        return;\r\n    if ($row.data(\"selected\")) {\r\n        $row.removeClass($tbl.data(\"rowhighlightclass\") || \"ew-table-highlight-row\")\r\n            .removeClass($tbl.data(\"roweditclass\") || \"ew-table-edit-row\")\r\n            .addClass($tbl.data(\"rowselectclass\") || \"ew-table-select-row\");\r\n    } else if ([ew.ROWTYPE_ADD, ew.ROWTYPE_EDIT].includes($row.data(\"rowtype\"))) {\r\n        $row.removeClass($tbl.data(\"rowselectclass\") || \"ew-table-select-row\")\r\n            .removeClass($tbl.data(\"rowhighlightclass\") || \"ew-table-highlight-row\")\r\n            .addClass($tbl.data(\"roweditclass\") || \"ew-table-edit-row\");\r\n    } else {\r\n        $row.removeClass($tbl.data(\"rowselectclass\") || \"ew-table-select-row\")\r\n            .removeClass($tbl.data(\"roweditclass\") || \"ew-table-edit-row\")\r\n            .removeClass($tbl.data(\"rowhighlightclass\") || \"ew-table-highlight-row\");\r\n    }\r\n}\r\n\r\n// Clear selected rows color\r\nexport function clearSelected(tbl) {\r\n    $(tbl.rows).each(function(i, r) {\r\n        var $r = $(r);\r\n        if (!$r.data(\"checked\") && $r.data(\"selected\")) {\r\n            $r.data(\"selected\", false);\r\n            setColor(i, r);\r\n        }\r\n    });\r\n}\r\n\r\n// Clear all row delete status\r\nexport function clearDelete(el) {\r\n    var $el = $(el), tbl = $el.closest(\".ew-table\")[0];\r\n    if (!tbl)\r\n        return;\r\n    var $tr = $el.closest(\".ew-table > tbody > tr\");\r\n    $tr.siblings(\"[data-rowindex='\" + $tr.data(\"rowindex\") + \"']\").addBack().each(function(i, r) {\r\n        var $r = $(r);\r\n        $r.data(\"selected\", $r.data(\"checked\"));\r\n    });\r\n}\r\n\r\n// Click single delete link\r\nexport function clickDelete(el) {\r\n    var $el = $(el), tbl = $el.closest(\".ew-table\")[0];\r\n    if (!tbl)\r\n        return;\r\n    clearSelected(tbl);\r\n    var $tr = $el.closest(\".ew-table > tbody > tr\");\r\n    $tr.siblings(\"[data-rowindex='\" + $tr.data(\"rowindex\") + \"']\").addBack().each(function(i, r) {\r\n        $(r).data(\"selected\", true);\r\n        setColor(i, r);\r\n    });\r\n}\r\n\r\n// Click multiple checkbox\r\nexport function clickMultiCheckbox(e) {\r\n    var cb = e.target || e.srcElement, $cb = $(cb), tbl = $cb.closest(\".ew-table\")[0];\r\n    if (!tbl)\r\n        return;\r\n    clearSelected(tbl);\r\n    var $tr = $cb.closest(\".ew-table > tbody > tr\");\r\n    $tr.siblings(\"[data-rowindex='\" + $tr.data(\"rowindex\") + \"']\").addBack().each(function(i, r) {\r\n        $(r).data(\"checked\", cb.checked).data(\"selected\", cb.checked).find(\"input[type=checkbox][name='key_m[]']\").each(function() {\r\n            if (this != cb) this.checked = cb.checked;\r\n        });\r\n        setColor(i, r);\r\n    });\r\n    e.stopPropagation();\r\n}\r\n\r\n// Setup table\r\nexport function setupTable(index, tbl, force) {\r\n    var $tbl = $(tbl), $rows = $(tbl.rows);\r\n    if (!tbl || !tbl.rows || !force && $tbl.data(\"isset\") || tbl.tBodies.length == 0)\r\n        return;\r\n\r\n    // Set mouse over color\r\n    var mouseOver = function(e) {\r\n        var $this = $(this);\r\n        if (!$this.data(\"selected\") && ![ew.ROWTYPE_ADD, ew.ROWTYPE_EDIT].includes($this.data(\"rowtype\"))) {\r\n            var $tbl = $this.closest(\".ew-table\");\r\n            if (!$tbl[0])\r\n                return;\r\n            $this.siblings(\"[data-rowindex='\" + $this.data(\"rowindex\") + \"']\").addBack().each(function(i, r) {\r\n                $(r).addClass($tbl.data(\"rowhighlightclass\") || \"ew-table-highlight-row\");\r\n            });\r\n        }\r\n    }\r\n\r\n    // Set mouse out color\r\n    var mouseOut = function(e) {\r\n        var $this = $(this);\r\n        if (!$this.data(\"selected\") && ![ew.ROWTYPE_ADD, ew.ROWTYPE_EDIT].includes($this.data(\"rowtype\")))\r\n            $this.siblings(\"[data-rowindex='\" + $this.data(\"rowindex\") + \"']\").addBack().each(setColor);\r\n    }\r\n\r\n    // Set selected row color\r\n    var click = function(e) {\r\n        var $this = $(this), tbl = $this.closest(\".ew-table\")[0],\r\n            $target = $(e.target);\r\n        if (!tbl || $target.hasClass(\"btn\") || $target.hasClass(\"ew-preview-row-btn\") || $target.is(\":input\"))\r\n            return;\r\n        if (!$this.data(\"checked\")) {\r\n            var selected = $this.data(\"selected\");\r\n            clearSelected(tbl); // Clear all other selected rows\r\n            $this.siblings(\"[data-rowindex='\" + $this.data(\"rowindex\") + \"']\").addBack().each(function(i, r) {\r\n                $(r).data(\"selected\", !selected); // Toggle\r\n                setColor(i, r);\r\n            });\r\n        }\r\n    }\r\n\r\n    var n = $rows.filter(\"[data-rowindex=1]\").length || $rows.filter(\"[data-rowindex=0]\").length || 1; // Alternate color every n rows\r\n    var rows = $rows\r\n        .filter(\":not(.ew-template)\")\r\n        .each(function() {\r\n            $(this.cells).removeClass(\"ew-table-last-row\").last().addClass(\"ew-table-last-col\"); // Cell of last column\r\n        }).get();\r\n    var div = $tbl.parentsUntil(\".ew-grid\", \".\" + ew.RESPONSIVE_TABLE_CLASS)[0];\r\n    if (rows.length) {\r\n        for (var i = 1; i <= n; i++) {\r\n            var r = rows[rows.length - i]; // Last rows\r\n            $(r.cells).each(function() {\r\n                if (this.rowSpan == i) // Cell of last row\r\n                    $(this).addClass(\"ew-table-last-row\")\r\n                        .toggleClass(\"ew-table-border-bottom\", !!div && div.clientHeight > tbl.offsetHeight);\r\n            });\r\n        }\r\n    }\r\n    var form = $tbl.closest(\"form\")[0];\r\n    var attach = form && $(form.elements).filter(\"input#action:not([value^=grid])\").length > 0;\r\n    $(tbl.tBodies[tbl.tBodies.length - 1].rows) // Use last TBODY (avoid Opera bug)\r\n        .filter(\":not(.ew-template):not(.ew-table-preview-row)\")\r\n        .each(function(i) {\r\n            var $r = $(this);\r\n            if (attach && !$r.data(\"isset\")) {\r\n                if ([ew.ROWTYPE_ADD, ew.ROWTYPE_EDIT].includes($r.data(\"rowtype\"))) // Add/Edit row\r\n                    $r.on(\"mouseover\", function() {this.edit = true;}).addClass(\"ew-table-edit-row\");\r\n                $r.on(\"mouseover\", mouseOver).on(\"mouseout\", mouseOut).on(\"click\", click);\r\n                $r.data(\"isset\", true);\r\n            }\r\n            var sw = i % (2 * n) < n;\r\n            $r.toggleClass(\"ew-table-row\", sw).toggleClass(\"ew-table-alt-row\", !sw);\r\n        });\r\n    setupGrid(index, $tbl.closest(\".ew-grid\")[0], force);\r\n    $tbl.data(\"isset\", true);\r\n}\r\n\r\n// Setup grid\r\nexport function setupGrid(index, grid, force) {\r\n    var $grid = $(grid);\r\n    if (!grid || !force && $grid.data(\"isset\"))\r\n        return;\r\n    var multi = $grid.find(\"table.ew-multi-column-table\").length, rowcnt;\r\n    if (multi) {\r\n        rowcnt = $grid.find(\"td[data-rowindex]\").length;\r\n    } else {\r\n        rowcnt = $grid.find(\"table.ew-table > tbody\").first().children(\"tr:not(.ew-table-preview-row, .ew-template)\").length;\r\n    }\r\n    if (rowcnt == 0 && !$grid.find(\".ew-grid-upper-panel, .ew-grid-lower-panel\")[0])\r\n        $grid.hide();\r\n    // if (!$grid.find(\".ew-grid-upper-panel:visible\")[0])\r\n    // \t$grid.css({\"border-top-left-radius\": 0, \"border-top-right-radius\": 0});\r\n    // if (!$grid.find(\".ew-grid-lower-panel:visible\")[0])\r\n    // \t$grid.css({\"border-bottom-left-radius\": 0, \"border-bottom-right-radius\": 0});\r\n    if ($grid.find(\".ew-grid-middle-panel:visible\").hasClass(ew.RESPONSIVE_TABLE_CLASS) && $grid.width() > $(\".content\").width()) {\r\n        $grid.addClass(\"d-flex\");\r\n        $grid.closest(\".ew-detail-pages\").addClass(\"d-block\");\r\n        $grid.closest(\".ew-form\").addClass(\"w-100\");\r\n        if (ew.USE_OVERLAY_SCROLLBARS)\r\n            $grid.find(\".ew-grid-middle-panel:not(.ew-preview-middle-panel)\").overlayScrollbars(ew.overlayScrollbarsOptions);\r\n    }\r\n    $grid.data(\"isset\", true);\r\n}\r\n\r\n// Add a row to grid\r\nexport function addGridRow(el) {\r\n    var $grid = $(el).closest(\".ew-grid\"),\r\n        $tbl = $grid.find(\"table.ew-table\").last(), $p = $tbl.parent(\"div\"),\r\n        $tpl = $tbl.find(\"tr.ew-template\");\r\n    if (!el || !$grid[0] || !$tbl[0] || !$tpl[0])\r\n        return false;\r\n    var $lastrow = $($tbl[0].rows).last();\r\n    $tbl.find(\"td.ew-table-last-row\").removeClass(\"ew-table-last-row\");\r\n    var $row = $tpl.clone(true, true).removeClass(\"ew-template\");\r\n    var $form = $grid.find(\"div.ew-form[id^=f][id$=grid]\");\r\n    if (!$form[0])\r\n        $form = $grid.find(\"form.ew-form[id^=f][id$=list]\");\r\n    var suffix = ($form.is(\"div\")) ? \"_\" + $form.attr(\"id\") : \"\";\r\n    var $elkeycnt = $form.find(\"#key_count\" + suffix);\r\n    var keycnt = parseInt($elkeycnt.val(), 10) + 1;\r\n    $row.attr({ \"id\": \"r\" + keycnt + $row.attr(\"id\").substring(2), \"data-rowindex\": keycnt });\r\n    var $els = $tpl.find(\"script:contains('$rowindex$')\"); // Get scripts with rowindex\r\n    $row.children(\"td\").each(function() {\r\n        $(this).find(\"*\").each(function() {\r\n            $.each(this.attributes, function(i, attr) {\r\n                attr.value = attr.value.replace(/\\$rowindex\\$/g, keycnt); // Replace row index\r\n            });\r\n        });\r\n    });\r\n    $row.find(\".ew-icon\").closest(\"a, button\").removeData(\"bs.tooltip\").tooltip({ container: \"body\", placement: \"bottom\", trigger: \"hover\", sanitizeFn: ew.sanitizeFn });\r\n    $elkeycnt.val(keycnt).after($(\"<input>\").attr({\r\n        type: \"hidden\",\r\n        id: \"k\" + keycnt + \"_action\" + suffix,\r\n        name: \"k\" + keycnt + \"_action\" + suffix,\r\n        value: \"insert\"\r\n    }));\r\n    $lastrow.after($row);\r\n    $els.each(function() {\r\n        addScript(this.text.replace(/\\$rowindex\\$/g, keycnt));\r\n    });\r\n    var frm = $form.data(\"form\");\r\n    if (frm) {\r\n        frm.initEditors();\r\n        frm.initUpload();\r\n    }\r\n    setupTable(-1, $tbl[0], true);\r\n    $p.scrollTop($p[0].scrollHeight);\r\n    return false;\r\n}\r\n\r\n// Delete a row from grid\r\nexport function deleteGridRow(el, infix) {\r\n    var $el = $(el).tooltip(\"hide\").removeData(\"bs.tooltip\"),\r\n        $grid = $el.closest(\".ew-grid, .ew-multi-column-grid\"),\r\n        $row = $el.closest(\"tr, div[data-rowindex]\"),\r\n        $tbl = $row.closest(\".ew-table\");\r\n    if (!el || !$grid[0] || !$row[0])\r\n        return false;\r\n    var rowidx = parseInt($row.data(\"rowindex\"), 10);\r\n    var $form = $grid.find(\"div.ew-form[id^=f][id$=grid]\");\r\n    if (!$form[0])\r\n        $form = $grid.find(\"form.ew-form[id^=f][id$=list]\");\r\n    var frm = $form.data(\"form\");\r\n    if (!$form[0] || !frm)\r\n        return false;\r\n    var suffix = ($form.is(\"div\")) ? \"_\" + $form.attr(\"id\") : \"\";\r\n    var keycntname = \"#key_count\" + suffix;\r\n    var _delete = function() {\r\n        $row.remove();\r\n        if ($grid.is(\".ew-grid\"))\r\n            setupTable(-1, $tbl[0], true);\r\n        if (rowidx > 0) {\r\n            var $keyact = $form.find(\"#k\" + rowidx + \"_action\" + suffix);\r\n            if ($keyact[0]) {\r\n                $keyact.val(($keyact.val() == \"insert\") ? \"insertdelete\" : \"delete\");\r\n            } else {\r\n                $form.find(keycntname).after($(\"<input>\").attr({\r\n                    type: \"hidden\",\r\n                    id: \"k\" + rowidx + \"_action\" + suffix,\r\n                    name: \"k\" + rowidx + \"_action\" + suffix,\r\n                    value: \"delete\"\r\n                }));\r\n            }\r\n        }\r\n    };\r\n    if (isFunction(frm.emptyRow) && frm.emptyRow(infix)) { // Empty row\r\n        _delete();\r\n    } else { // Confirm\r\n        _prompt(ew.language.phrase(\"DeleteConfirmMsg\"), (result) => {\r\n            if (result)\r\n                _delete();\r\n        });\r\n    }\r\n    return false;\r\n}\r\n\r\n// HTML encode text\r\nexport function htmlEncode(text) {\r\n    var str = String(text);\r\n    return str.replace(/&/g, '&amp;').replace(/\\\"/g, '&quot;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\r\n}\r\n\r\n// Get form element(s) as single element or array of radio/checkbox\r\nexport function getElements(el, root) {\r\n    var selector;\r\n    if ($.isObject(el) && el.dataset) { // HTML element (e.g. radio/checkbox)\r\n        selector = \"[data-table='\" + el.dataset.table + \"'][data-field='\" + el.dataset.field + \"']:not([name^=o]):not([name^='x$'])\";\r\n    } else if ($.isString(el)) {\r\n        selector = \"[name='\" + el + \"']\";\r\n        var ar = el.split(\" \"); // Check if \"#id name\"\r\n        if (ar.length == 2)\r\n            selector = \"[data-table='\" + ar[0] + \"'][data-field='\" + getId(ar[1]) + \"']:not([name^=o]):not([name^='x$'])\"; // Remove []\r\n    }\r\n    var root = !$.isString(root) ? root : /^#/.test(root) ? root : \"#\" + root;\r\n    selector = \"input\" + selector + \",select\" + selector + \",textarea\" + selector + \",button\" + selector;\r\n    var $els = (root) ? $(root).find(selector) : $(selector);\r\n    if ($els.length == 1 && $els.is(\":not([type=checkbox]):not([type=radio])\"))\r\n        return $els[0];\r\n    return $els.get();\r\n}\r\n\r\n// Get first element (not necessarily form element)\r\nexport function getElement(name, root) {\r\n    var root = $.isString(root) ? \"#\" + root : root,\r\n        selector = \"#\" + name.replace(/([\\$\\[\\]])/g, \"\\\\$1\") + \",[name='\" + name + \"']\";\r\n    return (root) ? $(root).find(selector)[0] : $(selector).first()[0];\r\n}\r\n\r\n// Get ancestor by function\r\nexport function getAncestorBy(node, fn) {\r\n    while (node = node.parentNode) {\r\n        if (node && node.nodeType == 1 && (!fn || fn(node)))\r\n            return node;\r\n    }\r\n    return null;\r\n}\r\n\r\n// Check if an element is hidden\r\nexport function isHidden(el) {\r\n    var $el = $(el);\r\n    return $el.css(\"display\") == \"none\" && !$el.closest(\".dropdown-menu\")[0] && !isModalLookup(el) && !isAutoSuggest(el) && !isHiddenTextArea(el) ||\r\n        getAncestorBy(el, (node) => node.style.display == \"none\" && !node.classList.contains(\"tab-pane\") && !node.classList.contains(\"collapse\")) != null;\r\n}\r\n\r\n// Check if same text\r\nexport function sameText(o1, o2) {\r\n    return (String(o1).toLowerCase() == String(o2).toLowerCase());\r\n}\r\n\r\n// Check if same string\r\nexport function sameString(o1, o2) {\r\n    return (String(o1) == String(o2));\r\n}\r\n\r\n// Get element value\r\nexport function getValue(el, form) {\r\n    if (!el)\r\n        return \"\";\r\n    let obj;\r\n    if ($.isString(el)) {\r\n        let ar = el.split(\" \");\r\n        if (ar.length == 2) { // Parent field in master table\r\n            obj = getElements(el);\r\n        } else {\r\n            obj = getElements(el, form);\r\n        }\r\n    } else if (el.type == \"radio\" || el.type == \"checkbox\") { // Single radio/checkbox\r\n        obj = getElements(el);\r\n    } else {\r\n        obj = el;\r\n    }\r\n    if (obj.options) { // Selection list\r\n        if (obj.list) {\r\n            let val = obj.values;\r\n            return obj.multiple ? val : (val[0] || \"\");\r\n        } else {\r\n            let val = Array.prototype.filter.call(obj.options, option => option.selected && option.value !== \"\").map(option => option.value);\r\n            return (obj.type == \"select-multiple\") ? val : (val[0] || \"\");\r\n        }\r\n    } else if ($.isNumber(obj.length)) { // Radio/Checkbox list, or element not found\r\n        let val = $(obj).filter(\":checked\").map(function() {\r\n            return this.value;\r\n        }).get();\r\n        return (obj.length == 1) ? val[0] : val;\r\n    } else if (ew.isHiddenTextArea(obj)) {\r\n        $(obj).data(\"editor\").save();\r\n        return obj.value;\r\n    } else { // text/hidden\r\n        let data = $(obj).data();\r\n        if (data.lookup && data.multiple) // Modal-Lookup\r\n            return obj.value.split(ew.MULTIPLE_OPTION_SEPARATOR);\r\n        else\r\n            return obj.value;\r\n    }\r\n}\r\n\r\n// Get existing selected values as an array\r\nexport function getOptionValues(el, form) {\r\n    var obj;\r\n    if ($.isString(el)) {\r\n        var ar = el.split(\" \");\r\n        if (ar.length == 2) { // Parent field in master table\r\n            obj = getElements(el);\r\n        } else {\r\n            obj = getElements(el, form);\r\n        }\r\n    } else if (el.type == \"radio\" || el.type == \"checkbox\") { // Single radio/checkbox\r\n        obj = getElements(el);\r\n    } else {\r\n        obj = el;\r\n    }\r\n    if (obj.options) { // Selection list\r\n        if (obj.list)\r\n            return obj.values;\r\n        else\r\n            return Array.prototype.filter.call(obj.options, option => option.selected && option.value !== \"\").map(option => option.value);\r\n    } else if ($.isNumber(obj.length)) { // Radio/Checkbox list, or element not found\r\n        return $(obj).filter(\":checked\").map(function() {\r\n            return this.value;\r\n        }).get();\r\n    } else if (ew.isHiddenTextArea(obj)) {\r\n        $(obj).data(\"editor\").save();\r\n        return [obj.value];\r\n    } else { // text/hidden\r\n        var data = $(obj).data();\r\n        if (data.lookup && data.multiple) // Modal-Lookup\r\n            return obj.value.split(ew.MULTIPLE_OPTION_SEPARATOR);\r\n        else\r\n            return [obj.value];\r\n    }\r\n}\r\n\r\n// Get existing text of selected values as an array\r\nexport function getOptionTexts(el, form) {\r\n    var obj;\r\n    if ($.isString(el)) {\r\n        var ar = el.split(\" \");\r\n        if (ar.length == 2) { // Parent field in master table\r\n            obj = getElements(el);\r\n        } else {\r\n            obj = getElements(el, form);\r\n        }\r\n    } else {\r\n        obj = el;\r\n    }\r\n    if (isAutoSuggest(obj)) { // AutoSuggest (before obj.options)\r\n        return [obj.input.value];\r\n    } else if (isModalLookup(obj)) { // Modal-Lookup (before obj.options)\r\n        var $obj = $(obj);\r\n        return $obj.parent().find(\".ew-lookup-text .ew-option\").map(function() {\r\n            return $(this).text().trim();\r\n        }).get();\r\n    } else if (obj.options) { // Selection list\r\n        return Array.prototype.filter.call(obj.options, option => option.selected && option.value !== \"\").map(option => option.text);\r\n    } else if ($.isNumber(obj.length)) { // Radio/Checkbox list, or element not found\r\n        return $(obj).filter(\":checked\").map(function() {\r\n            return $(this).parent().text();\r\n        }).get();\r\n    } else if (ew.isHiddenTextArea(obj)) {\r\n        $(obj).data(\"editor\").save();\r\n        return [obj.value];\r\n    } else {\r\n        return [obj.value];\r\n    }\r\n}\r\n\r\n// Clear existing options\r\nexport function clearOptions(obj) {\r\n    if (obj.options) { // Selection list\r\n        var lo = (obj.type == \"select-multiple\" || // multiple\r\n            obj.hasAttribute(\"data-dropdown\") || // dropdown\r\n            convertToBool(obj.getAttribute(\"data-pleaseselect\")) === false || // data-pleaseselect=\"false\"\r\n            obj.length > 0 && obj.options[0].value != \"\") // non-empty first element\r\n            ? 0 : 1;\r\n        if (obj.list) {\r\n            obj.removeAll();\r\n        } else {\r\n            for (var i = obj.length - 1; i >= lo; i--)\r\n                obj.remove(i);\r\n        }\r\n        if (isAutoSuggest(obj)) {\r\n            obj.input.value = \"\";\r\n            obj.value = \"\";\r\n        }\r\n    }\r\n}\r\n\r\n/**\r\n * Get the name or id of an element\r\n *\r\n * @param {*} el - Element\r\n * @param {boolean} [remove=true] - Remove square brackets\r\n * @returns\r\n */\r\nexport function getId(el, remove) {\r\n    var id = ($.isString(el)) ? el : ($(el).attr(\"name\") || $(el).attr(\"id\")); // Use name first (id may have suffix)\r\n    return (remove !== false) ? id.replace(/\\[\\]$/, \"\") : id;\r\n}\r\n\r\n// Get display value separator\r\nexport function valueSeparator(index, obj) {\r\n    var sep = $(obj).data(\"value-separator\");\r\n    return (Array.isArray(sep)) ? sep[index - 1] : (sep || \", \");\r\n}\r\n\r\n/**\r\n * Get display value\r\n *\r\n * @param {Object} opt - Option being displayed\r\n * @param {HTMLElment} obj - HTML element\r\n * @returns {string} Display value\r\n */\r\nexport function displayValue(opt, obj) {\r\n    var text = opt.df;\r\n    for (var i = 2; i <= 4; i++) {\r\n        if (opt[\"df\" + i] && opt[\"df\" + i] != \"\") {\r\n            var sep = valueSeparator(i - 1, obj);\r\n            if ($.isUndefined(sep))\r\n                break;\r\n            if ($.isValue(text))\r\n                text += sep;\r\n            text += opt[\"df\" + i];\r\n        }\r\n    }\r\n    return text;\r\n}\r\n\r\n/**\r\n * Get HTML for a single option\r\n *\r\n * @param {*} val - Value of the option\r\n * @returns {string} HTML\r\n */\r\nexport function optionHtml(val) {\r\n    return ew.OPTION_HTML_TEMPLATE.replace(/\\{value\\}/g, val);\r\n}\r\n\r\n/**\r\n * Get HTML for diplaying all options\r\n *\r\n * @param {string[]} options - Array of all options (HTML)\r\n * @param {number} max - Maximum number of options to show\r\n * @returns {string} HTML\r\n */\r\nexport function optionsHtml(options, max) {\r\n    if (options.length > (max || ew.MAX_OPTION_COUNT)) { // More than max option count\r\n        return ew.language.phrase(\"CountSelected\").replace(\"%s\", options.length);\r\n    } else if (options.length) { // Some options\r\n        var html = \"\";\r\n        for (var i = 0; i < options.length; i++)\r\n            html += optionHtml(options[i]);\r\n        return html;\r\n    } else { // No options\r\n        return ew.language.phrase(\"PleaseSelect\");\r\n    }\r\n}\r\n\r\n/**\r\n * Create new option\r\n *\r\n * @param {(HTMLElement|array)} obj - Selection list\r\n * @param {Object} opt - Object for the new option\r\n * @param {form} f - form object of obj\r\n * @returns\r\n */\r\nexport function newOption(obj, opt, f) {\r\n    var frm = forms.get(f.id),\r\n        id = getId(obj),\r\n        list = frm.getList(id),\r\n        value = opt.lf,\r\n        item = { lf: opt.lf, df1: opt.df, df2: opt.df2, df3: opt.df3, df4: opt.df4 },\r\n        text;\r\n    if (list.template && !isAutoSuggest(obj)) {\r\n        text = list.template.render(item, ew.jsRenderHelpers);\r\n    } else {\r\n        text = displayValue(opt, obj) || value;\r\n    }\r\n    var args = { \"data\": item, \"name\": id, \"form\": f.$element, \"value\": value, \"text\": text };\r\n    if (obj.options) { // Selection list\r\n        let option;\r\n        if (obj.list) {\r\n            option = new SelectionListOption(args.value, args.text);\r\n        } else {\r\n            option = document.createElement(\"option\");\r\n            option.value = args.value;\r\n            option.innerHTML = args.text;\r\n        }\r\n        args = { ...args, option };\r\n        $document.trigger(\"newoption\", [args]); // Fire \"newoption\" event for selection list\r\n        if (obj.list) {\r\n            obj.add(args.option.value, args.option.text);\r\n        } else {\r\n            obj.add(args.option);\r\n        }\r\n    }\r\n    return args.text;\r\n}\r\n\r\n// Select combobox option\r\nexport function selectOption(obj, values) {\r\n    if (!obj || !values)\r\n        return;\r\n    var $obj = $(obj);\r\n    if (Array.isArray(values)) {\r\n        if (obj.options) { // Selection list\r\n            if (obj.list) {\r\n                obj.value = values;\r\n            } else {\r\n                $obj.val(values);\r\n                if (obj.type == \"select-one\" && obj.selectedIndex == -1)\r\n                    obj.selectedIndex = 0; // Make sure an option is selected (IE)\r\n            }\r\n            if (isAutoSuggest(obj) && values.length == 1) {\r\n                let opts = obj.options || [];\r\n                for (let opt of opts) {\r\n                    if (opt.value == values[0]) {\r\n                        obj.value = opt.value;\r\n                        obj.input.value = opt.text;\r\n                        break;\r\n                    }\r\n                }\r\n            } else if (isModalLookup(obj)) {\r\n                let vals = [],\r\n                    html = [],\r\n                    opts = obj.options || [];\r\n                for (let value of values) {\r\n                    for (let opt of opts) {\r\n                        if (value == opt.value) {\r\n                            vals.push(opt.value);\r\n                            html.push(optionHtml(opt.text));\r\n                            break;\r\n                        }\r\n                    }\r\n                }\r\n                $obj.val(vals.join(ew.MULTIPLE_OPTION_SEPARATOR));\r\n                $obj.parent().find(\".ew-lookup-text\").html(optionsHtml(html, $obj.data(\"maxcount\")));\r\n            }\r\n        } else if (obj.type) {\r\n            obj.value = values.join(ew.MULTIPLE_OPTION_SEPARATOR);\r\n        }\r\n    }\r\n    // Auto-select if only one option\r\n    function isAutoSelect(el) {\r\n        if (!$(el).data(\"autoselect\")) // data-autoselect=\"false\"\r\n            return false;\r\n        var form = getForm(el);\r\n        if (form) {\r\n            if (/s(ea)?rch$/.test(form.id)) // Search forms\r\n                return false;\r\n            var list = forms.get(form.id).getList(el.id);\r\n            if (list && list.parentFields.length == 0) // No parent fields\r\n                return false;\r\n            return true;\r\n        }\r\n        return false;\r\n    }\r\n    if (!isAutoSelect(obj))\r\n        return;\r\n    if (obj.options) { // Selection List\r\n        if (!obj.list && obj.type == \"select-one\" && obj.options.length == 2 && !obj.options[1].selected) {\r\n            obj.options[1].selected = true;\r\n        } else if (obj.options.length == 1 && !obj.options[0].selected) {\r\n            obj.options[0].selected = true;\r\n        }\r\n        if (obj.list)\r\n            obj.render();\r\n        if (isAutoSuggest(obj)) {\r\n            let opts = obj.options || [];\r\n            if (opts.length == 1) {\r\n                obj.value = opts[0].value;\r\n                obj.input.value = opts[0].text;\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\n// Ajax send\r\n$document.ajaxSend(function(event, jqxhr, settings) {\r\n    var url = settings.url;\r\n    if (url.match(/\\/(\\w+preview|session)\\?/i)) // Preview/Session page\r\n        _removeSpinner(); // Preview has spinner already\r\n    var apiUrl = getApiUrl(),\r\n        isApi = url.startsWith(apiUrl), // Is API request\r\n        allowed = isApi || url.startsWith(currentPage());\r\n    if (!allowed && url.match(/^http/i)) {\r\n        var objUrl = new URL(url);\r\n        allowed = objUrl.hostname == currentUrl.hostname; // Same host name\r\n    }\r\n    if (allowed) {\r\n        if (isApi && ew.API_JWT_TOKEN && !ew.IS_WINDOWS_AUTHENTICATION) // Do NOT set JWT authorization header if Windows Authentication\r\n            jqxhr.setRequestHeader(ew.API_JWT_AUTHORIZATION_HEADER, \"Bearer \" + ew.API_JWT_TOKEN);\r\n        if (settings.type == \"GET\") { // GET\r\n            var ar = settings.url.split(\"?\"), params = new URLSearchParams(ar[1]);\r\n            params.set(ew.TOKEN_NAME_KEY, ew.TOKEN_NAME); // Add token name // PHP\r\n            params.set(ew.ANTIFORGERY_TOKEN_KEY, ew.ANTIFORGERY_TOKEN); // Add antiforgery token // PHP\r\n            ar[1] = params.toString();\r\n            settings.url = ar[0] + (ar[1] ? \"?\" + ar[1] : \"\");\r\n        } else { // POST\r\n            if (settings.data instanceof FormData) { // FormData\r\n                settings.data.set(ew.TOKEN_NAME_KEY, ew.TOKEN_NAME); // Add token name // PHP\r\n                settings.data.set(ew.ANTIFORGERY_TOKEN_KEY, ew.ANTIFORGERY_TOKEN); // Add antiforgery token // PHP\r\n            } else {\r\n                var params = new URLSearchParams(settings.data);\r\n                params.set(ew.TOKEN_NAME_KEY, ew.TOKEN_NAME); // Add token name // PHP\r\n                params.set(ew.ANTIFORGERY_TOKEN_KEY, ew.ANTIFORGERY_TOKEN); // Add antiforgery token // PHP\r\n                settings.data = params.toString();\r\n            }\r\n        }\r\n    }\r\n});\r\n\r\n// Ajax start\r\n$document.ajaxStart(function() {\r\n    $document.data(\"_ajax\", true);\r\n    ew.addSpinner();\r\n    $(\"form.ew-form\").addClass(\"ew-wait\").each(function() {\r\n        var frm = forms.get(this.id);\r\n        if (frm) {\r\n            if (!frm.multiPage || !frm.multiPage.lastPageSubmit)\r\n                frm.disableForm();\r\n        }\r\n    });\r\n});\r\n\r\n// Ajax stop (internal)\r\nfunction _ajaxStop() {\r\n    $(\"form.ew-form.ew-wait\").removeClass(\"ew-wait\").each(function() {\r\n        var frm = forms.get(this.id);\r\n        if (frm) {\r\n            if (!frm.multiPage || !frm.multiPage.lastPageSubmit) {\r\n                frm.enableForm();\r\n            }\r\n        }\r\n    });\r\n    ew.removeSpinner();\r\n    $document.data(\"_ajax\", false);\r\n}\r\n\r\n// Ajax stop/error\r\n$document.ajaxStop(_ajaxStop).ajaxError(_ajaxStop);\r\n\r\n// Execute JavaScript in HTML loaded by Ajax\r\nexport function executeScript(html, id) {\r\n    let matches = html.replace(/<head>[\\s\\S]*<\\/head>/, \"\").matchAll(/<script([^>]*)>([\\s\\S]*?)<\\/script\\s*>/ig);\r\n    Array.from(matches).forEach((ar, i) => {\r\n        let text = ar[2];\r\n        if (/(\\s+type\\s*=\\s*['\"]*text\\/javascript['\"]*)|^((?!\\s+type\\s*=).)*$/i.test(ar[1]) && text)\r\n            addScript(text, \"scr_\" + id + \"_\" + i++);\r\n    });\r\n}\r\n\r\n// Strip JavaScript in HTML loaded by Ajax\r\nexport function stripScript(html) {\r\n    let matches = html.matchAll(/<script([^>]*)>([\\s\\S]*?)<\\/script\\s*>/ig);\r\n    for (let ar of matches) {\r\n        let text = ar[0];\r\n        if (/(\\s+type\\s*=\\s*['\"]*text\\/javascript['\"]*)|^((?!\\s+type\\s*=).)*$/i.test(ar[1]))\r\n            html = html.replace(text, \"\");\r\n    }\r\n    return html;\r\n}\r\n\r\n// Add SCRIPT tag\r\nexport function addScript(text, id) {\r\n    var scr = document.createElement(\"SCRIPT\");\r\n    if (id)\r\n        scr.id = id;\r\n    scr.text = text;\r\n    return document.body.appendChild(scr); // Do not use jQuery so it can be removed\r\n}\r\n\r\n// Remove JavaScript added by Ajax\r\nexport function removeScript(id) {\r\n    if (id)\r\n        $(\"script[id^='scr_\" + id + \"_']\").remove();\r\n}\r\n\r\n// Clean HTML loaded by Ajax for modal dialog\r\nexport function getContent(html) {\r\n    let body = stripScript(html).match(/<body[\\s\\S]*>[\\s\\S]*<\\/body>/i);\r\n    return body ? $(body[0]).not(\"div[id^=ew].modal, #ew-tooltip, #ew-drilldown-panel, #cookie-consent, #template-upload, #template-download\") : $();\r\n}\r\n\r\n// Get all options of Selection list or Radio/Checkbox list as array\r\nexport function getOptions(obj) {\r\n    return obj.options ? Array.prototype.map.call(obj.options, (opt) => [opt.value, opt.text]) : [];\r\n}\r\n\r\n/**\r\n * Show Add Option dialog\r\n *\r\n * @param {Object} args - Arguments\r\n * @param {Object} args.frm - form object\r\n * @param {HTMLElement} args.lnk - Add option anchor element\r\n * @param {string} args.el - Form element name\r\n * @param {string} args.url - URL of the Add form\r\n * @returns\r\n */\r\nexport function addOptionDialogShow(args) {\r\n\r\n    // Hide dialog\r\n    var _hide = function() {\r\n        removeScript($dlg.data(\"args\").el);\r\n        var frm = $dlg.removeData(\"args\").find(\".modal-body form\").data(\"form\");\r\n        if (frm)\r\n            frm.destroyEditor();\r\n        $dlg.find(\".modal-body\").html(\"\");\r\n        $dlg.find(\".modal-footer .btn-primary\").off();\r\n        $dlg.data(\"showing\", false);\r\n    }\r\n\r\n    var $dlg = ew.addOptionDialog || $(\"#ew-add-opt-dialog\").on(\"hidden.bs.modal\", _hide);\r\n    if (!$dlg[0]) {\r\n        _alert(\"DIV #ew-add-opt-dialog not found.\");\r\n        return;\r\n    }\r\n    if ($dlg.data(\"showing\"))\r\n        return;\r\n    $dlg.data(\"showing\", true);\r\n\r\n    // Submission success\r\n    var _submitSuccess = function(data) {\r\n        var results = data,\r\n            args = $dlg.data(\"args\"),\r\n            frm = forms.get(args.lnk), // form object\r\n            objName = $dlg.find(\".modal-body form input[name='\" + ew.API_OBJECT_NAME + \"']\").val(), // Get object name from form\r\n            el = args.el, // HTML element name\r\n            re = /^x(\\d+)_/,\r\n            m = el.match(re), // Check row index\r\n            prefix = m ? m[0] : \"x_\",\r\n            index = m ? m[1] : -1,\r\n            name = el.replace(re, \"x_\"),\r\n            list = frm.getList(el);\r\n        if ($.isString(data))\r\n            results = parseJson(data);\r\n        if (results?.success && results[objName]) { // Success\r\n            $dlg.modal(\"hide\");\r\n            var result = results[objName],\r\n                form = frm.$element[0], // HTML form or DIV\r\n                obj = getElements(el, form);\r\n            if (obj) {\r\n                var lf = list.linkField,\r\n                    dfs = list.displayFields.slice(), // Clone\r\n                    ffs = list.filterFields.slice(), // Clone\r\n                    pfs = list.parentFields.slice(); // Clone\r\n                pfs.forEach((pf, i) => {\r\n                    if (pf.split(\" \").length == 1) // Parent field in the same table, add row index\r\n                        pfs[i] = pfs[i].replace(/^x_/, prefix);\r\n                });\r\n                var lfv = (lf != \"\") ? result[lf] : \"\",\r\n                    row = { lf: lfv };\r\n                dfs.forEach((df, i) => {\r\n                    if (df in result)\r\n                        row[\"df\" + (i || \"\")] = result[df];\r\n                });\r\n                ffs.forEach((ff, i) => {\r\n                    if (ff in result)\r\n                        row[\"ff\" + (i || \"\")] = result[ff];\r\n                });\r\n                if (lfv && dfs.length > 0 && row[\"df\"]) {\r\n                    if (list.ajax === null) // Non-Ajax\r\n                        list.lookupOptions.push(row);\r\n                    var arp = pfs.map(pf => getOptionValues(pf, form)), // Get the parent field values\r\n                        args = {\"data\": row, \"parents\": arp, \"valid\": true, \"name\": getId(obj), \"form\": form};\r\n                    $document.trigger(\"addoption\", [args]);\r\n                    if (args.valid) { // Add the new option\r\n                        var ar = getOptions(obj),\r\n                            vals = [];\r\n                        var txt = newOption(obj, row, form);\r\n                        if (obj.options) {\r\n                            obj.options[obj.options.length - 1].selected = true;\r\n                            if (obj.list) { // Radio/Checkbox list\r\n                                obj.render();\r\n                                $(obj.target).find(\"input\").last().trigger(\"focus\");\r\n                            }\r\n                            if (isAutoSuggest(obj)) {\r\n                                $(obj).val(lfv).trigger(\"change\");\r\n                                $(obj.input).val(txt).trigger(\"focus\");\r\n                            } else if (isModalLookup(obj)) {\r\n                                var $obj = $(obj), $lu = $(getElement(\"lu_\" + args.name, form));\r\n                                if (obj.multiple) { // Add to existing values\r\n                                    var val = $(obj).val(), vals = [], nv = String(lfv);\r\n                                    if (val !== \"\")\r\n                                        vals = val.split(ew.MULTIPLE_OPTION_SEPARATOR);\r\n                                    if (!vals.includes(nv)) {\r\n                                        vals.push(nv);\r\n                                        $obj.val(vals.join()).trigger(\"change\");\r\n                                        var html = $lu.html(), arOpt = $lu.find(\".ew-option\").map(function() {\r\n                                            return $(this).html();\r\n                                        }).get();\r\n                                        if (arOpt.length) { // Some options selected\r\n                                            arOpt.push(txt);\r\n                                            $lu.html(optionsHtml(arOpt, $obj.data(\"maxcount\")));\r\n                                        } else if (html == ew.language.phrase(\"PleaseSelect\")) { // No options selected\r\n                                            $lu.html(optionHtml(txt));\r\n                                        } else if (html) { // Many options selected\r\n                                            $lu.html(ew.language.phrase(\"CountSelected\").replace(\"%s\", vals.length));\r\n                                        }\r\n                                    }\r\n                                } else {\r\n                                    $obj.val(lfv).trigger(\"change\");\r\n                                    $lu.html(txt);\r\n                                }\r\n                            } else {\r\n                                $(obj).trigger(\"change\").trigger(\"focus\");\r\n                            }\r\n                        }\r\n                        var $form = $(form), suffix = ($form.is(\"div\")) ? \"_\" + $form.attr(\"id\") : \"\";\r\n                        var cnt = $form.find(\"#key_count\" + suffix).val();\r\n                        if (cnt > 0) { // Grid-Add/Edit, update other rows\r\n                            for (var i = 1; i <= cnt; i++) {\r\n                                if (i == index)\r\n                                    continue;\r\n                                var obj2 = getElements(name.replace(/^x/, \"x\" + i), form);\r\n                                var ar2 = getOptions(obj2), vals = [];\r\n                                if (JSON.stringify(ar) != JSON.stringify(ar2)) // Not same options\r\n                                    continue;\r\n                                newOption(obj2, row, form);\r\n                                if (obj2.options && obj.list) // Radio/Checkbox list\r\n                                    obj2.render();\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        } else { // Failure\r\n            if (results?.error) {\r\n                 if ($.isString(results.error))\r\n                    showToast(results.error);\r\n                else if ($.isString(results.error?.description))\r\n                    showToast(results.error.description);\r\n            } else {\r\n                var msg,\r\n                    $div = $(\"<div></div>\").html(data).find(\"div.ew-message-dialog\");\r\n                if ($div[0]) {\r\n                    msg = $div.html();\r\n                } else {\r\n                    msg = results?.failureMessage || data;\r\n                    if (!msg || String(msg).trim() == \"\")\r\n                        msg = ew.language.phrase(\"InsertFailed\");\r\n                }\r\n                showToast(msg);\r\n            }\r\n        }\r\n    }\r\n\r\n    // Fail\r\n    var _fail = function(o) {\r\n        $dlg.modal(\"hide\");\r\n        _alert(\"Server Error \" + o.status + \": \" + o.statusText);\r\n    }\r\n\r\n    // Submit\r\n    var _submit = function(e) {\r\n        let $dlg = ew.addOptionDialog,\r\n            form = $dlg.find(\".modal-body form\")[0],\r\n            frm = forms.get(form.id),\r\n            btn = e ? e.target : null,\r\n            $btn = $(btn);\r\n        if (frm.canSubmit()) {\r\n            $btn.prop(\"disabled\", false).removeClass(\"disabled\");\r\n            $body.css(\"cursor\", \"wait\");\r\n            $.post(getApiUrl([ew.API_ADD_ACTION, form.elements[ew.API_OBJECT_NAME].value]), $(form).serialize(), _submitSuccess).fail(_fail).always(function() {\r\n                frm.enableForm();\r\n                $btn.prop(\"disabled\", false).removeClass(\"disabled\");\r\n                $body.css(\"cursor\", \"default\");\r\n            });\r\n        }\r\n        return false;\r\n    }\r\n\r\n    $dlg.modal(\"hide\");\r\n    $dlg.data(\"args\", args);\r\n\r\n    // Get form HTML\r\n    var success = function(data) {\r\n        var frm = forms.get(args.lnk),\r\n            prefix = \"x_\",\r\n            m = args.el.match(/^(x\\d+_)/);\r\n        if (m) // Contains row index\r\n            prefix = m[1];\r\n        var list = frm.getList(args.el),\r\n            pfs = list.parentFields.slice() // Clone\r\n                .map(pf => (pf.split(\" \").length == 1) ? pf.replace(/^x_/, prefix) : pf), // Parent field in the same table, add row index\r\n            form = frm.htmlForm,\r\n            ar = pfs.map(pf => getOptionValues(pf, form)),\r\n            ar2 = pfs.map(pf => getOptionTexts(pf, form)),\r\n            ffs = list.filterFieldVars.slice(); // Clone\r\n        $dlg.find(\".modal-title\").html($(args.lnk).closest(\".ew-add-opt-btn\").data(\"title\"));\r\n        $dlg.find(\".modal-body\").html(stripScript(data));\r\n        var form = $dlg.find(\".modal-body form\")[0];\r\n        if (form) { // Set the filter field value\r\n            $(form).on(\"keydown\", function(e) {\r\n                if (e.key == \"Enter\" && e.target.nodeName != \"TEXTAREA\")\r\n                    return _submit();\r\n            });\r\n            ar.forEach((v, i) => {\r\n                (function() {\r\n                    var obj = getElements(ffs[i], form);\r\n                    if (obj) {\r\n                        if (obj.options || obj.length) { // Selection list\r\n                            $(obj).first().one(\"updated\", () => selectOption(obj, v));\r\n                        } else {\r\n                            selectOption(obj, v);\r\n                        }\r\n                    }\r\n                })();\r\n            });\r\n        }\r\n        ew.addOptionDialog = $dlg.modal(\"show\");\r\n        $dlg.find(\".modal-footer .btn-primary\").click(_submit).focus();\r\n        executeScript(data, args.el);\r\n        if (form) { // Set the filter field value\r\n            ar.forEach((v, i) => {\r\n                var obj = getElements(ffs[i], form);\r\n                if (obj) {\r\n                    if (isAutoSuggest(obj)) { // AutoSuggest\r\n                        obj.value = v[0];\r\n                        obj.input.value = ar2[i][0];\r\n                        obj.add(v[0], ar2[i][0], true);\r\n                    } else if (isModalLookup(obj)) { // Modal-Lookup\r\n                        obj.value = v[0];\r\n                        updateOptions.call(forms.get(form.id), obj);\r\n                    } else if (obj.options || obj.length) { // Selection list\r\n                        // Skip\r\n                    } else { // Text\r\n                        obj.value = v[0];\r\n                    }\r\n                }\r\n            });\r\n        }\r\n        $dlg.trigger(\"load.ew\");\r\n    };\r\n    $.get(args.url, success).fail(_fail);\r\n}\r\n\r\n// Hide Modal dialog\r\nexport function modalDialogHide(e) {\r\n    var $dlg = $(this), args = $dlg.data(\"args\");\r\n    removeScript(\"ModalDialog\");\r\n    var frm = $dlg.removeData(\"args\").find(\".modal-body form\").data(\"form\");\r\n    if (frm)\r\n        frm.destroyEditor();\r\n    var $bd = $dlg.find(\".modal-body\").html(\"\");\r\n    if ($bd.ewjtable && $bd.ewjtable(\"instance\"))\r\n        $bd.ewjtable(\"destroy\");\r\n    $dlg.find(\".modal-footer .btn-primary\").off();\r\n    $dlg.find(\".modal-dialog\").removeClass(function(index, className) {\r\n        var m = className.match(/table\\-\\w+/);\r\n        return (m) ? m[0] : \"\";\r\n    });\r\n    $dlg.data(\"showing\", false);\r\n    $dlg.data(\"url\", null);\r\n    if (args && args.reload)\r\n        window.location.reload();\r\n}\r\n\r\n/**\r\n * Show modal dialog\r\n *\r\n * @param {Object} args - Arguments\r\n * @param {HTMLFormElement} args.f - Form of List page\r\n * @param {HTMLElement} args.lnk - Anchor element\r\n * @param {string} args.url - URL of the form\r\n * @param {string|null} args.btn - Button phrase ID\r\n * @param {string} args.caption - Caption in dialog header\r\n * @param {boolean} args.reload - Reload page after hiding dialog or not\r\n * @param {string} args.size - Size of the dialog 'modal-sm'|''|modal-lg'|'modal-xl'(default)\r\n * @returns false\r\n */\r\nexport function modalDialogShow(args) {\r\n    $(args.lnk).tooltip(\"hide\");\r\n    var f = args.f;\r\n    if (f && !keySelected(f)) {\r\n        _prompt(\"<p class=\\\"text-danger\\\">\" + ew.language.phrase(\"NoRecordSelected\") + \"</p>\");\r\n        return false;\r\n    }\r\n\r\n    var $dlg = ew.modalDialog || $(\"#ew-modal-dialog\").on(\"hidden.bs.modal\", modalDialogHide); // div#ew-modal-dialog always exists\r\n    if ($dlg.data(\"showing\") && $dlg.data(\"url\") == args.url)\r\n        return false;\r\n    $dlg.data({ showing: true, url: args.url });\r\n    args.reload = false;\r\n\r\n    // size\r\n    if (args.size === \"modal-sm\") { // 300px\r\n        $dlg.find(\".modal-dialog\").toggleClass(\"modal-sm\", true).toggleClass(\"modal-lg modal-xl\", false);\r\n    } else if (args.size === \"\") { // 500px\r\n        $dlg.find(\".modal-dialog\").toggleClass(\"modal-sm modal-lg modal-xl\", false);\r\n    } else if (args.size === \"modal-lg\") { // 800px\r\n        $dlg.find(\".modal-dialog\").toggleClass(\"modal-lg\", true).toggleClass(\"modal-sm modal-xl\", false);\r\n    } else { // Default = 1140px\r\n        $dlg.find(\".modal-dialog\").toggleClass(\"modal-xl\", true).toggleClass(\"modal-sm modal-lg\", false);\r\n    }\r\n\r\n    // caption\r\n    var _caption = function() {\r\n        var args = $dlg.data(\"args\");\r\n        var $lnk = $(args.lnk);\r\n        return args.caption || $lnk.data(\"caption\") || $lnk.data(\"original-title\") || \"\";\r\n    };\r\n\r\n    // button text\r\n    var _button = function() {\r\n        var args = $dlg.data(\"args\");\r\n        if ($.isNull(args.btn))\r\n            return \"\";\r\n        else if (args.btn && args.btn != \"\")\r\n            return ew.language.phrase(args.btn);\r\n        else\r\n            return _caption();\r\n    };\r\n\r\n    // fail\r\n    var _fail = function(o) {\r\n        $dlg.modal(\"hide\");\r\n        if (o.status)\r\n            _alert(\"Server Error \" + o.status + \": \" + o.statusText);\r\n    }\r\n\r\n    // always\r\n    var _always = function(o) {\r\n        $body.css(\"cursor\", \"default\");\r\n    }\r\n\r\n    // check if current page\r\n    var _current = function(url) {\r\n        var a = $(\"<a>\", { href: url })[0];\r\n        return window.location.pathname.endsWith(a.pathname);\r\n    }\r\n\r\n    /**\r\n     * handle result\r\n     *\r\n     * @param {Object} result - Result object\r\n     * @param {string|Object} result.error - Error message or object\r\n     * @param {string} result.error.message - Error message\r\n     * @param {string} result.error.description - Error message\r\n     * @param {string} result.failureMessage - Failure message\r\n     * @param {string} result.successMessage - Success message\r\n     * @param {string} result.warningMessage - Warning message\r\n     * @param {string} result.message - Message\r\n     * @param {string} result.url - Redirection URL\r\n     * @param {string} result.modal - Redirect to result.url in current modal dialog\r\n     * @param {boolean} result.view - result.url is View page => No primary button\r\n     * @param {string} result.caption - Caption of modal dialog for result.url\r\n     * @param {boolean} result.reload - Reload current page\r\n     */\r\n    var handleResult = function(result) {\r\n        var cb = null,\r\n            url = result.url,\r\n            reload = result.reload;\r\n        if (url || reload) {\r\n            cb = function() {\r\n                if (url) {\r\n                    if (result.modal && !_current(url)) {\r\n                        var args = $dlg.data(\"args\");\r\n                        args.reload = true;\r\n                        if (result.caption)\r\n                            args.caption = result.caption;\r\n                        args.btn = result.view ? null : \"\";\r\n                        $dlg.data(\"args\", args);\r\n                        url += (url.split(\"?\").length > 1 ? \"&\" : \"?\") + \"modal=1&rnd=\" + random();\r\n                        $body.css(\"cursor\", \"wait\");\r\n                        $.get(url).done(success).fail(_fail).always(_always);\r\n                    } else {\r\n                        $dlg.modal(\"hide\");\r\n                        window.location = sanitizeUrl(url);\r\n                    }\r\n                } else if (reload) {\r\n                    $dlg.modal(\"hide\");\r\n                    window.location.reload();\r\n                }\r\n            };\r\n        }\r\n        if ($.isString(result.failureMessage)) {\r\n            _alert(result.failureMessage);\r\n        } else if ($.isString(result.warningMessage)) {\r\n            _alert(result.warningMessage, cb, \"warning\");\r\n        } else if ($.isString(result.message)) {\r\n            _alert(result.message, cb, \"body\");\r\n        } else if ($.isString(result.successMessage)) {\r\n            _alert(result.successMessage, cb, \"success\");\r\n        } else if (result.error) {\r\n            if ($.isString(result.error))\r\n                _alert(result.error);\r\n            else if ($.isString(result.error?.message))\r\n                _alert(result.error.message);\r\n            else if ($.isString(result.error?.description))\r\n                _alert(result.error.description);\r\n        } else if (cb) {\r\n            cb();\r\n        }\r\n    }\r\n\r\n    // submit success\r\n    var _submitSuccess = function(data) {\r\n        var result = parseJson(data);\r\n        if ($.isObject(result)) {\r\n            handleResult(result);\r\n        } else {\r\n            var body = getContent(data);\r\n            if (body.length) { // Has HTML elements\r\n                var $bd = $dlg.find(\".modal-body\").html(body);\r\n                var footer = \"\";\r\n                var cf = $bd.find(\"#confirm\");\r\n                var ct = $bd.find(\"#conflict\");\r\n                if (ct && ct.val() == \"1\") { // Conflict page\r\n                    footer += \"<button type=\\\"button\\\" id=\\\"btn-overwrite\\\" class=\\\"btn btn-primary ew-btn\\\">\" + ew.language.phrase(\"OverwriteBtn\") + \"</button>\";\r\n                    footer += \"<button type=\\\"button\\\" id=\\\"btn-reload\\\" class=\\\"btn btn-default ew-btn\\\">\" + ew.language.phrase(\"ReloadBtn\") + \"</button>\";\r\n                    footer += \"<button type=\\\"button\\\" class=\\\"btn btn-default ew-btn\\\" data-dismiss=\\\"modal\\\">\" + ew.language.phrase(\"CancelBtn\") + \"</button>\";\r\n                    $dlg.find(\".modal-footer\").html(footer);\r\n                    $dlg.find(\".modal-footer #btn-overwrite\").on('click', {action: 'overwrite'}, _submit);\r\n                    $dlg.find(\".modal-footer #btn-reload\").on('click', {action: 'show'}, _submit);\r\n                } else if (cf && cf.val() == \"confirm\") { // Confirm page\r\n                    footer += \"<button type=\\\"button\\\" class=\\\"btn btn-primary ew-btn\\\">\" + ew.language.phrase(\"ConfirmBtn\") + \"</button>\";\r\n                    footer += \"<button type=\\\"button\\\" class=\\\"btn btn-default ew-btn\\\">\" + ew.language.phrase(\"CancelBtn\") + \"</button>\";\r\n                    $dlg.find(\".modal-footer\").html(footer);\r\n                    $dlg.find(\".modal-footer .btn-primary\").click(_submit).focus();\r\n                    $dlg.find(\".modal-footer .btn-default\").on(\"click\", {action: \"cancel\"}, _submit);\r\n                } else { // Normal page\r\n                    var btn = _button();\r\n                    if (btn)\r\n                        footer += \"<button type=\\\"button\\\" class=\\\"btn btn-primary ew-btn\\\">\" + btn + \"</button>\";\r\n                    footer += \"<button type=\\\"button\\\" class=\\\"btn btn-default ew-btn\\\" data-dismiss=\\\"modal\\\">\" + ew.language.phrase(\"CancelBtn\") + \"</button>\";\r\n                    $dlg.find(\".modal-footer\").html(footer);\r\n                    $dlg.find(\".modal-footer .btn-primary\").addClass(\"ew-submit\").click(_submit).focus();\r\n                }\r\n                executeScript(data, \"ModalDialog\");\r\n                $dlg.trigger(\"load.ew\"); // Trigger load event for, e.g. Use JavaScript popup message\r\n            } else if (data) {\r\n                $dlg.modal(\"hide\");\r\n                ew.alert(data);\r\n            }\r\n        }\r\n    }\r\n\r\n    // submit\r\n    var _submit = function(e) {\r\n        var form = $dlg.find(\".modal-body form\")[0],\r\n            $form = $(form),\r\n            frm = forms.get(form.id),\r\n            action = e && e.data ? e.data.action : null,\r\n            btn = e ? e.target : null;\r\n        if (btn) {\r\n            if (btn.classList.contains(\"disabled\"))\r\n                return false;\r\n            frm.enableForm = function() {\r\n                $(btn).prop(\"disabled\", false).removeClass(\"disabled\");\r\n            };\r\n            frm.disableForm = function() {\r\n                $(btn).prop(\"disabled\", true).addClass(\"disabled\");\r\n            };\r\n        }\r\n        var input = form.elements[\"action\"];\r\n        if (action && input)\r\n            input.value = action; // Update action\r\n        if (action == \"cancel\") { // Cancel\r\n            $.post($form.attr(\"action\"), $form.serialize(), success).fail(_fail).always(_always);\r\n        } else if (frm.canSubmit()) {\r\n            $body.css(\"cursor\", \"wait\");\r\n            $.post($form.attr(\"action\"), $form.serialize(), _submitSuccess).fail(_fail).always(function() {\r\n                frm.enableForm();\r\n                _always();\r\n            });\r\n        }\r\n        return false;\r\n    }\r\n\r\n    $dlg.modal(\"hide\");\r\n    $dlg.data(\"args\", args);\r\n\r\n    var success = function(data) {\r\n        var result = parseJson(data);\r\n        if ($.isObject(result)) {\r\n            handleResult(result);\r\n        } else {\r\n            var args = $dlg.data(\"args\");\r\n            var $lnk = $(args.lnk);\r\n            $dlg.find(\".modal-title\").html(_caption());\r\n            var footer = \"\";\r\n            var btn = _button();\r\n            if (btn)\r\n                footer += \"<button type=\\\"button\\\" class=\\\"btn btn-primary ew-btn\\\">\" + btn + \"</button>\";\r\n            if (footer != \"\")\r\n                footer += \"<button type=\\\"button\\\" class=\\\"btn btn-default ew-btn\\\" data-dismiss=\\\"modal\\\">\" + ew.language.phrase(\"CancelBtn\") + \"</button>\";\r\n            else\r\n                footer = \"<button type=\\\"button\\\" class=\\\"btn btn-default ew-btn\\\" data-dismiss=\\\"modal\\\">\" + ew.language.phrase(\"CloseBtn\") + \"</button>\";\r\n            $dlg.find(\".modal-footer\").html(footer);\r\n            var body = getContent(data);\r\n            $dlg.find(\".modal-body\").html(body);\r\n            var table = $lnk.data(\"table\");\r\n            if (table)\r\n                $dlg.find(\".modal-dialog\").addClass(\"table-\" + table);\r\n            var $btn = $dlg.find(\".modal-footer .btn-primary\").addClass(\"ew-submit\").click(_submit);\r\n            $dlg.find(\".modal-body form\").on(\"keydown\", function(e) {\r\n                if (e.key == \"Enter\" && e.target.nodeName != \"TEXTAREA\")\r\n                    return $btn.click();\r\n            });\r\n            ew.modalDialog = $dlg.modal(\"show\");\r\n            executeScript(data, \"ModalDialog\");\r\n            $dlg.trigger(\"load.ew\"); // Trigger load event for, e.g. YouTube videos, ReCAPTCHA and Google maps\r\n            $btn.focus();\r\n        }\r\n    };\r\n\r\n    $body.css(\"cursor\", \"wait\");\r\n\r\n    var url = args.url;\r\n    if (f) { // Post form\r\n        var $f = $(f);\r\n        if (!f.elements.modal)\r\n            $(\"<input>\").attr({type: \"hidden\", name: \"modal\", value: \"1\"}).appendTo($f);\r\n        $.post(url, $f.serialize(), success).fail(_fail).always(_always);\r\n    } else {\r\n        url += (url.split(\"?\").length > 1 ? \"&\" : \"?\") + \"modal=1&rnd=\" + random();\r\n        $.get(url, success).fail(_fail).always(_always);\r\n    }\r\n\r\n    return false;\r\n}\r\n\r\n// Show Modal Lookup\r\nexport function modalLookupShow(args) {\r\n    var el = args.el, f = getForm(args.lnk);\r\n    if (!f || !el)\r\n        return;\r\n\r\n    var $dlg = ew.modalLookupDialog || $(\"#ew-modal-lookup-dialog\").on(\"hidden.bs.modal\", modalDialogHide);\r\n    if (!$dlg[0]) {\r\n        _alert(\"DIV #ew-modal-lookup-dialog not found.\");\r\n        return;\r\n    }\r\n    if ($dlg.data(\"showing\"))\r\n        return;\r\n    $dlg.data(\"showing\", true);\r\n\r\n    var $f = $(f),\r\n        $input = $f.find(\"[id='\" + el + \"']\"), // id may contains \"[]\"\r\n        $bd = $dlg.find(\".modal-body\"),\r\n        $lnk = $(args.lnk),\r\n        $lu = $lnk.closest(\".ew-lookup-list\").find(\".ew-lookup-text\").trigger(\"focus\"),\r\n        oid = getId(el, false),\r\n        m = oid.match(/^([xy])(\\d*)_/),\r\n        rowindex = m ? m[2] : \"\",\r\n        list = forms.get(f.id).getList(el);\r\n\r\n    // Format data\r\n    var _format = function(data) {\r\n        if (data.result == \"OK\" && Array.isArray(data.records)) {\r\n            data.records.forEach(function(ar, index) {\r\n                var item;\r\n                if (Array.isArray(ar))\r\n                    item = { \"lf\": ar[0], \"df1\": ar[1], \"df2\": ar[2], \"df3\": ar[3], \"df4\": ar[4] };\r\n                else if ($.isObject(ar))\r\n                    item = { lf: ar.lf, df1: ar.df, df2: ar.df2, df3: ar.df3, df4: ar.df4 };\r\n                var txt = displayValue(ar, $input);\r\n                if (list.template) {\r\n                    item[\"df\"] = list.template.render(item, ew.jsRenderHelpers);\r\n                } else {\r\n                    item[\"df\"] = txt;\r\n                }\r\n                item[\"txt\"] = txt;\r\n                data.records[index] = item;\r\n            });\r\n        }\r\n        return data;\r\n    }\r\n\r\n    // Set AutoSuggest\r\n    var setAutoSuggest = function(value, text) {\r\n        if (!isAutoSuggest($input))\r\n            return;\r\n        let el = $input[0];\r\n        el.add(value, text, true);\r\n        el.input.value = text;\r\n    }\r\n\r\n    // Add option\r\n    var addOpt = function(ar) {\r\n        // Check if selected records are in the current page\r\n        var vals = [], html = [], opts = [], txts = [], useText = !args.m && args.srch;\r\n        $bd.ewjtable(\"selectedRows\").each(function() {\r\n            var record = $(this).data(\"record\");\r\n            vals.push(record.lf);\r\n            html.push(record.df);\r\n            opts.push(record.df);\r\n            txts.push(record.txt); // Text for Auto-Suggest\r\n        });\r\n        if (ar.sort().join() === vals.sort().join()) { // All selected records are from the current page\r\n            $lu.html(optionsHtml(opts, $input.data(\"maxcount\")));\r\n            setAutoSuggest(vals.join(), txts.join(\", \"));\r\n            $input.val(useText ? html.join(\", \") : vals.join()).trigger(\"change\");\r\n        } else { // Get selected records from server\r\n            var data = Object.assign({ page: list.page, field: list.field, ajax: \"modal\", keys: ar }, getUserParams('#p_' + oid, f));\r\n            $body.css(\"cursor\", \"wait\");\r\n            $.ajax(getApiUrl(ew.API_LOOKUP_ACTION), {\r\n                type: \"POST\",\r\n                dataType: \"json\",\r\n                data: data\r\n            }).done(_format).then(function(data) {\r\n                if (data.result == \"OK\" && Array.isArray(data.records)) {\r\n                    var vals = [], html = [], opts = [], txts = [], results = data.records;\r\n                    for (let result of results) {\r\n                        vals.push(result.lf);\r\n                        html.push(result.df)\r\n                        opts.push(result.df);\r\n                        txts.push(result.txt); // Text for Auto-Suggest\r\n                    }\r\n                    $lu.html(optionsHtml(opts, $input.data(\"maxcount\")));\r\n                    setAutoSuggest(vals.join(), txts.join(\", \"));\r\n                    $input.val(useText ? html.join(\", \") : vals.join()).trigger(\"change\");\r\n                }\r\n            }).always(function() {\r\n                $body.css(\"cursor\", \"default\");\r\n            });\r\n        }\r\n    }\r\n\r\n    // Submit\r\n    var _submit = function() {\r\n        addOpt(arLinkValue);\r\n        $dlg.modal(\"hide\");\r\n        return false;\r\n    }\r\n\r\n    // Hide\r\n    $dlg.modal(\"hide\");\r\n    $dlg.data(\"args\", args);\r\n    var _timer, $search;\r\n\r\n    // Success\r\n    var success = function(data) {\r\n        if (data.result == \"OK\") {\r\n            $dlg.find(\".modal-title\").html($lnk.attr(\"title\") || $lnk.data(\"original-title\"));\r\n            $dlg.find(\".modal-body .ewjtable thead\").toggle(!!args.m);\r\n            $dlg.find(\".modal-footer\").html('<button type=\"button\" id=\"btn-select\" class=\"btn btn-primary ew-btn\">' + ew.language.phrase(\"SelectBtn\") + '</button>' +\r\n                '<button type=\"button\" class=\"btn btn-default ew-btn\" data-dismiss=\"modal\">' + ew.language.phrase(\"CancelBtn\") + '</button>');\r\n            $search = $dlg.find(\".modal-header .modal-tools input[name=sv]\").off(\"keyup.ew\").on(\"keyup.ew\", function(e) {\r\n                    if (_timer)\r\n                        _timer.cancel();\r\n                    _timer = $.later(ew.LOOKUP_DELAY, null, function() {\r\n                        $bd.ewjtable(\"load\", { \"sv\": $search.val() });\r\n                    });\r\n                });\r\n            $dlg.find(\".modal-footer #btn-select\").click(_submit); // Select\r\n            ew.modalLookupDialog = $dlg.modal(\"show\");\r\n            $search.focus();\r\n        } else {\r\n            _alert(data.message);\r\n        }\r\n    };\r\n\r\n    var arp = [];\r\n    var linkValue = $input.val(); // Link values\r\n    var arLinkValue = (linkValue !== \"\") ? linkValue.split(ew.MULTIPLE_OPTION_SEPARATOR) : [];\r\n    var data = Object.assign({ page: list.page, field: list.field }, getUserParams('#p_' + oid, f));\r\n\r\n    // Add parent field values\r\n    var parentId = list.parentFields.slice(); // Clone\r\n    if (rowindex != \"\") {\r\n        for (var i = 0, len = parentId.length; i < len; i++) {\r\n            var ar = parentId[i].split(\" \");\r\n            if (ar.length == 1) // Parent field in the same table, add row index\r\n                parentId[i] = parentId[i].replace(/^x_/, \"x\" + rowindex + \"_\");\r\n        }\r\n    }\r\n    if (parentId.length > 0) {\r\n        for (var i = 0, len = parentId.length; i < len; i++)\r\n            arp.push(getOptionValues(parentId[i], f));\r\n    }\r\n    for (var i = 0, cnt = arp.length; i < cnt; i++) // Filter by parent fields\r\n        data[\"v\" + (i + 1)] = arp[i].join(ew.MULTIPLE_OPTION_SEPARATOR);\r\n\r\n    $body.css(\"cursor\", \"wait\");\r\n    $bd.ewjtable({\r\n        paging: true,\r\n        pageSize: args.n,\r\n        pageSizes: [],\r\n        pageSizeChangeArea: false,\r\n        pageList: \"minimal\",\r\n        selecting: true,\r\n        selectingCheckboxes: true,\r\n        multiselect: !!args.m,\r\n        actions: {\r\n            \"listAction\": function(postData, jtParams) {\r\n                var _data = Object.assign({}, data, {\r\n                    ajax: \"modal\",\r\n                    start: jtParams.start,\r\n                    recperpage: jtParams.recperpage\r\n                });\r\n                if ($.isObject(postData)) // Search\r\n                    Object.assign(_data, postData);\r\n                return $.ajax(getApiUrl(ew.API_LOOKUP_ACTION), {\r\n                        type: \"POST\",\r\n                        dataType: \"json\",\r\n                        data: _data\r\n                    }).done(_format).always(function() {\r\n                        $body.css(\"cursor\", \"default\");\r\n                    });\r\n            }\r\n        },\r\n        messages: {\r\n            serverCommunicationError: ew.language.phrase(\"ServerCommunicationError\"),\r\n            loadingMessage: '<div class=\"' + ew.spinnerClass + ' m-3 ew-loading\" role=\"status\"><span class=\"sr-only\">' + ew.language.phrase(\"Loading\") + '</span></div>',\r\n            noDataAvailable: ew.language.phrase(\"NoRecord\"),\r\n            close: ew.language.phrase(\"CloseBtn\"),\r\n            pagingInfo: ew.language.phrase(\"Record\") + \" {0}-{1} \" + ew.language.phrase(\"Of\") + \" {2}\",\r\n            pageSizeChangeLabel: ew.language.phrase(\"RecordsPerPage\"),\r\n            gotoPageLabel: ew.language.phrase(\"Page\")\r\n        },\r\n        fields: {\r\n            \"lf\": { key: true, list: false},\r\n            \"df\": {}\r\n        },\r\n        recordsLoaded: function(e, data) {\r\n            var selectedRows = $(e.target).find(\".ewjtable-data-row\").filter(function() {\r\n                return arLinkValue.includes(String($(this).data(\"record-key\")));\r\n            });\r\n            $(e.target).ewjtable(\"selectRows\", selectedRows);\r\n        },\r\n        selectionChanged: function(e, data) {\r\n            var $rows = data.rows;\r\n            if ($rows) {\r\n                if (!args.m)\r\n                    arLinkValue = [];\r\n                $rows.each(function() {\r\n                    var $row = $(this);\r\n                    var key = String($row.data(\"record-key\"));\r\n                    var index = arLinkValue.indexOf(key);\r\n                    var selected = $row.hasClass(\"ewjtable-row-selected\");\r\n                    if (selected && index == -1)\r\n                        arLinkValue.push(key);\r\n                    else if (!selected && index > -1)\r\n                        arLinkValue.splice(index, 1);\r\n                });\r\n            }\r\n        }\r\n    }).ewjtable(\"load\", null, success);\r\n}\r\n\r\n/**\r\n * Show dialog for import\r\n *\r\n * @param {Object} args - Arguments\r\n * @param {string} args.hdr - Dialog header\r\n * @param {HTMLElement} args.lnk - Anchor element\r\n * @returns\r\n */\r\nexport function importDialogShow(args) {\r\n    $(args.lnk).tooltip(\"hide\");\r\n    var $dlg = ew.importDialog || $(\"#ew-import-dialog\");\r\n    if (!$dlg[0]) {\r\n        _alert(\"DIV #ew-import-dialog not found.\");\r\n        return false;\r\n    }\r\n\r\n    var $input = $dlg.find(\"#importfiles\"),\r\n        $bd = $dlg.find(\".modal-body\"),\r\n        $data = $bd.find(\":input[id!=importfiles]\"),\r\n        $message = $bd.find(\".message\"),\r\n        $progress = $bd.find(\".progress\"),\r\n        timer;\r\n\r\n    // Disable buttons\r\n    var disableButtons = function() {\r\n        $dlg.find(\".modal-footer .btn\").prop(\"disabled\", true);\r\n    }\r\n\r\n    // Enable buttons\r\n    var enableButtons = function() {\r\n        $dlg.find(\".modal-footer .btn\").prop(\"disabled\", false);\r\n    }\r\n\r\n    // Show message\r\n    var showMessage = function(msg, classname) {\r\n        var $msg = $(\"<div>\" + msg + \"</div>\");\r\n        if (classname)\r\n            $msg.addClass(classname);\r\n        $message.removeClass(\"d-none\").html($msg);\r\n        if (classname == \"text-danger\")\r\n            enableButtons();\r\n    }\r\n\r\n    // Hide message\r\n    var hideMessage = function() {\r\n        $message.addClass(\"d-none\").html(\"\");\r\n    }\r\n\r\n    // Show progress\r\n    var showProgress = function(pc, classname) {\r\n        $progress.removeClass(\"d-none\").find(\".progress-bar\").removeClass(\"bg-success bg-info\").addClass(classname || \"bg-success\")\r\n            .attr(\"aria-valuenow\", pc).css(\"width\", pc + \"%\").html(pc + \"%\");\r\n    }\r\n\r\n    // Hide progress\r\n    var hideProgress = function() {\r\n        $progress.addClass(\"d-none\").find(\".progress-bar\").attr(\"aria-valuenow\", 0).css(\"width\", \"0%\").html(\"0%\");\r\n    }\r\n\r\n    // Upload progress\r\n    var uploadProgress = function(data) {\r\n        var pc = parseInt(100 * data.loaded / data.total);\r\n        showProgress(pc, \"bg-info\");\r\n        if (pc === 100) {\r\n            showMessage(ew.language.phrase(\"ImportMessageUploadComplete\"), \"text-info\");\r\n        } else {\r\n            showMessage(ew.language.phrase(\"ImportMessageUploadProgress\").replace(\"%p\", pc), \"text-info\");\r\n        }\r\n    }\r\n\r\n    // Update progress (import)\r\n    var updateProgress = function(result) {\r\n        try {\r\n            var cnt = parseInt(result.count), tcnt = parseInt(result.totalCount), filename = result.file;\r\n            if (tcnt > 0 && $dlg.find(\".modal-footer .ew-close-btn\").data(\"import-progress\")) { // Show progress\r\n                var pc = parseInt(100 * cnt / tcnt);\r\n                showProgress(pc);\r\n                showMessage(ew.language.phrase(\"ImportMessageProgress\").replace(\"%t\", tcnt).replace(\"%c\", cnt).replace(\"%f\", filename), \"text-info\");\r\n            }\r\n        } catch(e) {}\r\n    }\r\n\r\n    // Import progress\r\n    var importProgress = function() {\r\n        var url = getApiUrl(ew.API_PROGRESS_ACTION), data = { \"rnd\": random() };\r\n        data[ew.API_FILE_TOKEN_NAME] = $input.data(ew.API_FILE_TOKEN_NAME);\r\n        $.get(url, data, updateProgress, \"json\");\r\n    }\r\n\r\n    // Import complete\r\n    var importComplete = function(result) {\r\n        var maxErrorCount = 5;\r\n        var msg = \"\";\r\n        showProgress(100);\r\n        var fileResults = result.files;\r\n        $dlg.find(\".modal-footer .ew-close-btn\").data(\"import-progress\", false); // Stop import progress\r\n        if (Array.isArray(fileResults)) {\r\n            for (var i = 0, len = fileResults.length; i < len; i++) {\r\n                var fileResult = fileResults[i],\r\n                    tcnt = fileResult.totalCount || 0,\r\n                    cnt = fileResult.count || 0,\r\n                    scnt = fileResult.successCount || 0,\r\n                    fcnt = fileResult.failCount || 0;\r\n                if (msg != \"\")\r\n                    msg += \"<br>\";\r\n                if (fileResult.success) {\r\n                    msg += ew.language.phrase(\"ImportMessageSuccess\").replace(\"%t\", tcnt).replace(\"%c\", cnt).replace(\"%f\", fileResult.file);\r\n                } else {\r\n                    msg += ew.language.phrase(\"ImportMessageError1\").replace(\"%t\", tcnt).replace(\"%c\", cnt).replace(\"%f\", fileResult.file).replace(\"%s\", scnt).replace(\"%e\", fcnt);\r\n                    if (fileResult.error)\r\n                        msg += ew.language.phrase(\"ImportMessageError2\").replace(\"%e\", fileResult.error);\r\n                    var showLog = true;\r\n                    if (fileResult.failList) {\r\n                        var ecnt = 0;\r\n                        for (var i = 1; i <= cnt; i++) {\r\n                            if (fileResult.failList[\"row\" + i]) {\r\n                                ecnt += 1;\r\n                                msg += \"<br>\" + ew.language.phrase(\"ImportMessageError3\").replace(\"%i\", i).replace(\"%d\", fileResult.failList[\"row\" + i]);\r\n                            }\r\n                            if (ecnt >= maxErrorCount)\r\n                                break;\r\n                        }\r\n                        if (fcnt > maxErrorCount)\r\n                            msg += \"<br>\" + ew.language.phrase(\"ImportMessageMore\").replace(\"%s\", fcnt - maxErrorCount);\r\n                        else\r\n                            showLog = false;\r\n                    }\r\n                    if (fileResult.log && showLog)\r\n                        msg += \"<br>\" + ew.language.phrase(\"ImportMessageError4\").replace(\"%l\", fileResult.log);\r\n                    showMessage(msg, \"text-danger\"); // Show error message\r\n                }\r\n            }\r\n        }\r\n        if (result.success) {\r\n            showMessage(msg, \"text-success\");\r\n            $dlg.find(\".modal-footer .ew-close-btn\").data(\"imported\", true);\r\n        } else {\r\n            if (result.error)\r\n                msg = result.error;\r\n            showMessage(msg, \"text-danger\"); // Show error message\r\n        }\r\n        hideProgress();\r\n    }\r\n\r\n    // Import fail\r\n    var importFail = function(o) {\r\n        $dlg.find(\".modal-footer .ew-close-btn\").data(\"import-progress\", false); // Stop import progress\r\n        showMessage(ew.language.phrase(\"ImportMessageServerError\").replace(\"%s\", o.status).replace(\"%t\", o.statusText), \"text-danger\");\r\n    }\r\n\r\n    // Import file\r\n    var importFiles = function(filetoken) {\r\n        $body.css(\"cursor\", \"wait\");\r\n        $input.data(ew.API_FILE_TOKEN_NAME, filetoken);\r\n        $dlg.find(\".modal-footer .ew-close-btn\").data(\"import-progress\", true); // Show import progress\r\n        var data = ew.API_ACTION_NAME + \"=import&\" + ew.API_FILE_TOKEN_NAME + \"=\" + encodeURIComponent(filetoken);\r\n        if ($data.length)\r\n            data += \"&\" + $data.serialize();\r\n        $.ajax(currentPage(), {\r\n            \"data\": data,\r\n            \"method\": \"POST\",\r\n            \"dataType\": \"json\",\r\n            \"beforeSend\": function(xhr, settings) {\r\n                timer = $.later(100, null, importProgress, null, true); // Use time to show progress periodically\r\n            }\r\n        }).done(importComplete).fail(importFail).always(function() {\r\n            $body.css(\"cursor\", \"default\");\r\n            if (timer)\r\n                timer.cancel(); // Clear timer\r\n        });\r\n    }\r\n\r\n    var formData = { session: ew.SESSION_ID };\r\n    formData[ew.TOKEN_NAME_KEY] = ew.TOKEN_NAME; // Add token name for $.ajax() sent by jQuery File Upload (not by ajaxSend) // PHP\r\n    formData[ew.ANTIFORGERY_TOKEN_KEY] = ew.ANTIFORGERY_TOKEN; // Add antiforgery token for $.ajax() sent by jQuery File Upload (not by ajaxSend) // PHP\r\n    var options = ew.importUploadOptions;\r\n    if (!options.acceptFileTypes)\r\n        options.acceptFileTypes = new RegExp('\\\\.(' + ew.IMPORT_FILE_ALLOWED_EXT.replace(/,/g, '|') + ')$', 'i');\r\n\r\n    if (!$input.data(\"blueimpFileupload\")) {\r\n        $input.fileupload(Object.assign({\r\n                url: getApiUrl(ew.API_UPLOAD_ACTION),\r\n                dataType: \"json\",\r\n                autoUpload: true,\r\n                formData: formData,\r\n                singleFileUploads: false,\r\n                messages: {\r\n                    acceptFileTypes: ew.language.phrase(\"UploadErrMsgAcceptFileTypes\"),\r\n                    maxFileSize: ew.language.phrase(\"UploadErrMsgMaxFileSize\"),\r\n                    maxNumberOfFiles: ew.language.phrase(\"UploadErrMsgMaxNumberOfFiles\"),\r\n                    minFileSize: ew.language.phrase(\"UploadErrMsgMinFileSize\")\r\n                },\r\n                beforeSend: function(jqxhr, settings) {\r\n                    if (ew.API_JWT_TOKEN && !ew.IS_WINDOWS_AUTHENTICATION) // Do NOT set JWT authorization header if Windows Authentication\r\n                        jqxhr.setRequestHeader(ew.API_JWT_AUTHORIZATION_HEADER, \"Bearer \" + ew.API_JWT_TOKEN);\r\n                },\r\n                done: function(e, data) {\r\n                    if (data.result && data.result.files && Array.isArray(data.result.files.importfiles)) {\r\n                        var ok = true;\r\n                        data.result.files.importfiles.forEach(function(file, index) {\r\n                            if (file.error) {\r\n                                showMessage(ew.language.phrase(\"ImportMessageUploadError\").replace(\"%f\", file.name).replace(\"%s\", file.error), \"text-danger\");\r\n                                ok = false;\r\n                            }\r\n                        }); // Show upload errors for each file\r\n                        if (ok)\r\n                            importFiles(data.result[ew.API_FILE_TOKEN_NAME]); // Import uploaded files\r\n                    }\r\n                },\r\n                change: function(e, data) {\r\n                    hideMessage();\r\n                },\r\n                processfail: function(e, data) {\r\n                    data.files.forEach(function(file, index) {\r\n                        if (file.error)\r\n                            showMessage(ew.language.phrase(\"ImportMessageUploadError\").replace(\"%f\", file.name).replace(\"%s\", file.error), \"text-danger\");\r\n                    }); // Show process errors for each file\r\n                },\r\n                fail: function(e, data) {\r\n                    showMessage(ew.language.phrase(\"ImportMessageServerError\").replace(\"%s\", data.textStatus).replace(\"%t\", data.errorThrown), \"text-danger\");\r\n                },\r\n                progressall: function(e, data) {\r\n                    uploadProgress(data);\r\n                }\r\n        }, options));\r\n    }\r\n\r\n    $dlg.modal(\"hide\").find(\".modal-title\").html(args.hdr);\r\n    $dlg.find(\".modal-footer .ew-close-btn\").off(\"click.ew\").on(\"click.ew\", function() {\r\n        var $this = $(this);\r\n        if ($this.data(\"imported\")) {\r\n            $this.data(\"imported\", false);\r\n            window.location.reload();\r\n        }\r\n    });\r\n    hideMessage();\r\n    ew.importDialog = $dlg.modal(\"show\");\r\n    return false;\r\n}\r\n\r\n// Auto-fill\r\nexport function autoFill(el) {\r\n    var f = forms.get(el).$element[0];\r\n    if (!f)\r\n        return;\r\n    var ar = getOptionValues(el),\r\n        id = getId(el),\r\n        m = id.match(/^([xy])(\\d*)_/),\r\n        rowindex = (m) ? m[2] : \"\",\r\n        list = forms.get(el).getList(id),\r\n        dest_array = list.autoFillTargetFields;\r\n    var success = function(data) {\r\n        var results = data && data.records || \"\";\r\n        var result = (results) ? results[0] : [];\r\n        for (var j = 0; j < dest_array.length; j++) {\r\n            var destEl = getElements(dest_array[j].replace(/^x_/, \"x\" + rowindex + \"_\"), f);\r\n            if (destEl) {\r\n                var val = ($.isValue(result[\"af\" + j])) ? String(result[\"af\" + j]) : \"\";\r\n                var args = {results: results, result: result, data: val, form: f, name: id, target: dest_array[j], cancel: false, trigger: true};\r\n                $(el).trigger(\"autofill\", [args]); // Fire event\r\n                if (args.cancel)\r\n                    continue;\r\n                val = args.data; // Process the value\r\n                if (destEl.options) { // Selection list\r\n                    selectOption(destEl, val.split(\",\"));\r\n                    if (isAutoSuggest(destEl)) { // Auto-Suggest\r\n                        destEl.input.value = val;\r\n                        updateOptions.call(forms.get(f.id), destEl);\r\n                    } else if (isModalLookup(destEl)) { // Modal-Lookup\r\n                        //$(destEl).parent().find(\".ew-lookup-text\").html(val);\r\n                        updateOptions.call(forms.get(f.id), destEl);\r\n                    }\r\n                } else if (isHiddenTextArea(destEl)) { // HTML editor\r\n                    destEl.value = val;\r\n                    $(destEl).data(\"editor\").set();\r\n                } else {\r\n                    destEl.value = val;\r\n                }\r\n                if (args.trigger)\r\n                    $(destEl).trigger(\"change\");\r\n            }\r\n        }\r\n        return result;\r\n    };\r\n    if (ar.length > 0 && ar[0] != \"\") {\r\n        var data = Object.assign({\r\n            page: list.page,\r\n            field: list.field,\r\n            ajax: \"autofill\",\r\n            v0: ar[0],\r\n            language: ew.LANGUAGE_ID\r\n        }, getUserParams('#p_' + id, f));\r\n        // Add parent field values\r\n        var parentId = list.parentFields.slice(); // Clone\r\n        if (rowindex != \"\") {\r\n            for (var i = 0, len = parentId.length; i < len; i++) {\r\n                var ar = parentId[i].split(\" \");\r\n                if (ar.length == 1) // Parent field in the same table, add row index\r\n                    parentId[i] = parentId[i].replace(/^x_/, \"x\" + rowindex + \"_\");\r\n            }\r\n        }\r\n        var arp = parentId.map(function(pid) {\r\n            return getOptionValues(pid, f);\r\n        });\r\n        for (var i = 0, cnt = arp.length; i < cnt; i++) // Filter by parent fields\r\n            data[\"v\" + (i + 1)] = arp[i].join(ew.MULTIPLE_OPTION_SEPARATOR);\r\n        return $.post(getApiUrl(ew.API_LOOKUP_ACTION), data, success, \"json\");\r\n    }\r\n    return success();\r\n}\r\n\r\n// Setup tooltip links\r\nexport function tooltip(i, el) {\r\n    var $this = $(el), $tt = $(\"#\" + $this.data(\"tooltip-id\")),\r\n        trig = $this.data(\"trigger\") || \"hover\", dir = $this.data(\"placement\") || (ew.CSS_FLIP ? \"left\" : \"right\"); // dir = \"left|right\"\r\n    if (!$tt[0] || $tt.text().trim() == \"\" && !$tt.find(\"img[src!='']\")[0])\r\n        return;\r\n    if (!$this.data(\"bs.popover\")) {\r\n        $this.popover({\r\n            html: true,\r\n            placement: dir,\r\n            trigger: trig,\r\n            delay: 100,\r\n            container: $(\"#ew-tooltip\")[0],\r\n            content: $tt.html(),\r\n            sanitizeFn: ew.sanitizeFn\r\n        }).on(\"show.bs.popover\", function(e) {\r\n            var wd, $tip = $($this.data(\"bs.popover\").getTipElement()).css(\"z-index\", 9999); // Make z-index higher than modal dialog\r\n            if (wd = $this.data(\"tooltip-width\")) // Set width before show\r\n                $tip.css(\"max-width\", parseInt(wd, 10) + \"px\");\r\n        });\r\n    }\r\n}\r\n\r\n/**\r\n * Show dialog for email sending\r\n *\r\n * @param {Object} args - Arguments\r\n * @param {string} args.lnk - Email link ID\r\n * @param {string} args.hdr - Dialog header\r\n * @param {string} args.url - URL of the email content\r\n * @param {HTMLElement} args.f - Form\r\n * @param {Object} args.key - Key as object\r\n * @param {boolean} args.sel - Exported selected\r\n * @returns false\r\n */\r\nexport function emailDialogShow(args) {\r\n    var $dlg = ew.emailDialog || $(\"#ew-email-dialog\");\r\n    if (!$dlg[0]) {\r\n        _alert(\"DIV #ew-email-dialog not found.\");\r\n        return false;\r\n    }\r\n    if (args.sel && !keySelected(args.f)) {\r\n        _alert(ew.language.phrase(\"NoRecordSelected\"));\r\n        return false;\r\n    }\r\n    var $f = $dlg.find(\".modal-body form\"),\r\n        frm = $f.data(\"form\");\r\n    if (!frm) {\r\n        frm = new Form($f.attr(\"id\"));\r\n        frm.addFields([\r\n            [\"sender\", [ew.Validators.required(ew.language.phrase(\"Sender\")), ew.Validators.email]],\r\n            [\"recipient\", [ew.Validators.required(ew.language.phrase(\"Recipient\")), ew.Validators.emails(ew.MAX_EMAIL_RECIPIENT, ew.language.phrase(\"EnterProperRecipientEmail\"))]],\r\n            [\"cc\", ew.Validators.emails(ew.MAX_EMAIL_RECIPIENT, ew.language.phrase(\"EnterProperCcEmail\"))],\r\n            [\"bcc\", ew.Validators.emails(ew.MAX_EMAIL_RECIPIENT, ew.language.phrase(\"EnterProperBccEmail\"))],\r\n            [\"subject\", ew.Validators.required(ew.language.phrase(\"Subject\"))]\r\n        ]);\r\n        frm.validate = function() {\r\n            return this.validateFields();\r\n        };\r\n        frm.submit = function(e) {\r\n            if (!this.validate())\r\n                return false;\r\n            var qs = $f.serialize(), data = \"\";\r\n            if (args.f && args.sel) // Export selected\r\n                data = $(args.f).find(\"input[type=checkbox][name='key_m[]']:checked\").serialize();\r\n            if (args.key)\r\n                qs += \"&\" + $.param(args.key);\r\n            var fobj = this.getForm();\r\n            if (args.url) { // Custom Template\r\n                $dlg.modal(\"hide\");\r\n                if (args.exportid)\r\n                    ew.exportWithCharts(args.el, args.url, args.exportid, fobj);\r\n                else\r\n                    _export(args.f, args.url, \"email\", true, args.sel, fobj);\r\n            } else {\r\n                $.post($(args.f).attr(\"action\"), qs + \"&\" + data, function(result) {\r\n                    showMessage(result);\r\n                });\r\n            }\r\n            return true;\r\n        };\r\n        $f.data(\"form\", frm);\r\n    }\r\n    $dlg.modal(\"hide\").find(\".modal-title\").html(args.hdr);\r\n    $dlg.find(\".modal-footer .btn-primary\").off().click(function(e) {\r\n        e.preventDefault();\r\n        if (frm.submit(e))\r\n            $dlg.modal(\"hide\");\r\n    });\r\n    ew.emailDialog = $dlg.modal(\"show\");\r\n    return false;\r\n}\r\n\r\n// Show drill down\r\nexport function showDrillDown(e, obj, url, id, hdr) {\r\n    if (e && e.ctrlKey) {\r\n        var arUrl = url.split(\"?\"), params = new URLSearchParams(arUrl[1]);\r\n        params.set(\"d\", \"2\");  // Change d parameter to 2\r\n        redirect(arUrl[0] + \"?\" + params.toString());\r\n        return false;\r\n    }\r\n    var $obj = ($.isString(obj)) ? $(\"#\" + obj) : $(obj);\r\n    var pos = $obj.data(\"drilldown-placement\") || ($obj.hasClass(\"ew-chart-canvas\") ? (ew.CSS_FLIP ? \"left\" : \"right\") : \"bottom\");\r\n    $obj.tooltip(\"hide\");\r\n    var args = {\"obj\": $obj[0], \"id\": id, \"url\": url, \"hdr\": hdr, \"placement\": pos};\r\n    $document.trigger(\"drilldown\", [args]);\r\n    var ar = args.url.split(\"?\");\r\n    args.file = ar[0] || \"\";\r\n    args.data = ar[1] || \"\";\r\n    if (!$obj.data(\"bs.popover\")) {\r\n        $obj.popover({\r\n            html: true,\r\n            placement: args.placement,\r\n            trigger: \"manual\",\r\n            template: '<div class=\"popover\"><h3 class=\"popover-header d-none\" style=\"cursor: move;\"></h3><div class=\"popover-body\"></div></div>',\r\n            content: '<div class=\"' + ew.spinnerClass + ' m-3 ew-loading\" role=\"status\"><span class=\"sr-only\">' + ew.language.phrase(\"Loading\") + '</span></div>',\r\n            container: $(\"#ew-drilldown-panel\"),\r\n            sanitizeFn: ew.sanitizeFn,\r\n            boundary: \"viewport\"\r\n        }).on(\"show.bs.popover\", function(e) {\r\n            $obj.attr(\"data-original-title\", \"\");\r\n        }).on(\"shown.bs.popover\", function(e) {\r\n            if (!$obj.data(\"args\"))\r\n                return;\r\n            var data = $obj.data(\"args\").data;\r\n            data += (data ? \"&\" : \"\") + ew.TOKEN_NAME_KEY + \"=\" + ew.TOKEN_NAME; // Add token name // PHP\r\n            data += (data ? \"&\" : \"\") + ew.ANTIFORGERY_TOKEN_KEY + \"=\" + ew.ANTIFORGERY_TOKEN; // Add antiforgery token // PHP\r\n            $.ajax({\r\n                cache: false,\r\n                dataType: \"html\",\r\n                type: \"POST\",\r\n                data: data,\r\n                url: $obj.data(\"args\").file,\r\n                success: function(data) {\r\n                    var $tip = $($obj.data(\"bs.popover\").getTipElement()).on(\"mousedown\", function(e) {\r\n                        var $this = $(this).addClass(\"drag\"),\r\n                            height = $this.outerHeight(),\r\n                            width = $this.outerWidth(),\r\n                            ypos = $this.offset().top + height - e.pageY,\r\n                            xpos = $this.offset().left + width - e.pageX;\r\n                        $body.on(\"mousemove\", function(e) {\r\n                            var top = e.pageY + ypos - height,\r\n                                left = e.pageX + xpos - width;\r\n                            if ($this.hasClass(\"drag\"))\r\n                                $this.offset({top: top, left: left});\r\n                        }).on(\"mouseup\", function(e){\r\n                            $this.removeClass(\"drag\");\r\n                        });\r\n                    });\r\n                    if (args.hdr)\r\n                        $tip.find(\".popover-header\").empty().removeClass(\"d-none\")\r\n                            .append('<button type=\"button\" class=\"close\" aria-label=\"Close\"><span aria-hidden=\"true\">&times;</span></button>' + args.hdr)\r\n                            .find(\".close\").on(\"click\", function() {\r\n                                $obj.popover(\"hide\");\r\n                            });\r\n                    var m = data.match(/<body[^>]*>([\\s\\S]*?)<\\/body\\s*>/i); // Use HTML in document body only\r\n                    data = m ? m[0] : data;\r\n                    var html = ew.stripScript(data);\r\n                    $tip.find(\".popover-body\").html($(\"<div></div>\").html(html).find(\"#ew-report\")) // Insert the container table only\r\n                        .find(\".ew-table\").each(ew.setupTable);\r\n                    ew.executeScript(data, id);\r\n                    $obj.popover(\"update\");\r\n                },\r\n                error: function(o) {\r\n                    if (o.responseText) {\r\n                        var $tip = $($el.data(\"bs.popover\").getTipElement());\r\n                        $tip.find(\".popover-body\").empty().append('<p class=\"text-danger\">' + o.responseText + '</p>');\r\n                    }\r\n                }\r\n            });\r\n        }).on(\"hidden.bs.popover\", function(e) {\r\n            $.each(ew.drillDownCharts, function(key, cht) { // Dispose charts\r\n                cht.dispose();\r\n            });\r\n            ew.drillDownCharts = {};\r\n            ew.removeScript(id);\r\n        });\r\n    }\r\n    $obj.data(\"args\", args).popover(\"show\");\r\n}\r\n\r\n/**\r\n * Ajax query\r\n * @param {Object} data - object to passed to API\r\n * @param {callback} callback - Callback function for async request (see http://api.jquery.com/jQuery.post/), empty for sync request\r\n * @returns {string|string[]}\r\n */\r\nexport function ajax(data, callback) {\r\n    if (!$.isObject(data) || !data.url && !data.action)\r\n        return undefined;\r\n    var action;\r\n    if (data.url) {\r\n        if (data.url.startsWith(getApiUrl()))\r\n            action = data.url.replace(getApiUrl(), \"\").split(\"/\")[0];\r\n        else if (data.url.startsWith(ew.API_URL))\r\n            action = data.url.replace(ew.API_URL, \"\").split(\"/\")[0];\r\n    } else { \r\n        action = data.action\r\n        delete data.action;\r\n    }\r\n    var obj = Object.assign({}, data);\r\n    var _convert = (response) => {\r\n        if ($.isObject(response) && response.result == \"OK\") {\r\n            var results = response.records;\r\n            if (Array.isArray(results) && results.length == 1) { // Single row\r\n                results = results[0];\r\n                if (Array.isArray(results) && results.length == 1) // Single column\r\n                    return results[0]; // Return a value\r\n                else\r\n                    return results; // Return a row\r\n            }\r\n            return results;\r\n        }\r\n        return response;\r\n    };\r\n    var url = obj.url || getApiUrl(action), // URL\r\n        type = obj.type || ([ew.API_LIST_ACTION, ew.API_VIEW_ACTION, ew.API_DELETE_ACTION].includes(action) ? \"GET\" : \"POST\");\r\n    delete obj.url;\r\n    delete obj.type;\r\n    obj.dataType = \"json\";\r\n    if (isFunction(callback)) { // Async\r\n        $.ajax({\r\n            url: url,\r\n            type: type,\r\n            data: obj,\r\n            success: function (response) {\r\n                callback(_convert(response));\r\n            }\r\n        });\r\n    } else { // Sync\r\n        var response = $.ajax({\r\n            url: url,\r\n            async: false,\r\n            type: type,\r\n            data: obj\r\n        });\r\n        return _convert(response.responseJSON);\r\n    }\r\n}\r\n\r\n// Get URL of current page\r\nexport function currentPage() {\r\n    return location.href.split(\"#\")[0].split(\"?\")[0];\r\n}\r\n\r\n// Toggle search operator\r\nexport function toggleSearchOperator(id, value) {\r\n    var el = this.form.elements[id];\r\n    if (!el)\r\n        return;\r\n    el.value = (el.value != value) ? value : \"=\";\r\n}\r\n\r\n// Validators\r\n// Check US Date format (mm/dd/yyyy)\r\nexport function checkUSDate(object_value) {\r\n    return checkDateEx(object_value, \"us\", ew.DATE_SEPARATOR);\r\n}\r\n\r\n// Check US Date format (mm/dd/yy)\r\nexport function checkShortUSDate(object_value) {\r\n    return checkDateEx(object_value, \"usshort\", ew.DATE_SEPARATOR);\r\n}\r\n\r\n// Check Date format (yyyy/mm/dd)\r\nexport function checkDate(object_value) {\r\n    return checkDateEx(object_value, \"std\", ew.DATE_SEPARATOR);\r\n}\r\n\r\n// Check Date format (yy/mm/dd)\r\nexport function checkShortDate(object_value) {\r\n    return checkDateEx(object_value, \"stdshort\", ew.DATE_SEPARATOR);\r\n}\r\n\r\n// Check Euro Date format (dd/mm/yyyy)\r\nexport function checkEuroDate(object_value) {\r\n    return checkDateEx(object_value, \"euro\", ew.DATE_SEPARATOR);\r\n}\r\n\r\n// Check Euro Date format (dd/mm/yy)\r\nexport function checkShortEuroDate(object_value) {\r\n    return checkDateEx(object_value, \"euroshort\", ew.DATE_SEPARATOR);\r\n}\r\n\r\n// Check default date format\r\nexport function checkDateDef(object_value) {\r\n    if (ew.DATE_FORMAT.match(/^yyyy/))\r\n        return checkDate(object_value);\r\n    else if (ew.DATE_FORMAT.match(/^yy/))\r\n        return checkShortDate(object_value);\r\n    else if (ew.DATE_FORMAT.match(/^m/) && ew.DATE_FORMAT.match(/yyyy$/))\r\n        return checkUSDate(object_value);\r\n    else if (ew.DATE_FORMAT.match(/^m/) && ew.DATE_FORMAT.match(/yy$/))\r\n        return checkShortUSDate(object_value);\r\n    else if (ew.DATE_FORMAT.match(/^d/) && ew.DATE_FORMAT.match(/yyyy$/))\r\n        return checkEuroDate(object_value);\r\n    else if (ew.DATE_FORMAT.match(/^d/) && ew.DATE_FORMAT.match(/yy$/))\r\n        return checkShortEuroDate(object_value);\r\n    return false;\r\n}\r\n\r\n// Check date format\r\n// format: std/stdshort/us/usshort/euro/euroshort\r\nexport function checkDateEx(value, format, sep) {\r\n    if (!value || value.length == \"\")\r\n        return true;\r\n    value = value.replace(/ +/g, \" \").trim();\r\n    var arDT = value.split(\" \");\r\n    if (arDT.length > 0) {\r\n        var re, ar, sYear, sMonth, sDay;\r\n        re = /^(\\d{4})-([0][1-9]|[1][0-2])-([0][1-9]|[1|2]\\d|[3][0|1])$/;\r\n        if (ar = re.exec(arDT[0])) {\r\n            sYear = ar[1];\r\n            sMonth = ar[2];\r\n            sDay = ar[3];\r\n        } else {\r\n            var wrksep = escapeRegExChars(sep);\r\n            switch (format) {\r\n                case \"std\":\r\n                    re = new RegExp(\"^(\\\\d{4})\" + wrksep + \"([0]?[1-9]|[1][0-2])\" + wrksep + \"([0]?[1-9]|[1|2]\\\\d|[3][0|1])$\");\r\n                    break;\r\n                case \"stdshort\":\r\n                    re = new RegExp(\"^(\\\\d{2})\" + wrksep + \"([0]?[1-9]|[1][0-2])\" + wrksep + \"([0]?[1-9]|[1|2]\\\\d|[3][0|1])$\");\r\n                    break;\r\n                case \"us\":\r\n                    re = new RegExp(\"^([0]?[1-9]|[1][0-2])\" + wrksep + \"([0]?[1-9]|[1|2]\\\\d|[3][0|1])\" + wrksep + \"(\\\\d{4})$\");\r\n                    break;\r\n                case \"usshort\":\r\n                    re = new RegExp(\"^([0]?[1-9]|[1][0-2])\" + wrksep + \"([0]?[1-9]|[1|2]\\\\d|[3][0|1])\" + wrksep + \"(\\\\d{2})$\");\r\n                    break;\r\n                case \"euro\":\r\n                    re = new RegExp(\"^([0]?[1-9]|[1|2]\\\\d|[3][0|1])\" + wrksep + \"([0]?[1-9]|[1][0-2])\" + wrksep + \"(\\\\d{4})$\");\r\n                    break;\r\n                case \"euroshort\":\r\n                    re = new RegExp(\"^([0]?[1-9]|[1|2]\\\\d|[3][0|1])\" + wrksep + \"([0]?[1-9]|[1][0-2])\" + wrksep + \"(\\\\d{2})$\");\r\n                    break;\r\n            }\r\n            if (!re.test(arDT[0]))\r\n                return false;\r\n            var arD = arDT[0].split(sep);\r\n            switch (format) {\r\n                case \"std\":\r\n                case \"stdshort\":\r\n                    sYear = unformatYear(arD[0]);\r\n                    sMonth = arD[1];\r\n                    sDay = arD[2];\r\n                    break;\r\n                case \"us\":\r\n                case \"usshort\":\r\n                    sYear = unformatYear(arD[2]);\r\n                    sMonth = arD[0];\r\n                    sDay = arD[1];\r\n                    break;\r\n                case \"euro\":\r\n                case \"euroshort\":\r\n                    sYear = unformatYear(arD[2]);\r\n                    sMonth = arD[1];\r\n                    sDay = arD[0];\r\n                    break;\r\n            }\r\n        }\r\n        if (!checkDay(sYear, sMonth, sDay))\r\n            return false;\r\n    }\r\n    if (arDT.length > 1 && !checkTime(arDT[1]))\r\n        return false;\r\n    return true;\r\n}\r\n\r\n// Unformat 2 digit year to 4 digit year\r\nexport function unformatYear(yr) {\r\n    if (yr.length == 2)\r\n        return (yr > ew.UNFORMAT_YEAR) ? \"19\" + yr : \"20\" + yr;\r\n    return yr;\r\n}\r\n\r\n// Check day\r\nexport function checkDay(checkYear, checkMonth, checkDay) {\r\n    checkYear = parseInt(checkYear, 10);\r\n    checkMonth = parseInt(checkMonth, 10);\r\n    checkDay = parseInt(checkDay, 10);\r\n    var maxDay = [4, 6, 9, 11].includes(checkMonth) ? 30 : 31;\r\n    if (checkMonth == 2)\r\n        maxDay = (checkYear % 4 > 0 || checkYear % 100 == 0 && checkYear % 400 > 0) ? 28 : 29;\r\n    return checkRange(checkDay, 1, maxDay);\r\n}\r\n\r\n// Check integer\r\nexport function checkInteger(object_value) {\r\n    if (!object_value || object_value.length == 0)\r\n        return true;\r\n    if (object_value.includes(ew.DECIMAL_POINT))\r\n        return false;\r\n    return checkNumber(object_value);\r\n}\r\n\r\n// Check number\r\nexport function checkNumber(object_value) {\r\n    object_value = String(object_value);\r\n    if (!object_value || object_value.length == 0)\r\n        return true;\r\n    object_value = object_value.trim();\r\n    var ts = escapeRegExChars(ew.THOUSANDS_SEP), dp = escapeRegExChars(ew.DECIMAL_POINT),\r\n        re = new RegExp(\"^[+-]?(\\\\d{1,3}(\" + (ts ? ts + \"?\" : \"\") + \"\\\\d{3})*(\" + dp + \"\\\\d+)?|\" + dp + \"\\\\d+)$\");\r\n    return re.test(object_value);\r\n}\r\n\r\n// Convert to float\r\nexport function stringToFloat(object_value) {\r\n    object_value = String(object_value);\r\n    if (ew.THOUSANDS_SEP != \"\") {\r\n        var re = new RegExp(escapeRegExChars(ew.THOUSANDS_SEP), \"g\");\r\n        object_value = object_value.replace(re, \"\");\r\n    }\r\n    if (ew.DECIMAL_POINT != \"\")\r\n        object_value = object_value.replace(ew.DECIMAL_POINT, \".\");\r\n    return parseFloat(object_value);\r\n}\r\n\r\n// Convert string (yyyy-mm-dd hh:mm:ss) to date object\r\nexport function stringToDate(object_value) {\r\n    var re = /^(\\d{4})-([0][1-9]|[1][0-2])-([0][1-9]|[1|2]\\d|[3][0|1]) (?:(0\\d|1\\d|2[0-3]):([0-5]\\d):([0-5]\\d))?$/;\r\n    var ar = object_value.replace(re, \"$1 $2 $3 $4 $5 $6\").split(\" \");\r\n    return new Date(ar[0], ar[1]-1, ar[2], ar[3], ar[4], ar[5]);\r\n}\r\n\r\n// Escape regular expression chars\r\nexport function escapeRegExChars(str) {\r\n    return str.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, \"\\\\$&\");\r\n}\r\n\r\n// Check range\r\nexport function checkRange(object_value, min_value, max_value) {\r\n    if (!object_value || object_value.length == 0)\r\n        return true;\r\n    if ($.isNumber(min_value) || $.isNumber(max_value)) { // Number\r\n        if (checkNumber(object_value))\r\n            object_value = stringToFloat(object_value);\r\n    }\r\n    if (!$.isNull(min_value) && object_value < min_value)\r\n        return false;\r\n    if (!$.isNull(max_value) && object_value > max_value)\r\n        return false;\r\n    return true;\r\n}\r\n\r\n// Check time\r\nexport function checkTime(object_value) {\r\n    if (!object_value || object_value.length == 0)\r\n        return true;\r\n    object_value = object_value.trim();\r\n    var re = new RegExp('^(0\\\\d|1\\\\d|2[0-3])' + escapeRegExChars(ew.TIME_SEPARATOR) + '[0-5]\\\\d(( (' + escapeRegExChars(ew.language.phrase(\"AM\")) + '|' + escapeRegExChars(ew.language.phrase(\"PM\")) + '))|(' + escapeRegExChars(ew.TIME_SEPARATOR) + '[0-5]\\\\d(\\\\.\\\\d+|[+-][\\\\d:]+)?)?)$', 'i');\r\n    return re.test(object_value);\r\n}\r\n\r\n// Check phone\r\nexport function checkPhone(object_value) {\r\n    if (!object_value || object_value.length == 0)\r\n        return true;\r\n    return /^\\(\\d{3}\\) ?\\d{3}( |-)?\\d{4}|^\\d{3}( |-)?\\d{3}( |-)?\\d{4}$/.test(object_value.trim());\r\n}\r\n\r\n// Check zip\r\nexport function checkZip(object_value) {\r\n    if (!object_value || object_value.length == 0)\r\n        return true;\r\n    return /^\\d{5}$|^\\d{5}-\\d{4}$/.test(object_value.trim());\r\n}\r\n\r\n// Check credit card\r\nexport function checkCreditCard(object_value) {\r\n    if (!object_value || object_value.length == 0)\r\n        return true;\r\n    var creditcard_string = object_value.replace(/\\D/g, \"\");\r\n    if (creditcard_string.length == 0)\r\n        return false;\r\n    var doubledigit = creditcard_string.length % 2 == 1 ? false : true;\r\n    var tempdigit, checkdigit = 0;\r\n    for (var i = 0, len = creditcard_string.length; i < len; i++) {\r\n        tempdigit = parseInt(creditcard_string.charAt(i), 10);\r\n        if (doubledigit) {\r\n            tempdigit *= 2;\r\n            checkdigit += (tempdigit % 10);\r\n            if (tempdigit / 10 >= 1.0)\r\n                checkdigit++;\r\n            doubledigit = false;\r\n        }\telse {\r\n            checkdigit += tempdigit;\r\n            doubledigit = true;\r\n        }\r\n    }\r\n    return (checkdigit % 10 == 0);\r\n}\r\n\r\n// Check social security number\r\nexport function checkSsn(object_value) {\r\n    if (!object_value || object_value.length == 0)\r\n        return true;\r\n    return /^(?!000)([0-6]\\d{2}|7([0-6]\\d|7[012]))([ -]?)(?!00)\\d\\d\\3(?!0000)\\d{4}$/.test(object_value.trim());\r\n}\r\n\r\n// Check emails\r\nexport function checkEmails(object_value, email_cnt) {\r\n    if (!object_value || object_value.length == 0)\r\n        return true;\r\n    var arEmails = object_value.replace(/,/g, \";\").split(\";\");\r\n    for (var i = 0, len = arEmails.length; i < len; i++) {\r\n        if (email_cnt > 0 && len > email_cnt)\r\n            return false;\r\n        if (!checkEmail(arEmails[i]))\r\n            return false;\r\n    }\r\n    return true;\r\n}\r\n\r\n// Check email\r\nexport function checkEmail(object_value) {\r\n    if (!object_value || object_value.length == 0)\r\n        return true;\r\n    return /^[\\w.%+-]+@[\\w.-]+\\.[A-Z]{2,18}$/i.test(object_value.trim());\r\n}\r\n\r\n// Check GUID {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}\r\nexport function checkGuid(object_value) {\r\n    if (!object_value || object_value.length == 0)\r\n        return true;\r\n    return /^(\\{\\w{8}-\\w{4}-\\w{4}-\\w{4}-\\w{12}\\}|\\w{8}-\\w{4}-\\w{4}-\\w{4}-\\w{12})$/.test(object_value.trim());\r\n}\r\n\r\n// Check by regular expression\r\nexport function checkByRegEx(object_value, pattern) {\r\n    if (!object_value || object_value.length == 0)\r\n        return true;\r\n    return !!object_value.match(pattern);\r\n}\r\n\r\n/**\r\n * Show message dialog\r\n *\r\n * @param {Event|string} arg - Event or message\r\n * @returns\r\n */\r\nexport function showMessage(arg) {\r\n    var win = window.parent, // Note: If a window does not have a parent, its parent property is a reference to itself.\r\n        p = arg?.target ?? win.document,\r\n        swal = win.Swal,\r\n        $div = $(p).find(\"div.ew-message-dialog:hidden\").first(),\r\n        msg = $div.length ? $div.text() : \"\"; // Text only\r\n    if ($.isString(arg))\r\n        msg = $(\"<div>\" + arg.trim() + \"</div>\").text();\r\n    if (msg.trim() == \"\")\r\n        return;\r\n    if ($div.length) {\r\n        [\"success\", \"info\", \"warning\", \"danger\"].forEach(function(value, index) {\r\n            var $alert = $div.find(\".alert-\" + value).toggleClass(\"alert-\" + value),\r\n                $heading = $alert.find(\".alert-heading\").detach(),\r\n                $content = $alert.children(\":not(.icon)\");\r\n            $alert.find(\".icon\").remove();\r\n            if ($alert[0]) {\r\n                var w = parseInt($content.css(\"width\"), 10); // Width specified\r\n                if (w > 0)\r\n                    $content.first().css(\"width\", \"auto\");\r\n                var $toast = toast({\r\n                    class: \"ew-toast bg-\" + value,\r\n                    title: $heading[0] ? $heading.html() : ew.language.phrase(value),\r\n                    body: $alert.html(),\r\n                    autohide: (value == \"success\") ? ew.autoHideSuccessMessage : false, // Autohide for success message\r\n                    delay: (value == \"success\") ? ew.autoHideSuccessMessageDelay: 500\r\n                });\r\n                if (w > 0)\r\n                    $toast.css(\"max-width\", w); // Override bootstrap .toast max-width\r\n                return;\r\n            }\r\n        });\r\n    }\r\n    if ($.isString(arg)) {\r\n        return swal.fire({\r\n            ...ew.sweetAlertSettings,\r\n            html: arg\r\n        });\r\n    }\r\n}\r\n\r\n// Random number\r\nexport function random() {\r\n    return Math.floor(Math.random() * 100001) + 100000;\r\n}\r\n\r\n// File upload\r\nexport function upload(input) {\r\n    var $input = $(input);\r\n    if ($input.data(\"blueimpFileupload\"))\r\n        return;\r\n    var id = $input.attr(\"name\"), nid = id.replace(/\\$/g, \"\\\\$\"), tbl = $input.data(\"table\"),\r\n        multiple = $input.is(\"[multiple]\"), $p = $input.closest(\".form-group, [id^='el']\"),\r\n        readonly = $input.prop(\"disabled\") || $input.closest(\"form\").find(\"#confirm\").val() == \"confirm\",\r\n        $ft = $p.find(\"#ft_\" + nid), $fn = $p.find(\"#fn_\" + nid), $fa = $p.find(\"#fa_\" + nid), $fs = $p.find(\"#fs_\" + nid),\r\n        $exts = $p.find(\"#fx_\" + nid), $maxsize = $p.find(\"#fm_\" + nid), $maxfilecount = $p.find(\"#fc_\" + nid),\r\n        $label = $p.find(\".custom-file-label\"), label = $label.html();\r\n    var _done = function(e, data) {\r\n        if (data.result.files[0].error)\r\n            return;\r\n        var name = data.result.files[0].name;\r\n        var ar = (multiple) ? ($fn.val() ? $fn.val().split(ew.MULTIPLE_UPLOAD_SEPARATOR) : []) : [];\r\n        ar.push(name);\r\n        $fn.val(ar.join(ew.MULTIPLE_UPLOAD_SEPARATOR));\r\n        $fa.val(\"0\");\r\n        if (!multiple) // Remove other entries if not multiple upload\r\n            $ft.children(\"tr:not(:last-child)\").remove();\r\n    };\r\n    var _deleted = function(e, data) {\r\n        var url = $(e.originalEvent.target).data(\"url\"),\r\n            param = new URLSearchParams(url.split(\"?\")[1]),\r\n            fid = param.get(\"id\"),\r\n            name = param.get(fid);\r\n        if (name) {\r\n            var ar = $fn.val() ? $fn.val().split(ew.MULTIPLE_UPLOAD_SEPARATOR) : [];\r\n            var index = ar.indexOf(name);\r\n            if (index > -1)\r\n                ar.splice(index, 1);\r\n            $fn.val(ar.join(ew.MULTIPLE_UPLOAD_SEPARATOR));\r\n            $fa.val(\"0\");\r\n        }\r\n    };\r\n    var _change = function(e, data) {\r\n        $ft.toggleClass(\"ew-has-rows\", data.files?.length > 0);\r\n        var ar = $fn.val() ? $fn.val().split(ew.MULTIPLE_UPLOAD_SEPARATOR) : [];\r\n        for (var i = 0; i < data.files.length; i++)\r\n            ar.push(data.files[i].name);\r\n        var cnt = parseInt($maxfilecount.val(), 10);\r\n        if ($.isNumber(cnt) && cnt > 0 && ar.length > cnt) {\r\n            _alert(ew.language.phrase(\"UploadErrMsgMaxNumberOfFiles\"));\r\n            return false;\r\n        }\r\n        var l = parseInt($fs.val(), 10);\r\n        if ($.isNumber(l) && l > 0 && ar.join(ew.MULTIPLE_UPLOAD_SEPARATOR).length > l) {\r\n            _alert(ew.language.phrase(\"UploadErrMsgMaxFileLength\"));\r\n            return false;\r\n        }\r\n    };\r\n    var _confirmDelete = function(e) {\r\n        if (!multiple && $fn.val()) {\r\n            if (!confirm(ew.language.phrase(\"UploadOverwrite\"))) {\r\n                e.preventDefault();\r\n                e.stopPropagation();\r\n            }\r\n        }\r\n    };\r\n    var _changed = function(e, data) {\r\n        $ft.toggleClass(\"ew-has-rows\", data.files?.length > 0 || data.result?.files?.length > 0);\r\n        var ar = $fn.val() ? $fn.val().split(ew.MULTIPLE_UPLOAD_SEPARATOR) : [];\r\n        $label.html(ar.join(\", \") || label);\r\n    };\r\n    var _clicked = function() {\r\n        $input.closest(\"span.fileinput-button\").tooltip(\"hide\");\r\n    };\r\n    // var _process = function(e, data) {\r\n    //     $ft.toggleClass(\"ew-has-rows\", data.files?.length > 0);\r\n    // };\r\n    var _downloadTemplate = $.templates(\"#template-download\");\r\n    var _uploadTemplate = $.templates(\"#template-upload\");\r\n    var _completed = function(e, data) { // After download template rendered\r\n        var e = { target: data.context };\r\n        initLightboxes(e);\r\n        initPdfObjects(e);\r\n        ew.updateDropdownPosition();\r\n        data.context.find(\"img\").on(\"load\", ew.updateDropdownPosition);\r\n    }\r\n    var _added = function(e, data) { // After upload template rendered\r\n        $ft.toggleClass(\"ew-has-rows\", data.files?.length > 0);\r\n        data.context.find(\".start\").click(_confirmDelete);\r\n    };\r\n    // Hide input button if readonly\r\n    var form = getForm(input), $form = $(form);\r\n    var readonly = $form.find(\"#confirm\").val() == \"confirm\";\r\n    if (readonly)\r\n        $form.find(\"span.fileinput-button\").hide();\r\n    var cnt = parseInt($maxfilecount.val(), 10);\r\n    var uploadUrl = getApiUrl(ew.API_JQUERY_UPLOAD_ACTION);\r\n    var formData = {\r\n        id: id,\r\n        table: tbl,\r\n        session: ew.SESSION_ID,\r\n        replace: (multiple ? \"0\" : \"1\"),\r\n        exts: $exts.val(),\r\n        maxsize: $maxsize.val(),\r\n        maxfilecount: $maxfilecount.val()\r\n    };\r\n    $input.fileupload({\r\n        url: uploadUrl,\r\n        type: \"POST\",\r\n        multipart: true,\r\n        autoUpload: true, // Comment out to disable auto upload\r\n        loadImageFileTypes: /^image\\/(gif|jpe?g|png)$/i,\r\n        loadVideoFileTypes: /^video\\/mp4$/i,\r\n        loadAudioFileTypes: /^audio\\/(mpeg|mp3)$/i,\r\n        acceptFileTypes: ($exts.val()) ? new RegExp('\\\\.(' + $exts.val().replace(/,/g, '|') + ')$', 'i') : null,\r\n        maxFileSize: parseInt($maxsize.val(), 10),\r\n        maxNumberOfFiles: (cnt > 1) ? cnt : null,\r\n        filesContainer: $ft,\r\n        formData: formData,\r\n        uploadTemplateId: null,\r\n        downloadTemplateId: null,\r\n        uploadTemplate: _uploadTemplate.render.bind(_uploadTemplate),\r\n        downloadTemplate: _downloadTemplate.render.bind(_downloadTemplate),\r\n        previewMaxWidth: ew.UPLOAD_THUMBNAIL_WIDTH,\r\n        previewMaxHeight: ew.UPLOAD_THUMBNAIL_HEIGHT,\r\n        dropZone: $p,\r\n        pasteZone: $p,\r\n        messages: {\r\n            acceptFileTypes: ew.language.phrase(\"UploadErrMsgAcceptFileTypes\"),\r\n            maxFileSize: ew.language.phrase(\"UploadErrMsgMaxFileSize\"),\r\n            maxNumberOfFiles: ew.language.phrase(\"UploadErrMsgMaxNumberOfFiles\"),\r\n            minFileSize: ew.language.phrase(\"UploadErrMsgMinFileSize\")\r\n        },\r\n        readOnly: readonly // Custom\r\n    }).on(\"fileuploaddone\", _done)\r\n        .on(\"fileuploaddestroy\", _deleted)\r\n        .on(\"fileuploadchange\", _change)\r\n        .on(\"fileuploadadded fileuploadfinished fileuploaddestroyed\", _changed)\r\n        //.on(\"fileuploadprocess\", _process)\r\n        .on('fileuploadadded', _added)\r\n        .on('fileuploadcompleted', _completed)\r\n        .click(_clicked);\r\n    if ($fn.val()) {\r\n        $.ajax({\r\n            url: uploadUrl,\r\n            data: { id: id, table: tbl, session: ew.SESSION_ID },\r\n            dataType: \"json\",\r\n            context: this,\r\n            success: function(result) {\r\n                if (result && result[id]) {\r\n                    var done = $input.fileupload(\"option\", \"done\");\r\n                    if (done)\r\n                        done.call(input, $.Event(), { result: { files: result[id] } }); // Use \"files\"\r\n                }\r\n                if (readonly) // Hide delete button if readonly\r\n                    $ft.find(\"td.delete\").hide();\r\n            }\r\n        });\r\n    }\r\n}\r\n\r\n/**\r\n * Convert data to number\r\n *\r\n * @param {*} data - Data being converted\r\n * @param {Object} [config] - Configuration\r\n * @param {string} config.decimalSeparator - Decimal separator\r\n * @param {string} config.thousandsSeparator - Thousands separator\r\n * @returns {(number|null)}\r\n */\r\nexport function parseNumber(data, config) {\r\n    if ($.isString(data)) {\r\n        config = config || {\"thousandsSeparator\": ew.THOUSANDS_SEP, \"decimalSeparator\": ew.DECIMAL_POINT};\r\n        var regexBits = [], regex, separator = config.thousandsSeparator, decimal = config.decimalSeparator;\r\n        if (separator)\r\n            regexBits.push(escapeRegExChars(separator) + \"(?=\\\\d)\");\r\n        regex = new RegExp(\"(?:\" + regexBits.join(\"|\") + \")\", \"g\");\r\n        if (decimal === \".\")\r\n            decimal = null;\r\n        data = data.replace(regex, \"\");\r\n        data = (decimal) ? data.replace(decimal, \".\") : data;\r\n    }\r\n    if ($.isString(data) && data.trim() !== \"\")\r\n        data = +data;\r\n    if (!$.isNumber || !isFinite(data)) // Catch NaN and Infinity\r\n        data = null;\r\n    return data;\r\n}\r\n\r\n/**\r\n * Format a Number to string for display\r\n *\r\n * @param {*} data - Data being converted\r\n * @param {Object} [config] - Configuration\r\n * @param {number} config.decimalPlaces - Number of decimal places to round. Must be a number 0 to 20.\r\n * @param {string} config.decimalSeparator - Decimal separator\r\n * @param {string} config.thousandsSeparator - Thousands separator\r\n * @returns {string} Note: null, undefined, NaN and \"\" returns as \"\".\r\n */\r\nexport function formatNumber(data, config) {\r\n    if ($.isNumber(data)) {\r\n        config = config || {\"thousandsSeparator\": ew.THOUSANDS_SEP, \"decimalSeparator\": ew.DECIMAL_POINT};\r\n        var isNeg = (data < 0), output = data + \"\", decPlaces = config.decimalPlaces,\r\n            decSep = config.decimalSeparator || \".\", thouSep = config.thousandsSeparator,\r\n            decIndex, newOutput, count, i;\r\n        if ($.isNumber(decPlaces) && (decPlaces >= 0) && (decPlaces <= 20)) // Decimal precision\r\n            output = data.toFixed(decPlaces);\r\n        if (decSep !== \".\") // Decimal separator\r\n            output = output.replace(\".\", decSep);\r\n        if (thouSep) { // Add the thousands separator\r\n            decIndex = output.lastIndexOf(decSep); // Find the dot or where it would be\r\n            decIndex = (decIndex > -1) ? decIndex : output.length;\r\n            newOutput = output.substring(decIndex); // Start with the dot and everything to the right\r\n            for (count = 0, i = decIndex; i > 0; i--) { // Working left, every third time add a separator, every time add a digit\r\n                if (count%3 === 0 && i !== decIndex && (!isNeg || i > 1))\r\n                    newOutput = thouSep + newOutput;\r\n                newOutput = output.charAt(i-1) + newOutput;\r\n                count++;\r\n            }\r\n            output = newOutput;\r\n        }\r\n        return output;\r\n    } else { // Not a Number, return as string\r\n        return ($.isValue(data) && data.toString) ? data.toString() : \"\";\r\n    }\r\n}\r\n\r\n/**\r\n * Convert data to Moment object (see http://momentjs.com/docs/)\r\n *\r\n * @param {*} data - Data being converted\r\n * @param {number} format - Date format matching server side FormatDateTime()\r\n * @returns {Moment}\r\n */\r\nexport function parseDate(data, format) {\r\n    var args = $.makeArray(arguments);\r\n    if ($.isNumber(format) && format >=0 && format <= 17) {\r\n        var f, def = ew.DATE_FORMAT.toUpperCase(), sep = ew.DATE_SEPARATOR, timesep = ew.TIME_SEPARATOR;\r\n        switch (format) {\r\n            case 0: case 1: case 2: case 8: f = def + \" HH\" + timesep + \"mm\" + timesep + \"ss\"; break; // ew.DATE_FORMAT + \" %H:%M:%S\"\r\n            case 3: f = \"hh:mm:ss A\"; break; // \"%I:%M:%S %p\"\r\n            case 4: f = \"HH:mm:ss\"; break; // \"%H:%M:%S\"\r\n            case 5: f = \"YYYY\" + sep + \"MM\" + sep + \"DD\"; break; // \"%Y\" + sep + \"%m\" + sep + \"%d\"\r\n            case 6: f = \"MM\" + sep + \"DD\" + sep + \"YYYY\"; break; // \"%m\" + sep + \"%d\" + sep + \"%Y\"\r\n            case 7: f = \"DD\" + sep + \"MM\" + sep + \"YYYY\"; break; // \"%d\" + sep + \"%m\" + sep + \"%Y\"\r\n            case 9: f = \"YYYY\" + sep + \"MM\" + sep + \"DD HH\" + timesep + \"mm\" + timesep + \"ss\"; break; // \"%Y\" + sep + \"%m\" + sep + \"%d %H:%M:%S\"\r\n            case 10: f = \"MM\" + sep + \"DD\" + sep + \"YYYY HH\" + timesep + \"mm\" + timesep + \"ss\"; break; // \"%m\" + sep + \"%d\" + sep + \"%Y %H:%M:%S\"\r\n            case 11: f = \"DD\" + sep + \"MM\" + sep + \"YYYY HH\" + timesep + \"mm\" + timesep + \"ss\"; break; // \"%d\" + sep + \"%m\" + sep + \"%Y %H:%M:%S\"\r\n            case 12: f = \"YY\" + sep + \"MM\" + sep + \"DD\"; break; // \"%y\" + sep + \"%m\" + sep + \"%d\"\r\n            case 13: f = \"MM\" + sep + \"DD\" + sep + \"YY\"; break; // \"%m\" + sep + \"%d\" + sep + \"%y\"\r\n            case 14: f = \"DD\" + sep + \"MM\" + sep + \"YY\"; break; // \"%d\" + sep + \"%m\" + sep + \"%y\"\r\n            case 15: f = \"YY\" + sep + \"MM\" + sep + \"DD HH\" + timesep + \"mm\" + timesep + \"ss\"; break; // \"%y\" + sep + \"%m\" + sep + \"%d %H:%M:%S\"\r\n            case 16: f = \"MM\" + sep + \"DD\" + sep + \"YY HH\" + timesep + \"mm\" + timesep + \"ss\"; break; // \"%m\" + sep + \"%d\" + sep + \"%y %H:%M:%S\"\r\n            case 17: f = \"DD\" + sep + \"MM\" + sep + \"YY HH\" + timesep + \"mm\" + timesep + \"ss\"; break; // \"%d\" + sep + \"%m\" + sep + \"%y %H:%M:%S\"\r\n        }\r\n        args[1] = [f, \"YYYY-MM-DD HH\" + timesep + \"mm\" + timesep + \"ss\"];\r\n    }\r\n    return moment.apply(this, args);\r\n}\r\n\r\n/**\r\n * Format date time\r\n *\r\n * @param {*} data - Date being formatted\r\n * @param {string} format - Date format (see http://momentjs.com/docs/#/displaying/format/)\r\n * @returns {string}\r\n */\r\nexport function formatDate(data, format) {\r\n    return moment(data).format(format || ew.DATE_FORMAT.toUpperCase());\r\n}\r\n\r\n/**\r\n * Init page\r\n *\r\n * @param {Event|undefined} e - Event\r\n */\r\nexport function initPage(e) {\r\n    var el = (e && e.target) ? e.target : document,\r\n        $el = $(el),\r\n        $tables = $el.find(\"table.ew-table:not(.ew-export-table)\");\r\n    Array.prototype.forEach.call(el.querySelectorAll(\".ew-grid-upper-panel, .ew-grid-lower-panel\"), ew.initGridPanel); // Init grid panels\r\n    ew.renderJsTemplates(e);\r\n    lazyLoad(e);\r\n    initForms(e);\r\n    initTooltips(e);\r\n    initPasswordOptions(e);\r\n    initIcons(e);\r\n    initLightboxes(e);\r\n    initPdfObjects(e);\r\n    $el.find(\"[data-widget='treeview']\").each(function() {\r\n        adminlte.Treeview._jQueryInterface.call($(this), \"init\");\r\n    });\r\n    $tables.each(setupTable); // Init tables\r\n    $el.find(\".ew-btn-dropdown\").on(\"shown.bs.dropdown\", function() {\r\n        var $this = $(this).removeClass(\"dropup\"),\r\n            $window = $(window),\r\n            $menu = $this.find(\"> .dropdown-menu\");\r\n        $this.toggleClass(\"dropup\", $menu.offset().top + $menu.height() > $window.scrollTop() + $window.height());\r\n    });\r\n    $el.find(\"input[name=pageno]\").on(\"keydown\", function(e) {\r\n        if (e.key == \"Enter\") {\r\n            currentUrl.searchParams.set(this.name, parseInt(this.value));\r\n            window.location = sanitizeUrl(currentUrl.toString());\r\n            return false;\r\n        }\r\n    });\r\n    if (!ew.IS_SCREEN_SM_MIN) {\r\n        $el.find(\".\" + ew.RESPONSIVE_TABLE_CLASS + \" [data-toggle='dropdown']\").parent().on(\"shown.bs.dropdown\", function() {\r\n            var $this = $(this),\r\n                $menu = $this.find(\".dropdown-menu\"),\r\n                div = $this.closest(\".\" + ew.RESPONSIVE_TABLE_CLASS)[0];\r\n            if (div.scrollHeight - div.clientHeight) {\r\n                var d = $menu.offset().top + $menu.outerHeight() - $(div).offset().top - div.clientHeight;\r\n                if (d > 0)\r\n                    $menu.css(ew.CSS_FLIP ? \"right\" : \"left\", \"100%\").css(\"top\", parseFloat($menu.css(\"top\")) - d);\r\n            }\r\n        });\r\n    }\r\n    initExportLinks(e);\r\n    initMultiSelectCheckboxes(e);\r\n\r\n    // Report\r\n    var $rpt = $el.find(\".ew-report\");\r\n    if ($rpt[0]) {\r\n        $rpt.find(\".card\").on(\"collapsed.lte.widget\", function() { // Fix min-height when .lte.widget is collapsed\r\n            var $card = $(this), $div = $card.closest(\"[class^='col-']\"), mh = $div.css(\"min-height\");\r\n            if (mh)\r\n                $div.data(\"min-height\", mh);\r\n            $div.css(\"min-height\", 0);\r\n        }).on(\"expanded.lte.widget\", function() { // Fix min-height when .lte.widget is expanded\r\n            var $card = $(this), $div = $card.closest(\"[class^='col-']\"), mh = $div.css(\"min-height\");\r\n            if (mh)\r\n                $div.css(\"min-height\", mh); // Restore min-height\r\n        });\r\n        // Group expand/collapse button\r\n        $rpt.find(\"span.ew-group-toggle\").on(\"click\", function() {\r\n            ew.toggleGroup(this);\r\n        });\r\n    }\r\n\r\n    // Show message\r\n    if (typeof ew.USE_JAVASCRIPT_MESSAGE != \"undefined\" && ew.USE_JAVASCRIPT_MESSAGE)\r\n        showMessage(e);\r\n}\r\n\r\n// Redirect by HTTP GET or POST\r\nexport function redirect(url, f, method) {\r\n    var newUrl = new URL(url),\r\n        params = newUrl.searchParams;\r\n    params.set(ew.TOKEN_NAME_KEY, ew.TOKEN_NAME); // PHP\r\n    params.set(ew.ANTIFORGERY_TOKEN_KEY, ew.ANTIFORGERY_TOKEN); // PHP\r\n    if (sameText(method, \"post\")) { // POST\r\n        var $form = (f) ? $(f) : $(\"<form></form>\").appendTo(\"body\");\r\n        $form.attr({ action: ar[0], method: \"post\" });\r\n        params.forEach(function(value, key) {\r\n            $('<input type=\"hidden\">').attr({ name: key, value: ew.sanitize(value) }).appendTo($form);\r\n        });\r\n        $form.trigger(\"submit\");\r\n    } else { // GET\r\n        window.location = sanitizeUrl(newUrl.toString());\r\n    }\r\n}\r\n\r\n// Show/Hide password\r\nexport function togglePassword(e) {\r\n    var $btn = $(e.currentTarget), $input = $btn.closest(\".input-group\").find(\"input\"), $i = $btn.find(\"i\");\r\n    if ($input.attr(\"type\") == \"text\") {\r\n        $input.attr(\"type\", \"password\");\r\n        $i.toggleClass(\"fa-eye-slash fa-eye\");\r\n    } else if($input.attr(\"type\") == \"password\"){\r\n        $input.attr(\"type\", \"text\");\r\n        $i.toggleClass(\"fa-eye-slash fa-eye\");\r\n    }\r\n}\r\n\r\n// Export with charts\r\nexport function exportWithCharts(e, url, exportId, f) {\r\n    var el = e.target,\r\n        exportUrl = new URL(window.location.href),\r\n        ar = url.split(\"?\"),\r\n        $el = $(el), method = (f) ? \"post\" : \"get\";\r\n\r\n    exportId += \"_\" + Date.now();\r\n    exportUrl.pathname = ar[0];\r\n    exportUrl.search = ar[1];\r\n    exportUrl.searchParams.set(\"exportid\", exportId);\r\n\r\n    if ($el.is(\".dropdown-menu a\"))\r\n        $el = $el.closest(\".btn-group\");\r\n\r\n    var _export = function() {\r\n        var params = exportUrl.searchParams,\r\n            custom = params.get(\"custom\") == \"1\";\r\n        if (f && !custom) { // Not custom\r\n            var data = $(f).serialize(); // Add token\r\n            $.post(exportUrl, data, function(result) {\r\n                showMessage(result);\r\n            });\r\n        } else { // Custom\r\n            var exp = params.get(\"export\");\r\n            if (custom && [\"word\", \"excel\", \"pdf\", \"email\"].includes(exp)) {\r\n                if (exp == \"email\") {\r\n                    params.delete(\"export\"); // Remove duplicate export=email (exists in form)\r\n                    exportUrl.search = params.toString() + \"&\" + $(f).serialize();\r\n                }\r\n                $(\"iframe.ew-export\").remove();\r\n                $(\"<iframe></iframe>\").addClass(\"ew-export d-none\").attr(\"src\", exportUrl.toString()).appendTo($body.css(\"cursor\", \"wait\"));\r\n                setTimeout(function() { $body.css(\"cursor\", \"default\"); }, 5000);\r\n            } else if (exp == \"print\") {\r\n                redirect(exportUrl.toString(), f, method);\r\n            } else {\r\n                fileDownload(exportUrl.toString(), null);\r\n            }\r\n        }\r\n        return false;\r\n    };\r\n\r\n    var keys = Object.keys(window.exportCharts);\r\n    if (keys.length == 0) // No charts, just submit the form\r\n        return _export();\r\n\r\n    // Success callback\r\n    var success = function(result) {\r\n        if ($.isString(result))\r\n            result = parseJson(result);\r\n        if (result.success) {\r\n            _export();\r\n        } else {\r\n            ew.alert(result.error);\r\n        }\r\n    };\r\n\r\n    // Failure callback\r\n    var fail = function(xhr, status, error) {\r\n        ew.alert(error + \": \" + xhr.responseText); // Show detailed export error message\r\n    };\r\n\r\n    // Export charts\r\n    $body.css(\"cursor\", \"wait\");\r\n    var charts = [];\r\n    for (var i = 0; i < keys.length; i++) {\r\n        var id = keys[i], o = window.exportCharts[id],\r\n            params = \"exportfilename=\" + exportId + \"_\" + id + \".png|exportformat=png|exportaction=download|exportparameters=undefined\";\r\n        if (o && o.toBase64Image) // Chart.js chart\r\n            charts.push({ \"chart_engine\": \"Chart.js\", \"stream_type\": \"base64\", \"stream\": o.toBase64Image(), \"parameters\": params });\r\n    }\r\n    $.ajax({\r\n        \"url\": getApiUrl(ew.API_EXPORT_CHART_ACTION),\r\n        \"data\": { \"charts\": JSON.stringify(charts) },\r\n        \"cache\": false,\r\n        \"type\": \"POST\"\r\n    }).done(success).fail(fail).always(function() {\r\n        $body.css(\"cursor\", \"default\");\r\n    });\r\n    return false;\r\n}\r\n\r\n// Layout\r\nvar _fixLayoutHeightTimer;\r\n\r\n// Fix layout height\r\nexport function fixLayoutHeight() {\r\n    if (_fixLayoutHeightTimer)\r\n        _fixLayoutHeightTimer.cancel(); // Clear timer\r\n    _fixLayoutHeightTimer = $.later(50, null, function () {\r\n        var layout = $body.data(\"lte.layout\");\r\n        if (layout)\r\n            layout.fixLayoutHeight();\r\n    });\r\n}\r\n\r\n// Add user event handlers\r\nexport function addEventHandlers(tblVar) {\r\n    let fields = ew.events[tblVar];\r\n    if (fields) {\r\n        for (var [fldVar, events] of Object.entries(fields))\r\n            $('[data-table=' + tblVar + '][data-field=' + fldVar + ']').on(events);\r\n    }\r\n}","import $ from 'jquery';\r\n\r\n/**\r\n * Select2 decorator for results adapter\r\n */\r\nexport default function(Utils) {\r\n\r\n    class Select2CustomOption {\r\n\r\n        render(decorated) {\r\n            var $results = $(\r\n              '<div class=\"select2-results__options ' + this.options.get('containerClass') + '\" role=\"listbox\"></div>'\r\n            ); //***\r\n\r\n            if (this.options.get('multiple')) {\r\n              $results.attr('aria-multiselectable', 'true');\r\n            }\r\n\r\n            this.$results = $results;\r\n\r\n            return $results;\r\n        };\r\n\r\n        displayMessage(decorated, params) {\r\n            var escapeMarkup = this.options.get('escapeMarkup');\r\n\r\n            this.clear();\r\n            this.hideLoading();\r\n\r\n            var $message = $(\r\n              '<div role=\"alert\" aria-live=\"assertive\"' +\r\n              ' class=\"select2-results__option\"></div>'\r\n            ); //***\r\n\r\n            if (params.message.includes(\"<\") && params.message.includes(\">\")) { // HTML //***\r\n              $message.append(params.message);\r\n            } else {\r\n              var message = this.options.get('translations').get(params.message);\r\n              $message.append(\r\n                escapeMarkup(\r\n                  message(params.args)\r\n                )\r\n              );\r\n            }\r\n\r\n            $message[0].className += ' select2-results__message';\r\n\r\n            this.$results.append($message);\r\n        };\r\n\r\n        append(decorated, data) {\r\n            this.hideLoading();\r\n\r\n            var $options = [];\r\n\r\n            if (data.results == null || data.results.length === 0) {\r\n              if (this.$results.children().length === 0) {\r\n                if (this.$element.data(\"updating\")) {\r\n                  this.trigger('results:message', {\r\n                    message: '<div class=\"spinner-border spinner-border-sm text-primary ew-select-spinner\" role=\"status\"><span class=\"sr-only\">' + ew.language.phrase('Loading') + '</span></div> ' + ew.language.phrase('Loading')\r\n                  });\r\n                  this.$element.one(\"updatedone\", () => this.$element.select2(\"close\").select2(\"open\"));\r\n                } else {\r\n                  this.trigger('results:message', {\r\n                    message: 'noResults'\r\n                  });\r\n                }\r\n              }\r\n\r\n              return;\r\n            }\r\n\r\n            data.results = this.sort(data.results);\r\n\r\n            //***\r\n            var cols = this.options.get('columns'),\r\n                len = data.results.length,\r\n                $row = this.$results.find(\".\" + this.options.get('rowClass')).last();\r\n\r\n            for (var d = 0; d < data.results.length; d++) {\r\n                var item = data.results[d];\r\n\r\n                var $option = this.option(item);\r\n\r\n                if (!$row.length || $row.children().length == cols) { // Add new row\r\n                    $row = $('<div class=\"' + this.options.get('rowClass') + '\"></div>');\r\n                    this.$results.append($row);\r\n                }\r\n\r\n                $row.append($option);\r\n\r\n                if (d == len - 1) { // Last\r\n                    var cnt = cols - $row.children().length;\r\n                    for (var i = 0; i < cnt ; i++)\r\n                        $row.append('<div class=\"' + this.options.get('colClass') + '\"></div>');\r\n                }\r\n            }\r\n\r\n        };\r\n\r\n        option(decorated, data) {\r\n            // var option = document.createElement('li');\r\n            var option = document.createElement('div'); //***\r\n            option.className = 'select2-results__option ' + this.options.get('cellClass'); //***\r\n\r\n            var attrs = {\r\n              'role': 'option',\r\n              'aria-selected': 'false'\r\n            };\r\n\r\n            var matches = window.Element.prototype.matches ||\r\n              window.Element.prototype.msMatchesSelector ||\r\n              window.Element.prototype.webkitMatchesSelector;\r\n\r\n            if ((data.element != null && matches.call(data.element, ':disabled')) ||\r\n                (data.element == null && data.disabled)) {\r\n              delete attrs['aria-selected'];\r\n              attrs['aria-disabled'] = 'true';\r\n            }\r\n\r\n            if (data.id == null) {\r\n              delete attrs['aria-selected'];\r\n            }\r\n\r\n            if (data._resultId != null) {\r\n              option.id = data._resultId;\r\n            }\r\n\r\n            if (data.title) {\r\n              option.title = data.title;\r\n            }\r\n\r\n            // if (data.children) { //***\r\n            //   attrs.role = 'group';\r\n            //   attrs['aria-label'] = data.text;\r\n            //   delete attrs['aria-selected'];\r\n            // }\r\n\r\n            for (var attr in attrs) {\r\n              var val = attrs[attr];\r\n\r\n              option.setAttribute(attr, val);\r\n            }\r\n\r\n            // if (data.children) { //***\r\n            //   var $option = $(option);\r\n\r\n            //   var label = document.createElement('strong');\r\n            //   label.className = 'select2-results__group';\r\n\r\n            //   var $label = $(label);\r\n            //   this.template(data, label);\r\n\r\n            //   var $children = [];\r\n\r\n            //   for (var c = 0; c < data.children.length; c++) {\r\n            //     var child = data.children[c];\r\n\r\n            //     var $child = this.option(child);\r\n\r\n            //     $children.push($child);\r\n            //   }\r\n\r\n            //   var $childrenContainer = $('<ul></ul>', {\r\n            //     'class': 'select2-results__options select2-results__options--nested'\r\n            //   });\r\n\r\n            //   $childrenContainer.append($children);\r\n\r\n            //   $option.append(label);\r\n            //   $option.append($childrenContainer);\r\n            // } else {\r\n              this.template(data, option);\r\n            // }\r\n\r\n            Utils.StoreData(option, 'data', data);\r\n\r\n            return option;\r\n        };\r\n\r\n    }\r\n\r\n    return Select2CustomOption;\r\n}","import $ from 'jquery';\r\nimport MultiPage from \"./multipage\";\r\nimport * as Validators from './Validators';\r\nimport Form from \"./Form\";\r\nimport * as functions from './functions';\r\n\r\new.IS_SCREEN_SM_MIN = window.matchMedia(\"(min-width: 768px)\").matches; // Should matches $screen-sm-min\r\new.MOBILE_DETECT = new MobileDetect(window.navigator.userAgent);\r\new.IS_MOBILE = !!ew.MOBILE_DETECT.mobile();\r\new.IS_IE = ew.MOBILE_DETECT.version(\"MSIE\") > 0;\r\n\r\n// Charts\r\nwindow.exportCharts = {}; // Per window\r\nwindow.drillDownCharts = {}; // Per window\r\n\r\n// Init spinner\r\new.addSpinner();\r\n\r\n// Extend\r\nObject.assign(ew, { MultiPage, Form, Validators }, functions);\r\n\r\nvar $document = $(document);\r\n\r\n// Init document\r\nloadjs.ready(\"load\", function () {\r\n\t$.views.settings.debugMode(ew.DEBUG);\r\n\tew.setSessionTimer();\r\n\tew.initPage();\r\n\t$(\"#ew-modal-dialog\").on(\"load.ew\", ew.initPage);\r\n\t$(\"#ew-add-opt-dialog\").on(\"load.ew\", ew.initPage);\r\n\tvar hash = ew.currentUrl.searchParams.get(\"hash\");\r\n\tif (hash)\r\n\t\t$(\"html, body\").animate({ scrollTop: $(\"#\" + hash).offset().top }, 800);\r\n\tew.removeSpinner();\r\n\t$document.trigger(\"load\");\r\n});\r\n\r\n// Default \"addoption\" event (fired before adding new option to selection list)\r\n$document.on(\"addoption\", function (e, args) {\r\n\tvar row = args.data; // New row to be validated\r\n\tvar arp = args.parents; // Parent field values\r\n\tfor (var i = 0, cnt = arp.length; i < cnt; i++) { // Iterate parent values\r\n\t\tvar p = arp[i];\r\n\t\tif (!p.length) // Empty parent\r\n\t\t\t//continue; // Allow\r\n\t\t\treturn args.valid = false; // Disallow\r\n\t\tvar val = row[\"ff\" + ((i > 0) ? i + 1 : \"\")]; // Filter fields start from the 6th field\r\n\t\tif (!$.isUndefined(val) && !p.includes(String(val))) // Filter field value not in parent field values\r\n\t\t\treturn args.valid = false; // Returns false if invalid\r\n\t}\r\n});\r\n\r\n// Fix z-index of multiple modals\r\n$document.on(\"show.bs.modal\", \".modal\", function () {\r\n\tvar zIndex = 1050 + $(\".modal:visible\").length;\r\n\t$(this).css(\"z-index\", zIndex);\r\n\tsetTimeout(function () {\r\n\t\t$(\".modal-backdrop\").not(\".modal-stack\").css(\"z-index\", zIndex - 1).addClass(\"modal-stack\");\r\n\t}, 0);\r\n});\r\n\r\n// Fix scrolling of multiple modals\r\n$document.on(\"hidden.bs.modal\", \".modal\", function () {\r\n\t$(\".modal:visible\").length && $(\"body\").addClass(\"modal-open\");\r\n});","import $ from \"jquery\";\r\n\r\nexport default function MultiPage(formid) {\r\n\tvar self = this;\r\n\tthis.$form = null;\r\n\tthis.formID = formid;\r\n\tthis.pageIndex = 1;\r\n\tthis.maxPageIndex = 0;\r\n\tthis.minPageIndex = 0;\r\n\tthis.pageIndexes = [];\r\n\tthis.$pages = null;\r\n\tthis.$collapses = null;\r\n\tthis.isTab = false; // Is tabs\r\n\tthis.isCollapse = false; // Is collapses (accordion)\r\n\tthis.lastPageSubmit = false; // Enable submit button for the last page only\r\n\tthis.hideDisabledButton = false; // Hide disabled submit button\r\n\tthis.hideInactivePages = false; // Hide inactive pages\r\n\tthis.lockTabs = false; // Set inactive tabs as disabled\r\n\tthis.hideTabs = false; // Hide all tabs\r\n\tthis.showPagerTop = false; // Show pager at top\r\n\tthis.showPagerBottom = false; // Show pager at bottom\r\n\tthis.pagerTemplate = '<nav><ul class=\"pagination\"><li class=\"page-item previous ew-prev\"><a href=\"#\" class=\"page-link\"><span class=\"icon-prev\"></span> {Prev}</a></li><li class=\"page-item next ew-next\"><a href=\"#\" class=\"page-link\">{Next} <span class=\"icon-next\"></span></a></li></ul></nav>'; // Pager template\r\n\r\n\t// \"show\" handler (for disabled tabs)\r\n\tvar _show = function(e) {\r\n\t\te.preventDefault();\r\n\t};\r\n\r\n\t// Set properties\r\n\tvar _properties = [\"lastPageSubmit\", \"hideDisabledButton\", \"hideInactivePages\", \"lockTabs\",\r\n\t\t\"hideTabs\", \"showPagerTop\", \"showPagerBottom\", \"pagerTemplate\"];\r\n\r\n\tthis.set = function() {\r\n\t\tif (arguments.length == 1 && $.isObject(arguments[0])) {\r\n\t\t\tvar obj = arguments[0];\r\n\t\t\tfor (var i in obj) {\r\n\t\t\t\tvar p = i[0].toLowerCase() + i.substr(1); // Camel case\r\n\t\t\t\tif (_properties.includes(p))\r\n\t\t\t\t\tthis[p] = obj[i];\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// DOM loaded\r\n\tthis.init = function() {\r\n\t\tvar tpl = this.pagerTemplate.replace(/\\{prev\\}/i, ew.language.phrase(\"Prev\")).replace(/\\{next\\}/i, ew.language.phrase(\"Next\"));\r\n\t\tif (this.isTab) {\r\n\t\t\tif (this.showPagerTop)\r\n\t\t\t\tthis.$pages.closest(\".tabbable, .ew-nav-tabs\").before(tpl);\r\n\t\t\tif (this.showPagerBottom)\r\n\t\t\t\tthis.$pages.closest(\".tabbable, .ew-nav-tabs\").after(tpl);\r\n\t\t\tthis.$form.find(\".ew-prev\").click(function(e) {\r\n\t\t\t\tself.$pages.off(\"show.bs.tab\", _show).filter(\".active\").parent()\r\n\t\t\t\t\t.prev(\":has([data-toggle=tab]:not(.ew-hidden):not(.ew-disabled))\")\r\n\t\t\t\t\t.find(\"[data-toggle=tab]\").toggleClass(\"disabled d-none\", false).click();\r\n\t\t\t\treturn false;\r\n\t\t\t});\r\n\t\t\tthis.$form.find(\".ew-next\").click(function(e) {\r\n\t\t\t\tself.$pages.off(\"show.bs.tab\", _show).filter(\".active\").parent()\r\n\t\t\t\t\t.next(\":has([data-toggle=tab]:not(.ew-hidden):not(.ew-disabled))\")\r\n\t\t\t\t\t.find(\"[data-toggle=tab]\").toggleClass(\"disabled d-none\", false).click();\r\n\t\t\t\treturn false;\r\n\t\t\t});\r\n\t\t\tif (this.hideTabs)\r\n\t\t\t\tthis.$form.find(\".ew-multi-page > .tabbable > .nav-tabs, .ew-multi-page > .ew-nav-tabs > .nav-tabs\").hide();\r\n\t\t} else if (this.isCollapse) {\r\n\t\t\tif (this.showPagerTop)\r\n\t\t\t\tthis.$collapses.closest(\".ew-accordion\").before(tpl);\r\n\t\t\tif (this.showPagerBottom)\r\n\t\t\t\tthis.$collapses.closest(\".ew-accordion\").after(tpl);\r\n\t\t\tthis.$form.find(\".ew-prev\").click(function(e) {\r\n\t\t\t\tself.$pages.closest(\".card\").filter(\":has(.collapse.show)\")\r\n\t\t\t\t\t.prev(\":has([data-toggle=collapse]:not(.ew-hidden):not(.ew-disabled))\")\r\n\t\t\t\t\t.toggleClass(\"disabled d-none\", false)\r\n\t\t\t\t\t.find(\"[data-toggle=collapse]\").click();\r\n\t\t\t\treturn false;\r\n\t\t\t});\r\n\t\t\tthis.$form.find(\".ew-next\").click(function(e) {\r\n\t\t\t\tself.$pages.closest(\".card\").filter(\":has(.collapse.show)\")\r\n\t\t\t\t\t.next(\":has([data-toggle=collapse]:not(.ew-hidden):not(.ew-disabled))\")\r\n\t\t\t\t\t.toggleClass(\"disabled d-none\", false)\r\n\t\t\t\t\t.find(\"[data-toggle=collapse]\").click();\r\n\t\t\t\treturn false;\r\n\t\t\t});\r\n\t\t}\r\n\t\tthis.pageShow();\r\n\t}\r\n\r\n\t// Page show\r\n\tthis.pageShow = function() {\r\n\t\tif (this.isTab) {\r\n\t\t\tif (this.lockTabs)\r\n\t\t\t\tthis.$pages.on(\"show.bs.tab\", _show);\r\n\t\t\tthis.$pages.each(function() {\r\n\t\t\t\tvar $this = $(this);\r\n\t\t\t\tif (self.hideInactivePages)\r\n\t\t\t\t\t$this.toggleClass(\"d-none\", !$this.hasClass(\"active\"));\r\n\t\t\t\tif (self.lockTabs)\r\n\t\t\t\t\t$this.toggleClass(\"disabled\", !$this.hasClass(\"active\"));\r\n\t\t\t});\r\n\t\t} else if (this.isCollapse) {\r\n\t\t\tthis.$pages.closest(\".card\").each(function() {\r\n\t\t\t\tvar $this = $(this);\r\n\t\t\t\tif (self.hideInactivePages)\r\n\t\t\t\t\t$this.toggleClass(\"d-none\", !$this.find(\".collapse.show\")[0]);\r\n\t\t\t});\r\n\t\t}\r\n\t\tvar disabled = this.lastPageSubmit && this.pageIndex != this.maxPageIndex;\r\n\t\tvar $btn = this.$form.closest(\".content, .modal-content\").find(\"#btn-action, button.ew-submit\").prop(\"disabled\", disabled).toggle(!this.hideDisabledButton || !disabled);\r\n\t\t$(\".ew-captcha\").toggle($btn.is(\":visible:not(:disabled)\")); // Re-captcha uses class \"disabled\", not \"disabled\" property.\r\n\t\tdisabled = this.pageIndex <= this.minPageIndex;\r\n\t\tthis.$form.find(\".ew-prev\").toggleClass(\"disabled\", disabled);\r\n\t\tdisabled = this.pageIndex >= this.maxPageIndex;\r\n\t\tthis.$form.find(\".ew-next\").toggleClass(\"disabled\", disabled);\r\n\t}\r\n\r\n\t// Go to page by index\r\n\tthis.gotoPage = function(i) {\r\n\t\tif (i <= 0 || i < this.minPageIndex || i > this.maxPageIndex)\r\n\t\t\treturn;\r\n\t\tif (this.pageIndex != i) {\r\n\t\t\tvar $page = this.$pages.eq(i - 1);\r\n\t\t\tif (this.isTab) {\r\n\t\t\t\tif ($page.is(\":not(.d-none):not(.disabled)\"))\r\n\t\t\t\t\t$page.click();\r\n\t\t\t\telse\r\n\t\t\t\t\t$page.parent().next(\":has([data-toggle=tab]):not(.d-none):not(.disabled)\")\r\n\t\t\t\t\t\t.find(\"[data-toggle=tab]\").toggleClass(\"disabled\", false).click();\r\n\t\t\t} else if (this.isCollapse) {\r\n\t\t\t\tvar $p = $page.closest(\".card\");\r\n\t\t\t\tif ($p.is(\":not(.d-none)\"))\r\n\t\t\t\t\t$page.click();\r\n\t\t\t\telse\r\n\t\t\t\t\t$p.next(\":has([data-toggle=collapse]):not(.d-none)\").find(\"[data-toggle=collapse]\").click();\r\n\t\t\t}\r\n\t\t\tthis.pageIndex = i;\r\n\t\t}\r\n\t}\r\n\r\n\tthis.gotoPageByIndex = this.gotoPage;\r\n\r\n\t// Go to page by element\r\n\tthis.gotoPageByElement = function(el) {\r\n\t\tthis.gotoPage(parseInt($(el).data(\"page\"), 10) || -1);\r\n\t}\r\n\r\n\t// Go to page by element's id or name or data-field attribute\r\n\tthis.gotoPageByElementId = function(id) {\r\n\t\tvar $el = this.$form.find(\"[data-page]\").filter(\"[id='\" + id + \"'],[name='\" + id + \"'],[data-field='\" + id + \"']\");\r\n\t\tthis.gotoPageByElement($el);\r\n\t}\r\n\r\n\t// Toggle page\r\n\tthis.togglePage = function(i, show) {\r\n\t\tif (this.isTab) {\r\n\t\t\tthis.$pages.eq(i - 1).toggleClass(\"d-none\", !show);\r\n\t\t} else if (this.isCollapse) {\r\n\t\t\tthis.$pages.eq(i - 1).closest(\".card\").toggle(\"d-none\", !show);\r\n\t\t}\r\n\t}\r\n\r\n\t// Render\r\n\tthis.render = function() {\r\n\t\tthis.$form = $(\"#\" + formid);\r\n\t\tthis.pageIndexes = this.$form.find(\"[data-page]\").map(function() {\r\n\t\t\tvar index = parseInt($(this).data(\"page\"), 10);\r\n\t\t\treturn (index > 0) ? index : null;\r\n\t\t}).get();\r\n\t\tthis.pageIndexes.sort(function(a, b) {\r\n\t\t\treturn a - b;\r\n\t\t});\r\n\t\tthis.minPageIndex = this.pageIndexes[0];\r\n\t\tthis.maxPageIndex = this.pageIndexes[this.pageIndexes.length - 1];\r\n\t\tvar $tabs = this.$form.find(\"[data-toggle=tab]\");\r\n\t\tif ($tabs[0]) {\r\n\t\t\tthis.$pages = $tabs;\r\n\t\t\tthis.isTab = true;\r\n\t\t\t$tabs.on(\"shown.bs.tab\", function(e) {\r\n\t\t\t\tself.pageIndex = $tabs.index(e.target) + 1;\r\n\t\t\t\tself.pageShow();\r\n\t\t\t\t$($(this).attr(\"href\")).find(\".ew-google-map\").each(function() {\r\n\t\t\t\t\tvar m = ew.googleMaps[this.id];\r\n\t\t\t\t\tif (m && m[\"map\"]) {\r\n\t\t\t\t\t\tgoogle.maps.event.trigger(m[\"map\"], \"resize\");\r\n\t\t\t\t\t\tm[\"map\"].setCenter(m[\"latlng\"]);\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t\tthis.pageIndex = $tabs.index($tabs.parent(\".active\")) + 1;\r\n\t\t} else {\r\n\t\t\tthis.$collapses = this.$form.find(\"[data-toggle=collapse]\");\r\n\t\t\tif (this.$collapses[0]) {\r\n\t\t\t\tthis.$pages = this.$collapses;\r\n\t\t\t\tthis.isCollapse = true;\r\n\t\t\t\tvar $bodies = this.$collapses.closest(\".card-header\").next();\r\n\t\t\t\t$bodies.on(\"shown.bs.collapse\", function(e) {\r\n\t\t\t\t\tself.pageIndex = $bodies.index(e.target) + 1;\r\n\t\t\t\t\tself.pageShow();\r\n\t\t\t\t\t$(this).find(\".ew-google-map\").each(function() {\r\n\t\t\t\t\t\tvar m = ew.googleMaps[this.id];\r\n\t\t\t\t\t\tif (m && m[\"map\"]) {\r\n\t\t\t\t\t\t\tgoogle.maps.event.trigger(m[\"map\"], \"resize\");\r\n\t\t\t\t\t\t\tm[\"map\"].setCenter(m[\"latlng\"]);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t});\r\n\t\t\t\tthis.pageIndex = $bodies.index($bodies.hasClass(\"show\")) + 1;\r\n\t\t\t}\r\n\t\t}\r\n\t\t$(function() {\r\n\t\t\tself.init();\r\n\t\t});\r\n\t}\r\n}","import $ from 'jquery';\r\n\r\n// Extend jQuery\r\n$.extend({\r\n\tisBoolean: function(o) {\r\n\t\treturn typeof o === 'boolean';\r\n\t},\r\n\tisNull: function(o) {\r\n\t\treturn o === null;\r\n\t},\r\n\tisNumber: function(o) {\r\n\t\treturn typeof o === 'number' && isFinite(o);\r\n\t},\r\n\tisObject: function(o) {\r\n\t\treturn (o && (typeof o === 'object' || this.isFunction(o))) || false;\r\n\t},\r\n\tisString: function(o) {\r\n\t\treturn typeof o === 'string';\r\n\t},\r\n\tisUndefined: function(o) {\r\n\t\treturn typeof o === 'undefined';\r\n\t},\r\n\tisValue: function(o) {\r\n\t\treturn (this.isObject(o) || this.isString(o) || this.isNumber(o) || this.isBoolean(o));\r\n\t},\r\n\tisDate: function(o) {\r\n\t\treturn this.type(o) === 'date' && o.toString() !== 'Invalid Date' && !isNaN(o);\r\n\t},\r\n\tlater: function(when, o, fn, data, periodic) {\r\n\t\twhen = when || 0;\r\n\t\to = o || {};\r\n\t\tvar m = fn, d = data, f, r;\r\n\t\tif (this.isString(fn))\r\n\t\t\tm = o[fn];\r\n\t\tif (!m)\r\n\t\t\treturn;\r\n\t\tif (!this.isUndefined(data) && !this.isArray(d))\r\n\t\t\td = [data];\r\n\t\tf = function() {\r\n\t\t\tm.apply(o, d || []);\r\n\t\t};\r\n\t\tr = (periodic) ? setInterval(f, when) : setTimeout(f, when);\r\n\t\treturn {\r\n\t\t\tinterval: periodic,\r\n\t\t\tcancel: function() {\r\n\t\t\t\tif (this.interval) {\r\n\t\t\t\t\tclearInterval(r);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tclearTimeout(r);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\t}\r\n});","import $ from 'jquery';\r\n\r\n/**\r\n * jQuery.fields() plugin\r\n *\r\n * @param {string|undefined} fldvar - Field variable name or undefined\r\n *  If field variable name, returns jQuery object of the specified field element(s).\r\n *  If unspecified, returns object of jQuery objects of all fields.\r\n * @returns jQuery object\r\n */\r\n$.fn.fields = function(fldvar) { // Note: fldvar has NO \"x_\" prefix\r\n    var rec = {},\r\n        id = this.attr(\"id\"),\r\n        obj = this[0],\r\n        m = id.match(/^[xy](\\d*)_/),\r\n        f, tbl, infix;\r\n    if (m) { // \"this\" is input element\r\n        f = ew.getForm(obj); // form\r\n        tbl = this.data(\"table\"); // table var\r\n        infix = m[1]; // row index\r\n    } else if (obj && obj.htmlForm) { // \"this\" is form\r\n        f = obj.$element; // form\r\n        tbl = obj.id.replace(new RegExp(\"^f|\" + obj.pageId + \"$\", \"g\"), \"\"); // table var\r\n        infix = $(obj.htmlForm).data(\"rowindex\"); // row index\r\n    }\r\n    var selector = \"[data-table\" + (tbl ? \"=\" + tbl : \"\") + \"][data-field\" + (fldvar ? \"=x_\" + fldvar : \"\") + \"]\";\r\n    if ($.isValue(infix))\r\n        selector += \"[name^=x\" + infix + \"_]\";\r\n    if (f && selector) {\r\n        $(f).find(selector).each(function() {\r\n            var key = this.getAttribute(\"data-field\").substr(2), name = this.getAttribute(\"name\");\r\n            key = (/^y_/.test(name)) ? \"y_\" + key : key; // Use \"y_fldvar\" as key for 2nd search input\r\n            rec[key] = (rec[key]) ? rec[key].add(this) : $(this); // Create jQuery object for each field\r\n        });\r\n    }\r\n    return (fldvar) ? rec[fldvar] : rec;\r\n};\r\n$.fn.extend({\r\n    // Get jQuery object of the row (<div> or <tr>)\r\n    row: function() {\r\n        var $row = this.closest(\"#r_\" + this.data(\"field\")?.substr(2));\r\n        if (!$row[0])\r\n            $row = this.closest(\".ew-table > tbody > tr\"); // Grid page\r\n        return $row;\r\n    },\r\n    // Show/Hide field\r\n    visible: function(v) {\r\n        var $p = this.closest(\"#r_\" + this.data(\"field\")?.substr(2)); // Find the row\r\n        if (!$p[0])\r\n            $p = this.closest(\"[id^=el]\"); // Find the span\r\n        if (typeof(v) != \"undefined\") {\r\n            $p.toggle(v);\r\n            return this;\r\n        } else {\r\n            return $el.is(\":visible\");\r\n        }\r\n    },\r\n    // Get/Set field \"readonly\" attribute\r\n    // Note: This attribute is ignored if the value of the type attribute is hidden, range, color, checkbox, radio, file, or a button type\r\n    readonly: function(v) {\r\n        if (typeof(v) != \"undefined\") {\r\n            this.prop(\"readOnly\", v);\r\n            return this;\r\n        } else {\r\n            return this.prop(\"readOnly\");\r\n        }\r\n    },\r\n    // Get/Set field \"disabled\" attribute\r\n    // Note: A disabled control's value isn't submitted with the form\r\n    disabled: function(v) {\r\n        if (typeof(v) != \"undefined\") {\r\n            this.prop(\"disabled\", v);\r\n            return this;\r\n        } else {\r\n            return this.prop(\"disabled\");\r\n        }\r\n    },\r\n    // Get/Set field value(s)\r\n    // Note: Return array if select-multiple\r\n    value: function(v) {\r\n        var type = this.attr(\"type\");\r\n        if (typeof(v) != \"undefined\") {\r\n            if (!Array.isArray(v))\r\n                v = [v];\r\n            var type = this.attr(\"type\");\r\n            var el = (type == \"radio\" || type == \"checkbox\") ? this.get() : this[0];\r\n            if (ew.isHiddenTextArea(this)) {\r\n                this.val(v).data(\"editor\").save();\r\n            } else {\r\n                ew.selectOption(el, v);\r\n                if (this.hasClass(\"select2-hidden-accessible\")) { // Select2\r\n                    this.trigger(\"change\");\r\n                }\r\n            }\r\n            return this;\r\n        } else {\r\n            if (type == \"checkbox\") {\r\n                var val = ew.getOptionValues(this.get());\r\n                return (this.length == 1) ? val.join() : val;\r\n            } else if (type == \"radio\") {\r\n                return ew.getOptionValues(this.get()).join();\r\n            } else if (ew.isHiddenTextArea(this)) {\r\n                this.data(\"editor\").save();\r\n                return this.val();\r\n            } else {\r\n                return this.val();\r\n            }\r\n        }\r\n    },\r\n    // Get field value as number\r\n    toNumber: function() {\r\n        return ew.parseNumber(this.value());\r\n    },\r\n    // Get field value as moment object\r\n    toDate: function() {\r\n        return ew.parseDate(this.value(), this.data(\"format\"));\r\n    },\r\n    // Get field value as native Date object\r\n    toJsDate: function() {\r\n        return ew.parseDate(this.value(), this.data(\"format\")).toDate();\r\n    }\r\n});","import $ from 'jquery';\r\n\r\n// Init Treeview later\r\n$(window).off(\"load.lte.treeview\");\r\n\r\n// Treeview\r\nvar Treeview = adminlte.Treeview;\r\nTreeview.prototype._toggle = Treeview.prototype.toggle;\r\nTreeview.prototype.toggle = function toggle(event) {\r\n\tvar $relativeTarget = $(event.currentTarget), treeviewMenu = $relativeTarget.next(),\r\n\t\thref = $relativeTarget.attr(\"href\"), $text = $(event.target).closest(\".menu-item-text\");\r\n\tif (!treeviewMenu.is(\".nav-treeview\") || $text[0] && href && href != \"#\" && href != \"javascript:void(0);\") // Menu text with href\r\n\t\treturn;\r\n\tthis._toggle(event);\r\n};\r\n\r\n// Dropdown menu parent item with href // Override AdminLTE\r\n$(\"ul.dropdown-menu [data-toggle=dropdown]\").on(\"click\", function(e) {\r\n\tvar href = $(this).attr(\"href\");\r\n\tif (href && href != \"#\" && e.target.nodeName == \"SPAN\")\r\n\t\twindow.location = href;\r\n});"]}