Index: /trunk/bin/module_maker/module.cli.php
===================================================================
--- /trunk/bin/module_maker/module.cli.php	(revision 24)
+++ /trunk/bin/module_maker/module.cli.php	(revision 25)
@@ -9,5 +9,5 @@
 
 $op = null;
-$valid_ops = array('clean', 'var');
+$valid_ops = array('clean', 'var', 'test');
 
 // Test for a single argument.
@@ -40,4 +40,13 @@
     }
 }
+
+switch ($op) {
+case 'test' :
+    echo "RUNNING MODULE MAKER IN TEST MODE.\n\n";
+    break;
+default :
+    
+}
+
 
 /******************************************************************************
@@ -453,7 +462,9 @@
 } else {
     echo "Writing admin script: $admin_dir/$admin_script\n";
-    $fp = fopen("$admin_dir/$admin_script", "w");
-    fwrite($fp, preg_replace($search, $replace, $skel_files['skel_admin_script']));
-    fclose($fp);
+    if ('test' != $op) {
+        $fp = fopen("$admin_dir/$admin_script", "w");
+        fwrite($fp, preg_replace($search, $replace, $skel_files['skel_admin_script']));
+        fclose($fp);
+    }
 }
 
@@ -463,7 +474,9 @@
 } else {
     echo "Writing admin list template: $admin_tpl_dir/$admin_list_template\n";
-    $fp = fopen("$admin_tpl_dir/$admin_list_template", "w");
-    fwrite($fp, preg_replace($search, $replace, $skel_files['skel_admin_list_template']));
-    fclose($fp);
+    if ('test' != $op) {
+        $fp = fopen("$admin_tpl_dir/$admin_list_template", "w");
+        fwrite($fp, preg_replace($search, $replace, $skel_files['skel_admin_list_template']));
+        fclose($fp);
+    }
 }
 
@@ -473,7 +486,9 @@
 } else {
     echo "Writing admin form template: $admin_tpl_dir/$admin_form_template\n";
-    $fp = fopen("$admin_tpl_dir/$admin_form_template", "w");
-    fwrite($fp, preg_replace($search, $replace, $skel_files['skel_admin_form_template']));
-    fclose($fp);
+    if ('test' != $op) {
+        $fp = fopen("$admin_tpl_dir/$admin_form_template", "w");
+        fwrite($fp, preg_replace($search, $replace, $skel_files['skel_admin_form_template']));
+        fclose($fp);
+    }
 }
 
@@ -483,7 +498,9 @@
 } else {
     echo "Writing public script: $public_dir/$public_script\n";
-    $fp = fopen("$public_dir/$public_script", "w");
-    fwrite($fp, preg_replace($search, $replace, $skel_files['skel_public_script']));
-    fclose($fp);
+    if ('test' != $op) {
+        $fp = fopen("$public_dir/$public_script", "w");
+        fwrite($fp, preg_replace($search, $replace, $skel_files['skel_public_script']));
+        fclose($fp);
+    }
 }
 
@@ -493,7 +510,9 @@
 } else {
     echo "Writing public list template: $public_tpl_dir/$public_list_template\n";
-    $fp = fopen("$public_tpl_dir/$public_list_template", "w");
-    fwrite($fp, preg_replace($search, $replace, $skel_files['skel_public_list_template']));
-    fclose($fp);
+    if ('test' != $op) {
+        $fp = fopen("$public_tpl_dir/$public_list_template", "w");
+        fwrite($fp, preg_replace($search, $replace, $skel_files['skel_public_list_template']));
+        fclose($fp);
+    }
 }
 
@@ -503,7 +522,9 @@
 } else {
     echo "Writing public detail template: $public_tpl_dir/$public_detail_template\n";
-    $fp = fopen("$public_tpl_dir/$public_detail_template", "w");
-    fwrite($fp, preg_replace($search, $replace, $skel_files['skel_public_detail_template']));
-    fclose($fp);
+    if ('test' != $op) {
+        $fp = fopen("$public_tpl_dir/$public_detail_template", "w");
+        fwrite($fp, preg_replace($search, $replace, $skel_files['skel_public_detail_template']));
+        fclose($fp);
+    }
 }
 
Index: unk/css/depreciated.inc.css
===================================================================
--- /trunk/css/depreciated.inc.css	(revision 24)
+++ 	(revision )
@@ -1,68 +1,0 @@
-/**
- * depreciated.css 
- * code by strangecode :: www.strangecode.com :: this document contains copyrighted information
- *
- * CSS used in older codebase templates. These should never be used for new sites.
- */
-
-/*_____________________ BASE ____________________*/
-body
-{
-	background: #fff;
-	color: #000;
-}
-
-/*_____________________ FORMS ____________________*/
-.formlabel
-{
-	color: #000;
-	max-width: 20em;
-	padding: 7px 0px 0px 0px;
-	font-size: 70%;
-	font-weight: bold;
-}
-
-.formtext
-{
-	color: #000;
-	font-size: 70%;
-}
-
-.formcheckboxes /* td */
-{
-	font-size: 70%;
-	line-height: 90%;
-	white-space: nowrap;
-}
-
-.formselect
-{
-	color: #000;
-	font-size: 70%;
-	margin: 0px;
-	padding: 0px;
-}
-
-.formtextarea
-{
-	color: #000;
-	font-size: 70%;
-	margin: 0px;
-	padding: 0px;
-}
-
-.forminputtext
-{
-	color: #000;
-	font-size: 70%;
-	margin: 0px;
-	padding: 0px;
-}
-
-.formsubmitbutton
-{
-	font-size: 70%;
-	font-weight: bold;
-	color: #000;
-	margin: 1px;
-}
Index: /trunk/css/utilities.inc.css
===================================================================
--- /trunk/css/utilities.inc.css	(revision 24)
+++ /trunk/css/utilities.inc.css	(revision 25)
@@ -11,5 +11,8 @@
 /* BEAU: I format my CSS using BBEdit's Markup->CSS->Format command. Would you like to use that as well so our code looks consistant? */
 /*_____________________ FORMS ____________________*/
