PluginProbe
Authorizer / 2.6.20
Authorizer v2.6.20
3.15.3 3.15.2 3.15.1 3.15.0 3.14.3 3.14.4 3.14.2 3.14.1 2.8.1 2.8.2 2.8.3 2.8.4 2.8.5 2.8.6 2.8.7 2.8.8 2.9.0 2.9.1 2.9.10 2.9.11 2.9.12 2.9.13 2.9.2 2.9.3 2.9.6 All 126 releases
authorizer / js / authorizer.js

authorizer.js in Authorizer 2.6.20, at js/authorizer.js

1,091 lines 47.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 var animation_speed = 300;
2 var shake_speed = 600;
3
4
5
6 // Switch between option tabs.
7 function choose_tab( list_name, delay ) {
8 var $ = jQuery;
9
10 // default delay is 0
11 delay = typeof delay !== 'undefined' ? delay : 0;
12
13 // default to the access list tab
14 list_name = typeof list_name !== 'undefined' ? list_name : 'access_lists';
15
16 // Hide all tab content, then show selected tab content
17 $( 'div.section_info, div.section_info + table' ).hide();
18 $( '#section_info_' + list_name + ', #section_info_' + list_name + ' + table' ).show();
19
20 // Set active tab
21 $( '.nav-tab-wrapper a' ).removeClass( 'nav-tab-active' );
22 $( 'a.nav-tab-' + list_name ).addClass( 'nav-tab-active' );
23
24 // Hide site options if they are overridden by a multisite setting.
25 setTimeout( hide_multisite_overridden_options, delay );
26
27 // Hide Save Changes button if we're on the access lists page (changing
28 // access lists saves automatically via AJAX).
29 $( 'body:not(.network-admin) #submit' ).toggle( list_name !== 'access_lists' );
30
31 // Save user's active tab to sessionStorage (so we can restore it on reload).
32 // Note: session storage persists until the browser tab is closed.
33 sessionStorage.setItem( 'tab', list_name );
34 }
35
36 // Update user's usermeta field.
37 function auth_update_usermeta( caller ) {
38 var $ = jQuery,
39 $caller = $( caller ),
40 $usermeta = $caller.parent().children( '.auth-usermeta' ),
41 email = $caller.siblings( '.auth-email' ).val(),
42 usermeta = $usermeta.val(),
43 nonce_save_auth_settings = $( '#nonce_save_auth_settings' ).val();
44
45 // Remove reference to caller if it's the usermeta field itself (not a button triggering the save).
46 if ( $caller.hasClass( 'auth-usermeta' ) ) {
47 $caller = $();
48 }
49
50 // Disable inputs, show spinner.
51 $caller.attr( 'disabled', 'disabled' );
52 $usermeta.attr( 'disabled', 'disabled' );
53 $usermeta.after( '<span class="spinner is-active"></span>' );
54 $( 'html' ).addClass( 'busy' );
55
56 // Call ajax save function.
57 $.post( ajaxurl, {
58 'action': 'update_auth_usermeta',
59 'email': email,
60 'usermeta': usermeta,
61 'nonce_save_auth_settings': nonce_save_auth_settings,
62 }, function ( response ) {
63 var succeeded = response === 'success';
64 var spinner_text = succeeded ? auth_L10n.saved + '.' : '<span style="color: red;">' + auth_L10n.failed + '.</span>';
65 var spinner_wait = succeeded ? 500 : 2000;
66
67 // Enable inputs, remove spinner.
68 $caller.removeAttr( 'disabled' );
69 $usermeta.removeAttr( 'disabled' );
70 $caller.css( 'display', 'none' );
71 $( 'form .spinner:not(:has(.spinner-text))' ).animate( { width: '60px' }, 'fast' ).append( '<span class="spinner-text">' + spinner_text + '</span>' ).delay( spinner_wait ).hide( animation_speed, function() {
72 $( this ).remove();
73 });
74 $( 'html' ).removeClass( 'busy' );
75
76 }).fail( function ( response ) {
77 var succeeded = false;
78 var spinner_text = succeeded ? auth_L10n.saved + '.' : '<span style="color: red;">' + auth_L10n.failed + '.</span>';
79 var spinner_wait = succeeded ? 500 : 2000;
80
81 // Enable inputs, remove spinner.
82 $caller.removeAttr( 'disabled' );
83 $usermeta.removeAttr( 'disabled' );
84 $caller.css( 'display', 'none' );
85 $( 'form .spinner:not(:has(.spinner-text))' ).animate( { width: '60px' }, 'fast' ).append( '<span class="spinner-text">' + spinner_text + '</span>' ).delay( spinner_wait ).hide( animation_speed, function() {
86 $( this ).remove();
87 });
88 $( 'html' ).removeClass( 'busy' );
89
90 });
91
92 }
93
94 // Update user's role (multisite options page).
95 function auth_multisite_change_role( caller ) {
96 var is_multisite = true;
97 auth_change_role( caller, is_multisite );
98 }
99
100 // Update user's role.
101 function auth_change_role( caller, is_multisite ) {
102 var $ = jQuery;
103
104 // Set default for multisite flag (run different save routine if multisite)
105 is_multisite = typeof is_multisite !== 'undefined' ? is_multisite : false;
106
107 var email = $( caller ).parent().find( '.auth-email' );
108 var role = $( caller ).parent().find( '.auth-role' );
109 var date_added = $( caller ).parent().find( '.auth-date-added' );
110
111 var user = {
112 'email': email.val(),
113 'role': role.val(),
114 'date_added': date_added.val(),
115 'edit_action': 'change_role',
116 'multisite_user': is_multisite,
117 };
118
119 // Update the options in the database with this change.
120 update_auth_user( caller, 'access_users_approved', user );
121
122 return true;
123 }
124
125 // Add user to list (multisite options page).
126 function auth_multisite_add_user( caller, list, create_local_account ) {
127 var is_multisite = true;
128
129 // Default to the approved list.
130 list = typeof list !== 'undefined' ? list : 'approved';
131
132 // Default to not creating a local account.
133 create_local_account = typeof create_local_account !== 'undefined' ? create_local_account : false;
134
135 // There currently is no multisite blocked list, so do nothing.
136 if ( list === 'blocked' ) {
137 return;
138 }
139
140 auth_add_user( caller, list, create_local_account, is_multisite );
141 }
142 // Add user to list (list = blocked or approved).
143 function auth_add_user( caller, list, create_local_account, is_multisite ) {
144 var $ = jQuery;
145
146 // Skip email address validation if adding from pending list (not user-editable).
147 var skip_validation = $( caller ).parent().parent().attr( 'id' ) === 'list_auth_settings_access_users_pending';
148
149 // Skip email address validation if we're banning an existing user (since they're already in a list).
150 skip_validation = skip_validation || $( caller ).attr( 'id' ).indexOf( 'block_user' ) > -1;
151
152 // Set default for multisite flag (run different save routine if multisite)
153 is_multisite = typeof is_multisite !== 'undefined' ? is_multisite : false;
154
155 // Default to the approved list.
156 list = typeof list !== 'undefined' ? list : 'approved';
157
158 // Default to not creating a local account.
159 create_local_account = typeof create_local_account !== 'undefined' ? create_local_account : false;
160
161 var email = $( caller ).parent().find( '.auth-email' );
162 var role = $( caller ).parent().find( '.auth-role' );
163 var date_added = $( caller ).parent().find( '.auth-date-added' );
164
165 // Helper variable for disabling buttons while processing. This will be
166 // set differently if our clicked button is nested in a div (below).
167 var buttons = caller;
168
169 // Button (caller) might be nested in a div, so we need to walk up one more level
170 if ( email.length === 0 || role.length === 0 ) {
171 email = $( caller ).parent().parent().find( '.auth-email' );
172 role = $( caller ).parent().parent().find( '.auth-role' );
173 date_added = $( caller ).parent().parent().find( '.auth-date-added' );
174 buttons = $( caller ).parent().children();
175 }
176
177 var user = {
178 'email': $.trim( email.val() ).replace( 'mailto:', '' ),
179 'role': role.val(),
180 'date_added': date_added.val(),
181 'edit_action': 'add',
182 'local_user': create_local_account,
183 'multisite_user': is_multisite,
184 };
185
186 // Get next highest user ID.
187 var next_id = 1 + Math.max.apply(
188 null,
189 $( '#list_auth_settings_access_users_' + list + ' li .auth-email' ).map( function ( el, index ) {
190 return parseInt( this.id.replace( 'auth_multisite_settings_access_users_' + list + '_', '' ).replace( 'auth_settings_access_users_' + list + '_', '' ) );
191 })
192 );
193
194 var validated = true;
195
196 if ( user.email === '' ) {
197 return false;
198 }
199
200 $( buttons ).attr( 'disabled', 'disabled' );
201
202 // Check if the name being added already exists in any list.
203 if ( ! skip_validation && validated ) {
204 $( 'li > input.auth-email' ).each( function() {
205 if ( this.value == user.email ) {
206 validated = false;
207 email.parent().effect( 'shake', shake_speed );
208 $( this ).parent().effect( 'shake', shake_speed );
209 $( buttons ).removeAttr( 'disabled' );
210 return false;
211 }
212 });
213 }
214
215 // Check if the user being added has a valid email address.
216 if ( ! skip_validation && validated ) {
217 if ( ! valid_email( user.email ) ) {
218 validated = false;
219 $( '#new_' + list + '_user_email' ).parent().effect( 'shake', shake_speed );
220 $( buttons ).removeAttr( 'disabled' );
221 }
222 }
223
224 if ( validated ) {
225 // Add the new item.
226 var auth_js_prefix = is_multisite ? 'auth_multisite_' : 'auth_';
227 var local_icon = create_local_account ? '&nbsp;<a title="' + auth_L10n.local_wordpress_user + '" class="auth-local-user"><span class="glyphicon glyphicon-user"></span></a>' : '';
228 var ban_button = list === 'approved' && ! is_multisite ? '<a class="button" id="block_user_' + next_id + '" onclick="' + auth_js_prefix + 'add_user( this, \'blocked\', false ); ' + auth_js_prefix + 'ignore_user( this, \'approved\' );" title="' + auth_L10n.block_ban_user + '"><span class="glyphicon glyphicon-ban-circle"></span></a>' : '';
229 $( ' \
230 <li id="new_user_' + next_id + '" style="display: none;"> \
231 <input type="text" id="auth_settings_access_users_' + list + '_' + next_id + '" name="auth_settings[access_users_' + list + '][' + next_id + '][email]" value="' + user.email + '" readonly="true" class="auth-email" /> \
232 <select name="auth_settings[access_users_' + list + '][' + next_id + '][role]" class="auth-role" onchange="' + auth_js_prefix + 'change_role( this );"> \
233 </select> \
234 <input type="text" name="auth_settings[access_users_' + list + '][' + next_id + '][date_added]" value="' + getShortDate() + '" readonly="true" class="auth-date-added" /> \
235 ' + ban_button + ' \
236 <a class="button" id="ignore_user_' + next_id + '" onclick="' + auth_js_prefix + 'ignore_user( this, \'' + list + '\' );" title="' + auth_L10n.remove_user + '"><span class="glyphicon glyphicon-remove"></span></a> \
237 ' + local_icon + ' \
238 <span class="spinner is-active"></span> \
239 </li> \
240 ' ).appendTo( '#list_auth_settings_access_users_' + list + '' ).slideDown( 250 );
241
242 // Populate the role dropdown in the new element. Because clone() doesn't
243 // save selected state on select elements, set that too.
244 $( 'option', role ).clone().appendTo( '#new_user_' + next_id + ' .auth-role' );
245 $( '#new_user_' + next_id + ' .auth-role' ).val( role.val() );
246
247 // Remove the 'empty list' item if it exists.
248 $( '#list_auth_settings_access_users_' + list + ' li.auth-empty' ).remove();
249
250 // Update the options in the database with this change.
251 update_auth_user( buttons, 'access_users_' + list, user );
252
253 // Reset the new user textboxes
254 if ( email.hasClass( 'new' ) ) {
255 email.val( '' );
256 }
257
258 // Re-enable the action buttons now that we're done saving.
259 $( buttons ).removeAttr( 'disabled' );
260
261 return true;
262 }
263 }
264
265 // Remove user from list (multisite options page).
266 function auth_multisite_ignore_user( caller, list_name ) {
267 var is_multisite = true;
268
269 // Set default list if not provided.
270 list_name = typeof list_name !== 'undefined' ? list_name : '';
271
272 auth_ignore_user( caller, list_name, is_multisite );
273 }
274 // Remove user from list.
275 function auth_ignore_user( caller, list_name, is_multisite ) {
276 var $ = jQuery;
277
278 // Set default for multisite flag (run different save routine if multisite)
279 is_multisite = typeof is_multisite !== 'undefined' ? is_multisite : false;
280
281 // Set default list if not provided.
282 list_name = typeof list_name !== 'undefined' ? list_name : 'approved';
283
284 var email = $( caller ).parent().find( '.auth-email' );
285
286 var user = {
287 'email': email.val(),
288 'role': '',
289 'date_added': '',
290 'edit_action': 'remove',
291 'multisite_user': is_multisite,
292 };
293
294 // Show an 'empty list' message if we're deleting the last item
295 var list = $( caller ).closest( 'ul' );
296 if ( $( 'li', list ).length <= 1 ) {
297 $( list ).append( '<li class="auth-empty"><em>' + auth_L10n.no_users_in + ' ' + list_name + '</em></li>' );
298 }
299
300 $( caller ).parent().slideUp( 250, function() {
301 // Remove the list item.
302 $( this ).remove();
303
304 // Update the options in the database with this change.
305 update_auth_user( caller, 'access_users_' + list_name, user );
306 });
307 }
308
309
310 // Make changes to one of the user lists (pending, approved, blocked) via ajax.
311 function update_auth_user( caller, setting, user_to_edit ) {
312 var $ = jQuery,
313 access_users_pending = [],
314 access_users_approved = [],
315 access_users_blocked = [],
316 nonce_save_auth_settings = $( '#nonce_save_auth_settings' ).val();
317
318 // Defaults:
319 // setting = 'access_users_pending' or 'access_users_approved' or 'access_users_blocked',
320 // user_to_edit = {
321 // email: 'johndoe@example.com',
322 // role: 'subscriber',
323 // date_added: 'Jun 2014',
324 // edit_action: 'add' or 'remove' or 'change_role',
325 // local_user: true or false,
326 // multisite_user: true or false,
327 // }
328 setting = typeof setting !== 'undefined' ? setting : 'none';
329 user_to_edit = typeof user_to_edit !== 'undefined' ? user_to_edit : {};
330
331 // Enable wait cursor.
332 $( 'html' ).addClass( 'busy' );
333
334 // Enable spinner by element that triggered this event (caller).
335 $( caller ).attr( 'disabled', 'disabled' );
336 if ( $( caller ).val() === auth_L10n.save_changes ) {
337 $( caller ).last().after( '<span class="spinner is-active"></span>' );
338 } else if ( $( caller ).hasClass( 'auth-role' ) ) {
339 $( caller ).last().next().next().after( '<span class="spinner is-active"></span>' );
340 } else {
341 $( caller ).last().next().after( '<span class="spinner is-active"></span>' );
342 }
343 $( 'form .spinner' ).show();
344
345 // Grab the value of the setting we are saving.
346 if ( setting === 'access_users_pending' ) {
347 access_users_pending.push( user_to_edit );
348 } else if ( setting === 'access_users_approved' ) {
349 access_users_approved.push( user_to_edit );
350 } else if ( setting === 'access_users_blocked' ) {
351 access_users_blocked.push( user_to_edit );
352 }
353
354 $.post( ajaxurl, {
355 'action': 'update_auth_user',
356 'setting': setting,
357 'access_users_pending': access_users_pending,
358 'access_users_approved': access_users_approved,
359 'access_users_blocked': access_users_blocked,
360 'nonce_save_auth_settings': nonce_save_auth_settings,
361 }, function( response ) {
362 // Server responded, but if response isn't 'success' it failed to save.
363 var succeeded = response === 'success';
364 var spinner_text = succeeded ? auth_L10n.saved + '.' : '<span style="color: red;">' + auth_L10n.failed + '.</span>';
365 var spinner_wait = succeeded ? 500 : 2000;
366 $( 'form .spinner:not(:has(.spinner-text))' ).append( '<span class="spinner-text">' + spinner_text + '</span>' ).delay( spinner_wait ).hide( animation_speed, function() {
367 $( this ).remove();
368 });
369 $( caller ).removeAttr( 'disabled' );
370
371 // Disable wait cursor.
372 $( 'html' ).removeClass( 'busy' );
373 }).fail( function() {
374 // Fail fires if the server doesn't respond or responds with 500 codes
375 var succeeded = false;
376 var spinner_text = succeeded ? auth_L10n.saved + '.' : '<span style="color: red;">' + auth_L10n.failed + '.</span>';
377 var spinner_wait = succeeded ? 500 : 2000;
378 $( 'form .spinner:not(:has(.spinner-text))' ).append( '<span class="spinner-text">' + spinner_text + '</span>' ).delay( spinner_wait ).hide( animation_speed, function() {
379 $( this ).remove();
380 });
381 $( caller ).removeAttr( 'disabled' );
382
383 // Disable wait cursor.
384 $( 'html' ).removeClass( 'busy' );
385 });
386 }
387
388
389 // Multisite functions
390 function save_auth_multisite_settings( caller ) {
391 var $ = jQuery;
392
393 // Enable wait cursor.
394 $( 'html' ).addClass( 'busy' );
395
396 $( caller ).attr( 'disabled', 'disabled' );
397 if ( $( caller ).val() === auth_L10n.save_changes ) {
398 $( caller ).last().after( '<span class="spinner is-active"></span>' );
399 } else if ( $( caller ).hasClass( 'auth-role' ) ) {
400 $( caller ).last().next().next().after( '<span class="spinner is-active"></span>' );
401 } else {
402 $( caller ).last().next().after( '<span class="spinner is-active"></span>' );
403 }
404 $( 'form .spinner' ).show();
405
406 // Get form elements to save
407
408 var nonce_save_auth_settings = $( '#nonce_save_auth_settings' ).val();
409
410 var multisite_override = $( '#auth_settings_multisite_override' ).is( ':checked' ) ? '1' : '';
411
412 var access_who_can_login = $( 'form input[name="auth_settings[access_who_can_login]"]:checked' ).val();
413
414 var access_who_can_view = $( 'form input[name="auth_settings[access_who_can_view]"]:checked' ).val();
415
416 var access_users_approved = {};
417 $( '#list_auth_settings_access_users_approved li' ).each( function( index ) {
418 var user = {};
419 user.email = $( '.auth-email', this ).val();
420 user.role = $( '.auth-role', this ).val();
421 user.date_added = $( '.auth-date-added', this ).val();
422 user.local_user = $( '.auth-local-user', this ).length !== 0;
423 access_users_approved[index] = user;
424 });
425
426 var access_default_role = $( '#auth_settings_access_default_role' ).val();
427
428 var google = $( '#auth_settings_google' ).is( ':checked' ) ? '1' : '';
429 var google_clientid = $( '#auth_settings_google_clientid' ).val();
430 var google_clientsecret = $( '#auth_settings_google_clientsecret' ).val();
431 var google_hosteddomain = $( '#auth_settings_google_hosteddomain' ).val();
432
433 var cas = $( '#auth_settings_cas' ).is( ':checked' ) ? '1' : '';
434 var cas_custom_label = $( '#auth_settings_cas_custom_label' ).val();
435 var cas_host = $( '#auth_settings_cas_host' ).val();
436 var cas_port = $( '#auth_settings_cas_port' ).val();
437 var cas_path = $( '#auth_settings_cas_path' ).val();
438 var cas_version = $( '#auth_settings_cas_version' ).val();
439 var cas_attr_email = $( '#auth_settings_cas_attr_email' ).val();
440 var cas_attr_first_name = $( '#auth_settings_cas_attr_first_name' ).val();
441 var cas_attr_last_name = $( '#auth_settings_cas_attr_last_name' ).val();
442 var cas_attr_update_on_login = $( '#auth_settings_cas_attr_update_on_login' ).is( ':checked' ) ? '1' : '';
443 var cas_auto_login = $( '#auth_settings_cas_auto_login' ).is( ':checked' ) ? '1' : '';
444
445 var ldap = $( '#auth_settings_ldap' ).is( ':checked' ) ? '1' : '';
446 var ldap_host = $( '#auth_settings_ldap_host' ).val();
447 var ldap_port = $( '#auth_settings_ldap_port' ).val();
448 var ldap_search_base = $( '#auth_settings_ldap_search_base' ).val();
449 var ldap_uid = $( '#auth_settings_ldap_uid' ).val();
450 var ldap_attr_email = $( '#auth_settings_ldap_attr_email' ).val();
451 var ldap_user = $( '#auth_settings_ldap_user' ).val();
452 var ldap_password = $( '#auth_settings_ldap_password' ).val();
453 var ldap_tls = $( '#auth_settings_ldap_tls' ).is( ':checked' ) ? '1' : '';
454 var ldap_lostpassword_url = $( '#auth_settings_ldap_lostpassword_url' ).val();
455 var ldap_attr_first_name = $( '#auth_settings_ldap_attr_first_name' ).val();
456 var ldap_attr_last_name = $( '#auth_settings_ldap_attr_last_name' ).val();
457 var ldap_attr_update_on_login = $( '#auth_settings_ldap_attr_update_on_login' ).is( ':checked' ) ? '1' : '';
458
459 var advanced_lockouts = {
460 'attempts_1': $( '#auth_settings_advanced_lockouts_attempts_1' ).val(),
461 'duration_1': $( '#auth_settings_advanced_lockouts_duration_1' ).val(),
462 'attempts_2': $( '#auth_settings_advanced_lockouts_attempts_2' ).val(),
463 'duration_2': $( '#auth_settings_advanced_lockouts_duration_2' ).val(),
464 'reset_duration': $( '#auth_settings_advanced_lockouts_reset_duration' ).val()
465 };
466 var advanced_hide_wp_login = $( '#auth_settings_advanced_hide_wp_login' ).is( ':checked' ) ? '1' : '';
467
468 $.post( ajaxurl, {
469 action: 'save_auth_multisite_settings',
470 'nonce_save_auth_settings': nonce_save_auth_settings,
471 'multisite_override': multisite_override,
472 'access_who_can_login': access_who_can_login,
473 'access_who_can_view': access_who_can_view,
474 'access_users_approved': access_users_approved,
475 'access_default_role': access_default_role,
476 'google': google,
477 'google_clientid': google_clientid,
478 'google_clientsecret': google_clientsecret,
479 'google_hosteddomain': google_hosteddomain,
480 'cas': cas,
481 'cas_custom_label': cas_custom_label,
482 'cas_host': cas_host,
483 'cas_port': cas_port,
484 'cas_path': cas_path,
485 'cas_version': cas_version,
486 'cas_attr_email': cas_attr_email,
487 'cas_attr_first_name': cas_attr_first_name,
488 'cas_attr_last_name': cas_attr_last_name,
489 'cas_attr_update_on_login': cas_attr_update_on_login,
490 'cas_auto_login': cas_auto_login,
491 'ldap': ldap,
492 'ldap_host': ldap_host,
493 'ldap_port': ldap_port,
494 'ldap_search_base': ldap_search_base,
495 'ldap_uid': ldap_uid,
496 'ldap_attr_email': ldap_attr_email,
497 'ldap_user': ldap_user,
498 'ldap_password': ldap_password,
499 'ldap_tls': ldap_tls,
500 'ldap_lostpassword_url': ldap_lostpassword_url,
501 'ldap_attr_first_name': ldap_attr_first_name,
502 'ldap_attr_last_name': ldap_attr_last_name,
503 'ldap_attr_update_on_login': ldap_attr_update_on_login,
504 'advanced_lockouts': advanced_lockouts,
505 'advanced_hide_wp_login': advanced_hide_wp_login,
506 }, function( response ) {
507 var succeeded = response === 'success';
508 var spinner_text = succeeded ? auth_L10n.saved + '.' : '<span style="color: red;">' + auth_L10n.failed + '.</span>';
509 var spinner_wait = succeeded ? 500 : 2000;
510 $( 'form .spinner:not(:has(.spinner-text))' ).append( '<span class="spinner-text">' + spinner_text + '</span>' ).delay( spinner_wait ).hide( animation_speed, function() {
511 $( this ).remove();
512 });
513 $( caller ).removeAttr( 'disabled' );
514
515 // Disable wait cursor.
516 $( 'html' ).removeClass( 'busy' );
517 }).fail( function() {
518 // Fail fires if the server doesn't respond
519 var succeeded = false;
520 var spinner_text = succeeded ? auth_L10n.saved + '.' : '<span style="color: red;">' + auth_L10n.failed + '.</span>';
521 var spinner_wait = succeeded ? 500 : 2000;
522 $( 'form .spinner:not(:has(.spinner-text))' ).append( '<span class="spinner-text">' + spinner_text + '</span>' ).delay( spinner_wait ).hide( animation_speed, function() {
523 $( this ).remove();
524 });
525 $( caller ).removeAttr( 'disabled' );
526
527 // Disable wait cursor.
528 $( 'html' ).removeClass( 'busy' );
529 });
530 }
531
532 // Hide or show (with overlay) the multisite settings based on the "multisite override" setting.
533 function hide_multisite_settings_if_disabled() {
534 var $ = jQuery;
535
536 if ( $( '#auth_settings_multisite_override' ).length === 0 )
537 return;
538
539 var settings = $( '#auth_multisite_settings' );
540 var overlay = $( '#auth_multisite_settings_disabled_overlay' );
541
542 if ( $( '#auth_settings_multisite_override' ).is( ':checked' ) ) {
543 overlay.hide( animation_speed );
544 } else {
545 overlay.css({
546 'background-color': '#f1f1f1',
547 'z-index': 1,
548 'opacity': 0.8,
549 'position': 'absolute',
550 'top': settings.position().top,
551 'left': settings.position().left - 20,
552 'width': '100%',
553 'height': settings.height(),
554 'padding-left': 20,
555 });
556 overlay.show();
557 }
558 }
559
560 // Hide (with overlay) site options if overridden by a multisite option.
561 function hide_multisite_overridden_options() {
562 var $ = jQuery;
563
564 $( '.auth_multisite_override_overlay' ).each( function() {
565 // Option to hide is stored in the overlay's id with 'overlay-hide-' prefix.
566 var option_container_to_hide = $( this ).closest( 'tr' );
567 if ( option_container_to_hide.length > 0 ) {
568 $( this ).css({
569 'background-color': '#f1f1f1',
570 'z-index': 1,
571 'opacity': 0.8,
572 'position': 'absolute',
573 'top': option_container_to_hide.position().top,
574 'left': option_container_to_hide.position().left,
575 'width': '100%',
576 'height': option_container_to_hide.height(),
577 });
578 $( this ).show();
579 }
580 });
581 }
582
583
584
585 // Helper function to hide/show wordpress option
586 function animate_option( action, option ) {
587 var $ = jQuery;
588 if ( action === 'show' ) {
589 $( 'div.animated_wrapper', option ).slideDown( animation_speed );
590 $( 'th', option ).animate({ padding: '20px 10px 20px 0' }, { duration: animation_speed });
591 $( 'td', option ).animate({ padding: '15px 10px' }, { duration: animation_speed });
592 } else if ( action === 'hide' ) {
593 $( 'div.animated_wrapper', option ).slideUp( animation_speed );
594 $( 'td, th', option ).animate({ padding: '0px' }, { duration: animation_speed });
595 } else if ( action === 'hide_immediately' ) {
596 $( 'div.animated_wrapper', option ).hide();
597 $( 'td, th', option ).css({ padding: '0px' });
598 }
599 }
600
601 // Helper function to grab a querystring param value by name
602 function getParameterByName( needle, haystack ) {
603 needle = needle.replace( /[\[]/, "\\\[").replace(/[\]]/, "\\\]" );
604 var regex = new RegExp( "[\\?&]" + needle + "=([^&#]*)" );
605 var results = regex.exec( haystack );
606 if( results === null )
607 return '';
608 else
609 return decodeURIComponent( results[1].replace( /\+/g, " " ) );
610 }
611
612 // Helper function to generate a random string
613 function getRandomId() {
614 var text = "";
615 var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
616 for ( var i=0; i < 5; i++ )
617 text += possible.charAt( Math.floor( Math.random() * possible.length ) );
618 return text;
619 }
620
621 // Helper function to return a short date (e.g., Jul 2013) for today's date
622 function getShortDate( date ) {
623 date = typeof date !== 'undefined' ? date : new Date();
624 var month = '';
625 switch ( date.getMonth() ) {
626 case 0: month = 'Jan'; break;
627 case 1: month = 'Feb'; break;
628 case 2: month = 'Mar'; break;
629 case 3: month = 'Apr'; break;
630 case 4: month = 'May'; break;
631 case 5: month = 'Jun'; break;
632 case 6: month = 'Jul'; break;
633 case 7: month = 'Aug'; break;
634 case 8: month = 'Sep'; break;
635 case 9: month = 'Oct'; break;
636 case 10: month = 'Nov'; break;
637 case 11: month = 'Dec'; break;
638 }
639 return month + ' ' + date.getFullYear();
640 }
641
642 // Helper function to grab a querystring value
643 function querystring( key ) {
644 var re = new RegExp( '(?:\\?|&)'+key+'=(.*?)(?=&|$)', 'gi' );
645 var r = [], m;
646 while ( ( m = re.exec( document.location.search ) ) !== null )
647 r.push( m[1] );
648 return r;
649 }
650
651 // Helper function to check if an email address is valid.
652 function valid_email( email ) {
653 var re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
654 return re.test( email );
655 }
656
657
658 jQuery( document ).ready( function( $ ) {
659 // Grab references to form elements that we will show/hide on page load
660 var auth_settings_access_users_pending = $( '#list_auth_settings_access_users_pending' ).closest( 'tr' );
661 var auth_settings_access_users_approved = $( '#list_auth_settings_access_users_approved' ).closest( 'tr' );
662 var auth_settings_access_users_blocked = $( '#list_auth_settings_access_users_blocked' ).closest( 'tr' );
663 var auth_settings_access_role_receive_pending_emails = $( '#auth_settings_access_role_receive_pending_emails' ).closest( 'tr' );
664 var auth_settings_access_pending_redirect_to_message = $( '#wp-auth_settings_access_pending_redirect_to_message-wrap' ).closest( 'tr' );
665 var auth_settings_access_blocked_redirect_to_message = $( '#wp-auth_settings_access_blocked_redirect_to_message-wrap' ).closest( 'tr' );
666 var auth_settings_access_should_email_approved_users = $( '#auth_settings_access_should_email_approved_users' ).closest( 'tr' );
667 var auth_settings_access_email_approved_users_subject = $( '#auth_settings_access_email_approved_users_subject' ).closest( 'tr' );
668 var auth_settings_access_email_approved_users_body = $( '#wp-auth_settings_access_email_approved_users_body-wrap' ).closest( 'tr' );
669 var auth_settings_access_public_pages = $( '#auth_settings_access_public_pages' ).closest( 'tr' );
670 var auth_settings_access_redirect_to_login = $( '#radio_auth_settings_access_redirect_to_login' ).closest( 'tr' );
671 var auth_settings_access_public_warning = $( '#radio_auth_settings_access_public_warning' ).closest( 'tr' );
672 var auth_settings_access_redirect_to_message = $( '#wp-auth_settings_access_redirect_to_message-wrap' ).closest( 'tr' );
673 var auth_settings_external_settings_table = $( '#auth_settings_google' ).closest( 'table' );
674 var auth_settings_external_google = $( '#auth_settings_google' ).closest( 'tr' );
675 var auth_settings_external_google_clientid = $( '#auth_settings_google_clientid' ).closest( 'tr' );
676 var auth_settings_external_google_clientsecret = $( '#auth_settings_google_clientsecret' ).closest( 'tr' );
677 var auth_settings_external_google_hosteddomain = $( '#auth_settings_google_hosteddomain' ).closest( 'tr' );
678 var auth_settings_external_cas = $( '#auth_settings_cas' ).closest( 'tr' );
679 var auth_settings_external_cas_custom_label = $( '#auth_settings_cas_custom_label' ).closest( 'tr' );
680 var auth_settings_external_cas_host = $( '#auth_settings_cas_host' ).closest( 'tr' );
681 var auth_settings_external_cas_port = $( '#auth_settings_cas_port' ).closest( 'tr' );
682 var auth_settings_external_cas_path = $( '#auth_settings_cas_path' ).closest( 'tr' );
683 var auth_settings_external_cas_version = $( '#auth_settings_cas_version' ).closest( 'tr' );
684 var auth_settings_external_cas_attr_email = $( '#auth_settings_cas_attr_email' ).closest( 'tr' );
685 var auth_settings_external_cas_attr_first_name = $( '#auth_settings_cas_attr_first_name' ).closest( 'tr' );
686 var auth_settings_external_cas_attr_last_name = $( '#auth_settings_cas_attr_last_name' ).closest( 'tr' );
687 var auth_settings_external_cas_attr_update_on_login = $( '#auth_settings_cas_attr_update_on_login' ).closest( 'tr' );
688 var auth_settings_external_cas_auto_login = $( '#auth_settings_cas_auto_login' ).closest( 'tr' );
689 var auth_settings_external_ldap = $( '#auth_settings_ldap' ).closest( 'tr' );
690 var auth_settings_external_ldap_host = $( '#auth_settings_ldap_host' ).closest( 'tr' );
691 var auth_settings_external_ldap_port = $( '#auth_settings_ldap_port' ).closest( 'tr' );
692 var auth_settings_external_ldap_search_base = $( '#auth_settings_ldap_search_base' ).closest( 'tr' );
693 var auth_settings_external_ldap_uid = $( '#auth_settings_ldap_uid' ).closest( 'tr' );
694 var auth_settings_external_ldap_attr_email = $( '#auth_settings_ldap_attr_email' ).closest( 'tr' );
695 var auth_settings_external_ldap_user = $( '#auth_settings_ldap_user' ).closest( 'tr' );
696 var auth_settings_external_ldap_password = $( '#auth_settings_ldap_password' ).closest( 'tr' );
697 var auth_settings_external_ldap_tls = $( '#auth_settings_ldap_tls' ).closest( 'tr' );
698 var auth_settings_external_ldap_lostpassword_url = $( '#auth_settings_ldap_lostpassword_url' ).closest( 'tr' );
699 var auth_settings_external_ldap_attr_first_name = $( '#auth_settings_ldap_attr_first_name' ).closest( 'tr' );
700 var auth_settings_external_ldap_attr_last_name = $( '#auth_settings_ldap_attr_last_name' ).closest( 'tr' );
701 var auth_settings_external_ldap_attr_update_on_login = $( '#auth_settings_ldap_attr_update_on_login' ).closest( 'tr' );
702
703 // Wrap the th and td in the rows above so we can animate their heights (can't animate tr heights with jquery)
704 $( 'th, td', auth_settings_access_users_pending ).wrapInner( '<div class="animated_wrapper" />' );
705 $( 'th, td', auth_settings_access_users_approved ).wrapInner( '<div class="animated_wrapper" />' );
706 $( 'th, td', auth_settings_access_users_blocked ).wrapInner( '<div class="animated_wrapper" />' );
707 $( 'th, td', auth_settings_access_role_receive_pending_emails ).wrapInner( '<div class="animated_wrapper" />' );
708 $( 'th, td', auth_settings_access_pending_redirect_to_message ).wrapInner( '<div class="animated_wrapper" />' );
709 $( 'th, td', auth_settings_access_blocked_redirect_to_message ).wrapInner( '<div class="animated_wrapper" />' );
710 $( 'th, td', auth_settings_access_should_email_approved_users ).wrapInner( '<div class="animated_wrapper" />' );
711 $( 'th, td', auth_settings_access_email_approved_users_subject ).wrapInner( '<div class="animated_wrapper" />' );
712 $( 'th, td', auth_settings_access_email_approved_users_body ).wrapInner( '<div class="animated_wrapper" />' );
713 $( 'th, td', auth_settings_access_public_pages ).wrapInner( '<div class="animated_wrapper" />' );
714 $( 'th, td', auth_settings_access_redirect_to_login ).wrapInner( '<div class="animated_wrapper" />' );
715 $( 'th, td', auth_settings_access_public_warning ).wrapInner( '<div class="animated_wrapper" />' );
716 $( 'th, td', auth_settings_access_redirect_to_message ).wrapInner( '<div class="animated_wrapper" />' );
717 $( 'th, td', auth_settings_external_google_clientid ).wrapInner( '<div class="animated_wrapper" />' );
718 $( 'th, td', auth_settings_external_google_clientsecret ).wrapInner( '<div class="animated_wrapper" />' );
719 $( 'th, td', auth_settings_external_google_hosteddomain ).wrapInner( '<div class="animated_wrapper" />' );
720 $( 'th, td', auth_settings_external_cas_custom_label ).wrapInner( '<div class="animated_wrapper" />' );
721 $( 'th, td', auth_settings_external_cas_host ).wrapInner( '<div class="animated_wrapper" />' );
722 $( 'th, td', auth_settings_external_cas_port ).wrapInner( '<div class="animated_wrapper" />' );
723 $( 'th, td', auth_settings_external_cas_path ).wrapInner( '<div class="animated_wrapper" />' );
724 $( 'th, td', auth_settings_external_cas_version ).wrapInner( '<div class="animated_wrapper" />' );
725 $( 'th, td', auth_settings_external_cas_attr_email ).wrapInner( '<div class="animated_wrapper" />' );
726 $( 'th, td', auth_settings_external_cas_attr_first_name ).wrapInner( '<div class="animated_wrapper" />' );
727 $( 'th, td', auth_settings_external_cas_attr_last_name ).wrapInner( '<div class="animated_wrapper" />' );
728 $( 'th, td', auth_settings_external_cas_attr_update_on_login ).wrapInner( '<div class="animated_wrapper" />' );
729 $( 'th, td', auth_settings_external_cas_auto_login ).wrapInner( '<div class="animated_wrapper" />' );
730 $( 'th, td', auth_settings_external_ldap_host ).wrapInner( '<div class="animated_wrapper" />' );
731 $( 'th, td', auth_settings_external_ldap_port ).wrapInner( '<div class="animated_wrapper" />' );
732 $( 'th, td', auth_settings_external_ldap_search_base ).wrapInner( '<div class="animated_wrapper" />' );
733 $( 'th, td', auth_settings_external_ldap_uid ).wrapInner( '<div class="animated_wrapper" />' );
734 $( 'th, td', auth_settings_external_ldap_attr_email ).wrapInner( '<div class="animated_wrapper" />' );
735 $( 'th, td', auth_settings_external_ldap_user ).wrapInner( '<div class="animated_wrapper" />' );
736 $( 'th, td', auth_settings_external_ldap_password ).wrapInner( '<div class="animated_wrapper" />' );
737 $( 'th, td', auth_settings_external_ldap_tls ).wrapInner( '<div class="animated_wrapper" />' );
738 $( 'th, td', auth_settings_external_ldap_lostpassword_url ).wrapInner( '<div class="animated_wrapper" />' );
739 $( 'th, td', auth_settings_external_ldap_attr_first_name ).wrapInner( '<div class="animated_wrapper" />' );
740 $( 'th, td', auth_settings_external_ldap_attr_last_name ).wrapInner( '<div class="animated_wrapper" />' );
741 $( 'th, td', auth_settings_external_ldap_attr_update_on_login ).wrapInner( '<div class="animated_wrapper" />' );
742
743 // If we're viewing the dashboard widget, reset a couple of the relevant
744 // option variables (since they're aren't nested in table rows).
745 if ( $( '#auth_dashboard_widget' ).length ) {
746 auth_settings_access_users_pending = $( '#list_auth_settings_access_users_pending' ).closest( 'div' );
747 auth_settings_access_users_approved = $( '#list_auth_settings_access_users_approved' ).closest( 'div' );
748 auth_settings_access_users_blocked = $( '#list_auth_settings_access_users_blocked' ).closest( 'div' );
749 $( auth_settings_access_users_pending ).wrapInner( '<div class="animated_wrapper" />' );
750 $( auth_settings_access_users_approved ).wrapInner( '<div class="animated_wrapper" />' );
751 $( auth_settings_access_users_blocked ).wrapInner( '<div class="animated_wrapper" />' );
752
753 // Remove the helper link, since there are no tabs on the dashboard widget
754 $( '#dashboard_link_approved_users' ).contents().unwrap();
755 }
756
757 // Hide Welcome email body/subject options if "Send welcome email" is off.
758 if ( ! $( '#auth_settings_access_should_email_approved_users' ).is( ':checked' ) ) {
759 animate_option( 'hide_immediately', auth_settings_access_email_approved_users_subject );
760 animate_option( 'hide_immediately', auth_settings_access_email_approved_users_body );
761 }
762
763 // On load: Show/hide public access options if everyone can see site
764 if ( ! $( '#radio_auth_settings_access_who_can_view_logged_in_users' ).is( ':checked' ) ) {
765 animate_option( 'hide_immediately', auth_settings_access_public_pages );
766 animate_option( 'hide_immediately', auth_settings_access_redirect_to_login );
767 animate_option( 'hide_immediately', auth_settings_access_public_warning );
768 animate_option( 'hide_immediately', auth_settings_access_redirect_to_message );
769 }
770
771 // Hide Google options if unchecked
772 if ( ! $( '#auth_settings_google' ).is( ':checked' ) ) {
773 animate_option( 'hide_immediately', auth_settings_external_google_clientid );
774 animate_option( 'hide_immediately', auth_settings_external_google_clientsecret );
775 animate_option( 'hide_immediately', auth_settings_external_google_hosteddomain );
776 }
777
778 // Hide CAS options if unchecked
779 if ( ! $( '#auth_settings_cas' ).is( ':checked' ) ) {
780 animate_option( 'hide_immediately', auth_settings_external_cas_custom_label );
781 animate_option( 'hide_immediately', auth_settings_external_cas_host );
782 animate_option( 'hide_immediately', auth_settings_external_cas_port );
783 animate_option( 'hide_immediately', auth_settings_external_cas_path );
784 animate_option( 'hide_immediately', auth_settings_external_cas_version );
785 animate_option( 'hide_immediately', auth_settings_external_cas_attr_email );
786 animate_option( 'hide_immediately', auth_settings_external_cas_attr_first_name );
787 animate_option( 'hide_immediately', auth_settings_external_cas_attr_last_name );
788 animate_option( 'hide_immediately', auth_settings_external_cas_attr_update_on_login );
789 animate_option( 'hide_immediately', auth_settings_external_cas_auto_login );
790 }
791
792 // Hide LDAP options if unchecked
793 if ( ! $( '#auth_settings_ldap' ).is( ':checked' ) ) {
794 animate_option( 'hide_immediately', auth_settings_external_ldap_host );
795 animate_option( 'hide_immediately', auth_settings_external_ldap_port );
796 animate_option( 'hide_immediately', auth_settings_external_ldap_search_base );
797 animate_option( 'hide_immediately', auth_settings_external_ldap_uid );
798 animate_option( 'hide_immediately', auth_settings_external_ldap_attr_email );
799 animate_option( 'hide_immediately', auth_settings_external_ldap_user );
800 animate_option( 'hide_immediately', auth_settings_external_ldap_password );
801 animate_option( 'hide_immediately', auth_settings_external_ldap_tls );
802 animate_option( 'hide_immediately', auth_settings_external_ldap_lostpassword_url );
803 animate_option( 'hide_immediately', auth_settings_external_ldap_attr_first_name );
804 animate_option( 'hide_immediately', auth_settings_external_ldap_attr_last_name );
805 animate_option( 'hide_immediately', auth_settings_external_ldap_attr_update_on_login );
806 }
807
808 // Event handler: Hide "Handle unauthorized visitors" option if access is granted to "Everyone"
809 $( 'input[name="auth_settings[access_who_can_login]"]' ).change( function() {
810 // Hide user whitelist unless "Only specific students below" is checked
811 var action = $( '#radio_auth_settings_access_who_can_login_approved_users' ).is( ':checked' ) ? 'show' : 'hide';
812 animate_option( action, auth_settings_access_role_receive_pending_emails );
813 animate_option( action, auth_settings_access_pending_redirect_to_message );
814 animate_option( action, auth_settings_access_blocked_redirect_to_message );
815 animate_option( action, auth_settings_access_should_email_approved_users );
816 animate_option( action, auth_settings_access_email_approved_users_subject );
817 animate_option( action, auth_settings_access_email_approved_users_body );
818 });
819
820 // Event handler: Hide Welcome email body/subject options if "Send welcome email" is off.
821 $( 'input[name="auth_settings[access_should_email_approved_users]"]' ).change( function() {
822 var action = $( this ).is( ':checked' ) ? 'show' : 'hide';
823 animate_option( action, auth_settings_access_email_approved_users_subject );
824 animate_option( action, auth_settings_access_email_approved_users_body );
825 });
826
827 // Event handler: Hide "Handle unauthorized visitors" option if access is granted to "Everyone"
828 $( 'input[name="auth_settings[access_who_can_view]"]' ).change( function() {
829 var action = $( '#radio_auth_settings_access_who_can_view_everyone' ).is( ':checked' ) ? 'hide' : 'show';
830 animate_option( action, auth_settings_access_redirect_to_login );
831 animate_option( action, auth_settings_access_redirect_to_message );
832 animate_option( action, auth_settings_access_public_pages );
833 animate_option( action, auth_settings_access_public_warning );
834 });
835
836 // Event handler: Show/hide Google options based on checkbox
837 $( 'input[name="auth_settings[google]"]' ).change( function() {
838 var action = $( this ).is( ':checked' ) ? 'show' : 'hide';
839 animate_option( action, auth_settings_external_google_clientid );
840 animate_option( action, auth_settings_external_google_clientsecret );
841 animate_option( action, auth_settings_external_google_hosteddomain );
842 });
843
844 // Event handler: Show/hide CAS options based on checkbox
845 $( 'input[name="auth_settings[cas]"]' ).change( function() {
846 var action = $( this ).is( ':checked' ) ? 'show' : 'hide';
847 animate_option( action, auth_settings_external_cas_custom_label );
848 animate_option( action, auth_settings_external_cas_host );
849 animate_option( action, auth_settings_external_cas_port );
850 animate_option( action, auth_settings_external_cas_path );
851 animate_option( action, auth_settings_external_cas_version );
852 animate_option( action, auth_settings_external_cas_attr_email );
853 animate_option( action, auth_settings_external_cas_attr_first_name );
854 animate_option( action, auth_settings_external_cas_attr_last_name );
855 animate_option( action, auth_settings_external_cas_attr_update_on_login );
856 animate_option( action, auth_settings_external_cas_auto_login );
857 });
858
859 // Event handler: Show/hide LDAP options based on checkbox
860 $( 'input[name="auth_settings[ldap]"]' ).change( function() {
861 var action = $( this ).is( ':checked' ) ? 'show' : 'hide';
862 animate_option( action, auth_settings_external_ldap_host );
863 animate_option( action, auth_settings_external_ldap_port );
864 animate_option( action, auth_settings_external_ldap_search_base );
865 animate_option( action, auth_settings_external_ldap_uid );
866 animate_option( action, auth_settings_external_ldap_attr_email );
867 animate_option( action, auth_settings_external_ldap_user );
868 animate_option( action, auth_settings_external_ldap_password );
869 animate_option( action, auth_settings_external_ldap_tls );
870 animate_option( action, auth_settings_external_ldap_lostpassword_url );
871 animate_option( action, auth_settings_external_ldap_attr_first_name );
872 animate_option( action, auth_settings_external_ldap_attr_last_name );
873 animate_option( action, auth_settings_external_ldap_attr_update_on_login );
874 });
875
876 // Show save button if usermeta field is modified.
877 $( 'form input.auth-usermeta' ).bind( 'keyup', function ( event ) {
878 // Don't do anything if tab or arrow keys were pressed.
879 if ( event.which === 9 || event.which === 37 || event.which === 38 || event.which === 39 || event.which === 40 ) {
880 return;
881 }
882 $( this ).siblings( '.button' ).css( 'display', 'inline-block' );
883 });
884
885 // List management function: pressing enter in the new approved or new
886 // blocked user (email or role field) adds the user to the list.
887 $( '#new_approved_user_email, #new_approved_user_role, #new_blocked_user_email' ).bind( 'keyup', function( e ) {
888 if ( e.which == 13 ) { // Enter key
889 $( this ).parent().find( 'a' ).trigger( 'click' );
890 return false;
891 }
892 });
893
894 // Don't submit form (i.e., save options) when hitting enter in any user list field.
895 $( 'input.auth-email, select.auth-role, input.auth-date-added, input.auth-usermeta' ).bind( 'keydown', function( e ) {
896 if ( e.which == 13 ) { // Enter key
897 e.preventDefault();
898 return false;
899 }
900 });
901
902 // Enable the user-friendly multiselect form element on the options page.
903 $( '#auth_settings_access_public_pages' ).multiSelect({
904 selectableOptgroup: true,
905 selectableHeader: '<div class="custom-header">' + auth_L10n.private_pages + '</div>',
906 selectionHeader: '<div class="custom-header">' + auth_L10n.public_pages + '</div>',
907 });
908
909 // Switch to the first tab (or the tab indicated in sessionStorage, or the querystring).
910 var tab = '';
911 if ( querystring( 'tab' ).length > 0 ) {
912 tab = querystring( 'tab' )[0];
913 } else if ( sessionStorage.getItem( 'tab' ) ) {
914 tab = sessionStorage.getItem( 'tab' );
915 }
916 if ( $.inArray( tab, [ 'access_lists', 'access_login', 'access_public', 'external', 'advanced' ] ) < 0 ) {
917 tab = 'access_lists';
918 }
919 choose_tab( tab, animation_speed );
920
921 // Hide/show multisite settings based on override checkbox.
922 $( 'input[name="auth_settings[multisite_override]"]' ).change( function() {
923 hide_multisite_settings_if_disabled();
924 });
925 hide_multisite_settings_if_disabled();
926
927 });
928
929
930 /**
931 * Portions below from Bootstrap
932 * http://getbootstrap.com/getting-started/#download
933 */
934
935
936 /*!
937 * Bootstrap v3.1.1 (http://getbootstrap.com)
938 * Copyright 2011-2014 Twitter, Inc.
939 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
940 */
941
942 if ( typeof jQuery === 'undefined' ) { throw new Error( 'Bootstrap\'s JavaScript requires jQuery' ) }
943
944 /* ========================================================================
945 * Bootstrap: dropdown.js v3.1.1
946 * http://getbootstrap.com/javascript/#dropdowns
947 * ========================================================================
948 * Copyright 2011-2014 Twitter, Inc.
949 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
950 * ======================================================================== */
951
952
953 +function ($) {
954 'use strict';
955
956 // DROPDOWN CLASS DEFINITION
957 // =========================
958
959 var backdrop = '.dropdown-backdrop'
960 var toggle = '[data-toggle=dropdown]'
961 var Dropdown = function ( element ) {
962 $( element ).on( 'click.bs.dropdown', this.toggle)
963 }
964
965 Dropdown.prototype.toggle = function ( e ) {
966 var $this = $( this )
967
968 if ($this.is( '.disabled, :disabled' )) return
969
970 var $parent = getParent($this)
971 var isActive = $parent.hasClass( 'open' )
972
973 clearMenus()
974
975 if (!isActive) {
976 if ( 'ontouchstart' in document.documentElement && !$parent.closest( '.navbar-nav' ).length) {
977 // if mobile we use a backdrop because click events don't delegate
978 $( '<div class="dropdown-backdrop"/>' ).insertAfter($( this )).on( 'click', clearMenus)
979 }
980
981 var relatedTarget = { relatedTarget: this }
982 $parent.trigger( e = $.Event( 'show.bs.dropdown', relatedTarget ) )
983
984 if (e.isDefaultPrevented()) return
985
986 $parent
987 .toggleClass( 'open' )
988 .trigger( 'shown.bs.dropdown', relatedTarget)
989
990 $this.focus()
991 }
992
993 return false
994 }
995
996 Dropdown.prototype.keydown = function (e) {
997 if (!/(38|40|27)/.test(e.keyCode)) return
998
999 var $this = $( this )
1000
1001 e.preventDefault()
1002 e.stopPropagation()
1003
1004 if ($this.is( '.disabled, :disabled' )) return
1005
1006 var $parent = getParent($this)
1007 var isActive = $parent.hasClass( 'open' )
1008
1009 if (!isActive || (isActive && e.keyCode == 27)) {
1010 if (e.which == 27) $parent.find(toggle).focus()
1011 return $this.click()
1012 }
1013
1014 var desc = ' li:not(.divider):visible a'
1015 var $items = $parent.find( '[role=menu]' + desc + ', [role=listbox]' + desc)
1016
1017 if (!$items.length) return
1018
1019 var index = $items.index($items.filter( ':focus' ))
1020
1021 if (e.keyCode == 38 && index > 0) index-- // up
1022 if (e.keyCode == 40 && index < $items.length - 1) index++ // down
1023 if (!~index) index = 0
1024
1025 $items.eq(index).focus()
1026 }
1027
1028 function clearMenus(e) {
1029 $(backdrop).remove()
1030 $(toggle).each(function () {
1031 var $parent = getParent($( this ))
1032 var relatedTarget = { relatedTarget: this }
1033 if (!$parent.hasClass( 'open' )) return
1034 $parent.trigger(e = $.Event( 'hide.bs.dropdown', relatedTarget))
1035 if (e.isDefaultPrevented()) return
1036 $parent.removeClass( 'open' ).trigger( 'hidden.bs.dropdown', relatedTarget)
1037 })
1038 }
1039
1040 function getParent($this) {
1041 var selector = $this.attr( 'data-target' )
1042
1043 if (!selector) {
1044 selector = $this.attr( 'href' )
1045 selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '' ) //strip for ie7
1046 }
1047
1048 var $parent = selector && $(selector)
1049
1050 return $parent && $parent.length ? $parent : $this.parent()
1051 }
1052
1053
1054 // DROPDOWN PLUGIN DEFINITION
1055 // ==========================
1056
1057 var old = $.fn.dropdown
1058
1059 $.fn.dropdown = function (option) {
1060 return this.each(function () {
1061 var $this = $( this )
1062 var data = $this.data( 'bs.dropdown' )
1063
1064 if (!data) $this.data( 'bs.dropdown', (data = new Dropdown( this )))
1065 if (typeof option == 'string' ) data[option].call($this)
1066 })
1067 }
1068
1069 $.fn.dropdown.Constructor = Dropdown
1070
1071
1072 // DROPDOWN NO CONFLICT
1073 // ====================
1074
1075 $.fn.dropdown.noConflict = function () {
1076 $.fn.dropdown = old
1077 return this
1078 }
1079
1080
1081 // APPLY TO STANDARD DROPDOWN ELEMENTS
1082 // ===================================
1083
1084 $(document)
1085 .on( 'click.bs.dropdown.data-api', clearMenus)
1086 .on( 'click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
1087 .on( 'click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
1088 .on( 'keydown.bs.dropdown.data-api', toggle + ', [role=menu], [role=listbox]', Dropdown.prototype.keydown)
1089
1090 }(jQuery);
1091