{"version":3,"sources":["../ts/modules/recaptcha.ts"],"names":["loaded","Promise","resolve","reject","callback","fn","let","fnname","rng_1","randomString","window","$","attr","async","defer","src","escape_1","url","localization_1","currentLanguage","appendTo","exports","Recaptcha","constructor","container","parameters","this","widgetId","_response","observable_1","ObservableValue","_isFallback","getContainer","create","then","grecaptcha","destroy","wrapper","render","Object","assign","sitekey","response","value","expired-callback","undefined","time_1","waitForElement","iframe","isFallback","test","prop","on","e","currentTarget","val","reset","innerHTML","get","theme","type","size"],"mappings":"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","file":"recaptcha.js","sourcesContent":["import * as $ from 'jquery';\r\nimport { randomString } from 'rng';\r\nimport { url } from 'utilities/escape';\r\nimport { ObservableValue } from 'observable';\r\nimport { currentLanguage } from 'localization';\r\nimport { waitForElement } from 'time';\r\n\r\nconst charset = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_$0123456789';\r\nfunction createCallback( fn ): string {\r\n\tlet fnname: string;\r\n\tdo {\r\n\t\tfnname = `callback${randomString( charset, 10, 12 )}`;\r\n\t} while( fnname in window );\r\n\twindow[ fnname ] = fn;\r\n\treturn fnname;\r\n}\r\n\r\nexport interface IRecaptchaParameters {\r\n\ttheme?: string;\r\n\ttype?: string;\r\n\tsize?: string;\r\n}\r\n\r\nconst sitekey = '6LfIfWcUAAAAALtHGe0pv_0_VGpksuCPhF4PerbP',\r\n\tloaded =\r\n\tnew Promise<any>( ( resolve, reject ) => {\r\n\t\tconst callback = createCallback( () => {\r\n\t\t\tresolve( window[ 'grecaptcha' ] );\r\n\t\t\tdelete window[ callback ];\r\n\t\t} );\r\n\r\n\t\t$( () => {\r\n\t\t\t$( '<script/>' ).attr( { async: 'async', defer: 'defer', src: url`https://www.google.com/recaptcha/api.js?&onload=${callback}&render=explicit&hl=${currentLanguage}` } ).appendTo( 'head' );\r\n\t\t} );\r\n\t} );\r\n\r\nexport class Recaptcha {\r\n\tconstructor( container: HTMLElement|PromiseLike<HTMLElement>, parameters?: IRecaptchaParameters ) {\r\n\t\tthis.getContainer = Promise.resolve( container );\r\n\t\tif( parameters ) this.parameters = parameters;\r\n\t}\r\n\r\n\tpublic create() {\r\n\t\treturn loaded\r\n\t\t.then( grecaptcha =>\r\n\t\t\tthis.getContainer\r\n\t\t\t\t.then( container => ( { container, grecaptcha } ) )\r\n\t\t).then( ( { container, grecaptcha } ) =>\r\n\t\t\tthis.destroy( grecaptcha, container )\r\n\t\t\t\t.then( wrapper => ( { grecaptcha, container, wrapper } ) )\r\n\t\t).then( ( { grecaptcha, container, wrapper } ) => {\r\n\t\t\tthis.widgetId =\r\n\t\t\t\tgrecaptcha.render(\r\n\t\t\t\t\twrapper,\r\n\t\t\t\t\tObject.assign(\r\n\t\t\t\t\t\t{},\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tsitekey,\r\n\t\t\t\t\t\t\tcallback: ( value ) => {\r\n\t\t\t\t\t\t\t\tthis.response.value = value;\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t'expired-callback': () => {\r\n\t\t\t\t\t\t\t\tthis.response.value = undefined;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\tthis.parameters\r\n\t\t\t\t\t)\r\n\t\t\t\t);\r\n\t\t\treturn waitForElement( 'iframe', wrapper, 14, 5000 )\r\n\t\t\t\t.then( iframe => ( { grecaptcha, container, wrapper, iframe } ) );\r\n\t\t\t}\r\n\t\t).then( ( { grecaptcha, container, wrapper, iframe } ) => {\r\n\t\t\tconst isFallback = /fallback/i.test( $( iframe ).prop( 'src' ) );\r\n\t\t\tthis.isFallback.value = isFallback;\r\n\t\t\tif( isFallback ) {\r\n\t\t\t\t$( wrapper ).on( 'change input keypress blur', '.g-recaptcha-response', e => {\r\n\t\t\t\t\tthis.response.value = $( e.currentTarget ).val();\r\n\t\t\t\t} );\r\n\t\t\t\tthis.response.value = $( '.g-recaptcha-response', wrapper ).val();\r\n\t\t\t}\r\n\t\t} );\r\n\t}\r\n\r\n\tprivate destroy( grecaptcha: any, container: HTMLElement ) {\r\n\t\tconst { widgetId } = this;\r\n\t\tif( widgetId ) {\r\n\t\t\tgrecaptcha.reset( widgetId );\r\n\t\t\tthis.widgetId = null;\r\n\t\t}\r\n\t\tthis.response.value = undefined;\r\n\t\tthis.isFallback.value = undefined;\r\n\t\tcontainer.innerHTML = '';\r\n\t\t// create a wrapper to avoid re-using the same element\r\n\t\tconst wrapper = $( '<div/>' ).appendTo( container ).get( 0 ) as HTMLElement;\r\n\t\treturn Promise.resolve<HTMLElement>( wrapper );\r\n\t}\r\n\r\n\tprivate getContainer: PromiseLike<HTMLElement>;\r\n\tpublic sitekey: string;\r\n\tpublic theme: string;\r\n\tpublic type: string;\r\n\tpublic size: string;\r\n\tprivate widgetId: string = null;\r\n\r\n\tprivate _response = new ObservableValue<string>();\r\n\tpublic get response() { return this._response; }\r\n\r\n\tprivate _isFallback = new ObservableValue<boolean>();\r\n\tpublic get isFallback() { return this._isFallback; }\r\n\r\n\tpublic get parameters(): IRecaptchaParameters {\r\n\t\tlet { theme, type, size } = this;\r\n\t\tif( !theme ) theme = 'light';\r\n\t\tif( !type ) type = 'image';\r\n\t\tif( !size ) size = 'normal';\r\n\t\treturn { theme, type, size };\r\n\t}\r\n\r\n\tpublic set parameters( value: IRecaptchaParameters ) {\r\n\t\tthis.theme = value.theme;\r\n\t\tthis.type = value.type;\r\n\t\tthis.size = value.size;\r\n\t}\r\n}"]}