-input, select, input.submit
+
+/* BEAU: Had to comment-out all generic definitions... They fucked golbon. I guess the only things to have that are safe are custom class identifiers. Maybe we should standardize on classes we define in the codebase so they never conflict with other people's css, like: codebase_small, or cb_small? */
+/*
+input, select, submit
 {
 	color: #000;
@@ -18,24 +21,29 @@
 }
 
-/* BEAU: I changed this to input.submit, since it is an <input> tag. Is that correct? It definition doesn't seem to do anything regardless of how it's set. */
-input.submit
+submit
 {
 	font-weight: bold;
 	margin: 0.5em;
 }
+*/
 
-input
-{
-	margin: 0.5em 0.5em 0 0;
-}
-
+/*
 form table select, form table input
 {
 	margin-top: 0;
 }
+*/
 
 /* 
-BEAU: I want more text box widths! I find need for boxes that fit 5em, 10em, 20em, and 40em widths. These should be in EMs so text can resize and still fit. Since it is useful to apply a width to other form elements to have them similar sizes (not always a text box, such as <select multiple>) I propose renaming them to "input.tiny", "input.small", "input.medium", "input.large", and "input.half" (not sure how you would do "half" in EMs however.
+BEAU: I want more text box widths! I find need for boxes that fit 5em, 10em, 20em, and 40em widths. These should be in EMs so text can resize and still fit. Since it is useful to apply a width to other form elements to have them similar sizes (not always a text box, such as <select multiple>) I propose renaming them to "input.tiny", "input.small", "input.medium", "input.large", and "input.half" (not sure how you would do "half" in EMs however. DONE.
 */
+
+input.tiny, textarea.tiny, select.tiny,
+input.small, textarea.small, select.small,
+input.medium, textarea.medium, select.medium,
+input.large, textarea.large, select.large
+{
+	margin: 0 0.5em 0 0;
+}
 
 input.tiny, textarea.tiny, select.tiny
@@ -90,4 +98,5 @@
 }
 
+/*
 form label
 {
@@ -95,7 +104,12 @@
 	font-weight: bold;
 }
+*/
 
-/* BEAU: We need a .formtext substitute...something like a label tag but not bold! */
+/* BEAU: We need a .formtext substitute...something like a label tag but not bold! Maybe use "form p { }"? */
+
+
 /*_____________________ COMMANDS ____________________*/
+
+/* Should this be an ID??? */
 #commandbox
 {
Index: /trunk/lib/Auth_SQL.inc.php
===================================================================
--- /trunk/lib/Auth_SQL.inc.php	(revision 24)
+++ /trunk/lib/Auth_SQL.inc.php	(revision 25)
@@ -41,5 +41,5 @@
         'encryption_type' => AUTH_ENCRYPT_MD5,
 
-        // The URL the user will be directed if unsuccessfully calling requireLogin.
+        // The URL to the login script.
         'login_url' => '/',
 
@@ -303,5 +303,5 @@
             SELECT *, " . $this->_params['db_primary_key'] . " AS user_id 
             FROM " . $this->_params['db_table'] . "
-            WHERE BINARY " . $this->_params['db_username_column'] . " = '" . addslashes($username) . "'
+            WHERE " . $this->_params['db_username_column'] . " = '" . addslashes($username) . "'
             AND BINARY userpass = '" . addslashes($this->encryptPassword($password)) . "'
         ");
Index: /trunk/lib/CSS.inc.php
===================================================================
--- /trunk/lib/CSS.inc.php	(revision 24)
+++ /trunk/lib/CSS.inc.php	(revision 25)
@@ -8,4 +8,6 @@
  * @author  Quinn Comendant <quinn@strangecode.com>
  * @version 1.1
+ * TODO: set different css files attached to an app with /css.php?app=name
+ * TODO: 
  */
 class CSS {
Index: /trunk/lib/Email.inc.php
===================================================================
--- /trunk/lib/Email.inc.php	(revision 24)
+++ /trunk/lib/Email.inc.php	(revision 25)
@@ -73,5 +73,7 @@
         . '(?:|\s*|\s+\([^,@]+\)\s*))$/i'));                            // FALSE ensure there is no ending >
 
