PluginProbe
LoginPress | wp-login Custom Login Page Customizer / trunk
LoginPress | wp-login Custom Login Page Customizer vtrunk
6.2.5 6.2.4 6.2.3 6.2.2 6.2.1 trunk 1.0.0 1.0.1 1.0.10 1.0.11 1.0.12 1.0.13 1.0.14 1.0.15 1.0.16 1.0.17 1.0.18 1.0.19 1.0.2 1.0.20 1.0.21 1.0.22 1.0.23 1.0.3 1.0.4 All 118 releases
loginpress / js / admin-custom.js

admin-custom.js in LoginPress | wp-login Custom Login Page Customizer trunk, at js/admin-custom.js

776 lines 23.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 (function ($) {
2 'use strict';
3 $(window).on('load resize', function() {
4 $('.toplevel_page_loginpress-settings #wpcontent').css('--container-offset', 0+'px');
5 $('.toplevel_page_loginpress-settings #wpcontent').css('--container-height', 0+'px');
6 setTimeout(function() {
7 if($('.toplevel_page_loginpress-settings #wpcontent .loginpress-main-wrapper').length > 0 && $('.toplevel_page_loginpress-settings #wpcontent').length > 0) {
8 $('.toplevel_page_loginpress-settings #wpcontent').css('--container-offset', $('.toplevel_page_loginpress-settings #wpcontent .loginpress-main-wrapper').offset().top+'px');
9 }
10 $('.toplevel_page_loginpress-settings #wpcontent').css('--container-height', $('.toplevel_page_loginpress-settings #wpcontent').height()+'px');
11 }, 50);
12 });
13 $(
14 function () {
15
16 /**
17 * Install LoginPress Add-Ons on one click.
18 *
19 * @since 1.2.2
20 */
21 $( document ).on(
22 'click',
23 '.loginpress-install-pro-addon',
24 function (e) {
25
26 e.preventDefault();
27 e.stopPropagation();
28 var addonBtn = $( this );
29 var addonWrapper = $( this ).closest( '.loginpress-extension' );
30 var nonce = addonWrapper.find( 'input[name="loginpress_pro_addon_nonce"]' ).val();
31 var pluginSlug = addonWrapper.find( 'input[name="loginpress_pro_addon_slug"]' ).val();
32 var pluginID = addonWrapper.find( 'input[name="loginpress_pro_addon_id"]' ).val();
33
34 $.ajax(
35 {
36 type: 'GET',
37 url : 'update.php',
38 data: {
39 action : 'install-plugin',
40 plugin : pluginSlug,
41 lgp : 1,
42 id : pluginID,
43 _wpnonce: nonce
44 },
45 beforeSend: function () {
46 addonWrapper.find( '.loginpress-addon-enable' ).show();
47 },
48 success: function () {
49 activateAddon( pluginSlug, nonce, addonWrapper, addonBtn );
50 },
51 error : function () {
52 // console.log(res);
53 addonWrapper.find( '.loginpress-uninstalling' ).hide();
54 addonWrapper.find( '.loginpress-uninstall' ).hide();
55 addonWrapper.find( '.loginpress-addon-enable' ).hide();
56 addonWrapper.find( '.loginpress-wrong' ).show();
57 setTimeout(
58 function () {
59 addonWrapper.find( '.loginpress-wrong' ).hide();
60 },
61 2000
62 );
63 }
64 }
65 );
66
67 }
68 );
69
70 /**
71 * Deactivate LoginPress Add-Ons on one click.
72 *
73 * @since 1.2.2
74 */
75 $( document ).on(
76 'click',
77 '.loginpress-uninstall-pro-addon',
78 function (e) {
79
80 e.preventDefault();
81 e.stopPropagation();
82 var addonBtn = $( this );
83 var addonWrapper = $( this ).closest( '.loginpress-extension' );
84 var nonce = addonWrapper.find( 'input[name="loginpress_pro_addon_nonce"]' ).val();
85 var pluginSlug = addonWrapper.find( 'input[name="loginpress_pro_addon_slug"]' ).val();
86
87 $.ajax(
88 {
89 type: 'POST',
90 url : ajaxurl,
91 data: {
92 action : 'loginpress_deactivate_addon',
93 slug : pluginSlug,
94 _wpnonce: nonce
95 },
96 beforeSend: function () {
97 addonWrapper.find( '.loginpress-uninstalling' ).show();
98 },
99 success: function (res) {
100 var newNonce = res;
101
102 addonWrapper.find( 'input[name="loginpress_pro_addon_nonce"]' ).val( newNonce );
103 addonWrapper.find( '.loginpress-uninstalling' ).hide();
104 addonWrapper.find( '.loginpress-uninstall' ).show();
105 addonBtn.addClass( 'button button-primary' ).removeClass( 'loginpress-install-pro-addon' ).html( 'Activate' );
106 addonBtn.removeClass( 'loginpress-uninstall-pro-addon' ).addClass( 'loginpress-active-pro-addon' );
107 setTimeout(
108 function () {
109 addonWrapper.find( '.loginpress-uninstall' ).hide();
110 },
111 3000
112 );
113 },
114 error: function () {
115 // console.log(res);
116 addonWrapper.find( '.loginpress-uninstalling' ).hide();
117 addonWrapper.find( '.loginpress-uninstall' ).hide();
118 addonWrapper.find( '.loginpress-wrong' ).show();
119 setTimeout(
120 function () {
121 addonWrapper.find( '.loginpress-wrong' ).hide();
122 },
123 2000
124 );
125 }
126 }
127 );
128
129 }
130 );
131
132 /**
133 * Activate LoginPress Add-Ons on one click.
134 *
135 * @since 1.2.2
136 */
137 $( document ).on(
138 'click',
139 '.loginpress-active-pro-addon',
140 function (e) {
141
142 e.preventDefault();
143 e.stopPropagation();
144 var addonBtn = $( this );
145 var addonWrapper = $( this ).closest( '.loginpress-extension' );
146 var nonce = addonWrapper.find( 'input[name="loginpress_pro_addon_nonce"]' ).val();
147 var pluginSlug = addonWrapper.find( 'input[name="loginpress_pro_addon_slug"]' ).val();
148
149 activateAddon( pluginSlug, nonce, addonWrapper, addonBtn );
150
151 }
152 );
153
154 /**
155 * Activate LoginPress Add-Ons.
156 *
157 * @param string pluginSlug
158 * @param string nonce
159 * @param string addonWrapper
160 * @param string addonBtn
161 * @since 1.2.2
162 */
163 function activateAddon( pluginSlug, nonce, addonWrapper, addonBtn ) {
164
165 $.ajax(
166 {
167 url : ajaxurl,
168 type: 'POST',
169 data: {
170 slug : pluginSlug,
171 action: 'loginpress_activate_addon',
172 _wpnonce: nonce
173 },
174 beforeSend: function () {
175 addonWrapper.find( '.loginpress-addon-enable' ).show();
176 },
177 success: function (res) {
178 var newNonce = res;
179
180 addonWrapper.find( '.loginpress-addon-enable' ).hide();
181 addonWrapper.find( '.loginpress-install' ).show();
182 addonBtn.addClass( 'button button-secondary' ).removeClass( 'loginpress-install-pro-addon loginpress-active-pro-addon' ).html( 'Deactivate' );
183 addonBtn.removeClass( 'loginpress-active-pro-addon' ).addClass( 'loginpress-uninstall-pro-addon' );
184 addonWrapper.find( 'input[name="loginpress_pro_addon_nonce"]' ).val( newNonce );
185
186 setTimeout(
187 function () {
188 addonWrapper.find( '.loginpress-install' ).hide();
189 },
190 3000
191 );
192 },
193 error : function () {
194 // console.log('Ajax Not Working');
195 addonWrapper.find( '.loginpress-uninstalling' ).hide();
196 addonWrapper.find( '.loginpress-uninstall' ).hide();
197 addonWrapper.find( '.loginpress-wrong' ).show();
198 setTimeout(
199 function () {
200 addonWrapper.find( '.loginpress-wrong' ).hide();
201 },
202 2000
203 );
204 }
205 }
206 );
207
208 }
209
210 // Code to fire when the DOM is ready. 3.0.0
211 $( '.wpbrigade-video-link' ).on(
212 'click',
213 function (e) {
214 e.preventDefault();
215 var target = $( this ).data( 'video-id' );
216 $( '#' + target ).fadeIn();
217 }
218 );
219 $( '.wpbrigade-close-popup' ).on(
220 'click',
221 function () {
222 $( this ).parent().parent().fadeOut();
223 $( '.wpbrigade-video-wrapper iframe' ).attr( 'src', 'https://www.youtube.com/embed/GMAwsHomJlE' );
224 }
225 );
226
227 // Code for Video Popup
228 var videoBtn = document.querySelectorAll( '.video a' );
229 for (var i = 0; i < videoBtn.length; i++) {
230 videoBtn[i].addEventListener(
231 'click',
232 function (e) {
233 e.preventDefault();
234 var getLink = this.getAttribute( 'href' );
235 document.querySelector( '#loginpress-video' ).setAttribute( 'src', getLink.replace( 'watch?v=', 'embed/' ) + '?autoplay=1' );
236 document.querySelector( 'html' ).classList.add( 'loginpress-video-play' );
237 }
238 );
239 }
240
241 function closePop() {
242 document.querySelector( '#loginpress-video' ).setAttribute( 'src', '' );
243 document.querySelector( 'html' ).classList.remove( 'loginpress-video-play' );
244 }
245 if (document.querySelector( '.loginpress-cross' )) {
246 document.querySelector( '.loginpress-cross' ).addEventListener(
247 'click',
248 function () {
249 closePop();
250 }
251 );
252 document.querySelector( '.loginpress-video-overlay' ).addEventListener(
253 'click',
254 function () {
255 closePop();
256 }
257 );
258 }
259
260 // $("#wpb-loginpress_setting\\[enable_recaptcha_promo\\]").on('click', function() {
261 //
262 // var promotion = $('#wpb-loginpress_setting\\[enable_recaptcha_promo\\]');
263 // if ( promotion.is(":checked") ) {
264 // $('tr.recaptcha-promo-img').show();
265 // } else {
266 // $('tr.recaptcha-promo-img').hide();
267 // }
268 // }); // on click promo checkbox.
269
270 // Remove Disabled attribute from Import Button.
271 $( '#loginPressImport' ).on(
272 'change',
273 function (event) {
274
275 event.preventDefault();
276 var loginpressFileImp = $( '#loginPressImport' ).val();
277 $( this ).prev( 'span' ).html( loginpressFileImp.split( '\\' ).pop() );
278 var loginpressFileExt = loginpressFileImp.substr(
279 loginpressFileImp.lastIndexOf( '.' ) + 1
280 );
281
282 $( '.loginpress-import' ).attr( "disabled", "disabled" );
283
284 if ( 'json' == loginpressFileExt && loginpressFileImp.split( /(\\|\/)/g ).pop().substring( 0, 10 ) === 'loginpress' ) {
285 $( ".import_setting .wrong-import" ).html( "" );
286 $( '.loginpress-import' ).removeAttr( "disabled" );
287 } else {
288 $( ".import_setting .wrong-import" ).html( "Choose LoginPress settings file only." );
289 }
290 }
291 );
292
293 $( "#wpb-loginpress_setting\\[enable_privacy_policy\\]" ).on(
294 'click',
295 function () {
296
297 var privacy_editor = $( '#wpb-loginpress_setting\\[enable_privacy_policy\\]' );
298 if (privacy_editor.is( ":checked" )) {
299 $( 'tr.privacy_policy' ).show();
300 } else {
301 $( 'tr.privacy_policy' ).hide();
302 }
303 }
304 ); // on click promo checkbox.
305
306 /**
307 * On load of LoginPress settings or Click on Force Rest Password show or hide section
308 *
309 * @since 3.0.0
310 */
311 function loginPressForceChangePasswordSettings() {
312
313 if ( $( '#wpb-loginpress_setting\\[enable_password_reset\\]' ).is( ":checked" ) ) {
314 $( 'tr.roles_for_password_reset' ).show();
315 $( 'tr.loginpress_password_reset_time_limit' ).show();
316
317 } else {
318 $( 'tr.roles_for_password_reset' ).hide();
319 $( 'tr.loginpress_password_reset_time_limit' ).hide();
320 }
321 }
322 $( "#wpb-loginpress_setting\\[enable_password_reset\\]" ).on(
323 'click',
324 function () {
325 loginPressForceChangePasswordSettings();
326 }
327 );
328
329 /**
330 * Show and hide password strength sub-fields.
331 *
332 * @since 4.0.0
333 */
334 function LoginpressPasswordStrengthSettings() {
335 if ( $( '#wpb-loginpress_setting\\[enable_pass_strength\\]' ).is( ":checked" ) ) {
336 $( 'tr.minimum_pass_char' ).show();
337 $( 'tr.pass_strength' ).show();
338 $( 'tr.password_strength_meter' ).show();
339 $( 'tr.enable_pass_strength_forms' ).show();
340 } else {
341 $( 'tr.minimum_pass_char' ).hide();
342 $( 'tr.pass_strength' ).hide();
343 $( 'tr.password_strength_meter' ).hide();
344 $( 'tr.enable_pass_strength_forms' ).hide();
345 }
346 }
347
348 /**
349 * This function is used to show/hide the password strength settings section and
350 * all of its sub fields based on the enable registration password field setting.
351 *
352 * @since 4.0.0
353 */
354 function LoginpressEnablePasswordStregth() {
355
356 if ( $( '#wpb-loginpress_setting\\[enable_reg_pass_field\\]' ).is( ":checked" ) ) {
357 $( 'tr.enable_pass_strength' ).show();
358
359 $( "#wpb-loginpress_setting\\[enable_pass_strength\\]" ).on(
360 'click',
361 function () {
362 LoginpressPasswordStrengthSettings();
363 }
364 );
365 LoginpressPasswordStrengthSettings();
366
367 } else {
368 $( 'tr.enable_pass_strength' ).hide();
369 $( 'tr.minimum_pass_char' ).hide();
370 $( 'tr.pass_strength' ).hide();
371 $( 'tr.password_strength_meter' ).hide();
372 $( 'tr.enable_pass_strength_forms' ).hide();
373 }
374
375 }
376 $( "#wpb-loginpress_setting\\[enable_reg_pass_field\\]" ).on(
377 'click',
378 function () {
379 LoginpressEnablePasswordStregth();
380 }
381 );
382
383 $( window ).on(
384 'load',
385 function () {
386
387 $( '#loginpress_login_redirect_roles th.loginpress_user_id' ).text( loginpress_script.localize_translations[0] );
388
389 $( '<tr class="recaptcha-promo-img"><th class="recaptcha-promo" colspan="2"><img src="' + loginpress_script.plugin_url + '/loginpress/img/promo/recaptcha_promo.png"><a class="recaptcha-promo-link" href="https://loginpress.pro/pricing/?utm_source=loginpress-lite&amp;utm_medium=recaptcha-settings&amp;utm_campaign=pro-upgrade" target="_blank"><span>Unlock Premium Feature</span></a></th></tr>' ).insertAfter( $( ".enable_recaptcha_promo" ).closest( 'tr' ) );
390
391 var promotion = $( '#wpb-loginpress_setting\\[enable_recaptcha_promo\\]' );
392 if (promotion.is( ":checked" )) {
393 $( 'tr.recaptcha-promo-img' ).show();
394 }
395
396 var privacy_editor = $( '#wpb-loginpress_setting\\[enable_privacy_policy\\]' );
397 if (privacy_editor.is( ":checked" )) {
398 $( 'tr.privacy_policy' ).show();
399 }
400
401 loginPressForceChangePasswordSettings();
402 LoginpressEnablePasswordStregth();
403
404 }
405 ); // Window on load.
406
407 $( '.loginpress-log-file' ).on(
408 'click',
409 function (event) {
410
411 event.preventDefault();
412
413 $.ajax(
414 {
415
416 url: ajaxurl,
417 type: 'POST',
418 data: {
419 action: 'loginpress_help',
420 security: loginpress_script.help_nonce,
421 },
422 beforeSend: function () {
423 $( ".log-file-sniper" ).show();
424 },
425 success: function (response) {
426
427 $( ".log-file-sniper" ).hide();
428 $( ".log-file-text" ).show();
429
430 // Generate timestamp for filename
431 var now = new Date();
432 var year = now.getFullYear();
433 var month = String(now.getMonth() + 1).padStart(2, '0');
434 var day = String(now.getDate()).padStart(2, '0');
435 var hours = String(now.getHours()).padStart(2, '0');
436 var minutes = String(now.getMinutes()).padStart(2, '0');
437 var seconds = String(now.getSeconds()).padStart(2, '0');
438 var timestamp = year + '-' + month + '-' + day + '_' + hours + '-' + minutes + '-' + seconds;
439 var filename = 'loginpress-log-' + timestamp + '.txt';
440
441 if ( ! window.navigator.msSaveOrOpenBlob) { // If msSaveOrOpenBlob() is supported, then so is msSaveBlob().
442 $(
443 "<a />",
444 {
445 "download": filename,
446 "href": "data:text/plain;charset=utf-8," +
447 encodeURIComponent( response ),
448 }
449 ).appendTo( "body" )
450 .click(
451 function () {
452 $( this ).remove()
453 }
454 )[0].click()
455 } else {
456 var blobObject = new Blob( [response] );
457 window.navigator.msSaveBlob(
458 blobObject,
459 filename
460 );
461 }
462 setTimeout(
463 function () {
464 $( ".log-file-text" ).fadeOut()
465 },
466 3000
467 );
468 }
469 }
470 );
471
472 }
473 );
474
475 $( '.loginpress-export' ).on(
476 'click',
477 function (event) {
478
479 event.preventDefault();
480
481 var dateObj = new Date();
482 var month = dateObj.getUTCMonth() + 1; // months from 1-12
483 var day = dateObj.getUTCDate();
484 var year = dateObj.getUTCFullYear();
485 var newdate = year + "-" + month + "-" + day;
486 var export_nonce = $( '.loginpress_export_nonce' ).val();
487
488 $.ajax(
489 {
490
491 url: ajaxurl,
492 type: 'POST',
493 data: {
494 action: 'loginpress_export',
495 security: export_nonce,
496 },
497 beforeSend: function () {
498 $( ".export_setting .export-sniper" ).show();
499 },
500 success: function (response) {
501
502 $( ".export_setting .export-sniper" ).hide();
503 $( ".export_setting .export-text" ).show();
504
505 if ( ! window.navigator.msSaveOrOpenBlob ) { // If msSaveOrOpenBlob() is supported, then so is msSaveBlob().
506 $(
507 "<a />",
508 {
509 "download": "loginpress-export-" + newdate +
510 ".json",
511 "href": "data:application/json;charset=utf-8," +
512 encodeURIComponent( response ),
513 }
514 ).appendTo( "body" )
515 .click(
516 function () {
517 $( this ).remove()
518 }
519 )[0].click()
520 } else {
521 var blobObject = new Blob( [response] );
522 window.navigator.msSaveBlob( blobObject, "loginpress-export-" + newdate + ".json" );
523 }
524 setTimeout(
525 function () {
526 $( ".export_setting .export-text" ).fadeOut()
527 },
528 3000
529 );
530 }
531 }
532 );
533 }
534 );
535
536 $( '.loginpress-import' ).on(
537 'click',
538 function (event) {
539
540 event.preventDefault();
541
542 var file = $( '#loginPressImport' );
543 var import_nonce = $( '.loginpress_import_nonce' ).val();
544 var fileObj = new FormData();
545 var content = file[0].files[0];
546
547 fileObj.append( 'file', content );
548 fileObj.append( 'name', content['name'] );
549 fileObj.append( 'action', 'loginpress_import' );
550 fileObj.append( 'security', import_nonce );
551
552 $.ajax(
553 {
554
555 processData: false,
556 contentType: false,
557 url: ajaxurl,
558 type: 'POST',
559 data: fileObj, // file and action append into variable fileObj.
560 beforeSend: function () {
561 $( ".import_setting .import-sniper" ).show();
562 $( ".import_setting .wrong-import" ).html( "" );
563 $( '.loginpress-import' ).attr( "disabled", "disabled" );
564 },
565 success: function (response) {
566 // console.log(response);
567 $( ".import_setting .import-sniper" ).hide();
568 // $(".import_setting .import-text").fadeIn();
569 if ('error' == response) {
570 $( ".import_setting .wrong-import" ).html(
571 "JSON File is not Valid."
572 );
573 } else {
574 if (response == '') {
575 $( ".import_setting .import-text" ).show();
576 } else if (response.data.status === 'error') {
577 // Add an error message in red to the .import-text element
578 $( ".import_setting .import-text" )
579 .html(
580 function (index, currentContent) {
581 return currentContent + ' <span style="color: red;">Images could not be imported.</span>';
582 }
583 )
584 .show();
585 }
586
587 setTimeout(
588 function () {
589 $( ".import_setting .import-text" ).fadeOut();
590 // $(".import_setting .wrong-import").html("");
591 file.val( '' );
592 },
593 3000
594 );
595 }
596
597 }
598 }
599 ); // !ajax.
600 }
601 );
602 }
603 );
604 $( document ).ready(
605 function () {
606
607 // run the select code for all selects
608 if ($( '[name="loginpress_captcha_settings[captchas_type]"]' ).length > 0) {
609 const urlParams = new URLSearchParams( window.location.search );
610 const captchaType = urlParams.get( 'captcha_type' );
611 if (captchaType) {
612 $( '[name="loginpress_captcha_settings[captchas_type]"]' ).val( captchaType );
613 }
614 }
615 generate_select( 'select:not(.gfield_select)' );
616 $( ".tabs-toggle" ).on(
617 "click",
618 function () {
619 $( this ).toggleClass( "active" ).next( ".loginpress-tabs-wrapper" ).slideToggle();
620 }
621 )
622 $( ".settings-tabs-list" ).on(
623 "click",
624 function () {
625 if (window.matchMedia( '(max-width: 767px)' ).matches === true) {
626 $( this ).closest( ".loginpress-tabs-wrapper" ).slideUp();
627 $( ".tabs-toggle" ).removeClass( "active" );
628 }
629 }
630 );
631 $( '.loginpress-notification-close' ).on(
632 'click',
633 function () {
634
635 $( this ).closest( '.loginpress-notification-bar' ).hide();
636 // Send AJAX request to mark it as dismissed
637 $.post(
638 ajaxurl,
639 {
640 action: 'dismiss_notification',
641 security: loginpress_script.help_nonce
642 }
643 );
644
645 }
646 );
647 $( '.loginpress-notification-bar' ).addClass( 'loginpress-notification-loaded' );
648 }
649 )
650 $( window ).on(
651 'load scroll',
652 function () {
653 if ($( window ).scrollTop() > 10) {
654 $( '.loginpress-notification-bar' ).addClass( 'loginpress-notification-scrolled' );
655 } else {
656 $( '.loginpress-notification-bar' ).removeClass( 'loginpress-notification-scrolled' );
657 }
658 }
659 );
660 function generate_select(selector) {
661 $( selector ).each(
662 function () {
663
664 // Cache the number of options
665 var $this = $( this ),
666 activeValue = $this.val(),
667 classselect = $this.attr( "class" ),
668 numberOfOptions = $( this ).children( "option" ).length;
669
670 // Hides the select element
671 $this.addClass( "s-hidden" );
672
673 // Wrap the select element in a div
674 $this.wrap( '<div class="select ' + classselect + '"></div>' );
675
676 // Insert a styled div to sit over the top of the hidden select element
677 $this.after( '<div class="styledSelect"></div>' );
678
679 // Cache the styled div
680 var $styledSelect = $this.next( "div.styledSelect" );
681
682 var getHTML = $this.children( 'option[value="' + $this.val() + '"]' ).text();
683
684 // if ($this.children('option[value="' + $this.val() + '"]').length > 1) {
685 // var getHTML = $this
686 // .children("option")
687 // .eq(0)
688 // .text();
689 // }
690 // Show the first select option in the styled div
691 $styledSelect.html( '<span class="text-ellipses">' + getHTML + '</span>' );
692
693 // Insert an unordered list after the styled div and also cache the list
694 var $list = $( "<ul />", { class: "options" } ).insertAfter( $styledSelect );
695
696 // Insert a list item into the unordered list for each select option
697 for (var i = 0; i < numberOfOptions; i++) {
698 var Cls = $this.children( "option" ).eq( i ).attr( 'class' );
699 if (Cls == undefined) {
700 Cls = '';
701 }
702 if ($this.children( "option" ).eq( i ).val() == activeValue) {
703 Cls = Cls + ' active';
704 $( '.text-ellipses' ).addClass( 'valueAdded' );
705 }
706 $(
707 "<li />",
708 {
709 text: $this
710 .children( "option" )
711 .eq( i )
712 .text(),
713 rel: $this
714 .children( "option" )
715 .eq( i )
716 .val(),
717 class: Cls
718 }
719 ).appendTo( $list );
720 }
721
722 // Cache the list items
723 var $listItems = $list.children( "li" );
724
725 // Show the unordered list when the styled div is clicked (also hides it if the div is clicked again)
726 $styledSelect.click(
727 function (e) {
728 e.stopPropagation();
729 if ( ! $( this ).hasClass( 'active' )) {
730 $( 'div.styledSelect.active' ).each(
731 function () {
732 $( this ).removeClass( 'active' ).next( 'ul.options' ).slideUp();
733 // return false;
734 }
735 );
736 $( this ).toggleClass( "active" );
737 $( this ).next( "ul.options" ).stop( true ).slideToggle();
738 } else {
739 $( 'div.styledSelect.active' ).each(
740 function () {
741 $( this ).removeClass( 'active' ).next( 'ul.options' ).slideUp();
742 // return false;
743 }
744 );
745 }
746 }
747 );
748
749 // Hides the unordered list when a list item is clicked and updates the styled div to show the selected list item
750 // Updates the select element to have the value of the equivalent option
751 $listItems.click(
752 function (e) {
753 e.stopPropagation();
754 $styledSelect.html( '<span class="text-ellipses valueAdded">' + $( this ).text() + '</span>' ).removeClass( "active" );
755 var value = $( this ).attr( "rel" ).toString();
756 $( $this ).val( value );
757 $( $this ).trigger( "change" );
758 $( 'ul.options' ).slideUp();
759 $( this ).addClass( "active" ).siblings().removeClass( "active" );
760 /* alert($this.val()); Uncomment this for demonstration! */
761 }
762 );
763
764 // Hides the unordered list when clicking outside of it
765 $( document ).click(
766 function () {
767 $styledSelect.removeClass( "active" );
768 $list.slideUp();
769 }
770 );
771
772 }
773 );
774 }
775 })( jQuery ); // This invokes the function above and allows us to use '$' in place of 'jQuery' in our code.
776