1 {if $recaptchaLegacyMode|empty}
2 {include file='captcha'}
4 {* No explicit keys were set, use legacy V1 API and WoltLab's OEM keys *}
5 {if RECAPTCHA_PUBLICKEY === '' || RECAPTCHA_PRIVATEKEY === ''}
6 <section class="section">
7 <header class="sectionHeader">
8 <h2 class="sectionTitle">{lang}wcf.recaptcha.title{/lang}</h2>
9 <small class="sectionDescription">{lang}wcf.recaptcha.description{/lang}</small>
12 <dl class="wide reCaptcha{if $errorField|isset && $errorField == 'recaptchaString'} formError{/if}">
13 {if !$ajaxCaptcha|isset || !$ajaxCaptcha}
14 <script data-relocate="true">
16 var RecaptchaOptions = {
17 lang: '{@$recaptchaLanguageCode}',
24 <label for="recaptcha_response_field">reCAPTCHA</label>
27 <div id="recaptcha_image"></div>
28 <input type="text" id="recaptcha_response_field" name="recaptcha_response_field" class="medium" />
29 {if (($errorType|isset && $errorType|is_array && $errorType[recaptchaString]|isset) || ($errorField|isset && $errorField == 'recaptchaString'))}
30 {if $errorType|is_array && $errorType[recaptchaString]|isset}
31 {assign var='__errorType' value=$errorType[recaptchaString]}
33 {assign var='__errorType' value=$errorType}
35 <small class="innerError">
36 {if $__errorType == 'empty'}
37 {lang}wcf.global.form.error.empty{/lang}
39 {lang}wcf.recaptcha.error.recaptchaString.{$__errorType}{/lang}
48 <ul class="buttonList smallButtons">
49 <li><a href="javascript:Recaptcha.reload()" class="button small"><span class="icon icon16 fa-repeat"></span> <span>{lang}wcf.recaptcha.reload{/lang}</span></a></li>
50 <li class="recaptcha_only_if_image"><a href="javascript:Recaptcha.switch_type('audio')" class="button small"><span class="icon icon16 fa-volume-up"></span> <span>{lang}wcf.recaptcha.audio{/lang}</span></a></li>
51 <li class="recaptcha_only_if_audio"><a href="javascript:Recaptcha.switch_type('image')" class="button small"><span class="icon icon16 fa-eye"></span> <span>{lang}wcf.recaptcha.image{/lang}</span></a></li>
52 <li><a href="javascript:Recaptcha.showhelp()" class="button small"><span class="icon icon16 fa-question"></span> <span>{lang}wcf.recaptcha.help{/lang}</span></a></li>
53 {event name='buttons'}
57 {if !$ajaxCaptcha|isset || !$ajaxCaptcha}
58 <script data-relocate="true" src="//www.google.com/recaptcha/api/challenge?k={$recaptchaPublicKey}"></script>
61 <iframe src="//www.google.com/recaptcha/api/noscript?k={$recaptchaPublicKey}" height="300" width="500" seamless="seamless"></iframe><br />
62 <textarea name="recaptcha_challenge_field" rows="3" cols="40"></textarea>
63 <input type="hidden" name="recaptcha_response_field" value="manual_challenge" />
65 {if (($errorType|isset && $errorType|is_array && $errorType[recaptchaString]|isset) || ($errorField|isset && $errorField == 'recaptchaString'))}
66 {if $errorType|is_array && $errorType[recaptchaString]|isset}
67 {assign var='__errorType' value=$errorType[recaptchaString]}
69 {assign var='__errorType' value=$errorType}
71 <small class="innerError">
72 {if $errorType == 'empty'}
73 {lang}wcf.global.form.error.empty{/lang}
75 {lang}wcf.recaptcha.error.recaptchaString.{$__errorType}{/lang}
81 <script data-relocate="true">
83 $.getScript('//www.google.com/recaptcha/api/js/recaptcha_ajax.js', function() {
84 Recaptcha.create("{$recaptchaPublicKey}", "recaptcha_image", {
85 lang: '{@$recaptchaLanguageCode}',
89 WCF.System.Captcha.addCallback('{$captchaID}', function() {
91 recaptcha_challenge_field: Recaptcha.get_challenge(),
92 recaptcha_response_field: Recaptcha.get_response()
102 <section class="section">
103 <h2 class="sectionTitle">{lang}wcf.recaptcha.title{/lang}</h2>
104 {assign var="recaptchaBucketID" value=true|microtime|sha1}
105 <dl class="{if $errorField|isset && $errorField == 'recaptchaString'}formError{/if}">
108 <div id="recaptchaBucket{$recaptchaBucketID}"></div>
110 <div style="width: 302px; height: 473px;">
111 <div style="width: 302px; height: 422px; position: relative;">
112 <div style="width: 302px; height: 422px; position: relative;">
113 <iframe src="https://www.google.com/recaptcha/api/fallback?k={RECAPTCHA_PUBLICKEY|encodeJS}" frameborder="0" scrolling="no" style="width: 302px; height:422px; border-style: none;"></iframe>
115 <div style="width: 300px; height: 60px; position: relative; border-style: none; bottom: 12px; left: 0; margin: 0px; padding: 0px; right: 25px; background: #f9f9f9; border: 1px solid #c1c1c1; border-radius: 3px;">
116 <textarea name="g-recaptcha-response" class="g-recaptcha-response" style="width: 290px; height: 50px; border: 1px solid #c1c1c1; margin: 5px; padding: 0px; resize: none;"></textarea>
121 {if (($errorType|isset && $errorType|is_array && $errorType[recaptchaString]|isset) || ($errorField|isset && $errorField == 'recaptchaString'))}
122 {if $errorType|is_array && $errorType[recaptchaString]|isset}
123 {assign var='__errorType' value=$errorType[recaptchaString]}
125 {assign var='__errorType' value=$errorType}
127 <small class="innerError">
128 {if $__errorType == 'empty'}
129 {lang}wcf.global.form.error.empty{/lang}
131 {lang}wcf.captcha.recaptchaV2.error.recaptchaString.{$__errorType}{/lang}
137 <script data-relocate="true">
139 if (!WCF.recaptcha) {
142 callbackCalled: false,
146 // this needs to be in global scope
147 function recaptchaCallback() {
149 WCF.recaptcha.callbackCalled = true;
152 while (bucket = WCF.recaptcha.queue.shift()) {
153 WCF.recaptcha.mapping[bucket] = grecaptcha.render(bucket, {
154 'sitekey' : '{RECAPTCHA_PUBLICKEY|encodeJS}'
160 // add captcha to queue
161 WCF.recaptcha.queue.push('recaptchaBucket{$recaptchaBucketID}');
163 // trigger callback immediately, if API already is available
164 if (WCF.recaptcha.callbackCalled) setTimeout(recaptchaCallback, 1);
166 {if $ajaxCaptcha|isset && $ajaxCaptcha}
167 WCF.System.Captcha.addCallback('{$captchaID}', function() {
169 'g-recaptcha-response': grecaptcha.getResponse(WCF.recaptcha.mapping['recaptchaBucket{$recaptchaBucketID}'])
174 // ensure recaptcha API is loaded at most once
175 if (!window.grecaptcha) $.getScript('https://www.google.com/recaptcha/api.js?render=explicit&onload=recaptchaCallback');