{"version":3,"file":"static/js/270.0527957b.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/Lazy.ts","utils/array-helper.ts","utils/automation-helpers.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}\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\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 this._element.addEventListener('click', this._onClickHandler);\n }\n\n private _timeoutRef = null;\n\n private _onClickHandler = () => {\n if (this._timeoutRef) {\n return;\n }\n\n this._element.classList.add(ORBIT_TAP);\n this._timeoutRef = setTimeout(() => {\n this._element.classList.remove(ORBIT_TAP);\n this._timeoutRef = null;\n }, 150);\n\n };\n\n dispose() {\n if(this._timeoutRef) {\n clearTimeout(this._timeoutRef);\n }\n\n this._element.removeEventListener('click', this._onClickHandler);\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 //document.body.style.position = 'fixed';\n document.body.classList.add('disable-animations');\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 document.body.classList.remove('disable-animations');\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}\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();","import {Check} from '@sparkware/app-utils';\n\nexport class Lazy{\n constructor(private _valueFactory: () => T) {\n }\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","\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","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","_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","_timeoutRef","_onClickHandler","classList","add","ORBIT_TAP","setTimeout","remove","addEventListener","clearTimeout","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","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","_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","Lazy","_valueFactory","_value","_initializing","_initValue","splitArrayToChunks","originalArray","chunkSize","arraysEqual","shuffle","array","CYPRESS_TO_ORBIT_HOOKS_OBJECT_NAME","CYPRESS_GLOBAL_OBJECT_NAME","mockApplicationStartupConfigs","configs","onAppStartupConfigs","matchAllWords","words","removeSpaces","removeSpecialCharacters","extractWordsRegularExpressions","word","parseCommaSeparatedNumbers","values"],"sourceRoot":""}