-        $this->setParam($params);
+        if (isset($params)) {
+            $this->setParam($params);
+        }
     }
 
Index: /trunk/lib/Nav.inc.php
===================================================================
--- /trunk/lib/Nav.inc.php	(revision 24)
+++ /trunk/lib/Nav.inc.php	(revision 25)
@@ -72,15 +72,11 @@
     function setFeature($features=null, $page_id=null)
     {
-        if (!isset($page_id)) {
-            $page_id = sizeof($this->pages) - 1;
-        } else if ($page_id < 0 && is_numeric($page_id)) {
-            $page_id = sizeof($this->pages) + intval($page_id);
-        }
-        
-        if (isset($features) && is_array($features)) {
+        $page_id = $this->_calculatePageID($page_id);
+        
+        if (isset($features) && is_array($features) && isset($this->pages[sizeof($this->pages)-1]['features']) && is_array($this->pages[sizeof($this->pages)-1]['features'])) {
             // Set features for specified page.
             $this->pages[sizeof($this->pages)-1]['features'] = array_merge($this->pages[sizeof($this->pages)-1]['features'], $features);
-            // Store "current page" features.
-            $this->pages[$page_id]['features'] = array_merge($this->pages[$page_id]['features'], $features);
+            // TODO: Store "current page" features.
+//             $this->pages[$page_id]['features'] = array_merge($this->pages[$page_id]['features'], $features);
         }
     }
@@ -111,9 +107,5 @@
     function getFeature($feature, $page_id=null, $default=null)
     {
-        if (!isset($page_id)) {
-            $page_id = sizeof($this->pages) - 1;
-        } else if ($page_id < 0 && is_numeric($page_id)) {
-            $page_id = sizeof($this->pages) + intval($page_id);
-        }
+        $page_id = $this->_calculatePageID($page_id);
         
         if (isset($this->pages[$page_id]['features'][$feature])) {
@@ -141,12 +133,8 @@
     function getTitle($page_id=null)
     {
-        if (!isset($page_id)) {
-            $page_id = sizeof($this->pages) - 1;
-        } else if ($page_id < 0 && is_numeric($page_id)) {
-            $page_id = sizeof($this->pages) + intval($page_id);
-        }
+        $page_id = $this->_calculatePageID($page_id);
         
         if ($this->getFeature('title', $page_id)) {
-            return oTxt($this->pages[$page_id]['title']);
+            return oTxt($this->pages[$page_id]['title'], true);
         } else {
             return false;
@@ -174,9 +162,5 @@
     function getPath($page_id=null)
     {
-        if (!isset($page_id)) {
-            $page_id = sizeof($this->pages) - 1;
-        } else if ($page_id < 0 && is_numeric($page_id)) {
-            $page_id = sizeof($this->pages) + intval($page_id);
-        }
+        $page_id = $this->_calculatePageID($page_id);
         
         if ($this->getFeature('path', $page_id)) {
@@ -217,9 +201,5 @@
     function getBreadcrumbs($page_id=null)
     {
-        if (!isset($page_id)) {
-            $page_id = sizeof($this->pages) - 1;
-        } else if ($page_id < 0 && is_numeric($page_id)) {
-            $page_id = sizeof($this->pages) + intval($page_id);
-        }
+        $page_id = $this->_calculatePageID($page_id);
         
         if ($this->getFeature('breadcrumbs')) {
@@ -293,4 +273,21 @@
     }
     
+    /**
+     * Returns the ID of the current page, or the adjusted ID for a given page ID.
+     *
+     * @access  private
+     * @return  string  The value of the current page id.
+     */
+    function _calculatePageID($page_id=null)
+    {
+        if (!isset($page_id)) {
+            return sizeof($this->pages) - 1;
+        } else if ($page_id < 0 && is_numeric($page_id)) {
+            return sizeof($this->pages) + intval($page_id);
+        } else {
+            return $page_id;
+        }
+    }
+    
 } 
 // End of class.
Index: /trunk/lib/Upload.inc.php
===================================================================
--- /trunk/lib/Upload.inc.php	(revision 24)
+++ /trunk/lib/Upload.inc.php	(revision 25)
@@ -39,178 +39,178 @@
     // Array of file name extensions and corresponding mime-types.
     var $mime_extension_map = array(
-        'Z'       => 'application/x-compress',
-        'ai'      => 'application/postscript',
-        'aif'     => 'audio/x-aiff',
-        'aifc'    => 'audio/x-aiff',
-        'aiff'    => 'audio/x-aiff',
-        'asc'     => 'text/plain',
-        'asf'     => 'video/x-ms-asf',
-        'asx'     => 'video/x-ms-asf',
-        'au'      => 'audio/basic',
-        'avi'     => 'video/x-msvideo',
-        'bcpio'   => 'application/x-bcpio',
+        'ez'      => 'application/andrew-inset',
+        'hqx'     => 'application/mac-binhex40',
+        'cpt'     => 'application/mac-compactpro',
+        'doc'     => 'application/msword',
         'bin'     => 'application/octet-stream',
-        'bmp'     => 'image/bmp',
-        'cdf'     => 'application/x-netcdf',
         'class'   => 'application/octet-stream',
-        'cpio'    => 'application/x-cpio',
-        'cpt'     => 'application/mac-compactpro',
-        'csh'     => 'application/x-csh',
-        'css'     => 'text/css',
-        'dcr'     => 'application/x-director',
-        'diff'    => 'text/diff',
-        'dir'     => 'application/x-director',
         'dll'     => 'application/octet-stream',
         'dms'     => 'application/octet-stream',
-        'doc'     => 'application/msword',
+        'exe'     => 'application/octet-stream',
+        'lha'     => 'application/octet-stream',
+        'lzh'     => 'application/octet-stream',
+        'so'      => 'application/octet-stream',
+        'oda'     => 'application/oda',
+        'pdf'     => 'application/pdf',
+        'ps'      => 'application/postscript',
+        'eps'     => 'application/postscript',
+        'ai'      => 'application/postscript',
+        'smi'     => 'application/smil',
+        'smil'    => 'application/smil',
+        'mif'     => 'application/vnd.mif',
+        'xls'     => 'application/vnd.ms-excel',
+        'ppt'     => 'application/vnd.ms-powerpoint',
+        'stc'     => 'application/vnd.sun.xml.calc.template',
+        'sxc'     => 'application/vnd.sun.xml.calc',
+        'std'     => 'application/vnd.sun.xml.draw.template',
+        'sxd'     => 'application/vnd.sun.xml.draw',
+        'sti'     => 'application/vnd.sun.xml.impress.template',
+        'sxi'     => 'application/vnd.sun.xml.impress',
+        'sxm'     => 'application/vnd.sun.xml.math',
+        'sxg'     => 'application/vnd.sun.xml.writer.global',
+        'stw'     => 'application/vnd.sun.xml.writer.template',
+        'sxw'     => 'application/vnd.sun.xml.writer',
+        'vsd'     => 'application/vnd.visio',
+        'wbxml'   => 'application/vnd.wap.wbxml',
+        'wmlc'    => 'application/vnd.wap.wmlc',
+        'wmlsc'   => 'application/vnd.wap.wmlscriptc',
+        'bcpio'   => 'application/x-bcpio',
+        'vcd'     => 'application/x-cdlink',
+        'pgn'     => 'application/x-chess-pgn',
+        'Z'       => 'application/x-compress',
+        'cpio'    => 'application/x-cpio',
+        'csh'     => 'application/x-csh',
+        'dcr'     => 'application/x-director',
+        'dir'     => 'application/x-director',
+        'dxr'     => 'application/x-director',
         'dvi'     => 'application/x-dvi',
-        'dxr'     => 'application/x-director',
-        'eps'     => 'application/postscript',
-        'etx'     => 'text/x-setext',
-        'exe'     => 'application/octet-stream',
-        'ez'      => 'application/andrew-inset',
-        'gif'     => 'image/gif',
+        'spl'     => 'application/x-futuresplash',
         'gtar'    => 'application/x-gtar',
+        'tgz'     => 'application/x-gtar',
         'gz'      => 'application/x-gzip',
         'hdf'     => 'application/x-hdf',
-        'hqx'     => 'application/mac-binhex40',
-        'htm'     => 'text/html',
-        'html'    => 'text/html',
-        'ice'     => 'x-conference/x-cooltalk',
-        'ics'     => 'text/calendar',
-        'ief'     => 'image/ief',
-        'ifb'     => 'text/calendar',
-        'iges'    => 'model/iges',
-        'igs'     => 'model/iges',
-        'jpe'     => 'image/jpeg',
-        'jpeg'    => 'image/jpeg',
-        'jpg'     => 'image/jpeg',
+        'php3'    => 'application/x-httpd-php3',
+        'php'     => 'application/x-httpd-php',
         'js'      => 'application/x-javascript',
-        'kar'     => 'audio/midi',
-        'latex'   => 'application/x-latex',
-        'lha'     => 'application/octet-stream',
-        'log'     => 'text/plain',
-        'lzh'     => 'application/octet-stream',
-        'm3u'     => 'audio/x-mpegurl',
-        'man'     => 'application/x-troff-man',
-        'me'      => 'application/x-troff-me',
-        'mesh'    => 'model/mesh',
-        'mid'     => 'audio/midi',
-        'midi'    => 'audio/midi',
-        'mif'     => 'application/vnd.mif',
-        'mov'     => 'video/quicktime',
-        'movie'   => 'video/x-sgi-movie',
-        'mp2'     => 'audio/mpeg',
-        'mp3'     => 'audio/mpeg',
-        'mpe'     => 'video/mpeg',
-        'mpeg'    => 'video/mpeg',
-        'mpg'     => 'video/mpeg',
-        'mpga'    => 'audio/mpeg',
-        'ms'      => 'application/x-troff-ms',
-        'msh'     => 'model/mesh',
-        'mxu'     => 'video/vnd.mpegurl',
-        'nc'      => 'application/x-netcdf',
-        'oda'     => 'application/oda',
-        'patch'   => 'text/diff',
-        'pbm'     => 'image/x-portable-bitmap',
-        'pdb'     => 'chemical/x-pdb',
-        'pdf'     => 'application/pdf',
-        'pgm'     => 'image/x-portable-graymap',
-        'pgn'     => 'application/x-chess-pgn',
-        'php'     => 'application/x-httpd-php',
-        'php3'    => 'application/x-httpd-php3',
-        'pl'      => 'application/x-perl',
-        'pm'      => 'application/x-perl',
-        'png'     => 'image/png',
-        'pnm'     => 'image/x-portable-anymap',
-        'po'      => 'text/plain',
-        'ppm'     => 'image/x-portable-pixmap',
-        'ppt'     => 'application/vnd.ms-powerpoint',
-        'ps'      => 'application/postscript',
-        'qt'      => 'video/quicktime',
-        'ra'      => 'audio/x-realaudio',
-        'ram'     => 'audio/x-pn-realaudio',
-        'ras'     => 'image/x-cmu-raster',
-        'rgb'     => 'image/x-rgb',
-        'rm'      => 'audio/x-pn-realaudio',
-        'roff'    => 'application/x-troff',
-        'rpm'     => 'audio/x-pn-realaudio-plugin',
-        'rtf'     => 'text/rtf',
-        'rtx'     => 'text/richtext',
-        'sgm'     => 'text/sgml',
-        'sgml'    => 'text/sgml',
-        'sh'      => 'application/x-sh',
-        'shar'    => 'application/x-shar',
-        'shtml'   => 'text/html',
-        'silo'    => 'model/mesh',
-        'sit'     => 'application/x-stuffit',
         'skd'     => 'application/x-koan',
         'skm'     => 'application/x-koan',
         'skp'     => 'application/x-koan',
         'skt'     => 'application/x-koan',
-        'smi'     => 'application/smil',
-        'smil'    => 'application/smil',
-        'snd'     => 'audio/basic',
-        'so'      => 'application/octet-stream',
-        'spl'     => 'application/x-futuresplash',
-        'src'     => 'application/x-wais-source',
-        'stc'     => 'application/vnd.sun.xml.calc.template',
-        'std'     => 'application/vnd.sun.xml.draw.template',
-        'sti'     => 'application/vnd.sun.xml.impress.template',
-        'stw'     => 'application/vnd.sun.xml.writer.template',
+        'latex'   => 'application/x-latex',
+        'wmd'     => 'application/x-ms-wmd',
+        'wmz'     => 'application/x-ms-wmz',
+        'cdf'     => 'application/x-netcdf',
+        'nc'      => 'application/x-netcdf',
+        'pl'      => 'application/x-perl',
+        'pm'      => 'application/x-perl',
+        'shar'    => 'application/x-shar',
+        'swf'     => 'application/x-shockwave-flash',
+        'sh'      => 'application/x-sh',
+        'sit'     => 'application/x-stuffit',
         'sv4cpio' => 'application/x-sv4cpio',
         'sv4crc'  => 'application/x-sv4crc',
-        'swf'     => 'application/x-shockwave-flash',
-        'sxc'     => 'application/vnd.sun.xml.calc',
-        'sxd'     => 'application/vnd.sun.xml.draw',
-        'sxg'     => 'application/vnd.sun.xml.writer.global',
-        'sxi'     => 'application/vnd.sun.xml.impress',
-        'sxm'     => 'application/vnd.sun.xml.math',
-        'sxw'     => 'application/vnd.sun.xml.writer',
-        't'       => 'application/x-troff',
         'tar'     => 'application/x-tar',
         'tcl'     => 'application/x-tcl',
-        'tex'     => 'application/x-tex',
         'texi'    => 'application/x-texinfo',
         'texinfo' => 'application/x-texinfo',
-        'tgz'     => 'application/x-gtar',
+        'tex'     => 'application/x-tex',
+        'man'     => 'application/x-troff-man',
+        'me'      => 'application/x-troff-me',
+        'ms'      => 'application/x-troff-ms',
+        'roff'    => 'application/x-troff',
+        't'       => 'application/x-troff',
+        'tr'      => 'application/x-troff',
+        'ustar'   => 'application/x-ustar',
+        'src'     => 'application/x-wais-source',
+        'xhtml'   => 'application/xhtml+xml',
+        'xht'     => 'application/xhtml+xml',
+        'xml'     => 'application/xml',
+        'zip'     => 'application/zip',
+        'au'      => 'audio/basic',
+        'snd'     => 'audio/basic',
+        'kar'     => 'audio/midi',
+        'mid'     => 'audio/midi',
+        'midi'    => 'audio/midi',
+        'mp3'     => 'audio/mpeg',
+        'mp2'     => 'audio/mpeg',
+        'mpga'    => 'audio/mpeg',
+        'aiff'    => 'audio/x-aiff',
+        'aif'     => 'audio/x-aiff',
+        'aifc'    => 'audio/x-aiff',
+        'm3u'     => 'audio/x-mpegurl',
+        'wax'     => 'audio/x-ms-wax',
+        'wma'     => 'audio/x-ms-wma',
+        'rpm'     => 'audio/x-pn-realaudio-plugin',
+        'ram'     => 'audio/x-pn-realaudio',
+        'rm'      => 'audio/x-pn-realaudio',
+        'ra'      => 'audio/x-realaudio',
+        'wav'     => 'audio/x-wav',
+        'pdb'     => 'chemical/x-pdb',
+        'xyz'     => 'chemical/x-xyz',
+        'bmp'     => 'image/bmp',
+        'gif'     => 'image/gif',
+        'ief'     => 'image/ief',
+        'jpg'     => 'image/jpeg',
+        'jpe'     => 'image/jpeg',
+        'jpeg'    => 'image/jpeg',
+        'png'     => 'image/png',
         'tif'     => 'image/tiff',
         'tiff'    => 'image/tiff',
-        'tr'      => 'application/x-troff',
-        'tsv'     => 'text/tab-separated-values',
-        'txt'     => 'text/plain',
-        'ustar'   => 'application/x-ustar',
-        'vcd'     => 'application/x-cdlink',
-        'vcf'     => 'text/x-vcard',
+        'wbmp'    => 'image/vnd.wap.wbmp',
+        'ras'     => 'image/x-cmu-raster',
+        'pnm'     => 'image/x-portable-anymap',
+        'pbm'     => 'image/x-portable-bitmap',
+        'pgm'     => 'image/x-portable-graymap',
+        'ppm'     => 'image/x-portable-pixmap',
+        'rgb'     => 'image/x-rgb',
+        'xbm'     => 'image/x-xbitmap',
+        'xpm'     => 'image/x-xpixmap',
+        'xwd'     => 'image/x-xwindowdump',
+        'iges'    => 'model/iges',
+        'igs'     => 'model/iges',
+        'mesh'    => 'model/mesh',
+        'msh'     => 'model/mesh',
+        'silo'    => 'model/mesh',
+        'vrml'    => 'model/vrml',
+        'wrl'     => 'model/vrml',
+        'ics'     => 'text/calendar',
+        'ifb'     => 'text/calendar',
         'vcs'     => 'text/calendar',
         'vfb'     => 'text/calendar',
-        'vrml'    => 'model/vrml',
-        'vsd'     => 'application/vnd.visio',
-        'wav'     => 'audio/x-wav',
-        'wax'     => 'audio/x-ms-wax',
-        'wbmp'    => 'image/vnd.wap.wbmp',
-        'wbxml'   => 'application/vnd.wap.wbxml',
+        'css'     => 'text/css',
+        'diff'    => 'text/diff',
+        'patch'   => 'text/diff',
+        'html'    => 'text/html',
+        'htm'     => 'text/html',
+        'shtml'   => 'text/html',
+        'txt'     => 'text/plain',
+        'asc'     => 'text/plain',
+        'log'     => 'text/plain',
+        'po'      => 'text/plain',
+        'rtx'     => 'text/richtext',
+        'rtf'     => 'text/rtf',
+        'sgm'     => 'text/sgml',
+        'sgml'    => 'text/sgml',
+        'tsv'     => 'text/tab-separated-values',
+        'wmls'    => 'text/vnd.wap.wmlscript',
+        'wml'     => 'text/vnd.wap.wml',
+        'etx'     => 'text/x-setext',
+        'vcf'     => 'text/x-vcard',
+        'xsl'     => 'text/xml',
+        'mpeg'    => 'video/mpeg',
+        'mpe'     => 'video/mpeg',
+        'mpg'     => 'video/mpeg',
+        'mov'     => 'video/quicktime',
+        'qt'      => 'video/quicktime',
+        'mxu'     => 'video/vnd.mpegurl',
+        'asf'     => 'video/x-ms-asf',
+        'asx'     => 'video/x-ms-asf',
+        'wmv'     => 'video/x-ms-wmv',
         'wm'      => 'video/x-ms-wm',
-        'wma'     => 'audio/x-ms-wma',
-        'wmd'     => 'application/x-ms-wmd',
-        'wml'     => 'text/vnd.wap.wml',
-        'wmlc'    => 'application/vnd.wap.wmlc',
-        'wmls'    => 'text/vnd.wap.wmlscript',
-        'wmlsc'   => 'application/vnd.wap.wmlscriptc',
-        'wmv'     => 'video/x-ms-wmv',
         'wmx'     => 'video/x-ms-wmx',
-        'wmz'     => 'application/x-ms-wmz',
-        'wrl'     => 'model/vrml',
         'wvx'     => 'video/x-ms-wvx',
-        'xbm'     => 'image/x-xbitmap',
-        'xht'     => 'application/xhtml+xml',
-        'xhtml'   => 'application/xhtml+xml',
-        'xls'     => 'application/vnd.ms-excel',
-        'xml'     => 'application/xml',
-        'xpm'     => 'image/x-xpixmap',
-        'xsl'     => 'text/xml',
-        'xwd'     => 'image/x-xwindowdump',
-        'xyz'     => 'chemical/x-xyz',
-        'zip'     => 'application/zip'
+        'avi'     => 'video/x-msvideo',
+        'movie'   => 'video/x-sgi-movie',
+        'ice'     => 'x-conference/x-cooltalk',
     );
     
Index: /trunk/services/admins.php
===================================================================
--- /trunk/services/admins.php	(revision 24)
+++ /trunk/services/admins.php	(revision 25)
@@ -297,4 +297,5 @@
         'modified_datetime' => '0000-00-00 00:00:00',
         'new_op' => 'update',
+        'old_username' => $frm['username'],
         'submit_buttons' => array(
             'submit' => _("Save changes"),
Index: /trunk/tests/FormValidatorTest.php
===================================================================
--- /trunk/tests/FormValidatorTest.php	(revision 24)
+++ /trunk/tests/FormValidatorTest.php	(revision 25)
@@ -23,5 +23,5 @@
         require dirname(__FILE__) . '/_config.inc.php';
         require_once '../lib/FormValidator.inc.php';
-        $this->FormValidator =& new FormValidator(PARAM);
+        $this->FormValidator =& new FormValidator();
     }
 
Index: /trunk/tests/_email_test_addresses.txt
===================================================================
--- /trunk/tests/_email_test_addresses.txt	(revision 25)
+++ /trunk/tests/_email_test_addresses.txt	(revision 25)
@@ -0,0 +1,88 @@
+ asdf@domain.com
+Bob Smith asdf@domain.com
+Bob Smith <asdf@domain.com>
+"Bob Smith" asdf@domain.com
+"Bob Smith"a sldkf &D*&F^*&^# @#*$ @#* asdf@domain.com
+ "white space" <asdf@domain.com> 
+ whitespace@domain.com 
+asdf@domain.com (hello donkey)
+<asdf@domain.com>
+asdf@domain.com
+asdf@domain4.com
+asdf@[011.0.0.100]
+asdf@[1.0.0.0]
+asdf&asdf@domain.com
+Fred\ Bloggs@example.com
+Joe.\\Blow@example.com
+user+mailbox@example.com
+customer/department=shipping@example.com
+$A12345@example.com
+!def!xyz%abc@example.com
+_somename@example.com
+cthornhill_94%1@yahoo.com
+    "bob!#$%&'*+-/=?^_`.{|}~rice@domain.com",
+müllér@domain.com
+sarah.adams.2008@femba.ucla.edu
+dig@whap.heck.suddenly.willy.sam.digity.okay.com.org
+kathryn.p.o\'fee@gsk.com
+stephen.j.o\'quinn@gsk.com
+Wallace.v.cunneen@gsk.com
+myrada.a.carpenter@gsk.com
+caro=los.mccumber@tap.com
+$%^%JidO_kdoe*&&2@lkd.vfg
+asdf@[011.00.100]
+asdf@[011.1234.0.100]
+asdf@[011.0.234.0.100]
+asdf@011.0.0.100]
+asdf@[011.0.0.100
+asdf@011.0.0.100
+asdf@domain4.co-mm
+asdf@4domain.com
+asdf@-domain.com
+asdf@dom_ain.com
+asdf@domain-.com
+asdf@-.com
+asdf@asdf--asdf.com
+asdf@asdfas.asdf--asdf.asdfs.com
+myrada.a.carpenter@g.sk..com
+< asdf@domain.com>
+<asdf@domain.com >
+asdf@domain.com>
+<asdf@domain.com
+asdf@domain.com (hello donkey
+"Abc@def"@example.com
+"Fred Bloggs"@example.com
+Abc\@def@example.com
+myrada.a.carpenter@gsk.museums
+"asdf"@domain.com
+asdf[asdf@asdf.com
+asdf\'"+)*#%@^!asdf@asdf.com
+Barbara.gonzalez@
+bnutt-spectrumsales.net
+catherine.algra.2008.anderson.ucla.edu
+cheryl.a.mcguirk
+david.zipse@cgu,edu
+davidzipse@cgu,edu
+deanna.t.lapierre@@wellsfargo.com
+freda@freda\'s.com
+get1@pge,com
+john.lamb.ngc.com
+jslinger@saturnoftroy
+kellywatts@saturnof
+kent.plummer@Solvay
+lakshmi.thirumalai.2007@anderson.
+nraymon@hoaghospital
+.bob@domain.com
+bobrice..@domain.com
+bob..rice@domain.com
+usernameistoolongusernameistoolongusernameistoolongusernameistoolongusernameis@domain.com
+domainistoolong@domainistoolong.domainistoolong.domainistoolong.domainistoolong.domainistoolong.domainistoolong.domainistoolong.domainistoolong.domainistoolong.domainistoolong.domainistoolong.domainistoolong.domainistoolong.domainistoolong.domainistoolong.domainistoolong.domainistoolong.domainistoolong.com
+<ken@mail.mpundzu.com>
+<lisah@specialtycare4women.com>
+<jknolle@learningchange.com>
+<cd@monstro.com>
+<spoofing@monstro.com>
+lanebecker@gmail.com
+<fabio@monstro.com>
+neville@dynamiccity.org
+<mtbcsc-spamsubmit@jayallen.org>
Index: /trunk/tests/_skel.php
===================================================================
--- /trunk/tests/_skel.php	(revision 25)
+++ /trunk/tests/_skel.php	(revision 25)
@@ -0,0 +1,59 @@
+#!/usr/local/bin/php
+<?php
+/**
+ * Creates new test case file from specified class file.
+ *
+ * @access  public
+ * @param   Only argument is path to file containing class.
+ * @author  Quinn Comendant <quinn@strangecode.com>
+ * @since   01 Dec 2005 13:56:09
+ */
+require_once 'PHPUnit/Skeleton.php';
+
+$dir = dirname(__FILE__) . '/../lib';
+
+if ($_SERVER['argc'] == 2 && file_exists($dir . '/' . $_SERVER['argv'][1])) {
+    $file = $_SERVER['argv'][1];
+    echo 'Proccessing ' . realpath($dir . '/' . $file) . "\n";
+} else {
+    die('First argument or file not found: ' . $_SERVER['argv'][1] . "\n");
+}
+
+preg_match('/([^\.]+)\..*$/i', $file, $match);
+$classname = $match[1];
+
+$ps = new PHPUnit_Skeleton($classname, '../lib/' . $file);
+
+// Generate the test class.
+// Default settings will not include any parent class methods, but
+// will include private methods.
+$ps->createTestClass();
+
+// Write the new test class to file.
+// By default, code to run the test will be included.
+$ps->writeTestClass();
+
+
+// $dir_handle = opendir($dir);
+// while ($dir_handle && ($file = readdir($dir_handle)) !== false) {
+//     if (!preg_match('/^\./', $file) && is_file($dir . '/' . $file)) {
+//         echo 'Proccessing ' . realpath($dir . '/' . $file) . "\n";
+//         
+//         preg_match('/([^\.]+)\..*$/i', $file, $match);
+//         $classname = $match[1];
+// 
+//         $ps = new PHPUnit_Skeleton($classname, '../lib/' . $file);
+//         
+//         // Generate the test class.
+//         // Default settings will not include any parent class methods, but
+//         // will include private methods.
+//         $ps->createTestClass();
+//         
+//         // Write the new test class to file.
+//         // By default, code to run the test will be included.
+//         $ps->writeTestClass();
+// 
+//     }
+// }
+
+?>
Index: unk/tests/skel.php
===================================================================
--- /trunk/tests/skel.php	(revision 24)
+++ 	(revision )
@@ -1,28 +1,0 @@
-<?php
-require_once 'PHPUnit/Skeleton.php';
-
-$dir = dirname(__FILE__) . '/../lib';
-
-$dir_handle = opendir($dir);
-while ($dir_handle && ($file = readdir($dir_handle)) !== false) {
-    if (!preg_match('/^\./', $file) && is_file($dir . '/' . $file)) {
-        echo 'Proccessing ' . realpath($dir . '/' . $file) . "\n";
-        
-        preg_match('/([^\.]+)\..*$/i', $file, $match);
-        $classname = $match[1];
-
-        $ps = new PHPUnit_Skeleton($classname, '../lib/' . $file);
-        
-        // Generate the test class.
-        // Default settings will not include any parent class methods, but
-        // will include private methods.
-        $ps->createTestClass();
-        
-        // Write the new test class to file.
-        // By default, code to run the test will be included.
-        $ps->writeTestClass();
-
-    }
-}
-
-?>
