{"version":3,"file":"9099.chunk.b296cedeb4feb17e40de.js","mappings":"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","sources":["webpack://apexchatwidgets/./widgets/core/hooks/addOptionProperty.js","webpack://apexchatwidgets/./widgets/core/hooks/RunAfter.js","webpack://apexchatwidgets/./widgets/core/hooks/removeClass.js","webpack://apexchatwidgets/./widgets/core/hooks/IsHtml.js","webpack://apexchatwidgets/./widgets/core/hooks/cleanInvalidHtml.js","webpack://apexchatwidgets/./widgets/core/hooks/correctAnchorTarget.js","webpack://apexchatwidgets/./widgets/core/hooks/RunUntil.js","webpack://apexchatwidgets/./widgets/core/hooks/removeTextFollowedByColon.js","webpack://apexchatwidgets/./widgets/core/hooks/decodeHTML.js","webpack://apexchatwidgets/./widgets/core/SimpleView.js","webpack://apexchatwidgets/./widgets/core/hooks/PipedMessageHandler.js","webpack://apexchatwidgets/./widgets/core/hooks/getStyle.js","webpack://apexchatwidgets/./widgets/core/enums/ParticipantIds.js"],"sourcesContent":["import logIt from '../../../logIt';\r\nimport decodeHTML from './decodeHTML';\r\n\r\n// This function is used for adding option property of msg.options object\r\nconst addOptionProperty = (options) => {\r\n try {\r\n const type = typeof options;\r\n if (type === 'string') {\r\n // most probably consent QT\r\n let parsedOptions = ApexChat.TryParse(options);\r\n if (typeof parsedOptions === 'string') {\r\n parsedOptions = ApexChat.TryParse(parsedOptions);\r\n return parsedOptions;\r\n }\r\n }\r\n // add option property to msg.options object\r\n if (options && options.length && options.length > 0) {\r\n // check if options property exists\r\n // don't try parsing if already JSON\r\n options = ApexChat.TryParse(options);\r\n options.forEach((element) => {\r\n if (!element.option) {\r\n element.option = element.text; // copy value of text property to new option property in msg.options object.\r\n } else {\r\n element.option = decodeHTML(element.option); // convert into html.\r\n }\r\n });\r\n return type === 'object' ? options : JSON.stringify(options); // return msg.options object with new option property added.\r\n }\r\n } catch (ex) {\r\n logIt(ex);\r\n }\r\n};\r\nexport default addOptionProperty;\r\n","const RunAfter = function (func, timeout) {\r\n setTimeout(() => {\r\n func();\r\n }, timeout);\r\n};\r\nexport default RunAfter;\r\n","import hasClass from \"./hasClass\";\r\n\r\nconst removeClass = function (ele, cls) {\r\n if (hasClass(ele, cls)) {\r\n const reg = new RegExp(`(\\\\s|^)${cls}(\\\\s|$)`);\r\n ele.className = ele.className.replace(reg, ' ');\r\n }\r\n};\r\nexport default removeClass;\r\n","const isHTML = (str) => {\r\n const a = document.createElement('div');\r\n a.innerHTML = str;\r\n\r\n for (let c = a.childNodes, i = c.length; i--;) {\r\n if (c[i].nodeType === 1) return true;\r\n }\r\n\r\n return false;\r\n};\r\nexport default isHTML;","import isHTML from './IsHtml';\r\nimport correctAnchorTarget from './correctAnchorTarget';\r\nimport decodeHTML from './decodeHTML';\r\nimport GlobalVariables from '../GlobalVariables';\r\n\r\n/* CHAT-5855 EP showing html tag as plain text on V2 and V3, for both visitor upon refreshing the page and agents can see it as plain text without refreshing.\r\n * this problem only occur when message contain both Encoded and Decoded html\r\n * checking if message contain both Encoded and Decoded html then removing Decoded html and rendering Encoded html\r\n * also corrects anchor tags with no targets */\r\nconst cleanInvalidHtml = (html) => {\r\n html = html || '';\r\n // Decode the HTML first to decode the special chars like &,# or > signs\r\n // then remove encoded html\r\n let decodedHtml = decodeHTML(html);\r\n\r\n /* checking if html contain both Encoded and Decoded html in message */\r\n if (\r\n (decodedHtml.match(GlobalVariables.encodedHtmlRegex) ||\r\n decodedHtml.match(GlobalVariables.scriptTagRegex) ||\r\n decodedHtml.match(GlobalVariables.styleTagRegex)) &&\r\n isHTML(decodedHtml)\r\n ) {\r\n /* removing decodedHtml from text */\r\n decodedHtml = decodedHtml.replace(/<[^>]*>/g, '');\r\n }\r\n return correctAnchorTarget(decodedHtml);\r\n};\r\nexport default cleanInvalidHtml;\r\n","/* corrects anchor tags with no targets */\r\nexport default function correctAnchorTarget(str) {\r\n const tempDiv = document.createElement('div');\r\n tempDiv.innerHTML = str;\r\n // Previously using tempDiv.querySelectorAll('a').forEach It's not browser compaitable\r\n // source: https://stackoverflow.com/questions/41054259/how-can-i-make-queryselectorall-or-foreach-work-in-firefox\r\n const anchors = tempDiv.getElementsByTagName('a');\r\n if (anchors.length > 0) {\r\n for (let i = 0; i < anchors.length; i++) {\r\n anchors[i].setAttribute('target', '_blank');\r\n }\r\n }\r\n return tempDiv.innerHTML;\r\n};\r\n\r\n","// A utility function as a better replacement for setTimeOut:\r\n// keeps checking on a boolean condition passed as a 2nd arg\r\n// and then only runs a func after the condition is found to be true\r\nconst RunUntil = (func, delay, condition) => {\r\n const interval = setInterval(() => {\r\n if (condition()) {\r\n clearInterval(interval);\r\n } else {\r\n func();\r\n }\r\n }, delay);\r\n};\r\nexport default RunUntil;\r\n","const removeTextFollowedByColon = function (text) {\r\n // the node can start with text followed by \"::\"; if it does, then it's instructional,\r\n // and shouldn't be included\r\n if (!text) return text;\r\n const re = new RegExp('\\\\\\\\', 'g'); // back slash validate\r\n let val = text;\r\n if (val && val.indexOf('::') > -1) {\r\n val = val.split('::')[1].replace(/^\\s+/g, '');\r\n }\r\n val = val\r\n .replace(/ /g, ' ')\r\n .replace(re, '');\r\n return val;\r\n};\r\nexport default removeTextFollowedByColon;\r\n","// CSS Utility functions - END\r\nconst decodeHTML = (html) => {\r\n const txt = document.createElement('textarea');\r\n txt.innerHTML = html;\r\n return txt.value;\r\n};\r\nexport default decodeHTML;\r\n","/*\r\nA Generic class to create an HTML View \r\nRequired: context, identifier, template \r\nUsage: var view = new SimpleView({context:document, identifier:'zee', template:'

Hi, <#=name#>!

', name:'zee'});\r\n*/\r\nimport addClass from './hooks/addClass';\r\nimport hideElement from './hooks/hideElement';\r\nimport observe from './hooks/observe';\r\nimport removeClass from './hooks/removeClass';\r\nimport addStyleTextInIframe from './hooks/addStyleTextInIframe';\r\n\r\nexport default class SimpleView {\r\n constructor(options) {\r\n // mandatory options\r\n this.options = options;\r\n if (typeof this.options !== 'object') {\r\n throw 'missing options';\r\n }\r\n if (!this.options.context) {\r\n throw 'context is mandatory';\r\n }\r\n this.identifier = this.options.identifier;\r\n this.template = this.options.template;\r\n this.rawContent = this.options.rawContent;\r\n this.context = this.options.context;\r\n this.afterRender = this.options.afterRender;\r\n this.beforeRender = this.options.beforeRender;\r\n this.containerSelector = this.options.containerSelector;\r\n this.isTemplateAlreadyParsed = this.options.isTemplateAlreadyParsed;\r\n // optional options\r\n this.style = this.options.style;\r\n this.classNames = this.options.classes;\r\n this.wrap = this.options.wrap;\r\n this.renderOninit = this.options.renderOninit !== 'false';\r\n this.elements = this.options.elements ? this.options.elements : [];\r\n this.model = this.options.model;\r\n this.isRendered = false;\r\n if (this.renderOninit) {\r\n this.render(this.options.model ? this.options.model : this.options);\r\n }\r\n }\r\n /* @param {any} model\r\n summary: renders the view, takes decisions and completes multiple tasks. */\r\n\r\n render(model) {\r\n if (this.beforeRender) {\r\n this.beforeRender();\r\n }\r\n const container = document.createElement('div');\r\n\r\n const target = this.options.targetElementSelector\r\n ? this.context.querySelector(this.options.targetElementSelector)\r\n : this.context.body;\r\n const wrapper =\r\n model && model.containerElemType\r\n ? this.context.createElement(model.containerElemType)\r\n : this.context.createElement('div');\r\n // if model contains a template use it with model = model\r\n // ELSE IF options contain a template then use it with model = options.model\r\n // ELSE IF options.rawContent given, write it out\r\n // ELSE the simple view will have no inner HTML\r\n if (this.isTemplateAlreadyParsed) {\r\n wrapper.innerHTML = this.template;\r\n } else {\r\n const getTemplate = () => {\r\n if (typeof this.template === 'function') {\r\n return this.template(this.model);\r\n }\r\n return this.template;\r\n };\r\n wrapper.innerHTML =\r\n model && model.template\r\n ? model.template(model)\r\n : this.template && this.model\r\n ? getTemplate()\r\n : this.options.rawContent\r\n ? this.options.rawContent\r\n : '';\r\n }\r\n const containerId = model && model.containerId ? model.containerId : this.identifier;\r\n wrapper.setAttribute('id', containerId);\r\n this.elements.containerSelector = `#${containerId}`;\r\n if (this.wrap && !this.isTemplateAlreadyParsed) {\r\n container.setAttribute('id', containerId);\r\n }\r\n if (this.wrap) {\r\n // Add the View and preserved the old selection of question type\r\n container.innerHTML = wrapper.innerHTML;\r\n target.appendChild(container);\r\n } else {\r\n target.innerHTML = wrapper.innerHTML;\r\n }\r\n if (this.style) {\r\n this.addStyle(this.style);\r\n }\r\n if (this.classNames) {\r\n if (this.classNames.length > 0) {\r\n for (let i = 0; i < this.classNames.length; i++) {\r\n this.addClass(this.classNames[i]);\r\n }\r\n }\r\n }\r\n\r\n if (this.afterRender) {\r\n this.afterRender();\r\n }\r\n // we use isViewRendered function to check if the view has rendered? in which case we can just show/hide subsequently\r\n this.isRendered = true;\r\n }\r\n\r\n isViewRendered() {\r\n return this.isRendered;\r\n }\r\n\r\n getContainerSelector() {\r\n return this.elements.containerSelector;\r\n }\r\n\r\n getContainer() {\r\n let wrapper = null;\r\n if (this.wrap) {\r\n wrapper = this.context.querySelector(this.getContainerSelector());\r\n return wrapper;\r\n }\r\n wrapper = this.context.querySelector(this.options.targetElementSelector);\r\n return wrapper;\r\n }\r\n\r\n unrender(remove) {\r\n const wrapperContainer = this.context.getElementById(this.identifier);\r\n if (wrapperContainer) {\r\n hideElement(wrapperContainer);\r\n }\r\n // remove altogether if asked\r\n if (remove == true) {\r\n try {\r\n this.context.body.removeChild(wrapperContainer);\r\n } catch (e) { }\r\n }\r\n }\r\n\r\n addStyle(css) {\r\n const cssArr = Array.isArray(css) ? css : [css]; // css could be a single obj or list of css obj's\r\n for (let i = 0; i < cssArr.length; i++) {\r\n addStyleTextInIframe(cssArr[i], undefined, undefined, this.context);\r\n }\r\n }\r\n\r\n // apply a css class on the wrapper div or actual container of the View\r\n addClass(className) {\r\n // var wrapper = this.getContainer();\r\n const templateContainer = this.context.querySelector(`#${this.identifier}`);\r\n if (templateContainer) {\r\n addClass(templateContainer, className);\r\n }\r\n }\r\n\r\n removeClass(className) {\r\n const templateContainer = this.context.querySelector(`#${this.identifier}`);\r\n if (templateContainer) {\r\n removeClass(templateContainer, className);\r\n }\r\n }\r\n\r\n // removes all classes and sets only this class if supplied\r\n resetClass(className) {\r\n const wrapper = this.getContainer();\r\n wrapper.className = ''; // clear previous classes\r\n if (className) {\r\n this.addClass(className);\r\n }\r\n }\r\n\r\n parse(simpleView) {\r\n this.options = simpleView.options;\r\n this.identifier = simpleView.identifier;\r\n this.template = simpleView.template;\r\n this.rawContent = simpleView.rawContent;\r\n this.context = simpleView.context;\r\n this.style = simpleView.style;\r\n this.wrap = simpleView.wrap;\r\n this.renderOninit = simpleView.renderOninit;\r\n this.elements = simpleView.elements;\r\n this.model = simpleView.model;\r\n }\r\n\r\n bind(ev, cb) {\r\n // not tested/used much yet\r\n let elMatched;\r\n try {\r\n elMatched = this.context.querySelector(this.elements.containerSelector);\r\n } catch (e) {\r\n throw 'invalid selector';\r\n }\r\n if (elMatched) {\r\n observe(elMatched, ev, cb.bind2(this, cb)); // invoke cb with in 'this' context\r\n }\r\n }\r\n}\r\n","import decodeHTML from \"./decodeHTML\";\r\nimport parseTemplate from \"./parseTemplate\";\r\nimport removeTextFollowedByColon from \"./removeTextFollowedByColon\";\r\nimport GlobalVariables from \"../GlobalVariables\";\r\nimport { ScriptsQuestionType } from \"../enums/Enum\";\r\nimport logIt from \"../../../logIt\";\r\n\r\n/*\r\n * This is a stand-alone class to cater handling piped messages regardless of the context (i.e. DOM or Prechat)\r\n * USAGE:\r\n * 1- just call ApexChat.PipedMessageHandlerSingleton.isValidPipedMessage(msg)\r\n * 2- and if true call ApexChat.PipedMessageHandlerSingleton.startPolling({optional callbacks to plug custom behavior})\r\n * EXAMPLE: see onMessageArrived in chatroom-v3.js\r\n */\r\nconst PipedMessageHandler = function (options) {\r\n const me = this;\r\n me.isValidPipedMessage = false;\r\n me.messageInterval = null;\r\n me._pollPeriodically = function () {\r\n logIt(`MULTI::polling with delay:${me.interval}`);\r\n window.clearInterval(me.messageInterval);\r\n let calcInterval = me.interval;\r\n // priodically change timeout for each split piped message\r\n if (me.intervalsArray) {\r\n for (let i = 0; i < me.multiMessages.length; i++) {\r\n if (me.intervalsArray[i]) {\r\n calcInterval = me.intervalsArray[i];\r\n }\r\n console.log(i, me.intervalsArray[i], calcInterval);\r\n }\r\n }\r\n me.messageInterval = setInterval(pollMessages, calcInterval); // start sending messages async\r\n };\r\n me.isProcessing = false; // introduced a flag to keep track of whether a msg is already being processed\r\n\r\n // Firstly, validate the message as a piped msg; if true, initialize things required for polling later\r\n const delayEstimator = function (number) {\r\n if (number <= 30) {\r\n return 2000;\r\n }\r\n if (number <= 50) {\r\n return 2500;\r\n }\r\n if (number <= 75) {\r\n return 3000;\r\n }\r\n if (number <= 100) {\r\n return 3500;\r\n }\r\n return 4000;\r\n };\r\n const validateMessage = function (args) {\r\n me.isProcessing = true; // turn on\r\n\r\n // m must be a Plain or QT msg delimitted by || with the last one QT text\r\n if (args.m.questionType >= ScriptsQuestionType.None &&\r\n args.m.text.indexOf(GlobalVariables.FULLTEXT_MULTIPLE_MESSAGE_DELIMITER) > 0) {\r\n me.isValidPipedMessage = true;\r\n me.args = args;\r\n me.args.m.text = parseTemplate(\r\n removeTextFollowedByColon(decodeHTML(me.args.m.text)),\r\n ApexChat.options || ''\r\n );\r\n me.multiMessages = me.args.m.text\r\n .split(GlobalVariables.FULLTEXT_MULTIPLE_MESSAGE_DELIMITER)\r\n .reverse();\r\n me.randomIdSeed = Math.ceil(Math.random() * 100000);\r\n\r\n // Generate differnt timeout for each split pipe message\r\n me.intervalsArray = [];\r\n if (me.args.m.isFromHistory) {\r\n me.intervalsArray = undefined;\r\n } else if (me.multiMessages.length > 1) {\r\n for (var i = 0; i < me.multiMessages.length; i++) {\r\n // remove text before :: to calculate the actual time\r\n const leanText = removeTextFollowedByColon(me.multiMessages[i]);\r\n if (me.multiMessages[i].length) {\r\n // check if pipe message is first then duration to be set from options\r\n // check if the length os less than or equal to 100 than\r\n // apply the factor or use 4000ms delay by default\r\n if (i === me.multiMessages.length - 1) {\r\n if (!ApexChat.addDelayToMappedQuestion) {\r\n const firstMessageDuration = options &&\r\n options.preChat &&\r\n options.preChat.preChatMessages &&\r\n options.preChat.preChatMessages.length > 0 &&\r\n options.preChat.preChatMessages[0].duration > 0;\r\n\r\n if (firstMessageDuration) {\r\n me.intervalsArray.push(\r\n options.preChat.preChatMessages[0].duration * 1000\r\n );\r\n } else {\r\n me.intervalsArray.push(1000);\r\n }\r\n } else {\r\n me.intervalsArray.push(delayEstimator(+leanText.length));\r\n }\r\n } else {\r\n me.intervalsArray.push(delayEstimator(+leanText.length));\r\n }\r\n }\r\n }\r\n }\r\n // now check how many msgs should be processed quickly\r\n // criteria: match me.multiMessages vs ApexChat.prechatMessagesDisplayed\r\n // get index of last prechat msg clicked and hence calculate _noOfQuickMsgs\r\n if (ApexChat.prechatMessagesDisplayed) {\r\n let count = 0;\r\n // Simple Reverse was disturbing the orignal Array, i used slice().reverse()\r\n // Source: https://stackoverflow.com/questions/30610523/reverse-array-in-javascript-without-mutating-original-array\r\n const multiMessages = me.multiMessages.slice().reverse();\r\n for (var i = 0; i < ApexChat.prechatMessagesDisplayed.length; i++) {\r\n var totalPipedMsgArray = ApexChat.prechatMessagesDisplayed[i];\r\n multiMessages.find((displayedMsg, i) => {\r\n if (totalPipedMsgArray.text === displayedMsg &&\r\n totalPipedMsgArray.isShown) {\r\n count++;\r\n }\r\n });\r\n }\r\n me._noOfQuickMsgs = count;\r\n ApexChat.prechatMessagesDisplayed = null; // dispose once used\r\n }\r\n return true;\r\n }\r\n me.isProcessing = false;\r\n logIt('The message is not a pipped one');\r\n return false;\r\n };\r\n // used to stop polling after last msg has been sent over\r\n function stopPolling() {\r\n // cleanup previous state just in case, before processing a new msg\r\n _destroy();\r\n }\r\n // used to send split parts of a QT message 1-by-1\r\n function pollMessages(recur) {\r\n if (!me.multiMessages || (me.multiMessages && me.multiMessages.length === 0)) {\r\n // if multiMessage not available\r\n stopPolling(); // stop polling if its running.\r\n return;\r\n }\r\n logIt(`MULTI::polling messages:${me.multiMessages.length}`);\r\n if (me.multiMessages.length == 1) {\r\n // the last one? treat it as a normal QT\r\n me.args.m.isSplitMessage = true;\r\n var msg = me.multiMessages.pop(); // pick the last QT msg\r\n me.args.m.text = msg;\r\n // we already have 3s delay for piped/split messages,\r\n // so we need to bypass config based questionTypeDelaySeconds\r\n // to avoid longer delays for a QT in the pipped msg\r\n if (me.args.m.questionType > 0) {\r\n me.args.m.questionTypeDelaySeconds = me.interval;\r\n }\r\n me.args.m.isLastSplitMessage = true;\r\n me.args.cb = stopPolling; // send stopPolling over to the caller; i.e. onMessageArrived in widgetbase.js\r\n logIt(`MULTI:: polling last msg:${JSON.stringify(me.args)}`);\r\n me._lastPollingCallback(me.args); // pass on to further process; e.g. display the last msg\r\n return;\r\n }\r\n // handle initial texts 1-by-1 as plain msgs\r\n var msg = me.multiMessages.pop(); // pick next split msg\r\n\r\n // clone m\r\n const copyMsg = JSON.parse(JSON.stringify(me.args.m));\r\n copyMsg.createdOn = me.args.m.createdOn;\r\n copyMsg.questionType = ScriptsQuestionType.None; // treat the initial texts as plain messages\r\n copyMsg.text = msg;\r\n copyMsg.id = ++me.randomIdSeed;\r\n copyMsg.isSplitMessage = true;\r\n logIt(`MULTI:: polling: ${JSON.stringify(copyMsg)}`);\r\n me._startPollingCallback(copyMsg).then(() => {\r\n // process quick msgs and display the rest with delay\r\n // we need 1 not 0 because the first message will always be seen and already executed, in above code.\r\n if (recur && me._noOfQuickMsgs > 1) {\r\n me._noOfQuickMsgs--;\r\n pollMessages(recur);\r\n } else {\r\n me._pollPeriodically();\r\n }\r\n\r\n }) // pass on to further process; e.g. display the msg\r\n\r\n\r\n\r\n\r\n }\r\n\r\n var _destroy = function () {\r\n me.isValidPipedMessage = false;\r\n window.clearInterval(me.messageInterval);\r\n me.args = null;\r\n me._noOfQuickMsgs = null;\r\n me.multiMessages = null;\r\n me.randomIdSeed = null;\r\n me.isProcessing = false;\r\n me._init = null;\r\n me._startPollingCallback = null;\r\n me._lastPollingCallback = null;\r\n };\r\n const _startPolling = async (options) => {\r\n // set callbacks\r\n const _init = options && options.init ? options.init : function () { };\r\n try {\r\n _init(); // call any init function if specified by caller\r\n } catch (ex) {\r\n logIt(`error occurred:${ex}`);\r\n }\r\n // setup start/end of polling behavior\r\n me._startPollingCallback = options && options.startPollingCallback;\r\n me._lastPollingCallback = options && options.lastPollingCallback;\r\n me._beforePollingCallBack = options.beforePollingCallBack;\r\n me.interval = options.messageDisplayDuration || 3000;\r\n // if _validateMessage method has calculated any me._noOfQuickMsgs, process them\r\n if (me._noOfQuickMsgs && me._noOfQuickMsgs > 0) {\r\n // make sure the number of message is greater than 0\r\n pollMessages(true);\r\n } else {\r\n me._pollPeriodically();\r\n }\r\n };\r\n const _isProcessing = function () {\r\n return me.isProcessing;\r\n };\r\n const _resetInterval = function (ms) {\r\n window.clearInterval(me.messageInterval);\r\n me.interval = ms; // re-start sending messages with new interval\r\n\r\n };\r\n return {\r\n isValidPipedMessage: validateMessage,\r\n startPolling: _startPolling,\r\n reset: _destroy,\r\n isProcessing: _isProcessing,\r\n resetInterval: _resetInterval\r\n };\r\n};\r\nexport default PipedMessageHandler;\r\n","const getStyle = (el, cssStyle) => {\r\n if (!el) return;\r\n const re = /(-)(\\w)/g;\r\n const ieStyle = cssStyle.replace(re, (m, p1, p2) => p2.toUpperCase());\r\n if (el?.currentStyle) {\r\n // IE\r\n return el.currentStyle[ieStyle];\r\n }\r\n if (window.getComputedStyle) {\r\n // W3C\r\n return window.getComputedStyle(el, '').getPropertyValue(cssStyle);\r\n }\r\n return null;\r\n};\r\nexport default getStyle;\r\n","const ParticipantIds = {\r\n visitor: 0,\r\n system: -1,\r\n bot: -2,\r\n prechat: -3,\r\n predefined: -4,\r\n nonVisitorSystem: -6, // system message to be shown on only dashboard end, and not on visitor end\r\n pokeMessage: -7,\r\n AIBot: -8\r\n};\r\nexport default ParticipantIds;\r\n"],"names":["options","type","parsedOptions","ApexChat","TryParse","length","forEach","element","option","decodeHTML","text","JSON","stringify","ex","logIt","func","timeout","setTimeout","ele","cls","hasClass","reg","RegExp","className","replace","html","decodedHtml","match","GlobalVariables","encodedHtmlRegex","scriptTagRegex","styleTagRegex","str","a","document","createElement","innerHTML","c","childNodes","i","nodeType","isHTML","tempDiv","anchors","getElementsByTagName","setAttribute","correctAnchorTarget","RunUntil","delay","condition","interval","setInterval","clearInterval","re","val","indexOf","split","txt","value","SimpleView","constructor","this","context","identifier","template","rawContent","afterRender","beforeRender","containerSelector","isTemplateAlreadyParsed","style","classNames","classes","wrap","renderOninit","elements","model","isRendered","render","container","target","targetElementSelector","querySelector","body","wrapper","containerElemType","getTemplate","containerId","appendChild","addStyle","addClass","isViewRendered","getContainerSelector","getContainer","unrender","remove","wrapperContainer","getElementById","hideElement","removeChild","e","css","cssArr","Array","isArray","addStyleTextInIframe","undefined","templateContainer","removeClass","resetClass","parse","simpleView","bind","ev","cb","elMatched","observe","bind2","me","isValidPipedMessage","messageInterval","_pollPeriodically","window","calcInterval","intervalsArray","multiMessages","console","log","pollMessages","isProcessing","delayEstimator","number","stopPolling","_destroy","recur","args","m","isSplitMessage","msg","pop","questionType","questionTypeDelaySeconds","isLastSplitMessage","_lastPollingCallback","copyMsg","createdOn","ScriptsQuestionType","None","id","randomIdSeed","_startPollingCallback","then","_noOfQuickMsgs","_init","FULLTEXT_MULTIPLE_MESSAGE_DELIMITER","parseTemplate","removeTextFollowedByColon","reverse","Math","ceil","random","isFromHistory","leanText","addDelayToMappedQuestion","push","preChat","preChatMessages","duration","prechatMessagesDisplayed","count","slice","totalPipedMsgArray","find","displayedMsg","isShown","startPolling","async","init","startPollingCallback","lastPollingCallback","_beforePollingCallBack","beforePollingCallBack","messageDisplayDuration","reset","resetInterval","ms","getStyle","el","cssStyle","ieStyle","p1","p2","toUpperCase","currentStyle","getComputedStyle","getPropertyValue","visitor","system","bot","prechat","predefined","nonVisitorSystem","pokeMessage","AIBot"],"sourceRoot":""}