plugins/SpecialUserFuncs.php
changeset 30 7e8fd44b36b0
parent 23 320acf077276
child 32 4d87aad3c4c0
equal deleted inserted replaced
29:e5484a9e0818 30:7e8fd44b36b0
   298   $template->header();
   298   $template->header();
   299   echo '<h3>An error occurred during the logout process.</h3><p>'.$l.'</p>';
   299   echo '<h3>An error occurred during the logout process.</h3><p>'.$l.'</p>';
   300   $template->footer();
   300   $template->footer();
   301 }
   301 }
   302 
   302 
   303 function page_Special_Register() {
   303 function page_Special_Register()
       
   304 {
   304   global $db, $session, $paths, $template, $plugins; // Common objects
   305   global $db, $session, $paths, $template, $plugins; // Common objects
   305   if(getConfig('account_activation') == 'disable' && ( ( $session->user_level >= USER_LEVEL_ADMIN && !isset($_GET['IWannaPlayToo']) ) || $session->user_level < USER_LEVEL_ADMIN || !$session->user_logged_in ))
   306   if(getConfig('account_activation') == 'disable' && ( ( $session->user_level >= USER_LEVEL_ADMIN && !isset($_GET['IWannaPlayToo']) ) || $session->user_level < USER_LEVEL_ADMIN || !$session->user_logged_in ))
   306   {
   307   {
   307     $s = ($session->user_level >= USER_LEVEL_ADMIN) ? '<p>Oops...it seems that you <em>are</em> the administrator...hehe...you can also <a href="'.makeUrl($paths->page, 'IWannaPlayToo', true).'">force account registration to work</a>.</p>' : '';
   308     $s = ($session->user_level >= USER_LEVEL_ADMIN) ? '<p>Oops...it seems that you <em>are</em> the administrator...hehe...you can also <a href="'.makeUrl($paths->page, 'IWannaPlayToo', true).'">force account registration to work</a>.</p>' : '';
   308     die_friendly('Registration disabled', '<p>The administrator has disabled new user registration on this site.</p>' . $s);
   309     die_friendly('Registration disabled', '<p>The administrator has disabled new user registration on this site.</p>' . $s);
   309   }
   310   }
   310   if(isset($_POST['submit'])) {
   311   if(isset($_POST['submit'])) 
       
   312   {
       
   313     $_GET['coppa'] = ( isset($_POST['coppa']) ) ? $_POST['coppa'] : 'x';
       
   314     
   311     $captcharesult = $session->get_captcha($_POST['captchahash']);
   315     $captcharesult = $session->get_captcha($_POST['captchahash']);
   312     if($captcharesult != $_POST['captchacode'])
   316     if($captcharesult != $_POST['captchacode'])
       
   317     {
   313       $s = 'The confirmation code you entered was incorrect.';
   318       $s = 'The confirmation code you entered was incorrect.';
       
   319     }
   314     else
   320     else
   315       // CAPTCHA code was correct, create the account
   321     {
   316       $s = $session->create_user($_POST['username'], $_POST['password'], $_POST['email'], $_POST['real_name']);
   322       if ( getConfig('enable_coppa') == '1' && ( !isset($_POST['coppa']) || ( isset($_POST['coppa']) && !in_array($_POST['coppa'], array('yes', 'no')) ) ) )
   317     if($s == 'success')
   323       {
       
   324         $s = 'Invalid COPPA input';
       
   325       }
       
   326       else
       
   327       {
       
   328         $coppa = ( isset($_POST['coppa']) && $_POST['coppa'] == 'yes' );
       
   329         
       
   330         // CAPTCHA code was correct, create the account
       
   331         $s = $session->create_user($_POST['username'], $_POST['password'], $_POST['email'], $_POST['real_name'], $coppa);
       
   332       }
       
   333     }
       
   334     if($s == 'success' && !isset($coppa))
   318     {
   335     {
   319       switch(getConfig('account_activation'))
   336       switch(getConfig('account_activation'))
   320       {
   337       {
   321         case "none":
   338         case "none":
   322         default:
   339         default:
   329           $str = 'Because this site requires administrative account activation, you cannot use your account at the moment. A notice has been sent to the site administration team that will alert them that your account has been created.';
   346           $str = 'Because this site requires administrative account activation, you cannot use your account at the moment. A notice has been sent to the site administration team that will alert them that your account has been created.';
   330           break;
   347           break;
   331       }
   348       }
   332       die_friendly('Registration successful', '<p>Thank you for registering, your user account has been created. '.$str.'</p>');
   349       die_friendly('Registration successful', '<p>Thank you for registering, your user account has been created. '.$str.'</p>');
   333     }
   350     }
       
   351     else if ( $s == 'success' && $coppa )
       
   352     {
       
   353       $str = 'However, in compliance with the Childrens\' Online Privacy Protection Act, you must have your parent or legal guardian activate your account. Please ask them to check their e-mail for further information.';
       
   354       die_friendly('Registration successful', '<p>Thank you for registering, your user account has been created. '.$str.'</p>');
       
   355     }
   334   }
   356   }
   335   $template->header();
   357   $template->header();
   336   echo 'A user account enables you to have greater control over your browsing experience.';
   358   echo 'A user account enables you to have greater control over your browsing experience.';
   337   $session->kill_captcha();
   359   
   338   $captchacode = $session->make_captcha();
   360   if ( getConfig('enable_coppa') != '1' || ( isset($_GET['coppa']) && in_array($_GET['coppa'], array('yes', 'no')) ) )
   339   ?>
   361   {
   340     <h3>Create a user account</h3>
   362     $coppa = ( isset($_GET['coppa']) && $_GET['coppa'] == 'yes' );
   341     <form name="regform" action="<?php echo makeUrl($paths->page); ?>" method="post">
   363     $session->kill_captcha();
   342       <div class="tblholder">
   364     $captchacode = $session->make_captcha();
   343         <table border="0" width="100%" cellspacing="1" cellpadding="4">
   365     ?>
   344           <tr><th class="subhead" colspan="3">Please tell us a little bit about yourself.</th></tr>
   366       <h3>Create a user account</h3>
   345           <?php if(isset($_POST['submit'])) echo '<tr><td colspan="3" class="row2" style="color: red;">'.$s.'</td></tr>'; ?>
   367       <form name="regform" action="<?php echo makeUrl($paths->page); ?>" method="post">
   346           <tr><td class="row1" style="width: 50%;">Preferred username:<span id="e_username"></span></td><td class="row1" style="width: 50%;"><input type="text" name="username" size="30" onkeyup="namegood = false; validateForm();" onblur="checkUsername();" /></td><td class="row1" style="max-width: 24px;"><img alt="Good/bad icon" src="<?php echo scriptPath; ?>/images/bad.gif" id="s_username" /></td></tr>
   368         <div class="tblholder">
   347           <tr><td class="row3" style="width: 50%;" rowspan="2">Password:<span id="e_password"></span></td><td class="row3" style="width: 50%;"><input type="password" name="password" size="30" onkeyup="validateForm();" /></td><td rowspan="2" class="row3" style="max-width: 24px;"><img alt="Good/bad icon" src="<?php echo scriptPath; ?>/images/bad.gif" id="s_password" /></td></tr>
   369           <table border="0" width="100%" cellspacing="1" cellpadding="4">
   348           <tr><td class="row3" style="width: 50%;"><input type="password" name="password_confirm" size="30" onkeyup="validateForm();" /> <small>Enter your password again to confirm.</small></td></tr>
   370             <tr><th class="subhead" colspan="3">Please tell us a little bit about yourself.</th></tr>
   349           <tr><td class="row1" style="width: 50%;">E-mail address:<?php if(getConfig('account_activation')=='user') echo '<br /><small>An e-mail with an account activation key will be sent to this address, so please ensure that it is correct.</small></td>'; ?><td class="row1" style="width: 50%;"><input type="text" name="email" size="30" onkeyup="validateForm();" /></td><td class="row1" style="max-width: 24px;"><img alt="Good/bad icon" src="<?php echo scriptPath; ?>/images/bad.gif" id="s_email" /></td></tr>
   371             <?php if(isset($_POST['submit'])) echo '<tr><td colspan="3" class="row2" style="color: red;">'.$s.'</td></tr>'; ?>
   350           <tr><td class="row3" style="width: 50%;">Real name:<br /><small>Giving your real name is totally optional. If you choose to provide your real name, it will be used to provide attribution for any edits or contributions you may make to this site.</small><td class="row3" style="width: 50%;"><input type="text" name="real_name" size="30" /></td><td class="row3" style="max-width: 24px;"></td></tr>
   372             <tr><td class="row1" style="width: 50%;">Preferred username:<span id="e_username"></span></td><td class="row1" style="width: 50%;"><input type="text" name="username" size="30" onkeyup="namegood = false; validateForm();" onblur="checkUsername();" /></td><td class="row1" style="max-width: 24px;"><img alt="Good/bad icon" src="<?php echo scriptPath; ?>/images/bad.gif" id="s_username" /></td></tr>
   351           <tr><td class="row1" style="width: 50%;" rowspan="2">Visual confirmation<br /><small>Please enter the code shown in the image to the right into the text box. This process helps to ensure that this registration is not being performed by an automated bot. If the image to the right is illegible, you can <a href="#" onclick="regenCaptcha(); return false;">generate a new image</a>.<br /><br />If you are visually impaired or otherwise cannot read the text shown to the right, please contact the site management and they will create an account for you.</small></td><td colspan="2" class="row1"><img id="captchaimg" alt="CAPTCHA image" src="<?php echo makeUrlNS('Special', 'Captcha/'.$captchacode); ?>" /><span id="b_username"></span></td></tr>
   373             <tr><td class="row3" style="width: 50%;" rowspan="2">Password:<span id="e_password"></span></td><td class="row3" style="width: 50%;"><input type="password" name="password" size="30" onkeyup="validateForm();" /></td><td rowspan="2" class="row3" style="max-width: 24px;"><img alt="Good/bad icon" src="<?php echo scriptPath; ?>/images/bad.gif" id="s_password" /></td></tr>
   352           <tr><td class="row1" colspan="2">Code: <input name="captchacode" type="text" size="10" /><input type="hidden" name="captchahash" value="<?php echo $captchacode; ?>" /></td></tr>
   374             <tr><td class="row3" style="width: 50%;"><input type="password" name="password_confirm" size="30" onkeyup="validateForm();" /> <small>Enter your password again to confirm.</small></td></tr>
   353           <tr><td class="row2" colspan="3" style="text-align: center;"><input type="submit" name="submit" value="Create my account" /></td></tr>
   375             <tr><td class="row1" style="width: 50%;"><?php if ( $coppa ) echo 'Your parent or guardian\'s e'; else echo 'E'; ?>-mail address:<?php if(getConfig('account_activation')=='user') echo '<br /><small>An e-mail with an account activation key will be sent to this address, so please ensure that it is correct.</small></td>'; ?><td class="row1" style="width: 50%;"><input type="text" name="email" size="30" onkeyup="validateForm();" /></td><td class="row1" style="max-width: 24px;"><img alt="Good/bad icon" src="<?php echo scriptPath; ?>/images/bad.gif" id="s_email" /></td></tr>
   354         </table>
   376             <tr><td class="row3" style="width: 50%;">Real name:<br /><small>Giving your real name is totally optional. If you choose to provide your real name, it will be used to provide attribution for any edits or contributions you may make to this site.</small><td class="row3" style="width: 50%;"><input type="text" name="real_name" size="30" /></td><td class="row3" style="max-width: 24px;"></td></tr>
   355       </div>
   377             <tr><td class="row1" style="width: 50%;" rowspan="2">Visual confirmation<br /><small>Please enter the code shown in the image to the right into the text box. This process helps to ensure that this registration is not being performed by an automated bot. If the image to the right is illegible, you can <a href="#" onclick="regenCaptcha(); return false;">generate a new image</a>.<br /><br />If you are visually impaired or otherwise cannot read the text shown to the right, please contact the site management and they will create an account for you.</small></td><td colspan="2" class="row1"><img id="captchaimg" alt="CAPTCHA image" src="<?php echo makeUrlNS('Special', 'Captcha/'.$captchacode); ?>" /><span id="b_username"></span></td></tr>
   356     </form>
   378             <tr><td class="row1" colspan="2">Code: <input name="captchacode" type="text" size="10" /><input type="hidden" name="captchahash" value="<?php echo $captchacode; ?>" /></td></tr>
   357     <script type="text/javascript">
   379             <tr><td class="row2" colspan="3" style="text-align: center;"><input type="submit" name="submit" value="Create my account" /></td></tr>
   358       // <![CDATA[
   380           </table>
   359       var namegood = false;
   381         </div>
   360       function validateForm()
   382         <?php
   361       {
   383           $val = ( $coppa ) ? 'yes' : 'no';
   362         var frm = document.forms.regform;
   384           echo '<input type="hidden" name="coppa" value="' . $val . '" />';
   363         failed = false;
   385         ?>
   364         
   386       </form>
   365         // Username
   387       <script type="text/javascript">
   366         if(!namegood)
   388         // <![CDATA[
   367         {
   389         var namegood = false;
   368           if(frm.username.value.match(/^([A-z0-9 \!@\-\(\)]+){2,}$/ig))
   390         function validateForm()
       
   391         {
       
   392           var frm = document.forms.regform;
       
   393           failed = false;
       
   394           
       
   395           // Username
       
   396           if(!namegood)
   369           {
   397           {
   370             document.getElementById('s_username').src='<?php echo scriptPath; ?>/images/unknown.gif';
   398             if(frm.username.value.match(/^([A-z0-9 \!@\-\(\)]+){2,}$/ig))
   371             document.getElementById('e_username').innerHTML = ''; // '<br /><small><b>Checking availability...</b></small>';
   399             {
       
   400               document.getElementById('s_username').src='<?php echo scriptPath; ?>/images/unknown.gif';
       
   401               document.getElementById('e_username').innerHTML = ''; // '<br /><small><b>Checking availability...</b></small>';
       
   402             } else {
       
   403               failed = true;
       
   404               document.getElementById('s_username').src='<?php echo scriptPath; ?>/images/bad.gif';
       
   405               document.getElementById('e_username').innerHTML = '<br /><small>Your username must be at least two characters in length and may contain only alphanumeric characters (A-Z and 0-9), spaces, and the following characters: :, !, @, #, *.</small>';
       
   406             }
       
   407           }
       
   408           document.getElementById('b_username').innerHTML = '';
       
   409           if(hex_md5(frm.real_name.value) == 'fa8e397ae0f6cd5b0f90a3f48178cd7e')
       
   410           {
       
   411             document.getElementById('b_username').innerHTML = '<br /><br />Hey...I know you!<br /><img alt="" src="http://upload.wikimedia.org/wikipedia/commons/thumb/7/7f/Bill_Gates_2004_cr.jpg/220px-Bill_Gates_2004_cr.jpg" />';
       
   412           }
       
   413           
       
   414           // Password
       
   415           if(frm.password.value.match(/^(.+){6,}$/ig) && frm.password_confirm.value.match(/^(.+){6,}$/ig) && frm.password.value == frm.password_confirm.value)
       
   416           {
       
   417             document.getElementById('s_password').src='<?php echo scriptPath; ?>/images/good.gif';
       
   418             document.getElementById('e_password').innerHTML = '<br /><small>The password you entered is valid.</small>';
   372           } else {
   419           } else {
   373             failed = true;
   420             failed = true;
   374             document.getElementById('s_username').src='<?php echo scriptPath; ?>/images/bad.gif';
   421             if(frm.password.value.length < 6)
   375             document.getElementById('e_username').innerHTML = '<br /><small>Your username must be at least two characters in length and may contain only alphanumeric characters (A-Z and 0-9), spaces, and the following characters: :, !, @, #, *.</small>';
   422               document.getElementById('e_password').innerHTML = '<br /><small>Your password must be at least six characters in length.</small>';
       
   423             else if(frm.password.value != frm.password_confirm.value)
       
   424               document.getElementById('e_password').innerHTML = '<br /><small>The passwords you entered do not match.</small>';
       
   425             else
       
   426               document.getElementById('e_password').innerHTML = '';
       
   427             document.getElementById('s_password').src='<?php echo scriptPath; ?>/images/bad.gif';
   376           }
   428           }
   377         }
   429           
   378         document.getElementById('b_username').innerHTML = '';
   430           // E-mail address
   379         if(hex_md5(frm.real_name.value) == 'fa8e397ae0f6cd5b0f90a3f48178cd7e')
   431           if(frm.email.value.match(/^(?:[\w\d]+\.?)+@(?:(?:[\w\d]\-?)+\.)+\w{2,4}$/))
   380         {
       
   381           document.getElementById('b_username').innerHTML = '<br /><br />Hey...I know you!<br /><img alt="" src="http://upload.wikimedia.org/wikipedia/commons/thumb/7/7f/Bill_Gates_2004_cr.jpg/220px-Bill_Gates_2004_cr.jpg" />';
       
   382         }
       
   383         
       
   384         // Password
       
   385         if(frm.password.value.match(/^(.+){6,}$/ig) && frm.password_confirm.value.match(/^(.+){6,}$/ig) && frm.password.value == frm.password_confirm.value)
       
   386         {
       
   387           document.getElementById('s_password').src='<?php echo scriptPath; ?>/images/good.gif';
       
   388           document.getElementById('e_password').innerHTML = '<br /><small>The password you entered is valid.</small>';
       
   389         } else {
       
   390           failed = true;
       
   391           if(frm.password.value.length < 6)
       
   392             document.getElementById('e_password').innerHTML = '<br /><small>Your password must be at least six characters in length.</small>';
       
   393           else if(frm.password.value != frm.password_confirm.value)
       
   394             document.getElementById('e_password').innerHTML = '<br /><small>The passwords you entered do not match.</small>';
       
   395           else
       
   396             document.getElementById('e_password').innerHTML = '';
       
   397           document.getElementById('s_password').src='<?php echo scriptPath; ?>/images/bad.gif';
       
   398         }
       
   399         
       
   400         // E-mail address
       
   401         if(frm.email.value.match(/^(?:[\w\d]+\.?)+@(?:(?:[\w\d]\-?)+\.)+\w{2,4}$/))
       
   402         {
       
   403           document.getElementById('s_email').src='<?php echo scriptPath; ?>/images/good.gif';
       
   404         } else {
       
   405           failed = true;
       
   406           document.getElementById('s_email').src='<?php echo scriptPath; ?>/images/bad.gif';
       
   407         }
       
   408         if(failed)
       
   409         {
       
   410           frm.submit.disabled = 'disabled';
       
   411         } else {
       
   412           frm.submit.disabled = false;
       
   413         }
       
   414       }
       
   415       function checkUsername()
       
   416       {
       
   417         var frm = document.forms.regform;
       
   418         
       
   419         if(!namegood)
       
   420         {
       
   421           if(frm.username.value.match(/^([A-z0-9 \.:\!@\#\*]+){2,}$/ig))
       
   422           {
   432           {
   423             document.getElementById('s_username').src='<?php echo scriptPath; ?>/images/unknown.gif';
   433             document.getElementById('s_email').src='<?php echo scriptPath; ?>/images/good.gif';
   424             document.getElementById('e_username').innerHTML = '';
       
   425           } else {
   434           } else {
   426             document.getElementById('s_username').src='<?php echo scriptPath; ?>/images/bad.gif';
   435             failed = true;
   427             document.getElementById('e_username').innerHTML = '<br /><small>Your username must be at least two characters in length and may contain only alphanumeric characters (A-Z and 0-9), spaces, and the following characters: :, !, @, #, *.</small>';
   436             document.getElementById('s_email').src='<?php echo scriptPath; ?>/images/bad.gif';
   428             return false;
       
   429           }
   437           }
   430         }
   438           if(failed)
   431         
   439           {
   432         document.getElementById('e_username').innerHTML = '<br /><small><b>Checking availability...</b></small>';
   440             frm.submit.disabled = 'disabled';
   433         ajaxGet('<?php echo scriptPath; ?>/ajax.php?title=null&_mode=checkusername&name='+escape(frm.username.value), function() {
   441           } else {
   434           if(ajax.readyState == 4)
   442             frm.submit.disabled = false;
   435             if(ajax.responseText == 'good')
   443           }
       
   444         }
       
   445         function checkUsername()
       
   446         {
       
   447           var frm = document.forms.regform;
       
   448           
       
   449           if(!namegood)
       
   450           {
       
   451             if(frm.username.value.match(/^([A-z0-9 \.:\!@\#\*]+){2,}$/ig))
   436             {
   452             {
   437               document.getElementById('s_username').src='<?php echo scriptPath; ?>/images/good.gif';
   453               document.getElementById('s_username').src='<?php echo scriptPath; ?>/images/unknown.gif';
   438               document.getElementById('e_username').innerHTML = '<br /><small><b>This username is available.</b></small>';
   454               document.getElementById('e_username').innerHTML = '';
   439               namegood = true;
   455             } else {
   440             } else if(ajax.responseText == 'bad') {
       
   441               document.getElementById('s_username').src='<?php echo scriptPath; ?>/images/bad.gif';
   456               document.getElementById('s_username').src='<?php echo scriptPath; ?>/images/bad.gif';
   442               document.getElementById('e_username').innerHTML = '<br /><small><b>Error: that username is already taken.</b></small>';
   457               document.getElementById('e_username').innerHTML = '<br /><small>Your username must be at least two characters in length and may contain only alphanumeric characters (A-Z and 0-9), spaces, and the following characters: :, !, @, #, *.</small>';
   443               namegood = false;
   458               return false;
   444             } else {
       
   445               document.getElementById('e_username').innerHTML = ajax.responseText;
       
   446             }
   459             }
   447         });
   460           }
   448       }
   461           
   449       function regenCaptcha()
   462           document.getElementById('e_username').innerHTML = '<br /><small><b>Checking availability...</b></small>';
   450       {
   463           ajaxGet('<?php echo scriptPath; ?>/ajax.php?title=null&_mode=checkusername&name='+escape(frm.username.value), function() {
   451         var frm = document.forms.regform;
   464             if(ajax.readyState == 4)
   452         document.getElementById('captchaimg').src = '<?php echo makeUrlNS("Special", "Captcha/"); ?>'+frm.captchahash.value+'/'+Math.floor(Math.random() * 100000);
   465               if(ajax.responseText == 'good')
   453         return false;
   466               {
   454       }
   467                 document.getElementById('s_username').src='<?php echo scriptPath; ?>/images/good.gif';
   455       validateForm();
   468                 document.getElementById('e_username').innerHTML = '<br /><small><b>This username is available.</b></small>';
   456       setTimeout('checkUsername();', 1000);
   469                 namegood = true;
   457       // ]]>
   470               } else if(ajax.responseText == 'bad') {
   458     </script>
   471                 document.getElementById('s_username').src='<?php echo scriptPath; ?>/images/bad.gif';
   459   <?php
   472                 document.getElementById('e_username').innerHTML = '<br /><small><b>Error: that username is already taken.</b></small>';
       
   473                 namegood = false;
       
   474               } else {
       
   475                 document.getElementById('e_username').innerHTML = ajax.responseText;
       
   476               }
       
   477           });
       
   478         }
       
   479         function regenCaptcha()
       
   480         {
       
   481           var frm = document.forms.regform;
       
   482           document.getElementById('captchaimg').src = '<?php echo makeUrlNS("Special", "Captcha/"); ?>'+frm.captchahash.value+'/'+Math.floor(Math.random() * 100000);
       
   483           return false;
       
   484         }
       
   485         validateForm();
       
   486         setTimeout('checkUsername();', 1000);
       
   487         // ]]>
       
   488       </script>
       
   489     <?php
       
   490   }
       
   491   else
       
   492   {
       
   493     $year = intval( date('Y') );
       
   494     $year = $year - 13;
       
   495     $month = date('F');
       
   496     $day = date('d');
       
   497     
       
   498     $yo13_date = "$month $day, $year";
       
   499     $link_coppa_yes = makeUrlNS('Special', 'Register', 'coppa=yes', true);
       
   500     $link_coppa_no  = makeUrlNS('Special', 'Register', 'coppa=no',  true);
       
   501     
       
   502     // COPPA enabled, ask age
       
   503     echo '<div class="tblholder">';
       
   504     echo '<table border="0" cellspacing="1" cellpadding="4">';
       
   505     echo '<tr>
       
   506             <td class="row1">
       
   507               Before you can register, please tell us your age.
       
   508             </td>
       
   509           </tr>
       
   510           <tr>
       
   511             <td class="row3">
       
   512               <a href="' . $link_coppa_no  . '">I was born <b>on or before</b> ' . $yo13_date . ' and am <b>at least</b> 13 years of age</a><br />
       
   513               <a href="' . $link_coppa_yes . '">I was born <b>after</b> ' . $yo13_date . ' and am <b>less than</b> 13 years of age</a>
       
   514             </td>
       
   515           </tr>';
       
   516     echo '</table>';
       
   517     echo '</div>';
       
   518   }
   460   $template->footer();
   519   $template->footer();
   461 }
   520 }
   462 
   521 
   463 /*
   522 /*
   464 If you want the old preferences page back, be my guest.
   523 If you want the old preferences page back, be my guest.