{"mappings":"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","sources":["","drdocweb.js"],"sourcesContent":["(() => {\n\nfunction $parcel$export(e, n, v, s) {\n Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\n\n var $parcel$global = globalThis;\n \nvar $parcel$modules = {};\nvar $parcel$inits = {};\n\nvar parcelRequire = $parcel$global[\"parcelRequire94c2\"];\n\nif (parcelRequire == null) {\n parcelRequire = function(id) {\n if (id in $parcel$modules) {\n return $parcel$modules[id].exports;\n }\n if (id in $parcel$inits) {\n var init = $parcel$inits[id];\n delete $parcel$inits[id];\n var module = {id: id, exports: {}};\n $parcel$modules[id] = module;\n init.call(module.exports, module, module.exports);\n return module.exports;\n }\n var err = new Error(\"Cannot find module '\" + id + \"'\");\n err.code = 'MODULE_NOT_FOUND';\n throw err;\n };\n\n parcelRequire.register = function register(id, init) {\n $parcel$inits[id] = init;\n };\n\n $parcel$global[\"parcelRequire94c2\"] = parcelRequire;\n}\n\nvar parcelRegister = parcelRequire.register;\nparcelRegister(\"346VI\", function(module, exports) {\n\n$parcel$export(module.exports, \"default\", () => DrDocWeb);\n//import * as $ from \"./node_modules/jquery/dist/jquery.min.js\";\n//import * as $ from \"jquery\";\n//export default \nfunction DrDocWeb() {}\nif (window.DrDocWeb !== undefined) return;\n/**\r\n * Convert a string to HTML entities\r\n */ String.prototype.toHtmlEntities = function() {\n return this.replace(/./gm, function(s) {\n // return \"&#\" + s.charCodeAt(0) + \";\";\n return s.match(/[a-z0-9\\s]+/i) ? s : \"&#\" + s.charCodeAt(0) + \";\";\n });\n};\n/**\r\n * Create string from HTML entities\r\n */ String.fromHtmlEntities = function(string) {\n return (string + \"\").replace(/&#\\d+;/gm, function(s) {\n return String.fromCharCode(s.match(/\\d+/gm)[0]);\n });\n};\nString.prototype.contains = function(search, start) {\n 'use strict';\n if (typeof start !== 'number') start = 0;\n if (start + search.length > this.length) return false;\n else return this.indexOf(search, start) !== -1;\n};\nString.prototype.hashCode = function() {\n var hash = 0, i1, chr;\n if (this.length === 0) return hash;\n for(i1 = 0; i1 < this.length; i1++){\n chr = this.charCodeAt(i1);\n hash = (hash << 5) - hash + chr;\n hash |= 0; // Convert to 32bit integer\n }\n return hash;\n};\nconsole.log('DRDOCWEB INIT');\n//module.exports = DrDocWeb\n//export default DrDocWeb\n//export { DrDocWeb };\nwindow.DrDocWeb = DrDocWeb;\nDrDocWeb.ServerHost = document.location.protocol + '//' + document.location.hostname;\nDrDocWeb.ServerPort = document.location.port;\nDrDocWeb.ServerBase = function() {\n return DrDocWeb.ServerHost + (!DrDocWeb.IsNullOrEmpty(DrDocWeb.ServerPort) ? ':' + DrDocWeb.ServerPort : '');\n};\nDrDocWeb.DefaultError = function(error) {\n console.warn(error);\n DrDocWeb.ModalError('Fehler!');\n};\nDrDocWeb.IsMobile = function() {\n return window.innerWidth < window.innerHeight && window.innerWidth < 560; //850;\n//return window.innerWidth < 800;\n};\nDrDocWeb.UrlEncode = function(val) {\n return encodeURIComponent(typeof val === \"object\" ? DrDocWeb.ObjectToJson(val) : val);\n};\nDrDocWeb.ObjectToQueryStr = function(obj) {\n if (obj === null || obj === undefined) return '';\n if (typeof obj === 'string') return obj;\n var strArr = [];\n for(var p in obj)if (obj.hasOwnProperty(p)) {\n var v = obj[p];\n /*strArr.push(encodeURIComponent(p) + \"=\" + encodeURIComponent(typeof v == \"object\" ? JSON.stringify(JsonResolve(v), function(key, value)\r\n {\r\n // => typeof Dataset\r\n // IDataset / Dataset.IsModel(value): $ModelType, $ClassName, Dataset\r\n if (key == 'ModelConfig' || key == 'ModelInfos' || key == 'Dataset') return;\r\n else return value;\r\n }) : v));*/ strArr.push(DrDocWeb.UrlEncode(p) + \"=\" + DrDocWeb.UrlEncode(v));\n }\n var str = strArr.join(\"&\");\n //return (str.length == 0 ? '' : '?' + str);\n return str;\n};\nDrDocWeb.QueryStrToObject = function(str) {\n let obj = {};\n if (str === null || str === undefined) return obj;\n if (str.substring(0, 1) === '?') str = str.substring(1);\n let arr = str.split('&');\n for(var i1 in arr){\n let kvp = arr[i1].split('=');\n if (kvp !== undefined && kvp.length === 2) obj[decodeURIComponent(kvp[0])] = decodeURIComponent(kvp[1]);\n }\n return obj;\n};\nDrDocWeb.GetDataToObject = function() {\n return DrDocWeb.QueryStrToObject(window.location.search);\n};\n/*DrDocWeb.ArrayEquals = function(a, b) {\r\n return Array.isArray(a) &&\r\n Array.isArray(b) &&\r\n a.length === b.length &&\r\n a.every((val, index) => val === b[index]);\r\n};*/ // Sind alle arr1 in arr2 enthalten?\nDrDocWeb.ArrayEquals = function(arr1, arr2, caseSensitive) {\n if ((arr1 === undefined || arr1 === null || arr1.length == 0) && (arr2 === undefined || arr2 === null || arr2.length == 0)) return true;\n for (let elem1 of arr1){\n if (elem1 === undefined || elem1 === null || elem1.length == 0) continue;\n //console.log('elem1', elem1);\n let found = false;\n for (let elem2 of arr2){\n if (elem2 === undefined || elem2 === null || elem2.length == 0) continue;\n if (caseSensitive && elem2 === elem1 || !caseSensitive && elem2.toLowerCase() === elem1.toLowerCase()) {\n found = true;\n break;\n }\n }\n if (!found) return false;\n }\n //console.log('ArrayEquals', arr1, ' === ', arr2);\n return true;\n};\n/*DrDocWeb.ArrayEquals = function(arr1, arr2, caseSensitive)\r\n{\r\n if ((arr1 === undefined || arr1 === null || arr1.length == 0) && (arr2 === undefined || arr2 === null || arr2.length == 0))\r\n {\r\n return true;\r\n }\r\n \t\r\n for (let i in arr1)\r\n {\r\n if ((caseSensitive && arr1[i] !== arr2[i]) || (!caseSensitive && arr1[i].toLowerCase() !== arr2[i].toLowerCase()))\r\n return false;\r\n }\r\n \r\n //console.log('ArrayEquals', arr1, ' === ', arr2);\r\n return true;\r\n};*/ DrDocWeb.GetArrayItemWhere = function(data, propName, propValue) {\n let i1 = DrDocWeb.GetArrayItemIndexWhere(data, propName, propValue);\n if (i1 >= 0) return data[i1];\n return null;\n};\nDrDocWeb.GetArrayItemIndexWhere = function(data, propName, propValue) {\n for(var i1 = 0; i1 < data.length; i1++)if (typeof propName === 'function') {\n if (propName(data[i1]) === true) return i1;\n } else {\n if (data[i1][propName] == propValue) return i1;\n }\n return -1;\n};\nDrDocWeb.ObjGetKeys = function(obj) {\n let ret = [];\n if (obj != null && obj != undefined) {\n for(let x in obj)ret.push(x);\n return ret;\n }\n};\nDrDocWeb.FormToObject = function(formName, splitter) {\n let form = null;\n if (typeof formName === 'string') form = document.forms[formName];\n else form = formName;\n if (form === undefined) return undefined;\n if (splitter === undefined || splitter === null) splitter = String.fromCharCode(1);\n if (typeof splitter === 'number') splitter = String.fromCharCode(splitter);\n let data = {};\n // $(form).serializeArray();\n for(let i1 = 0; i1 < form.elements.length; i1++){\n let form_elem = form.elements[i1];\n //if (form_elem.value !== undefined)\n let name = form_elem.name;\n if (!DrDocWeb.IsNullOrEmpty(name)) {\n //if (pre !== undefined)\n //{\n // name = pre + name;\n //}\n // Wenn ein Element checkable ist, dann nur den aktiven Wert setzen.\n let type = form_elem.getAttribute('type');\n if (type != undefined && type != null) type = type.toLowerCase();\n let isCheckable = type === 'select' || type === 'radio' || type === 'checkbox';\n //console.log('Form: ', name, type, isCheckable);\n //if (!isCheckable || type === 'checkbox' || (isCheckable && form_elem.checked === true))\n //if (!isCheckable || (type === 'checkbox' || form_elem.getAttribute('data-has-changed') == 'true'))\n //{\n let val = '';\n if (form_elem.value !== undefined && form_elem.value !== null) {\n if (isCheckable) val = form_elem.checked === true ? form_elem.value : '';\n else val = form_elem.value;\n }\n // \n /*if (val == '' && type === 'checkbox' && form_elem.getAttribute('data-has-changed') == 'true')\r\n {\r\n val = '!' + form_elem.value;\r\n }*/ if (DrDocWeb.IsNullOrEmpty(val)) val = '';\n if (DrDocWeb.IsNullOrEmpty(val) && form_elem.getAttribute('trim') == 'true') continue;\n if (DrDocWeb.IsNullOrEmpty(val) && isCheckable) continue;\n // Falls ein Wert bereits vorhanden ist, dann anfügen.\n if (data[name] !== undefined && data[name] !== null) {\n if (typeof splitter === 'function') data[name] = splitter(name, data[name], val);\n else if (splitter === 'array') data[name].push(val);\n else data[name] = data[name] + splitter + val;\n } else if (splitter === 'array') data[name] = [\n val\n ];\n else data[name] = val;\n //}\n }\n continue;\n }\n // Am Ende leere Splitter trimmen\n if (typeof splitter !== 'function' && splitter !== 'array') for(let fieldName in data){\n let fieldValue = data[fieldName];\n if (fieldValue !== undefined && fieldValue !== null && typeof fieldValue === 'string') //data[fieldName] = fieldValue.replace(/[\\|]+$/, '');\n data[fieldName] = fieldValue.replace(new RegExp('[\\\\' + splitter + ']+$'), '');\n }\n //console.log('Form A', data);\n //console.log('Form B', form.elements);\n return data;\n};\n// Holt das nächste Form, welches kein Child von einem Element mit dem Attribut \"data-form-ignore\" ist.\nDrDocWeb.GetClosestForm = function(sourceElement) {\n //formData = document.querySelector('form [' + attr_name + '=\"' + DrDocWeb.SelectorAttributeEncode(nodeId) + '\"]');\n let result = null;\n if (sourceElement !== undefined && sourceElement !== null && sourceElement.tagName.toLowerCase() == 'form') result = sourceElement;\n else result = DrDocWeb.GetElement(sourceElement, 'form:not([data-form-ignore] *)');\n //result = DrDocWeb.GetElement(sourceElement, 'form:has(:not([data-ignore]))');\n //result = DrDocWeb.GetElement(sourceElement, 'form:not(:has([data-ignore]))');\n return result;\n};\nDrDocWeb.ClosestFormToObject = function(sourceElement, splitter) {\n //formData = document.querySelector('form [' + attr_name + '=\"' + DrDocWeb.SelectorAttributeEncode(nodeId) + '\"]');\n let result = DrDocWeb.GetClosestForm(sourceElement);\n if (result !== undefined && result !== null) return DrDocWeb.FormToObject(result, splitter);\n return undefined;\n};\nDrDocWeb.ClearClosestForm = function(sourceElement) {\n let form = DrDocWeb.GetClosestForm(sourceElement);\n if (form !== undefined && form !== null) for(let i1 = 0; i1 < form.elements.length; i1++){\n let form_elem = form.elements[i1];\n let name = form_elem.name;\n if (!DrDocWeb.IsNullOrEmpty(name)) {\n // Wenn ein Element checkable ist, dann nur den aktiven Wert setzen.\n let type = form_elem.getAttribute('type');\n if (type != undefined && type != null) type = type.toLowerCase();\n let isCheckable = type === 'select' || type === 'radio' || type === 'checkbox';\n let val = '';\n if (form_elem.value !== undefined && form_elem.value !== null) {\n if (isCheckable) form_elem.checked = null;\n else form_elem.value = '';\n }\n }\n }\n};\n/*DrDocWeb._ClosestFormToObject = function(sourceElement, splitter)\r\n{\r\n let result = undefined;\r\n if (sourceElement.nodeName !== undefined && sourceElement.nodeName.toLowerCase() === 'form')\r\n result = sourceElement;\r\n else\r\n {\r\n result = $(sourceElement).parents('form')[0];\r\n if (result === undefined || result === null)\r\n {\r\n result = $(sourceElement).children('form')[0];\r\n }\r\n }\r\n if (result !== undefined && result !== null)\r\n {\r\n return DrDocWeb.FormToObject(result, splitter);\r\n }\r\n return undefined;\r\n};*/ DrDocWeb.JsonToObjectWalker = function(parentObj, parentProp, refObjList) {\n let obj = parentObj[parentProp];\n for(var prop in obj){\n let value = obj[prop];\n if (prop === '$id') {\n refObjList[value] = obj;\n delete obj['$id'];\n } else if (prop === '$values') {\n DrDocWeb.JsonToObjectWalker(obj, prop, refObjList);\n parentObj[parentProp] = value;\n } else if (prop === '$ref') parentObj[parentProp] = refObjList[value];\n else if (typeof value === 'object') DrDocWeb.JsonToObjectWalker(obj, prop, refObjList);\n }\n};\nDrDocWeb.JsonToObject = function(text) {\n if (text == null || text == undefined) return {};\n if (typeof text === 'object') return text;\n if (typeof text !== 'string') {\n console.log('DrDocWeb.JsonToObject: Bad format: ', text);\n return text;\n }\n var obj = {\n _root: JSON.parse(text)\n };\n var refObjList = {};\n DrDocWeb.JsonToObjectWalker(obj, '_root', refObjList);\n return obj._root;\n};\nDrDocWeb.ObjectToJson = function(obj) {\n if (obj == undefined || obj == null) return '';\n return JSON.stringify(obj);\n};\nDrDocWeb.CloneCopy = function(obj) {\n if (obj == undefined || obj == null) return obj;\n if (typeof obj === 'string' || typeof obj === 'number') return obj;\n if (Array.isArray(obj)) return obj.slice(0);\n if (typeof obj === 'object') {\n var arrTmp = {};\n Object.assign(arrTmp, obj);\n return arrTmp;\n }\n console.warn('DrDocWeb.CloneCopy: unknown obj type: ', typeof obj, obj);\n return obj;\n};\nDrDocWeb.CloneCopyTo = function(src, dst, ignorePropsArr) {\n for(var i1 in src)if (ignorePropsArr == undefined || ignorePropsArr == null || ignorePropsArr.indexOf(i1) === -1) dst[i1] = src[i1];\n};\nDrDocWeb.GetRequestUrl = function(url, getData) {\n var requestUrl = DrDocWeb.ServerBase();\n // hat die \"url\" schon einen Hostnamen?\n // => dann setzen\n if (url !== null && url !== undefined) {\n if (url.indexOf('http://') === 0 || url.indexOf('https://') === 0) requestUrl = url;\n else if (url.indexOf(requestUrl) === 0) requestUrl = url;\n else if (url.indexOf('/') === 0) requestUrl += url;\n else requestUrl += '/' + url;\n }\n // GET Parameter in URL übernehmen\n if (getData !== null && getData !== undefined) {\n requestUrl += requestUrl.indexOf('?') === -1 ? '?' : '&';\n requestUrl += DrDocWeb.ObjectToQueryStr(getData);\n }\n return requestUrl;\n};\nDrDocWeb.Send = function(method, url, getData, postData, parseAs, sendAs, cookie, retAsync) {\n const promiseFn = function(resolve, reject) {\n //console.log('DrDocWeb.Send', method, url, getData, postData, parseAs, sendAs);\n try {\n var requestUrl = DrDocWeb.GetRequestUrl(url, getData);\n var request = new XMLHttpRequest();\n //try {\n const openRequestFn = function() {\n // Asynchron\n request.open(method, requestUrl, retAsync === true || retAsync === undefined);\n // Synchron\n //request.open(method, requestUrl, false);\n if (!DrDocWeb.IsNullOrEmpty(cookie)) {\n request.withCredentials = true;\n //request.setRequestHeader('Access-Control-Allow-Origin', '*');\n //request.setRequestHeader('Access-Control-Allow-Headers', 'Cookie');\n request.setRequestHeader('Cookie', cookie);\n //console.log('DrDocWeb.Send ('+requestUrl+'): Cookie: ' + cookie);\n }\n };\n var processResponse = function(responseObj) {\n if (parseAs !== undefined && parseAs !== null && (parseAs.toLowerCase() == 'json' || parseAs.toLowerCase() == 'text/json' || parseAs.toLowerCase() == 'application/json')) return DrDocWeb.JsonToObject(responseObj.responseText); //JSON.parse(event.target.responseText));\n else return responseObj.responseText;\n };\n postData !== undefined && FormData;\n //request.setRequestHeader('Access-Control-Allow-Origin', '*');\n /*request.setRequestHeader('Referer', null);\r\n request.setRequestHeader('Cookie', null);\r\n request.setRequestHeader('Host', null);\r\n request.setRequestHeader('Origin', null);\r\n request.setRequestHeader('User-Agent', null);\r\n \r\n request.removeRequestHeader('Referer');\r\n request.removeRequestHeader('Cookie');\r\n request.removeRequestHeader('Host');\r\n request.removeRequestHeader('Origin');\r\n request.removeRequestHeader('User-Agent');*/ if (retAsync === true || retAsync === undefined) {\n if (resolve !== undefined && resolve !== null) request.addEventListener('load', function(event) {\n //console.log('DrDocWeb.Send', event, method, url, getData, postData, parseAs, sendAs);\n resolve(processResponse(event.target));\n });\n if (reject !== undefined && reject !== null) {\n request.addEventListener('timeout', reject);\n request.addEventListener('error', reject);\n request.addEventListener('abort', reject);\n }\n }\n // POST Parameter senden\n if (postData === undefined) {\n openRequestFn();\n request.send();\n } else if (postData instanceof FormData || sendAs == 'form') {\n // Progress-Bar\n let progressBarId = 'progress-' + DrDocWeb.RandomChars(12);\n let progressBarHtml = `\n
\n
\n
\n `;\n let progressBarModal = DrDocWeb.ModalSecondary('Upload', progressBarHtml);\n let progressbarOnChange = function(e) {\n //console.log('Upload Progress (e): ', e);\n const percentComplete = e ? e.loaded / e.total * 100 : 0;\n //if (e.lengthComputable) {\n //console.log('Upload Progress: ', percentComplete);\n document.getElementById(progressBarId + '-bar').style.width = percentComplete + '%';\n let progressBarElem = document.getElementById(progressBarId);\n progressBarElem.setAttribute('aria-valuenow', percentComplete);\n //}\n };\n progressbarOnChange();\n request.addEventListener('progress', progressbarOnChange);\n if (request.upload !== undefined) request.upload.onprogress = progressbarOnChange;\n request.onprogress = progressbarOnChange;\n let progressBarCloseFn = function() {\n progressBarModal.hide();\n };\n request.addEventListener('load', progressBarCloseFn);\n request.addEventListener('timeout', progressBarCloseFn);\n request.addEventListener('error', progressBarCloseFn);\n request.addEventListener('abort', progressBarCloseFn);\n openRequestFn();\n request.send(postData);\n } else if (sendAs == 'json' || sendAs == 'text/json' || sendAs == 'application/json') {\n openRequestFn();\n request.setRequestHeader('Content-Type', 'application/json');\n request.send(JSON.stringify(postData));\n } else {\n openRequestFn();\n request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');\n request.send(DrDocWeb.ObjectToQueryStr(postData));\n }\n if (retAsync === true || retAsync === undefined) ;\n else //Sync\n return processResponse(request);\n } catch (err) {\n if (reject !== undefined && reject !== null) reject(err);\n else {\n console.error(err);\n throw err;\n }\n }\n };\n if (retAsync === true || retAsync === undefined) return new Promise(promiseFn);\n else return promiseFn();\n};\nDrDocWeb.SendGet = function(url, getData, parseAs) {\n return DrDocWeb.Send('GET', url, getData, undefined, parseAs);\n};\nDrDocWeb.SendPost = function(url, getData, postData, parseAs) {\n return DrDocWeb.Send('POST', url, getData, postData, parseAs);\n};\nDrDocWeb.RandomChars = function(length) {\n return DrDocWeb.Random(length, 'abcdefghijklmnopqrstuvwxyz');\n};\nDrDocWeb.Random = function(length, characters) {\n let result = '';\n if (length === undefined) length = 32;\n if (DrDocWeb.IsNullOrEmpty(characters)) characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n let charactersLength = characters.length;\n let counter = 0;\n while(counter < length){\n result += characters.charAt(Math.floor(Math.random() * charactersLength));\n counter += 1;\n }\n return result;\n};\n// Checksum\nDrDocWeb.ChecksumCyrb53 = function(str, seed = 0) {\n let h1 = 0xdeadbeef ^ seed, h2 = 0x41c6ce57 ^ seed;\n for(let i1 = 0, ch; i1 < str.length; i1++){\n ch = str.charCodeAt(i1);\n h1 = Math.imul(h1 ^ ch, 2654435761);\n h2 = Math.imul(h2 ^ ch, 1597334677);\n }\n h1 = Math.imul(h1 ^ h1 >>> 16, 2246822507);\n h1 ^= Math.imul(h2 ^ h2 >>> 13, 3266489909);\n h2 = Math.imul(h2 ^ h2 >>> 16, 2246822507);\n h2 ^= Math.imul(h1 ^ h1 >>> 13, 3266489909);\n return 4294967296 * (2097151 & h2) + (h1 >>> 0);\n};\nDrDocWeb.CheckRecursion = function() {\n // the name of the calling function \n var fname = DrDocWeb.CheckRecursion.arguments.callee.caller.name;\n // obtain the stack trace ***not cross browser***\n // tested on Firefox\n var err = new Error();\n var stack = err.stack.split('\\n');\n // returns true if the calling function appears more than once\n var i1, n, cnt;\n n = stack.length;\n cnt = 0;\n for(i1 = 0; i1 < n; i1++)if (fname == stack[i1].substring(0, stack[i1].indexOf('@'))) {\n cnt++;\n if (cnt > 1) return true;\n }\n return false;\n};\nDrDocWeb.Crud = function(getData) {\n return DrDocWeb.SendGet('/model/crud', getData, 'json');\n};\nDrDocWeb.CrudListen = function(callback) {\n /*if (callback != null)\r\n {\r\n callback(null, null);\r\n }*/ // Dataset.GetData = function (url, paramsObj, successCallback, errorCallback, finallyCallback)\n DrDocWeb.SendGet('/node/de/test', {\n listener: 99\n }, (obj)=>{\n //console.warn('MAIN Load', e.target.responseText);\n //console.warn('MAIN Load', e);\n //Vue.set(Dataset.Model[obj.$ModelType], Dataset.GetID(obj), obj);\n if (callback != null) callback(obj, true);\n //Dataset.ListenState = true;\n //Vue.set(Dataset, 'ListenState', true);\n DrDocWeb.CrudListen(callback);\n }, (obj)=>{\n //Dataset.ListenState = false;\n //Vue.set(Dataset, 'ListenState', false);\n // Bei Fehler, nach einigen Sekunden erneut versuchen.\n setTimeout(()=>{\n DrDocWeb.CrudListen(callback);\n }, 1000);\n if (callback != null) callback(null, false);\n console.warn('MAIN Error', obj, callback, false);\n if (DrDocWeb.DefaultError != null) DrDocWeb.DefaultError(obj);\n });\n};\n/*DrDocWeb.DataSelect = function(data, selector)\r\n{\r\n if (data === undefined || data === null)\r\n return [];\r\n \r\n let ret_data = [];\r\n data.forEach(function(itm) {\r\n if (selector === undefined || selector(ret_data) === true)\r\n ret_data.push(itm);\r\n });\r\n return ret_data;\r\n};*/ DrDocWeb.ParseBool = function(value) {\n if (value === undefined || value === null) return false;\n if (typeof value === 'bool' || typeof value === 'boolean') return value;\n if (typeof value === 'string') return value.toLocaleLowerCase() === 'true' || value === '1';\n return false;\n};\nDrDocWeb.ParseInt = function(value) {\n if (value === undefined || value === null || isNaN(value)) return 0;\n if (typeof value === 'float') return value;\n if (typeof value === 'number') return value;\n //return +value;\n return parseFloat(value);\n// parseInt\n};\nDrDocWeb.ParseDateTime = function(dateStr) {\n dateStr = DrDocWeb.ToIsoDateTimeStr(dateStr);\n if (dateStr === undefined) return undefined;\n if (!isNaN(dateStr) && (typeof dateStr === 'date' || dateStr instanceof Date)) return dateStr;\n return new Date(dateStr);\n};\nDrDocWeb.ToIsoDateTimeStr = function(dateStr) {\n if (DrDocWeb.IsNullOrEmpty(dateStr)) return undefined;\n if (!isNaN(dateStr) && (typeof dateStr === 'date' || dateStr instanceof Date)) return dateStr.toISOString();\n // toUTCString\n if (typeof dateStr === 'number') //console.log('DrDocWeb.ToIsoDateTimeStr: typeof dateStr === number', dateStr, new Date(dateStr * 1000), new Date(dateStr * 1000), new Date(dateStr * 1000 * 100));\n return new Date(dateStr).toISOString();\n if (typeof dateStr !== 'string') {\n console.warn('DrDocWeb.ToIsoDateTimeStr / typeof dateStr !== string / ', typeof dateStr, ' / ', dateStr);\n return undefined;\n }\n let dateTimeComponents = dateStr.split(' ');\n if (dateTimeComponents.length == 2) {\n let dateComponents = dateTimeComponents[0].split('.');\n let timeComponents = dateTimeComponents[1].split(':');\n if (dateComponents.length == 3 && timeComponents.length >= 2) return dateComponents[2] + '-' + dateComponents[1] + '-' + dateComponents[0] + 'T' + timeComponents[0] + ':' + timeComponents[0];\n } else if (dateTimeComponents.length == 1) {\n let dateComponents = dateTimeComponents[0].split('.');\n if (dateComponents.length == 3) return dateComponents[2] + '-' + dateComponents[1] + '-' + dateComponents[0];\n //return dateComponents[1];\n }\n //console.warn('DrDocWeb.ParseDateTime: bad date', dateStr, dateTimeComponents);\n return dateStr;\n};\nDrDocWeb.DateTimeAddMulti = function(dsDate, duration_total_str) {\n for (let dauer_str of duration_total_str.split(' ')){\n if (DrDocWeb.IsNullOrEmpty(dauer_str) || dauer_str.length < 2) continue;\n let dauer_unit = dauer_str.substring(dauer_str.length - 1);\n let dauer_num = DrDocWeb.ParseInt(dauer_str.substring(0, dauer_str.length - 1));\n dsDate = DrDocWeb.DateTimeAdd(dsDate, dauer_num, dauer_unit);\n }\n return dsDate;\n};\nDrDocWeb.DateTimeAdd = function(dt, amount, dateType) {\n if (DrDocWeb.IsNullOrEmpty(dt)) dt = new Date();\n else if (typeof dt === 'date' || dt instanceof Date) ;\n else dt = DrDocWeb.ParseDateTime(dt);\n switch(dateType.toUpperCase()){\n case 'T':\n case 'D':\n case 'DAY':\n case 'DAYS':\n return dt.setDate(dt.getDate() + amount) && dt;\n case 'W':\n case 'WEEK':\n case 'WEEKS':\n return dt.setDate(dt.getDate() + 7 * amount) && dt;\n case 'M':\n case 'MONTH':\n case 'MONTHS':\n return dt.setMonth(dt.getMonth() + amount) && dt;\n case 'Y':\n case 'J':\n case 'YEAR':\n case 'YEARS':\n return dt.setFullYear(dt.getFullYear() + amount) && dt;\n default:\n console.warn('DrDocWeb.DateTimeAdd: bad date unit: ', dateType);\n break;\n }\n};\nDrDocWeb.EventFire = function(el, eventName, fn) {\n var doc = !el ? document : el.ownerDocument || document;\n //console.log('Fire Event', eventName, el);\n if (!DrDocWeb.IsNullOrEmpty(eventName) && eventName.substring(0, 2) == 'on') //console.log('DrDocWeb.EventFire: mod: ', eventName, ' -> ', eventName.substring(2));\n eventName = eventName.substring(2);\n var evObj = null;\n if (document.createEvent) {\n evObj = doc.createEvent('Events'); // HTMLEvents\n // initEvent(type, bubbles, cancelable)\n evObj.initEvent(eventName, true, true); //false);\n } else {\n evObj = doc.createEventObject();\n evObj.eventType = eventName;\n }\n if (fn !== undefined && fn !== null && typeof fn === 'function') try {\n fn(evObj);\n } catch (ex) {\n console.warn('DrDocWeb.EventFire: ', el, eventName, ex);\n }\n if (document.createEvent) doc.dispatchEvent(evObj);\n else //if (doc.fireEvent)\n //doc.fireEvent('on' + eventName);\n doc.fireEvent('on' + evObj.eventType, evObj);\n};\n// --\n// DOM\n// Suche nach:\n// - DrDocWeb.GetParentNode\n// - DrDocWeb.FindChildElement\n// - DrDocWeb.FindChildElements\n// - DrDocWeb.SelectLastElementById\nDrDocWeb.GetElement = function(sourceElement, selector, first) {\n if (sourceElement === undefined || sourceElement === null) sourceElement = document;\n try {\n if (typeof sourceElement === 'string') sourceElement = document.querySelectorAll(sourceElement);\n } catch {\n console.warn('DrDocWeb.GetElement: Bad sourceElement', sourceElement, selector);\n sourceElement = document;\n }\n if (!selector.contains(' ') && !selector.contains('-') && !selector.contains(':') && !selector.contains('[')) //console.log('DrDocWeb.GetElement: is TagName: ', selector, sourceElement.tagName, sourceElement);\n {\n if (!DrDocWeb.IsNullOrEmpty(sourceElement.tagName) && sourceElement.tagName.toLowerCase() == selector.toLowerCase()) {\n console.log('DrDocWeb.GetElement: sourceElement.tagName.toLowerCase() == selector.toLowerCase(): ', sourceElement);\n return sourceElement;\n }\n }\n if (!selector.contains(' ') && selector.indexOf('[') === 0 && selector.indexOf(']') === selector.length - 1) {\n let attrName = selector.substring(1, selector.length - 1);\n //console.log('DrDocWeb.GetElement: is Attribute: ', selector, sourceElement.tagName, attrName, sourceElement);\n if (sourceElement.hasAttribute(attrName)) {\n console.log('DrDocWeb.GetElement: Attr: ', attrName, sourceElement.getAttribute(attrName), sourceElement);\n return sourceElement;\n }\n }\n let result = sourceElement.querySelectorAll(selector);\n if (result !== undefined && result !== null && result.length == 1) //if (result.length > 1)\n //console.log('DrDocWeb.GetElement: Element wurde mehrfach gefunden! ', selector, sourceElement);\n return result[0];\n let elems = DrDocWeb.GetElements(sourceElement, selector);\n if (elems === undefined || elems === null || elems.length == 0) return undefined;\n if (first === undefined && elems.length > 1) console.warn('DrDocWeb.GetElement: Element wurde mehrfach gefunden! Selector: ', selector, 'Elements: ', elems, 'Source: ', sourceElement);\n if (first === true) return elems[0];\n if (first === true) return elems[elems.length - 1];\n else return elems[elems.length - 1];\n};\nDrDocWeb.GetElements = function(sourceElement, selector) {\n if (sourceElement === undefined || sourceElement === null) sourceElement = document;\n let result = null;\n result = DrDocWeb.GetChildElements(sourceElement, selector);\n if (result !== undefined && result !== null && result.length > 0) return result;\n result = DrDocWeb.GetParentElements(sourceElement, selector);\n if (result !== undefined && result !== null && result.length > 0) return result;\n return [];\n};\nDrDocWeb.GetParentElements = function(sourceElement, selector) {\n if (sourceElement === undefined || sourceElement === null) sourceElement = document;\n while(sourceElement !== undefined && sourceElement !== null){\n let result = sourceElement.querySelectorAll(selector);\n if (result !== undefined && result !== null && result.length > 0) return result;\n sourceElement = sourceElement.parentNode;\n }\n return undefined;\n};\nDrDocWeb.GetChildElements = function(sourceElement, selector) {\n if (sourceElement === undefined || sourceElement === null) sourceElement = document;\n /*for (let i in sourceElement.childNodes)\r\n {\r\n\r\n }*/ return sourceElement.querySelectorAll(selector);\n};\n/*DrDocWeb._GetParentNode = function(sourceElement, compare)\r\n{\r\n if (compare === undefined || typeof compare !== 'function')\r\n return undefined;\r\n if (sourceElement === undefined)\r\n sourceElement = document;\r\n\r\n while (sourceElement !== undefined && sourceElement !== null)\r\n {\r\n let result = compare(sourceElement);\r\n if (result !== undefined && result !== null && result !== false)\r\n {\r\n return sourceElement;\r\n //return result;\r\n }\r\n sourceElement = sourceElement.parentNode;\r\n }\r\n return undefined;\r\n};*/ /*DrDocWeb._SelectLastElementById = function(id)\r\n{\r\n var elems = document.querySelectorAll('#' + id);\r\n if (elems === undefined)\r\n return undefined;\r\n return elems[elems.length-1];\r\n};*/ DrDocWeb.FindChildElement = function(element, attr_name, attr_value, attr_comparer) {\n if (element === null || element === undefined || element.nodeName == '#text' || element.nodeName == '#comment') return undefined;\n if (attr_value === null || attr_value === undefined) return undefined;\n if (typeof element.getAttribute === 'function') {\n let elem_attr_val = element.getAttribute(attr_name);\n if (elem_attr_val !== undefined && elem_attr_val !== null && elem_attr_val.length > 0) {\n if (attr_comparer !== undefined && attr_comparer(elem_attr_val, attr_value) === true) return element;\n if (attr_comparer === undefined && elem_attr_val == attr_value) return element;\n }\n }\n for(var i1 in element.childNodes){\n let sub = DrDocWeb.FindChildElement(element.childNodes[i1], attr_name, attr_value, attr_comparer);\n if (sub != null) return sub;\n }\n return undefined;\n};\nDrDocWeb.FindChildElements = function(element, attr_name, attr_value, attr_comparer) {\n if (element === null || element === undefined || element.nodeName == '#text' || element.nodeName == '#comment') return undefined;\n if (attr_value === null || attr_value === undefined) return undefined;\n let list = [];\n if (typeof element.getAttribute === 'function') {\n let elem_attr_val = element.getAttribute(attr_name);\n if (elem_attr_val !== undefined && elem_attr_val !== null && elem_attr_val.length > 0) {\n if (attr_comparer !== undefined && attr_comparer(elem_attr_val, attr_value) === true) list = [\n element\n ];\n if (attr_comparer === undefined && elem_attr_val == attr_value) list = [\n element\n ];\n }\n }\n for(var i1 in element.childNodes){\n let sub = DrDocWeb.FindChildElements(element.childNodes[i1], attr_name, attr_value, attr_comparer);\n if (sub !== undefined && sub !== null && sub.length > 0) //if (list === undefined)\n // list = sub;\n //else\n //{\n //list.push(...sub);\n for(let sub_i in sub)list.push(sub[sub_i]);\n }\n return list;\n};\nDrDocWeb.setInnerHTML = function(elm, html, callback) {\n var doc = elm.ownerDocument || document;\n try {\n if (!DrDocWeb.IsNullOrEmpty(html) && html.indexOf('<') == -1 && html.indexOf('>') == -1) elm.innerText = html;\n else elm.innerHTML = html;\n Array.from(elm.querySelectorAll(\"script\")).forEach((oldScript)=>{\n const newScript = doc.createElement(\"script\");\n Array.from(oldScript.attributes).forEach((attr)=>newScript.setAttribute(attr.name, attr.value));\n newScript.appendChild(doc.createTextNode(oldScript.innerHTML));\n if (callback != undefined) {\n newScript.onload = callback;\n newScript.onreadystatechange = function() {\n if (this.readyState == 'complete') callback();\n };\n }\n oldScript.parentNode.replaceChild(newScript, oldScript);\n });\n } catch (ex) {\n console.warn('DrDocWeb.setInnerHTML: HTML konnte nicht geparst werden', html, elem, ex);\n }\n};\nDrDocWeb.IframeAutosize = function(iframe, selector, lastWidth, lastHeight, maxWidthStr, maxHeightStr) {\n if (iframe != undefined && iframe != null) {\n if (iframe.contentWindow != undefined && iframe.contentWindow != null && iframe.contentWindow.document != undefined && iframe.contentWindow.document != null) {\n //console.log('DrDocWeb.IframeAutosize: SetSize (1): ', iframe.contentWindow.document.readyState);\n // Erneut ausführen, bis das Dokument geladen ist\n if (iframe.contentWindow.document.readyState !== 'complete') {\n //console.log('DrDocWeb.IframeAutosize: iframe.contentWindow.document.readyState: ', iframe.contentWindow.document.readyState);\n setTimeout(function() {\n DrDocWeb.IframeAutosize(iframe, selector, lastWidth, lastHeight, maxWidthStr, maxHeightStr);\n }, 200);\n //DrDocWeb.IframeAutosize(iframe, selector);\n return;\n }\n if (lastWidth == undefined || lastWidth === null) iframe.width = '100%';\n //iframe.height = '400px';\n //iframe.style.width = '100%';\n //iframe.style.width = '100px';\n //iframe.style.height = '1000px';\n let doc = iframe.contentWindow.document;\n let maxW = 0;\n let maxH = 0; //iframe.height;\n if (doc.body != undefined && doc.body != null) {\n if (doc.body.scrollWidth != undefined) maxW = Math.max(maxW, doc.body.scrollWidth);\n if (doc.body.scrollHeight != undefined) maxH = Math.max(maxH, doc.body.scrollHeight);\n }\n if (!DrDocWeb.IsNullOrEmpty(selector)) {\n let selectorElemArr = doc.querySelectorAll(selector);\n //console.log('DrDocWeb.IframeAutosize: selector: ', selector, selectorElem);\n if (selectorElemArr != undefined && selectorElemArr != null) selectorElemArr.forEach(function(selectorElem) {\n if (selectorElem != undefined && selectorElem != null) {\n //if (selectorElem.width != undefined)\n // maxW = Math.max(maxW, selectorElem.width);\n if (selectorElem.scrollWidth != undefined) maxW = Math.max(maxW, selectorElem.scrollWidth);\n //if (selectorElem.height != undefined)\n // maxH = Math.max(maxH, selectorElem.height);\n if (selectorElem.scrollHeight != undefined) maxH = Math.max(maxH, selectorElem.scrollHeight);\n }\n });\n //console.log('DrDocWeb.IframeAutosize: Size: ', maxW, ' x ', maxH);\n }\n if (doc.documentElement != undefined && doc.documentElement != null) {\n if (doc.documentElement.scrollWidth != undefined) maxW = Math.max(maxW, doc.documentElement.scrollWidth);\n if (doc.documentElement.scrollHeight != undefined) maxH = Math.max(maxH, doc.documentElement.scrollHeight);\n }\n /*if (iframe.contentWindow.width != undefined)\r\n maxW = Math.max(maxW, iframe.contentWindow.width);\r\n if (iframe.contentWindow.height != undefined)\r\n maxH = Math.max(maxH, iframe.contentWindow.height);*/ //console.log('DrDocWeb.IframeAutosize: SetSize (2): ', iframe.src, maxH, doc.body.scrollHeight, doc.documentElement.scrollHeight, iframe.contentWindow.height); //, doc);\n /*if (maxH > 150) {\r\n //iframe.width = maxW + 'px';\r\n iframe.height = maxH + 'px';\r\n\r\n // Wenn auch Inhalte bereits geladen wurden, nur alle 5 Sek. Größe erneut anpassen\r\n setTimeout(function () {\r\n DrDocWeb.IframeAutosize(iframe, selector, false);\r\n }, 5000);\r\n }\r\n else {\r\n // Wenn auch Inhalte noch nicht geladen wurden, alle 0,2 Sek. Größe erneut anpassen\r\n setTimeout(function () {\r\n DrDocWeb.IframeAutosize(iframe, selector, false);\r\n }, 1000);\r\n }*/ // Wenn auch Inhalte noch nicht geladen wurden, alle 0,2 Sek. Größe erneut anpassen\n setTimeout(function() {\n DrDocWeb.IframeAutosize(iframe, selector, maxW, maxH, maxWidthStr, maxHeightStr);\n }, 1000);\n //console.log('DrDocWeb.IframeAutosize: Size: Neu: ', maxW, ' x ', maxH, ' / alt: ', lastWidth, ' x ', lastHeight, ' / max: ', maxWidthStr, 'x', maxHeightStr);\n if (lastWidth == undefined || maxW > lastWidth + 150) {\n iframe.style.width = maxW + 0 + 'px';\n if (!DrDocWeb.IsNullOrEmpty(maxWidthStr)) iframe.style.maxWidth = maxWidthStr;\n else iframe.style.maxWidth = maxW + 0 + 'px';\n }\n if (lastHeight == undefined || maxH > lastHeight + 150) {\n iframe.style.height = maxH + 0 + 'px';\n if (!DrDocWeb.IsNullOrEmpty(maxHeightStr)) iframe.style.maxHeight = maxHeightStr;\n else iframe.style.maxHeight = maxH + 0 + 'px';\n }\n iframe.contentWindow.document.documentElement.style.overflow = 'hidden';\n } else {\n //console.log('DrDocWeb.IframeAutosize: Init (0): ', iframe.src);\n if (iframe._hasLoadEvent === true) return;\n iframe._hasLoadEvent = true;\n iframe.addEventListener('load', function(e) {\n //console.log('DrDocWeb.IframeAutosize: onLoad (1, root): ', iframe.src);\n DrDocWeb.IframeAutosize(iframe, selector, lastWidth, lastHeight, maxWidthStr, maxHeightStr);\n });\n }\n } else ;\n};\nDrDocWeb.FindLeftWindowBoundry = function(wnd) {\n // In Internet Explorer window.screenLeft is the window's left boundry\n if (wnd.screenLeft) return wnd.screenLeft;\n // In Firefox window.screenX is the window's left boundry\n if (wnd.screenX) return wnd.screenX;\n return 0;\n};\nDrDocWeb.FindTopWindowBoundry = function(wnd) {\n // In Internet Explorer window.screenLeft is the window's left boundry\n if (wnd.screenTop) return wnd.screenTop;\n // In Firefox window.screenX is the window's left boundry\n if (wnd.screenY) return wnd.screenY;\n return 0;\n};\n// // Find Left Boundry of the Screen/Monitor\nDrDocWeb.FindLeftScreenBoundry = function(wnd) {\n let left = DrDocWeb.FindLeftWindowBoundry(wnd);\n // Check if the window is off the primary monitor in a positive axis\n // X,Y X,Y S = Screen, W = Window\n // 0,0 ---------- 1280,0 ----------\n // | | | --- |\n // | | | | W | |\n // | S | | --- S |\n // ---------- ----------\n if (left > wnd.screen.width) return left - (left - wnd.screen.width);\n // Check if the window is off the primary monitor in a negative axis\n // X,Y X,Y S = Screen, W = Window\n // 0,0 ---------- -1280,0 ----------\n // | | | --- |\n // | | | | W | |\n // | S | | --- S |\n // ---------- ----------\n // This only works in Firefox at the moment due to a bug in Internet Explorer opening new windows into a negative axis\n // However, you can move opened windows into a negative axis as a workaround\n if (left < 0 && left > wnd.screen.width * -1) return wnd.screen.width * -1;\n // If neither of the above, the monitor is on the primary monitor whose's screen X should be 0\n return 0;\n};\nDrDocWeb.FindTopScreenBoundry = function(wnd) {\n let top = DrDocWeb.FindTopWindowBoundry(wnd);\n if (top > wnd.screen.height) return top - (top - wnd.screen.height);\n if (top < 0 && top > wnd.screen.height * -1) return wnd.screen.height * -1;\n return 0;\n};\nDrDocWeb.ObjectForEachSorted = function(obj, action) {\n var keys = Object.keys(obj);\n var len = keys.length;\n keys.sort();\n for(i = 0; i < len; i++)action(keys[i], obj[keys[i]]);\n};\n// --\n// Cookie Funktionen\nDrDocWeb.SetCookie = function(cname, cvalue, exdays, path) {\n const d = new Date();\n d.setTime(d.getTime() + exdays * 86400000);\n let expires = \"Expires=\" + d.toUTCString();\n //console.log('DrDocWeb.SetCookie(' + cname + ', ' + cvalue + ')', '\\r\\n', document.cookie);\n document.cookie = DrDocWeb.UrlEncode(cname) + \"=\" + DrDocWeb.UrlEncode(cvalue) + \"; \" + expires + \"; Path=\" + (!DrDocWeb.IsNullOrEmpty(path) ? path : '/') + \"; SameSite=Lax;\"; //SameSite=None;\"; //samesite=lax;\"; // SameSite=Lax;\"; //SameSite=None; Secure\";\n};\nDrDocWeb.GetCookie = function(cname, defaultValue) {\n let name = DrDocWeb.UrlEncode(cname) + \"=\";\n let ret = '';\n //let decodedCookie = document.cookie);\n if (document.cookie) {\n let ca = document.cookie.split(';');\n for(let i1 = 0; i1 < ca.length; i1++){\n let c = ca[i1];\n while(c.charAt(0) == ' ')c = c.substring(1);\n if (c.indexOf(name) === 0) {\n ret = decodeURIComponent(c.substring(name.length, c.length));\n break;\n }\n }\n //console.log('Cookie... ', ca);\n }\n if (defaultValue === undefined) defaultValue = '';\n //console.log('DrDocWeb.GetCookie(' + cname + ', ' + defaultValue + ') = ', ret, '\\r\\n', document.cookie);\n return DrDocWeb.IsNullOrEmpty(ret) ? defaultValue : ret;\n};\nDrDocWeb.GetCookiePrefix = function(namePrefix) {\n //let name = DrDocWeb.UrlEncode(cname) + \"=\";\n let ret = [];\n //let decodedCookie = document.cookie);\n if (document.cookie) {\n let ca = document.cookie.split(';');\n for(let i1 = 0; i1 < ca.length; i1++){\n let c = ca[i1];\n while(c.charAt(0) == ' ')c = c.substring(1);\n let iOfEq = c.indexOf('=');\n if (iOfEq < 0) continue;\n let name = c.substring(0, iOfEq);\n if (name.indexOf(namePrefix) === 0) {\n let value = decodeURIComponent(c.substring(iOfEq + 1));\n console.log('DrDocWeb.GetCookiePrefix: Cookie gefunden! ', name, '|', value, '|');\n ret.push({\n name: name,\n value: value\n });\n }\n }\n //console.log('Cookie... ', ca);\n }\n //console.log('DrDocWeb.GetCookie(' + cname + ', ' + defaultValue + ') = ', ret, '\\r\\n', document.cookie);\n return ret;\n};\n// ---\n// Tree-View\n// Root Element (UL): .tree\n// Item Element (LI): .tree-item (ggf.: .tree-item-action)\n// Item Element Container (UL): (ggf.: .tree-sub .tree-active)\nDrDocWeb.TreeView = function() {\n //console.log('DrDocWeb.TreeView: init');\n var treeRootElemArr = document.querySelectorAll(\".tree\");\n if (treeRootElemArr != undefined && treeRootElemArr != null && treeRootElemArr.length > 0) for(let i1 = 0; i1 < treeRootElemArr.length; i1++)DrDocWeb.TreeViewIntern(treeRootElemArr[i1]);\n};\nDrDocWeb.TreeViewIntern = function(treeRootElem) {\n /*if (treeRootElem._tree_initialized === true)\r\n {\r\n console.log('DrDocWeb.TreeViewIntern (bereits initialisiert): ', treeRootElem);\r\n return;\r\n }\r\n treeRootElem._tree_initialized = true;\r\n console.log('DrDocWeb.TreeViewIntern: init', treeRootElem);*/ var treeToggler = treeRootElem.querySelectorAll(\".tree-item\");\n //console.log('DrDocWeb.TreeViewIntern: .tree-item\"*: ', treeToggler, '/', treeRootElem);\n if (treeToggler == undefined || treeToggler == null || treeToggler.length == 0) {\n treeToggler = treeRootElem.childNodes;\n //console.log('DrDocWeb.TreeViewIntern: >*: ', treeToggler, '/', treeRootElem);\n if (treeToggler != undefined && treeToggler != null && treeToggler.length > 0) for(let i1 = 0; i1 < treeToggler.length; i1++){\n let liElem = treeToggler[i1];\n if (!liElem.classList) continue;\n liElem.classList.add('tree-item');\n let ulElem = liElem.querySelector(\"ul\");\n if (ulElem) ulElem.classList.add('tree-sub');\n }\n }\n treeToggler = treeRootElem.querySelectorAll(\".tree-item\");\n if (treeToggler != undefined && treeToggler != null && treeToggler.length > 0) {\n //console.log('DrDocWeb.TreeViewIntern: ', treeToggler);\n let updateTreeElem = function(liElem) {\n //liElem.classList.add(\"tree-caret-item\");\n let ulElem = liElem.querySelector(\".tree-sub\");\n // wenn kein .tree-sub gefunden wurde, das erste \"ul\" finden\n if (ulElem == null || ulElem == undefined) {\n ulElem = liElem.querySelector(\"ul\");\n if (ulElem) ulElem.classList.add('tree-sub');\n }\n //if (ulElem == null || ulElem == undefined)\n // ulElem = liElem.querySelector(\"*\");\n if (ulElem) {\n if (ulElem.classList.contains('tree-active')) liElem.classList.add(\"tree-caret-down\");\n else liElem.classList.remove(\"tree-caret-down\");\n } else ;\n };\n for(let i1 = 0; i1 < treeToggler.length; i1++){\n let liElem = treeToggler[i1];\n if (!liElem.classList) continue;\n updateTreeElem(liElem);\n //console.log('Tree, LI: ', liElem.firstChild, liElem.querySelector(\"*\"), liElem.querySelector(\"span\"), liElem.childNodes[0]);\n let onClick = function(e) {\n //let liElem = treeToggler[i]; //DrDocWeb.GetElement(liElem, 'li', true);\n // nur Event ausführen, wenn das OnClick Target passt: als das selbe Element oder ein direktes Child ist\n if (e.target !== liElem && e.target.parentNode !== liElem && !e.target.classList.contains('tree-item-action')) {\n console.log('DrDocWeb.TreeViewIntern: onClick: e.target !== liElem, ', e, e.target, liElem);\n return;\n }\n //console.log('DrDocWeb.TreeViewIntern: onClick: ', liElem);\n //let ulElem = DrDocWeb.GetElement(liElem, 'ul', true);\n let ulElem = liElem.querySelector(\".tree-sub\");\n /*if (ulElem == null || ulElem == undefined)\r\n {\r\n ulElem = liElem.querySelector(\"ul\");\r\n if (ulElem)\r\n ulElem.classList.add('tree-sub');\r\n }*/ //if (ulElem == null || ulElem == undefined)\n // ulElem = liElem.querySelector(\"*\");\n if (ulElem) ulElem.classList.toggle(\"tree-active\");\n updateTreeElem(liElem);\n };\n //liElem.addEventListener(\"click\", onClick);\n let actionElem = null;\n if (actionElem == null || actionElem == undefined) actionElem = liElem.querySelector(\".tree-item-action\");\n //if (actionElem == null || actionElem == undefined)\n // actionElem = liElem.querySelector(\"li\");\n //if (actionElem == null || actionElem == undefined)\n // actionElem = liElem.querySelector(\"*\");\n if (actionElem == null || actionElem == undefined) // Trigger für Action darf nicht direkt das \"li\"-Element sein, sonst wird beim Click alle darunter sgeschlossen\n actionElem = liElem;\n if (actionElem != undefined && actionElem != null) {\n if (actionElem.__tree_onClick != undefined) {\n actionElem.removeEventListener(\"click\", actionElem.__tree_onClick);\n actionElem.removeEventListener(\"click\", actionElem.__tree_onClick, true);\n actionElem.removeEventListener(\"click\", actionElem.__tree_onClick, false);\n }\n actionElem.__tree_onClick = onClick;\n actionElem.addEventListener(\"click\", onClick, false);\n } else console.log('DrDocWeb.TreeViewIntern: no action Element found: ', liElem, actionElem);\n }\n }\n};\n// ---\nDrDocWeb.SelectorAttributeEncode = function(str) {\n return str.replace(/[\"\\\\]/g, '\\\\$&');\n};\n// ---\nDrDocWeb.DataGroup = function(data, selector_arr, emptyKeyValue, selector_i) {\n if (selector_i === undefined || selector_i < 0) selector_i = 0;\n if (selector_i >= selector_arr.length) return undefined;\n let ret_data = {};\n if (data !== undefined && data !== null) {\n //data.forEach(function (itm) {\n for(let data_key in data){\n let itm = data[data_key];\n let key = selector_arr[selector_i](itm);\n let key_arr = null;\n // \"itm\" in \"ret_data\" einsortieren\n // Wenn key ein Array ist, für jedes Element einzeln einsortieren\n if (key != undefined && key != null && Array.isArray(key)) {\n if (key.length === 0) key_arr = [\n ''\n ];\n else key_arr = key;\n } else key_arr = [\n key\n ];\n for (let key_itm of key_arr){\n // Default Key setzen, falls leer\n if (DrDocWeb.IsNullOrEmpty(key_itm) && !DrDocWeb.IsNullOrEmpty(emptyKeyValue)) key_itm = emptyKeyValue;\n if (ret_data[key_itm] === undefined) ret_data[key_itm] = [];\n //console.log('DrDocWeb.DataGroup: key_arr: ', key_itm, ': ', ret_data[key_itm]);\n if (ret_data[key_itm].indexOf(itm) === -1) ret_data[key_itm].push(itm);\n }\n }\n if (selector_i + 1 < selector_arr.length) for(let key in ret_data)ret_data[key] = DrDocWeb.DataGroup(ret_data[key], selector_arr, emptyKeyValue, selector_i + 1);\n }\n //console.log('DrDocWeb.DataGroup: ', ret_data);\n return ret_data;\n};\n// ---\n// KVP / Key-Value-Pair\n// DrDocWeb.kvp_get(this, 'rootNamespace-1', 'search', 'field_')\n// DrDocWeb.kvp_get(sourceElement, 'rootNamespace-1', 'search', 'field_', searchData, true);\n// data-kvp-namespace=\"rootNamespace-1\" data-kvp-key=\"Feld1\" data-kvp-search=\"Test GmbH\" data-kvp-value2=\"Test\"\n// => { 'field_Feld1': 'Test GmbH', field_value2: 'Test' }\nDrDocWeb.KVP_ATTR = 'data-kvp';\nDrDocWeb.KVP_ATTR_NAMESPACE = DrDocWeb.KVP_ATTR + '-namespace';\nDrDocWeb.KVP_ATTR_KEY = DrDocWeb.KVP_ATTR + '-key';\nDrDocWeb.KVP_ATTR_VALUE = DrDocWeb.KVP_ATTR + '-value';\nDrDocWeb.kvp_get = function(sourceElement, rootNamespace, valueName, returnKeyPrefix, obj, strictParentHierarchy) {\n if (sourceElement == undefined || sourceElement == null) return;\n if (DrDocWeb.IsNullOrEmpty(valueName)) valueName = 'value';\n if (DrDocWeb.IsNullOrEmpty(returnKeyPrefix)) returnKeyPrefix = '';\n if (obj == undefined || obj == null) obj = {};\n //var rootElement = DrDocWeb.IsNullOrEmpty(selector) ? null : DrDocWeb.GetElement(sourceElement, selector);\n if (strictParentHierarchy) DrDocWeb.kvp_getRecursiveInternal(sourceElement, rootNamespace, valueName, returnKeyPrefix, obj, strictParentHierarchy);\n else {\n let elemList = document.querySelectorAll(`[${DrDocWeb.KVP_ATTR_NAMESPACE}=\"${DrDocWeb.SelectorAttributeEncode(rootNamespace)}\"]`);\n if (elemList != undefined && elemList != null) for (let elem1 of elemList)DrDocWeb.kvp_getRecursiveInternal(elem1, rootNamespace, valueName, returnKeyPrefix, obj, strictParentHierarchy);\n }\n //let elemNodeIgnoreList = [];\n //DrDocWeb.kvp_getInternal(sourceElement, rootNamespace, valueName, returnKeyPrefix, obj, strictHierarchy, searchParent, elemNodeIgnoreList);\n //console.log('DrDocWeb.kvp_get: root: ', obj);\n return obj;\n};\n/*DrDocWeb.kvp_getInternal = function (sourceElement, rootNamespace, valueName, returnKeyPrefix, obj, strictHierarchy, searchParent, elemNodeIgnoreList) {\r\n if (elemNodeIgnoreList.indexOf(sourceElement) >= 0)\r\n return;\r\n elemNodeIgnoreList.push(sourceElement);\r\n\r\n if (strictHierarchy) {\r\n // Strikt suchen\r\n DrDocWeb.kvp_getRecursiveInternal(sourceElement, rootNamespace, valueName, returnKeyPrefix, obj, strictHierarchy, searchParent, elemNodeIgnoreList);\r\n }\r\n else {\r\n let elemList = document.querySelectorAll(`[${DrDocWeb.KVP_ATTR_NAMESPACE}=\"${DrDocWeb.SelectorAttributeEncode(rootNamespace)}\"]`);\r\n if (elemList != undefined && elemList != null) {\r\n for (let elem of elemList) {\r\n DrDocWeb.kvp_getRecursiveInternal(elem, rootNamespace, valueName, returnKeyPrefix, obj, strictHierarchy, false, elemNodeIgnoreList);\r\n }\r\n }\r\n }\r\n}*/ DrDocWeb.kvp_getRecursiveInternal = function(sourceElement, rootNamespace, valueName, returnKeyPrefix, obj, strictParentHierarchy) {\n if (sourceElement.getAttribute !== undefined && typeof sourceElement.getAttribute === 'function') {\n let key = sourceElement.getAttribute(DrDocWeb.KVP_ATTR_KEY);\n // key vorhanden?\n if (!DrDocWeb.IsNullOrEmpty(key)) {\n let namespace = sourceElement.getAttribute(DrDocWeb.KVP_ATTR_NAMESPACE);\n // Namespace prüfen\n if (DrDocWeb.IsNullOrEmpty(namespace) && DrDocWeb.IsNullOrEmpty(rootNamespace) || namespace === rootNamespace) {\n // data-kvp-=\"...\"\n let value = sourceElement.getAttribute(DrDocWeb.KVP_ATTR + '-' + valueName.toLowerCase());\n if (!DrDocWeb.IsNullOrEmpty(value)) obj[returnKeyPrefix + key] = value;\n }\n }\n }\n //if (rootElement === sourceElement)\n // return;\n if (strictParentHierarchy) // Rekursive über Parent Node durchlaufen\n {\n if (sourceElement.parentNode != null && sourceElement.parentNode != undefined) DrDocWeb.kvp_getRecursiveInternal(sourceElement.parentNode, rootNamespace, valueName, returnKeyPrefix, obj, strictParentHierarchy);\n }\n};\n// ---\n// Drag and Drop\n/*\r\n+CSS:\r\n[data-drag]\r\n{\r\n cursor: pointer;\r\n user-select: none;\r\n}\r\n.drag-active[data-drag]\r\n{\r\n border-color: $gray-500;\r\n border-width: 1px;\r\n border-style: solid;\r\n}\r\n\r\n+HTML:\r\n\r\n
\r\n\r\nDrDocWeb.dnd_init(elem)\r\nDrDocWeb.dnd_getValue(elem)\r\n*/ DrDocWeb.DND_ATTR = 'data-drag';\nDrDocWeb.DND_ATTR_DROP = 'data-drop';\nDrDocWeb.DND_ATTR_VALUE = DrDocWeb.DND_ATTR + '-value';\nDrDocWeb.DND_ATTR_ACTION = DrDocWeb.DND_ATTR + '-action';\nDrDocWeb.DND_ATTR_TRIGGER = DrDocWeb.DND_ATTR + '-trigger';\n//DrDocWeb.DND_ATTR_IGNORE = DrDocWeb.DND_ATTR + '-ignore';\nDrDocWeb.dnd_selected = {};\n// Initialisiert alle Elemente mit dem Attribut data-drag=\"Name\"\nDrDocWeb.dnd_init = function(sourceElement) {\n let selector = `[${DrDocWeb.DND_ATTR}]`;\n let arr = DrDocWeb.GetElements(sourceElement, selector);\n //console.log('dnd_init: ', arr);\n for (let elem1 of arr)dnd_initElement(elem1);\n/*for (let elem of DrDocWeb.GetElements(sourceElement, `[${DrDocWeb.DND_ATTR_IGNORE}]`)) {\r\n if (DrDocWeb.ParseBool(elem.getAttribute(DrDocWeb.DND_ATTR_IGNORE))) {\r\n elem.draggable = false;\r\n\r\n elem.addEventListener('dragstart', function (e) {\r\n console.log('DND: Disable: Start: ', e.targer, elem);\r\n e.preventDefault();\r\n return false;\r\n });\r\n }\r\n }*/ };\nfunction dnd_getDragDropEvent(type, dataTransfer) {\n var dragDropEvent = new DragEvent(type);\n console.log('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', dataTransfer);\n Object.defineProperty(dragDropEvent.constructor.prototype, 'dataTransfer', dataTransfer);\n dragDropEvent['dataTransfer'] = dataTransfer;\n //console.log('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', dragDropEvent.dataTransfer.getData('Text'));\n console.log('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', dragDropEvent);\n return dragDropEvent;\n}\n// Drag n Drop Element initialisieren\nfunction dnd_initElement(sourceElement, name) {\n if (sourceElement == undefined || sourceElement == null) return;\n // nur einmal initialisieren\n if (sourceElement._dnd_initialized === true) return;\n sourceElement._dnd_initialized = true;\n if (typeof sourceElement.getAttribute !== 'function') return;\n //if (DrDocWeb.IsNullOrEmpty(name))\n name = sourceElement.getAttribute(DrDocWeb.DND_ATTR);\n if (DrDocWeb.IsNullOrEmpty(name)) return;\n // prüfen, ob das Draggable Element ein anderes Trigger Element hat\n let triggerElement = DrDocWeb.GetElement(sourceElement, `[${DrDocWeb.DND_ATTR_TRIGGER}=\"${DrDocWeb.SelectorAttributeEncode(name)}\"]`, true);\n if (triggerElement != undefined && triggerElement != null) {\n //console.log('DND Init: User Trigger Element ', triggerElement, ' for source elem ', sourceElement);\n let dragAction = sourceElement.getAttribute(DrDocWeb.DND_ATTR_ACTION);\n //console.log('dnd_initElement: ', name);\n if (dragAction == 'false' || dragAction == 'none' || dragAction == 'drop' || dragAction == 'dropzone') {\n // Nur als Dropzone\n // Element nicht als Draggable markieren\n sourceElement.draggable = false;\n sourceElement.setAttribute('draggable', 'false');\n } else {\n // Element als Draggable markieren\n sourceElement.draggable = false;\n sourceElement.setAttribute('draggable', 'false');\n sourceElement.addEventListener('dragstart', function(e) {\n //console.log('dragstart: ', e.target, e);\n /*console.log('dragstart: ', DrDocWeb.DND_ATTR_IGNORE, ' / ', e.target.getAttribute(DrDocWeb.DND_ATTR_IGNORE), ' / ', e.target, e);\r\n if (DrDocWeb.ParseBool(e.target.getAttribute(DrDocWeb.DND_ATTR_IGNORE))) {\r\n console.log('DRAG n Drop Cancel: ', e.target);\r\n e.preventDefault();\r\n return false;\r\n }*/ dnd_dragStart(name, e);\n });\n // Element als Draggable markieren\n triggerElement.addEventListener('mousedown', function(e) {\n e.preventDefault();\n sourceElement.draggable = true;\n sourceElement.setAttribute('draggable', 'true');\n //setTimeout(function () {\n // DrDocWeb.EventFire(sourceElement, 'mousedown');\n // DrDocWeb.EventFire(sourceElement, 'dragstart');\n //}, 100);\n //DrDocWeb.EventFire(sourceElement, 'dragstart');\n /*var dragDataTransfer = {\r\n data: {},\r\n setData: function(type, value) { this.data[type] = value; },\r\n getData: function(type) { return this.data[type] }\r\n };\r\n\r\n dragDataTransfer.setData('Text', 'foo....................');\r\n var dragstaEv = dnd_getDragDropEvent('dragstart', dragDataTransfer);\r\n sourceElement.dispatchEvent(dragstaEv);*/ return false;\n });\n }\n sourceElement.addEventListener('dragover', function(e) {\n dnd_dragOver(name, e);\n });\n /*sourceElement.addEventListener('dragend', function (e) {\r\n dnd_dragEnd(name, e);\r\n });*/ sourceElement.addEventListener('drop', function(e) {\n dnd_drop(name, e);\n });\n } else {\n let dragAction = sourceElement.getAttribute(DrDocWeb.DND_ATTR_ACTION);\n //console.log('dnd_initElement: ', name);\n if (dragAction == 'false' || dragAction == 'none' || dragAction == 'drop' || dragAction == 'dropzone') {\n // Nur als Dropzone\n // Element nicht als Draggable markieren\n sourceElement.draggable = false;\n sourceElement.setAttribute('draggable', 'false');\n } else {\n // Element als Draggable markieren\n sourceElement.draggable = true;\n sourceElement.setAttribute('draggable', 'true');\n sourceElement.addEventListener('dragstart', function(e) {\n /*console.log('dragstart: ', DrDocWeb.DND_ATTR_IGNORE, ' / ', e.target.getAttribute(DrDocWeb.DND_ATTR_IGNORE), ' / ', e.target, e);\r\n if (DrDocWeb.ParseBool(e.target.getAttribute(DrDocWeb.DND_ATTR_IGNORE))) {\r\n console.log('DRAG n Drop Cancel: ', e.target);\r\n e.preventDefault();\r\n return false;\r\n }*/ dnd_dragStart(name, e);\n });\n }\n sourceElement.addEventListener('dragover', function(e) {\n dnd_dragOver(name, e);\n });\n /*sourceElement.addEventListener('dragend', function (e) {\r\n dnd_dragEnd(name, e);\r\n });*/ sourceElement.addEventListener('drop', function(e) {\n dnd_drop(name, e);\n });\n }\n}\nDrDocWeb.dnd_getElem = function(name, sourceElement, getContainer) {\n if (typeof sourceElement.hasAttribute === 'function') {\n if (sourceElement.hasAttribute(DrDocWeb.DND_ATTR) && name == sourceElement.getAttribute(DrDocWeb.DND_ATTR)) /*if (getContainer === true) {\r\n let containerElement = DrDocWeb.GetElement(sourceElement, `[${DrDocWeb.DND_ATTR}-container=\"${DrDocWeb.SelectorAttributeEncode(name)}\"]`, true);\r\n if (containerElement != undefined && containerElement != null) {\r\n //console.log('DrDocWeb.dnd_getElem: Container, ', DrDocWeb.DND_ATTR, name, sourceElement, ' => ', containerElement);\r\n return containerElement;\r\n }\r\n }*/ //console.log('DrDocWeb.dnd_getElem: ', DrDocWeb.DND_ATTR, name, sourceElement);\n return sourceElement;\n /*if (sourceElement.hasAttribute(DrDocWeb.DND_ATTR_DROP) && name == sourceElement.getAttribute(DrDocWeb.DND_ATTR_DROP)) {\r\n console.log('DrDocWeb.dnd_getElem: ', DrDocWeb.DND_ATTR_DROP, name, sourceElement);\r\n return sourceElement;\r\n }*/ }\n let elemTmp = sourceElement.parentNode;\n if (elemTmp !== undefined && elemTmp !== null) {\n let parent = DrDocWeb.dnd_getElem(name, elemTmp, getContainer);\n if (parent !== undefined && parent !== null) return parent;\n }\n //let selector = `[${DrDocWeb.DND_ATTR}=\"${name}\"]`;\n //return DrDocWeb.GetElement(sourceElement, selector, true);\n return undefined;\n};\nDrDocWeb.dnd_getValueElem = function(sourceElement) {\n if (sourceElement != undefined && sourceElement != null) {\n if (typeof sourceElement.hasAttribute === 'function' && sourceElement.hasAttribute(DrDocWeb.DND_ATTR_VALUE)) return sourceElement;\n let elemTmp = sourceElement.parentNode;\n if (elemTmp !== undefined && elemTmp !== null) {\n let parent = DrDocWeb.dnd_getValueElem(elemTmp);\n if (parent !== undefined && parent !== null) return parent;\n }\n }\n return undefined;\n};\nDrDocWeb.dnd_getValue = function(sourceElement) {\n sourceElement = DrDocWeb.dnd_getValueElem(sourceElement);\n return sourceElement != undefined && sourceElement != null && typeof sourceElement.getAttribute === 'function' ? sourceElement.getAttribute(DrDocWeb.DND_ATTR_VALUE) : '';\n};\n// The user starts to drag an element\nfunction dnd_dragStart(name, e) {\n if (!e) return;\n let sourceElement = DrDocWeb.dnd_getElem(name, e.target, true);\n let sourceElementTrigger = DrDocWeb.dnd_getElem(name, e.target, false);\n if (!sourceElement) return;\n /*\r\n // Drag n Drop Container und Trigger Element unterscheiden sich\r\n if (sourceElementTrigger !== sourceElement)\r\n {\r\n console.log('DND: Drag n Drop Container und Trigger Element unterscheiden sich: ', sourceElementTrigger, sourceElement);\r\n // sourceElement.draggable = true;\r\n // Container Element initialisieren\r\n dnd_initElement(sourceElement, name);\r\n e.preventDefault();\r\n // \"dragstart\" erneut für Container Element ausführen\r\n setTimeout(function(){\r\n DrDocWeb.EventFire(sourceElement, 'dragstart', function(e2){\r\n console.log('DND: Drag n Drop Container', ' / dragstart fired', e2);\r\n });\r\n }, 100);\r\n return false;\r\n }\r\n console.log('DND: Drag n Drop Start', sourceElementTrigger, sourceElement);\r\n */ //let moveElement = DrDocWeb.GetElement(sourceElement, `[${DrDocWeb.DND_ATTR}-container=\"${DrDocWeb.SelectorAttributeEncode(name)}\"]`, true);\n //if (moveElement != undefined && moveElement != null) {\n // sourceElement = moveElement;\n //}\n sourceElement.classList.add('drag-active');\n // https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Drag_operations\n //console.log('dnd_dragStart: ', sourceElement, ' Prev: ', sourceElement.previousElementSibling, ' / Next: ', sourceElement.nextElementSibling);\n let actionStr = sourceElement.getAttribute(DrDocWeb.DND_ATTR_ACTION);\n if (!DrDocWeb.IsNullOrEmpty(actionStr)) //console.log('dnd_dragStart: effectAllowed: ', actionStr);\n e.dataTransfer.effectAllowed = actionStr;\n else e.dataTransfer.effectAllowed = 'move';\n e.dataTransfer.setData('text/plain', null);\n sourceElement.dnd = {\n sourceElement: sourceElement,\n sourceElementParent: sourceElement.parentNode,\n targetElement: null,\n targetElementParent: null,\n previousElementSibling: sourceElement.previousElementSibling,\n nextElementSibling: sourceElement.nextElementSibling,\n effectAllowed: e.dataTransfer.effectAllowed\n };\n //sourceElement.style.cursor = 'move';\n //sourceElement.style.backgroundColor = 'green';\n DrDocWeb.dnd_selected[name] = sourceElement;\n}\n// A dragged element is over the drop target\n// The ondragover event specifies where the dragged data can be dropped.\nfunction dnd_dragOver(name, e) {\n if (DrDocWeb.dnd_selected[name] == null) //console.log('dnd_dragOver: DrDocWeb.dnd_selected[name] == null: ', name);\n return;\n e.preventDefault();\n /*let sourceElement = null;\r\n if (e.target._dnd_elem !== undefined) {\r\n sourceElement = e.target._dnd_elem;\r\n }\r\n else {\r\n sourceElement = DrDocWeb.dnd_getElem(name, e.target, true);\r\n e.target._dnd_elem = sourceElement;\r\n }*/ let sourceElement = DrDocWeb.dnd_selected[name];\n let targetElement = DrDocWeb.dnd_getElem(name, e.target, true);\n if (sourceElement == null || sourceElement == undefined) return;\n // Effekt setzen für Cursor Symbol\n if (sourceElement.dnd != undefined && !DrDocWeb.IsNullOrEmpty(sourceElement.dnd.effectAllowed)) e.dataTransfer.dropEffect = sourceElement.dnd.effectAllowed;\n // Element beim Drag and Drop einsortieren\n //if (DrDocWeb.IsNullOrEmpty(e.dataTransfer.effectAllowed) || e.dataTransfer.effectAllowed == 'move') {\n /*try {\r\n //console.log('dnd_dragOver: ', sourceElement, sourceElement.nextElementSibling);\r\n if (dnd_dragOver_isBeforeInternal(DrDocWeb.dnd_selected[name], sourceElement)) {\r\n sourceElement.parentNode.insertBefore(DrDocWeb.dnd_selected[name], sourceElement);\r\n } else {\r\n sourceElement.parentNode.insertBefore(DrDocWeb.dnd_selected[name], sourceElement.nextElementSibling);\r\n }\r\n } catch { }*/ /*}\r\n else {\r\n //console.log('dnd_dragOver: effectAllowed: ', e.dataTransfer.effectAllowed);\r\n //var dt = e.originalEvent.dataTransfer;\r\n //dt.dropEffect = e.dataTransfer.effectAllowed;\r\n //e.dataTransfer.dropEffect = e.dataTransfer.effectAllowed;\r\n //e.preventDefault();\r\n }*/ // Ziel Parent Element setzen\n if (sourceElement.dnd != undefined) {\n if (targetElement != undefined && targetElement != null) {\n e.target.dnd = sourceElement.dnd;\n targetElement.dnd = sourceElement.dnd;\n sourceElement.dnd.targetElement = targetElement;\n if (targetElement.parentNode != undefined && targetElement.parentNode != null) sourceElement.dnd.targetElementParent = targetElement.parentNode;\n }\n }\n}\nfunction dnd_dragOver_isBeforeInternal(el1, el2) {\n if (!el1 || !el2) return false;\n let cur = null;\n if (el2.parentNode === el1.parentNode) for(cur = el1.previousElementSibling; cur; cur = cur.previousElementSibling){\n if (cur === el2) return true;\n }\n return false;\n}\n// A dragged element is dropped on the target\n// onDrop wird VOR onDragEnd aufgerufen\nfunction dnd_drop(name, e) {\n if (DrDocWeb.dnd_selected[name] == null) //console.log('dnd_drop: DrDocWeb.dnd_selected[name] == null: ', name, e.target);\n return;\n //console.log('dnd_drop: e: ', name, DrDocWeb.dnd_selected[name], e);\n let sourceElement = DrDocWeb.dnd_selected[name];\n if (sourceElement == undefined || sourceElement == null) //console.log('dnd_drop: sourceElement == null: ', name, e.target);\n return;\n let targetElement = DrDocWeb.dnd_getElem(name, e.target, true);\n // Call preventDefault() to prevent the browser default handling of the data (default is open as link on drop)\n e.preventDefault();\n sourceElement.classList.remove('drag-active');\n // Ziel Parent Element setzen\n /*if (sourceElement.dnd != undefined)\r\n {\r\n sourceElement.dnd.targetElement = sourceElement;\r\n\r\n if (sourceElement.parentNode != undefined && sourceElement.parentNode != null)\r\n sourceElement.dnd.targetElementParent = sourceElement.parentNode;\r\n }*/ if (sourceElement.dnd != undefined) {\n // In Target einsortieren\n if (!DrDocWeb.IsNullOrEmpty(sourceElement.dnd.effectAllowed) && sourceElement.dnd.effectAllowed == 'move') try {\n if (dnd_dragOver_isBeforeInternal(DrDocWeb.dnd_selected[name], targetElement)) targetElement.parentNode.insertBefore(DrDocWeb.dnd_selected[name], targetElement);\n else targetElement.parentNode.insertBefore(DrDocWeb.dnd_selected[name], targetElement.nextElementSibling);\n } catch {}\n // Ziel Parent Element setzen\n if (targetElement != undefined && targetElement != null) {\n e.target.dnd = sourceElement.dnd;\n targetElement.dnd = sourceElement.dnd;\n sourceElement.dnd.targetElement = targetElement;\n if (targetElement.parentNode != undefined && targetElement.parentNode != null) sourceElement.dnd.targetElementParent = targetElement.parentNode;\n }\n }\n //console.log('dnd_drop: ', name, ' / Target: ', e.target, ' / Source: ', sourceElement, ' / DND: ', sourceElement.dnd);\n //console.log('dnd_drop: ', name, ' / DND: ', sourceElement.dnd);\n // Source Element zurücksetzen\n //setTimeout(function () {\n DrDocWeb.dnd_selected[name] = null;\n//}, 5);\n}\n// onDragEnd wird NACH onDrop aufgerufen\nfunction dnd_dragEnd(name, e) {\n if (DrDocWeb.dnd_selected[name] == null) // console.log('dnd_dragEnd: DrDocWeb.dnd_selected[name] == null: ', name, e.target);\n return;\n let sourceElement = DrDocWeb.dnd_getElem(name, e.target, true);\n if (!sourceElement) return;\n sourceElement.classList.remove('drag-active');\n //console.log('dnd_dragEnd: ', e, sourceElement, ' Prev: ', sourceElement.previousElementSibling, ' / Next: ', sourceElement.nextElementSibling);\n // Ziel Parent Element setzen\n if (sourceElement.dnd != undefined && sourceElement.parentNode != undefined && sourceElement.parentNode != null) sourceElement.dnd.targetElementParent = sourceElement.parentNode;\n // mit Timeout ausführen, damit \"e.target\" auf das Ziel weist\n //setTimeout(function(){\n // Element wieder an Quelle zurückschieben, wenn effectAllowed z.B. 'copy' ist\n // aber nur wenn: Element beim Drag and Drop einsortiert wurde\n /*if (sourceElement.dnd != undefined && !DrDocWeb.IsNullOrEmpty(sourceElement.dnd.effectAllowed) && sourceElement.dnd.effectAllowed != 'move') {\r\n //console.log('dnd_dragEnd: dnd 1 copy: ', sourceElement.dnd.effectAllowed, e.target===sourceElement, sourceElement.dnd.sourceElement===sourceElement, sourceElement);\r\n if (sourceElement.parentNode !== sourceElement.dnd.sourceElementParent) {\r\n sourceElement.parentNode.removeChild(sourceElement);\r\n sourceElement.dnd.sourceElementParent.appendChild(sourceElement);\r\n }\r\n }\r\n else {\r\n // move\r\n //console.log('dnd_dragEnd: dnd 2 move: ', e.target===sourceElement, sourceElement.dnd.sourceElement===sourceElement, sourceElement);\r\n }*/ //}, 100);\n // Source Element zurücksetzen\n setTimeout(function() {\n DrDocWeb.dnd_selected[name] = null;\n }, 5);\n}\n// ---\n// Math Helper\nDrDocWeb.Math_Median = function(values) {\n if (values.length === 0) return 0;\n values.sort(function(a, b) {\n return a - b;\n });\n var half = Math.floor(values.length / 2);\n if (values.length % 2) return values[half];\n return (values[half - 1] + values[half]) / 2.0;\n};\n// --\n// String Funktionen\nDrDocWeb.IsNullOrEmpty = function(val) {\n return val === undefined || val === null || val === '' || typeof val === 'number' && isNaN(val) === true;\n};\n// --\n// String Extensions\nif (!String.prototype.startsWith) String.prototype.startsWith = function(searchString, position) {\n position = position || 0;\n return this.indexOf(searchString, position) === position;\n};\nif (!String.prototype.endsWith) String.prototype.endsWith = function(searchString, position) {\n var subjectString = this.toString();\n if (typeof position !== 'number' || !isFinite(position) || Math.floor(position) !== position || position > subjectString.length) position = subjectString.length;\n position -= searchString.length;\n var lastIndex = subjectString.indexOf(searchString, position);\n return lastIndex !== -1 && lastIndex === position;\n};\n// --\n// Base64 Encode\nDrDocWeb.b64EncodeUnicode = function(str) {\n // first we use encodeURIComponent to get percent-encoded UTF-8,\n // then we convert the percent encodings into raw bytes which\n // can be fed into btoa.\n return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function toSolidBytes(match, p1) {\n return String.fromCharCode(parseInt(p1, 16));\n //return String.fromCharCode('0x' + p1);\n }));\n};\n/// Base64 Decode\nDrDocWeb.b64DecodeUnicode = function(str) {\n // Going backwards: from bytestream, to percent-encoding, to original string.\n return decodeURIComponent(atob(str).split('').map(function(c) {\n return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);\n }).join(''));\n};\n// --\n// JSON Funktionen\n// JSON Parse\nDrDocWeb.JsonParse = function(jsonStr) {\n if (jsonStr == null || jsonStr.length == 0) return null;\n return DrDocWeb.JsonRetrocycle(JSON.parse(jsonStr)); //event.target.responseText));\n};\n/**\r\n * Modified from Douglas Crockford's cycle.js (https://github.com/douglascrockford/JSON-js/blob/master/cycle.js).\r\n * Ported over to TypeScript, and modified to handle the reference schema that Json.NET uses.\r\n */ /* = {\r\n decycle: null,\r\n retrocycle: null\r\n};*/ (function() {\n /**\r\n * The findReferences function walks recursively through an object graph built from a Json.NET string,\r\n * looking for $id properties. When it finds an object with that property, then it adds it to the catalog under that key.\r\n * @param obj The object from Json.NET\r\n * @param catalog The catalog of references that maintains state through the series of recursive calls.\r\n */ function findReferences(obj, catalog) {\n if (obj && typeof obj === \"object\") {\n var id = obj.$id;\n if (typeof id === \"string\") catalog[id] = obj;\n if (Object.prototype.toString.apply(obj) === \"[object Array]\") {\n var i1 = void 0;\n for(i1 = 0; i1 < obj.length; i1 += 1)findReferences(obj[i1], catalog);\n } else for(var name_1 in obj){\n if (obj.hasOwnProperty(name_1)) {\n if (typeof obj[name_1] === \"object\") findReferences(obj[name_1], catalog);\n }\n }\n }\n }\n /**\r\n * The resolveReferences function walks through the object graph and replaces any references with the objects from the catalog.\r\n * @param obj The object from Json.NET\r\n * @param catalog The catalog of references that maintains state through the series of recursive calls.\r\n */ function resolveReferences(obj, catalog) {\n if (obj && typeof obj === \"object\") {\n var i1 = void 0;\n var item = void 0;\n var id = void 0;\n if (Object.prototype.toString.apply(obj) === \"[object Array]\") for(i1 = 0; i1 < obj.length; i1 += 1){\n item = obj[i1];\n if (item && typeof item === \"object\") {\n id = item.$ref;\n if (typeof id === \"string\") obj[i1] = catalog[id];\n else obj[i1] = resolveReferences(item, catalog);\n }\n }\n else if (obj.$values && Object.prototype.toString.apply(obj.$values) === \"[object Array]\") {\n var arr = new Array();\n for(i1 = 0; i1 < obj.$values.length; i1 += 1){\n item = obj.$values[i1];\n if (item && typeof item === \"object\") {\n id = item.$ref;\n if (typeof id === \"string\") arr[i1] = catalog[id];\n else arr[i1] = resolveReferences(item, catalog);\n } else arr[i1] = item;\n }\n obj = arr;\n } else {\n var name_2;\n for(name_2 in obj){\n if (obj.hasOwnProperty(name_2)) {\n if (typeof obj[name_2] === \"object\") {\n item = obj[name_2];\n if (item) {\n id = item.$ref;\n if (typeof id === \"string\") obj[name_2] = catalog[id];\n else obj[name_2] = resolveReferences(item, catalog);\n }\n }\n }\n }\n }\n }\n return obj;\n }\n /**\r\n * The createReferences function recurses through the object, producing the deep copy.\r\n * @param obj The object from Json.NET\r\n * @param catalog The catalog of references that maintains state through the series of recursive calls.\r\n */ function getDecycledCopy(obj, catalog) {\n var i1; // The loop counter\n var name; // Property name\n var nu; // The new object or array\n switch(typeof obj){\n case \"object\":\n // typeof null === 'object', so get out if this value is not really an object.\n // Also get out if it is a weird builtin object.\n if (obj === null || obj instanceof Boolean || obj instanceof Date || obj instanceof Number || obj instanceof RegExp || obj instanceof String) return obj;\n // If the value is an object or array, look to see if we have already\n // encountered it. If so, return a {$id:id} object. This is a hard way, O(n)\n // linear search that will get slower as the number of unique objects grows.\n // JavaScript really should have a decent dictionary or map class.\n for(i1 = 0; i1 < catalog.length; i1 += 1){\n if (catalog[i1] === obj) return {\n $ref: i1.toString()\n };\n }\n // Otherwise, accumulate the unique value and its id.\n obj.$id = catalog.length.toString();\n catalog.push(obj);\n // If it is an array, replicate the array.\n if (Object.prototype.toString.apply(obj) === \"[object Array]\") {\n nu = [];\n for(i1 = 0; i1 < obj.length; i1 += 1)nu[i1] = getDecycledCopy(obj[i1], catalog);\n } else {\n // If it is an object, replicate the object.\n nu = {};\n for(name in obj)if (Object.prototype.hasOwnProperty.call(obj, name)) nu[name] = getDecycledCopy(obj[name], catalog);\n }\n return nu;\n case \"number\":\n case \"string\":\n case \"boolean\":\n default:\n return obj;\n }\n }\n /** Make a deep copy of an object or array, assuring that there is at most\r\n one instance of each object or array in the resulting structure. The\r\n duplicate references (which might be forming cycles) are replaced with\r\n an object of the form\r\n {$id: id}\r\n where the id is a simple string\r\n Modified from Douglas Crockford's cycle.js (https://github.com/douglascrockford/JSON-js/blob/master/cycle.js)\r\n Ported over to TypeScript, and modified to handle the reference schema that Json.NET uses.\r\n */ function decycle(obj) {\n var catalog = []; // Keep a reference to each unique object or array\n var newObj = getDecycledCopy(obj, catalog);\n return newObj;\n }\n DrDocWeb.JsonDecycle = decycle;\n /** Restore an object that was reduced by decycle. Members whose values are objects of the form\r\n {$ref: id}\r\n are replaced with references to the value found by the id. This will\r\n restore cycles. The object will be mutated.\r\n\r\n So,\r\n var s = '{$id:1, members: [{$ref:\"1\"}]';\r\n return retrocycle(JSON.parse(s));\r\n produces an object containing an array which holds the object itself.\r\n */ function retrocycle(obj) {\n var catalog = [];\n findReferences(obj, catalog);\n return resolveReferences(obj, catalog);\n }\n DrDocWeb.JsonRetrocycle = retrocycle;\n})();\n\n});\n\n\nparcelRequire(\"346VI\");\n})();\n//# sourceMappingURL=drdocweb.js.map\n","\r\n//import * as $ from \"./node_modules/jquery/dist/jquery.min.js\";\r\n//import * as $ from \"jquery\";\r\n\r\n//export default \r\nexport default function DrDocWeb() {\r\n\r\n};\r\n\r\nif (window.DrDocWeb !== undefined)\r\n return;\r\n\r\n\r\n\r\n/**\r\n * Convert a string to HTML entities\r\n */\r\nString.prototype.toHtmlEntities = function () {\r\n return this.replace(/./gm, function (s) {\r\n // return \"&#\" + s.charCodeAt(0) + \";\";\r\n return (s.match(/[a-z0-9\\s]+/i)) ? s : \"&#\" + s.charCodeAt(0) + \";\";\r\n });\r\n};\r\n\r\n/**\r\n * Create string from HTML entities\r\n */\r\nString.fromHtmlEntities = function (string) {\r\n return (string + \"\").replace(/&#\\d+;/gm, function (s) {\r\n return String.fromCharCode(s.match(/\\d+/gm)[0]);\r\n })\r\n};\r\n\r\nString.prototype.contains = function (search, start) {\r\n 'use strict';\r\n if (typeof start !== 'number') {\r\n start = 0;\r\n }\r\n\r\n if (start + search.length > this.length) {\r\n return false;\r\n } else {\r\n return this.indexOf(search, start) !== -1;\r\n }\r\n};\r\n\r\nString.prototype.hashCode = function () {\r\n var hash = 0,\r\n i, chr;\r\n if (this.length === 0) return hash;\r\n for (i = 0; i < this.length; i++) {\r\n chr = this.charCodeAt(i);\r\n hash = ((hash << 5) - hash) + chr;\r\n hash |= 0; // Convert to 32bit integer\r\n }\r\n return hash;\r\n};\r\n\r\nconsole.log('DRDOCWEB INIT');\r\n\r\n//module.exports = DrDocWeb\r\n//export default DrDocWeb\r\n//export { DrDocWeb };\r\nwindow.DrDocWeb = DrDocWeb;\r\n\r\nDrDocWeb.ServerHost = document.location.protocol + '//' + document.location.hostname;\r\nDrDocWeb.ServerPort = document.location.port;\r\nDrDocWeb.ServerBase = function () {\r\n return DrDocWeb.ServerHost + (!DrDocWeb.IsNullOrEmpty(DrDocWeb.ServerPort) ? ':' + DrDocWeb.ServerPort : '');\r\n};\r\nDrDocWeb.DefaultError = function (error) {\r\n console.warn(error);\r\n DrDocWeb.ModalError('Fehler!');\r\n};\r\nDrDocWeb.IsMobile = function () {\r\n return window.innerWidth < window.innerHeight && window.innerWidth < 560; //850;\r\n //return window.innerWidth < 800;\r\n};\r\nDrDocWeb.UrlEncode = function (val) {\r\n return encodeURIComponent(typeof val === \"object\" ? DrDocWeb.ObjectToJson(val) : val);\r\n}\r\nDrDocWeb.ObjectToQueryStr = function (obj) {\r\n if (obj === null || obj === undefined)\r\n return '';\r\n if (typeof obj === 'string')\r\n return obj;\r\n var strArr = [];\r\n for (var p in obj) {\r\n if (obj.hasOwnProperty(p)) {\r\n var v = obj[p];\r\n /*strArr.push(encodeURIComponent(p) + \"=\" + encodeURIComponent(typeof v == \"object\" ? JSON.stringify(JsonResolve(v), function(key, value)\r\n {\r\n // => typeof Dataset\r\n // IDataset / Dataset.IsModel(value): $ModelType, $ClassName, Dataset\r\n if (key == 'ModelConfig' || key == 'ModelInfos' || key == 'Dataset') return;\r\n else return value;\r\n }) : v));*/\r\n strArr.push(DrDocWeb.UrlEncode(p) + \"=\" + DrDocWeb.UrlEncode(v));\r\n }\r\n }\r\n var str = strArr.join(\"&\");\r\n //return (str.length == 0 ? '' : '?' + str);\r\n return str;\r\n};\r\nDrDocWeb.QueryStrToObject = function (str) {\r\n let obj = {};\r\n if (str === null || str === undefined) {\r\n return obj;\r\n //return undefined;\r\n }\r\n\r\n if (str.substring(0, 1) === '?') {\r\n str = str.substring(1);\r\n }\r\n let arr = str.split('&');\r\n for (var i in arr) {\r\n let kvp = arr[i].split('=');\r\n if (kvp !== undefined && kvp.length === 2) {\r\n obj[decodeURIComponent(kvp[0])] = decodeURIComponent(kvp[1]);\r\n }\r\n }\r\n return obj;\r\n};\r\nDrDocWeb.GetDataToObject = function () {\r\n return DrDocWeb.QueryStrToObject(window.location.search);\r\n};\r\n/*DrDocWeb.ArrayEquals = function(a, b) {\r\n return Array.isArray(a) &&\r\n Array.isArray(b) &&\r\n a.length === b.length &&\r\n a.every((val, index) => val === b[index]);\r\n};*/\r\n// Sind alle arr1 in arr2 enthalten?\r\nDrDocWeb.ArrayEquals = function (arr1, arr2, caseSensitive) {\r\n if ((arr1 === undefined || arr1 === null || arr1.length == 0) && (arr2 === undefined || arr2 === null || arr2.length == 0)) {\r\n return true;\r\n }\r\n\r\n for (let elem1 of arr1) {\r\n if (elem1 === undefined || elem1 === null || elem1.length == 0)\r\n continue;\r\n //console.log('elem1', elem1);\r\n let found = false;\r\n for (let elem2 of arr2) {\r\n if (elem2 === undefined || elem2 === null || elem2.length == 0)\r\n continue;\r\n\r\n if ((caseSensitive && elem2 === elem1) || (!caseSensitive && elem2.toLowerCase() === elem1.toLowerCase())) {\r\n found = true;\r\n break;\r\n }\r\n }\r\n if (!found)\r\n return false;\r\n }\r\n //console.log('ArrayEquals', arr1, ' === ', arr2);\r\n return true;\r\n};\r\n/*DrDocWeb.ArrayEquals = function(arr1, arr2, caseSensitive)\r\n{\r\n if ((arr1 === undefined || arr1 === null || arr1.length == 0) && (arr2 === undefined || arr2 === null || arr2.length == 0))\r\n {\r\n return true;\r\n }\r\n \t\r\n for (let i in arr1)\r\n {\r\n if ((caseSensitive && arr1[i] !== arr2[i]) || (!caseSensitive && arr1[i].toLowerCase() !== arr2[i].toLowerCase()))\r\n return false;\r\n }\r\n \r\n //console.log('ArrayEquals', arr1, ' === ', arr2);\r\n return true;\r\n};*/\r\n\r\nDrDocWeb.GetArrayItemWhere = function (data, propName, propValue) {\r\n let i = DrDocWeb.GetArrayItemIndexWhere(data, propName, propValue);\r\n if (i >= 0) {\r\n return data[i];\r\n }\r\n return null;\r\n};\r\nDrDocWeb.GetArrayItemIndexWhere = function (data, propName, propValue) {\r\n for (var i = 0; i < data.length; i++) {\r\n if (typeof propName === 'function') {\r\n if (propName(data[i]) === true)\r\n return i;\r\n }\r\n else {\r\n if (data[i][propName] == propValue)\r\n return i;\r\n }\r\n }\r\n return -1;\r\n};\r\nDrDocWeb.ObjGetKeys = function (obj) {\r\n let ret = [];\r\n if (obj != null && obj != undefined) {\r\n for (let x in obj) {\r\n ret.push(x);\r\n }\r\n return ret;\r\n }\r\n};\r\n\r\nDrDocWeb.FormToObject = function (formName, splitter) {\r\n let form = null;\r\n if (typeof formName === 'string')\r\n form = document.forms[formName];\r\n else\r\n form = formName;\r\n\r\n if (form === undefined)\r\n return undefined;\r\n\r\n if (splitter === undefined || splitter === null)\r\n splitter = String.fromCharCode(1);\r\n if (typeof splitter === 'number')\r\n splitter = String.fromCharCode(splitter);\r\n\r\n let data = {};\r\n // $(form).serializeArray();\r\n for (let i = 0; i < form.elements.length; i++) {\r\n let form_elem = form.elements[i];\r\n //if (form_elem.value !== undefined)\r\n\r\n let name = form_elem.name;\r\n if (!DrDocWeb.IsNullOrEmpty(name)) {\r\n //if (pre !== undefined)\r\n //{\r\n // name = pre + name;\r\n //}\r\n\r\n // Wenn ein Element checkable ist, dann nur den aktiven Wert setzen.\r\n let type = form_elem.getAttribute('type');\r\n if (type != undefined && type != null)\r\n type = type.toLowerCase();\r\n let isCheckable = type === 'select' || type === 'radio' || type === 'checkbox';\r\n //console.log('Form: ', name, type, isCheckable);\r\n\r\n //if (!isCheckable || type === 'checkbox' || (isCheckable && form_elem.checked === true))\r\n //if (!isCheckable || (type === 'checkbox' || form_elem.getAttribute('data-has-changed') == 'true'))\r\n //{\r\n let val = '';\r\n if (form_elem.value !== undefined && form_elem.value !== null) {\r\n if (isCheckable)\r\n val = form_elem.checked === true ? form_elem.value : '';\r\n else\r\n val = form_elem.value;\r\n }\r\n\r\n // \r\n /*if (val == '' && type === 'checkbox' && form_elem.getAttribute('data-has-changed') == 'true')\r\n {\r\n val = '!' + form_elem.value;\r\n }*/\r\n if (DrDocWeb.IsNullOrEmpty(val))\r\n val = '';\r\n\r\n if (DrDocWeb.IsNullOrEmpty(val) && form_elem.getAttribute('trim') == 'true') {\r\n continue;\r\n }\r\n\r\n if (DrDocWeb.IsNullOrEmpty(val) && isCheckable) {\r\n continue;\r\n }\r\n\r\n // Falls ein Wert bereits vorhanden ist, dann anfügen.\r\n if (data[name] !== undefined && data[name] !== null) {\r\n if (typeof splitter === 'function')\r\n data[name] = splitter(name, data[name], val);\r\n else if (splitter === 'array')\r\n data[name].push(val);\r\n else\r\n data[name] = data[name] + splitter + val;\r\n }\r\n else {\r\n if (splitter === 'array')\r\n data[name] = [val];\r\n else\r\n data[name] = val;\r\n }\r\n //}\r\n }\r\n else {\r\n //if (form_elem.tagName != 'button')\r\n //console.warn('Form: ELement hat kein Namen-Tttribute!', form_elem);\r\n }\r\n continue;\r\n\r\n\r\n }\r\n\r\n // Am Ende leere Splitter trimmen\r\n\r\n if (typeof splitter !== 'function' && splitter !== 'array') {\r\n for (let fieldName in data) {\r\n let fieldValue = data[fieldName];\r\n if (fieldValue !== undefined && fieldValue !== null && typeof fieldValue === 'string') {\r\n //data[fieldName] = fieldValue.replace(/[\\|]+$/, '');\r\n data[fieldName] = fieldValue.replace(new RegExp('[\\\\' + splitter + ']+$'), '');\r\n }\r\n }\r\n }\r\n\r\n //console.log('Form A', data);\r\n //console.log('Form B', form.elements);\r\n return data;\r\n};\r\n// Holt das nächste Form, welches kein Child von einem Element mit dem Attribut \"data-form-ignore\" ist.\r\nDrDocWeb.GetClosestForm = function (sourceElement) {\r\n //formData = document.querySelector('form [' + attr_name + '=\"' + DrDocWeb.SelectorAttributeEncode(nodeId) + '\"]');\r\n let result = null;\r\n if (sourceElement !== undefined && sourceElement !== null && sourceElement.tagName.toLowerCase() == 'form')\r\n result = sourceElement;\r\n else\r\n result = DrDocWeb.GetElement(sourceElement, 'form:not([data-form-ignore] *)');\r\n //result = DrDocWeb.GetElement(sourceElement, 'form:has(:not([data-ignore]))');\r\n //result = DrDocWeb.GetElement(sourceElement, 'form:not(:has([data-ignore]))');\r\n return result;\r\n};\r\nDrDocWeb.ClosestFormToObject = function (sourceElement, splitter) {\r\n //formData = document.querySelector('form [' + attr_name + '=\"' + DrDocWeb.SelectorAttributeEncode(nodeId) + '\"]');\r\n let result = DrDocWeb.GetClosestForm(sourceElement);\r\n if (result !== undefined && result !== null) {\r\n return DrDocWeb.FormToObject(result, splitter);\r\n }\r\n return undefined;\r\n};\r\nDrDocWeb.ClearClosestForm = function (sourceElement) {\r\n let form = DrDocWeb.GetClosestForm(sourceElement);\r\n if (form !== undefined && form !== null) {\r\n\r\n for (let i = 0; i < form.elements.length; i++) {\r\n let form_elem = form.elements[i];\r\n\r\n let name = form_elem.name;\r\n if (!DrDocWeb.IsNullOrEmpty(name)) {\r\n\r\n // Wenn ein Element checkable ist, dann nur den aktiven Wert setzen.\r\n let type = form_elem.getAttribute('type');\r\n if (type != undefined && type != null)\r\n type = type.toLowerCase();\r\n let isCheckable = type === 'select' || type === 'radio' || type === 'checkbox';\r\n\r\n let val = '';\r\n if (form_elem.value !== undefined && form_elem.value !== null) {\r\n if (isCheckable)\r\n form_elem.checked = null;\r\n else\r\n form_elem.value = '';\r\n }\r\n }\r\n }\r\n }\r\n};\r\n/*DrDocWeb._ClosestFormToObject = function(sourceElement, splitter)\r\n{\r\n let result = undefined;\r\n if (sourceElement.nodeName !== undefined && sourceElement.nodeName.toLowerCase() === 'form')\r\n result = sourceElement;\r\n else\r\n {\r\n result = $(sourceElement).parents('form')[0];\r\n if (result === undefined || result === null)\r\n {\r\n result = $(sourceElement).children('form')[0];\r\n }\r\n }\r\n if (result !== undefined && result !== null)\r\n {\r\n return DrDocWeb.FormToObject(result, splitter);\r\n }\r\n return undefined;\r\n};*/\r\nDrDocWeb.JsonToObjectWalker = function (parentObj, parentProp, refObjList) {\r\n let obj = parentObj[parentProp];\r\n for (var prop in obj) {\r\n let value = obj[prop];\r\n if (prop === '$id') {\r\n refObjList[value] = obj;\r\n delete obj['$id'];\r\n }\r\n else if (prop === '$values') {\r\n DrDocWeb.JsonToObjectWalker(obj, prop, refObjList);\r\n parentObj[parentProp] = value;\r\n }\r\n else if (prop === '$ref') {\r\n parentObj[parentProp] = refObjList[value];\r\n }\r\n else if (typeof value === 'object') {\r\n DrDocWeb.JsonToObjectWalker(obj, prop, refObjList);\r\n }\r\n }\r\n};\r\nDrDocWeb.JsonToObject = function (text) {\r\n if (text == null || text == undefined)\r\n return {};\r\n if (typeof text === 'object')\r\n return text;\r\n if (typeof text !== 'string') {\r\n console.log('DrDocWeb.JsonToObject: Bad format: ', text);\r\n return text;\r\n }\r\n var obj = { _root: JSON.parse(text) };\r\n var refObjList = {};\r\n DrDocWeb.JsonToObjectWalker(obj, '_root', refObjList);\r\n return obj._root;\r\n};\r\nDrDocWeb.ObjectToJson = function (obj) {\r\n if (obj == undefined || obj == null)\r\n return '';\r\n return JSON.stringify(obj);\r\n};\r\nDrDocWeb.CloneCopy = function (obj) {\r\n if (obj == undefined || obj == null)\r\n return obj;\r\n\r\n if (typeof obj === 'string' || typeof obj === 'number')\r\n return obj;\r\n\r\n if (Array.isArray(obj)) {\r\n return obj.slice(0);\r\n }\r\n\r\n if (typeof obj === 'object') {\r\n var arrTmp = {};\r\n Object.assign(arrTmp, obj);\r\n return arrTmp;\r\n }\r\n\r\n console.warn('DrDocWeb.CloneCopy: unknown obj type: ', typeof obj, obj);\r\n return obj;\r\n};\r\nDrDocWeb.CloneCopyTo = function (src, dst, ignorePropsArr) {\r\n for (var i in src) {\r\n if (ignorePropsArr == undefined || ignorePropsArr == null || ignorePropsArr.indexOf(i) === -1) {\r\n dst[i] = src[i];\r\n }\r\n }\r\n};\r\nDrDocWeb.GetRequestUrl = function (url, getData) {\r\n var requestUrl = DrDocWeb.ServerBase();\r\n\r\n // hat die \"url\" schon einen Hostnamen?\r\n // => dann setzen\r\n if (url !== null && url !== undefined) {\r\n if (url.indexOf('http://') === 0 || url.indexOf('https://') === 0)\r\n requestUrl = url;\r\n else if (url.indexOf(requestUrl) === 0)\r\n requestUrl = url;\r\n else {\r\n if (url.indexOf('/') === 0)\r\n requestUrl += url;\r\n else\r\n requestUrl += '/' + url;\r\n }\r\n }\r\n\r\n // GET Parameter in URL übernehmen\r\n if (getData !== null && getData !== undefined) {\r\n requestUrl += (requestUrl.indexOf('?') === -1) ? '?' : '&';\r\n requestUrl += DrDocWeb.ObjectToQueryStr(getData);\r\n }\r\n\r\n return requestUrl;\r\n};\r\n\r\nDrDocWeb.Send = function (method, url, getData, postData, parseAs, sendAs, cookie, retAsync) {\r\n const promiseFn = function (resolve, reject) {\r\n //console.log('DrDocWeb.Send', method, url, getData, postData, parseAs, sendAs);\r\n try {\r\n var requestUrl = DrDocWeb.GetRequestUrl(url, getData);\r\n var request = new XMLHttpRequest();\r\n //try {\r\n\r\n const openRequestFn = function () {\r\n // Asynchron\r\n request.open(method, requestUrl, retAsync === true || retAsync === undefined);\r\n\r\n // Synchron\r\n //request.open(method, requestUrl, false);\r\n\r\n if (!DrDocWeb.IsNullOrEmpty(cookie)) {\r\n request.withCredentials = true;\r\n //request.setRequestHeader('Access-Control-Allow-Origin', '*');\r\n //request.setRequestHeader('Access-Control-Allow-Headers', 'Cookie');\r\n request.setRequestHeader('Cookie', cookie);\r\n //console.log('DrDocWeb.Send ('+requestUrl+'): Cookie: ' + cookie);\r\n }\r\n };\r\n\r\n var processResponse = function (responseObj) {\r\n if (parseAs !== undefined && parseAs !== null && (parseAs.toLowerCase() == 'json' || parseAs.toLowerCase() == 'text/json' || parseAs.toLowerCase() == 'application/json'))\r\n return DrDocWeb.JsonToObject(responseObj.responseText); //JSON.parse(event.target.responseText));\r\n else\r\n return responseObj.responseText;\r\n };\r\n\r\n if (postData !== undefined && !(postData instanceof FormData)) {\r\n // postData instanceof FormData ? 'multipart/form-data; boundary=---------------------------jhdaddsdsfuifdsoufdsohhfdosisfdifsdohifdhfsodia' : \r\n //request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');\r\n }\r\n //request.setRequestHeader('Access-Control-Allow-Origin', '*');\r\n /*request.setRequestHeader('Referer', null);\r\n request.setRequestHeader('Cookie', null);\r\n request.setRequestHeader('Host', null);\r\n request.setRequestHeader('Origin', null);\r\n request.setRequestHeader('User-Agent', null);\r\n \r\n request.removeRequestHeader('Referer');\r\n request.removeRequestHeader('Cookie');\r\n request.removeRequestHeader('Host');\r\n request.removeRequestHeader('Origin');\r\n request.removeRequestHeader('User-Agent');*/\r\n\r\n if (retAsync === true || retAsync === undefined) {\r\n if (resolve !== undefined && resolve !== null) {\r\n request.addEventListener('load', function (event) {\r\n //console.log('DrDocWeb.Send', event, method, url, getData, postData, parseAs, sendAs);\r\n resolve(processResponse(event.target));\r\n });\r\n }\r\n if (reject !== undefined && reject !== null) {\r\n request.addEventListener('timeout', reject);\r\n request.addEventListener('error', reject);\r\n request.addEventListener('abort', reject);\r\n }\r\n }\r\n\r\n // POST Parameter senden\r\n if (postData === undefined) {\r\n openRequestFn();\r\n request.send();\r\n }\r\n else if (postData instanceof FormData || sendAs == 'form') {\r\n\r\n // Progress-Bar\r\n let progressBarId = 'progress-' + DrDocWeb.RandomChars(12);\r\n let progressBarHtml = `\r\n
\r\n
\r\n
\r\n `;\r\n let progressBarModal = DrDocWeb.ModalSecondary('Upload', progressBarHtml);\r\n\r\n let progressbarOnChange = function (e) {\r\n //console.log('Upload Progress (e): ', e);\r\n const percentComplete = e ? ((e.loaded / e.total) * 100) : 0;\r\n //if (e.lengthComputable) {\r\n //console.log('Upload Progress: ', percentComplete);\r\n document.getElementById(progressBarId + '-bar').style.width = percentComplete + '%';\r\n let progressBarElem = document.getElementById(progressBarId);\r\n progressBarElem.setAttribute('aria-valuenow', percentComplete);\r\n //}\r\n };\r\n progressbarOnChange();\r\n request.addEventListener('progress', progressbarOnChange);\r\n if (request.upload !== undefined)\r\n request.upload.onprogress = progressbarOnChange;\r\n request.onprogress = progressbarOnChange;\r\n let progressBarCloseFn = function () {\r\n progressBarModal.hide();\r\n };\r\n request.addEventListener('load', progressBarCloseFn);\r\n request.addEventListener('timeout', progressBarCloseFn);\r\n request.addEventListener('error', progressBarCloseFn);\r\n request.addEventListener('abort', progressBarCloseFn);\r\n\r\n openRequestFn();\r\n request.send(postData);\r\n }\r\n else if (sendAs == 'json' || sendAs == 'text/json' || sendAs == 'application/json') {\r\n openRequestFn();\r\n request.setRequestHeader('Content-Type', 'application/json');\r\n request.send(JSON.stringify(postData));\r\n }\r\n else {\r\n openRequestFn();\r\n request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');\r\n request.send(DrDocWeb.ObjectToQueryStr(postData));\r\n }\r\n\r\n if (retAsync === true || retAsync === undefined) {\r\n // Async\r\n }\r\n else {\r\n //Sync\r\n return processResponse(request);\r\n }\r\n }\r\n catch (err) {\r\n if (reject !== undefined && reject !== null)\r\n reject(err);\r\n else {\r\n console.error(err);\r\n throw err;\r\n }\r\n }\r\n };\r\n\r\n if (retAsync === true || retAsync === undefined)\r\n return new Promise(promiseFn);\r\n else\r\n return promiseFn();\r\n};\r\nDrDocWeb.SendGet = function (url, getData, parseAs) {\r\n return DrDocWeb.Send('GET', url, getData, undefined, parseAs);\r\n};\r\nDrDocWeb.SendPost = function (url, getData, postData, parseAs) {\r\n return DrDocWeb.Send('POST', url, getData, postData, parseAs);\r\n};\r\n\r\nDrDocWeb.RandomChars = function (length) {\r\n return DrDocWeb.Random(length, 'abcdefghijklmnopqrstuvwxyz');\r\n};\r\nDrDocWeb.Random = function (length, characters) {\r\n let result = '';\r\n if (length === undefined)\r\n length = 32;\r\n if (DrDocWeb.IsNullOrEmpty(characters))\r\n characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\r\n let charactersLength = characters.length;\r\n let counter = 0;\r\n while (counter < length) {\r\n result += characters.charAt(Math.floor(Math.random() * charactersLength));\r\n counter += 1;\r\n }\r\n return result;\r\n};\r\n// Checksum\r\nDrDocWeb.ChecksumCyrb53 = function (str, seed = 0) {\r\n let h1 = 0xdeadbeef ^ seed, h2 = 0x41c6ce57 ^ seed;\r\n for (let i = 0, ch; i < str.length; i++) {\r\n ch = str.charCodeAt(i);\r\n h1 = Math.imul(h1 ^ ch, 2654435761);\r\n h2 = Math.imul(h2 ^ ch, 1597334677);\r\n }\r\n h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507);\r\n h1 ^= Math.imul(h2 ^ (h2 >>> 13), 3266489909);\r\n h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507);\r\n h2 ^= Math.imul(h1 ^ (h1 >>> 13), 3266489909);\r\n\r\n return 4294967296 * (2097151 & h2) + (h1 >>> 0);\r\n};\r\n\r\nDrDocWeb.CheckRecursion = function () {\r\n // the name of the calling function \r\n\r\n var fname = DrDocWeb.CheckRecursion.arguments.callee.caller.name;\r\n\r\n\r\n // obtain the stack trace ***not cross browser***\r\n // tested on Firefox\r\n\r\n var err = new Error();\r\n var stack = err.stack.split('\\n');\r\n\r\n\r\n // returns true if the calling function appears more than once\r\n\r\n var i, n, cnt;\r\n n = stack.length;\r\n cnt = 0;\r\n for (i = 0; i < n; i++) {\r\n if (fname == stack[i].substring(0, stack[i].indexOf('@'))) {\r\n cnt++;\r\n if (cnt > 1) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n};\r\n\r\nDrDocWeb.Crud = function (getData) {\r\n return DrDocWeb.SendGet('/model/crud', getData, 'json');\r\n};\r\nDrDocWeb.CrudListen = function (callback) {\r\n /*if (callback != null)\r\n {\r\n callback(null, null);\r\n }*/\r\n\r\n // Dataset.GetData = function (url, paramsObj, successCallback, errorCallback, finallyCallback)\r\n DrDocWeb.SendGet('/node/de/test', { listener: 99 },\r\n (obj) => {\r\n //console.warn('MAIN Load', e.target.responseText);\r\n //console.warn('MAIN Load', e);\r\n //Vue.set(Dataset.Model[obj.$ModelType], Dataset.GetID(obj), obj);\r\n if (callback != null) {\r\n callback(obj, true);\r\n }\r\n //Dataset.ListenState = true;\r\n //Vue.set(Dataset, 'ListenState', true);\r\n DrDocWeb.CrudListen(callback);\r\n },\r\n (obj) => {\r\n //Dataset.ListenState = false;\r\n //Vue.set(Dataset, 'ListenState', false);\r\n // Bei Fehler, nach einigen Sekunden erneut versuchen.\r\n setTimeout(() => { DrDocWeb.CrudListen(callback); }, 1000);\r\n\r\n if (callback != null) {\r\n callback(null, false);\r\n }\r\n\r\n console.warn('MAIN Error', obj, callback, false);\r\n\r\n if (DrDocWeb.DefaultError != null)\r\n DrDocWeb.DefaultError(obj);\r\n });\r\n};\r\n\r\n/*DrDocWeb.DataSelect = function(data, selector)\r\n{\r\n if (data === undefined || data === null)\r\n return [];\r\n \r\n let ret_data = [];\r\n data.forEach(function(itm) {\r\n if (selector === undefined || selector(ret_data) === true)\r\n ret_data.push(itm);\r\n });\r\n return ret_data;\r\n};*/\r\n\r\nDrDocWeb.ParseBool = function (value) {\r\n if (value === undefined || value === null)\r\n return false;\r\n if (typeof value === 'bool' || typeof value === 'boolean')\r\n return value;\r\n if (typeof value === 'string')\r\n return value.toLocaleLowerCase() === 'true' || value === '1';\r\n return false;\r\n};\r\nDrDocWeb.ParseInt = function (value) {\r\n if (value === undefined || value === null || isNaN(value))\r\n return 0;\r\n if (typeof value === 'float')\r\n return value;\r\n if (typeof value === 'number')\r\n return value;\r\n //return +value;\r\n return parseFloat(value);\r\n // parseInt\r\n};\r\nDrDocWeb.ParseDateTime = function (dateStr) {\r\n dateStr = DrDocWeb.ToIsoDateTimeStr(dateStr);\r\n if (dateStr === undefined)\r\n return undefined;\r\n if (!isNaN(dateStr) && (typeof dateStr === 'date' || dateStr instanceof Date))\r\n return dateStr;\r\n return new Date(dateStr);\r\n};\r\nDrDocWeb.ToIsoDateTimeStr = function (dateStr) {\r\n if (DrDocWeb.IsNullOrEmpty(dateStr)) // === undefined || dateStr === null || dateStr.length === 0)\r\n return undefined;\r\n if (!isNaN(dateStr) && (typeof dateStr === 'date' || dateStr instanceof Date))\r\n return dateStr.toISOString();\r\n\r\n // toUTCString\r\n if (typeof dateStr === 'number') {\r\n //console.log('DrDocWeb.ToIsoDateTimeStr: typeof dateStr === number', dateStr, new Date(dateStr * 1000), new Date(dateStr * 1000), new Date(dateStr * 1000 * 100));\r\n return new Date(dateStr).toISOString();\r\n }\r\n\r\n if (typeof dateStr !== 'string') {\r\n console.warn('DrDocWeb.ToIsoDateTimeStr / typeof dateStr !== string / ', typeof dateStr, ' / ', dateStr);\r\n return undefined;\r\n }\r\n\r\n let dateTimeComponents = dateStr.split(' ');\r\n if (dateTimeComponents.length == 2) {\r\n let dateComponents = dateTimeComponents[0].split('.');\r\n let timeComponents = dateTimeComponents[1].split(':');\r\n if (dateComponents.length == 3 && timeComponents.length >= 2)\r\n return dateComponents[2] + '-' + dateComponents[1] + '-' + dateComponents[0] + 'T' + timeComponents[0] + ':' + timeComponents[0];\r\n }\r\n else if (dateTimeComponents.length == 1) {\r\n let dateComponents = dateTimeComponents[0].split('.');\r\n if (dateComponents.length == 3)\r\n return dateComponents[2] + '-' + dateComponents[1] + '-' + dateComponents[0];\r\n //return dateComponents[1];\r\n }\r\n //console.warn('DrDocWeb.ParseDateTime: bad date', dateStr, dateTimeComponents);\r\n return dateStr;\r\n};\r\nDrDocWeb.DateTimeAddMulti = function (dsDate, duration_total_str) {\r\n for (let dauer_str of duration_total_str.split(' ')) {\r\n if (DrDocWeb.IsNullOrEmpty(dauer_str) || dauer_str.length < 2)\r\n continue;\r\n let dauer_unit = dauer_str.substring(dauer_str.length - 1);\r\n let dauer_num = DrDocWeb.ParseInt(dauer_str.substring(0, dauer_str.length - 1));\r\n\r\n dsDate = DrDocWeb.DateTimeAdd(dsDate, dauer_num, dauer_unit);\r\n }\r\n return dsDate;\r\n};\r\nDrDocWeb.DateTimeAdd = function (dt, amount, dateType) {\r\n if (DrDocWeb.IsNullOrEmpty(dt)) {\r\n dt = new Date();\r\n }\r\n else if (typeof dt === 'date' || dt instanceof Date) {\r\n\r\n }\r\n else {\r\n dt = DrDocWeb.ParseDateTime(dt);\r\n }\r\n\r\n switch (dateType.toUpperCase()) {\r\n case 'T':\r\n case 'D':\r\n case 'DAY':\r\n case 'DAYS':\r\n return dt.setDate(dt.getDate() + amount) && dt;\r\n case 'W':\r\n case 'WEEK':\r\n case 'WEEKS':\r\n return dt.setDate(dt.getDate() + (7 * amount)) && dt;\r\n case 'M':\r\n case 'MONTH':\r\n case 'MONTHS':\r\n return dt.setMonth(dt.getMonth() + amount) && dt;\r\n case 'Y':\r\n case 'J':\r\n case 'YEAR':\r\n case 'YEARS':\r\n return dt.setFullYear(dt.getFullYear() + amount) && dt;\r\n default:\r\n console.warn('DrDocWeb.DateTimeAdd: bad date unit: ', dateType);\r\n break;\r\n }\r\n};\r\n\r\nDrDocWeb.EventFire = function (el, eventName, fn) {\r\n var doc = !el ? document : (el.ownerDocument || document);\r\n //console.log('Fire Event', eventName, el);\r\n if (!DrDocWeb.IsNullOrEmpty(eventName) && eventName.substring(0, 2) == 'on') {\r\n //console.log('DrDocWeb.EventFire: mod: ', eventName, ' -> ', eventName.substring(2));\r\n eventName = eventName.substring(2);\r\n }\r\n\r\n var evObj = null;\r\n if (document.createEvent) {\r\n evObj = doc.createEvent('Events'); // HTMLEvents\r\n // initEvent(type, bubbles, cancelable)\r\n evObj.initEvent(eventName, true, true); //false);\r\n }\r\n else {\r\n evObj = doc.createEventObject();\r\n evObj.eventType = eventName;\r\n }\r\n\r\n if (fn !== undefined && fn !== null && typeof fn === 'function') {\r\n try {\r\n fn(evObj);\r\n }\r\n catch (ex) {\r\n console.warn('DrDocWeb.EventFire: ', el, eventName, ex);\r\n }\r\n }\r\n\r\n if (document.createEvent) {\r\n doc.dispatchEvent(evObj);\r\n }\r\n else {\r\n //if (doc.fireEvent)\r\n //doc.fireEvent('on' + eventName);\r\n doc.fireEvent('on' + evObj.eventType, evObj);\r\n }\r\n\r\n};\r\n\r\n// --\r\n// DOM\r\n\r\n// Suche nach:\r\n// - DrDocWeb.GetParentNode\r\n// - DrDocWeb.FindChildElement\r\n// - DrDocWeb.FindChildElements\r\n// - DrDocWeb.SelectLastElementById\r\nDrDocWeb.GetElement = function (sourceElement, selector, first) {\r\n if (sourceElement === undefined || sourceElement === null)\r\n sourceElement = document;\r\n try {\r\n if (typeof sourceElement === 'string')\r\n sourceElement = document.querySelectorAll(sourceElement);\r\n }\r\n catch {\r\n console.warn('DrDocWeb.GetElement: Bad sourceElement', sourceElement, selector);\r\n sourceElement = document;\r\n }\r\n\r\n if (!selector.contains(' ') && !selector.contains('-') && !selector.contains(':') && !selector.contains('[')) {\r\n //console.log('DrDocWeb.GetElement: is TagName: ', selector, sourceElement.tagName, sourceElement);\r\n if (!DrDocWeb.IsNullOrEmpty(sourceElement.tagName) && sourceElement.tagName.toLowerCase() == selector.toLowerCase()) {\r\n console.log('DrDocWeb.GetElement: sourceElement.tagName.toLowerCase() == selector.toLowerCase(): ', sourceElement);\r\n return sourceElement;\r\n }\r\n }\r\n\r\n if (!selector.contains(' ') && selector.indexOf('[') === 0 && selector.indexOf(']') === selector.length - 1) {\r\n let attrName = selector.substring(1, selector.length - 1);\r\n //console.log('DrDocWeb.GetElement: is Attribute: ', selector, sourceElement.tagName, attrName, sourceElement);\r\n if (sourceElement.hasAttribute(attrName)) {\r\n console.log('DrDocWeb.GetElement: Attr: ', attrName, sourceElement.getAttribute(attrName), sourceElement);\r\n return sourceElement;\r\n }\r\n }\r\n\r\n let result = sourceElement.querySelectorAll(selector);\r\n if (result !== undefined && result !== null && result.length == 1) {\r\n //if (result.length > 1)\r\n //console.log('DrDocWeb.GetElement: Element wurde mehrfach gefunden! ', selector, sourceElement);\r\n return result[0];\r\n }\r\n\r\n let elems = DrDocWeb.GetElements(sourceElement, selector);\r\n if (elems === undefined || elems === null || elems.length == 0)\r\n return undefined;\r\n if (first === undefined && elems.length > 1) {\r\n console.warn('DrDocWeb.GetElement: Element wurde mehrfach gefunden! Selector: ', selector, 'Elements: ', elems, 'Source: ', sourceElement);\r\n }\r\n if (first === true)\r\n return elems[0];\r\n if (first === true)\r\n return elems[elems.length - 1];\r\n else //if (first === null)\r\n return elems[elems.length - 1];\r\n};\r\nDrDocWeb.GetElements = function (sourceElement, selector) {\r\n if (sourceElement === undefined || sourceElement === null)\r\n sourceElement = document;\r\n\r\n let result = null;\r\n result = DrDocWeb.GetChildElements(sourceElement, selector);\r\n if (result !== undefined && result !== null && result.length > 0) {\r\n return result;\r\n }\r\n\r\n result = DrDocWeb.GetParentElements(sourceElement, selector);\r\n if (result !== undefined && result !== null && result.length > 0) {\r\n return result;\r\n }\r\n return [];\r\n};\r\nDrDocWeb.GetParentElements = function (sourceElement, selector) {\r\n if (sourceElement === undefined || sourceElement === null)\r\n sourceElement = document;\r\n while (sourceElement !== undefined && sourceElement !== null) {\r\n let result = sourceElement.querySelectorAll(selector);\r\n if (result !== undefined && result !== null && result.length > 0) {\r\n return result;\r\n //return result;\r\n }\r\n sourceElement = sourceElement.parentNode;\r\n }\r\n return undefined;\r\n};\r\nDrDocWeb.GetChildElements = function (sourceElement, selector) {\r\n if (sourceElement === undefined || sourceElement === null)\r\n sourceElement = document;\r\n\r\n /*for (let i in sourceElement.childNodes)\r\n {\r\n\r\n }*/\r\n return sourceElement.querySelectorAll(selector);\r\n};\r\n\r\n/*DrDocWeb._GetParentNode = function(sourceElement, compare)\r\n{\r\n if (compare === undefined || typeof compare !== 'function')\r\n return undefined;\r\n if (sourceElement === undefined)\r\n sourceElement = document;\r\n\r\n while (sourceElement !== undefined && sourceElement !== null)\r\n {\r\n let result = compare(sourceElement);\r\n if (result !== undefined && result !== null && result !== false)\r\n {\r\n return sourceElement;\r\n //return result;\r\n }\r\n sourceElement = sourceElement.parentNode;\r\n }\r\n return undefined;\r\n};*/\r\n/*DrDocWeb._SelectLastElementById = function(id)\r\n{\r\n var elems = document.querySelectorAll('#' + id);\r\n if (elems === undefined)\r\n return undefined;\r\n return elems[elems.length-1];\r\n};*/\r\nDrDocWeb.FindChildElement = function (element, attr_name, attr_value, attr_comparer) {\r\n if (element === null || element === undefined || element.nodeName == '#text' || element.nodeName == '#comment')\r\n return undefined;\r\n if (attr_value === null || attr_value === undefined)\r\n return undefined;\r\n\r\n if (typeof element.getAttribute === 'function') {\r\n let elem_attr_val = element.getAttribute(attr_name);\r\n if (elem_attr_val !== undefined && elem_attr_val !== null && elem_attr_val.length > 0) {\r\n if (attr_comparer !== undefined && attr_comparer(elem_attr_val, attr_value) === true)\r\n return element;\r\n if (attr_comparer === undefined && elem_attr_val == attr_value)\r\n return element;\r\n }\r\n }\r\n\r\n for (var i in element.childNodes) {\r\n let sub = DrDocWeb.FindChildElement(element.childNodes[i], attr_name, attr_value, attr_comparer);\r\n if (sub != null)\r\n return sub;\r\n }\r\n return undefined;\r\n};\r\nDrDocWeb.FindChildElements = function (element, attr_name, attr_value, attr_comparer) {\r\n if (element === null || element === undefined || element.nodeName == '#text' || element.nodeName == '#comment')\r\n return undefined;\r\n if (attr_value === null || attr_value === undefined)\r\n return undefined;\r\n\r\n let list = [];\r\n\r\n if (typeof element.getAttribute === 'function') {\r\n let elem_attr_val = element.getAttribute(attr_name);\r\n if (elem_attr_val !== undefined && elem_attr_val !== null && elem_attr_val.length > 0) {\r\n if (attr_comparer !== undefined && attr_comparer(elem_attr_val, attr_value) === true)\r\n list = [element];\r\n if (attr_comparer === undefined && elem_attr_val == attr_value)\r\n list = [element];\r\n }\r\n }\r\n\r\n for (var i in element.childNodes) {\r\n let sub = DrDocWeb.FindChildElements(element.childNodes[i], attr_name, attr_value, attr_comparer);\r\n if (sub !== undefined && sub !== null && sub.length > 0) {\r\n //if (list === undefined)\r\n // list = sub;\r\n //else\r\n //{\r\n //list.push(...sub);\r\n for (let sub_i in sub) {\r\n list.push(sub[sub_i]);\r\n }\r\n //}\r\n };\r\n }\r\n return list;\r\n};\r\n\r\n\r\nDrDocWeb.setInnerHTML = function (elm, html, callback) {\r\n var doc = (elm.ownerDocument || document);\r\n try {\r\n if (!DrDocWeb.IsNullOrEmpty(html) && html.indexOf('<') == -1 && html.indexOf('>') == -1) // && html.indexOf('\\n') == -1)\r\n elm.innerText = html;\r\n else\r\n elm.innerHTML = html;\r\n Array.from(elm.querySelectorAll(\"script\")).forEach(oldScript => {\r\n const newScript = doc.createElement(\"script\");\r\n Array.from(oldScript.attributes)\r\n .forEach(attr => newScript.setAttribute(attr.name, attr.value));\r\n newScript.appendChild(doc.createTextNode(oldScript.innerHTML));\r\n if (callback != undefined) {\r\n newScript.onload = callback;\r\n newScript.onreadystatechange = function () {\r\n if (this.readyState == 'complete') {\r\n callback();\r\n }\r\n }\r\n }\r\n oldScript.parentNode.replaceChild(newScript, oldScript);\r\n });\r\n }\r\n catch (ex) {\r\n console.warn('DrDocWeb.setInnerHTML: HTML konnte nicht geparst werden', html, elem, ex);\r\n }\r\n};\r\n\r\nDrDocWeb.IframeAutosize = function (iframe, selector, lastWidth, lastHeight, maxWidthStr, maxHeightStr) {\r\n if (iframe != undefined && iframe != null) {\r\n if (iframe.contentWindow != undefined && iframe.contentWindow != null && iframe.contentWindow.document != undefined && iframe.contentWindow.document != null) {\r\n //console.log('DrDocWeb.IframeAutosize: SetSize (1): ', iframe.contentWindow.document.readyState);\r\n\r\n // Erneut ausführen, bis das Dokument geladen ist\r\n if (iframe.contentWindow.document.readyState !== 'complete') {\r\n //console.log('DrDocWeb.IframeAutosize: iframe.contentWindow.document.readyState: ', iframe.contentWindow.document.readyState);\r\n setTimeout(function () {\r\n DrDocWeb.IframeAutosize(iframe, selector, lastWidth, lastHeight, maxWidthStr, maxHeightStr);\r\n }, 200);\r\n //DrDocWeb.IframeAutosize(iframe, selector);\r\n return;\r\n }\r\n\r\n if (lastWidth == undefined || lastWidth === null) {\r\n iframe.width = '100%';\r\n }\r\n //iframe.height = '400px';\r\n //iframe.style.width = '100%';\r\n //iframe.style.width = '100px';\r\n //iframe.style.height = '1000px';\r\n\r\n let doc = iframe.contentWindow.document;\r\n\r\n let maxW = 0;\r\n let maxH = 0; //iframe.height;\r\n if (doc.body != undefined && doc.body != null) {\r\n if (doc.body.scrollWidth != undefined)\r\n maxW = Math.max(maxW, doc.body.scrollWidth);\r\n if (doc.body.scrollHeight != undefined)\r\n maxH = Math.max(maxH, doc.body.scrollHeight);\r\n }\r\n if (!DrDocWeb.IsNullOrEmpty(selector)) {\r\n let selectorElemArr = doc.querySelectorAll(selector);\r\n //console.log('DrDocWeb.IframeAutosize: selector: ', selector, selectorElem);\r\n if (selectorElemArr != undefined && selectorElemArr != null) {\r\n selectorElemArr.forEach(function (selectorElem) {\r\n if (selectorElem != undefined && selectorElem != null) {\r\n //if (selectorElem.width != undefined)\r\n // maxW = Math.max(maxW, selectorElem.width);\r\n if (selectorElem.scrollWidth != undefined)\r\n maxW = Math.max(maxW, selectorElem.scrollWidth);\r\n //if (selectorElem.height != undefined)\r\n // maxH = Math.max(maxH, selectorElem.height);\r\n if (selectorElem.scrollHeight != undefined)\r\n maxH = Math.max(maxH, selectorElem.scrollHeight);\r\n }\r\n });\r\n }\r\n //console.log('DrDocWeb.IframeAutosize: Size: ', maxW, ' x ', maxH);\r\n }\r\n if (doc.documentElement != undefined && doc.documentElement != null) {\r\n if (doc.documentElement.scrollWidth != undefined)\r\n maxW = Math.max(maxW, doc.documentElement.scrollWidth);\r\n if (doc.documentElement.scrollHeight != undefined)\r\n maxH = Math.max(maxH, doc.documentElement.scrollHeight);\r\n }\r\n /*if (iframe.contentWindow.width != undefined)\r\n maxW = Math.max(maxW, iframe.contentWindow.width);\r\n if (iframe.contentWindow.height != undefined)\r\n maxH = Math.max(maxH, iframe.contentWindow.height);*/\r\n\r\n //console.log('DrDocWeb.IframeAutosize: SetSize (2): ', iframe.src, maxH, doc.body.scrollHeight, doc.documentElement.scrollHeight, iframe.contentWindow.height); //, doc);\r\n\r\n /*if (maxH > 150) {\r\n //iframe.width = maxW + 'px';\r\n iframe.height = maxH + 'px';\r\n\r\n // Wenn auch Inhalte bereits geladen wurden, nur alle 5 Sek. Größe erneut anpassen\r\n setTimeout(function () {\r\n DrDocWeb.IframeAutosize(iframe, selector, false);\r\n }, 5000);\r\n }\r\n else {\r\n // Wenn auch Inhalte noch nicht geladen wurden, alle 0,2 Sek. Größe erneut anpassen\r\n setTimeout(function () {\r\n DrDocWeb.IframeAutosize(iframe, selector, false);\r\n }, 1000);\r\n }*/\r\n // Wenn auch Inhalte noch nicht geladen wurden, alle 0,2 Sek. Größe erneut anpassen\r\n setTimeout(function () {\r\n DrDocWeb.IframeAutosize(iframe, selector, maxW, maxH, maxWidthStr, maxHeightStr);\r\n }, 1000);\r\n\r\n //console.log('DrDocWeb.IframeAutosize: Size: Neu: ', maxW, ' x ', maxH, ' / alt: ', lastWidth, ' x ', lastHeight, ' / max: ', maxWidthStr, 'x', maxHeightStr);\r\n\r\n if (lastWidth == undefined || maxW > lastWidth + 150) {\r\n iframe.style.width = (maxW + 0) + 'px';\r\n if (!DrDocWeb.IsNullOrEmpty(maxWidthStr))\r\n iframe.style.maxWidth = maxWidthStr;\r\n else\r\n iframe.style.maxWidth = (maxW + 0) + 'px';\r\n }\r\n\r\n if (lastHeight == undefined || maxH > lastHeight + 150) {\r\n iframe.style.height = (maxH + 0) + 'px';\r\n if (!DrDocWeb.IsNullOrEmpty(maxHeightStr))\r\n iframe.style.maxHeight = maxHeightStr;\r\n else\r\n iframe.style.maxHeight = (maxH + 0) + 'px';\r\n }\r\n\r\n iframe.contentWindow.document.documentElement.style.overflow = 'hidden';\r\n }\r\n else {\r\n //console.log('DrDocWeb.IframeAutosize: Init (0): ', iframe.src);\r\n\r\n if (iframe._hasLoadEvent === true)\r\n return;\r\n iframe._hasLoadEvent = true;\r\n\r\n iframe.addEventListener('load', function (e) {\r\n //console.log('DrDocWeb.IframeAutosize: onLoad (1, root): ', iframe.src);\r\n\r\n DrDocWeb.IframeAutosize(iframe, selector, lastWidth, lastHeight, maxWidthStr, maxHeightStr);\r\n });\r\n }\r\n }\r\n else {\r\n //console.log('DrDocWeb.IframeAutosize: iframe == null');\r\n }\r\n};\r\n\r\nDrDocWeb.FindLeftWindowBoundry = function (wnd) {\r\n // In Internet Explorer window.screenLeft is the window's left boundry\r\n if (wnd.screenLeft) {\r\n return wnd.screenLeft;\r\n }\r\n\r\n // In Firefox window.screenX is the window's left boundry\r\n if (wnd.screenX)\r\n return wnd.screenX;\r\n\r\n return 0;\r\n};\r\nDrDocWeb.FindTopWindowBoundry = function (wnd) {\r\n // In Internet Explorer window.screenLeft is the window's left boundry\r\n if (wnd.screenTop) {\r\n return wnd.screenTop;\r\n }\r\n\r\n // In Firefox window.screenX is the window's left boundry\r\n if (wnd.screenY)\r\n return wnd.screenY;\r\n\r\n return 0;\r\n}\r\n\r\n// // Find Left Boundry of the Screen/Monitor\r\nDrDocWeb.FindLeftScreenBoundry = function (wnd) {\r\n let left = DrDocWeb.FindLeftWindowBoundry(wnd);\r\n\r\n // Check if the window is off the primary monitor in a positive axis\r\n // X,Y X,Y S = Screen, W = Window\r\n // 0,0 ---------- 1280,0 ----------\r\n // | | | --- |\r\n // | | | | W | |\r\n // | S | | --- S |\r\n // ---------- ----------\r\n if (left > wnd.screen.width) {\r\n return left - (left - wnd.screen.width);\r\n }\r\n\r\n // Check if the window is off the primary monitor in a negative axis\r\n // X,Y X,Y S = Screen, W = Window\r\n // 0,0 ---------- -1280,0 ----------\r\n // | | | --- |\r\n // | | | | W | |\r\n // | S | | --- S |\r\n // ---------- ----------\r\n // This only works in Firefox at the moment due to a bug in Internet Explorer opening new windows into a negative axis\r\n // However, you can move opened windows into a negative axis as a workaround\r\n if (left < 0 && left > (wnd.screen.width * -1)) {\r\n return (wnd.screen.width * -1);\r\n }\r\n\r\n // If neither of the above, the monitor is on the primary monitor whose's screen X should be 0\r\n return 0;\r\n};\r\n\r\nDrDocWeb.FindTopScreenBoundry = function (wnd) {\r\n let top = DrDocWeb.FindTopWindowBoundry(wnd);\r\n\r\n if (top > wnd.screen.height) {\r\n return top - (top - wnd.screen.height);\r\n }\r\n\r\n if (top < 0 && top > (wnd.screen.height * -1)) {\r\n return (wnd.screen.height * -1);\r\n }\r\n\r\n return 0;\r\n};\r\n\r\nDrDocWeb.ObjectForEachSorted = function (obj, action) {\r\n var keys = Object.keys(obj);\r\n var len = keys.length;\r\n\r\n keys.sort();\r\n\r\n for (i = 0; i < len; i++) {\r\n action(keys[i], obj[keys[i]]);\r\n }\r\n};\r\n\r\n// --\r\n// Cookie Funktionen\r\n\r\nDrDocWeb.SetCookie = function (cname, cvalue, exdays, path) {\r\n const d = new Date();\r\n d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000));\r\n let expires = \"Expires=\" + d.toUTCString();\r\n //console.log('DrDocWeb.SetCookie(' + cname + ', ' + cvalue + ')', '\\r\\n', document.cookie);\r\n document.cookie = DrDocWeb.UrlEncode(cname) + \"=\" + DrDocWeb.UrlEncode(cvalue) + \"; \" + expires + \"; Path=\" + (!DrDocWeb.IsNullOrEmpty(path) ? path : '/') + \"; SameSite=Lax;\"; //SameSite=None;\"; //samesite=lax;\"; // SameSite=Lax;\"; //SameSite=None; Secure\";\r\n};\r\nDrDocWeb.GetCookie = function (cname, defaultValue) {\r\n let name = DrDocWeb.UrlEncode(cname) + \"=\";\r\n let ret = '';\r\n //let decodedCookie = document.cookie);\r\n if (document.cookie) //!DrDocWeb.IsNullOrEmpty())\r\n {\r\n let ca = document.cookie.split(';');\r\n for (let i = 0; i < ca.length; i++) {\r\n let c = ca[i];\r\n while (c.charAt(0) == ' ') {\r\n c = c.substring(1);\r\n }\r\n if (c.indexOf(name) === 0) {\r\n ret = decodeURIComponent(c.substring(name.length, c.length));\r\n //console.log('Cookie gefunden! ', name);\r\n break;\r\n }\r\n else {\r\n //console.log('Cookie NICHT gefunden! ', c, \"\\r\\n\", name);\r\n }\r\n }\r\n //console.log('Cookie... ', ca);\r\n }\r\n if (defaultValue === undefined)\r\n defaultValue = '';\r\n //console.log('DrDocWeb.GetCookie(' + cname + ', ' + defaultValue + ') = ', ret, '\\r\\n', document.cookie);\r\n return DrDocWeb.IsNullOrEmpty(ret) ? defaultValue : ret;\r\n};\r\nDrDocWeb.GetCookiePrefix = function (namePrefix) {\r\n //let name = DrDocWeb.UrlEncode(cname) + \"=\";\r\n\r\n let ret = [];\r\n\r\n //let decodedCookie = document.cookie);\r\n if (document.cookie) //!DrDocWeb.IsNullOrEmpty())\r\n {\r\n let ca = document.cookie.split(';');\r\n for (let i = 0; i < ca.length; i++) {\r\n let c = ca[i];\r\n while (c.charAt(0) == ' ') {\r\n c = c.substring(1);\r\n }\r\n let iOfEq = c.indexOf('=');\r\n if (iOfEq < 0)\r\n continue;\r\n let name = c.substring(0, iOfEq);\r\n if (name.indexOf(namePrefix) === 0) {\r\n let value = decodeURIComponent(c.substring(iOfEq + 1));\r\n console.log('DrDocWeb.GetCookiePrefix: Cookie gefunden! ', name, '|', value, '|');\r\n ret.push({\r\n name: name,\r\n value: value\r\n });\r\n }\r\n else {\r\n //console.log('Cookie NICHT gefunden! ', c, \"\\r\\n\", name);\r\n }\r\n }\r\n //console.log('Cookie... ', ca);\r\n }\r\n\r\n //console.log('DrDocWeb.GetCookie(' + cname + ', ' + defaultValue + ') = ', ret, '\\r\\n', document.cookie);\r\n return ret;\r\n};\r\n\r\n// ---\r\n// Tree-View\r\n// Root Element (UL): .tree\r\n// Item Element (LI): .tree-item (ggf.: .tree-item-action)\r\n// Item Element Container (UL): (ggf.: .tree-sub .tree-active)\r\n\r\nDrDocWeb.TreeView = function () {\r\n //console.log('DrDocWeb.TreeView: init');\r\n\r\n var treeRootElemArr = document.querySelectorAll(\".tree\");\r\n if (treeRootElemArr != undefined && treeRootElemArr != null && treeRootElemArr.length > 0) {\r\n for (let i = 0; i < treeRootElemArr.length; i++) {\r\n DrDocWeb.TreeViewIntern(treeRootElemArr[i]);\r\n }\r\n }\r\n};\r\n\r\nDrDocWeb.TreeViewIntern = function (treeRootElem) {\r\n /*if (treeRootElem._tree_initialized === true)\r\n {\r\n console.log('DrDocWeb.TreeViewIntern (bereits initialisiert): ', treeRootElem);\r\n return;\r\n }\r\n treeRootElem._tree_initialized = true;\r\n console.log('DrDocWeb.TreeViewIntern: init', treeRootElem);*/\r\n\r\n var treeToggler = treeRootElem.querySelectorAll(\".tree-item\");\r\n //console.log('DrDocWeb.TreeViewIntern: .tree-item\"*: ', treeToggler, '/', treeRootElem);\r\n\r\n if (treeToggler == undefined || treeToggler == null || treeToggler.length == 0) {\r\n treeToggler = treeRootElem.childNodes;\r\n //console.log('DrDocWeb.TreeViewIntern: >*: ', treeToggler, '/', treeRootElem);\r\n if (treeToggler != undefined && treeToggler != null && treeToggler.length > 0) {\r\n for (let i = 0; i < treeToggler.length; i++) {\r\n let liElem = treeToggler[i];\r\n if (!liElem.classList)\r\n continue;\r\n liElem.classList.add('tree-item');\r\n\r\n let ulElem = liElem.querySelector(\"ul\");\r\n if (ulElem) {\r\n ulElem.classList.add('tree-sub');\r\n //ulElem.classList.add('tree-active');\r\n\r\n //DrDocWeb.TreeViewIntern(ulElem);\r\n }\r\n }\r\n }\r\n }\r\n\r\n treeToggler = treeRootElem.querySelectorAll(\".tree-item\");\r\n if (treeToggler != undefined && treeToggler != null && treeToggler.length > 0) {\r\n //console.log('DrDocWeb.TreeViewIntern: ', treeToggler);\r\n\r\n let updateTreeElem = function (liElem) {\r\n //liElem.classList.add(\"tree-caret-item\");\r\n let ulElem = liElem.querySelector(\".tree-sub\");\r\n // wenn kein .tree-sub gefunden wurde, das erste \"ul\" finden\r\n if (ulElem == null || ulElem == undefined) {\r\n ulElem = liElem.querySelector(\"ul\");\r\n if (ulElem)\r\n ulElem.classList.add('tree-sub');\r\n }\r\n //if (ulElem == null || ulElem == undefined)\r\n // ulElem = liElem.querySelector(\"*\");\r\n if (ulElem) {\r\n if (ulElem.classList.contains('tree-active'))\r\n liElem.classList.add(\"tree-caret-down\");\r\n else\r\n liElem.classList.remove(\"tree-caret-down\");\r\n }\r\n else {\r\n //console.log('DrDocWeb.TreeViewIntern: updateTreeElem: tree elem kann ul sub nicht finden: updateTreeElem: ', liElem);\r\n }\r\n };\r\n for (let i = 0; i < treeToggler.length; i++) {\r\n let liElem = treeToggler[i];\r\n if (!liElem.classList)\r\n continue;\r\n updateTreeElem(liElem);\r\n //console.log('Tree, LI: ', liElem.firstChild, liElem.querySelector(\"*\"), liElem.querySelector(\"span\"), liElem.childNodes[0]);\r\n let onClick = function (e) {\r\n //let liElem = treeToggler[i]; //DrDocWeb.GetElement(liElem, 'li', true);\r\n\r\n // nur Event ausführen, wenn das OnClick Target passt: als das selbe Element oder ein direktes Child ist\r\n if (e.target !== liElem && e.target.parentNode !== liElem && !e.target.classList.contains('tree-item-action')) {\r\n console.log('DrDocWeb.TreeViewIntern: onClick: e.target !== liElem, ', e, e.target, liElem);\r\n return;\r\n }\r\n //console.log('DrDocWeb.TreeViewIntern: onClick: ', liElem);\r\n\r\n //let ulElem = DrDocWeb.GetElement(liElem, 'ul', true);\r\n let ulElem = liElem.querySelector(\".tree-sub\");\r\n /*if (ulElem == null || ulElem == undefined)\r\n {\r\n ulElem = liElem.querySelector(\"ul\");\r\n if (ulElem)\r\n ulElem.classList.add('tree-sub');\r\n }*/\r\n //if (ulElem == null || ulElem == undefined)\r\n // ulElem = liElem.querySelector(\"*\");\r\n if (ulElem) {\r\n ulElem.classList.toggle(\"tree-active\");\r\n }\r\n else {\r\n //console.log('DrDocWeb.TreeViewIntern: onClick: tree elem kann ul sub nicht finden: ', e.target, liElem, liElem);\r\n }\r\n updateTreeElem(liElem);\r\n };\r\n //liElem.addEventListener(\"click\", onClick);\r\n let actionElem = null;\r\n if (actionElem == null || actionElem == undefined)\r\n actionElem = liElem.querySelector(\".tree-item-action\");\r\n //if (actionElem == null || actionElem == undefined)\r\n // actionElem = liElem.querySelector(\"li\");\r\n //if (actionElem == null || actionElem == undefined)\r\n // actionElem = liElem.querySelector(\"*\");\r\n if (actionElem == null || actionElem == undefined) {\r\n // Trigger für Action darf nicht direkt das \"li\"-Element sein, sonst wird beim Click alle darunter sgeschlossen\r\n actionElem = liElem;\r\n }\r\n if (actionElem != undefined && actionElem != null) {\r\n if (actionElem.__tree_onClick != undefined) {\r\n actionElem.removeEventListener(\"click\", actionElem.__tree_onClick);\r\n actionElem.removeEventListener(\"click\", actionElem.__tree_onClick, true);\r\n actionElem.removeEventListener(\"click\", actionElem.__tree_onClick, false);\r\n }\r\n actionElem.__tree_onClick = onClick;\r\n actionElem.addEventListener(\"click\", onClick, false);\r\n }\r\n else {\r\n console.log('DrDocWeb.TreeViewIntern: no action Element found: ', liElem, actionElem);\r\n }\r\n }\r\n }\r\n};\r\n\r\n// ---\r\n\r\nDrDocWeb.SelectorAttributeEncode = function (str) {\r\n return str.replace(/[\"\\\\]/g, '\\\\$&');\r\n};\r\n\r\n// ---\r\n\r\nDrDocWeb.DataGroup = function (data, selector_arr, emptyKeyValue, selector_i) {\r\n if (selector_i === undefined || selector_i < 0)\r\n selector_i = 0;\r\n if (selector_i >= selector_arr.length)\r\n return undefined;\r\n\r\n let ret_data = {};\r\n if (data !== undefined && data !== null) {\r\n //data.forEach(function (itm) {\r\n for (let data_key in data) {\r\n let itm = data[data_key];\r\n let key = selector_arr[selector_i](itm);\r\n let key_arr = null;\r\n\r\n // \"itm\" in \"ret_data\" einsortieren\r\n // Wenn key ein Array ist, für jedes Element einzeln einsortieren\r\n if (key != undefined && key != null && Array.isArray(key)) {\r\n if (key.length === 0)\r\n key_arr = [''];\r\n else\r\n key_arr = key;\r\n //console.log('DrDocWeb.DataGroup: arr: ', key_arr);\r\n }\r\n else {\r\n key_arr = [key];\r\n }\r\n\r\n for (let key_itm of key_arr) {\r\n // Default Key setzen, falls leer\r\n if (DrDocWeb.IsNullOrEmpty(key_itm) && !DrDocWeb.IsNullOrEmpty(emptyKeyValue)) {\r\n key_itm = emptyKeyValue;\r\n }\r\n if (ret_data[key_itm] === undefined) {\r\n ret_data[key_itm] = [];\r\n }\r\n //console.log('DrDocWeb.DataGroup: key_arr: ', key_itm, ': ', ret_data[key_itm]);\r\n\r\n if (ret_data[key_itm].indexOf(itm) === -1)\r\n ret_data[key_itm].push(itm);\r\n }\r\n }\r\n if (selector_i + 1 < selector_arr.length) {\r\n for (let key in ret_data) {\r\n ret_data[key] = DrDocWeb.DataGroup(ret_data[key], selector_arr, emptyKeyValue, selector_i + 1);\r\n }\r\n }\r\n }\r\n //console.log('DrDocWeb.DataGroup: ', ret_data);\r\n return ret_data;\r\n};\r\n\r\n// ---\r\n\r\n// KVP / Key-Value-Pair\r\n// DrDocWeb.kvp_get(this, 'rootNamespace-1', 'search', 'field_')\r\n// DrDocWeb.kvp_get(sourceElement, 'rootNamespace-1', 'search', 'field_', searchData, true);\r\n// data-kvp-namespace=\"rootNamespace-1\" data-kvp-key=\"Feld1\" data-kvp-search=\"Test GmbH\" data-kvp-value2=\"Test\"\r\n// => { 'field_Feld1': 'Test GmbH', field_value2: 'Test' }\r\nDrDocWeb.KVP_ATTR = 'data-kvp';\r\nDrDocWeb.KVP_ATTR_NAMESPACE = DrDocWeb.KVP_ATTR + '-namespace';\r\nDrDocWeb.KVP_ATTR_KEY = DrDocWeb.KVP_ATTR + '-key';\r\nDrDocWeb.KVP_ATTR_VALUE = DrDocWeb.KVP_ATTR + '-value';\r\n\r\nDrDocWeb.kvp_get = function (sourceElement, rootNamespace, valueName, returnKeyPrefix, obj, strictParentHierarchy) {\r\n if (sourceElement == undefined || sourceElement == null)\r\n return;\r\n\r\n if (DrDocWeb.IsNullOrEmpty(valueName))\r\n valueName = 'value';\r\n if (DrDocWeb.IsNullOrEmpty(returnKeyPrefix))\r\n returnKeyPrefix = '';\r\n if (obj == undefined || obj == null)\r\n obj = {};\r\n\r\n //var rootElement = DrDocWeb.IsNullOrEmpty(selector) ? null : DrDocWeb.GetElement(sourceElement, selector);\r\n\r\n if (strictParentHierarchy) {\r\n DrDocWeb.kvp_getRecursiveInternal(sourceElement, rootNamespace, valueName, returnKeyPrefix, obj, strictParentHierarchy);\r\n }\r\n else {\r\n let elemList = document.querySelectorAll(`[${DrDocWeb.KVP_ATTR_NAMESPACE}=\"${DrDocWeb.SelectorAttributeEncode(rootNamespace)}\"]`);\r\n if (elemList != undefined && elemList != null) {\r\n for (let elem of elemList) {\r\n DrDocWeb.kvp_getRecursiveInternal(elem, rootNamespace, valueName, returnKeyPrefix, obj, strictParentHierarchy);\r\n }\r\n }\r\n }\r\n\r\n //let elemNodeIgnoreList = [];\r\n //DrDocWeb.kvp_getInternal(sourceElement, rootNamespace, valueName, returnKeyPrefix, obj, strictHierarchy, searchParent, elemNodeIgnoreList);\r\n\r\n //console.log('DrDocWeb.kvp_get: root: ', obj);\r\n\r\n return obj;\r\n}\r\n\r\n\r\n/*DrDocWeb.kvp_getInternal = function (sourceElement, rootNamespace, valueName, returnKeyPrefix, obj, strictHierarchy, searchParent, elemNodeIgnoreList) {\r\n if (elemNodeIgnoreList.indexOf(sourceElement) >= 0)\r\n return;\r\n elemNodeIgnoreList.push(sourceElement);\r\n\r\n if (strictHierarchy) {\r\n // Strikt suchen\r\n DrDocWeb.kvp_getRecursiveInternal(sourceElement, rootNamespace, valueName, returnKeyPrefix, obj, strictHierarchy, searchParent, elemNodeIgnoreList);\r\n }\r\n else {\r\n let elemList = document.querySelectorAll(`[${DrDocWeb.KVP_ATTR_NAMESPACE}=\"${DrDocWeb.SelectorAttributeEncode(rootNamespace)}\"]`);\r\n if (elemList != undefined && elemList != null) {\r\n for (let elem of elemList) {\r\n DrDocWeb.kvp_getRecursiveInternal(elem, rootNamespace, valueName, returnKeyPrefix, obj, strictHierarchy, false, elemNodeIgnoreList);\r\n }\r\n }\r\n }\r\n}*/\r\n\r\nDrDocWeb.kvp_getRecursiveInternal = function (sourceElement, rootNamespace, valueName, returnKeyPrefix, obj, strictParentHierarchy) {\r\n if (sourceElement.getAttribute !== undefined && typeof sourceElement.getAttribute === 'function') {\r\n let key = sourceElement.getAttribute(DrDocWeb.KVP_ATTR_KEY);\r\n\r\n // key vorhanden?\r\n if (!DrDocWeb.IsNullOrEmpty(key)) {\r\n let namespace = sourceElement.getAttribute(DrDocWeb.KVP_ATTR_NAMESPACE);\r\n\r\n // Namespace prüfen\r\n if ((DrDocWeb.IsNullOrEmpty(namespace) && DrDocWeb.IsNullOrEmpty(rootNamespace)) || namespace === rootNamespace) {\r\n // data-kvp-=\"...\"\r\n let value = sourceElement.getAttribute(DrDocWeb.KVP_ATTR + '-' + valueName.toLowerCase());\r\n if (!DrDocWeb.IsNullOrEmpty(value))\r\n obj[returnKeyPrefix + key] = value;\r\n }\r\n }\r\n }\r\n\r\n //if (rootElement === sourceElement)\r\n // return;\r\n\r\n if (strictParentHierarchy) {\r\n // Rekursive über Parent Node durchlaufen\r\n if (sourceElement.parentNode != null && sourceElement.parentNode != undefined) {\r\n DrDocWeb.kvp_getRecursiveInternal(sourceElement.parentNode, rootNamespace, valueName, returnKeyPrefix, obj, strictParentHierarchy);\r\n }\r\n }\r\n\r\n}\r\n\r\n\r\n// ---\r\n\r\n// Drag and Drop\r\n/*\r\n+CSS:\r\n[data-drag]\r\n{\r\n cursor: pointer;\r\n user-select: none;\r\n}\r\n.drag-active[data-drag]\r\n{\r\n border-color: $gray-500;\r\n border-width: 1px;\r\n border-style: solid;\r\n}\r\n\r\n+HTML:\r\n
    \r\n
  • Apples
  • \r\n
  • Oranges
  • \r\n
  • Bananas
  • \r\n
  • Strawberries
  • \r\n
\r\n
\r\n\r\nDrDocWeb.dnd_init(elem)\r\nDrDocWeb.dnd_getValue(elem)\r\n*/\r\n\r\nDrDocWeb.DND_ATTR = 'data-drag';\r\nDrDocWeb.DND_ATTR_DROP = 'data-drop';\r\nDrDocWeb.DND_ATTR_VALUE = DrDocWeb.DND_ATTR + '-value';\r\nDrDocWeb.DND_ATTR_ACTION = DrDocWeb.DND_ATTR + '-action';\r\nDrDocWeb.DND_ATTR_TRIGGER = DrDocWeb.DND_ATTR + '-trigger';\r\n//DrDocWeb.DND_ATTR_IGNORE = DrDocWeb.DND_ATTR + '-ignore';\r\nDrDocWeb.dnd_selected = {};\r\n\r\n// Initialisiert alle Elemente mit dem Attribut data-drag=\"Name\"\r\nDrDocWeb.dnd_init = function (sourceElement) {\r\n let selector = `[${DrDocWeb.DND_ATTR}]`;\r\n let arr = DrDocWeb.GetElements(sourceElement, selector);\r\n //console.log('dnd_init: ', arr);\r\n for (let elem of arr) {\r\n dnd_initElement(elem);\r\n }\r\n\r\n /*for (let elem of DrDocWeb.GetElements(sourceElement, `[${DrDocWeb.DND_ATTR_IGNORE}]`)) {\r\n if (DrDocWeb.ParseBool(elem.getAttribute(DrDocWeb.DND_ATTR_IGNORE))) {\r\n elem.draggable = false;\r\n\r\n elem.addEventListener('dragstart', function (e) {\r\n console.log('DND: Disable: Start: ', e.targer, elem);\r\n e.preventDefault();\r\n return false;\r\n });\r\n }\r\n }*/\r\n};\r\n\r\n\r\nfunction dnd_getDragDropEvent(type, dataTransfer) {\r\n var dragDropEvent = new DragEvent(type);\r\n console.log('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', dataTransfer);\r\n Object.defineProperty(dragDropEvent.constructor.prototype, 'dataTransfer', dataTransfer);\r\n dragDropEvent['dataTransfer'] = dataTransfer;\r\n //console.log('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', dragDropEvent.dataTransfer.getData('Text'));\r\n console.log('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', dragDropEvent);\r\n return dragDropEvent;\r\n };\r\n \r\n\r\n// Drag n Drop Element initialisieren\r\nfunction dnd_initElement(sourceElement, name) {\r\n if (sourceElement == undefined || sourceElement == null)\r\n return;\r\n\r\n // nur einmal initialisieren\r\n if (sourceElement._dnd_initialized === true)\r\n return;\r\n sourceElement._dnd_initialized = true;\r\n\r\n if (typeof sourceElement.getAttribute !== 'function')\r\n return;\r\n //if (DrDocWeb.IsNullOrEmpty(name))\r\n name = sourceElement.getAttribute(DrDocWeb.DND_ATTR);\r\n if (DrDocWeb.IsNullOrEmpty(name))\r\n return;\r\n\r\n // prüfen, ob das Draggable Element ein anderes Trigger Element hat\r\n let triggerElement = DrDocWeb.GetElement(sourceElement, `[${DrDocWeb.DND_ATTR_TRIGGER}=\"${DrDocWeb.SelectorAttributeEncode(name)}\"]`, true);\r\n if (triggerElement != undefined && triggerElement != null) {\r\n //console.log('DND Init: User Trigger Element ', triggerElement, ' for source elem ', sourceElement);\r\n\r\n let dragAction = sourceElement.getAttribute(DrDocWeb.DND_ATTR_ACTION);\r\n //console.log('dnd_initElement: ', name);\r\n if (dragAction == 'false' || dragAction == 'none' || dragAction == 'drop' || dragAction == 'dropzone') {\r\n // Nur als Dropzone\r\n // Element nicht als Draggable markieren\r\n sourceElement.draggable = false;\r\n sourceElement.setAttribute('draggable', 'false');\r\n }\r\n else {\r\n\r\n // Element als Draggable markieren\r\n sourceElement.draggable = false;\r\n sourceElement.setAttribute('draggable', 'false');\r\n sourceElement.addEventListener('dragstart', function (e) {\r\n //console.log('dragstart: ', e.target, e);\r\n /*console.log('dragstart: ', DrDocWeb.DND_ATTR_IGNORE, ' / ', e.target.getAttribute(DrDocWeb.DND_ATTR_IGNORE), ' / ', e.target, e);\r\n if (DrDocWeb.ParseBool(e.target.getAttribute(DrDocWeb.DND_ATTR_IGNORE))) {\r\n console.log('DRAG n Drop Cancel: ', e.target);\r\n e.preventDefault();\r\n return false;\r\n }*/\r\n dnd_dragStart(name, e);\r\n });\r\n\r\n // Element als Draggable markieren\r\n triggerElement.addEventListener('mousedown', function (e) {\r\n e.preventDefault();\r\n sourceElement.draggable = true;\r\n sourceElement.setAttribute('draggable', 'true');\r\n //setTimeout(function () {\r\n // DrDocWeb.EventFire(sourceElement, 'mousedown');\r\n // DrDocWeb.EventFire(sourceElement, 'dragstart');\r\n //}, 100);\r\n //DrDocWeb.EventFire(sourceElement, 'dragstart');\r\n\r\n \r\n /*var dragDataTransfer = {\r\n data: {},\r\n setData: function(type, value) { this.data[type] = value; },\r\n getData: function(type) { return this.data[type] }\r\n };\r\n\r\n dragDataTransfer.setData('Text', 'foo....................');\r\n var dragstaEv = dnd_getDragDropEvent('dragstart', dragDataTransfer);\r\n sourceElement.dispatchEvent(dragstaEv);*/\r\n\r\n\r\n return false;\r\n });\r\n }\r\n sourceElement.addEventListener('dragover', function (e) {\r\n dnd_dragOver(name, e);\r\n });\r\n /*sourceElement.addEventListener('dragend', function (e) {\r\n dnd_dragEnd(name, e);\r\n });*/\r\n sourceElement.addEventListener('drop', function (e) {\r\n dnd_drop(name, e);\r\n });\r\n }\r\n else {\r\n let dragAction = sourceElement.getAttribute(DrDocWeb.DND_ATTR_ACTION);\r\n //console.log('dnd_initElement: ', name);\r\n if (dragAction == 'false' || dragAction == 'none' || dragAction == 'drop' || dragAction == 'dropzone') {\r\n // Nur als Dropzone\r\n // Element nicht als Draggable markieren\r\n sourceElement.draggable = false;\r\n sourceElement.setAttribute('draggable', 'false');\r\n }\r\n else {\r\n // Element als Draggable markieren\r\n sourceElement.draggable = true;\r\n sourceElement.setAttribute('draggable', 'true');\r\n sourceElement.addEventListener('dragstart', function (e) {\r\n /*console.log('dragstart: ', DrDocWeb.DND_ATTR_IGNORE, ' / ', e.target.getAttribute(DrDocWeb.DND_ATTR_IGNORE), ' / ', e.target, e);\r\n if (DrDocWeb.ParseBool(e.target.getAttribute(DrDocWeb.DND_ATTR_IGNORE))) {\r\n console.log('DRAG n Drop Cancel: ', e.target);\r\n e.preventDefault();\r\n return false;\r\n }*/\r\n dnd_dragStart(name, e);\r\n });\r\n }\r\n sourceElement.addEventListener('dragover', function (e) {\r\n dnd_dragOver(name, e);\r\n });\r\n /*sourceElement.addEventListener('dragend', function (e) {\r\n dnd_dragEnd(name, e);\r\n });*/\r\n sourceElement.addEventListener('drop', function (e) {\r\n dnd_drop(name, e);\r\n });\r\n }\r\n};\r\n\r\nDrDocWeb.dnd_getElem = function (name, sourceElement, getContainer) {\r\n if (typeof sourceElement.hasAttribute === 'function') {\r\n if (sourceElement.hasAttribute(DrDocWeb.DND_ATTR) && name == sourceElement.getAttribute(DrDocWeb.DND_ATTR)) {\r\n /*if (getContainer === true) {\r\n let containerElement = DrDocWeb.GetElement(sourceElement, `[${DrDocWeb.DND_ATTR}-container=\"${DrDocWeb.SelectorAttributeEncode(name)}\"]`, true);\r\n if (containerElement != undefined && containerElement != null) {\r\n //console.log('DrDocWeb.dnd_getElem: Container, ', DrDocWeb.DND_ATTR, name, sourceElement, ' => ', containerElement);\r\n return containerElement;\r\n }\r\n }*/\r\n\r\n //console.log('DrDocWeb.dnd_getElem: ', DrDocWeb.DND_ATTR, name, sourceElement);\r\n return sourceElement;\r\n }\r\n /*if (sourceElement.hasAttribute(DrDocWeb.DND_ATTR_DROP) && name == sourceElement.getAttribute(DrDocWeb.DND_ATTR_DROP)) {\r\n console.log('DrDocWeb.dnd_getElem: ', DrDocWeb.DND_ATTR_DROP, name, sourceElement);\r\n return sourceElement;\r\n }*/\r\n }\r\n let elemTmp = sourceElement.parentNode;\r\n if (elemTmp !== undefined && elemTmp !== null) {\r\n let parent = DrDocWeb.dnd_getElem(name, elemTmp, getContainer);\r\n if (parent !== undefined && parent !== null)\r\n return parent;\r\n }\r\n //let selector = `[${DrDocWeb.DND_ATTR}=\"${name}\"]`;\r\n //return DrDocWeb.GetElement(sourceElement, selector, true);\r\n return undefined;\r\n};\r\nDrDocWeb.dnd_getValueElem = function (sourceElement) {\r\n if (sourceElement != undefined && sourceElement != null) {\r\n if (typeof sourceElement.hasAttribute === 'function' && sourceElement.hasAttribute(DrDocWeb.DND_ATTR_VALUE))\r\n return sourceElement;\r\n let elemTmp = sourceElement.parentNode;\r\n if (elemTmp !== undefined && elemTmp !== null) {\r\n let parent = DrDocWeb.dnd_getValueElem(elemTmp);\r\n if (parent !== undefined && parent !== null)\r\n return parent;\r\n }\r\n }\r\n return undefined;\r\n};\r\nDrDocWeb.dnd_getValue = function (sourceElement) {\r\n sourceElement = DrDocWeb.dnd_getValueElem(sourceElement);\r\n return sourceElement != undefined && sourceElement != null && typeof sourceElement.getAttribute === 'function' ? sourceElement.getAttribute(DrDocWeb.DND_ATTR_VALUE) : '';\r\n};\r\n\r\n// The user starts to drag an element\r\nfunction dnd_dragStart(name, e) {\r\n if (!e)\r\n return;\r\n let sourceElement = DrDocWeb.dnd_getElem(name, e.target, true);\r\n let sourceElementTrigger = DrDocWeb.dnd_getElem(name, e.target, false);\r\n if (!sourceElement)\r\n return;\r\n\r\n /*\r\n // Drag n Drop Container und Trigger Element unterscheiden sich\r\n if (sourceElementTrigger !== sourceElement)\r\n {\r\n console.log('DND: Drag n Drop Container und Trigger Element unterscheiden sich: ', sourceElementTrigger, sourceElement);\r\n // sourceElement.draggable = true;\r\n // Container Element initialisieren\r\n dnd_initElement(sourceElement, name);\r\n e.preventDefault();\r\n // \"dragstart\" erneut für Container Element ausführen\r\n setTimeout(function(){\r\n DrDocWeb.EventFire(sourceElement, 'dragstart', function(e2){\r\n console.log('DND: Drag n Drop Container', ' / dragstart fired', e2);\r\n });\r\n }, 100);\r\n return false;\r\n }\r\n console.log('DND: Drag n Drop Start', sourceElementTrigger, sourceElement);\r\n */\r\n\r\n //let moveElement = DrDocWeb.GetElement(sourceElement, `[${DrDocWeb.DND_ATTR}-container=\"${DrDocWeb.SelectorAttributeEncode(name)}\"]`, true);\r\n //if (moveElement != undefined && moveElement != null) {\r\n // sourceElement = moveElement;\r\n //}\r\n\r\n sourceElement.classList.add('drag-active');\r\n // https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Drag_operations\r\n //console.log('dnd_dragStart: ', sourceElement, ' Prev: ', sourceElement.previousElementSibling, ' / Next: ', sourceElement.nextElementSibling);\r\n\r\n let actionStr = sourceElement.getAttribute(DrDocWeb.DND_ATTR_ACTION);\r\n if (!DrDocWeb.IsNullOrEmpty(actionStr)) {\r\n //console.log('dnd_dragStart: effectAllowed: ', actionStr);\r\n e.dataTransfer.effectAllowed = actionStr;\r\n }\r\n else {\r\n e.dataTransfer.effectAllowed = 'move';\r\n }\r\n e.dataTransfer.setData('text/plain', null);\r\n\r\n sourceElement.dnd = {\r\n sourceElement: sourceElement,\r\n sourceElementParent: sourceElement.parentNode,\r\n targetElement: null,\r\n targetElementParent: null,\r\n previousElementSibling: sourceElement.previousElementSibling,\r\n nextElementSibling: sourceElement.nextElementSibling,\r\n effectAllowed: e.dataTransfer.effectAllowed,\r\n };\r\n //sourceElement.style.cursor = 'move';\r\n //sourceElement.style.backgroundColor = 'green';\r\n\r\n DrDocWeb.dnd_selected[name] = sourceElement;\r\n};\r\n\r\n// A dragged element is over the drop target\r\n// The ondragover event specifies where the dragged data can be dropped.\r\nfunction dnd_dragOver(name, e) {\r\n if (DrDocWeb.dnd_selected[name] == null) {\r\n //console.log('dnd_dragOver: DrDocWeb.dnd_selected[name] == null: ', name);\r\n return;\r\n }\r\n e.preventDefault();\r\n /*let sourceElement = null;\r\n if (e.target._dnd_elem !== undefined) {\r\n sourceElement = e.target._dnd_elem;\r\n }\r\n else {\r\n sourceElement = DrDocWeb.dnd_getElem(name, e.target, true);\r\n e.target._dnd_elem = sourceElement;\r\n }*/\r\n\r\n let sourceElement = DrDocWeb.dnd_selected[name];\r\n let targetElement = DrDocWeb.dnd_getElem(name, e.target, true);\r\n if (sourceElement == null || sourceElement == undefined)\r\n return;\r\n // Effekt setzen für Cursor Symbol\r\n if (sourceElement.dnd != undefined && !DrDocWeb.IsNullOrEmpty(sourceElement.dnd.effectAllowed))\r\n e.dataTransfer.dropEffect = sourceElement.dnd.effectAllowed;\r\n\r\n // Element beim Drag and Drop einsortieren\r\n //if (DrDocWeb.IsNullOrEmpty(e.dataTransfer.effectAllowed) || e.dataTransfer.effectAllowed == 'move') {\r\n /*try {\r\n //console.log('dnd_dragOver: ', sourceElement, sourceElement.nextElementSibling);\r\n if (dnd_dragOver_isBeforeInternal(DrDocWeb.dnd_selected[name], sourceElement)) {\r\n sourceElement.parentNode.insertBefore(DrDocWeb.dnd_selected[name], sourceElement);\r\n } else {\r\n sourceElement.parentNode.insertBefore(DrDocWeb.dnd_selected[name], sourceElement.nextElementSibling);\r\n }\r\n } catch { }*/\r\n /*}\r\n else {\r\n //console.log('dnd_dragOver: effectAllowed: ', e.dataTransfer.effectAllowed);\r\n //var dt = e.originalEvent.dataTransfer;\r\n //dt.dropEffect = e.dataTransfer.effectAllowed;\r\n //e.dataTransfer.dropEffect = e.dataTransfer.effectAllowed;\r\n //e.preventDefault();\r\n }*/\r\n\r\n // Ziel Parent Element setzen\r\n if (sourceElement.dnd != undefined) {\r\n if (targetElement != undefined && targetElement != null) {\r\n e.target.dnd = sourceElement.dnd;\r\n targetElement.dnd = sourceElement.dnd;\r\n sourceElement.dnd.targetElement = targetElement;\r\n if (targetElement.parentNode != undefined && targetElement.parentNode != null)\r\n sourceElement.dnd.targetElementParent = targetElement.parentNode;\r\n }\r\n }\r\n};\r\n\r\nfunction dnd_dragOver_isBeforeInternal(el1, el2) {\r\n if (!el1 || !el2)\r\n return false;\r\n let cur = null;\r\n if (el2.parentNode === el1.parentNode) {\r\n for (cur = el1.previousElementSibling; cur; cur = cur.previousElementSibling) {\r\n if (cur === el2)\r\n return true;\r\n }\r\n }\r\n return false;\r\n};\r\n\r\n// A dragged element is dropped on the target\r\n// onDrop wird VOR onDragEnd aufgerufen\r\nfunction dnd_drop(name, e) {\r\n if (DrDocWeb.dnd_selected[name] == null) {\r\n //console.log('dnd_drop: DrDocWeb.dnd_selected[name] == null: ', name, e.target);\r\n return;\r\n }\r\n //console.log('dnd_drop: e: ', name, DrDocWeb.dnd_selected[name], e);\r\n let sourceElement = DrDocWeb.dnd_selected[name];\r\n if (sourceElement == undefined || sourceElement == null) {\r\n //console.log('dnd_drop: sourceElement == null: ', name, e.target);\r\n return;\r\n }\r\n let targetElement = DrDocWeb.dnd_getElem(name, e.target, true);\r\n // Call preventDefault() to prevent the browser default handling of the data (default is open as link on drop)\r\n e.preventDefault();\r\n sourceElement.classList.remove('drag-active');\r\n\r\n // Ziel Parent Element setzen\r\n /*if (sourceElement.dnd != undefined)\r\n {\r\n sourceElement.dnd.targetElement = sourceElement;\r\n\r\n if (sourceElement.parentNode != undefined && sourceElement.parentNode != null)\r\n sourceElement.dnd.targetElementParent = sourceElement.parentNode;\r\n }*/\r\n\r\n if (sourceElement.dnd != undefined) {\r\n // In Target einsortieren\r\n if (!DrDocWeb.IsNullOrEmpty(sourceElement.dnd.effectAllowed) && sourceElement.dnd.effectAllowed == 'move') {\r\n try {\r\n if (dnd_dragOver_isBeforeInternal(DrDocWeb.dnd_selected[name], targetElement)) {\r\n targetElement.parentNode.insertBefore(DrDocWeb.dnd_selected[name], targetElement);\r\n } else {\r\n targetElement.parentNode.insertBefore(DrDocWeb.dnd_selected[name], targetElement.nextElementSibling);\r\n }\r\n } catch { }\r\n }\r\n\r\n // Ziel Parent Element setzen\r\n if (targetElement != undefined && targetElement != null) {\r\n e.target.dnd = sourceElement.dnd;\r\n targetElement.dnd = sourceElement.dnd;\r\n sourceElement.dnd.targetElement = targetElement;\r\n if (targetElement.parentNode != undefined && targetElement.parentNode != null)\r\n sourceElement.dnd.targetElementParent = targetElement.parentNode;\r\n }\r\n }\r\n\r\n //console.log('dnd_drop: ', name, ' / Target: ', e.target, ' / Source: ', sourceElement, ' / DND: ', sourceElement.dnd);\r\n //console.log('dnd_drop: ', name, ' / DND: ', sourceElement.dnd);\r\n\r\n // Source Element zurücksetzen\r\n //setTimeout(function () {\r\n DrDocWeb.dnd_selected[name] = null;\r\n //}, 5);\r\n};\r\n\r\n// onDragEnd wird NACH onDrop aufgerufen\r\nfunction dnd_dragEnd(name, e) {\r\n if (DrDocWeb.dnd_selected[name] == null) {\r\n // console.log('dnd_dragEnd: DrDocWeb.dnd_selected[name] == null: ', name, e.target);\r\n return;\r\n }\r\n let sourceElement = DrDocWeb.dnd_getElem(name, e.target, true);\r\n if (!sourceElement)\r\n return;\r\n sourceElement.classList.remove('drag-active');\r\n //console.log('dnd_dragEnd: ', e, sourceElement, ' Prev: ', sourceElement.previousElementSibling, ' / Next: ', sourceElement.nextElementSibling);\r\n\r\n // Ziel Parent Element setzen\r\n if (sourceElement.dnd != undefined && sourceElement.parentNode != undefined && sourceElement.parentNode != null)\r\n sourceElement.dnd.targetElementParent = sourceElement.parentNode;\r\n // mit Timeout ausführen, damit \"e.target\" auf das Ziel weist\r\n //setTimeout(function(){\r\n // Element wieder an Quelle zurückschieben, wenn effectAllowed z.B. 'copy' ist\r\n // aber nur wenn: Element beim Drag and Drop einsortiert wurde\r\n /*if (sourceElement.dnd != undefined && !DrDocWeb.IsNullOrEmpty(sourceElement.dnd.effectAllowed) && sourceElement.dnd.effectAllowed != 'move') {\r\n //console.log('dnd_dragEnd: dnd 1 copy: ', sourceElement.dnd.effectAllowed, e.target===sourceElement, sourceElement.dnd.sourceElement===sourceElement, sourceElement);\r\n if (sourceElement.parentNode !== sourceElement.dnd.sourceElementParent) {\r\n sourceElement.parentNode.removeChild(sourceElement);\r\n sourceElement.dnd.sourceElementParent.appendChild(sourceElement);\r\n }\r\n }\r\n else {\r\n // move\r\n //console.log('dnd_dragEnd: dnd 2 move: ', e.target===sourceElement, sourceElement.dnd.sourceElement===sourceElement, sourceElement);\r\n }*/\r\n //}, 100);\r\n\r\n // Source Element zurücksetzen\r\n setTimeout(function () {\r\n DrDocWeb.dnd_selected[name] = null;\r\n }, 5);\r\n};\r\n\r\n\r\n// ---\r\n\r\n// Math Helper\r\n\r\nDrDocWeb.Math_Median = function (values) {\r\n if (values.length === 0) return 0;\r\n values.sort(function (a, b) {\r\n return a - b;\r\n });\r\n var half = Math.floor(values.length / 2);\r\n if (values.length % 2)\r\n return values[half];\r\n return (values[half - 1] + values[half]) / 2.0;\r\n};\r\n\r\n// --\r\n// String Funktionen\r\n\r\nDrDocWeb.IsNullOrEmpty = function (val) {\r\n return val === undefined || val === null || val === '' || (typeof val === 'number' && isNaN(val) === true);\r\n};\r\n\r\n// --\r\n// String Extensions\r\n\r\nif (!String.prototype.startsWith) {\r\n String.prototype.startsWith = function (searchString, position) {\r\n position = position || 0;\r\n return this.indexOf(searchString, position) === position;\r\n };\r\n}\r\nif (!String.prototype.endsWith) {\r\n String.prototype.endsWith = function (searchString, position) {\r\n var subjectString = this.toString();\r\n if (typeof position !== 'number' || !isFinite(position) || Math.floor(position) !== position || position > subjectString.length) {\r\n position = subjectString.length;\r\n }\r\n position -= searchString.length;\r\n var lastIndex = subjectString.indexOf(searchString, position);\r\n return lastIndex !== -1 && lastIndex === position;\r\n };\r\n}\r\n\r\n// --\r\n\r\n// Base64 Encode\r\nDrDocWeb.b64EncodeUnicode = function (str) {\r\n // first we use encodeURIComponent to get percent-encoded UTF-8,\r\n // then we convert the percent encodings into raw bytes which\r\n // can be fed into btoa.\r\n return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function toSolidBytes(match, p1) {\r\n return String.fromCharCode(parseInt(p1, 16));\r\n //return String.fromCharCode('0x' + p1);\r\n }));\r\n};\r\n\r\n/// Base64 Decode\r\nDrDocWeb.b64DecodeUnicode = function (str) {\r\n // Going backwards: from bytestream, to percent-encoding, to original string.\r\n return decodeURIComponent(atob(str).split('').map(function (c) {\r\n return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);\r\n }).join(''));\r\n};\r\n\r\n// --\r\n\r\n// JSON Funktionen\r\n\r\n// JSON Parse\r\nDrDocWeb.JsonParse = function (jsonStr) {\r\n if (jsonStr == null || jsonStr.length == 0)\r\n return null;\r\n return DrDocWeb.JsonRetrocycle(JSON.parse(jsonStr)); //event.target.responseText));\r\n};\r\n\r\n/**\r\n * Modified from Douglas Crockford's cycle.js (https://github.com/douglascrockford/JSON-js/blob/master/cycle.js).\r\n * Ported over to TypeScript, and modified to handle the reference schema that Json.NET uses.\r\n */\r\n\r\n/* = {\r\n decycle: null,\r\n retrocycle: null\r\n};*/\r\n(function () {\r\n /**\r\n * The findReferences function walks recursively through an object graph built from a Json.NET string,\r\n * looking for $id properties. When it finds an object with that property, then it adds it to the catalog under that key.\r\n * @param obj The object from Json.NET\r\n * @param catalog The catalog of references that maintains state through the series of recursive calls.\r\n */\r\n function findReferences(obj, catalog) {\r\n if (obj && typeof obj === \"object\") {\r\n var id = obj.$id;\r\n if (typeof id === \"string\") {\r\n catalog[id] = obj;\r\n }\r\n if (Object.prototype.toString.apply(obj) === \"[object Array]\") {\r\n var i = void 0;\r\n for (i = 0; i < obj.length; i += 1) {\r\n findReferences(obj[i], catalog);\r\n }\r\n } else {\r\n for (var name_1 in obj) {\r\n if (obj.hasOwnProperty(name_1)) {\r\n if (typeof obj[name_1] === \"object\") {\r\n findReferences(obj[name_1], catalog);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n /**\r\n * The resolveReferences function walks through the object graph and replaces any references with the objects from the catalog.\r\n * @param obj The object from Json.NET\r\n * @param catalog The catalog of references that maintains state through the series of recursive calls.\r\n */\r\n function resolveReferences(obj, catalog) {\r\n if (obj && typeof obj === \"object\") {\r\n var i = void 0;\r\n var item = void 0;\r\n var id = void 0;\r\n if (Object.prototype.toString.apply(obj) === \"[object Array]\") {\r\n for (i = 0; i < obj.length; i += 1) {\r\n item = obj[i];\r\n if (item && typeof item === \"object\") {\r\n id = item.$ref;\r\n if (typeof id === \"string\") {\r\n obj[i] = catalog[id];\r\n } else {\r\n obj[i] = resolveReferences(item, catalog);\r\n }\r\n }\r\n }\r\n } else if (obj.$values && Object.prototype.toString.apply(obj.$values) === \"[object Array]\") {\r\n var arr = new Array();\r\n for (i = 0; i < obj.$values.length; i += 1) {\r\n item = obj.$values[i];\r\n if (item && typeof item === \"object\") {\r\n id = item.$ref;\r\n if (typeof id === \"string\") {\r\n arr[i] = catalog[id];\r\n } else {\r\n arr[i] = resolveReferences(item, catalog);\r\n }\r\n } else {\r\n arr[i] = item;\r\n }\r\n }\r\n obj = arr;\r\n } else {\r\n var name_2;\r\n for (name_2 in obj) {\r\n if (obj.hasOwnProperty(name_2)) {\r\n if (typeof obj[name_2] === \"object\") {\r\n item = obj[name_2];\r\n if (item) {\r\n id = item.$ref;\r\n if (typeof id === \"string\") {\r\n obj[name_2] = catalog[id];\r\n } else {\r\n obj[name_2] = resolveReferences(item, catalog);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return obj;\r\n }\r\n /**\r\n * The createReferences function recurses through the object, producing the deep copy.\r\n * @param obj The object from Json.NET\r\n * @param catalog The catalog of references that maintains state through the series of recursive calls.\r\n */\r\n function getDecycledCopy(obj, catalog) {\r\n var i; // The loop counter\r\n var name; // Property name\r\n var nu; // The new object or array\r\n switch (typeof obj) {\r\n case \"object\":\r\n // typeof null === 'object', so get out if this value is not really an object.\r\n // Also get out if it is a weird builtin object.\r\n if (obj === null || obj instanceof Boolean || obj instanceof Date || obj instanceof Number || obj instanceof RegExp || obj instanceof String) {\r\n return obj;\r\n }\r\n // If the value is an object or array, look to see if we have already\r\n // encountered it. If so, return a {$id:id} object. This is a hard way, O(n)\r\n // linear search that will get slower as the number of unique objects grows.\r\n // JavaScript really should have a decent dictionary or map class.\r\n for (i = 0; i < catalog.length; i += 1) {\r\n if (catalog[i] === obj) {\r\n return {\r\n $ref: i.toString()\r\n };\r\n }\r\n }\r\n // Otherwise, accumulate the unique value and its id.\r\n obj.$id = catalog.length.toString();\r\n catalog.push(obj);\r\n // If it is an array, replicate the array.\r\n if (Object.prototype.toString.apply(obj) === \"[object Array]\") {\r\n nu = [];\r\n for (i = 0; i < obj.length; i += 1) {\r\n nu[i] = getDecycledCopy(obj[i], catalog);\r\n }\r\n } else {\r\n // If it is an object, replicate the object.\r\n nu = {};\r\n for (name in obj) {\r\n if (Object.prototype.hasOwnProperty.call(obj, name)) {\r\n nu[name] = getDecycledCopy(obj[name], catalog);\r\n }\r\n }\r\n }\r\n return nu;\r\n case \"number\":\r\n case \"string\":\r\n case \"boolean\":\r\n default:\r\n return obj;\r\n }\r\n }\r\n /** Make a deep copy of an object or array, assuring that there is at most\r\n one instance of each object or array in the resulting structure. The\r\n duplicate references (which might be forming cycles) are replaced with\r\n an object of the form\r\n {$id: id}\r\n where the id is a simple string\r\n Modified from Douglas Crockford's cycle.js (https://github.com/douglascrockford/JSON-js/blob/master/cycle.js)\r\n Ported over to TypeScript, and modified to handle the reference schema that Json.NET uses.\r\n */\r\n function decycle(obj) {\r\n var catalog = []; // Keep a reference to each unique object or array\r\n var newObj = getDecycledCopy(obj, catalog);\r\n return newObj;\r\n }\r\n DrDocWeb.JsonDecycle = decycle;\r\n\r\n /** Restore an object that was reduced by decycle. Members whose values are objects of the form\r\n {$ref: id}\r\n are replaced with references to the value found by the id. This will\r\n restore cycles. The object will be mutated.\r\n\r\n So,\r\n var s = '{$id:1, members: [{$ref:\"1\"}]';\r\n return retrocycle(JSON.parse(s));\r\n produces an object containing an array which holds the object itself.\r\n */\r\n function retrocycle(obj) {\r\n var catalog = [];\r\n findReferences(obj, catalog);\r\n return resolveReferences(obj, catalog);\r\n }\r\n DrDocWeb.JsonRetrocycle = retrocycle;\r\n})();\r\n\r\n"],"names":["$parcel$global","$parcel$modules","$parcel$inits","parcelRequire","globalThis","id","exports","init","module","call","err","Error","code","register","parcelRegister","DrDocWeb","dnd_dragStart","name","e","sourceElement","dnd_getElem","target","classList","add","actionStr","getAttribute","DND_ATTR_ACTION","IsNullOrEmpty","dataTransfer","effectAllowed","setData","dnd","sourceElementParent","parentNode","targetElement","targetElementParent","previousElementSibling","nextElementSibling","dnd_selected","dnd_dragOver","preventDefault","undefined","dropEffect","dnd_drop","remove","dnd_dragOver_isBeforeInternal","el1","el2","cur","insertBefore","Object","defineProperty","get","set","s","enumerable","configurable","window","String","prototype","toHtmlEntities","replace","match","charCodeAt","fromHtmlEntities","string","fromCharCode","contains","search","start","length","indexOf","hashCode","i1","hash","console","log","ServerHost","document","location","protocol","hostname","ServerPort","port","ServerBase","DefaultError","error","warn","ModalError","IsMobile","innerWidth","innerHeight","UrlEncode","val","encodeURIComponent","ObjectToJson","ObjectToQueryStr","obj","strArr","p","hasOwnProperty","v","push","join","QueryStrToObject","str","substring","arr","split","kvp","decodeURIComponent","GetDataToObject","ArrayEquals","arr1","arr2","caseSensitive","elem1","found","elem2","toLowerCase","GetArrayItemWhere","data","propName","propValue","GetArrayItemIndexWhere","ObjGetKeys","ret","x","FormToObject","formName","splitter","form","forms","elements","form_elem","type","isCheckable","value","checked","fieldName","fieldValue","RegExp","GetClosestForm","result","tagName","GetElement","ClosestFormToObject","ClearClosestForm","JsonToObjectWalker","parentObj","parentProp","refObjList","prop","JsonToObject","text","_root","JSON","parse","stringify","CloneCopy","Array","isArray","slice","arrTmp","assign","CloneCopyTo","src","dst","ignorePropsArr","GetRequestUrl","url","getData","requestUrl","Send","method","postData","parseAs","sendAs","cookie","retAsync","promiseFn","resolve","reject","request","XMLHttpRequest","openRequestFn","open","withCredentials","setRequestHeader","processResponse","responseObj","responseText","FormData","addEventListener","event","send","progressBarId","RandomChars","progressBarHtml","progressBarModal","ModalSecondary","progressbarOnChange","percentComplete","loaded","total","getElementById","style","width","progressBarElem","setAttribute","upload","onprogress","progressBarCloseFn","hide","Promise","SendGet","SendPost","Random","characters","charactersLength","counter","charAt","Math","floor","random","ChecksumCyrb53","seed","h1","h2","ch","imul","CheckRecursion","n","cnt","fname","arguments","callee","caller","stack","Crud","CrudListen","callback","listener","setTimeout","ParseBool","toLocaleLowerCase","ParseInt","isNaN","parseFloat","ParseDateTime","dateStr","ToIsoDateTimeStr","Date","toISOString","dateTimeComponents","dateComponents","timeComponents","DateTimeAddMulti","dsDate","duration_total_str","dauer_str","dauer_unit","dauer_num","DateTimeAdd","dt","amount","dateType","toUpperCase","setDate","getDate","setMonth","getMonth","setFullYear","getFullYear","EventFire","el","eventName","fn","doc","ownerDocument","evObj","createEvent","initEvent","createEventObject","eventType","ex","dispatchEvent","fireEvent","selector","first","querySelectorAll","attrName","hasAttribute","elems","GetElements","GetChildElements","GetParentElements","FindChildElement","element","attr_name","attr_value","attr_comparer","nodeName","elem_attr_val","childNodes","sub","FindChildElements","list","sub_i","setInnerHTML","elm","html","innerHTML","innerText","from","forEach","oldScript","newScript","createElement","attributes","attr","appendChild","createTextNode","onload","onreadystatechange","readyState","replaceChild","elem","IframeAutosize","iframe","lastWidth","lastHeight","maxWidthStr","maxHeightStr","contentWindow","maxW","maxH","body","scrollWidth","max","scrollHeight","selectorElemArr","selectorElem","documentElement","maxWidth","height","maxHeight","overflow","_hasLoadEvent","FindLeftWindowBoundry","wnd","screenLeft","screenX","FindTopWindowBoundry","screenTop","screenY","FindLeftScreenBoundry","left","screen","FindTopScreenBoundry","top","ObjectForEachSorted","action","keys","len","sort","i","SetCookie","cname","cvalue","exdays","path","d","setTime","getTime","expires","toUTCString","GetCookie","defaultValue","ca","c","GetCookiePrefix","namePrefix","iOfEq","TreeView","treeRootElemArr","TreeViewIntern","treeRootElem","treeToggler","liElem","ulElem","querySelector","updateTreeElem","onClick","toggle","actionElem","__tree_onClick","removeEventListener","SelectorAttributeEncode","DataGroup","selector_arr","emptyKeyValue","selector_i","ret_data","data_key","itm","key","key_arr","key_itm","KVP_ATTR","KVP_ATTR_NAMESPACE","KVP_ATTR_KEY","KVP_ATTR_VALUE","kvp_get","rootNamespace","valueName","returnKeyPrefix","strictParentHierarchy","kvp_getRecursiveInternal","elemList","namespace","DND_ATTR","DND_ATTR_DROP","DND_ATTR_VALUE","DND_ATTR_TRIGGER","dnd_init","dnd_initElement","_dnd_initialized","triggerElement","dragAction","draggable","getContainer","elemTmp","parent","dnd_getValueElem","dnd_getValue","Math_Median","values","a","b","half","startsWith","searchString","position","endsWith","subjectString","toString","isFinite","lastIndex","b64EncodeUnicode","btoa","p1","parseInt","b64DecodeUnicode","atob","map","JsonParse","jsonStr","JsonRetrocycle","JsonDecycle","getDecycledCopy","catalog","nu","Boolean","Number","$ref","$id","apply","findReferences","name_1","resolveReferences","name_2","item","$values"],"version":3,"file":"drdocweb.js.map"}