{"version":3,"file":"static/js/6028.99187a2d.chunk.js","mappings":"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","sources":["app-react/components/base-components/orbit-component-with-state/orbit-component-with-state.ts","app-react/components/base-components/orbit-component/orbit-component.ts","app-react/components/raw-components/image/image.tsx","app-react/components/tap-handler/tap-handler.component.tsx","app-react/orbit-context.ts","app-react/services/dom/dom.service.ts","app-react/services/routing/route/fallback-route.ts","app-react/services/routing/route/route-base.ts","app-react/services/routing/routing-utils.ts","app-react/services/splash/splash.service.ts","common/utils/time-functions.ts","sdk/src/utils/device/detection/feature.ts","sdk/src/utils/device/detection/os.ts","sdk/src/utils/device/detection/viewport.ts","sdk/src/utils/device/detection/model.ts","sdk/src/utils/device/detection/browser.ts","sdk/src/utils/device/detection/hybrid.ts","sdk/src/utils/device/device.ts","sdk/src/utils/dom.ts","sdk/src/utils/logger.ts","sdk/src/utils/store.ts","sdk/src/utils/strings.ts","sdk/src/utils/underscore.ts","utils/array-helper.ts","utils/automation-helpers.ts","utils/lazy.ts","utils/string-helpers.ts"],"sourcesContent":["import React from 'react';\nimport {IServiceFactory} from '../../../services/service-factory.interface';\nimport {OrbitContext} from '../../../orbit-context';\nimport {reaction as mobxReaction, IReactionDisposer, IReactionOptions, IReactionPublic} from 'mobx';\n\n\nexport class OrbitComponentWithState extends React.Component {\n\n private _reactions: IReactionDisposer[] = [];\n\n protected get services(): IServiceFactory {\n /** This code is for unit tests, enzyme is not compatible wit the current react context api so we pass the context through a prop */\n if ((this.props as any)['context']) {\n return (this.props as any)['context'].services;\n }\n\n return (this.context as any).services;\n }\n\n //React life time hooks stubs for future use\n componentDidMount() {}\n\n componentWillUnmount() {\n this._disposeReactions();\n }\n\n\n reaction(expression: (r: IReactionPublic) => T, effect: (arg: T, prev: FireImmediately extends true ? T | undefined : T, r: IReactionPublic) => void, opts?: IReactionOptions): IReactionDisposer {\n let disposer = mobxReaction(expression, effect, opts);\n this._reactions.push(disposer);\n return disposer;\n }\n\n private _disposeReactions() {\n this._reactions.forEach(disposer => disposer());\n }\n}\n\nOrbitComponentWithState.contextType = OrbitContext;\n","import {ReactNode} from 'react';\nimport {OrbitComponentWithState} from \"../orbit-component-with-state/orbit-component-with-state\";\n\n\n\nexport class OrbitComponent extends OrbitComponentWithState {\n}\n\n\n\n","import React, {createRef, PropsWithChildren} from 'react';\nimport {TapHandlerLogic} from '../../tap-handler/tap-handler.component';\nimport {OrbitComponentWithState} from \"../../base-components/orbit-component-with-state/orbit-component-with-state\";\n\nenum IMAGE_TYPE {\n EMPTY_IMAGE_BASE64,\n FALLBACK,\n SRC\n};\nenum IMAGE_STATUS {\n LAZY,\n LOADING,\n SETTLED\n}\n\ninterface ImageSettleStatus {\n value: \"load\" | \"error\",\n type: IMAGE_TYPE,\n}\n\n/**\n * We could have defined this interface as \"ImageProps extends React.ImgHTMLAttributes\"\n * and define inside only what's extra (like \"lazy\" or \"fallbackSrc\") and props that alter the original def (like \"width: number\" instead of default \"width: string | number\")\n * But in case of someone styling the \"Image\" component with: styled(Image)<{squareIcon: boolean}>. The extra prop will bleed into the DOM and React will throw:\n * -- \"Warning: React does not recognize the `squareIcon` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `squareicon` instead. If you accidentally passed it from a parent component, remove it from the DOM element.\"\n * Also, ocasionally I am getting this warning\n * -- \"Warning: React does not recognize the `forwardedRef` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `forwardedref` instead. If you accidentally passed it from a parent component, remove it from the DOM element.\"\n *\n * So I am whitelisting props we actually use, and I am filtering based on that\n */\nexport interface ImageProps extends PropsWithChildren {\n // props common with React.ImgHTMLAttributes\n src: string;\n alt?: string;\n className?: string;\n style?: React.CSSProperties,\n title?: string;\n onClick?(event: React.MouseEvent): void;\n onLoad?(e: React.SyntheticEvent): void;\n onError?(e: React.SyntheticEvent): void;\n\n // props derived from React.ImgHTMLAttributes with slight changes\n width?: number; // instead of string | number\n height?: number; // instead of string | number\n\n // custom props\n fallbackSrc?: string;\n enableTap?: boolean;\n lazy?: boolean;\n onLoadStart?(): void;\n onSettled?(settleStatus: ImageSettleStatus): void;\n fetchPriority?: \"high\" | \"low\" | \"auto\"\n}\n\ninterface ImageState {\n src: string;\n type: IMAGE_TYPE;\n status: IMAGE_STATUS;\n}\n\nconst EMPTY_IMAGE = 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=';\n\nexport class Image extends OrbitComponentWithState {\n\n private _imgRef: React.RefObject = createRef();\n private _fetchPriority = {fetchpriority: this.props.fetchPriority || 'auto'}\n\n constructor(props: ImageProps) {\n super(props);\n this.state = this._getInitialSrcState();\n }\n\n componentDidMount() {\n super.componentDidMount();\n if (this._imgRef.current) {\n this._createTapLogicHandler(this._imgRef.current);\n this._createIntersectionObserver(this._imgRef.current);\n }\n }\n\n private _getInitialSrcState() {\n /**\n * If this is a lazy load image we initialize the state.src with the fallback image from props\n * but in case this is not provided we just set an empty image gif.\n * This will prevent the borders to be visible around the image while scrolled into the view.\n */\n if (this.props.lazy) {\n return {\n src: this.props.fallbackSrc || EMPTY_IMAGE,\n type: this.props.fallbackSrc ? IMAGE_TYPE.FALLBACK : IMAGE_TYPE.EMPTY_IMAGE_BASE64,\n status: IMAGE_STATUS.LAZY\n };\n }\n if (this.props.onLoadStart) {\n this.props.onLoadStart();\n }\n return {\n src: this.props.src,\n type: IMAGE_TYPE.SRC,\n status: IMAGE_STATUS.LOADING\n };\n }\n\n private _onLoad = (e: React.SyntheticEvent) => {\n if (this.state.status === IMAGE_STATUS.LAZY) {\n return;\n }\n if (this.state.status === IMAGE_STATUS.LOADING) {\n this.setState({\n status: IMAGE_STATUS.SETTLED\n });\n if (this.state.type === IMAGE_TYPE.SRC && this.props.onLoad) {\n this.props.onLoad(e);\n }\n if (this.props.onSettled) {\n this.props.onSettled({\n value: \"load\",\n type: this.state.type\n });\n }\n }\n }\n private _onError = (e: React.SyntheticEvent) => {\n if (this.state.status === IMAGE_STATUS.LAZY && this.state.type === IMAGE_TYPE.FALLBACK) {\n this.setState({\n src: EMPTY_IMAGE,\n type: IMAGE_TYPE.EMPTY_IMAGE_BASE64,\n });\n }\n if (this.state.status === IMAGE_STATUS.LOADING) {\n if (this.state.type === IMAGE_TYPE.SRC) {\n this.setState({\n src: this.props.fallbackSrc || EMPTY_IMAGE,\n type: this.props.fallbackSrc ? IMAGE_TYPE.FALLBACK : IMAGE_TYPE.EMPTY_IMAGE_BASE64\n });\n if (this.props.onError) {\n this.props.onError(e);\n }\n } else if (this.state.type === IMAGE_TYPE.FALLBACK) {\n this.setState({\n src: EMPTY_IMAGE,\n type: IMAGE_TYPE.EMPTY_IMAGE_BASE64,\n });\n } else if (this.state.type === IMAGE_TYPE.EMPTY_IMAGE_BASE64) {\n this.setState({\n status: IMAGE_STATUS.SETTLED\n });\n if (this.props.onSettled) {\n this.props.onSettled({\n value: \"error\",\n type: this.state.type\n });\n }\n }\n }\n }\n\n componentWillUnmount() {\n super.componentWillUnmount();\n this._destroyIntersectionObserver();\n this._destroyTapLogicHandler();\n }\n\n componentDidUpdate(prevProps: ImageProps) {\n if (this.props.fallbackSrc !== prevProps.fallbackSrc && this.state.type === IMAGE_TYPE.FALLBACK) {\n this.setState({\n src: this.props.fallbackSrc\n });\n }\n if (this.props.src !== prevProps.src) {\n if (this.state.status === IMAGE_STATUS.SETTLED) {\n this.setState({\n src: this.props.src,\n type: IMAGE_TYPE.SRC\n });\n }\n }\n }\n\n private _tapHandlerLogic: TapHandlerLogic | null = null;\n private _createTapLogicHandler(element: HTMLElement) {\n if (this.props.enableTap) {\n this._destroyTapLogicHandler();\n this._tapHandlerLogic = new TapHandlerLogic(element);\n }\n }\n\n private _destroyTapLogicHandler() {\n if (this._tapHandlerLogic) {\n this._tapHandlerLogic.dispose();\n this._tapHandlerLogic = null;\n }\n }\n\n private _intersectionObserver: IntersectionObserver | null;\n\n private _createIntersectionObserver(element: HTMLImageElement) {\n if (!this.props.lazy) {\n return;\n }\n\n // just in case this is called twice for this component we want to discard the existing intersection observer and create a new one\n this._destroyIntersectionObserver();\n\n this._intersectionObserver = new IntersectionObserver(this._intersectionObserverCallback, {\n rootMargin: '15px',\n threshold: 0.1\n });\n\n this._intersectionObserver.observe(element);\n }\n\n private _destroyIntersectionObserver() {\n if (this._intersectionObserver) {\n this._intersectionObserver.disconnect();\n this._intersectionObserver = null;\n }\n }\n\n private _intersectionObserverCallback = (entries: IntersectionObserverEntry[], observer: IntersectionObserver) => {\n if (entries[0].intersectionRatio > 0 || entries[0].isIntersecting) {\n this._destroyIntersectionObserver();\n\n this.setState({\n src: this.props.src,\n type: IMAGE_TYPE.SRC,\n status: IMAGE_STATUS.LOADING\n });\n if (this.props.onLoadStart) {\n this.props.onLoadStart();\n }\n } else {\n if(this._imgRef.current){\n this._createIntersectionObserver(this._imgRef.current);\n }\n }\n };\n\n render() {\n\n let {\n // standard img props that need to be altered\n alt,\n // pass-through props\n className, title, width, height, style\n } = this.props;\n\n return ;\n }\n\n}\n","import React, {PropsWithChildren} from 'react';\nimport {OrbitComponent} from '../base-components/orbit-component/orbit-component';\nimport {ORBIT_TAP} from '../../themes/css-global-classes';\n\n\ninterface TapHandlerProps extends PropsWithChildren {\n enabled: boolean;\n elementRef: any;\n}\n\nexport class TapHandlerLogic {\n constructor(private _element: HTMLElement) {\n /**\n * No need to check device.feature.isTouch because on PC touchstart will not trigger\n * And mouseup will trigger afer any\n */\n this._element.addEventListener('touchstart', this._onMouseDownHandler);\n this._element.addEventListener('mousedown', this._onMouseDownHandler);\n this._element.addEventListener('touchend', this._onMouseUpHandler);\n this._element.addEventListener('touchcancel', this._onMouseUpHandler);\n this._element.addEventListener('mouseup', this._onMouseUpHandler);\n }\n\n private _onMouseDownHandler = () => {\n this._element.classList.add(ORBIT_TAP);\n }\n private _onMouseUpHandler = () => {\n this._element.classList.remove(ORBIT_TAP);\n }\n \n dispose() {\n this._element.removeEventListener('touchstart', this._onMouseDownHandler);\n this._element.removeEventListener('mousedown', this._onMouseDownHandler);\n this._element.removeEventListener('touchend', this._onMouseUpHandler);\n this._element.removeEventListener('touchcancel', this._onMouseUpHandler);\n this._element.removeEventListener('mouseup', this._onMouseUpHandler);\n }\n\n}\n\n\nexport class TapHandler extends OrbitComponent {\n\n\n render() {\n return (\n <>\n {this.props.children}\n \n )\n }\n\n\n private _tapHandlerLogic: TapHandlerLogic | null = null;\n\n componentDidMount() {\n super.componentDidMount();\n if(this.props.enabled) {\n this._tapHandlerLogic = new TapHandlerLogic(this.props.elementRef.current);\n }\n\n }\n\n componentWillUnmount() {\n super.componentWillUnmount();\n if(this._tapHandlerLogic) {\n this._tapHandlerLogic.dispose();\n }\n }\n\n\n}\n","import React from 'react';\nimport {IServiceFactory} from './services/service-factory.interface';\n\n\n\nexport interface IOrbitContext {\n services: IServiceFactory\n}\n\nexport const OrbitContext = React.createContext(null!);\n\nexport const OrbitContextProvider = OrbitContext.Provider;\nexport const OrbitContextConsumer = OrbitContext.Consumer;\n","import {IDomService, IFormSubmitParams} from './dom.service.interface';\nimport {EventListenerRegistration} from '../../../utils/event-listener-registration';\nimport DOM from \"../../../sdk/src/utils/dom\";\nimport _ from \"../../../sdk/src/utils/underscore\";\nimport { observable, runInAction, makeObservable } from \"mobx\";\nimport {Check} from \"@sparkware/app-utils\";\n\n\nexport class DomService implements IDomService {\n constructor() {\n makeObservable(this);\n\n this._eventListenerRegistration = new EventListenerRegistration(document);\n DOM.addEventListener(document, 'webkitfullscreenchange', this._onFullScreenChange, false);\n DOM.addEventListener(document, 'mozfullscreenchange', this._onFullScreenChange, false);\n DOM.addEventListener(document, 'fullscreenchange', this._onFullScreenChange, false);\n DOM.addEventListener(document, 'MSFullscreenChange', this._onFullScreenChange, false);\n this.isInFullScreen = _.isFullScreen();\n }\n\n private initialBodyPaddingRight: string | null = null;\n private bodyPaddingRightAltered = false;\n disableScrolling(): void {\n // before we add the class \"no-scrolling\" (that has overflow: hidden) on the body\n // we check if a scrollbar exists. If it exists, we compute the scrollbar thickness and we add it to body's padding-right\n // WE COULD HAVE USED CSS `scrollbar-gutter: stable;` on `html` but that has problems. The spacing auto-added by the browser is outside the DOM\n // and seems to be above everything. Above the overlay, so clicking in that area does not close it\n // and above the right drawer, so the scrollbar of the drawer is not visible on desktop (on Chrome, doesn't happen on Firefox)\n // and also creates positioning problems for right drawers (like user menu on rtl languages)\n\n // instead of comparing document.body.scrollHeight > window.innerHeight to see if we have scrollable content we compare the widths\n // to see if we have a scrollbar. And the difference is the scrollbar thickness.\n if (window.innerWidth > document.body.clientWidth) {\n let scrollbarThickness = window.innerWidth - document.body.clientWidth;\n let bodyComputedStyles: CSSStyleDeclaration = window.getComputedStyle(document.body);\n this.initialBodyPaddingRight = bodyComputedStyles.paddingRight;\n this.bodyPaddingRightAltered = true;\n\n // increase padding by the scrollbar thickness\n this.body.style.paddingRight = \"calc(\" + this.initialBodyPaddingRight + \" + \" + scrollbarThickness + \"px)\";\n }\n this.body.classList.add('no-scrolling');\n }\n\n enableScrolling(): void {\n this.body.classList.remove('no-scrolling');\n if (this.bodyPaddingRightAltered) {\n this.bodyPaddingRightAltered = false;\n this.body.style.paddingRight = this.initialBodyPaddingRight;\n }\n }\n\n querySelector(selector: string): Element | null {\n return document.querySelector(selector);\n }\n\n get body(): HTMLElement {\n return document.body;\n }\n\n get head(): HTMLElement {\n return document.head;\n }\n\n get html(): HTMLElement {\n return document.documentElement;\n }\n\n setDocumentTitle(title: string): void {\n if(title) {\n document.title = title;\n }\n }\n\n get locationPathName(): string {\n return document.location.pathname;\n }\n\n private readonly _eventListenerRegistration;\n get subscribeTo(): EventListenerRegistration {\n return this._eventListenerRegistration;\n }\n\n getElementsByClassName(className: string): HTMLCollectionOf {\n return document.getElementsByClassName(className);\n }\n\n getElementsByTagName(tagName: string): HTMLCollectionOf {\n return document.getElementsByTagName(tagName);\n }\n\n getElementById(id: string): HTMLElement | null {\n return document.getElementById(id);\n }\n\n createElement(tagName: string): HTMLElement {\n return document.createElement(tagName);\n }\n\n @observable.ref\n isInFullScreen: boolean;\n\n private _onFullScreenChange = () => {\n runInAction(() => {\n this.isInFullScreen = _.isFullScreen()\n });\n }\n\n enterFullScreen(): void {\n _.openFullScreen();\n }\n exitFullScreen(): void {\n _.closeFullScreen();\n }\n\n\n performFormPostForUrl(url: string, options?: Pick): void {\n const urlBuilder = new URL(url);\n const urlParams: Record = {};\n\n urlBuilder.searchParams.forEach((paramValue, paramName) => {\n urlParams[paramName] = paramValue;\n });\n\n urlBuilder.search = \"\";\n urlBuilder.hash = \"\";\n\n this.submitForm({\n ...options,\n method: 'post',\n url: urlBuilder.href,\n extraParams: urlParams\n });\n }\n\n submitForm(params: IFormSubmitParams) {\n const form: HTMLFormElement = this.createElement(\"form\") as HTMLFormElement;\n form.className = 'cy-form-post-form';\n form.setAttribute('method', params.method);\n form.setAttribute('target', Check.isNullOrUndefined(params.target) ? '_blank' : params.target);\n form.setAttribute('action', params.url);\n\n let hiddenField: HTMLInputElement = null;\n if (!Check.isNullOrUndefined(params.extraParams)) {\n for (const key in params.extraParams) {\n hiddenField = document.createElement('input');\n hiddenField.setAttribute('type', 'hidden');\n hiddenField.setAttribute('name', key);\n hiddenField.setAttribute('value', params.extraParams[key]);\n form.appendChild(hiddenField);\n }\n }\n\n this.body.appendChild(form);\n form.submit();\n //Timeout is for automation purposes.\n setTimeout(() => this.body.removeChild(form), 500);\n }\n}\n","import {RouteDefinition, RouteParams, RouteRender} from '../../routing-configuration/route-definition/route-definition';\nimport {IRoute} from \"./route.interface\";\nimport React from \"react\";\n\nexport class FallbackRoute implements IRoute{\n private readonly _routeDefinition: RouteDefinition;\n\n constructor(render: RouteRender) {\n this._routeDefinition = {\n paths: [],\n render: render\n }\n }\n\n render(): React.ReactNode {\n return this._routeDefinition.render(this.routeParams);\n }\n\n get routeParams(): RouteParams {\n return {};\n }\n\n get isOrbitRoute(): boolean {\n return false;\n }\n\n get data(): any {\n return {};\n }\n\n get routeDefinition(): RouteDefinition {\n return this._routeDefinition;\n }\n\n protected _isMiniOrbitRoute(): boolean {\n return false;\n }\n}\n","import {IRoute} from './route.interface';\nimport {RouteData, RouteDefinition, RouteParams} from '../../routing-configuration/route-definition/route-definition';\nimport React from 'react';\n\nexport abstract class RouteBase implements IRoute {\n constructor(private _routeDefinition: RouteDefinition, private _routeParams: RouteParams) {}\n\n render(): React.ReactNode {\n return this._routeDefinition?.render(this._routeParams);\n }\n\n get routeParams(): RouteParams {\n return this._routeParams;\n }\n\n get isOrbitRoute(): boolean {\n return this._isOrbitRoute();\n }\n\n get data(): RouteData {\n return this._routeDefinition.data;\n }\n\n get routeDefinition(): RouteDefinition {\n return this._routeDefinition;\n }\n\n\n protected abstract _isOrbitRoute(): boolean;\n\n}\n","import { matchPath } from 'react-router';\nimport {RouteDefinition, RouteParams} from '../routing-configuration/route-definition/route-definition';\n\n\nexport interface RouteMatchResult {\n routeDefinition: RouteDefinition;\n routeParams: RouteParams;\n}\nexport function tryMatchPath(pathToMatch: string, routes: RouteDefinition[]): RouteMatchResult {\n for(let i = 0; i < routes.length; i++) {\n let routeDefinition = routes[i];\n\n for(let j = 0; j < routeDefinition.paths.length; j++) {\n let pattern = routeDefinition.paths[j];\n let match = matchPath({\n path: pattern,\n caseSensitive: false,\n end: routeDefinition.exact ?? true\n }, pathToMatch.toLowerCase());\n\n if(match) {\n return {\n routeDefinition: routeDefinition,\n routeParams: match.params\n };\n }\n }\n }\n\n return null;\n}","import {ISplashService} from './splash-service.interface';\nimport {Check} from '@sparkware/app-utils';\nimport {isInsideAutomation} from \"../../../utils/automation-helpers\";\n\n\nexport class SplashService implements ISplashService {\n constructor(private readonly onAfterRemoveSplash?: () => void) {\n\n }\n\n computeSplashTimeInSeconds(startTime: number): number {\n return parseFloat(((performance.now() - startTime) / 1000).toFixed(2));\n }\n\n splashTime: number = null;\n\n removeSplash(): void {\n if(!Check.isNull(this.splashTime)) {\n console.error('removeSplash called second time!');\n return;\n }\n //document.body.style.removeProperty('position');\n\n let splashPageElement = document.getElementById('splash-page');\n if(splashPageElement) {\n splashPageElement.remove();\n }\n this.splashTime = this.computeSplashTimeInSeconds(window['splashStart']);\n\n this._splashRemovedSubscribers.forEach(callback => callback());\n\n this._enablePrerender();\n\n if(this.onAfterRemoveSplash) {\n this.onAfterRemoveSplash();\n }\n }\n\n private _splashRemovedSubscribers: Array<() => void> = [];\n onSplashRemoved(callback: () => void) {\n this._splashRemovedSubscribers.push(callback);\n }\n\n private _enablePrerender() {\n const timeoutValue = isInsideAutomation() ? 0 : 5000;\n //We want to give 5 more sec of delay before pre render take the snapshot to make sure all b2c banner loaded\n setTimeout(() => {\n window['prerenderReady'] = true;\n }, timeoutValue);\n }\n}\n","import {getCypressToOrbitHooks, NamedIntervalType, isInsideAutomation} from '../../utils/automation-helpers';\nimport {TimeIntervalName} from './time-interval-names';\nimport {Check, TimeSpan} from '@sparkware/app-utils';\n\nfunction convertToTimeSpan(interval: number | TimeSpan): TimeSpan {\n if(Check.isNumber(interval)) {\n return TimeSpan.fromMilliseconds(interval);\n } else {\n return interval;\n }\n}\n\nfunction namedTimer(name: TimeIntervalName | null | undefined,\n handler: () => void,\n interval: TimeSpan | number | undefined,\n intervalType: NamedIntervalType,\n javascriptFunction: (handler: () => void, timeout: number) => number): number {\n\n if(Check.isNullOrUndefined(handler)) {\n throw new Error('namedInterval: handler argument cannot be null or undefined');\n }\n\n if(Check.isNullOrUndefined(interval)) {\n interval = TimeSpan.fromMilliseconds(0);\n }\n\n let timeSpan = convertToTimeSpan(interval);\n\n if(name && isInsideAutomation()) {\n const response = getCypressToOrbitHooks().onTimeIntervalCreation(name, handler, timeSpan, intervalType);\n if(response.ignoreJavaScriptImplementation) {\n // we are here because current running test decided to fake this timer\n return response.timerId;\n }\n }\n\n\n\n return javascriptFunction(handler, timeSpan.totalMilliseconds);\n}\n\n\n\nexport function namedSetInterval(name: TimeIntervalName, handler: () => void, interval: TimeSpan | number): number {\n return namedTimer(name, handler, interval, NamedIntervalType.setInterval, setInterval);\n}\n\nexport function namedSetTimeout(name: TimeIntervalName, handler: () => void, interval: TimeSpan | number): number {\n return namedTimer(name, handler, interval, NamedIntervalType.setTimeout, setTimeout);\n}","export class DeviceFeatureDetection {\n /**\n * The device supports touch, does it have a touchscreen\n */\n public get isTouch() {\n return (\n ('ontouchstart' in window)\n || ((window as any).DocumentTouch && document instanceof (window as any).DocumentTouch)\n || (window.navigator.maxTouchPoints !== undefined && window.navigator.maxTouchPoints > 0)\n );\n }\n}\n","import UAParser from \"ua-parser-js\";\n\nexport class DeviceOSDetection {\n private os: UAParser.IOS;\n constructor(private parser: UAParser) {\n this.os = this.parser.getOS();\n }\n\n /**\n * Returns the name of the operating system\n *\n * Possible 'os.name' - data taken from ua-parser-js\n * AIX, AmigaOS, Android, Arch, Bada, BeOS, BlackBerry, CentOS, ChromiumOS, Contiki,\n * Fedora, FirefoxOS, FreeBSD, Debian, DragonFly, Gentoo, GNU, Haiku, Hurd, iOS,\n * Joli, Linpus, Linux, MacOS, Mageia, Mandriva, MeeGo, Minix, Mint, MorphOS, NetBSD,\n * Nintendo, OpenBSD, OpenVMS, OS/2, Palm, PCLinuxOS, Plan9, Playstation, QNX, RedHat,\n * RIM Tablet OS, RISCOS, Sailfish, Series40, Slackware, Solaris, SUSE, Symbian, Tizen,\n * Ubuntu, UNIX, VectorLinux, WebOS, Windows[Phone/Mobile], Zenwalk\n */\n public get name() {\n // ua-parser-js returns human readable names like \"Mac OS\". I want without spaces to be able to use them as keys in an object\n // example in the external_links_consts.js where macos and safari are used as keys.\n // also, we make it lowercase for comodity\n return this.os.name.replace(/\\s/g, \"\").toLowerCase();\n }\n\n /**\n * Returns the major version of the operating system\n */\n public get version() {\n return parseInt(this.os.version.split(\".\")[0]);\n }\n\n public get isIOS() {\n return this.name === 'ios';\n }\n\n public get isAndroid() {\n return this.name === 'android';\n }\n\n public get isPC() {\n return [\"centos\", \"fedora\", \"debian\", \"linux\", \"macos\", \"pclinuxos\", \"redhat\", \"ubuntu\", \"unix\", \"vectorlinux\", \"windows\"].indexOf(this.name) && !this.isMobileOS;\n }\n\n public get isMacOS() {\n return this.name === 'macos';\n }\n\n public get isMobileOS() {\n return (this.isIOS || this.isAndroid);\n }\n\n}\n","export class DeviceViewportDetection {\n\n /**\n * Get viewport width.\n */\n public get width() {\n return window.innerWidth;\n }\n\n /**\n * Get viewport height.\n */\n public get height() {\n return window.innerHeight;\n }\n\n /**\n * Get screen height.\n */\n public get screenHeight() {\n return window.screen.height;\n }\n\n /**\n * Get screen width.\n */\n public get screenWidth() {\n return window.screen.width;\n }\n\n /**\n * Get the pixel ratio for the current running device.\n */\n public get pixelRatio() {\n var ratio = 1;\n\n const screen = window.screen as any;\n\n // To account for zoom, change to use deviceXDPI instead of systemXDPI\n if (screen.systemXDPI !== undefined && screen.logicalXDPI !== undefined && screen.systemXDPI > screen.logicalXDPI) {\n // Only allow for values > 1\n ratio = screen.systemXDPI / screen.logicalXDPI;\n } else if (window.devicePixelRatio !== undefined) {\n ratio = window.devicePixelRatio;\n }\n return ratio;\n }\n\n public get isPortrait() {\n return window.matchMedia(\"(orientation: portrait)\").matches;\n }\n}","import UAParser from \"ua-parser-js\";\n\nexport class DeviceModelDetection {\n private device: UAParser.IDevice;\n constructor(private parser: UAParser) {\n this.device = this.parser.getDevice();\n }\n\n /**\n * Is it an iPhone?\n */\n public get isIphone() {\n return this.device.vendor === \"Apple\" && this.device.model === \"iPhone\";\n }\n\n public get isIpad() {\n return this.device.vendor === \"Apple\" && this.device.model === \"iPad\";\n }\n\n public get deviceType() {\n return this.device.type;\n }\n}\n","import UAParser from \"ua-parser-js\";\n//https://confluence/pages/viewpage.action?spaceKey=WEB&title=iframe-allow-camera\nimport { getAllowAttr } from '@888webteam/iframe-allow-camera';\n\nexport class DeviceBrowserDetection {\n private browser: UAParser.IBrowser;\n constructor(private parser: UAParser) {\n this.browser = this.parser.getBrowser();\n }\n\n /**\n * Returns the name of the browser\n *\n * Possible values :\n * Amaya, Android Browser, Arora, Avant, Baidu, Blazer, Bolt, Camino, Chimera, Chrome,\n * Chromium, Comodo Dragon, Conkeror, Dillo, Dolphin, Doris, Edge, Epiphany, Fennec,\n * Firebird, Firefox, Flock, GoBrowser, iCab, ICE Browser, IceApe, IceCat, IceDragon,\n * Iceweasel, IE [Mobile], Iron, Jasmine, K-Meleon, Konqueror, Kindle, Links,\n * Lunascape, Lynx, Maemo, Maxthon, Midori, Minimo, MIUI Browser, [Mobile] Safari,\n * Mosaic, Mozilla, Netfront, Netscape, NetSurf, Nokia, OmniWeb, Opera [Mini/Mobi/Tablet],\n * Phoenix, Polaris, QQBrowser, RockMelt, Silk, Skyfire, SeaMonkey, SlimBrowser, Swiftfox,\n * Tizen, UCBrowser, Vivaldi, w3m, Yandex\n */\n public get name() {\n // ua-parser-js returns human readable names like \"Mobile Safari\". I want without spaces to be able to use them as keys in an object\n // example in the external_links_consts.js where macos and safari are used as keys.\n // also, we make it lowercase for comodity\n return this.browser.name.replace(/\\s/g, \"\").toLowerCase();\n }\n\n /**\n * Returns the major version of the browser\n */\n public get version() {\n return parseInt(this.browser.version.split(\".\")[0]);\n }\n\n /**\n * Is it a Firefox?\n */\n public get isFirefox() {\n return this.name === \"firefox\";\n }\n\n\n /**\n * Is it a Chrome?\n */\n public get isChrome() {\n return this.name === \"chrome\";\n }\n\n\n /**\n * Is it a Safari?\n */\n public get isSafari() {\n // Can be \"Safari\" or \"Mobile Safari\"\n return this.name.indexOf(\"safari\") !== -1;\n }\n\n /**\n * Is it a Opera?\n */\n public get isOpera() {\n // Can be \"Opera\", \"Opera Mobi\", \"Opera Mini\", \"Opera Tablet\"\n return this.name.indexOf(\"opera\") !== -1;\n }\n\n\n /**\n * Is browser an Edge instance?\n */\n public get isEdge() {\n return this.name === \"edge\";\n }\n\n getIframeAllowAttributeValue(){\n let allowAttrValue = getAllowAttr();\n if(allowAttrValue.indexOf('autoplay') >= 0) {\n return allowAttrValue;\n } else {\n return `autoplay; ${allowAttrValue}`;\n }\n }\n\n}\n","import Store from '../../store';\nimport Logger from '../../logger';\nimport { DeviceOSDetection } from \"./os\";\n\nconst NATIVE_TYPE = {\n CASINO_IOS: 'cbCallBackHandlerCGP',\n CASINO_ANDROID: 'WrapperInterfaceCGP',\n POKER_IOS: 'NativeInterface',\n POKER_ANDROID: 'NativeInterface',\n POKER_7_ANDROID: 'PokerSecondWebView',\n CIP8_ANDROID: 'pokerNativeInterface',//TODO - will be also used in CGP so that we have a unique source\n SPORT_IOS: 'callbackHandler',\n SPORT_CIS_WEBVIEW: 'sportNativeInterface',\n SPORT_ANDROID: 'WrapperInterface'\n};\n\nexport class DeviceHybridDetection {\n private logger: Logger;\n private _hybrid = false;\n private _inCasino = false;\n private _inPoker = false;\n private _inSport = false;\n private _embedded = false;\n\n constructor(private os: DeviceOSDetection) {\n this.logger = new Logger((this.constructor as any).CLASS);\n this.buildHybridInfo();\n }\n\n public get isHybrid() {\n return this._hybrid;\n }\n\n /**\n * The hybrid host app that loads the CGP (Orbit) is owned by Casino\n */\n public get inCasino() {\n return this._inCasino;\n }\n\n /**\n * The hybrid host app that loads the CGP (Orbit) is owned by Poker\n */\n public get inPoker() {\n return this._inPoker;\n }\n\n /**\n * The hybrid host app that loads the CGP (Orbit) is owned by Sport\n */\n public get inSport() {\n return this._inSport;\n }\n\n /**\n * The hybrid type is embedded (like AOD - Apple On Demand Resources). All games are bundled and deployed at Apple servers and downloaded by demand by the hybrid app\n */\n public get isEmbedded() {\n return this._embedded;\n }\n\n\n /**\n * FOR BUILDING HYBRID INFO I AM BEING EXTRA CAREFULL AND DOUBLECHECKING THE RESULTS FROM DIFFERENT DATA\n */\n private buildHybridInfo() {\n\n const genericHybridEmbedded = window['cgp_isHybridEmbedded'] || false;\n\n const inPokerHybrid = this.build_isInPokerHybrid();\n\n const casinoHybrid = this.build_isCasinoHybrid(inPokerHybrid);\n\n const inSportHybrid = this.build_isInSportHybrid();\n\n if (casinoHybrid || inPokerHybrid || inSportHybrid || genericHybridEmbedded) {\n this._hybrid = true;\n }\n\n if (genericHybridEmbedded) {\n this._embedded = true;\n }\n\n this._inCasino = false;\n this._inPoker = false;\n this._inSport = false;\n\n if (casinoHybrid) {\n this._inCasino = true;\n }\n\n if (inPokerHybrid) {\n this._inPoker = true;\n }\n\n if (inSportHybrid) {\n this._inSport = true;\n }\n\n this.dataSanityCheck(casinoHybrid, inPokerHybrid, inSportHybrid, genericHybridEmbedded);\n }\n\n private build_isCasinoHybrid(inPoker) {\n // checks for normal casino hybrid\n if (this.os.isIOS) {\n return this.isNativeIOS() && !inPoker;//isNativeIOS include cip8\n }\n\n if (this.os.isAndroid) {\n return this.isNativeAndroid();\n }\n\n return false;\n }\n\n private build_isInPokerHybrid() {\n if (this.os.isIOS) {\n\n // On iOS, first check if poker put a known object in global namespace. If it's there, we know it's poker hybrid, we don't need anything else\n if ((window as any).NativeInterface && (this.isNativeIOS(NATIVE_TYPE.POKER_IOS))) {\n return true;\n }\n // Otherwise, we have to make an additional check for New Jersey. 103 and 106 are the subbrands of poker in NJ (poker 7, the old one)\n // Once poker7 will use AOD in NJ this code below can be removed\n if (['103', '106'].indexOf(Store.get('sourceSubBrand')) === -1) {\n // not NJ, so it's not poker hybrid\n return false;\n }\n // we are in NJ, so now we have to check for the ClientVersion key in storage. If exists and starts with \"mp-\" or \"sp-\", then it is poker hybrid\n let storedClientVersion = Store.get('ClientVersion');\n if (storedClientVersion && (storedClientVersion.toLowerCase().startsWith('mp-') || storedClientVersion.toLowerCase().startsWith('sp-'))) {\n return true;\n } else {\n return false;\n }\n\n }\n if (this.os.isAndroid) {\n // On Android, first check if poker put a known object in global namespace. If it's there, we know it's poker7 hybrid, we don't need anything else\n if ((window as any)[NATIVE_TYPE.POKER_ANDROID] && this.isNativeAndroid(NATIVE_TYPE.POKER_ANDROID)) {\n return true;\n }\n // For Some reason poker 7 have 2 different name.. do we need to check both\n if ((window as any)[NATIVE_TYPE.POKER_7_ANDROID] && this.isNativeAndroid(NATIVE_TYPE.POKER_7_ANDROID)) {\n return true;\n }\n\n //For Poker8 (new Poker) - Same check for CIP8_ANDROID, because it is a different object name\n if ((window as any)[NATIVE_TYPE.CIP8_ANDROID] && this.isNativeAndroid(NATIVE_TYPE.CIP8_ANDROID)) {\n return true;\n }\n\n //Once poker7 Baruch will go live with the the new POKER_7_ANDROID name we can remove the code below - for now we leave it for backward\n // ... otherwise, we have to make an additional check for New Jersey. 103 and 106 are the subbrands of poker in NJ (poker 7, the old one)\n if (['103', '106'].indexOf(Store.get('sourceSubBrand')) === -1) {\n //Todo check this store get logic, I think we have timing issue here\n // not NJ, so it's not poker hybrid\n return false;\n }\n\n let storedSourceProductPackage = Store.get('sourceProductPackage');\n if (storedSourceProductPackage && (storedSourceProductPackage.toString() === '52' || storedSourceProductPackage.toString() === '95')) {\n return true;\n } else {\n return false;\n }\n }\n return false;\n }\n\n private build_isInSportHybrid(): boolean {\n if (this.os.isIOS) {\n return this.isNativeIOS(NATIVE_TYPE.SPORT_CIS_WEBVIEW);\n }\n\n if (this.os.isAndroid) {\n return this.isNativeAndroid(NATIVE_TYPE.SPORT_ANDROID) || this.isNativeAndroid(NATIVE_TYPE.SPORT_CIS_WEBVIEW);\n }\n\n return false;\n }\n\n /**\n * Is it an IOS Hybrid?\n */\n private isNativeIOS(name?: string): boolean {\n const className = undefined !== name ? name : NATIVE_TYPE.CASINO_IOS;\n\n return ('object' === typeof ((window as any).webkit)\n && 'object' === typeof ((window as any).webkit.messageHandlers[className]));\n }\n\n /**\n * Is it an Android Hybrid?\n */\n private isNativeAndroid(name?: string): boolean {\n const className = undefined !== name ? name : NATIVE_TYPE.CASINO_ANDROID;\n return ('object' === typeof ((window as any)[className]));\n }\n\n\n private dataSanityCheck(casinoHybrid: boolean, inPokerHybrid: boolean, inSportHybrid: boolean, genericHybridEmbedded: boolean) {\n // Casino in Poker and casino in sport cannot be true at the same time\n if (inPokerHybrid === true && inSportHybrid === true) {\n this.logger.error(\"Hybrid data sanity check. 1. inPokerHybrid and inSportHybrid are both true\");\n }\n\n if (casinoHybrid === true && inSportHybrid === true) {\n this.logger.error(\"Hybrid data sanity check. 2. casinoHybrid and inSportHybrid are both true\");\n }\n\n if (inPokerHybrid === true && casinoHybrid === true) {\n this.logger.error(\"Hybrid data sanity check. 3. inPokerHybrid and casinoHybrid are both true\");\n }\n\n // From the trio: casinoHybrid, inPokerHybrid, inSportHybrid at most one need to be true.\n // And this, only if genericHybridEmbedded is true\n if (genericHybridEmbedded === true && (casinoHybrid === false || inPokerHybrid === false || inSportHybrid === false)) {\n this.logger.error(\"Hybrid data sanity check. 4. if genericHybridEmbedded is false, none of any other embedded flags can be true\");\n }\n\n }\n}\n","import { v4 as uuidv4 } from 'uuid';\nimport { UAParser } from 'ua-parser-js';\nimport Logger from '../logger';\nimport { DeviceFeatureDetection } from './detection/feature';\nimport { DeviceOSDetection } from './detection/os';\nimport { DeviceViewportDetection } from './detection/viewport';\nimport { DeviceModelDetection } from './detection/model';\nimport { DeviceBrowserDetection } from './detection/browser';\nimport { DeviceHybridDetection } from './detection/hybrid';\n\nclass Device {\n public logger: Logger;\n private _uaParser: UAParser = new UAParser();\n public readonly feature = new DeviceFeatureDetection();\n public readonly os = new DeviceOSDetection(this._uaParser);\n public readonly viewport = new DeviceViewportDetection();\n public readonly model = new DeviceModelDetection(this._uaParser);\n public readonly browser = new DeviceBrowserDetection(this._uaParser);\n public readonly hybrid = new DeviceHybridDetection(this.os);\n\n /**\n * Initialize the device.\n *\n * @constructor\n */\n constructor() {\n this.logger = new Logger((this.constructor as any).CLASS);\n }\n\n /**\n * Getter for the user-agent for the client being handled in this request.\n *\n * @example 'Mozilla/5.0 (iPad; CPU OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53'\n */\n public get userAgent() {\n return this._uaParser.getUA();\n }\n\n /**\n * Generates a GUID\n */\n public generateGuid(): string {\n return uuidv4();\n }\n\n private matchMedia(media: string) {\n return window.matchMedia(media).matches;\n }\n\n /**\n * Used to detected if user clicked and loaded the app using home screen\n *\n * Returns true if the app is running in standalone mode (iOS only)\n */\n public get isStandalone() {\n return 'standalone' in window.navigator ? (window.navigator as any).standalone : false;\n }\n\n public get isProgressiveWebApp(): boolean {\n\t\t// PWA setting is \"display\": \"fullscreen\"\n\t\t// but installed on desktop it's detected as \"standalone\" if app is not in fullscreen mode or \"fullscreen\" if user enters fullscreen mode\n // iOS is identified through check the navigator to have attribute 'standalone'\n\n\t\treturn !this.hybrid.isHybrid && (this.isStandalone ||\n this.matchMedia('(display-mode: fullscreen)') ||\n this.matchMedia('(display-mode: standalone)'));\n\n }\n\n public get isSupportHTML5() {\n return 'function' === typeof document.createElement('canvas').getContext;\n }\n\n public get isMobileWebApp() {\n return (this.os.isMobileOS || this.isProbablyIOSDevice) && !this.hybrid.isHybrid;\n }\n\n /**\n * Check whether the browser has cookie enable 3rd party.\n */\n public get isCookieEnable() {\n return window.navigator.cookieEnabled;\n }\n\n /**\n * From iOS 13, Safari decided to put the \"Request Desktop Website\" setting on true by default on iPad.\n * For users that disable this setting, Device.model.isIpad will be true, but for the majority it will be false because\n * Safari will send the desktop user agent.\n *\n * Also, iPhone users have that option also although not many people enable it.\n *\n * The only clue we have that it is most probably an iPad is to detect if the device has touchscreen because up until now\n * Apple does not produce MacBooks or Macs with touchscreens. So it's most probably an iOS (iPad or an iPhone)\n *\n * @Note IMPORTANT! Should be use only in rare cases (for example force GRS(GGP games) to return the mobile version on iPad)\n * @Note IMPORTANT! This method should return true for all iOS and iOS + \"Request Desktop Website\", iPhone INCLUDED\n */\n public get isProbablyIOSDevice() {\n if (this.os.isIOS) {\n return true;\n }\n if (!this.os.isMacOS) {\n return false;\n }\n // At this point we know that we are on Mac\n // Let's see if it has touchscreen\n return this.feature.isTouch;\n }\n\n /**\n * From iOS 13, Safari decided to put the \"Request Desktop Website\" setting on true by default on iPad.\n * For users that disable this setting, Device.model.isIpad will be true, but for the majority it will be false because\n * Safari will send the desktop user agent.\n *\n * Also, iPhone users have that option also although not many people enable it.\n *\n * The only clue we have that it is most probably an iPad is to detect if the device has touchscreen because up until now\n * Apple does not produce MacBooks or Macs with touchscreens. So it's most probably an iOS (iPad or an iPhone)\n *\n * @Note IMPORTANT! Should be use only in rare cases (for example force GRS(GGP games) to return the mobile version on iPad)\n * @Note IMPORTANT! This method should return true for all iPad and iOS + \"Request Desktop Website\", iPhone NOT INCLUDED\n * HOWEVER, FOR IPHONE THAT HAVE \"Request Desktop Website\", this method will return true\n */\n public get isProbablyIPad() {\n // Pre iOS 13 detection\n if (this.model.isIpad) {\n return true;\n }\n if (this.model.isIphone) {\n return false;\n }\n if (!this.os.isMacOS) {\n return false;\n }\n // At this point we know that is a Safari browser on Mac (in the past, Safari was available for Windows too)\n // Let's see if it has touchscreen\n return this.feature.isTouch;\n }\n\n /**\n * Check the device is in a portrait mode.\n *\n * @deprecated use \"Device.viewport.isPortrait\"\n */\n public get isPortrait(): boolean {\n if (this.isMobile() && this.os.isAndroid) {\n // fix for Samsung S8 series (S8-S9...).\n // In full screen mode window.screen.width and window.screen.height after single rotation get wrong values (width equal to height)\n // So we should test it by innerWidth and innerHeight like in iOS\n if (this.viewport.screenWidth === this.viewport.screenHeight) {\n return this.viewport.width < this.viewport.height;\n }\n return this.viewport.screenWidth < this.viewport.screenHeight;\n } else {\n return this.viewport.width < this.viewport.height;\n }\n }\n\n /**\n * TODO: Replace with NOTCH DETECTION. We don't care about the iPhone version, we care to know for iPhone X if it has a notch.\n *\n * Getting the current running iPhone device version, hardware version.\n * Able to detect iPhone 4 and 5 and iphone x (10)\n * Returns NULL if device is not an iPhone. Will return a Number of the hardware version.\n * @deprecated\n */\n public getIphoneVersion() {\n\n if (this.os.isIOS && 11 <= this.os.version &&\n (\n //iphone 12 pro max\n (926 === window.screen.height && 428 === window.screen.width) || (926 === window.screen.width && 428 === window.screen.height)\n ||\n //iphone 12 pro\n (844 === window.screen.height && 390 === window.screen.width) || (844 === window.screen.width && 390 === window.screen.height)\n ||\n // iPhone X / Xs\n (812 === window.screen.height && 375 === window.screen.width) || (812 === window.screen.width && 375 === window.screen.height)\n ||\n // iPhone Xr / Xs Max\n (896 === window.screen.height && 414 === window.screen.width) || (896 === window.screen.width && 414 === window.screen.height)\n )\n ) {\n return 10;\n }\n\n if (this.os.isIOS && 8 <= this.os.version && 375 === window.screen.width) {\n return 6;\n }\n\n if (this.os.isIOS && 6 <= this.os.version && 320 === window.screen.width) {\n return 5;\n }\n\n // iphone 4/s (Retina)\n if (this.os.isIOS && 5 <= this.os.version && 640 === window.screen.width) {\n return 4;\n }\n\n return 0;\n }\n\n /**\n * TODO: Replace with NOTCH DETECTION. We don't care about the iPhone version, we care to know for iPhone X if it has a notch.\n * Is IphoneX\n * Returns true if the device is IphoneX\n * @deprecated\n */\n public isIphoneX(): boolean {\n return 10 === this.getIphoneVersion();\n }\n\n /**\n * TODO: Check usages and delete/refactor\n * @deprecated\n */\n public isMobileNotTablet(): boolean {\n return this.viewport.width < 1280 && !this.isTablet();\n }\n\n\n /**\n * TODO: Check usages and delete/refactor\n * Returns true only for ipads smaller than 1280\n * @deprecated\n */\n public isTablet(): boolean {\n return this.model.isIpad && this.viewport.width < 1280;\n }\n\n /**\n * Those are not the droids you are looking for\n * Use media queries, feature detection, client hints, os detection.\n * Think of what you want to achieve with your code and put a condition for that, not a general isMobile condition\n *\n * TODO: Check usages and delete/refactor\n * @deprecated\n */\n public isMobile(): boolean {\n return this.viewport.width < 1280;\n }\n\n /**\n * Get benchmark.\n */\n public getBenchMark() {\n var b = { m: 0 }, bd = [], bmt = + new Date() + 50;\n do {\n var t, count = 0, tt = + new Date();\n do { t = + new Date(); } while (t === tt);\n do { count++; tt = +new Date(); } while (t === tt);\n if ((tt - t) === 1) { bd[bd.length] = count; }\n } while ((bd.length < 20) && (t < bmt));\n\n if (bd.length === 0) b.m = 0; else b.m = Math.max.apply(Math, bd);\n\n return b.m;\n }\n\n}\n\nexport default new Device();\n","import _ from './underscore';\nimport Logger from './logger';\nimport {namedSetInterval, namedSetTimeout} from '../../../common/utils/time-functions';\nimport {TimeIntervalName} from '../../../common/utils/time-interval-names';\n\nexport interface TimeoutSubscription {\n clear(): void;\n}\n\n\n\nexport interface ElementDimensions {\n\n width: number,\n height: number,\n horizontMargin: number,\n verticalMargin: number,\n horizontPadding: number,\n verticalPadding: number,\n horizontBorder: number,\n verticalBorder: number,\n fullWidth: number,\n fullHeight: number,\n marginRight: number,\n marginLeft: number,\n marginTop: number,\n marginBottom: number\n}\n\nexport interface ElementSize {\n width: number,\n height: number\n}\n\nexport interface DomEventSubscription {\n remove: () => void\n}\n\n\n\nclass DOM {\n\n static CLASS = 'DOM';\n\n constructor() {\n this._createLogger();\n }\n\n logger: Logger;\n _createLogger() {\n this.logger = new Logger(DOM.CLASS);\n }\n\n\n getBody() : HTMLElement {\n return document.body;\n }\n\n\n getHTML(): HTMLElement {\n return document.documentElement;\n }\n\n\n /**\n * Draw element into the DOM.\n */\n draw(element: Element) : DOM {\n\n this.append(this.getBody(), element);\n\n return this;\n }\n\n\n /**\n * Selector jQuery like for getting the object from the dom.\n * $$ is double the fun, $ is cool, $$ is cooler.\n */\n $$(query: any): any {\n let el = null;\n\n // first off if it's not a string assume it's already an element\n if (!_.isString(query)) {\n el = query;\n } else if ( this.isTag(query) ) {\n // check if it's a tag\n let tag = query.substring(1, query.length - 1);\n el = document.createElement( tag );\n } else if ( this.isId(query) ) {\n // check if it's an id\n let id = query.substr(1);\n el = document.getElementById( id );\n } else {\n // run a basic query\n el = document.querySelectorAll(query);\n }\n\n if (_.isNodeList(el)) {\n el = [].slice.call(el);\n }\n\n return el;\n }\n\n querySelector(selector: string): Element {\n return document.querySelector(selector);\n }\n\n\n injectStyleToDOM(content: string): HTMLStyleElement {\n let newStyle = document.createElement('style');\n newStyle.innerHTML = content;\n return document.body.appendChild(newStyle);\n }\n\n createElement(type: string = 'div', html: string = '', classList = []): HTMLElement {\n let domElement = document.createElement(type);\n if(html) {\n domElement.innerHTML = html;\n }\n\n if(classList.length > 0){\n classList.forEach(_class => this.addClass(domElement, _class));\n }\n\n return domElement;\n }\n\n append(target: Element, el: Element) : DOM {\n if (!target || !_.isElement(target)) {\n return this;\n }\n\n if (!el || !_.isElement(el)) {\n return this;\n }\n\n target.appendChild(el);\n\n return this;\n }\n\n\n\n removeElement(target: Element, el: Element) : DOM {\n if (!target || !_.isElement(target)) {\n return this;\n }\n\n if (!el || !_.isElement(el)) {\n return this;\n }\n el.parentNode.removeChild(el);\n\n return this;\n }\n\n appendFirst(target: Element, el: Element): void {\n\n if (!_.isElement(target)) {\n throw new Error('target argument must be an Element');\n }\n\n if (!_.isElement(el)) {\n throw new Error('el argument must be an Element');\n }\n\n target.insertBefore(el, target.firstChild);\n }\n\n addClass(el: Element, className: any) : DOM {\n if (!_.isElement(el)) {\n return this;\n }\n\n if (!className || 0 === className.length) {\n return this;\n }\n\n let name = _.isArray(className) ? className[0] : className;\n\n if (el.classList) {\n el.classList.add(name);\n } else {\n el.className += ' ' + name;\n }\n\n return _.isArray(className) ? this.addClass(el, className.slice(1)) : this;\n }\n\n\n\n /**\n * toggle class to element\n */\n toggleClass(el: Element, className: string) : DOM {\n if (!_.isElement(el)) {\n return this;\n }\n\n if (!className) {\n return this;\n }\n\n el.classList.toggle(className);\n\n return this;\n }\n\n\n /**\n * if element already has the class\n */\n hasClass(el: Element, className: string) : boolean {\n if (!_.isElement(el)) {\n throw new Error(`el argument is required! el = ${el}; className = ${className}`);\n }\n\n if (!className) {\n throw new Error(`className argument is required! el = ${el}; className = ${className}`);\n }\n\n return el.classList.contains(className);\n }\n\n\n /**\n * Add attribute to the element.\n */\n addAttribute(el: Element, attribute: string = '', value: string = ''): DOM {\n if (!_.isElement(el)) {\n return this;\n }\n el.setAttribute(attribute, value);\n\n return this;\n }\n\n\n /**\n * Add Style to the element.\n */\n addStyle(el: HTMLElement, key: string, value: string): DOM {\n if (!_.isElement(el)) {\n return this;\n }\n el.style[key] = value;\n\n return this;\n }\n\n\n /**\n * Remove Style from the element.\n */\n removeStyle(el: HTMLElement, key: string): DOM {\n if (!_.isElement(el)) {\n return this;\n }\n el.style.removeProperty(key);\n\n return this;\n }\n\n\n\n /**\n * Get current element dimensions\n */\n getDimensions(el: HTMLElement): ElementDimensions {\n if (!_.isElement(el)) {\n throw new Error('el argument must be an HTMLElement');\n }\n\n let style = this.getCurrentStyle(el);\n let horizontMargin = parseFloat(style.marginLeft) + parseFloat(style.marginRight);\n let verticalMargin = parseFloat(style.marginBottom) + parseFloat(style.marginTop);\n\n return {\n width: el.offsetWidth,\n height: el.offsetHeight,\n horizontMargin: horizontMargin,\n verticalMargin: verticalMargin,\n horizontPadding: parseFloat(style.paddingLeft) + parseFloat(style.paddingRight),\n verticalPadding: parseFloat(style.paddingBottom) + parseFloat(style.paddingTop),\n horizontBorder: parseFloat(style.borderLeftWidth) + parseFloat(style.borderRightWidth),\n verticalBorder: parseFloat(style.borderBottomWidth) + parseFloat(style.borderTopWidth),\n fullWidth: el.offsetWidth + horizontMargin,\n fullHeight: el.offsetHeight + verticalMargin,\n marginRight: parseFloat(style.marginRight),\n marginLeft: parseFloat(style.marginLeft),\n marginTop: parseFloat(style.marginTop),\n marginBottom: parseFloat(style.marginBottom)\n };\n }\n\n setElementSize(element: HTMLElement, size: ElementSize, unit: string = 'px') : void {\n element.style.width = size.width + unit;\n element.style.height = size.height + unit;\n }\n\n getCurrentStyle(el: HTMLElement) : CSSStyleDeclaration {\n if (!_.isElement(el)) {\n throw new Error('el argument must be an HTMLElement');\n }\n return window.getComputedStyle(el) || el['currentStyle'];\n }\n\n\n /**\n * Hide element from dom.\n */\n hide(el: Element): DOM {\n this.removeClass(el, 'show');\n this.addClass(el, 'hide');\n return this;\n }\n\n\n /**\n * Get element to be invisible\n * @param el\n * @returns {DOM}\n */\n invisible(el: HTMLElement): DOM {\n this.removeClass(el, 'cgp-visible');\n this.addClass(el, 'cgp-invisible');\n return this;\n }\n\n\n /**\n * Show element on dom\n * @param el\n */\n show(el: Element): DOM {\n this.removeClass(el, 'hide');\n this.addClass(el, 'show');\n return this;\n }\n\n /**\n * Get element to be visible\n * @param el\n * @returns {DOM}\n */\n visible(el: HTMLElement): DOM {\n this.removeClass(el, 'cgp-invisible');\n this.addClass(el, 'cgp-visible');\n return this;\n }\n\n\n /**\n * Remove class from element.\n * @param el\n * @param className\n */\n removeClass(el: Element, className: string): DOM {\n if (!_.isElement(el)) {\n throw new Error('el argument must be an element');\n }\n\n el.classList.remove(className);\n return this;\n }\n\n\n removeAttribute(el: Element, attr: string = ''): DOM {\n if (!_.isElement(el)) {\n throw new Error('el argument must be an element');\n }\n\n el.removeAttribute(attr);\n return this;\n }\n\n isInputElement(tagName: string = ''): boolean {\n return 'INPUT' === tagName;\n }\n\n\n /**\n * Sets the innerHTML for the provided element\n */\n html(html: string, el: Element): DOM {\n if (_.isNullOrUndefined(html)) {\n this.logger.error('Html is not valid parameter');\n return this;\n }\n el.innerHTML = html;\n return this;\n }\n\n\n /**\n * Clear elements from his node childs nor content.\n */\n clear(target: Element): DOM {\n while (target.firstChild) {\n target.removeChild(target.firstChild);\n }\n\n return this;\n }\n\n\n camelCase(str: string): string {\n return str.replace(/-([a-z])/g, (g) => {\n return g[1].toUpperCase();\n });\n }\n\n\n isTag(str: string): boolean {\n return 0 === str.search(/^<\\w+>$/);\n }\n\n isId(str: string ) {\n return 0 === str.search(/^#\\w+$/);\n }\n\n parseDataAttributes(el: Element): object {\n let data = {};\n\n [].forEach.call(el.attributes, (attr) => {\n if (/^data-/.test(attr.name)) {\n let camelCaseName = attr.name.substr(5).replace(/-(.)/g, ($0, $1) => {\n return $1.toUpperCase();\n });\n data[camelCaseName] = attr.value;\n }\n });\n\n return data;\n }\n\n text(el: Element, value: string): DOM {\n if (!_.isElement(el)) {\n throw new Error('el argument must be a HTMLElement');\n }\n el.textContent = value;\n return this;\n }\n\n /**\n * wrapper for add event listeners on DOM, returns a self removing method.\n */\n addEventListener(el: Element | Document, type: string, callback: EventListenerOrEventListenerObject, useCapture: boolean = false) : DomEventSubscription {\n\n el.addEventListener(type, callback, useCapture);\n\n return {\n remove: function(msgElement: Element | Document, msgType: string, msgCallback: EventListenerOrEventListenerObject) {\n return () => {\n return msgElement.removeEventListener(msgType, msgCallback);\n };\n }(el, type, callback)\n };\n }\n\n\n\n\n /**\n *\n *\n * @description - Generic event handler, all the component should subscribe to one event function,\n * They should pass the element it self define specific id inside the element,\n * Event type, And the event callback.\n *\n * @usage:\n * onDOMEvent(DOMElement, '#testid', 'click', ()=> {alert('onClick happend'});\n * onDOMEvent(DOMElement, 'click', ()=> {alert('onClick happend'});\n */\n onDOMElementEvent(element: Element, eventName: string, callback: EventListenerOrEventListenerObject, useCapture: boolean = false) : DomEventSubscription {\n\n if (!_.isElement(element)) {\n throw new Error('element argument must be of type HTMLElement');\n }\n\n if(!_.isString(eventName)) {\n throw new Error('eventName argument must be of type String');\n }\n\n if(!_.isFunction(callback)) {\n throw new Error('callback argument must be of type Function');\n }\n\n element.addEventListener(eventName, callback, useCapture);\n\n return {\n remove: () => element.removeEventListener(eventName, callback)\n };\n }\n\n\n setInterval(callback: () => void, timeout: number, name?: TimeIntervalName) : number {\n return namedSetInterval(name, callback, timeout);\n }\n\n\n clearInterval(handle: number): void {\n clearInterval(handle);\n }\n\n\n setTimeout(callback: () => void, timeout: number, name?: TimeIntervalName): number {\n return namedSetTimeout(name, callback, timeout);\n }\n\n clearTimeout(handle: number): void {\n clearTimeout(handle);\n }\n}\n\nexport default new DOM();\n","import logger from 'js-logger';\n\nlogger.useDefaults();\n\nexport default class Logger {\n\n static SET_LOG_LEVEL(level = 'ERROR'): any {\n switch (level.toString().toUpperCase()) {\n case 'DEBUG':\n return logger.DEBUG;\n case 'INFO':\n return logger.INFO;\n case 'WARN':\n return logger.WARN;\n case 'ERROR':\n default:\n return logger.ERROR;\n case 'OFF':\n return logger.OFF;\n }\n }\n\n _logger;\n\n\n constructor(name: string) {\n let logLevel = this._getQueryParameters()['logLevel'] || window['LOG_LEVEL'];\n this._logger = logger.get(name);\n this._logger.setLevel(Logger.SET_LOG_LEVEL(logLevel));\n }\n\n\n /**\n * Fatal errors. Mission critical - application can not run properly when present.\n */\n error(...log): void {\n this._log('error', log);\n }\n\n\n /**\n * Warning only. Should be fixed but application been able to recover.\n */\n warn(...log): void {\n this._log('warn', log);\n }\n\n\n /**\n * Information only. General info printed.\n */\n info(...log): void {\n this._log('info', log);\n }\n\n\n /**\n * Debug mode. Print as much as possible to allow quick and easy debugging when needed.\n */\n debug(...log): void {\n this._log('debug', log);\n }\n\n\n /**\n * ULTRA Debug mode, almost silly to use. Print as much as possible to allow quick and easy debugging when needed.\n * But very useful debugging, should contain ALOT of prints via this method.\n */\n silly(...log) : void {\n this._log('silly', log);\n }\n\n\n /**\n * Private method, provides single point of access to the \"console.log\" API.\n * Prevents mess around the code and a clean way to prevent the output of the log or the severity level.\n */\n _log(severity: string, log: any) {\n if (this._isConsoleEnabled(severity)) {\n this._logger[severity](log);\n }\n }\n\n\n /**\n * Checks that console is globally defined and able to use it to print out log data to it.\n */\n private _isConsoleEnabled(severity: string): boolean {\n return 'undefined' !== typeof console && 'undefined' !== typeof console[severity]; // eslint-disable-line no-console\n }\n\n /**\n * Get Query String or \"string\" as Object\n */\n private _getQueryParameters(str?: string) {\n return (str || document.location.search).replace(/(^\\?)/, '').split(\"&\").map(function (n) {\n n = n.split(\"=\");\n this[n[0]] = n[1];\n\n return this;\n }.bind({}))[0];\n }\n\n}","import CGPLogger from './logger';\nimport Strings from './strings';\nimport _ from './underscore';\n\ninterface IStorage {\n set(key: string, value: any) : boolean;\n\n del(key: string): boolean;\n\n get(key: string, defaultValue: any): any | null;\n\n clear(): void;\n};\n\nconst logger = new CGPLogger('Store');\n\nclass CGPStorage {\n /**\n * @property\n * @type {null|LocalStorage|WindowStorage}\n */\n _selectedStorage: IStorage = null;\n\n\n /**\n * CGP storage business logic place.\n */\n constructor() {\n this.init();\n }\n\n\n /**\n * Initialize the storage and initialize the currect instance of storage\n * Or from the window['localStorage'] or our window cgp storage ;).\n *\n * @returns {LocalStorage}\n */\n init() : void {\n if (this.isLocalStorageNameSupported()) {\n logger.debug('Selected to be main priority cgp storage from localstorage.');\n this._selectedStorage = new LocalStorage();\n } else {\n logger.debug('Selected to be main priority cgp storage from window unique localstorage.');\n this._selectedStorage = new WindowStorage();\n }\n }\n\n\n /**\n * Create cookie that shared/not between sub domains\n * @param name\n * @param value\n */\n setCookie(name: string, value: string) : void {\n let now = new Date();\n now.setFullYear(now.getFullYear() + 1);\n document.cookie = name + '=' + value + ';expires=' + now.toUTCString() + ';path=/';\n }\n\n /**\n * Get cookie by key\n * @param name\n * @returns {string}\n */\n getCookie(name: string): string {\n let match = document.cookie.match(new RegExp(name + '=([^;]+)'));\n if (match) {\n return match[1];\n }\n return '';\n }\n\n /**\n * Remove cookie by key\n * @param name\n */\n removeCookie(name: string) : void {\n document.cookie = name + \"=;expires=Thu, 01 Jan 1970 00:00:00 UTC;path=/\";\n }\n\n /**\n * Check wheter local storage supported.\n *\n * @returns {boolean}\n */\n isLocalStorageNameSupported(): boolean {\n let testKey = 'test';\n\n try\n {\n const storage: Storage = window.localStorage;\n storage.setItem(testKey, '1');\n storage.removeItem(testKey);\n return 'localStorage' in window && null !== window.localStorage;\n }\n catch (error)\n {\n logger.error('Local storage is not supported the user might running under incognito mode on safari yak!');\n return false;\n }\n }\n\n\n /**\n * Stores a value to the assigned key.\n *\n *\n * @param {string} key - the name of the key to be stored.\n * @param {*} value - could be anything, Array/String/Object.\n *\n * @returns {boolean} stating the save was successfully or not.\n * @public\n */\n set(key: string, value: any): boolean {\n return this._selectedStorage.set(key, value);\n }\n\n\n /**\n * Removes a key from the storage, also checks if exists.\n *\n *\n * @param {string} key - the name of the key to be deleted.\n * @returns {boolean} stating the delete was successfully or not.\n * @public\n */\n del(key: any): boolean {\n if(typeof key === 'string') {\n return this.delKey(key);\n } else {\n return this.delArray(key);\n }\n }\n\n /**\n * Removes a key from the storage, also checks if exists.\n *\n *\n * @param {string} key - the name of the key to be deleted.\n * @returns {boolean} stating the delete was successfully or not.\n * @public\n */\n delKey(key: string): boolean {\n return this._selectedStorage.del(key);\n }\n\n /**\n * remove array of keys from storage, also check if exists.\n * @param keys\n * @returns {boolean} stating the delete was successfully or not\n */\n delArray(keys: string[]): boolean {\n let result = true;\n keys.forEach(function (key) {\n result = result && this._selectedStorage.del(key);\n }, this);\n\n return result;\n }\n\n /**\n * Get a specific key from the store. If is not set, optionally can set a default value\n *\n *\n * @param {string} key - the name of the key to be returned.\n * @param {*} defaultValue - if key is empty, will return the default\n *\n * @returns {*} the data is mixed, what-ever is stored in the cache will be returned.\n * @public\n */\n get(key: string, defaultValue?: any): any | null {\n return this._selectedStorage.get(key, defaultValue);\n }\n\n clearLocalStorage() {\n this._selectedStorage.clear();\n }\n}\n\n/**\n *\n */\nclass LocalStorage implements IStorage {\n /**\n * @property\n * @type {string}\n * @private\n */\n private readonly _perfix = 'cgp_';\n\n\n /**\n * Creates the store object and ensures it remains a Singleton.\n *\n * @constructor\n */\n constructor() {\n if (_.getQueryParameters()['clearstorage']) {\n this.clear();\n }\n }\n\n /**\n * Stores a value to the assigned key.\n *\n *\n * @param {string} key - the name of the key to be stored.\n * @param {*} value - could be anything, Array/String/Object.\n *\n * @returns {boolean} stating the save was successfully or not.\n * @public\n */\n set(key: string, value: any): boolean {\n if (!this.localStorageExists()) {\n return false;\n }\n\n try {\n localStorage.setItem(this.getKeyConvention(key), value);\n } catch (error) {\n throw error;\n }\n\n return true;\n }\n\n\n /**\n * Removes a key from the storage, also checks if exists.\n *\n *\n * @param {string} key - the name of the key to be deleted.\n * @returns {boolean} stating the delete was successfully or not.\n * @public\n */\n del(key: string): boolean {\n if (!this.localStorageExists() || null === this.get(key)) {\n return false;\n }\n\n localStorage.removeItem(this.getKeyConvention(key));\n return true;\n }\n\n\n /**\n * Get a specific key from the store. If is not set, optionally can set a default value\n *\n *\n * @param {string} key - the name of the key to be returned.\n * @param {*} defaultValue - if key is empty, will return the default\n *\n * @returns {*} the data is mixed, what-ever is stored in the cache will be returned.\n * @public\n */\n get(key: string, defaultValue?: any): any | null {\n if (!this.localStorageExists()) {\n return false;\n }\n\n key = this.getKeyConvention(key);\n\n return null === localStorage.getItem(key) && 'undefined' !== typeof defaultValue ? defaultValue : localStorage.getItem(key);\n }\n\n\n /**\n * Get all keys for the whole key convention\n *\n *\n *\n * @usage:\n * // Defined already in localstorage\n * localStorageKeys = [cgp_test1,test2,cgp_test3,test4]\n *\n * getAll() {\n * return [cgp_test1, cgp_test3];\n * };\n *\n * @returns {*} Gets all the data stored in the cache.\n * @public\n */\n getAll() : any[] {\n let keys: any[] = [];\n\n if (!this.localStorageExists()) {\n return keys;\n }\n\n Object\n .keys(localStorage)\n .filter(key => this.isKeyConvention(key))\n .forEach((key) => {\n keys.push(key);\n });\n\n return keys;\n }\n\n\n /**\n * Verify localStore is defined and can be used in here :)\n *\n *\n * @returns {boolean} makes sure that localStorage exists and we are allowed to use it.\n * @public\n */\n localStorageExists() {\n try {\n return 'localStorage' in window && null !== window.localStorage;\n } catch (error) {\n logger.error(['localStorage not found, features related to store will be disabled for this session.']);\n return false;\n }\n }\n\n\n /**\n * Clear all the data from the localStorage, return true when the local is clear\n * and false when the localStorage not found in the global scope.\n *\n *\n *\n * @usage:\n * clearLocalStorage() {\n * // if the localStorage is defined in the global window.\n * return true;\n * };\n *\n * @public\n */\n clear() : void {\n if (!this.localStorageExists()) {\n return;\n }\n\n localStorage.clear();\n }\n\n\n /**\n * This function will check key start with cgp prefix.\n *\n *\n *\n * @usage:\n * isKeyConvention('test') {\n * return false;\n * };\n *\n * getKeyConvention('cgp_test') {\n * return true;\n * };\n *\n *\n * @param {string} key - that needs to be verified for convention.\n * @returns {boolean} if they key is valid.\n * @public\n */\n isKeyConvention(key: string) {\n let stringUtil = new Strings(key);\n if (stringUtil.startsWith(this._perfix)) {\n return true;\n }\n\n return false;\n }\n\n\n /**\n * Get string convention for localStorage key.\n * Extend the input key with the static prefix we define.\n *\n *\n *\n * @usage:\n * getKeyConvention('test') {\n * return cgp_test\n * };\n *\n * @param {string} key - that needs to be converted to our convention.\n * @returns {string} of the key to be stored. With naming convention set.\n * @public\n */\n getKeyConvention(key: string) {\n if (!key) {\n return '';\n }\n\n // remove unwanted white spaces.\n let keyConvention = key.trim();\n let stringUtil = new Strings(keyConvention);\n if (!stringUtil.startsWith(this._perfix)) {\n return this._perfix + keyConvention;\n }\n\n return keyConvention;\n }\n}\n\nclass WindowStorage implements IStorage {\n /**\n * @property\n * @type {string}\n * @private\n */\n private readonly _storgeKeyName = 'cgpStorage';\n\n\n /**\n * @property\n * @type {null|object}\n * @private\n */\n private _cgpStorage: {[key: string]: any} = null;\n\n\n /**\n * Creates the store object and ensures it remains a Singleton.\n *\n * @constructor\n */\n constructor() {\n if (_.getQueryParameters()['clearstorage']) {\n this.clear();\n }\n\n this.init();\n }\n\n\n /**\n * Initializing the CGP window local storage.\n */\n init() {\n // Define CGP storage on the global window.\n this._cgpStorage = (window as any)[this._storgeKeyName] = {};\n\n logger.debug('Defined a new window cgp local storage.');\n logger.debug('Finish initializing window storage.');\n }\n\n\n /**\n * Stores a value to the assigned key.\n *\n *\n * @param {string} key - the name of the key to be stored.\n * @param {*} value - could be anything, Array/String/Object.\n *\n * @returns {boolean} stating the save was successfully or not.\n * @public\n */\n set(key: string, value: any): boolean {\n if (!this.storageExists()) {\n return false;\n }\n\n try {\n this._cgpStorage[key] = value;\n } catch (error) {\n throw error;\n }\n\n return true;\n }\n\n\n /**\n * Removes a key from the storage, also checks if exists.\n *\n *\n * @param {string} key - the name of the key to be deleted.\n * @returns {boolean} stating the delete was successfully or not.\n * @public\n */\n del(key: string): boolean {\n if (!this.storageExists() || _.isUndefined(this.get(key))) {\n return false;\n }\n\n delete this._cgpStorage[key];\n return true;\n }\n\n\n /**\n * Get a specific key from the store. If is not set, optionally can set a default value\n *\n *\n * @param {string} key - the name of the key to be returned.\n * @param {*} defaultValue - if key is empty, will return the default\n *\n * @returns {*} the data is mixed, what-ever is stored in the cache will be returned.\n * @public\n */\n get(key: string, defaultValue?: any): any | null {\n if (!this.storageExists()) {\n return defaultValue;\n }\n\n const defaultGetter = _.isUndefined(defaultValue) ? undefined : defaultValue;\n return this._cgpStorage[key] || defaultGetter;\n }\n\n\n /**\n * Check if window cgp stroage is exist.\n *\n * @returns {boolean}\n */\n storageExists(): boolean {\n return !_.isNull(this._cgpStorage);\n }\n\n\n /**\n * Get all keys for the whole key convention\n *\n *\n *\n * @usage:\n * // Defined already in localstorage\n * localStorageKeys = [cgp_test1,test2,cgp_test3,test4]\n *\n * getAll() {\n * return [cgp_test1, cgp_test3];\n * };\n *\n * @returns {*} Gets all the data stored in the cache.\n * @public\n */\n getAll(): any[] {\n let keys: any[] = [];\n\n if (!this.storageExists()) {\n return keys;\n }\n\n Object\n .keys(this._cgpStorage)\n .forEach((key) => {\n keys.push(key);\n });\n\n return keys;\n }\n\n\n /**\n * Clear all the data from the localStorage, return true when the local is clear\n * and false when the localStorage not found in the global scope.\n *\n *\n *\n * @usage:\n * clear() {\n * };\n *\n * @returns {boolean} stating the clear was successfully or not.\n * @public\n */\n clear() : void {\n (window as any)[this._storgeKeyName] = {};\n }\n}\n\n\nexport default new CGPStorage();\n","interface ICurlyBracesBinding {\n to: string,\n value: string,\n fn: string\n}\n\n/**\n * Basic String\n *\n * Enables chaning events, output must be called, else will return a chain\n *\n *\n */\nexport default class Strings {\n\n\n private _curlyBracesPattern = /{([^}]+)}/g;\n\n\n /**\n * Initialized the object with the source string to work with.\n */\n constructor(str: string) {\n this._string = str || '';\n }\n\n _string: string;\n\n\n\n /**\n * Make a string's first character uppercase\n * @see: http://php.net/manual/en/function.ucfirst.php\n */\n ucFirst() : string {\n return this._string.charAt(0).toUpperCase() + this._string.slice(1);\n }\n\n getCurlyBracesBinding(): Array {\n let found: Array = []; // an array to collect the strings that are found\n\n let currentMatch = this._curlyBracesPattern.exec(this._string);\n while (currentMatch) {\n found.push(this._getBindingMethod(currentMatch[1]));\n currentMatch = this._curlyBracesPattern.exec(this._string)\n }\n\n return found;\n }\n\n private _getBindingMethod(bindExpression: string) : ICurlyBracesBinding {\n let bindMap = {\n to: bindExpression,\n value: '',\n fn: ''\n };\n\n let bindRelatedMethod = bindExpression.split('|');\n if (2 === bindRelatedMethod.length) {\n bindMap.value = bindRelatedMethod[0].trim();\n bindMap.fn = bindRelatedMethod[1].trim();\n }\n\n return bindMap;\n }\n\n\n /**\n * @description - Insert char at a specific position in the string.\n */\n insertAt(index: number, stringToInjectT: string, stringToInject: string) {\n return stringToInjectT.substr(0, index) + stringToInject + stringToInjectT.substr(index);\n }\n\n /**\n *\n * @returns {string}\n */\n stripslashes(): string {\n return (this._string + '')\n .replace(/\\\\(.?)/g, function (s, n1) {\n switch (n1) {\n case '\\\\':\n return '\\\\'\n case '0':\n return '\\u0000'\n case '':\n return ''\n default:\n return n1\n }\n });\n }\n replaceAll(from: string, to: string)\n {\n return this._string.replace(new RegExp(to, 'g'), from);\n }\n\n getString() :string {\n return this._string;\n }\n\n setString(str): void {\n this._string = str;\n }\n\n /**\n * @description - Determines if a value is a empty string.\n */\n isEmpty(): boolean {\n return this._string.length === 0 || !this._string.trim();\n }\n\n\n /**\n *\n * @param partialString\n */\n startsWith(partialString) {\n if (!String.prototype.startsWith) {\n // eslint-disable-next-line\n String.prototype.startsWith = function (searchString, position) {\n position = position || 0;\n return this.substr(position, searchString.length) === searchString;\n };\n }\n\n return this._string.startsWith(partialString);\n }\n\n injectIntoCurly(bindingParams: object): string {\n if (bindingParams === undefined || bindingParams === null) {\n return this._string;\n }\n Object\n .keys(bindingParams)\n .forEach((bindTo) => {\n let tokens = this._string.split('{' + bindTo + '}');\n this._string = tokens.join(bindingParams[bindTo]);\n });\n\n return this._string;\n }\n}\n","import DOM from './dom';\nimport assign from 'assign-deep';\nimport { v4 as uuidv4 } from 'uuid';\n\n\nclass Underscore {\n isArguments(input) : boolean {\n return '[object Arguments]' === Object.prototype.toString.call(input);\n }\n\n isFunction(input) : boolean {\n return '[object Function]' === Object.prototype.toString.call(input);\n }\n\n isString(input) : boolean {\n return '[object String]' === Object.prototype.toString.call(input);\n }\n\n isNumber(input) : boolean {\n return '[object Number]' === Object.prototype.toString.call(input) && !isNaN(input);\n }\n\n isObject(input) : boolean {\n return '[object Object]' === Object.prototype.toString.call(input);\n }\n\n isDate(input) : boolean {\n return '[object Date]' === Object.prototype.toString.call(input);\n }\n\n isArray(expectedArray) : boolean {\n return Array.isArray(expectedArray);\n }\n\n isBoolean(input) : boolean {\n return true === input || false === input || '[object Boolean]' === Object.prototype.toString.call(input);\n }\n\n\n isError(input) : boolean {\n return '[object Error]' === Object.prototype.toString.call(input);\n }\n\n isSymbol(input) : boolean {\n return '[object Symbol]' === Object.prototype.toString.call(input);\n }\n\n isUndefined(input) : boolean {\n return '[object Undefined]' === Object.prototype.toString.call(input);\n }\n\n isHTMLDivElement(input) : boolean {\n return '[object HTMLDivElement]' === Object.prototype.toString.call(input);\n }\n\n isHTMLImgElement(input) : boolean {\n return '[object HTMLImageElement]' === Object.prototype.toString.call(input);\n }\n\n\n isNull(value) : boolean {\n return 'null' === value || value === null;\n }\n\n isNullOrUndefined(input) : boolean {\n return this.isNull(input) || this.isUndefined(input);\n }\n\n\tpropertyChainExists(obj: any, propChain: string) : boolean {\n let properties = propChain.split('.');\n while (properties.length > 0) {\n obj = obj[properties.shift()];\n if (this.isUndefined(obj)) {\n return false;\n }\n }\n return true;\n }\n\n isEmpty(input) : boolean {\n\n return this.isNullOrUndefined(input) || 0 === input.length || (input.constructor === Object && Object.keys(input).length === 0);\n }\n\n\n safeStringToNumber(str: string, defaultValue?: number) : number {\n\n if(this.isNullOrUndefined(str)) {\n if(this.isNullOrUndefined(defaultValue)) {\n throw new Error(`str parameter is null or undefined and no default value provided`);\n }\n\n return defaultValue;\n }\n\n let result = Number(str);\n\n if (Number.isNaN(result)) {\n if(this.isNullOrUndefined(defaultValue)) {\n throw new Error(`${str} is not a number and no default value provided`);\n }\n return defaultValue;\n }\n\n return result;\n }\n\n\n isNodeList(expectedNodeList: any) : boolean {\n var stringRepr = Object.prototype.toString.call(expectedNodeList);\n\n return typeof expectedNodeList === 'object' &&\n /^\\[object (HTMLCollection|NodeList|Object)\\]$/.test(stringRepr) &&\n (typeof expectedNodeList.length === 'number') &&\n (expectedNodeList.length === 0 || (typeof expectedNodeList[0] === \"object\" && expectedNodeList[0].nodeType > 0));\n }\n\n\n isElement(expectedElement: any) : boolean {\n return expectedElement instanceof HTMLElement;\n }\n\n /**\n * Check if string includes another substring\n *\n */\n includes(str: string, substr: string) : boolean{\n return str.indexOf(substr) !== -1;\n }\n\n\n /**\n * Load async js script code.\n *\n */\n loadAsyncScript(src: string, id: string = 'cgp-dynamic-script-' + Date.now(), type: string = 'text/javascript') : Promise {\n return new Promise((resolve, reject) => {\n var s;\n s = document.createElement('script');\n s.src = src;\n s.id = id;\n s.type = type;\n s.onload = resolve;\n s.onerror = reject;\n document.body.appendChild(s);\n });\n }\n\n\n /**\n * Generate GUID\n */\n getGuid(): string {\n return uuidv4();\n }\n\n isGuid(testedValue: string): boolean {\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[0-5][0-9a-f]{3}-[089ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(testedValue);\n }\n\n /**\n * Make id.\n *\n */\n makeid() : string {\n var text = \"\";\n var possible = \"abcdefghijklmnopqrstuvwxyz\";\n\n for (var i = 0; i < 10; i++)\n text += possible.charAt(Math.floor(Math.random() * possible.length));\n\n return text;\n }\n\n /**\n * return if the link is absolute\n * @param link\n * @returns {boolean}\n */\n isAbsoluteLink(link) {\n let regex = /^https?:\\/\\//i;\n return regex.test(link);\n }\n\n /**\n * Get hostname.\n *\n */\n getHostName(url: string) : string {\n const match = url.match(/(https?:\\/\\/[^/?#]+)/i);\n if (match != null && match.length === 2 && typeof match[1] === 'string' && match[1].length > 0) {\n return match[1];\n }\n else {\n return null;\n }\n }\n\n\n /**\n * Determinate if the given URL is valid(support also mailto url)\n *\n */\n isValidUrl(url: any): boolean {\n if (!this.isString(url))\n return false;\n var rg = /(^(((https?):\\/\\/)|(\\/))[^\\s]+$)|((^(mailto:))[^\\s]+@[^\\s]+$)/;\n return rg.test(url);\n }\n\n isAbsolutUrl(url: string): boolean {\n try {\n new URL(url);\n }catch (err) {\n return false;\n }\n\n return true;\n }\n\n /**\n * toggle option, kicks into and out of fullscreen mode.\n */\n toggleFullScreen(): void {\n if (this.isFullScreen()) {\n this.closeFullScreen();\n } else {\n this.openFullScreen();\n }\n }\n\n openFullScreen(): void {\n if (document.documentElement['requestFullScreen']) {\n document.documentElement['requestFullScreen']();\n } else if (document.documentElement['mozRequestFullScreen']) {\n document.documentElement['mozRequestFullScreen']();\n } else if (document.documentElement['webkitRequestFullScreen']) {\n document.documentElement['webkitRequestFullScreen'](Element['ALLOW_KEYBOARD_INPUT']);\n } else if (document.documentElement['msRequestFullscreen']) {\n if (!DOM.hasClass(document.body, 'cgp-ie-fullscreen')) {\n DOM.addClass(document.body, 'cgp-ie-fullscreen');\n }\n document.documentElement['msRequestFullscreen']();\n }\n\n }\n\n closeFullScreen(): void {\n if (document['cancelFullScreen']) {\n document['cancelFullScreen']();\n } else if (document['mozCancelFullScreen']) {\n document['mozCancelFullScreen']();\n } else if (document['webkitCancelFullScreen']) {\n document['webkitCancelFullScreen']();\n } else if (document['msExitFullscreen']) {\n DOM.removeClass(document.body, 'cgp-ie-fullscreen');\n document['msExitFullscreen']();\n }\n }\n\n isFullScreen() : boolean {\n return !this.isNullOrUndefined(document['mozFullScreenElement'])\n || !this.isNullOrUndefined(document['webkitFullscreenElement'])\n || !this.isNullOrUndefined(document['webkitCurrentFullScreenElement'])\n || !this.isNullOrUndefined(document['msFullscreenElement'])\n || !this.isNullOrUndefined(document['fullscreenElement']);\n }\n\n\n /**\n * If the user is caps lock.\n */\n isCapslock(event: any) : boolean {\n event = (event) ? event : window.event;\n\n let charCode: number = null;\n if (event.which) {\n charCode = event.which;\n } else if (event.keyCode) {\n charCode = event.keyCode;\n }\n\n let shiftOn = false;\n if (event.shiftKey) {\n shiftOn = event.shiftKey;\n } else if (event.modifiers) {\n shiftOn = !!(event.modifiers & 4);\n }\n\n if (charCode >= 97 && charCode <= 122 && shiftOn) {\n return true;\n }\n\n if (charCode >= 65 && charCode <= 90 && !shiftOn) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Merge/Extend Object\n *\n */\n mergeDeep(target: any, ...source) : any {\n source.forEach(curr => {\n assign(target, curr);\n });\n\n return target;\n }\n\n _createXmlDoc(xmlStr: string) {\n const xmlDoc = new (window as any).ActiveXObject(\"Microsoft.XMLDOM\");\n xmlDoc.async = \"false\";\n xmlDoc.loadXML(xmlStr);\n return xmlDoc;\n }\n\n parseXml(xmlStr: string)\n {\n try {\n if ((window as any).DOMParser) {\n return new DOMParser().parseFromString(xmlStr, \"text/xml\");\n } else if ((window as any).ActiveXObject) {\n return this._createXmlDoc(xmlStr);\n } else {\n return null;\n }\n }\n catch(err) {\n return null;\n }\n }\n\n /**\n * Get Query String or \"string\" as Object\n *\n */\n getQueryParameters() : any {\n let pairs = window.location.search.slice(1).split('&');\n let result = {};\n\n pairs.forEach(pair => {\n try {\n let pairMatch = pair.match(/([^?=]+)=(([^&]*))/).slice(1);\n result[pairMatch[0]] = decodeURIComponent(pairMatch[1] || '');\n } catch(e) {\n //failed to parse QS\n }\n });\n\n return JSON.parse(JSON.stringify(result));\n }\n\n jsonToQueryString(json: any): string {\n return this.isEmpty(json) ? '' : '?' +\n Object.keys(json).map(function(key) {\n return encodeURIComponent(key) + '=' +\n encodeURIComponent(json[key]);\n }).join('&');\n }\n\n\n /**\n * Add stop scrolling class to body.\n *\n */\n stopScrolling() {\n DOM.addClass(DOM.getBody(), 'stop-scrolling');\n }\n\n\n /**\n * Safe way to parse json stringfy.\n *\n * @param toParse - The string we want to parse to json.\n * @param defaultInException - The default value to return when exception thrown.\n * @returns {undefined}\n */\n safeJSON(toParse: string, defaultInException?: any) : any {\n try {\n return JSON.parse(toParse);\n } catch (ex) {\n return defaultInException || ex;\n }\n }\n\n safeJSONandDecode(input: string): object{\n try {\n const json = decodeURIComponent(input);\n return JSON.parse(json);\n } catch(e) {\n }\n return {};\n }\n\n getJSONVal(json: object, key: string): any {\n\n let val;\n try {\n val = json[key];\n } catch (e) {\n }\n return (undefined !== val) ? val : '';\n }\n\n\n dasherize(str: string): string {\n return (str[0].toLowerCase() + str.slice(1)).trim().replace(/[_\\s]+/g, '-').replace(/([A-Z])/g, '-$1').replace(/-+/g, '-').toLowerCase();\n }\n\n\n /**\n * Parse string function.\n */\n parseStringFunction(strFunction: string) : {rawStringFunction: string, functionName: string, functionStringParams:string, functionArrayParams: Array} {\n const START = 0;\n\n let startFunctionParams = strFunction.indexOf('('),\n endFunctionParams = strFunction.indexOf(')');\n\n let strFunctionName = strFunction.substring(START, startFunctionParams),\n strFunctionParams = strFunction.substring(startFunctionParams + 1, endFunctionParams),\n arrayFunctionParams = strFunctionParams.replace(/\\s+/g, '').split(',');\n\n return {\n rawStringFunction: strFunction,\n functionName: strFunctionName,\n functionStringParams: strFunctionParams,\n functionArrayParams: arrayFunctionParams\n }\n }\n\n\n /**\n * Returns the object without nullable or undefined parameters\n */\n cleanObject(obj: any, options: any) : any {\n options = Object.assign({removeUndefined: true, removeNull: false}, options);\n var cleanObject = {};\n Object.entries(obj).forEach(([key, value]) => {\n if ((undefined === value && true === options.removeUndefined) || (null === value && true === options.removeNull)) {\n return;\n } else {\n cleanObject[key] = value;\n }\n });\n return cleanObject;\n }\n\n\n /**\n * Generic convert to boolean\n */\n toBoolean(value) {\n if (this.isString(value) && (value === 'false' || value === 'true')) {\n return value === 'true';\n }\n return Boolean(value);\n }\n\n\n /**\n * Scroll with smooth animation\n * @param direction\n * @param scrollSize\n * @param container\n * @param duration\n * @param smooothLevel\n * @private\n */\n smoothScrolling(direction: string, scrollSize: number, duration: number, container: HTMLElement, smoothLevel: number = 20): Promise {\n return new Promise((res) => {\n let stepInterval = Math.ceil(duration / smoothLevel); // 1000 / 20 = 50\n let restSize = scrollSize;\n let scrollStepSize = Math.ceil(scrollSize / smoothLevel); // 100 / 50 = 2 (0.5 rest)\n\n let scrollStepFn = () => {\n scrollSize = restSize > scrollStepSize ? scrollStepSize : restSize;\n switch (direction) {\n case 'left':\n container.scrollLeft -= scrollSize;\n break;\n case 'right':\n container.scrollLeft += scrollSize;\n break;\n case 'up':\n container.scrollTop -= scrollSize;\n break;\n case 'down':\n container.scrollTop += scrollSize;\n break;\n }\n restSize -= scrollSize;\n if (0 < restSize) {\n DOM.setTimeout(scrollStepFn, stepInterval, null);\n } else {\n res();\n }\n };\n scrollStepFn();\n // DOM.setTimeout(scrollStepFn, stepInterval);\n });\n\n }\n\n toLowerCaseKeys(obj: object): object {\n return Object.keys(obj).reduce((accum, key) => {\n accum[key.toLowerCase()] = obj[key];\n return accum;\n }, {});\n }\n\n removeEmptyPropertiesfromObject(obj) {\n if(typeof(obj) !== 'object') {\n return obj;\n }\n\n Object.keys(obj).forEach((prop)=> {\n if(this.isNullOrUndefined(obj[prop])) {\n delete obj[prop];\n }\n });\n\n return obj;\n }\n\n /**\n * @description Remove the localhost\n */\n removeLocalhost(url){\n try {\n return url.replace(/^[a-z]{4,5}:\\/{2}[a-z]{1,}:[0-9]{1,4}.(.*)/, '$1');\n }catch (e) {\n return url;\n }\n }\n\n capitalizeFirstLetter(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n }\n\n\n lowerFirstLetter(str: string): string {\n return str.charAt(0).toLowerCase() + str.slice(1);\n }\n\n\n arraysAreEqual(arr1: any[], arr2: any[], areItemsEqual?: (item1: any, item2: any) => boolean): boolean {\n arr1 = arr1 || [];\n arr2 = arr2 || [];\n\n if(arr1.length !== arr2.length) {\n return false;\n }\n\n for(let i = 0; i < arr1.length; i++) {\n if(this.isNullOrUndefined(areItemsEqual)) {\n if(arr1[i] !== arr2[i]) {\n return false;\n }\n } else {\n if(!areItemsEqual(arr1[i], arr2[i])) {\n return false;\n }\n }\n }\n\n return true;\n }\n\n /**\n * should return the number as bytes notation.\n * for example:\n * formatNumberToBytesNotation(1000, 0) will return 1K\n * formatNumberToBytesNotation(3000000, 0) will return 3M\n * formatNumberToBytesNotation(1500, 1) will return 1.5K\n * @param num\n * @param digits\n */\n formatNumberToBytesNotation(num: number, digits: number) {\n const formatMap = [\n { value: 1, symbol: \"\" },\n { value: 1E3, symbol: \"K\" },\n { value: 1E6, symbol: \"M\" },\n { value: 1E9, symbol: \"G\" },\n { value: 1E12, symbol: \"T\" },\n { value: 1E15, symbol: \"P\" },\n { value: 1E18, symbol: \"E\" }\n ];\n const rx = /\\.0+$|(\\.[0-9]*[1-9])0+$/;\n let index;\n for (index = formatMap.length - 1; index > 0; index--) {\n if (num >= formatMap[index].value) {\n break;\n }\n }\n return (num / formatMap[index].value).toFixed(digits).replace(rx, \"$1\") + formatMap[index].symbol;\n }\n\n once(fn, context = this) {\n let result;\n return function() {\n if (fn) {\n result = fn.apply(context || this, arguments);\n fn = null;\n }\n return result;\n };\n }\n}\n\nexport default new Underscore();","\nexport function splitArrayToChunks(originalArray: T[], chunkSize: number): Array {\n\n if(!originalArray || originalArray.length === 0) {\n return [];\n }\n\n let result: Array = [];\n for(let i = 0; i * chunkSize < originalArray.length; i++) {\n result.push(originalArray.slice(i * chunkSize, i * chunkSize + chunkSize));\n }\n\n return result;\n}\n\nexport function arraysEqual(arr1: T[], arr2: T[]) {\n if (arr1 === arr2) return true;\n if (arr1 == null || arr2 == null) return false;\n if (arr1.length !== arr2.length) return false;\n\n for (let i = 0; i < arr1.length; ++i) {\n if (arr1[i] !== arr2[i]) return false;\n }\n return true;\n}\n\n/**\n * Shuffle an array using the Fisher-Yates unbiased algorithm\n * Read more about the algorithm here: https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle\n * The implementation is taken from here: https://bost.ocks.org/mike/shuffle/\n * and updated a bit for typescript\n */\nexport function shuffle(array: unknown[]) {\n let m = array.length, t: unknown;\n\n // While there remain elements to shuffle…\n while (m) {\n\n // Pick a remaining element…\n let i = Math.floor(Math.random() * m--);\n\n // And swap it with the current element.\n t = array[m];\n array[m] = array[i];\n array[i] = t;\n }\n\n return array;\n}\n","import {Check, TimeSpan} from '@sparkware/app-utils';\nimport {ApplicationStartupConfigurations} from '../app-react/app-bootstrap/config-interfaces/application-startup.configurations';\nimport {TimeIntervalName} from '../common/utils/time-interval-names';\n\nexport const CYPRESS_TO_ORBIT_HOOKS_OBJECT_NAME = 'CypressToOrbitHooks';\nexport const CYPRESS_GLOBAL_OBJECT_NAME = 'Cypress';\n\nexport function isInsideAutomation(): boolean {\n return !Check.isNullOrUndefined(window[CYPRESS_GLOBAL_OBJECT_NAME])\n && !Check.isNullOrUndefined(window[CYPRESS_GLOBAL_OBJECT_NAME][CYPRESS_TO_ORBIT_HOOKS_OBJECT_NAME])\n}\n\n\nexport function mockApplicationStartupConfigs(configs: ApplicationStartupConfigurations): ApplicationStartupConfigurations {\n if(isInsideAutomation()) {\n getCypressToOrbitHooks().onAppStartupConfigs(configs);\n }\n return configs;\n}\n\nexport function getCypressToOrbitHooks(): ICypressToOrbitHooks {\n if(!isInsideAutomation()) {\n throw new Error('You can only call getCypressToOrbitHooks inside automation');\n }\n return window[CYPRESS_GLOBAL_OBJECT_NAME][CYPRESS_TO_ORBIT_HOOKS_OBJECT_NAME] as ICypressToOrbitHooks;\n}\n\nexport interface OnTimeIntervalCreationResult {\n ignoreJavaScriptImplementation: boolean;\n timerId?: number;\n}\n\nexport enum NamedIntervalType {\n setInterval,\n setTimeout\n}\n\nexport interface ICypressToOrbitHooks {\n onAppStartupConfigs(configs: ApplicationStartupConfigurations);\n onTimeIntervalCreation(name: TimeIntervalName, callback: () => void, interval: TimeSpan, intervalType: NamedIntervalType): OnTimeIntervalCreationResult;\n}\n\n","import {Check} from '@sparkware/app-utils';\nimport {ILazy} from \"./lazy.interface\";\n\nexport class Lazy implements ILazy {\n constructor(private _valueFactory: () => T) {\n }\n\n readonly isLazy = true;\n\n private _value = undefined;\n private _initializing = false;\n private _initValue() {\n if (this._initializing) {\n throw new Error('Lazy circular dependency detected: ' + this._valueFactory)\n }\n if (Check.isUndefined(this._value)) {\n this._initializing = true;\n try {\n this._value = this._valueFactory();\n }\n finally {\n this._initializing = false;\n }\n\n }\n }\n\n get value(): T {\n this._initValue();\n\n return this._value;\n }\n\n forceInit() {\n this._initValue();\n }\n\n tryGetResolvedValue(): any | Promise {\n return this.value;\n }\n\n}\n","export function matchAllWords(text: string, words: RegExp[]): boolean {\n for(let index = 0; index < words.length; index++) {\n if(!text.match(words[index])) {\n return false;\n }\n }\n return true;\n}\n\nexport function removeSpaces(str) {\n return str.replace(/\\s/g, '');\n}\n\nexport function removeSpecialCharacters(str: string): string {\n return str.replace(/[^a-zA-Z0-9 ]/g, \"\");\n}\n\n/**\n * Given a string extracts all the words from it and converts them in case insensitive regular expressions\n * @param {string} text\n * @return {RegExp[]}\n */\nexport function extractWordsRegularExpressions(text: string): RegExp[] {\n if(!text) {\n return [];\n }\n\n return text.split(' ')\n .map(word => word.trim())\n .filter(word => word)\n .map(word => new RegExp(word, 'gi'));\n}\n\nexport function convertStringArrayToString(messages: string[], joinCharacters: string): string {\n return messages.join(joinCharacters);\n\n}\n\nexport function parseCommaSeparatedNumbers(values: string): number[] {\n return values.split(',')\n .map(n => n.trim())\n .filter(n => n !== '')\n .map(n => parseInt(n))\n}"],"names":["OrbitComponentWithState","_reactions","this","props","services","context","_disposeReactions","expression","effect","opts","disposer","mobxReaction","push","forEach","React","contextType","OrbitContext","OrbitComponent","IMAGE_TYPE","IMAGE_STATUS","EMPTY_IMAGE","Image","_imgRef","createRef","_fetchPriority","fetchpriority","fetchPriority","_onLoad","e","state","status","LAZY","LOADING","setState","SETTLED","type","SRC","onLoad","onSettled","value","_onError","FALLBACK","src","EMPTY_IMAGE_BASE64","fallbackSrc","onError","_tapHandlerLogic","_intersectionObserver","_intersectionObserverCallback","entries","observer","intersectionRatio","isIntersecting","_destroyIntersectionObserver","onLoadStart","current","_createIntersectionObserver","_getInitialSrcState","_createTapLogicHandler","lazy","_destroyTapLogicHandler","prevProps","element","enableTap","TapHandlerLogic","dispose","IntersectionObserver","rootMargin","threshold","observe","disconnect","alt","className","title","width","height","style","ref","onClick","_element","_onMouseDownHandler","classList","add","ORBIT_TAP","_onMouseUpHandler","remove","addEventListener","removeEventListener","TapHandler","children","enabled","elementRef","OrbitContextProvider","Provider","Consumer","DomService","observable","initialBodyPaddingRight","bodyPaddingRightAltered","_eventListenerRegistration","_onFullScreenChange","runInAction","isInFullScreen","_","makeObservable","EventListenerRegistration","document","DOM","window","innerWidth","body","clientWidth","scrollbarThickness","bodyComputedStyles","getComputedStyle","paddingRight","selector","querySelector","head","documentElement","location","pathname","getElementsByClassName","tagName","getElementsByTagName","id","getElementById","createElement","url","options","urlBuilder","URL","urlParams","searchParams","paramValue","paramName","search","hash","submitForm","method","href","extraParams","params","form","setAttribute","Check","target","hiddenField","key","appendChild","submit","setTimeout","removeChild","FallbackRoute","render","_routeDefinition","paths","routeParams","RouteBase","_routeParams","_isOrbitRoute","data","tryMatchPath","pathToMatch","routes","i","length","routeDefinition","j","pattern","match","matchPath","path","caseSensitive","end","exact","toLowerCase","SplashService","onAfterRemoveSplash","splashTime","_splashRemovedSubscribers","startTime","parseFloat","performance","now","toFixed","splashPageElement","computeSplashTimeInSeconds","callback","_enablePrerender","console","error","timeoutValue","isInsideAutomation","namedTimer","name","handler","interval","intervalType","javascriptFunction","Error","TimeSpan","timeSpan","convertToTimeSpan","response","getCypressToOrbitHooks","onTimeIntervalCreation","ignoreJavaScriptImplementation","timerId","totalMilliseconds","namedSetInterval","NamedIntervalType","setInterval","namedSetTimeout","DeviceFeatureDetection","DocumentTouch","undefined","navigator","maxTouchPoints","DeviceOSDetection","parser","os","getOS","replace","parseInt","version","split","indexOf","isMobileOS","isIOS","isAndroid","DeviceViewportDetection","innerHeight","screen","ratio","systemXDPI","logicalXDPI","devicePixelRatio","matchMedia","matches","DeviceModelDetection","device","getDevice","vendor","model","DeviceBrowserDetection","browser","getBrowser","allowAttrValue","getAllowAttr","NATIVE_TYPE","DeviceHybridDetection","logger","_hybrid","_inCasino","_inPoker","_inSport","_embedded","Logger","constructor","CLASS","buildHybridInfo","genericHybridEmbedded","inPokerHybrid","build_isInPokerHybrid","casinoHybrid","build_isCasinoHybrid","inSportHybrid","build_isInSportHybrid","dataSanityCheck","inPoker","isNativeIOS","isNativeAndroid","NativeInterface","Store","storedClientVersion","startsWith","storedSourceProductPackage","toString","webkit","messageHandlers","_uaParser","UAParser","feature","viewport","hybrid","getUA","uuidv4","media","standalone","isHybrid","isStandalone","getContext","isProbablyIOSDevice","cookieEnabled","isMacOS","isTouch","isIpad","isIphone","isMobile","screenWidth","screenHeight","getIphoneVersion","isTablet","b","m","bd","bmt","Date","t","count","tt","Math","max","apply","_createLogger","append","getBody","query","el","isTag","tag","substring","isId","substr","querySelectorAll","slice","call","content","newStyle","innerHTML","html","domElement","_class","addClass","parentNode","insertBefore","firstChild","toggle","contains","attribute","removeProperty","getCurrentStyle","horizontMargin","marginLeft","marginRight","verticalMargin","marginBottom","marginTop","offsetWidth","offsetHeight","horizontPadding","paddingLeft","verticalPadding","paddingBottom","paddingTop","horizontBorder","borderLeftWidth","borderRightWidth","verticalBorder","borderBottomWidth","borderTopWidth","fullWidth","fullHeight","size","unit","removeClass","attr","removeAttribute","str","g","toUpperCase","attributes","test","camelCaseName","$0","$1","textContent","msgElement","msgType","msgCallback","useCapture","eventName","timeout","handle","clearInterval","clearTimeout","_logger","logLevel","_getQueryParameters","setLevel","SET_LOG_LEVEL","log","_log","severity","_isConsoleEnabled","map","n","bind","CGPLogger","CGPStorage","_selectedStorage","init","isLocalStorageNameSupported","debug","LocalStorage","WindowStorage","setFullYear","getFullYear","cookie","toUTCString","RegExp","testKey","storage","localStorage","setItem","removeItem","set","delKey","delArray","del","keys","result","defaultValue","get","clear","_perfix","localStorageExists","getKeyConvention","getItem","Object","filter","isKeyConvention","Strings","keyConvention","trim","_storgeKeyName","_cgpStorage","storageExists","defaultGetter","_curlyBracesPattern","_string","charAt","found","currentMatch","exec","_getBindingMethod","bindExpression","bindMap","to","fn","bindRelatedMethod","index","stringToInjectT","stringToInject","s","n1","from","partialString","String","prototype","searchString","position","bindingParams","bindTo","tokens","join","Underscore","input","isNaN","expectedArray","Array","isArray","isNull","isUndefined","obj","propChain","properties","shift","isNullOrUndefined","Number","expectedNodeList","stringRepr","nodeType","expectedElement","HTMLElement","Promise","resolve","reject","onload","onerror","testedValue","text","possible","floor","random","link","isString","err","isFullScreen","closeFullScreen","openFullScreen","Element","event","charCode","which","keyCode","shiftOn","shiftKey","modifiers","source","curr","assign","xmlStr","xmlDoc","ActiveXObject","async","loadXML","DOMParser","parseFromString","_createXmlDoc","pairs","pair","pairMatch","decodeURIComponent","JSON","parse","stringify","json","isEmpty","encodeURIComponent","toParse","defaultInException","ex","val","strFunction","startFunctionParams","endFunctionParams","strFunctionName","strFunctionParams","arrayFunctionParams","rawStringFunction","functionName","functionStringParams","functionArrayParams","removeUndefined","removeNull","cleanObject","Boolean","direction","scrollSize","duration","container","smoothLevel","res","stepInterval","ceil","restSize","scrollStepSize","scrollStepFn","scrollLeft","scrollTop","reduce","accum","prop","arr1","arr2","areItemsEqual","num","digits","formatMap","symbol","arguments","splitArrayToChunks","originalArray","chunkSize","arraysEqual","shuffle","array","CYPRESS_TO_ORBIT_HOOKS_OBJECT_NAME","CYPRESS_GLOBAL_OBJECT_NAME","mockApplicationStartupConfigs","configs","onAppStartupConfigs","Lazy","_valueFactory","isLazy","_value","_initializing","_initValue","matchAllWords","words","removeSpaces","removeSpecialCharacters","extractWordsRegularExpressions","word","parseCommaSeparatedNumbers","values"],"sourceRoot":""}