PageSourceSearch

https://mrgamification.com/wp-content/plugins/gamipress/assets/js/gamipress.js?ver=8.0.4

js mrgamification.com collected 2026-09-25 11:20:13 UTC 22,623 bytes, 677 lines download raw bytes

1( function( $ ) {
2
3	var $body = $( 'body' );
4
5    /**
6     * Achievement list ajax call
7     *
8     * @since 	1.0.0
9	 * @updated 1.7.9 Added nonce usage
10     */
11	function gamipress_ajax_achievement_list( achievement_list ) {
12
13        // Show the spinner
14		achievement_list.find( '#gamipress-achievements-spinner' ).show();
15
16		var data = {
17			action: 'gamipress_get_achievements',
18			nonce: gamipress.nonce,
19
20			// Achievements atts
21			type: achievement_list.find('input[type="hidden"][name="type"]').val(),
22			limit: achievement_list.find('input[type="hidden"][name="limit"]').val(),
23			current_user: achievement_list.find('input[type="hidden"][name="current_user"]').val(),
24			user_id: achievement_list.find('input[type="hidden"][name="user_id"]').val(),
25			wpms: achievement_list.find('input[type="hidden"][name="wpms"]').val(),
26			offset: achievement_list.find( '#gamipress-achievements-offset' ).val(),
27			count: achievement_list.find( '#gamipress-achievements-count' ).val(),
28			filter: ( ( achievement_list.find( '#achievements_list_filter').length ) ? achievement_list.find('#achievements_list_filter').val() : '' ),
29			search: achievement_list.find('#gamipress-achievements-search-input').val(),
30			orderby: achievement_list.find('input[type="hidden"][name="orderby"]').val(),
31			order: achievement_list.find('input[type="hidden"][name="order"]').val(),
32			include: achievement_list.find('input[type="hidden"][name="include"]').val(),
33			exclude: achievement_list.find('input[type="hidden"][name="exclude"]').val(),
34			showed_ids: []
35		};
36
37		// Single achievement atts
38		for( var i = 0; i < gamipress.achievement_fields.length; i++ ) {
39			var achievement_field = gamipress.achievement_fields[i];
40
41			data[achievement_field] = achievement_list.find('input[type="hidden"][name="' + achievement_field + '"]').val()
42		}
43
44		achievement_list.find('.gamipress-achievement').each(function() {
45			var achievement_id = $(this).attr('id').replace('gamipress-achievement-', '');
46
47			data.showed_ids.push( achievement_id );
48		});
49
50        /**
51         * Allow external functions to add their own data to the array
52         *
53         * @since 1.5.9
54         *
55         * @selector    .gamipress-achievements-list
56         * @event       gamipress_achievements_list_data
57		 *
58		 * @param Object data
59         */
60        achievement_list.trigger( 'gamipress_achievements_list_request_data', [ data ] );
61
62		$.ajax( {
63			url: gamipress.ajaxurl,
64			data: data,
65			dataType: 'json',
66			success: function( response ) {
67
68                // Hide the spinner
69				achievement_list.find( '#gamipress-achievements-spinner' ).hide();
70
71				if ( response.data.achievements !== null ) {
72
73					achievement_list.find( '#gamipress-achievements-container' ).append( response.data.achievements );
74					achievement_list.find( '#gamipress-achievements-offset' ).val( response.data.offset );
75					achievement_list.find( '#gamipress-achievements-count' ).val( response.data.achievement_count );
76
77					// Just continue if load more has been enabled
78					if( achievement_list.find( '#gamipress-achievements-load-more').length ) {
79
80						if ( response.data.query_count <= response.data.offset ) {
81
82							// Hide load more button
83							achievement_list.find( '#gamipress-achievements-load-more' ).hide();
84
85						} else {
86
87							// Show load more button
88							achievement_list.find( '#gamipress-achievements-load-more' ).show();
89
90						}
91
92					}
93
94				}
95
96                /**
97                 * Allow external functions to add their own functionality
98                 *
99                 * @since 1.5.9
100                 *
101                 * @selector    .gamipress-achievements-list
102                 * @event       gamipress_achievements_list_data
103                 *
104                 * @param Object response
105                 */
106                achievement_list.trigger( 'gamipress_achievements_list_request_success', [ response ] );
107			}
108		} );
109	}
110
111    /**
112     * Reset achievements query vars and run an ajax call
113     *
114     * @since 1.0.0
115     */
116	function gamipress_ajax_achievement_list_reset( achievement_list ) {
117		achievement_list.find( '#gamipress-achievements-offset' ).val( 0 );
118		achievement_list.find( '#gamipress-achievements-count' ).val( 0 );
119
120		achievement_list.find( '#gamipress-achievements-container' ).html( '' );
121		achievement_list.find( '#gamipress-achievements-load-more' ).hide();
122
123		gamipress_ajax_achievement_list( achievement_list );
124	}
125
126    /**
127     * Perform an achievements ajax call on change the select filter
128     *
129     * @since 1.0.0
130     */
131    $body.on( 'change', '#achievements_list_filter', function() {
132		gamipress_ajax_achievement_list_reset( $(this).closest('.gamipress-achievements-list') );
133	} );
134
135    /**
136     * Perform an achievements ajax call on submit the search form
137     *
138     * @since 1.0.0
139     */
140    $body.on( 'submit', '#gamipress-achievements-search-form', function( event ) {
141		event.preventDefault();
142
143		gamipress_ajax_achievement_list_reset( $(this).closest('.gamipress-achievements-list') );
144
145		// Disable submit button on submit a search
146		$(this).find('#gamipress-achievements-search-submit').prop('disabled', true);
147	});
148
149    /**
150     * Enable the achievements search button when search input gets the focus
151     *
152     * @since 1.0.0
153     */
154    $body.on( 'focus', '#gamipress-achievements-search-input', function (e) {
155		$(this).closest('.gamipress-achievements-list').find('#gamipress-achievements-search-submit').prop('disabled', false);
156	} );
157
158    /**
159     * Achievements load more button
160     *
161     * @since 1.0.0
162     */
163    $body.on( 'click', '#gamipress-achievements-load-more', function() {
164		gamipress_ajax_achievement_list( $(this).closest('.gamipress-achievements-list') );
165	} );
166
167    /**
168     * Show/hide details link
169     *
170     * @since 1.0.0
171     */
172    $body.on( 'click', '.gamipress-open-close-switch a', function( event ) {
173		event.preventDefault();
174
175		var link = $( this );
176
177		if ( 'close' === link.data( 'action' ) ) {
178			link.parent().siblings( '.gamipress-extras-window' ).slideUp( 300 );
179			link.data( 'action', 'open' ).prop( 'class', 'show-hide-open' ).text( link.data('open-text') );
180		} else {
181			link.parent().siblings( '.gamipress-extras-window' ).slideDown( 300 );
182			link.data( 'action', 'close' ).prop( 'class', 'show-hide-close' ).text( link.data('close-text') );
183		}
184	} );
185
186	/**
187	 * Unlock achievement with points
188	 *
189	 * @since 	1.7.8.1
190	 * @updated 1.7.9 Added nonce usage
191	 */
192    function gamipress_unlock_achievement_with_points( submit_wrap ) {
193
194		var button = submit_wrap.find('.gamipress-achievement-unlock-with-points-button');
195		var spinner = submit_wrap.find('.gamipress-spinner');
196		var achievement_id = submit_wrap.data('id');
197		var confirmation = submit_wrap.find('.gamipress-achievement-unlock-with-points-confirmation');
198
199		// Show the spinner
200		spinner.show();
201
202		/**
203		 * Allow external functions to process anything before unlock achievement with points
204		 *
205		 * @since 1.7.7
206		 *
207		 * @selector    .gamipress-achievement-unlock-with-points-button
208		 * @event       gamipress_before_unlock_achievement_with_points
209		 */
210		submit_wrap.trigger( 'gamipress_before_unlock_achievement_with_points', [] );
211
212		$.ajax( {
213			url: gamipress.ajaxurl,
214			method: 'POST',
215			dataType: 'json',
216			data: {
217				action: 'gamipress_unlock_achievement_with_points',
218				nonce: gamipress.nonce,
219				achievement_id: achievement_id
220			},
221			success: function( response ) {
222
223				// Ensure response wrap
224				if( submit_wrap.find('.gamipress-achievement-unlock-with-points-response').length === 0 )
225					submit_wrap.append('<div class="gamipress-achievement-unlock-with-points-response gamipress-notice" style="display: none;"></div>');
226
227				var response_wrap = submit_wrap.find('.gamipress-achievement-unlock-with-points-response');
228
229				// Add class gamipress-notice-success on successful unlock, if not will add the class gamipress-notice-error
230				response_wrap.addClass( 'gamipress-notice-' + ( response.success === true ? 'success' : 'error' ) );
231
232				// Update and show response messages
233				response_wrap.html( response.data );
234				response_wrap.slideDown();
235
236				// Hide the spinner
237				spinner.hide();
238
239				if( response.success === true ) {
240
241					// Hide confirmation
242					if( confirmation.length )
243						confirmation.slideUp();
244
245					// Hide the button
246					button.slideUp();
247
248					// Add the class earned to the achievement
249					// Single template
250					button.closest('.single-achievement').addClass('user-has-earned');
251					button.closest('.user-has-not-earned[class*="post"]').removeClass('user-has-not-earned').addClass('user-has-earned');
252
253					// Shortcode/Widget template
254					button.closest('.gamipress-achievement.user-has-not-earned').removeClass('user-has-not-earned').addClass('user-has-earned');
255				} else {
256
257					if( confirmation.length ) {
258						// Hide confirmation and enable confirm/cancel buttons
259						confirmation.slideUp();
260						submit_wrap.find('.gamipress-achievement-unlock-with-points-confirm-button').prop( 'disabled', false );
261						submit_wrap.find('.gamipress-achievement-unlock-with-points-cancel-button').prop( 'disabled', false );
262					}
263
264					// Enable the button
265					button.prop( 'disabled', false );
266				}
267
268				/**
269				 * Allow external functions to process anything after unlock achievement with points
270				 *
271				 * @since 1.7.7
272				 *
273				 * @selector    .gamipress-achievement-unlock-with-points-button
274				 * @event       gamipress_after_unlock_achievement_with_points
275				 *
276				 * @param Object response	Response retrieved from server
277				 */
278				submit_wrap.trigger( 'gamipress_after_unlock_achievement_with_points', [ response ] );
279			}
280		});
281
282	}
283
284	/**
285	 * Unlock rank with points
286	 *
287	 * @since 	1.7.8.1
288	 * @updated 1.7.9 Added nonce usage
289	 */
290	function gamipress_unlock_rank_with_points( submit_wrap ) {
291
292		var button = submit_wrap.find('.gamipress-rank-unlock-with-points-button');
293		var spinner = submit_wrap.find('.gamipress-spinner');
294		var rank_id = submit_wrap.data('id');
295		var confirmation = submit_wrap.find('.gamipress-rank-unlock-with-points-confirmation');
296
297		// Show the spinner
298		spinner.show();
299
300		/**
301		 * Allow external functions to process anything before unlock rank with points
302		 *
303		 * @since 1.7.7
304		 *
305		 * @selector    .gamipress-rank-unlock-with-points-button
306		 * @event       gamipress_before_unlock_rank_with_points
307		 */
308		submit_wrap.trigger( 'gamipress_before_unlock_rank_with_points', [] );
309
310		$.ajax( {
311			url: gamipress.ajaxurl,
312			method: 'POST',
313			dataType: 'json',
314			data: {
315				action: 'gamipress_unlock_rank_with_points',
316				nonce: gamipress.nonce,
317				rank_id: rank_id
318			},
319			success: function( response ) {
320
321				// Ensure response wrap
322				if( submit_wrap.find('.gamipress-rank-unlock-with-points-response').length === 0 )
323					submit_wrap.append('<div class="gamipress-rank-unlock-with-points-response gamipress-notice" style="display: none;"></div>');
324
325				var response_wrap = submit_wrap.find('.gamipress-rank-unlock-with-points-response');
326
327				// Add class gamipress-notice-success on successful unlock, if not will add the class gamipress-notice-error
328				response_wrap.addClass( 'gamipress-notice-' + ( response.success === true ? 'success' : 'error' ) );
329
330				// Update and show response messages
331				response_wrap.html( response.data );
332				response_wrap.slideDown();
333
334				// Hide the spinner
335				spinner.hide();
336
337				if( response.success === true ) {
338
339					// Hide confirmation
340					if( confirmation.length )
341						confirmation.slideUp();
342
343					// Hide the button
344					button.slideUp();
345
346					// Add the class earned to the rank
347					// Single template
348					button.closest('.single-rank').addClass('user-has-earned');
349					button.closest('.user-has-not-earned[class*="post"]').removeClass('user-has-not-earned').addClass('user-has-earned');
350
351					// Shortcode/Widget template
352					button.closest('.gamipress-rank.user-has-not-earned').removeClass('user-has-not-earned').addClass('user-has-earned');
353				} else {
354
355					if( confirmation.length ) {
356						// Hide confirmation and enable confirm/cancel buttons
357						confirmation.slideUp();
358						submit_wrap.find('.gamipress-rank-unlock-with-points-confirm-button').prop( 'disabled', false );
359						submit_wrap.find('.gamipress-rank-unlock-with-points-cancel-button').prop( 'disabled', false );
360					}
361
362					// Enable the button
363					button.prop( 'disabled', false );
364				}
365
366				/**
367				 * Allow external functions to process anything after unlock rank with points
368				 *
369				 * @since 1.7.7
370				 *
371				 * @selector    .gamipress-rank-unlock-with-points-button
372				 * @event       gamipress_after_unlock_rank_with_points
373				 *
374				 * @param Object response	Response retrieved from server
375				 */
376				submit_wrap.trigger( 'gamipress_after_unlock_rank_with_points', [ response ] );
377			}
378		});
379
380	}
381
382	/**
383	 * Unlock achievement/rank with points button
384	 *
385	 * @since 1.3.7
386	 */
387	$body.on( 'click', '.gamipress-achievement-unlock-with-points-button, .gamipress-rank-unlock-with-points-button', function(e) {
388
389		var button = $(this);
390
391		var selector = ( button.hasClass('gamipress-achievement-unlock-with-points-button') ? 'achievement' : 'rank' );
392
393		var submit_wrap = button.closest('.gamipress-' + selector + '-unlock-with-points');
394		var confirmation = submit_wrap.find('.gamipress-' + selector + '-unlock-with-points-confirmation');
395
396		// Disable the button
397		button.prop( 'disabled', true );
398
399		// Hide previous notices
400		if( submit_wrap.find('.gamipress-' + selector + '-unlock-with-points-response').length )
401			submit_wrap.find('.gamipress-' + selector + '-unlock-with-points-response').slideUp();
402
403		// If has confirmation, show it and return
404		if( confirmation.length ) {
405			confirmation.slideDown();
406		} else {
407			// Perform the ajax request to unlock with points
408			if( selector === 'achievement' )
409				gamipress_unlock_achievement_with_points( submit_wrap );
410			else
411				gamipress_unlock_rank_with_points( submit_wrap );
412		}
413
414	});
415
416	/**
417	 * Unlock achievement/rank with points confirmation confirm button
418	 *
419	 * @since 1.7.8.1
420	 */
421	$body.on( 'click', '.gamipress-achievement-unlock-with-points-confirm-button, .gamipress-rank-unlock-with-points-confirm-button', function(e) {
422
423		var $this = $(this);
424		var selector = ( $this.hasClass('gamipress-achievement-unlock-with-points-confirm-button') ? 'achievement' : 'rank' );
425
426		var submit_wrap = $this.closest('.gamipress-' + selector + '-unlock-with-points');
427
428		// Disable the confirm button
429		$this.prop( 'disabled', true );
430		// Disable the cancel button
431		submit_wrap.find('.gamipress-' + selector + '-unlock-with-points-cancel-button').prop( 'disabled', true );
432
433		// Perform the ajax request to unlock with points
434		if( selector === 'achievement' )
435			gamipress_unlock_achievement_with_points( submit_wrap );
436		else
437			gamipress_unlock_rank_with_points( submit_wrap );
438
439	});
440
441	/**
442	 * Unlock achievement/rank with points confirmation cancel button
443	 *
444	 * @since 1.7.8.1
445	 */
446	$body.on( 'click', '.gamipress-achievement-unlock-with-points-cancel-button, .gamipress-rank-unlock-with-points-cancel-button', function(e) {
447
448		var $this = $(this);
449		var selector = ( $this.hasClass('gamipress-achievement-unlock-with-points-cancel-button') ? 'achievement' : 'rank' );
450
451		var submit_wrap = $this.closest('.gamipress-' + selector + '-unlock-with-points');
452		var button = submit_wrap.find('.gamipress-' + selector + '-unlock-with-points-button');
453		var confirmation = submit_wrap.find('.gamipress-' + selector + '-unlock-with-points-confirmation');
454
455		// Hide confirmation
456		confirmation.slideUp();
457
458		// Enable the button
459		button.prop( 'disabled', false );
460
461	});
462
463	/**
464	 * Share achievement/rank button
465	 *
466	 * @since 1.8.6
467	 */
468	$body.on( 'click', '.gamipress-share-button', function (e) {
469		e.preventDefault();
470
471		var wrapper = $(this).closest('.gamipress-share-buttons');
472		var network = $(this).data('network');
473
474		// URL templates
475		var templates = {
476			facebook: 'https://www.facebook.com/sharer.php?u={url}',
477			twitter: 'https://twitter.com/intent/tweet?text={text}%0A{url}',
478			linkedin: 'https://www.linkedin.com/shareArticle?mini=true&url={url}&title={title}&summary={text}&source={url}',
479			pinterest: 'https://www.pinterest.com/pin/create/button/?url={url}&media={image}',
480		};
481
482		// Default dimensions for the new window
483		var width = 640;
484		var height = 480;
485
486		if( templates[network] !== undefined ) {
487
488			var url = wrapper.data('url');
489			var title = wrapper.data('title');
490			var text = wrapper.data('twitter-text');
491			var image = wrapper.data('image');
492
493			// Replace the template (ensuring each element is correctly encoded)
494			var parsed_url = templates[network]
495				.replace( '{url}', encodeURIComponent( url ) )
496				.replace( '{title}', encodeURIComponent( title ) )
497				.replace( '{image}', encodeURIComponent( image ) )
498				.replace( '{text}', encodeURIComponent( text ) );
499
500			// Center the new window at center of the screen
501			var window_top = ( screen.height / 2 ) - ( height / 2 );
502			var window_left = ( screen.width / 2 ) - ( width / 2 );
503
504			var window_parameters = 'toolbar=0,status=0,width=' + width + ',height=' + height + ',top=' + window_top + ',left=' + window_left;
505
506			var share_window = window.open( parsed_url, network, window_parameters );
507
508			// Force focus to the new window
509			if( window.focus ) {
510				share_window.focus();
511			}
512
513		}
514
515	});
516
517    /**
518     * Logs ajax pagination
519     *
520     * @since 	1.4.9
521	 * @updated 1.7.9 Added nonce usage
522     */
523    $body.on( 'click', '#gamipress-logs-pagination a', function (e) {
524        e.preventDefault();
525
526        var $this = $(this);
527
528        if( $this.hasClass('current') ) {
529            return false;
530        }
531
532        var logs = $this.closest('.gamipress-logs');
533
534        // Regex to match wordpress permalink config (paged={d}|/page/{d})
535        var matches = $this.attr('href').match(/paged=(\d+)|\/page\/(\d+)/);
536        var page = ( matches[1] !== undefined ) ? matches[1] : matches[2];
537
538        var data = {
539            action: 'gamipress_get_logs',
540			nonce: gamipress.nonce,
541            page: page,
542        };
543
544        logs.find('.gamipress-logs-atts input').each(function() {
545            data[$(this).attr('name')] = $(this).val();
546        });
547
548        // Show the spinner
549        logs.find( '#gamipress-logs-spinner' ).show();
550
551        $.ajax( {
552            url: gamipress.ajaxurl,
553            data: data,
554            dataType: 'json',
555            success: function( response ) {
556
557                // Hide the spinner
558                logs.find( '#gamipress-logs-spinner' ).hide();
559
560                var parsed_content = $(response.data);
561
562                logs.find('.gamipress-logs-list').html( parsed_content.find('.gamipress-logs-list').html() );
563                logs.find('.gamipress-logs-pagination').html( parsed_content.find('.gamipress-logs-pagination').html() );
564
565            }
566        } );
567    });
568
569    /**
570     * Earnings ajax pagination
571     *
572     * @since 	1.4.9
573	 * @updated 1.7.9 Added nonce usage
574     */
575    $body.on( 'click', '#gamipress-earnings-pagination a', function (e) {
576        e.preventDefault();
577
578        var $this = $(this);
579
580        if( $this.hasClass('current') ) {
581            return false;
582        }
583
584        var earnings = $this.closest('.gamipress-earnings');
585
586        // Regex to match wordpress permalink config (paged={d}|/page/{d})
587        var matches = $this.attr('href').match(/paged=(\d+)|\/page\/(\d+)/);
588        var page = ( matches[1] !== undefined ) ? matches[1] : matches[2];
589
590        var data = {
591            action: 'gamipress_get_user_earnings',
592			nonce: gamipress.nonce,
593            page: page,
594        };
595
596        earnings.find('.gamipress-earnings-atts input').each(function() {
597            data[$(this).attr('name')] = $(this).val();
598        });
599
600        // Show the spinner
601        earnings.find( '#gamipress-earnings-spinner' ).show();
602
603        $.ajax( {
604            url: gamipress.ajaxurl,
605            data: data,
606            dataType: 'json',
607            success: function( response ) {
608
609                // Hide the spinner
610                earnings.find( '#gamipress-earnings-spinner' ).hide();
611
612                var parsed_content = $(response.data);
613
614                earnings.find('.gamipress-earnings-table').html( parsed_content.find('.gamipress-earnings-table').html() );
615                earnings.find('.gamipress-earnings-pagination').html( parsed_content.find('.gamipress-earnings-pagination').html() );
616
617            }
618        } );
619    });
620
621	/**
622	 * Email settings
623	 *
624	 * @since 	2.2.1
625	 */
626	$body.on( 'change', '.gamipress-email-settings input', function (e) {
627
628		var $this = $(this);
629		var form = $this.closest('.gamipress-email-settings');
630		var row = $this.closest('tr');
631		var loader = row.find('.gamipress-email-settings-loader');
632		var value = $this.val();
633		var name = $this.attr('name');
634		var setting = name.replace('gamipress_email_settings[', '').replace(']', '');
635
636		switch( setting ) {
637			case 'all':
638				form.find('input[value="' + value + '"]:not([name="' + name + '"])').prop('checked', true);
639				break;
640			case 'points_types':
641			case 'achievement_types':
642			case 'rank_types':
643				form.find('input[value="' + value + '"][name^="gamipress_email_settings[' + setting + '_"]').prop('checked', true);
644				break;
645		}
646
647		// Show the "Saving..." text
648		loader.find('.gamipress-email-settings-saving').show();
649		loader.find('.gamipress-email-settings-saved').hide();
650		loader.show();
651
652		$.ajax( {
653			url: gamipress.ajaxurl,
654			data: {
655				action: 'gamipress_save_email_settings',
656				nonce: gamipress.nonce,
657				setting: setting,
658				value: value,
659			},
660			dataType: 'json',
661			success: function( response ) {
662
663				// Show the "Saved!" text
664				loader.find('.gamipress-email-settings-saving').hide();
665				loader.find('.gamipress-email-settings-saved').show();
666				loader.show();
667
668				setTimeout( function() {
669					loader.hide();
670				}, 2000 );
671
672			}
673		} );
674
675	});
676
677} )( jQuery );

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.