PageSourceSearch

https://heartofcapetown.co.za/wp-content/plugins/google-captcha/js/script.js?ver=1.73

js heartofcapetown.co.za collected 2026-10-02 12:25:26 UTC 9,325 bytes, 298 lines download raw bytes

1( function( $, gglcptch ) {
2	gglcptch = gglcptch || {};
3
4	gglcptch.prepare = function() {
5		/*
6		 * display reCaptcha for plugin`s block
7		 */
8		$( '.gglcptch_v2, .gglcptch_invisible' ).each( function() {
9
10			var container = $( this ).find( '.gglcptch_recaptcha' );
11
12			if (
13				container.is( ':empty' ) &&
14				( gglcptch.vars.visibility || $( this ).is( ':visible' ) === $( this ).is( ':not(:hidden)' ) )
15			) {
16				var containerId = container.attr( 'id' );
17				gglcptch.display( containerId );
18			}
19		} );
20
21		if ( 'v3' == gglcptch.options.version ) {
22			grecaptcha.ready( function() {
23				grecaptcha.execute( gglcptch.options.sitekey, {action: 'BWS_reCaptcha'}).then(function( token ) {
24					document.querySelectorAll( "#g-recaptcha-response" ).forEach( function ( elem ) { elem.value = token } );
25					var gglcptchTimeout = setTimeout( function(){
26						$( '.gglcptch_error_text' ).each( function(){
27							$( this ).show();
28							clearTimeout( gglcptchTimeout );
29						});
30					}, 180000 );
31				});
32			});
33		}
34
35		/*
36		 * display reCaptcha for others blocks
37		 * this part is neccessary because
38		 * we have disabled the connection to Google reCaptcha API from other plugins
39		 * via plugin`s php-functionality
40		 */
41		if ( 'v2' == gglcptch.options.version || 'invisible' == gglcptch.options.version ) {
42			$( '.g-recaptcha' ).each( function() {
43				/* reCAPTCHA will be generated into the empty block only */
44				if ( $( this ).html() === '' && $( this ).text() === '' ) {
45
46					/* get element`s ID */
47					var container = $( this ).attr( 'id' );
48
49					if ( typeof container == 'undefined' ) {
50						container = get_id();
51						$( this ).attr( 'id', container );
52					}
53
54					/* get reCapatcha parameters */
55					var sitekey  = $( this ).attr( 'data-sitekey' ),
56						theme    = $( this ).attr( 'data-theme' ),
57						lang     = $( this ).attr( 'data-lang' ),
58						size     = $( this ).attr( 'data-size' ),
59						type     = $( this ).attr( 'data-type' ),
60						tabindex = $( this ).attr( 'data-tabindex' ),
61						callback = $( this ).attr( 'data-callback' ),
62						ex_call  = $( this ).attr( 'data-expired-callback' ),
63						stoken   = $( this ).attr( 'data-stoken' ),
64						params   = [];
65
66					params['sitekey'] = sitekey ? sitekey : gglcptch.options.sitekey;
67					if ( !! theme ) {
68						params['theme'] = theme;
69					}
70					if ( !! lang ) {
71						params['lang'] = lang;
72					}
73					if ( !! size ) {
74						params['size'] = size;
75					}
76					if ( !! type ) {
77						params['type'] = type;
78					}
79					if ( !! tabindex ) {
80						params['tabindex'] = tabindex;
81					}
82					if ( !! callback ) {
83						params['callback'] = callback;
84					}
85					if ( !! ex_call ) {
86						params['expired-callback'] = ex_call;
87					}
88					if ( !! stoken ) {
89						params['stoken'] = stoken;
90					}
91
92					gglcptch.display( container, params );
93				}
94			} );
95
96			/*
97			 * count the number of reCAPTCHA blocks in the form
98			 */
99			$( 'form' ).each( function() {
100				if ( $( this ).contents().find( 'iframe[title="recaptcha widget"]' ).length > 1 && ! $( this ).children( '.gglcptch_dublicate_error' ).length ) {
101					$( this ).prepend( '<div class="gglcptch_dublicate_error error" style="color: red;">' + gglcptch.options.error + '</div><br />\n' );
102				}
103			} );
104		}
105	};
106
107	gglcptch.display = function( container, params ) {
108		if ( typeof( container ) == 'undefined' || container == '' || typeof( gglcptch.options ) == 'undefined' ) {
109			return;
110		}
111
112		// add attribute disable to the submit
113		if ( 'v2' === gglcptch.options.version && gglcptch.options.disable ) {
114			$( '#' + container ).closest( 'form' ).find( 'input:submit, button' ).prop( 'disabled', true );
115			if ( 'setupform' === $( '#' + container ).closest( 'form' ).attr( 'id' ) ) {
116				setTimeout(
117					function(){
118						$( '#' + container ).closest( 'form' ).find( 'input:submit, button' ).prop( 'disabled', true );
119					},
120					200
121				);
122			}
123		}
124
125		function storeEvents( el ) {
126			var target = el,
127				events = $._data( el.get( 0 ), 'events' );
128			/* restoring events */
129			if ( typeof events != 'undefined' ) {
130				var storedEvents = {};
131				$.extend( true, storedEvents, events );
132				target.off();
133				target.data( 'storedEvents', storedEvents );
134			}
135			/* storing and removing onclick action */
136			if ( 'undefined' != typeof target.attr( 'onclick' ) ) {
137				target.attr( 'gglcptch-onclick', target.attr( 'onclick') );
138				target.removeAttr( 'onclick' );
139			}
140		}
141
142		function restoreEvents( el ) {
143			var target = el,
144				events = target.data( 'storedEvents' );
145			/* restoring events */
146			if ( typeof events != 'undefined' ) {
147				for ( var event in events ) {
148					for ( var i = 0; i < events[event].length; i++ ) {
149						target.on( event, events[event][i] );
150					}
151				}
152			}
153			/* reset stored events */
154			target.removeData( 'storedEvents' );
155			/* restoring onclick action */
156			if ( 'undefined' != typeof target.attr( 'gglcptch-onclick' ) ) {
157				target.attr( 'onclick', target.attr( 'gglcptch-onclick' ) );
158				target.removeAttr( 'gglcptch-onclick' );
159			}
160		}
161
162		function storeOnSubmit( form, gglcptch_index ) {
163			form.on( 'submit', function( e ) {
164				if ( '' == form.find( '.g-recaptcha-response' ).val() ) {
165					e.preventDefault();
166					e.stopImmediatePropagation();
167					targetObject = $( e.target || e.srcElement || e.targetObject );
168					targetEvent = e.type;
169					grecaptcha.execute( gglcptch_index );
170				}
171			} ).find( 'input:submit, button' ).on( 'click', function( e ) {
172				if ( '' == form.find( '.g-recaptcha-response' ).val() ) {
173					e.preventDefault();
174					e.stopImmediatePropagation();
175					targetObject = $( e.target || e.srcElement || e.targetObject );
176					targetEvent = e.type;
177					grecaptcha.execute( gglcptch_index );
178				}
179			} );
180		}
181
182		var gglcptch_version = gglcptch.options.version;
183		
184		if ( 'v2' == gglcptch_version ) {
185			if ( $( '#' + container ).parent().width() <= 300 && $( '#' + container ).parent().width() != 0 || $( window ).width() < 400 ) {
186				var size = 'compact';
187			} else {
188				var size = 'normal';
189			}
190			var parameters = params ? params : { 'sitekey' : gglcptch.options.sitekey, 'theme' : gglcptch.options.theme, 'size' : size },
191				block = $( '#' + container ),
192				form = block.closest( 'form' );
193
194				/* Callback function works only in frontend */
195				if ( ! $( 'body' ).hasClass( 'wp-admin' ) ) {
196					parameters['callback'] = function() {
197						form.find( 'button, input:submit' ).prop( 'disabled', false );
198					};
199				}
200
201			var gglcptch_index = grecaptcha.render( container, parameters );
202			$( '#' + container ).data( 'gglcptch_index', gglcptch_index );
203		} else if ( 'invisible' == gglcptch_version ) {
204			var block = $( '#' + container ),
205				form = block.closest( 'form' ),
206				parameters = params ? params : { 'sitekey' : gglcptch.options.sitekey, 'size' : 'invisible', 'tabindex' : 9999 },
207				targetObject = false,
208				targetEvent = false;
209
210			if ( form.length ) {
211				storeEvents( form );
212				form.find( 'button, input:submit' ).each( function() {
213					storeEvents( $( this ) );
214				} );
215
216				/* Callback function works only in frontend */
217				if ( ! $( 'body' ).hasClass( 'wp-admin' ) ) {
218					parameters['callback'] = function( token ) {
219						form.off();
220						restoreEvents( form );
221						form.find( 'button, input:submit' ).off().each( function() {
222							restoreEvents( $( this ) );
223						} );
224						if ( targetObject && targetEvent ) {
225							targetObject.trigger( targetEvent );
226						}
227						form.find( 'button, input:submit' ).each( function() {
228							storeEvents( $( this ) );
229						} );
230						storeEvents( form );
231						storeOnSubmit( form, gglcptch_index );
232						grecaptcha.reset( gglcptch_index );
233					};
234				}
235
236				var gglcptch_index = grecaptcha.render( container, parameters );
237				block.data( { 'gglcptch_index' : gglcptch_index } );
238
239				if ( ! $( 'body' ).hasClass( 'wp-admin' ) ) {
240					storeOnSubmit( form, gglcptch_index );
241				}
242			}
243		}
244	};
245
246	$( document ).ready( function() {
247		var tryCounter = 0,
248			/* launching timer so that the function keeps trying to display the reCAPTCHA again and again until google js api is loaded */
249			gglcptch_timer = setInterval( function() {
250				if ( typeof Recaptcha != "undefined" || typeof grecaptcha != "undefined" ) {
251					try {
252						gglcptch.prepare();
253					} catch ( e ) {
254						console.log( 'Unexpected error occurred: ', e );
255					}
256					clearInterval( gglcptch_timer );
257				}
258				tryCounter++;
259				/* Stop trying after 10 times */
260				if ( tryCounter >= 10 ) {
261					clearInterval( gglcptch_timer );
262				}
263			}, 1000 );
264
265		function gglcptch_prepare() {
266			if ( typeof Recaptcha != "undefined" || typeof grecaptcha != "undefined" ) {
267				try {
268					gglcptch.prepare();
269				} catch ( err ) {
270					console.log( err );
271				}
272			}
273		}
274
275		$( window ).on( 'load', gglcptch_prepare );
276
277		$( '.woocommerce' ).on( 'click', '.woocommerce-tabs', gglcptch_prepare );
278
279		$( '#recaptcha_widget_div' ).on( 'input paste change', '#recaptcha_response_field', cleanError );
280	} );
281
282	function cleanError() {
283		$error = $( this ).parents( '#recaptcha_widget_div' ).next( '#gglcptch_error' );
284		if ( $error.length ) {
285			$error.remove();
286		}
287	}
288
289	function get_id() {
290		var id = 'gglcptch_recaptcha_' + Math.floor( Math.random() * 1000 );
291		if ( $( '#' + id ).length ) {
292			id = get_id();
293		} else {
294			return id;
295		}
296	}
297
298} )( jQuery, gglcptch );

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.