<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><style type="text/css"><!--
#msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; }
#msg ul, pre { overflow: auto; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<title>[12603] trunk: Add mu only (inactive) files</title>
</head>
<body>
<div id="msg">
<dl>
<dt>Revision</dt> <dd><a href="http://trac.wordpress.org/changeset/12603">12603</a></dd>
<dt>Author</dt> <dd>wpmuguru</dd>
<dt>Date</dt> <dd>2010-01-06 04:02:57 +0000 (Wed, 06 Jan 2010)</dd>
</dl>
<h3>Log Message</h3>
<pre>Add mu only (inactive) files</pre>
<h3>Added Paths</h3>
<ul>
<li><a href="#trunkwpactivatephp">trunk/wp-activate.php</a></li>
<li><a href="#trunkwpadmineditformphp">trunk/wp-admin/edit-form.php</a></li>
<li><a href="#trunkwpadmineditpagedraftsphp">trunk/wp-admin/edit-page-drafts.php</a></li>
<li><a href="#trunkwpadmineditpostdraftsphp">trunk/wp-admin/edit-post-drafts.php</a></li>
<li><a href="#trunkwpadminincludesmsphp">trunk/wp-admin/includes/ms.php</a></li>
<li><a href="#trunkwpadminlinkimportphp">trunk/wp-admin/link-import.php</a></li>
<li><a href="#trunkwpadminmsadminphp">trunk/wp-admin/ms-admin.php</a></li>
<li><a href="#trunkwpadminmseditphp">trunk/wp-admin/ms-edit.php</a></li>
<li><a href="#trunkwpadminmsoptionsphp">trunk/wp-admin/ms-options.php</a></li>
<li><a href="#trunkwpadminmssitesphp">trunk/wp-admin/ms-sites.php</a></li>
<li><a href="#trunkwpadminmsupgradesitephp">trunk/wp-admin/ms-upgrade-site.php</a></li>
<li><a href="#trunkwpadminmsusersphp">trunk/wp-admin/ms-users.php</a></li>
<li><a href="#trunkwpcontentblogsphp">trunk/wp-content/blogs.php</a></li>
<li><a href="#trunkwpincludesgettextphp">trunk/wp-includes/gettext.php</a></li>
<li><a href="#trunkwpincludesmsdefaultfiltersphp">trunk/wp-includes/ms-default-filters.php</a></li>
<li><a href="#trunkwpincludesmsfunctionsphp">trunk/wp-includes/ms-functions.php</a></li>
<li><a href="#trunkwpincludesstreamsphp">trunk/wp-includes/streams.php</a></li>
<li><a href="#trunkwpsignupphp">trunk/wp-signup.php</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkwpactivatephp"></a>
<div class="addfile"><h4>Added: trunk/wp-activate.php (0 => 12603)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/wp-activate.php         (rev 0)
+++ trunk/wp-activate.php        2010-01-06 04:02:57 UTC (rev 12603)
</span><span class="lines">@@ -0,0 +1,88 @@
</span><ins>+<?php
+define( "WP_INSTALLING", true );
+
+/** Sets up the WordPress Environment. */
+require( dirname(__FILE__) . '/wp-load.php' );
+
+require( 'wp-blog-header.php' );
+require_once( ABSPATH . WPINC . '/registration.php');
+
+if( is_object( $wp_object_cache ) )
+        $wp_object_cache->cache_enabled = false;
+
+do_action("activate_header");
+
+function wpmu_activate_stylesheet() {
+        ?>
+        <style type="text/css">        
+                form { margin-top: 2em; }
+                #submit, #key { width: 90%; font-size: 24px; }
+                #language { margin-top: .5em; }
+                .error { background: #f66; }
+                span.h3 { padding:0 8px; font-size:1.3em; font-family:'Trebuchet MS','Lucida Grande',Verdana,Arial,Sans-Serif; font-weight:700; color:#333333; }
+        </style>
+        <?php
+}
+add_action( 'wp_head', 'wpmu_activate_stylesheet' );
+
+get_header();
+?>
+
+<div id="content" class="widecolumn">
+        <?php if ( empty($_GET['key']) && empty($_POST['key']) ) { ?>
+                
+                <h2><?php _e('Activation Key Required') ?></h2>
+                <form name="activateform" id="activateform" method="post" action="<?php echo 'http://' . $current_site->domain . $current_site->path ?>wp-activate.php">
+                        <p>
+                         <label for="key"><?php _e('Activation Key:') ?></label>
+                         <br /><input type="text" name="key" id="key" value="" size="50" />
+                        </p>
+                        <p class="submit">
+                         <input id="submit" type="submit" name="Submit" class="submit" value="<?php _e('Activate &raquo;') ?>" />
+                        </p>
+                </form>
+                
+        <?php } else {
+
+                $key = !empty($_GET['key']) ? $_GET['key'] : $_POST['key'];
+                $result = wpmu_activate_signup($key);                
+                if ( is_wp_error($result) ) {
+                        if ( 'already_active' == $result->get_error_code() || 'blog_taken' == $result->get_error_code() ) {
+                         $signup = $result->get_error_data();
+                                ?>
+                                <h2><?php _e('Your account is now active!'); ?></h2>
+                                <?php
+                         if( $signup->domain . $signup->path == '' ) {
+                                 printf(__('<p class="lead-in">Your account has been activated. You may now <a href="%1$s">login</a> to the site using your chosen username of "%2$s". Please check your email inbox at %3$s for your password and login instructions. If you do not receive an email, please check your junk or spam folder. If you still do not receive an email within an hour, you can <a href="%4$s">reset your password</a>.</p>'), 'http://' . $current_site->domain . $current_site->path . 'wp-login.php', $signup->user_login, $signup->user_email, 'http://' . $current_site->domain . $current_site->path . 'wp-login.php?action=lostpassword');
+                         } else {
+                                 printf(__('<p class="lead-in">Your blog at <a href="%1$s">%2$s</a> is active. You may now login to your blog using your chosen username of "%3$s". Please check your email inbox at %4$s for your password and login instructions. If you do not receive an email, please check your junk or spam folder. If you still do not receive an email within an hour, you can <a href="%5$s">reset your password</a>.</p>'), 'http://' . $signup->domain, $signup->domain, $signup->user_login, $signup->user_email, 'http://' . $current_site->domain . $current_site->path . 'wp-login.php?action=lostpassword');
+                         }
+                        } else {
+                                ?>
+                                <h2><?php _e('An error occurred during the activation'); ?></h2>
+                                <?php
+                         echo '<p>'.$result->get_error_message().'</p>';
+                        }
+                } else {
+                        extract($result);
+                        $url = get_blogaddress_by_id( (int) $blog_id);
+                        $user = new WP_User( (int) $user_id);
+                        ?>
+                        <h2><?php _e('Your account is now active!'); ?></h2>
+                        
+                        <div id="signup-welcome">
+                                <p><span class="h3"><?php _e('Username:'); ?></span> <?php echo $user->user_login ?></p>
+                                <p><span class="h3"><?php _e('Password:'); ?></span> <?php echo $password; ?></p>
+                        </div>
+                                        
+                        <?php if( $url != 'http://' . $current_site->domain . $current_site->path ) : ?>
+                                <p class="view"><?php printf(__('Your account is now activated. <a href="%1$s">View your site</a> or <a href="%2$s">Login</a>'), $url, $url . 'wp-login.php' ); ?></p>
+                        <?php else: ?>
+                                <p class="view"><?php printf( __( 'Your account is now activated. <a href="%1$s">Login</a> or go back to the <a href="%2$s">homepage</a>.' ), 'http://' . $current_site->domain . $current_site->path . 'wp-login.php', 'http://' . $current_site->domain . $current_site->path ); ?></p>
+                        <?php endif;
+                }                
+        }
+        ?>
+</div>
+
+<?php get_footer(); ?>
</ins><span class="cx">Property changes on: trunk/wp-activate.php
</span><span class="cx">___________________________________________________________________
</span><span class="cx">Name: svn:executable
</span><span class="cx"> + *
</span></span></pre></div>
<a id="trunkwpadmineditformphp"></a>
<div class="addfile"><h4>Added: trunk/wp-admin/edit-form.php (0 => 12603)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/wp-admin/edit-form.php         (rev 0)
+++ trunk/wp-admin/edit-form.php        2010-01-06 04:02:57 UTC (rev 12603)
</span><span class="lines">@@ -0,0 +1,76 @@
</span><ins>+<?php
+/**
+ * Edit post form for Write Post and for the Bookmarklet mode.
+ *
+ * @package WordPress
+ * @subpackage Administration
+ */
+?>
+<div class="wrap">
+<h2><?php _e('Write Post'); ?></h2>
+<form name="post" action="post.php" method="post" id="simple">
+
+<?php if (isset($mode) && 'bookmarklet' == $mode) : ?>
+<input type="hidden" name="mode" value="bookmarklet" />
+<?php endif; ?>
+<input type="hidden" id="user-id" name="user_ID" value="<?php echo (int) $user_ID ?>" />
+<input type="hidden" name="action" value='post' />
+
+<div id="poststuff">
+ <fieldset id="titlediv">
+ <legend><a href="http://wordpress.org/docs/reference/post/#title" title="<?php _e('Help on titles') ?>"><?php _e('Title') ?></a></legend>
+         <div><input type="text" name="post_title" size="30" tabindex="1" value="<?php echo attribute_escape( $post->post_title ); ?>" id="title" /></div>
+ </fieldset>
+
+ <fieldset id="categorydiv">
+ <legend><a href="http://wordpress.org/docs/reference/post/#category" title="<?php _e('Help on categories') ?>"><?php _e('Categories') ?></a></legend>
+         <div><?php dropdown_categories($post->post_category); ?></div>
+ </fieldset>
+
+<br />
+<fieldset id="postdiv">
+ <legend><a href="http://wordpress.org/docs/reference/post/#post" title="<?php _e('Help with post field') ?>"><?php _e('Post') ?></a></legend>
+<?php
+ $rows = get_option('default_post_edit_rows');
+ if (($rows < 3) || ($rows > 100)) {
+ $rows = 10;
+ }
+?>
+<div><textarea rows="<?php echo $rows; ?>" cols="40" name="content" tabindex="4" id="content"><?php echo $post->post_content ?></textarea></div>
+<?php wp_nonce_field( 'autosave', 'autosavenonce', false ); ?>
+</fieldset>
+
+
+<script type="text/javascript">
+<!--
+edCanvas = document.getElementById('content');
+//-->
+</script>
+
+<input type="hidden" name="post_pingback" value="<?php echo (int) get_option('default_pingback_flag') ?>" id="post_pingback" />
+
+<p><label for="trackback"> <?php printf(__('<a href="%s" title="Help on trackbacks"><strong>TrackBack</strong> a <abbr title="Universal Resource Locator">URL</abbr></a>:</label> (Separate multiple <abbr title="Universal Resource Locator">URL</abbr>s with spaces.)'), 'http://wordpress.org/docs/reference/post/#trackback'); echo '<br />'; ?>
+        <input type="text" name="trackback_url" style="width: 360px" id="trackback" tabindex="7" /></p>
+
+<p class="submit"><input name="saveasdraft" type="submit" id="saveasdraft" tabindex="9" value="<?php _e('Save as Draft') ?>" />
+        <input name="saveasprivate" type="submit" id="saveasprivate" tabindex="10" value="<?php _e('Save as Private') ?>" />
+
+         <?php if ( current_user_can('edit_posts') ) : ?>
+        <input name="publish" type="submit" id="publish" tabindex="6" value="<?php _e('Publish') ?>" class="button button-highlighted" />
+<?php endif; ?>
+
+<?php if ('bookmarklet' != $mode) {
+                echo '<input name="advanced" type="submit" id="advancededit" tabindex="7" value="' . __('Advanced Editing') . '" />';
+        } ?>
+        <input name="referredby" type="hidden" id="referredby" value="<?php if ( $refby = wp_get_referer() ) echo urlencode($refby); ?>" />
+</p>
+
+<?php do_action('simple_edit_form', ''); ?>
+
+</div>
+</form>
+
+<script type="text/javascript">
+try{document.getElementById('title').focus();}catch(e){}
+</script>
+</div>
</ins><span class="cx">Property changes on: trunk/wp-admin/edit-form.php
</span><span class="cx">___________________________________________________________________
</span><span class="cx">Name: svn:executable
</span><span class="cx"> + *
</span></span></pre></div>
<a id="trunkwpadmineditpagedraftsphp"></a>
<div class="addfile"><h4>Added: trunk/wp-admin/edit-page-drafts.php (0 => 12603)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/wp-admin/edit-page-drafts.php         (rev 0)
+++ trunk/wp-admin/edit-page-drafts.php        2010-01-06 04:02:57 UTC (rev 12603)
</span><span class="lines">@@ -0,0 +1,19 @@
</span><ins>+<?php
+/**
+ * Draft Page Administration Panel.
+ *
+ * This was created for the administration navigation instead of using a query
+ * for the drafts.
+ *
+ * @package WordPress
+ * @subpackage Administration
+ */
+
+/** Locks the post status to draft to prevent premature posting. */
+$locked_post_status = 'draft';
+$_GET['post_status'] = 'draft';
+require_once('admin.php');
+$title = __('View Draft Pages');
+require_once('edit-pages.php');
+
+?>
</ins><span class="cx">Property changes on: trunk/wp-admin/edit-page-drafts.php
</span><span class="cx">___________________________________________________________________
</span><span class="cx">Name: svn:executable
</span><span class="cx"> + *
</span></span></pre></div>
<a id="trunkwpadmineditpostdraftsphp"></a>
<div class="addfile"><h4>Added: trunk/wp-admin/edit-post-drafts.php (0 => 12603)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/wp-admin/edit-post-drafts.php         (rev 0)
+++ trunk/wp-admin/edit-post-drafts.php        2010-01-06 04:02:57 UTC (rev 12603)
</span><span class="lines">@@ -0,0 +1,19 @@
</span><ins>+<?php
+/**
+ * Draft Post Administration Panel.
+ *
+ * This was created for the administration navigation instead of using a query
+ * for the drafts.
+ *
+ * @package WordPress
+ * @subpackage Administration
+ */
+
+/** Locks the post status to draft to prevent premature posting. */
+$locked_post_status = 'draft';
+$_GET['post_status'] = 'draft';
+require_once('admin.php');
+$title = __('View Drafts');
+require_once('edit.php');
+
+?>
</ins><span class="cx">\ No newline at end of file
</span><span class="cx">Property changes on: trunk/wp-admin/edit-post-drafts.php
</span><span class="cx">___________________________________________________________________
</span><span class="cx">Name: svn:executable
</span><span class="cx"> + *
</span></span></pre></div>
<a id="trunkwpadminincludesmsphp"></a>
<div class="addfile"><h4>Added: trunk/wp-admin/includes/ms.php (0 => 12603)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/wp-admin/includes/ms.php         (rev 0)
+++ trunk/wp-admin/includes/ms.php        2010-01-06 04:02:57 UTC (rev 12603)
</span><span class="lines">@@ -0,0 +1,1303 @@
</span><ins>+<?php
+function check_upload_size( $file ) {
+        if ( get_site_option( 'upload_space_check_disabled' ) ) {
+                return $file;
+        }
+        if( $file['error'] != '0' ) // there's already an error
+                return $file;
+
+        if ( defined( 'WP_IMPORTING' ) )
+                return $file;
+
+        $space_allowed = 1048576 * get_space_allowed();
+        $space_used = get_dirsize( BLOGUPLOADDIR );
+        $space_left = $space_allowed - $space_used;
+        $file_size = filesize( $file['tmp_name'] );
+        if( $space_left < $file_size )
+                $file['error'] = sprintf( __( 'Not enough space to upload. %1$s Kb needed.' ), number_format( ($file_size - $space_left) /1024 ) );
+        if( $file_size > ( 1024 * get_site_option( 'fileupload_maxk', 1500 ) ) )
+                $file['error'] = sprintf(__('This file is too big. Files must be less than %1$s Kb in size.'), get_site_option( 'fileupload_maxk', 1500 ) );
+        if( upload_is_user_over_quota( false ) ) {
+                $file['error'] = __('You have used your space quota. Please delete files before uploading.');
+        }
+        if( $file['error'] != '0' )
+                wp_die( $file['error'] . ' <a href="javascript:history.go(-1)">' . __( 'Back' ) . '</a>' );
+
+        return $file;
+}
+add_filter( 'wp_handle_upload_prefilter', 'check_upload_size' );
+
+function wpmu_delete_blog($blog_id, $drop = false) {
+        global $wpdb;
+
+        if ( $blog_id != $wpdb->blogid ) {
+                $switch = true;
+                switch_to_blog($blog_id);
+        }
+
+        do_action('delete_blog', $blog_id, $drop);
+
+        $users = get_users_of_blog($blog_id);
+
+        // Remove users from this blog.
+        if ( !empty($users) ) foreach ($users as $user) {
+                remove_user_from_blog($user->user_id, $blog_id);
+        }
+
+        update_blog_status( $blog_id, 'deleted', 1 );
+
+        if ( $drop ) {
+                $drop_tables = $wpdb->get_results("show tables LIKE '". $wpdb->base_prefix . $blog_id . "\_%'", ARRAY_A);
+                $drop_tables = apply_filters( 'wpmu_drop_tables', $drop_tables );
+
+                reset( $drop_tables );
+                foreach ( (array) $drop_tables as $drop_table) {
+                        $wpdb->query( "DROP TABLE IF EXISTS ". current( $drop_table ) ."" );
+                }
+                $wpdb->query( $wpdb->prepare("DELETE FROM $wpdb->blogs WHERE blog_id = %d", $blog_id) );
+                $dir = apply_filters( 'wpmu_delete_blog_upload_dir', constant( "WP_CONTENT_DIR" ) . "/blogs.dir/{$blog_id}/files/", $blog_id );
+                $dir = rtrim($dir, DIRECTORY_SEPARATOR);
+                $top_dir = $dir;
+                $stack = array($dir);
+                $index = 0;
+
+                while ($index < count($stack)) {
+                        # Get indexed directory from stack
+                        $dir = $stack[$index];
+
+                        $dh = @ opendir($dir);
+                        if ($dh) {
+                                while (($file = @ readdir($dh)) !== false) {
+                                        if ($file == '.' or $file == '..')
+                                                continue;
+
+                                        if (@ is_dir($dir . DIRECTORY_SEPARATOR . $file))
+                                                $stack[] = $dir . DIRECTORY_SEPARATOR . $file;
+                                        else if (@ is_file($dir . DIRECTORY_SEPARATOR . $file))
+                                                @ unlink($dir . DIRECTORY_SEPARATOR . $file);
+                                }
+                        }
+                        $index++;
+                }
+
+                $stack = array_reverse($stack); // Last added dirs are deepest
+                foreach( (array) $stack as $dir) {
+                        if ( $dir != $top_dir)
+                        @rmdir($dir);
+                }
+        }
+        $wpdb->query( $wpdb->prepare("DELETE FROM {$wpdb->usermeta} WHERE meta_key = %s", 'wp_{$blog_id}_autosave_draft_ids') );
+        $blogs = get_site_option( "blog_list" );
+        if ( is_array( $blogs ) ) {
+                foreach( $blogs as $n => $blog ) {
+                        if( $blog[ 'blog_id' ] == $blog_id ) {
+                                unset( $blogs[ $n ] );
+                        }
+                }
+                update_site_option( 'blog_list', $blogs );
+        }
+
+        if ( $switch === true )
+                restore_current_blog();
+}
+
+function wpmu_delete_user($id) {
+        global $wpdb;
+
+        $id = (int) $id;
+        $user = get_userdata($id);
+
+        do_action('wpmu_delete_user', $id);
+
+        $blogs = get_blogs_of_user($id);
+
+        if ( ! empty($blogs) ) {
+                foreach ($blogs as $blog) {
+                        switch_to_blog($blog->userblog_id);
+                        remove_user_from_blog($id, $blog->userblog_id);
+
+                        $post_ids = $wpdb->get_col( $wpdb->prepare("SELECT ID FROM $wpdb->posts WHERE post_author = %d", $id ) );
+                        foreach ( (array) $post_ids as $post_id ) {
+                                wp_delete_post($post_id);
+                        }
+
+                        // Clean links
+                        $wpdb->query( $wpdb->prepare("DELETE FROM $wpdb->links WHERE link_owner = %d", $id) );
+
+                        restore_current_blog();
+                }
+        }
+
+        $wpdb->query( $wpdb->prepare("DELETE FROM $wpdb->users WHERE ID = %d", $id) );
+        $wpdb->query( $wpdb->prepare("DELETE FROM $wpdb->usermeta WHERE user_id = %d", $id) );
+
+        wp_cache_delete($id, 'users');
+        wp_cache_delete($user->user_login, 'userlogins');
+
+        return true;
+}
+
+function confirm_delete_users( $users ) {
+        if( !is_array( $users ) )
+                return false;
+
+        echo '<p>' . __( 'Transfer posts before deleting users:' ) . '</p>';
+
+        echo '<form action="wpmu-edit.php?action=allusers" method="post">';
+        echo '<input type="hidden" name="alluser_transfer_delete" />';
+        wp_nonce_field( 'allusers' );
+        foreach ( (array) $_POST['allusers'] as $key => $val ) {
+                if( $val != '' && $val != '0' ) {
+                        $user = new WP_User( $val );
+                        if ( in_array( $user->user_login, get_site_option( 'site_admins', array( 'admin' ) ) ) ) {
+                                wp_die( sprintf( __( 'Warning! User cannot be deleted. The user %s is a site admnistrator.' ), $user->user_login ) );
+                        }
+                        echo "<input type='hidden' name='user[]' value='{$val}'/>\n";
+                        $blogs = get_blogs_of_user( $val, true );
+                        if( !empty( $blogs ) ) {
+                                foreach ( (array) $blogs as $key => $details ) {
+                                        $blog_users = get_users_of_blog( $details->userblog_id );
+                                        if( is_array( $blog_users ) && !empty( $blog_users ) ) {
+                                                echo "<p><a href='http://{$details->domain}{$details->path}'>{$details->blogname}</a> ";
+                                                echo "<select name='blog[$val][{$key}]'>";
+                                                $out = '';
+                                                foreach( $blog_users as $user ) {
+                                                        if( $user->user_id != $val )
+                                                                $out .= "<option value='{$user->user_id}'>{$user->user_login}</option>";
+                                                }
+                                                if( $out == '' )
+                                                        $out = "<option value='1'>admin</option>";
+                                                echo $out;
+                                                echo "</select>\n";
+                                        }
+                                }
+                        }
+                }
+        }
+        echo "<br /><input type='submit' value='" . __( 'Delete user and transfer posts' ) . "' />";
+        echo "</form>";
+        return true;
+}
+
+function wpmu_get_blog_allowedthemes( $blog_id = 0 ) {
+        $themes = get_themes();
+
+        if( $blog_id != 0 )
+                switch_to_blog( $blog_id );
+
+        $blog_allowed_themes = get_option( "allowedthemes" );
+        if( !is_array( $blog_allowed_themes ) || empty( $blog_allowed_themes ) ) { // convert old allowed_themes to new allowedthemes
+                $blog_allowed_themes = get_option( "allowed_themes" );
+
+                if( is_array( $blog_allowed_themes ) ) {
+                        foreach( (array) $themes as $key => $theme ) {
+                                $theme_key = wp_specialchars( $theme[ 'Stylesheet' ] );
+                                if( isset( $blog_allowed_themes[ $key ] ) == true ) {
+                                        $blog_allowedthemes[ $theme_key ] = 1;
+                                }
+                        }
+                        $blog_allowed_themes = $blog_allowedthemes;
+                        add_option( "allowedthemes", $blog_allowed_themes );
+                        delete_option( "allowed_themes" );
+                }
+        }
+
+        if( $blog_id != 0 )
+                restore_current_blog();
+
+        return $blog_allowed_themes;
+}
+
+function update_option_new_admin_email($old_value, $value) {
+        global $current_site;
+        if ( $value == get_option( 'admin_email' ) || !is_email( $value ) )
+                return;
+
+        $hash = md5( $value. time() .mt_rand() );
+        $new_admin_email = array(
+                "hash" => $hash,
+                "newemail" => $value
+        );
+        update_option( 'adminhash', $new_admin_email );
+        
+        $content = apply_filters( 'new_admin_email_content', __("Dear user,
+
+You recently requested to have the administration email address on
+your blog changed.
+If this is correct, please click on the following link to change it:
+###ADMIN_URL###
+
+You can safely ignore and delete this email if you do not want to
+take this action.
+
+This email has been sent to ###EMAIL###
+
+Regards,
+All at ###SITENAME###
+###SITEURL###"), $new_admin_email );
+        
+        $content = str_replace('###ADMIN_URL###', clean_url(get_option( "siteurl" ).'/wp-admin/options.php?adminhash='.$hash), $content);
+        $content = str_replace('###EMAIL###', $value, $content);
+        $content = str_replace('###SITENAME###', get_site_option( 'site_name' ), $content);
+        $content = str_replace('###SITEURL###', 'http://' . $current_site->domain . $current_site->path, $content);
+        
+        wp_mail( $value, sprintf(__('[%s] New Admin Email Address'), get_option('blogname')), $content );
+}
+add_action('update_option_new_admin_email', 'update_option_new_admin_email', 10, 2);
+
+function profile_page_email_warning_ob_start() {
+        ob_start( 'profile_page_email_warning_ob_content' );
+}
+
+function profile_page_email_warning_ob_content( $content ) {
+        $content = str_replace( ' class="regular-text" /> Required.</td>', ' class="regular-text" /> Required. (You will be sent an email to confirm the change)</td>', $content );
+        return $content;
+}
+
+function update_profile_email() {
+        global $current_user, $wpdb;
+        if( isset( $_GET[ 'newuseremail' ] ) && $current_user->ID ) {
+                $new_email = get_option( $current_user->ID . '_new_email' );
+                if( $new_email[ 'hash' ] == $_GET[ 'newuseremail' ] ) {
+                        $user->ID = $current_user->ID;
+                        $user->user_email = wp_specialchars( trim( $new_email[ 'newemail' ] ) );
+                        if ( $wpdb->get_var( $wpdb->prepare( "SELECT user_login FROM {$wpdb->signups} WHERE user_login = %s", $current_user->user_login ) ) ) {
+                                $wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->signups} SET user_email = %s WHERE user_login = %s", $user->user_email, $current_user->user_login ) );
+                        }
+                        wp_update_user( get_object_vars( $user ) );
+                        delete_option( $current_user->ID . '_new_email' );
+                        wp_redirect( add_query_arg( array('updated' => 'true'), admin_url( 'profile.php' ) ) );
+                        die();
+                }
+        }
+}
+
+function send_confirmation_on_profile_email() {
+        global $errors, $wpdb, $current_user, $current_site;
+        if ( ! is_object($errors) )
+                $errors = new WP_Error();
+
+        if( $current_user->id != $_POST[ 'user_id' ] )
+                return false;
+
+        if( $current_user->user_email != $_POST[ 'email' ] ) {
+                if ( !is_email( $_POST[ 'email' ] ) ) {
+                        $errors->add( 'user_email', __( "<strong>ERROR</strong>: The e-mail address isn't correct." ), array( 'form-field' => 'email' ) );
+                        return;
+                }
+
+                if( $wpdb->get_var( $wpdb->prepare( "SELECT user_email FROM {$wpdb->users} WHERE user_email=%s", $_POST[ 'email' ] ) ) ) {
+                        $errors->add( 'user_email', __( "<strong>ERROR</strong>: The e-mail address is already used." ), array( 'form-field' => 'email' ) );
+                        delete_option( $current_user->ID . '_new_email' );
+                        return;
+                }
+
+                $hash = md5( $_POST[ 'email' ] . time() . mt_rand() );
+                $new_user_email = array(
+                                "hash" => $hash,
+                                "newemail" => $_POST[ 'email' ]
+                                );
+                update_option( $current_user->ID . '_new_email', $new_user_email );
+
+                $content = apply_filters( 'new_user_email_content', __("Dear user,
+
+You recently requested to have the email address on your account changed.
+If this is correct, please click on the following link to change it:
+###ADMIN_URL###
+
+You can safely ignore and delete this email if you do not want to
+take this action.
+
+This email has been sent to ###EMAIL###
+
+Regards,
+All at ###SITENAME###
+###SITEURL###"), $new_user_email );
+
+                $content = str_replace('###ADMIN_URL###', clean_url(get_option( "siteurl" ).'/wp-admin/profile.php?newuseremail='.$hash), $content);
+                $content = str_replace('###EMAIL###', $_POST[ 'email' ], $content);
+                $content = str_replace('###SITENAME###', get_site_option( 'site_name' ), $content);
+                $content = str_replace('###SITEURL###', 'http://' . $current_site->domain . $current_site->path, $content);
+
+                wp_mail( $_POST[ 'email' ], sprintf(__('[%s] New Email Address'), get_option('blogname')), $content );
+                $_POST[ 'email' ] = $current_user->user_email;
+        }
+}
+add_action( 'personal_options_update', 'send_confirmation_on_profile_email' );
+
+function new_user_email_admin_notice() {
+        global $current_user;
+        if( strpos( $_SERVER['PHP_SELF'], 'profile.php' ) && isset( $_GET[ 'updated' ] ) && $email = get_option( $current_user->ID . '_new_email' ) )
+                echo "<div id='update-nag'>" . sprintf( __( "Your email address has not been updated yet. Please check your inbox at %s for a confirmation email." ), $email[ 'newemail' ] ) . "</div>";
+}
+add_action( 'admin_notices', 'new_user_email_admin_notice' );
+
+function get_site_allowed_themes() {
+        $themes = get_themes();
+        $allowed_themes = get_site_option( 'allowedthemes' );
+        if( !is_array( $allowed_themes ) || empty( $allowed_themes ) ) {
+                $allowed_themes = get_site_option( "allowed_themes" ); // convert old allowed_themes format
+                if( !is_array( $allowed_themes ) ) {
+                        $allowed_themes = array();
+                } else {
+                        foreach( (array) $themes as $key => $theme ) {
+                                $theme_key = wp_specialchars( $theme[ 'Stylesheet' ] );
+                                if( isset( $allowed_themes[ $key ] ) == true ) {
+                                        $allowedthemes[ $theme_key ] = 1;
+                                }
+                        }
+                        $allowed_themes = $allowedthemes;
+                }
+        }
+        return $allowed_themes;
+}
+
+function get_space_allowed() {
+        $spaceAllowed = get_option("blog_upload_space");
+        if( $spaceAllowed == false )
+                $spaceAllowed = get_site_option("blog_upload_space");
+        if( empty($spaceAllowed) || !is_numeric($spaceAllowed) )
+                $spaceAllowed = 50;
+
+        return $spaceAllowed;
+}
+
+function display_space_usage() {
+        $space = get_space_allowed();
+        $used = get_dirsize( BLOGUPLOADDIR )/1024/1024;
+
+        if ($used > $space) $percentused = '100';
+        else $percentused = ( $used / $space ) * 100;
+
+        if( $space > 1000 ) {
+                $space = number_format( $space / 1024 );
+                $space .= __('GB');
+        } else {
+                $space .= __('MB');
+        }
+        ?>
+        <strong><?php printf(__('Used: %1s%% of %2s'), number_format($percentused), $space );?></strong>
+        <?php
+}
+
+// Display File upload quota on dashboard
+function dashboard_quota() {        
+        if ( get_site_option( 'upload_space_check_disabled' ) ) {
+                return true;
+        }
+        $quota = get_space_allowed();
+        $used = get_dirsize( BLOGUPLOADDIR )/1024/1024;
+
+        if ($used > $quota) $percentused = '100';
+        else $percentused = ( $used / $quota ) * 100;
+        $percentused = number_format($percentused);
+        $used = round($used,2);
+        $used_color = ($used < 70) ? (($used >= 40) ? 'waiting' : 'approved') : 'spam';
+        ?>
+        <p class="sub musub"><?php _e("Storage Space <a href='upload.php' title='Manage Uploads...'>&raquo;</a>"); ?></p>
+        <div class="table">
+        <table>
+                <tr class="first">
+                        <td class="first b b-posts"><?php printf( __( '<a href="upload.php" title="Manage Uploads..." class="musublink">%sMB</a>' ), $quota ); ?></td>
+                        <td class="t posts"><?php _e('Space Allowed'); ?></td>
+                        <td class="b b-comments"><?php printf( __( '<a href="upload.php" title="Manage Uploads..." class="musublink">%1sMB (%2s%%)</a>' ), $used, $percentused ); ?>
+                        <td class="last t comments <?php echo $used_color;?>"><?php _e('Space Used');?></td>
+                </tr>
+        </table>
+        </div>
+        <?php
+}
+if( current_user_can('edit_posts') )
+        add_action('activity_box_end', 'dashboard_quota');
+
+// Edit blog upload space setting on Edit Blog page
+function upload_space_setting( $id ) {
+        $quota = get_blog_option($id, "blog_upload_space");
+        if( !$quota )
+                $quota = '';
+        
+        ?>
+        <tr>
+                <th><?php _e('Blog Upload Space Quota'); ?></th>
+                <td><input type="text" size="3" name="option[blog_upload_space]" value="<?php echo $quota; ?>" /><?php _e('MB (Leave blank for site default)'); ?></td>
+        </tr>
+        <?php
+}
+add_action('wpmueditblogaction', 'upload_space_setting');
+
+function update_user_status( $id, $pref, $value, $refresh = 1 ) {
+        global $wpdb;
+
+        $wpdb->update( $wpdb->users, array( $pref => $value ), array( 'ID' => $id ) );
+
+        if( $refresh == 1 )
+                refresh_user_details($id);
+        
+        if( $pref == 'spam' ) {
+                if( $value == 1 )
+                        do_action( "make_spam_user", $id );
+                else
+                        do_action( "make_ham_user", $id );
+        }
+
+        return $value;
+}
+
+function refresh_user_details($id) {
+        $id = (int) $id;
+        
+        if ( !$user = get_userdata( $id ) )
+                return false;
+
+        wp_cache_delete($id, 'users');
+        wp_cache_delete($user->user_login, 'userlogins');
+        return $id;
+}
+
+/*
+ Determines if the available space defined by the admin has been exceeded by the user
+*/
+function wpmu_checkAvailableSpace() {
+        if ( get_site_option( 'upload_space_check_disabled' ) ) {
+                return true;
+        }
+        $spaceAllowed = get_space_allowed();
+
+        $dirName = trailingslashit( BLOGUPLOADDIR );
+        if (!(is_dir($dirName) && is_readable($dirName)))
+                return;
+
+         $dir = dir($dirName);
+         $size = 0;
+
+        while($file = $dir->read()) {
+                if ($file != '.' && $file != '..') {
+                        if (is_dir( $dirName . $file)) {
+                                $size += get_dirsize($dirName . $file);
+                        } else {
+                                $size += filesize($dirName . $file);
+                        }
+                }
+        }
+        $dir->close();
+        $size = $size / 1024 / 1024;
+
+        if( ($spaceAllowed - $size) <= 0 ) {
+                wp_die( __('Sorry, you must delete files before you can upload any more.') );
+        }
+}
+add_action('pre-upload-ui','wpmu_checkAvailableSpace');
+
+function format_code_lang( $code = '' ) {
+        $code = strtolower(substr($code, 0, 2));
+        $lang_codes = array('aa' => 'Afar', 'ab' => 'Abkhazian', 'af' => 'Afrikaans', 'ak' => 'Akan', 'sq' => 'Albanian', 'am' => 'Amharic', 'ar' => 'Arabic', 'an' => 'Aragonese', 'hy' => 'Armenian', 'as' => 'Assamese', 'av' => 'Avaric', 'ae' => 'Avestan', 'ay' => 'Aymara', 'az' => 'Azerbaijani', 'ba' => 'Bashkir', 'bm' => 'Bambara', 'eu' => 'Basque', 'be' => 'Belarusian', 'bn' => 'Bengali', 'bh' => 'Bihari', 'bi' => 'Bislama', 'bs' => 'Bosnian', 'br' => 'Breton', 'bg' => 'Bulgarian', 'my' => 'Burmese', 'ca' => 'Catalan; Valencian', 'ch' => 'Chamorro', 'ce' => 'Chechen', 'zh' => 'Chinese', 'cu' => 'Church Slavic; Old Slavonic; Church Slavonic; Old Bulgarian; Old Church Slavonic', 'cv' => 'Chuvash', 'kw' => 'Cornish', 'co' => 'Corsican', 'cr' => 'Cree', 'cs' => 'Czech', 'da' => 'Danish', 'dv' => 'Divehi; Dhivehi; Maldivian', 'nl' => 'Dutch; Flemish', 'dz' => 'Dzongkha', 'en' => 'English', 'eo' => 'Esperanto', 'et' => 'Estonian', 'ee' => 'Ewe', 'fo' => 'Faroese', 'fj' => 'Fijian', 'fi' => 'Finnish', 'fr' => 'French', 'fy' => 'Western Frisian', 'ff' => 'Fulah', 'ka' => 'Georgian', 'de' => 'German', 'gd' => 'Gaelic; Scottish Gaelic', 'ga' => 'Irish', 'gl' => 'Galician', 'gv' => 'Manx', 'el' => 'Greek, Modern', 'gn' => 'Guarani', 'gu' => 'Gujarati', 'ht' => 'Haitian; Haitian Creole', 'ha' => 'Hausa', 'he' => 'Hebrew', 'hz' => 'Herero', 'hi' => 'Hindi', 'ho' => 'Hiri Motu', 'hu' => 'Hungarian', 'ig' => 'Igbo', 'is' => 'Icelandic', 'io' => 'Ido', 'ii' => 'Sichuan Yi', 'iu' => 'Inuktitut', 'ie' => 'Interlingue', 'ia' => 'Interlingua (International Auxiliary Language Association)', 'id' => 'Indonesian', 'ik' => 'Inupiaq', 'it' => 'Italian', 'jv' => 'Javanese', 'ja' => 'Japanese', 'kl' => 'Kalaallisut; Greenlandic', 'kn' => 'Kannada', 'ks' => 'Kashmiri', 'kr' => 'Kanuri', 'kk' => 'Kazakh', 'km' => 'Central Khmer', 'ki' => 'Kikuyu; Gikuyu', 'rw' => 'Kinyarwanda', 'ky' => 'Kirghiz; Kyrgyz', 'kv' => 'Komi', 'kg' => 'Kongo', 'ko' => 'Korean', 'kj' => 'Kuanyama; Kwanyama', 'ku' => 'Kurdish', 'lo' => 'Lao', 'la' => 'Latin', 'lv' => 'Latvian', 'li' => 'Limburgan; Limburger; Limburgish', 'ln' => 'Lingala', 'lt' => 'Lithuanian', 'lb' => 'Luxembourgish; Letzeburgesch', 'lu' => 'Luba-Katanga', 'lg' => 'Ganda', 'mk' => 'Macedonian', 'mh' => 'Marshallese', 'ml' => 'Malayalam', 'mi' => 'Maori', 'mr' => 'Marathi', 'ms' => 'Malay', 'mg' => 'Malagasy', 'mt' => 'Maltese', 'mo' => 'Moldavian', 'mn' => 'Mongolian', 'na' => 'Nauru', 'nv' => 'Navajo; Navaho', 'nr' => 'Ndebele, South; South Ndebele', 'nd' => 'Ndebele, North; North Ndebele', 'ng' => 'Ndonga', 'ne' => 'Nepali', 'nn' => 'Norwegian Nynorsk; Nynorsk, Norwegian', 'nb' => 'BokmÃ¥l, Norwegian, Norwegian BokmÃ¥l', 'no' => 'Norwegian', 'ny' => 'Chichewa; Chewa; Nyanja', 'oc' => 'Occitan, Provençal', 'oj' => 'Ojibwa', 'or' => 'Oriya', 'om' => 'Oromo', 'os' => 'Ossetian; Ossetic', 'pa' => 'Panjabi; Punjabi', 'fa' => 'Persian', 'pi' => 'Pali', 'pl' => 'Polish', 'pt' => 'Portuguese', 'ps' => 'Pushto', 'qu' => 'Quechua', 'rm' => 'Romansh', 'ro' => 'Romanian', 'rn' => 'Rundi', 'ru' => 'Russian', 'sg' => 'Sango', 'sa' => 'Sanskrit', 'sr' => 'Serbian', 'hr' => 'Croatian', 'si' => 'Sinhala; Sinhalese', 'sk' => 'Slovak', 'sl' => 'Slovenian', 'se' => 'Northern Sami', 'sm' => 'Samoan', 'sn' => 'Shona', 'sd' => 'Sindhi', 'so' => 'Somali', 'st' => 'Sotho, Southern', 'es' => 'Spanish; Castilian', 'sc' => 'Sardinian', 'ss' => 'Swati', 'su' => 'Sundanese', 'sw' => 'Swahili', 'sv' => 'Swedish', 'ty' => 'Tahitian', 'ta' => 'Tamil', 'tt' => 'Tatar', 'te' => 'Telugu', 'tg' => 'Tajik', 'tl' => 'Tagalog', 'th' => 'Thai', 'bo' => 'Tibetan', 'ti' => 'Tigrinya', 'to' => 'Tonga (Tonga Islands)', 'tn' => 'Tswana', 'ts' => 'Tsonga', 'tk' => 'Turkmen', 'tr' => 'Turkish', 'tw' => 'Twi', 'ug' => 'Uighur; Uyghur', 'uk' => 'Ukrainian', 'ur' => 'Urdu', 'uz' => 'Uzbek', 've' => 'Venda', 'vi' => 'Vietnamese', 'vo' => 'Volapük', 'cy' => 'Welsh', 'wa' => 'Walloon', 'wo' => 'Wolof', 'xh' => 'Xhosa', 'yi' => 'Yiddish', 'yo' => 'Yoruba', 'za' => 'Zhuang; Chuang', 'zu' => 'Zulu');
+        $lang_codes = apply_filters('lang_codes', $lang_codes, $code);
+        return strtr( $code, $lang_codes );
+}
+
+function sync_category_tag_slugs( $term, $taxonomy ) {
+        if( $taxonomy == 'category' || $taxonomy == 'post_tag' ) {
+                if( is_object( $term ) ) {
+                        $term->slug = sanitize_title( $term->name );
+                } else {
+                        $term[ 'slug' ] = sanitize_title( $term[ 'name' ] );
+                }
+        }
+        return $term;
+}
+add_filter( 'get_term', 'sync_category_tag_slugs', 10, 2 );
+
+function redirect_user_to_blog() {
+        global $current_user, $current_site;
+        $c = 0;
+        if ( isset( $_GET[ 'c' ] ) )
+                $c = (int)$_GET[ 'c' ];
+        
+        if ( $c >= 5 ) {
+                wp_die( __( "You don&#8217;t have permission to view this blog. Please contact the system administrator." ) );
+        }
+        $c ++;
+
+        $blog = get_active_blog_for_user( $current_user->ID );
+        $dashboard_blog = get_dashboard_blog();
+        if( is_object( $blog ) ) {
+                $protocol = ( is_ssl() ? 'https://' : 'http://' );
+                wp_redirect( $protocol . $blog->domain . $blog->path . 'wp-admin/?c=' . $c ); // redirect and count to 5, "just in case"
+                exit;
+        }
+
+        /*
+         If the user is a member of only 1 blog and the user's primary_blog isn't set to that blog,
+         then update the primary_blog record to match the user's blog
+         */
+        $blogs = get_blogs_of_user( $current_user->ID );
+
+        if ( !empty( $blogs ) ) {
+                foreach( $blogs as $blogid => $blog ) {
+                        if ( $blogid != $dashboard_blog->blog_id && get_usermeta( $current_user->ID , 'primary_blog' ) == $dashboard_blog->blog_id ) {
+                                update_usermeta( $current_user->ID, 'primary_blog', $blogid );
+                                continue;
+                        }
+                }
+                $blog = get_blog_details( get_usermeta( $current_user->ID , 'primary_blog' ) );
+                $protocol = ( is_ssl() ? 'https://' : 'http://' );
+                wp_redirect( $protocol . $blog->domain . $blog->path . 'wp-admin/?c=' . $c ); // redirect and count to 5, "just in case"
+                exit;
+        }
+        wp_die( __( 'You do not have sufficient permissions to access this page.' ) );
+}
+add_action( 'admin_page_access_denied', 'redirect_user_to_blog', 99 );
+
+function wpmu_menu() {
+        global $menu, $submenu, $current_user;
+
+        if( is_site_admin() ) {
+                $menu[1] = array( '', 'read', '', '', 'wp-menu-separator' );
+                $menu[2] = array(__('Site Admin'), '10', 'wpmu-admin.php', '', 'menu-top menu-top-first', 'menu-site', 'div');
+                $submenu[ 'wpmu-admin.php' ][1] = array( __('Admin'), '10', 'wpmu-admin.php' );
+                $submenu[ 'wpmu-admin.php' ][5] = array( __('Blogs'), '10', 'wpmu-blogs.php' );
+                $submenu[ 'wpmu-admin.php' ][10] = array( __('Users'), '10', 'wpmu-users.php' );
+                $submenu[ 'wpmu-admin.php' ][20] = array( __('Themes'), '10', 'wpmu-themes.php' );
+                $submenu[ 'wpmu-admin.php' ][25] = array( __('Options'), '10', 'wpmu-options.php' );
+                $submenu[ 'wpmu-admin.php' ][30] = array( __('Upgrade'), '10', 'wpmu-upgrade-site.php' );
+        }
+
+        if( !is_site_admin() )
+                unset( $submenu['plugins.php'][10] ); // always remove the plugin installer for regular users
+        unset( $submenu['plugins.php'][15] ); // always remove the plugin editor
+        unset( $submenu['themes.php'][10] ); // always remove the themes editor
+
+        $menu_perms = get_site_option( "menu_items" );
+        if( is_array( $menu_perms ) == false )
+                $menu_perms = array();
+        if( $menu_perms[ 'plugins' ] != 1 ) {
+                if( !is_site_admin() ) {
+                        unset( $menu['65'] ); // Plugins
+                        unset( $submenu[ 'plugins.php' ] );
+                } elseif ( strpos( $_SERVER[ 'PHP_SELF' ], 'wp-admin/plugins.php' ) ) {
+                        $message = sprintf( __( 'The plugins page is not visible to normal users. It must be activated first. %s' ), '<a href="wpmu-options.php#menu">' . __( 'Activate' ) . '</a>' );
+                        $message = str_replace( "'", "\'", "<div class='error'><p>$message</p></div>" );
+                        add_action( 'admin_notices', create_function( '', "echo '$message';" ) );
+                }
+        } elseif ( !is_site_admin() ) {
+                $menu[65] = array( sprintf( __('Plugins %s'), "" ), 'activate_plugins', 'plugins.php', '', 'menu-top', 'menu-plugins', 'div' );
+        }
+        if( !get_site_option( 'add_new_users' ) ) {
+                if( !is_site_admin() ) {
+                        unset( $submenu['users.php'][10] );
+                } else {
+                        $submenu['users.php'][10] = array(__('Add New') . ' <strong>*</strong>', 'create_users', 'wpmu-options.php#addnewusers');
+                }
+        }
+        unset( $submenu['tools.php'][20] ); // core upgrade
+        unset( $submenu['options-general.php'][45] ); // Misc
+}
+add_action( '_admin_menu', 'wpmu_menu' );
+
+function mu_options( $options ) {
+        if ( defined( 'POST_BY_EMAIL' ) ) {
+                $writing = array( 'ping_sites' );
+        } else {
+                $writing = array( 'ping_sites', 'mailserver_login', 'mailserver_pass', 'default_email_category', 'mailserver_port', 'mailserver_url' );
+        }
+        $removed = array(
+                'general' => array( 'siteurl', 'home', 'admin_email', 'users_can_register', 'default_role' ),
+                'reading' => array( 'gzipcompression' ),
+                'writing' => $writing,
+        );
+
+        $added = array( 'general' => array( 'new_admin_email', 'WPLANG', 'language' ) );
+
+        $options[ 'misc' ] = array();
+
+        $options = remove_option_whitelist( $removed, $options );
+        $options = add_option_whitelist( $added, $options );
+
+        return $options;
+}
+add_filter( 'whitelist_options', 'mu_options' );
+
+function check_import_new_users( $permission ) {
+        if ( !is_site_admin() )
+                return false;
+        return true;
+}
+add_filter( 'import_allow_create_users', 'check_import_new_users' );
+// See "import_allow_fetch_attachments" and "import_attachment_size_limit" filters too.
+
+function mu_css() {
+        wp_admin_css( 'css/mu' );
+}
+add_action( 'admin_head', 'mu_css' );
+
+function mu_dropdown_languages( $lang_files = array(), $current = '' ) {
+        $flag = false;        
+        $output = array();
+                                        
+        foreach ( (array) $lang_files as $val ) {
+                $code_lang = basename( $val, '.mo' );
+                
+                if ( $code_lang == 'en_US' ) { // American English
+                        $flag = true;
+                        $ae = __('American English');
+                        $output[$ae] = '<option value="'.$code_lang.'"'.(($current == $code_lang) ? ' selected="selected"' : '').'> '.$ae.'</option>';
+                } elseif ( $code_lang == 'en_GB' ) { // British English
+                        $flag = true;
+                        $be = __('British English');
+                        $output[$be] = '<option value="'.$code_lang.'"'.(($current == $code_lang) ? ' selected="selected"' : '').'> '.$be.'</option>';
+                } else {
+                        $translated = format_code_lang($code_lang);
+                        $output[$translated] = '<option value="'.$code_lang.'"'.(($current == $code_lang) ? ' selected="selected"' : '').'> '.$translated.'</option>';
+                }
+                
+        }                                                
+        
+        if ( $flag === false ) { // WordPress english
+                $output[] = '<option value=""'.((empty($current)) ? ' selected="selected"' : '').'>'.__('English')."</option>";
+        }
+        
+        // Order by name
+        uksort($output, 'strnatcasecmp');
+        
+        $output = apply_filters('mu_dropdown_languages', $output, $lang_files, $current);        
+        echo implode("\n\t", $output);        
+}
+
+// Only show "Media" upload icon
+function mu_media_buttons() {
+        global $post_ID, $temp_ID;
+        $uploading_iframe_ID = (int) (0 == $post_ID ? $temp_ID : $post_ID);
+        $context = apply_filters('media_buttons_context', __('Add media: %s'));
+        $media_upload_iframe_src = "media-upload.php?post_id=$uploading_iframe_ID";
+        $media_title = __('Add Media');
+        $mu_media_buttons = get_site_option( 'mu_media_buttons' );
+        $out = '';
+        if( $mu_media_buttons[ 'image' ] ) {
+                $image_upload_iframe_src = apply_filters('image_upload_iframe_src', "$media_upload_iframe_src&amp;type=image");
+                $image_title = __('Add an Image');
+                $out .= "<a href='{$image_upload_iframe_src}&amp;TB_iframe=true' id='add_image' class='thickbox' title='$image_title'><img src='images/media-button-image.gif' alt='$image_title' /></a>";
+        }
+        if( $mu_media_buttons[ 'video' ] ) {
+                $video_upload_iframe_src = apply_filters('video_upload_iframe_src', "$media_upload_iframe_src&amp;type=video");
+                $video_title = __('Add Video');
+                $out .= "<a href='{$video_upload_iframe_src}&amp;TB_iframe=true' id='add_video' class='thickbox' title='$video_title'><img src='images/media-button-video.gif' alt='$video_title' /></a>";
+        }
+        if( $mu_media_buttons[ 'audio' ] ) {
+                $audio_upload_iframe_src = apply_filters('audio_upload_iframe_src', "$media_upload_iframe_src&amp;type=audio");
+                $audio_title = __('Add Audio');
+                $out .= "<a href='{$audio_upload_iframe_src}&amp;TB_iframe=true' id='add_audio' class='thickbox' title='$audio_title'><img src='images/media-button-music.gif' alt='$audio_title' /></a>";
+        }
+        $out .= "<a href='{$media_upload_iframe_src}&amp;TB_iframe=true&amp;height=500&amp;width=640' class='thickbox' title='$media_title'><img src='images/media-button-other.gif' alt='$media_title' /></a>";
+        printf($context, $out);
+}
+add_action( 'media_buttons', 'mu_media_buttons' );
+remove_action( 'media_buttons', 'media_buttons' );
+
+/* Warn the admin if SECRET SALT information is missing from wp-config.php */
+function secret_salt_warning() {
+        if( !is_site_admin() )
+                return;
+        $secret_keys = array( 'NONCE_KEY', 'AUTH_KEY', 'AUTH_SALT', 'LOGGED_IN_KEY', 'LOGGED_IN_SALT', 'SECURE_AUTH_KEY', 'SECURE_AUTH_SALT' );
+        $out = '';
+        foreach( $secret_keys as $key ) {
+                if( !defined( $key ) )
+                        $out .= "define( '$key', '" . wp_generate_password() . wp_generate_password() . "' );<br />";
+        }
+        if( $out != '' ) {
+                $msg = sprintf( __( 'Warning! WordPress encrypts user cookies, but you must add the following lines to <strong>%swp-config.php</strong> for it to be more secure.<br />Please add the code before the line, <code>/* That\'s all, stop editing! Happy blogging. */</code>' ), ABSPATH );
+                $msg .= "<blockquote>$out</blockquote>";
+
+                echo "<div id='update-nag'>$msg</div>";
+        }
+}
+add_action( 'admin_notices', 'secret_salt_warning' );
+
+function mu_dashboard() {
+        unregister_sidebar_widget( 'dashboard_plugins' );
+}
+add_action( 'wp_dashboard_setup', 'mu_dashboard' );
+
+function profile_update_primary_blog() {
+        global $current_user;
+
+        $blogs = get_blogs_of_user( $current_user->id );
+        if ( isset( $blogs[ $_POST[ 'primary_blog' ] ] ) == false ) {
+                return false;
+        }
+
+        if ( isset( $_POST['primary_blog'] ) ) {
+                update_user_option( $current_user->id, 'primary_blog', (int) $_POST['primary_blog'], true );
+        }
+}
+add_action ( 'myblogs_update', 'profile_update_primary_blog' );
+
+function admin_notice_feed() {
+        global $current_user;
+        if( substr( $_SERVER[ 'PHP_SELF' ], -19 ) != '/wp-admin/index.php' )
+                return;
+
+        if( isset( $_GET[ 'feed_dismiss' ] ) )
+                update_user_option( $current_user->id, 'admin_feed_dismiss', $_GET[ 'feed_dismiss' ], true );
+
+        $url = get_site_option( 'admin_notice_feed' );
+        if( $url == '' )
+                return;
+        include_once( ABSPATH . 'wp-includes/rss.php' );
+        $rss = @fetch_rss( $url );
+        if( isset($rss->items) && 1 <= count($rss->items) ) {
+                if( md5( $rss->items[0][ 'title' ] ) == get_user_option( 'admin_feed_dismiss', $current_user->id ) )
+                        return;
+                $item = $rss->items[0];
+                $msg = "<h3>" . wp_specialchars( $item[ 'title' ] ) . "</h3>\n";
+                if ( isset($item['description']) )
+                        $content = $item['description'];
+                elseif ( isset($item['summary']) )
+                        $content = $item['summary'];
+                elseif ( isset($item['atom_content']) )
+                        $content = $item['atom_content'];
+                else
+                        $content = __( 'something' );
+                $content = wp_html_excerpt($content, 200) . ' ...';
+                $link = clean_url( strip_tags( $item['link'] ) );
+                $msg .= "<p>" . $content . " <a href='$link'>" . __( 'Read More' ) . "</a> <a href='index.php?feed_dismiss=" . md5( $item[ 'title' ] ) . "'>" . __( "Dismiss" ) . "</a></p>";
+                echo "<div class='updated fade'>$msg</div>";
+        } elseif( is_site_admin() ) {
+                printf("<div id='update-nag'>" . __("Your feed at %s is empty.") . "</div>", wp_specialchars( $url ));
+        }
+}
+add_action( 'admin_notices', 'admin_notice_feed' );
+
+function site_admin_notice() {
+        global $current_user, $wp_db_version;
+        if( !is_site_admin() )
+                return false;
+        printf("<div id='update-nag'>" . __("Hi %s! You're logged in as a site administrator.") . "</div>", $current_user->user_login);
+        if ( get_site_option( 'wpmu_upgrade_site' ) != $wp_db_version ) {
+                echo "<div id='update-nag'>" . __( 'Thank you for Upgrading! Please visit the <a href="wpmu-upgrade-site.php">Upgrade Site</a> page to update all your blogs.' ) . "</div>";
+        }
+}
+add_action( 'admin_notices', 'site_admin_notice' );
+
+function avoid_blog_page_permalink_collision( $data, $postarr ) {
+        if( constant( 'VHOST' ) == 'yes' )
+                return $data;
+        if( $data[ 'post_type' ] != 'page' )
+                return $data;
+        if( !isset( $data[ 'post_name' ] ) || $data[ 'post_name' ] == '' )
+                return $data;
+        if( !is_main_blog() )
+                return $data;
+
+        $post_name = $data[ 'post_name' ];
+        $c = 0;
+        while( $c < 10 && get_id_from_blogname( $post_name ) ) {
+                $post_name .= mt_rand( 1, 10 );
+                $c ++;
+        }
+        if( $post_name != $data[ 'post_name' ] ) {
+                $data[ 'post_name' ] = $post_name;
+        }
+        return $data;
+}
+add_filter( 'wp_insert_post_data', 'avoid_blog_page_permalink_collision', 10, 2 );
+
+/**
+ * activate_sitewide_plugin()
+ *
+ * Activates a plugin site wide (for all blogs on an installation)
+ */
+function activate_sitewide_plugin() {
+        if ( !isset( $_GET['sitewide'] ) )
+                return false;
+                
+        /* Add the plugin to the list of sitewide active plugins */
+        $active_sitewide_plugins = maybe_unserialize( get_site_option( 'active_sitewide_plugins' ) );
+        
+        /* Add the activated plugin to the list */
+        $active_sitewide_plugins[ $_GET['plugin'] ] = time();
+
+        /* Write the updated option to the DB */
+        if ( !update_site_option( 'active_sitewide_plugins', $active_sitewide_plugins ) )
+                return false;
+
+        return true;
+}
+add_action( 'activate_' . $_GET['plugin'], 'activate_sitewide_plugin' );
+
+/**
+ * deactivate_sitewide_plugin()
+ *
+ * Deactivates a plugin site wide (for all blogs on an installation)
+ */
+function deactivate_sitewide_plugin( $plugin = false ) {
+        if ( !$plugin )
+                $plugin = $_GET['plugin'];
+                
+        /* Get the active sitewide plugins */
+        $active_sitewide_plugins = (array) maybe_unserialize( get_site_option( 'active_sitewide_plugins' ) );
+
+        /* Remove the plugin we are deactivating from the list of active sitewide plugins */
+        foreach ( $active_sitewide_plugins as $plugin_file => $activation_time ) {
+                if ( $plugin == $plugin_file )
+                        unset( $active_sitewide_plugins[ $plugin_file ] );
+        }
+
+        if ( !update_site_option( 'active_sitewide_plugins', $active_sitewide_plugins ) )
+                wp_redirect( 'plugins.php?error=true' );
+        
+        return true;
+}
+add_action( 'deactivate_' . $_GET['plugin'], 'deactivate_sitewide_plugin' );
+add_action( 'deactivate_invalid_plugin', 'deactivate_sitewide_plugin' );
+
+/**
+ * add_sitewide_activate_row()
+ *
+ * Adds the "Activate plugin site wide" row for each plugin in the inactive plugins list.
+ */
+function add_sitewide_activate_row( $file, $plugin_data, $context ) {
+        if ( !is_site_admin() )
+                return false;
+        
+        if ( 'sitewide-active' == $context )
+                return false;
+        
+        if ( is_plugin_active( $file ) )
+                return false;
+                
+        echo '<tr><td colspan="5" style="background: #f5f5f5; text-align: right;">';
+
+        echo '<a href="' . wp_nonce_url( admin_url( 'plugins.php?action=activate&amp;sitewide=1&amp;plugin=' . $file ), 'activate-plugin_' . $file ) . '" title="' . __( 'Activate this plugin for all blogs across the entire network' ) . '">&uarr; ' . sprintf( __( 'Activate %s Site Wide' ), strip_tags( $plugin_data["Title"] ) ) . '</a>';
+        echo '</td></tr>';
+}
+add_action( 'after_plugin_row', 'add_sitewide_activate_row', 9, 3 );
+
+/**
+ * is_wpmu_sitewide_plugin()
+ *
+ * Checks for "Site Wide Only: true" in the plugin header to see if this should
+ * be activated as a site wide MU plugin.
+ */
+function is_wpmu_sitewide_plugin( $file ) {
+        /* Open the plugin file for reading to check if this is a wpmu-plugin. */
+        $fp = @fopen( WP_PLUGIN_DIR . '/' . $file, 'r' );
+        
+        /* Pull only the first 8kiB of the file in. */
+        $plugin_data = @fread( $fp, 8192 );
+        
+        /* PHP will close file handle, but we are good citizens. */
+        @fclose($fp);
+        
+        if ( preg_match( '|Site Wide Only:(.*)true$|mi', $plugin_data ) )
+                return true;
+
+        return false;
+}
+
+
+/**
+ * list_activate_sitewide_plugins()
+ *
+ * Lists all the plugins that have been activated site wide.
+ */
+function list_activate_sitewide_plugins() {
+        $all_plugins = get_plugins();
+
+        if ( !is_site_admin() )
+                return false;
+                
+        $active_sitewide_plugins = maybe_unserialize( get_site_option( 'active_sitewide_plugins') );
+        $context = 'sitewide-active';
+
+        if ( $active_sitewide_plugins ) {
+?>
+                <h3><?php _e( 'Currently Active Site Wide Plugins' ) ?></h3>
+        
+                <p><?php _e( 'Plugins that appear in the list below are activate for all blogs across this installation.' ) ?></p>
+
+                <table class="widefat" cellspacing="0" id="<?php echo $context ?>-plugins-table">
+                        <thead>
+                                <tr>
+                                        <th scope="col" class="manage-column check-column">&nbsp;</th>
+                                        <th scope="col" class="manage-column"><?php _e('Plugin'); ?></th>
+                                        <th scope="col" class="manage-column"><?php _e('Description'); ?></th>
+                                </tr>
+                        </thead>
+
+                        <tfoot>
+                                <tr>
+                                        <th scope="col" class="manage-column check-column">&nbsp;</th>
+                                        <th scope="col" class="manage-column"><?php _e('Plugin'); ?></th>
+                                        <th scope="col" class="manage-column"><?php _e('Description'); ?></th>
+                                </tr>
+                        </tfoot>
+
+                        <tbody class="plugins">
+                <?php
+                        foreach ( (array) $active_sitewide_plugins as $plugin_file => $activated_time ) {
+                                $action_links = array();
+                                $action_links[] = '<a href="' . wp_nonce_url( 'plugins.php?action=deactivate&amp;sitewide=1&amp;plugin=' . $plugin_file, 'deactivate-plugin_' . $plugin_file ) . '" title="' . __('Deactivate this plugin site wide') . '">' . __('Deactivate') . '</a>';
+
+                                if ( current_user_can('edit_plugins') && is_writable(WP_PLUGIN_DIR . '/' . $plugin_file) )
+                                        $action_links[] = '<a href="plugin-editor.php?file=' . $plugin_file . '" title="' . __('Open this file in the Plugin Editor') . '" class="edit">' . __('Edit') . '</a>';
+
+                                $action_links = apply_filters( 'plugin_action_links', $action_links, $plugin_file, $plugin_data, $context );
+                                $action_links = apply_filters( "plugin_action_links_$plugin_file", $action_links, $plugin_file, $plugin_data, $context );
+
+                                $plugin_data = $all_plugins[$plugin_file];
+                                
+                                echo "
+                        <tr class='$context' style='background: #eef2ff;'>
+                                <th scope='row' class='check-column'>&nbsp;</th>
+                                <td class='plugin-title'><strong>{$plugin_data['Name']}</strong></td>
+                                <td class='desc'><p>{$plugin_data['Description']}</p></td>
+                        </tr>
+                        <tr class='$context second' style='background: #eef2ff;'>
+                                <td></td>
+                                <td class='plugin-title'>";
+                                echo '<div class="row-actions-visible">';
+                                foreach ( $action_links as $action => $link ) {
+                                        $sep = end($action_links) == $link ? '' : ' | ';
+                                        echo "<span class='$action'>$link$sep</span>";
+                                }
+                                echo "</div></td>
+                                <td class='desc'>";
+                                $plugin_meta = array();
+                                if ( !empty($plugin_data['Version']) )
+                                        $plugin_meta[] = sprintf(__('Version %s'), $plugin_data['Version']);
+                                if ( !empty($plugin_data['Author']) ) {
+                                        $author = $plugin_data['Author'];
+                                        if ( !empty($plugin_data['AuthorURI']) )
+                                                $author = '<a href="' . $plugin_data['AuthorURI'] . '" title="' . __( 'Visit author homepage' ) . '">' . $plugin_data['Author'] . '</a>';
+                                        $plugin_meta[] = sprintf( __('By %s'), $author );
+                                }
+                                if ( ! empty($plugin_data['PluginURI']) )
+                                        $plugin_meta[] = '<a href="' . $plugin_data['PluginURI'] . '" title="' . __( 'Visit plugin site' ) . '">' . __('Visit plugin site') . '</a>';
+
+                                $plugin_meta = apply_filters('plugin_row_meta', $plugin_meta, $plugin_file, $plugin_data, $context);
+                                echo implode(' | ', $plugin_meta);
+                                echo "</td>
+                        </tr>\n";
+                        
+                                do_action( 'after_plugin_row', $plugin_file, $plugin_data, $context );
+                                do_action( "after_plugin_row_$plugin_file", $plugin_file, $plugin_data, $context );
+                        }
+                ?>
+                        </tbody>
+                </table>
+                
+                <p><?php _e( 'Plugins that are enabled site wide can only be disabled by a site administrator.' ) ?></p>
+                
+<?php
+        }
+}
+add_action( 'pre_current_active_plugins', 'list_activate_sitewide_plugins' );
+
+/**
+ * sitewide_filter_inactive_plugins_list()
+ *
+ * Filters the inactive plugins list so that it doesn't include plugins that have
+ * been activated site wide, and not for the specific blog.
+ */
+function sitewide_filter_inactive_plugins_list( $inactive_plugins ) {
+        $active_sitewide_plugins = (array) maybe_unserialize( get_site_option('active_sitewide_plugins') );
+
+        foreach ( $active_sitewide_plugins as $sitewide_plugin => $activated_time ) {
+                unset( $inactive_plugins[ $sitewide_plugin ] );
+        }
+
+        /* Now unset any sitewide only plugins if the user is not a site admin */        
+        if ( !is_site_admin() ) {
+                foreach ( $inactive_plugins as $plugin_name => $activated_time ) {
+                        if ( is_wpmu_sitewide_plugin( $plugin_name ) )
+                                unset( $inactive_plugins[ $plugin_name ] );
+                }
+        }
+        
+        return $inactive_plugins;
+}
+add_filter( 'all_plugins', 'sitewide_filter_inactive_plugins_list' );
+
+/**
+ * sitewide_filter_active_plugins_list()
+ *
+ * Filters the active plugins list so that it doesn't include plugins that have
+ * been activated site wide instead of the specific blog.
+ */
+function sitewide_filter_active_plugins_list( $active_plugins ) {
+        $active_sitewide_plugins = (array) maybe_unserialize( get_site_option('active_sitewide_plugins') );
+
+        foreach ( $active_sitewide_plugins as $sitewide_plugin => $activated_time ) {
+                unset( $active_plugins[ $sitewide_plugin ] );
+        }
+        
+        return $active_plugins;
+}
+add_filter( 'all_plugins', 'sitewide_filter_active_plugins_list' );
+
+/**
+ * check_is_wpmu_plugin_on_activate()
+ *
+ * When a plugin is activated, this will check if it should be activated site wide
+ * only.
+ */
+function check_is_wpmu_plugin_on_activate() {
+        /***
+         * On plugin activation on a blog level, check to see if this is actually a
+         * site wide MU plugin. If so, deactivate and activate it site wide.
+         */
+        if ( is_wpmu_sitewide_plugin( $_GET['plugin'] ) || isset( $_GET['sitewide'] ) ) {
+                deactivate_plugins( $_GET['plugin'], true );
+                
+                /* Silently activate because the activate_* hook has already run. */
+                if ( is_site_admin() ) {
+                        $_GET['sitewide'] = true;
+                        activate_sitewide_plugin( $_GET['plugin'], true );
+                }
+        }
+}
+add_action( 'activate_' . $_GET['plugin'], 'check_is_wpmu_plugin_on_activate' );
+
+/**
+ * check_wpmu_plugins_on_bulk_activate()
+ */
+function check_wpmu_plugins_on_bulk_activate( $plugins ) {
+        if ( $plugins ) {
+                foreach ( $plugins as $plugin ) {
+                        if ( is_wpmu_sitewide_plugin( $plugin ) ) {
+                                deactivate_plugins( $plugin );
+
+                                if ( is_site_admin() )
+                                        activate_sitewide_plugin( $plugin );
+                        }                        
+                }
+        }
+}
+
+function remove_edit_plugin_link( $action_links, $plugin_file, $plugin_data, $context ) {
+        foreach( $action_links as $t => $link ) {
+                if( !strpos( $link, __( "Open this file in the Plugin Editor" ) ) )
+                        $links[ $t ] = $link;
+        }
+        return $links;
+}
+add_filter( 'plugin_action_links', 'remove_edit_plugin_link', 10, 4 );
+
+function choose_primary_blog() {
+        global $current_user;
+        ?>
+        <table class="form-table">
+        <tr>
+                <th scope="row"><?php _e('Primary Blog'); ?></th>
+                <td>
+                <?php
+                $all_blogs = get_blogs_of_user( $current_user->ID );
+                $primary_blog = get_usermeta($current_user->ID, 'primary_blog');
+                if( count( $all_blogs ) > 1 ) {
+                        $found = false;
+                        ?>
+                        <select name="primary_blog">
+                                <?php foreach( (array) $all_blogs as $blog ) {
+                                        if( $primary_blog == $blog->userblog_id )
+                                                $found = true;
+                                        ?><option value='<?php echo $blog->userblog_id ?>'<?php if( $primary_blog == $blog->userblog_id ) echo ' selected="selected"' ?>>http://<?php echo $blog->domain.$blog->path ?></option><?php
+                                } ?>
+                        </select>
+                        <?php
+                        if( !$found ) {
+                                $blog = array_shift( $all_blogs );
+                                update_usermeta( $current_user->ID, 'primary_blog', $blog->userblog_id );
+                        }
+                } elseif( count( $all_blogs ) == 1 ) {
+                        $blog = array_shift( $all_blogs );
+                        echo $blog->domain;
+                        if( $primary_blog != $blog->userblog_id ) // Set the primary blog again if it's out of sync with blog list.
+                                update_usermeta( $current_user->ID, 'primary_blog', $blog->userblog_id );
+                } else {
+                        echo "N/A";
+                }
+                ?>
+                </td>
+        </tr>
+        </table>
+        <?php        
+}
+add_action ( 'myblogs_allblogs_options', 'choose_primary_blog' );
+
+if( strpos( $_SERVER['PHP_SELF'], 'profile.php' ) ) {
+        add_action( 'admin_init', 'update_profile_email' );
+        add_action( 'admin_init', 'profile_page_email_warning_ob_start' );
+}
+
+function disable_some_pages() {
+        global $messages;
+
+        if ( strpos( $_SERVER['PHP_SELF'], 'user-new.php' ) && !get_site_option( 'add_new_users' ) ) {
+                if ( is_site_admin() ) {
+                        $messages[] = '<div id="message" class="updated fade"><p>' . __( 'Warning! Only site administrators may see this page. Everyone else will see a <em>page disabled</em> message. Enable it again on <a href="wpmu-options.php#addnewusers">the options page</a>.' ) . '</p></div>';
+                } else {
+                        wp_die( __('Page disabled by the administrator') );
+                }
+        }
+
+        $pages = array( 'theme-editor.php', 'plugin-editor.php' );
+        foreach( $pages as $page ) {
+                if ( strpos( $_SERVER['PHP_SELF'], $page ) ) {
+                        wp_die( __('Page disabled by the administrator') );
+                }
+        }
+
+        $pages = array( 'theme-install.php', 'plugin-install.php' );
+        foreach( $pages as $page ) {
+                if ( strpos( $_SERVER['PHP_SELF'], $page ) && !is_site_admin() ) {
+                        wp_die( __( "Sorry, you're not allowed here." ) );
+                }
+        }
+
+}
+add_action( 'admin_init', 'disable_some_pages' );
+
+function blogs_listing_post() {
+        if ( !isset( $_POST[ 'action' ] ) ) {
+                return false;
+        }
+        switch( $_POST[ 'action' ] ) {
+                case "updateblogsettings":
+                        do_action( 'myblogs_update' );
+                wp_redirect( admin_url( 'index.php?page=myblogs&updated=1' ) );
+                die();
+                break;
+        }
+}
+add_action( 'admin_init', 'blogs_listing_post' );
+
+function blogs_listing() {
+        global $current_user;
+
+        $blogs = get_blogs_of_user( $current_user->ID );
+        if( !$blogs || ( is_array( $blogs ) && empty( $blogs ) ) ) {
+                wp_die( __( 'You must be a member of at least one blog to use this page.' ) );
+        }
+
+        if ( empty($title) )
+                $title = apply_filters( 'my_blogs_title', __( 'My Blogs' ) );
+        ?>
+        <div class="wrap">
+        <?php if( $_GET[ 'updated' ] ) { ?>
+                <div id="message" class="updated fade"><p><strong><?php _e( 'Your blog options have been updated.' ); ?></strong></p></div>
+        <?php } ?>
+        <?php screen_icon(); ?>
+        <h2><?php echo wp_specialchars( $title ); ?></h2>
+        <form id="myblogs" action="" method="post">
+        <?php
+        do_action( 'myblogs_allblogs_options' );
+        ?><table class='widefat'> <?php
+        $settings_html = apply_filters( 'myblogs_options', '', 'global' );
+        if ( $settings_html != '' ) {
+                echo "<tr><td valign='top'><h3>" . __( 'Global Settings' ) . "</h3></td><td>";
+                echo $settings_html;
+                echo "</td></tr>";
+        }
+        reset( $blogs );
+        $num = count( $blogs );
+        $cols = 1;
+        if ( $num >= 20 ) {
+                $cols = 4;
+        } elseif ( $num >= 10 ) {
+                $cols = 2;
+        }
+        $num_rows = ceil($num/$cols);
+        $split = 0;
+        for( $i = 1; $i <= $num_rows; $i++ ) {
+                $rows[] = array_slice( $blogs, $split, $cols );
+                $split = $split + $cols;
+        }
+
+        foreach( $rows as $row ) {
+                $c = $c == "alternate" ? "" : "alternate";
+                echo "<tr class='$c'>";
+                foreach( $row as $user_blog ) {
+                        $t = $t == "border-right: 1px solid #ccc;" ? "" : "border-right: 1px solid #ccc;";
+                        echo "<td valign='top' style='$t; width:50%'>";
+                        echo "<h3>{$user_blog->blogname}</h3>";
+                        echo "<p>" . apply_filters( "myblogs_blog_actions", "<a href='{$user_blog->siteurl}'>" . __( 'Visit' ) . "</a> | <a href='{$user_blog->siteurl}/wp-admin/'>" . __( 'Dashboard' ) . "</a>", $user_blog ) . "</p>";
+                        echo apply_filters( 'myblogs_options', '', $user_blog );
+                        echo "</td>";
+                }
+                echo "</tr>";
+        }?>
+        </table>
+        <input type="hidden" name="action" value="updateblogsettings" />
+        <p>
+         <input type="submit" class="button-primary" value="<?php _e('Update Options') ?>" name="submit" />
+        </p>
+        </form>
+        </div>
+        <?php
+}
+
+function blogs_page_init() {
+        global $current_user;
+        $all_blogs = get_blogs_of_user( $current_user->ID );
+        if ( $all_blogs != false && !empty( $all_blogs ) ) {
+                $title = apply_filters( 'my_blogs_title', __( 'My Blogs' ) );
+                add_submenu_page( 'index.php', $title, $title, 'read', 'myblogs', 'blogs_listing' );
+        }
+}
+add_action('admin_menu', 'blogs_page_init');
+
+function update_signup_email_from_profile( $user_id ) {
+        global $wpdb;
+        $user_login = $wpdb->get_var( $wpdb->prepare( "SELECT user_login FROM {$wpdb->users} WHERE ID = %d", $user_id ) );
+        if ( $user_login && is_email( $_POST[ 'email' ] ) && $wpdb->get_var( $wpdb->prepare( "SELECT user_login FROM {$wpdb->signups} WHERE user_login = %s", $user_login ) ) ) {
+                $wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->signups} SET user_email = %s WHERE user_login = %s", $_POST[ 'email' ], $user_login ) );
+        }
+}
+add_action( 'edit_user_profile_update', 'update_signup_email_from_profile' );
+
+function stripslashes_from_options( $blog_id ) {
+        global $wpdb;
+
+        if ( $blog_id == 1 ) { // check site_options too
+                $start = 0;
+                while( $rows = $wpdb->get_results( "SELECT meta_key, meta_value FROM {$wpdb->sitemeta} ORDER BY meta_id LIMIT $start, 20" ) ) {
+                        foreach( $rows as $row ) {
+                                $value = $row->meta_value;
+                                if ( !@unserialize( $value ) )
+                                        $value = stripslashes( $value );
+                                if ( $value !== $row->meta_value ) {
+                                        update_site_option( $row->meta_key, $value );
+                                }
+                        }
+                        $start += 20;
+                }
+        }
+        $start = 0;
+        $options_table = $wpdb->get_blog_prefix( $blog_id ) . "options";
+        while( $rows = $wpdb->get_results( "SELECT option_name, option_value FROM $options_table ORDER BY option_id LIMIT $start, 20" ) ) {
+                foreach( $rows as $row ) {
+                        $value = $row->option_value;
+                        if ( !@unserialize( $value ) )
+                                $value = stripslashes( $value );
+                        if ( $value !== $row->option_value ) {
+                                update_blog_option( $blog_id, $row->option_name, $value );
+                        }
+                }
+                $start += 20;
+        }
+        refresh_blog_details( $blog_id );
+}
+add_action( 'wpmu_upgrade_site', 'stripslashes_from_options' );
+
+function show_post_thumbnail_warning() {
+        if ( false == is_site_admin() ) {
+                return;
+        }
+        $mu_media_buttons = get_site_option( 'mu_media_buttons', array() );
+        if ( !$mu_media_buttons[ 'image' ] && current_theme_supports( 'post-thumbnails' ) ) {
+                echo "<div id='update-nag'>" . sprintf( __( "Warning! The current theme supports post thumbnails. You must enable image uploads on <a href='%s'>the options page</a> for it to work." ), admin_url( 'wpmu-options.php' ) ) . "</div>";
+        }
+}
+add_action( 'admin_notices', 'show_post_thumbnail_warning' );
+
+?>
</ins><span class="cx">Property changes on: trunk/wp-admin/includes/ms.php
</span><span class="cx">___________________________________________________________________
</span><span class="cx">Name: svn:executable
</span><span class="cx"> + *
</span></span></pre></div>
<a id="trunkwpadminlinkimportphp"></a>
<div class="addfile"><h4>Added: trunk/wp-admin/link-import.php (0 => 12603)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/wp-admin/link-import.php         (rev 0)
+++ trunk/wp-admin/link-import.php        2010-01-06 04:02:57 UTC (rev 12603)
</span><span class="lines">@@ -0,0 +1,144 @@
</span><ins>+<?php
+/**
+ * Links Import Administration Panel.
+ *
+ * @copyright 2002 Mike Little <mike@zed1.com>
+ * @author Mike Little <mike@zed1.com>
+ * @package WordPress
+ * @subpackage Administration
+ */
+
+/** Load WordPress Administration Bootstrap */
+require_once('admin.php');
+$parent_file = 'edit.php';
+$title = __('Import Blogroll');
+
+$step = $_POST['step'];
+if (!$step) $step = 0;
+?>
+<?php
+switch ($step) {
+        case 0: {
+                include_once('admin-header.php');
+                if ( !current_user_can('manage_links') )
+                        wp_die(__('Cheatin&#8217; uh?'));
+
+                $opmltype = 'blogrolling'; // default.
+?>
+
+<div class="wrap">
+
+<h2><?php _e('Import your blogroll from another system') ?> </h2>
+<form enctype="multipart/form-data" action="link-import.php" method="post" name="blogroll">
+<?php wp_nonce_field('import-bookmarks') ?>
+
+<p><?php _e('If a program or website you use allows you to export your links or subscriptions as OPML you may import them here.'); ?></p>
+<div style="width: 70%; margin: auto; height: 8em;">
+<input type="hidden" name="step" value="1" />
+<input type="hidden" name="MAX_FILE_SIZE" value="30000" />
+<div style="width: 48%;" class="alignleft">
+<h3><label for="opml_url"><?php _e('Specify an OPML URL:'); ?></label></h3>
+<input type="text" name="opml_url" id="opml_url" size="50" style="width: 90%;" value="http://" />
+</div>
+
+<div style="width: 48%;" class="alignleft">
+<h3><label for="userfile"><?php _e('Or choose from your local disk:'); ?></label></h3>
+<input id="userfile" name="userfile" type="file" size="30" />
+</div>
+
+</div>
+
+<p style="clear: both; margin-top: 1em;"><label for="cat_id"><?php _e('Now select a category you want to put these links in.') ?></label><br />
+<?php _e('Category:') ?> <select name="cat_id" id="cat_id">
+<?php
+$categories = get_terms('link_category', 'get=all');
+foreach ($categories as $category) {
+?>
+<option value="<?php echo $category->term_id; ?>"><?php echo wp_specialchars(apply_filters('link_category', $category->name)); ?></option>
+<?php
+} // end foreach
+?>
+</select></p>
+
+<p class="submit"><input type="submit" name="submit" value="<?php _e('Import OPML File') ?>" /></p>
+</form>
+
+</div>
+<?php
+                break;
+        } // end case 0
+
+        case 1: {
+                check_admin_referer('import-bookmarks');
+
+                include_once('admin-header.php');
+                if ( !current_user_can('manage_links') )
+                        wp_die(__('Cheatin&#8217; uh?'));
+?>
+<div class="wrap">
+
+<h2><?php _e('Importing...') ?></h2>
+<?php
+                $cat_id = abs( (int) $_POST['cat_id'] );
+                if ( $cat_id < 1 )
+                        $cat_id = 1;
+
+                $opml_url = $_POST['opml_url'];
+                if ( isset($opml_url) && $opml_url != '' && $opml_url != 'http://' ) {
+                        $blogrolling = true;
+                } else { // try to get the upload file.
+                        $overrides = array('test_form' => false, 'test_type' => false);
+                        $file = wp_handle_upload($_FILES['userfile'], $overrides);
+
+                        if ( isset($file['error']) )
+                                wp_die($file['error']);
+
+                        $url = $file['url'];
+                        $opml_url = $file['file'];
+                        $blogrolling = false;
+                }
+
+                if ( isset($opml_url) && $opml_url != '' ) {
+                        if ( $blogrolling === true ) {
+                                $opml = wp_remote_fopen($opml_url);
+                        } else {
+                                $opml = file_get_contents($opml_url);
+                        }
+
+                        /** Load OPML Parser */
+                        include_once('link-parse-opml.php');
+
+                        $link_count = count($names);
+                        for ( $i = 0; $i < $link_count; $i++ ) {
+                                if ('Last' == substr($titles[$i], 0, 4))
+                                        $titles[$i] = '';
+                                if ( 'http' == substr($titles[$i], 0, 4) )
+                                        $titles[$i] = '';
+                                $link = array( 'link_url' => $urls[$i], 'link_name' => $wpdb->escape($names[$i]), 'link_category' => array($cat_id), 'link_description' => $wpdb->escape($descriptions[$i]), 'link_owner' => $user_ID, 'link_rss' => $feeds[$i]);
+                                wp_insert_link($link);
+                                echo sprintf('<p>'.__('Inserted <strong>%s</strong>').'</p>', $names[$i]);
+                        }
+?>
+
+<p><?php printf(__('Inserted %1$d links into category %2$s. All done! Go <a href="%3$s">manage those links</a>.'), $link_count, $cat_id, 'link-manager.php') ?></p>
+
+<?php
+} // end if got url
+else
+{
+        echo "<p>" . __("You need to supply your OPML url. Press back on your browser and try again") . "</p>\n";
+} // end else
+
+if ( ! $blogrolling )
+        do_action( 'wp_delete_file', $opml_url);
+        @unlink($opml_url);
+?>
+</div>
+<?php
+                break;
+        } // end case 1
+} // end switch
+
+include('admin-footer.php');
+
+?>
</ins><span class="cx">Property changes on: trunk/wp-admin/link-import.php
</span><span class="cx">___________________________________________________________________
</span><span class="cx">Name: svn:executable
</span><span class="cx"> + *
</span></span></pre></div>
<a id="trunkwpadminmsadminphp"></a>
<div class="addfile"><h4>Added: trunk/wp-admin/ms-admin.php (0 => 12603)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/wp-admin/ms-admin.php         (rev 0)
+++ trunk/wp-admin/ms-admin.php        2010-01-06 04:02:57 UTC (rev 12603)
</span><span class="lines">@@ -0,0 +1,62 @@
</span><ins>+<?php
+require_once('admin.php');
+
+$title = __('WordPress MU &rsaquo; Admin');
+$parent_file = 'wpmu-admin.php';
+
+function index_css() {
+        wp_admin_css( 'css/dashboard' );
+}
+add_action( 'admin_head', 'index_css' );
+
+require_once('admin-header.php');
+
+if( is_site_admin() == false ) {
+        wp_die( __('You do not have permission to access this page.') );
+}
+
+global $wpdb;
+$c_users = $wpdb->get_var("SELECT COUNT(id) FROM {$wpdb->users}");
+$c_blogs = $wpdb->get_var("SELECT COUNT(blog_id) FROM {$wpdb->blogs}");
+
+$user_text = sprintf( __ngettext( '%s user', '%s users', $c_users ), number_format_i18n( $c_users ) );
+$blog_text = sprintf( __ngettext( '%s blog', '%s blogs', $c_blogs ), number_format_i18n( $c_blogs ) );
+
+$sentence = sprintf( __( 'You have %1$s and %2$s.' ), $blog_text, $user_text );
+$title = __( 'WordPress MU : Admin' );
+?>
+
+<div class="wrap">
+        <h2><?php echo wp_specialchars( $title ); ?></h2>
+
+        <ul class="subsubsub">
+        <li><a href="wpmu-blogs.php#form-add-blog" class="rbutton"><strong><?php _e('Create a New Blog'); ?></strong></a> | </li>
+        <li><a href="wpmu-users.php#form-add-user" class="rbutton"><?php _e('Create a New User'); ?></a></li>
+        </ul>
+        <br clear='all' />
+
+        <p class="youhave"><?php echo $sentence; ?></p>
+        <?php do_action('wpmuadminresult', ''); ?>
+
+        <form name="searchform" action="wpmu-users.php" method="get">
+                <p>
+                        <input type="hidden" name="action" value="users" />
+                        <input type="text" name="s" value="" size="17" />
+                        <input class="button" type="submit" name="submit" value="<?php _e("Search Users &raquo;"); ?>" />
+                </p>
+        </form>
+
+        <form name="searchform" action="wpmu-blogs.php" method="get">
+                <p>
+                        <input type="hidden" name="action" value="blogs" />
+                        <input type="text" name="s" value="" size="17" />
+                        <input class="button" type="submit" name="blog_name" value="<?php _e("Search Blogs &raquo;"); ?>" />
+                </p>
+        </form>
+
+        <?php do_action( 'mu_rightnow_end' ); ?>
+        <?php do_action( 'mu_activity_box_end' ); ?>
+        </div><!-- rightnow -->
+</div>
+
+<?php include('admin-footer.php'); ?>
</ins><span class="cx">Property changes on: trunk/wp-admin/ms-admin.php
</span><span class="cx">___________________________________________________________________
</span><span class="cx">Name: svn:executable
</span><span class="cx"> + *
</span></span></pre></div>
<a id="trunkwpadminmseditphp"></a>
<div class="addfile"><h4>Added: trunk/wp-admin/ms-edit.php (0 => 12603)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/wp-admin/ms-edit.php         (rev 0)
+++ trunk/wp-admin/ms-edit.php        2010-01-06 04:02:57 UTC (rev 12603)
</span><span class="lines">@@ -0,0 +1,535 @@
</span><ins>+<?php
+require_once('admin.php');
+if( is_site_admin() == false ) {
+        wp_die( __('You do not have permission to access this page.') );
+}
+
+do_action('wpmuadminedit', '');
+
+if( isset($_GET[ 'id' ]) ) {
+        $id = intval( $_GET[ 'id' ] );
+} elseif( isset($_POST[ 'id' ]) ) {
+        $id = intval( $_POST[ 'id' ] );
+}
+
+if( isset( $_POST['ref'] ) == false && !empty($_SERVER['HTTP_REFERER']) ) {
+        $_POST['ref'] = $_SERVER['HTTP_REFERER'];
+}
+
+switch( $_GET['action'] ) {
+        case "siteoptions":
+                check_admin_referer('siteoptions');
+                if( empty( $_POST ) )
+                        wp_die( __("You probably need to go back to the <a href='wpmu-options.php'>options page</a>") );
+
+                update_site_option( "WPLANG", $_POST['WPLANG'] );
+
+                if( is_email( $_POST['admin_email'] ) )
+                        update_site_option( "admin_email", $_POST['admin_email'] );
+
+                $illegal_names = split( ' ', $_POST['illegal_names'] );
+                foreach( (array) $illegal_names as $name ) {
+                        $name = trim( $name );
+                        if( $name != '' )
+                                $names[] = trim( $name );
+                }
+                update_site_option( "illegal_names", $names );
+
+                if( $_POST['limited_email_domains'] != '' ) {
+                        $limited_email_domains = str_replace( ' ', "\n", $_POST[ 'limited_email_domains' ] );
+                        $limited_email_domains = split( "\n", stripslashes( $limited_email_domains ) );
+                        foreach( (array) $limited_email_domains as $domain ) {
+                                $limited_email[] = trim( $domain );
+                        }
+                        update_site_option( "limited_email_domains", $limited_email );
+                } else {
+                        update_site_option( "limited_email_domains", '' );
+                }
+
+                if( $_POST['banned_email_domains'] != '' ) {
+                        $banned_email_domains = split( "\n", stripslashes( $_POST[ 'banned_email_domains' ] ) );
+                        foreach( (array) $banned_email_domains as $domain ) {
+                                $banned[] = trim( $domain );
+                        }
+                        update_site_option( "banned_email_domains", $banned );
+                } else {
+                        update_site_option( "banned_email_domains", '' );
+                }
+                update_site_option( 'default_user_role', $_POST[ 'default_user_role' ] );
+                if( trim( $_POST[ 'dashboard_blog_orig' ] ) == '' )
+                        $_POST[ 'dashboard_blog_orig' ] = $current_site->blog_id;
+                if( trim( $_POST[ 'dashboard_blog' ] ) == '' ) {
+                        $_POST[ 'dashboard_blog' ] = $current_site->blog_id;
+                        $dashboard_blog_id = $current_site->blog_id;
+                } else {
+                        $dashboard_blog = untrailingslashit( sanitize_user( str_replace( '.', '', str_replace( $current_site->domain . $current_site->path, '', $_POST[ 'dashboard_blog' ] ) ) ) );
+                        $blog_details = get_blog_details( $dashboard_blog );
+                        if ( false === $blog_details ) {
+                                if ( is_numeric( $dashboard_blog ) )
+                                        wp_die( __( 'Dashboard blog_id must be a blog that already exists' ) );
+                                if ( constant( 'VHOST' ) == 'yes' ) {
+                                        $domain = $dashboard_blog . '.' . $current_site->domain;
+                                        $path = $current_site->path;
+                                } else {
+                                        $domain = $current_site->domain;
+                                        $path = trailingslashit( $current_site->path . $dashboard_blog );
+                                }
+                                $wpdb->hide_errors();
+                                $dashboard_blog_id = wpmu_create_blog( $domain, $path, __( 'My Dashboard' ), $current_user->id , array( "public" => 0 ), $current_site->id );
+                                $wpdb->show_errors();
+                        } else {
+                                $dashboard_blog_id = $blog_details->blog_id;
+                        }
+                }
+                if ( is_wp_error( $dashboard_blog_id ) ) {
+                        wp_die( __( 'Problem creating dashboard blog: ' ) . $dashboard_blog_id->get_error_message() );
+                }
+                if( $_POST[ 'dashboard_blog_orig' ] != $_POST[ 'dashboard_blog' ] ) {
+                        $users = get_users_of_blog( get_site_option( 'dashboard_blog' ) );
+                        $move_users = array();
+                        foreach ( (array)$users as $user ) {
+                                if( array_pop( array_keys( unserialize( $user->meta_value ) ) ) == 'subscriber' )
+                                        $move_users[] = $user->user_id;
+                        }
+                        if ( false == empty( $move_users ) ) {
+                                foreach ( (array)$move_users as $user_id ) {
+                                        remove_user_from_blog($user_id, get_site_option( 'dashboard_blog' ) );
+                                        add_user_to_blog( $dashboard_blog_id, $user_id, get_site_option( 'default_user_role', 'subscriber' ) );
+                                        update_usermeta( $user_id, 'primary_blog', $dashboard_blog_id );
+                                }
+                        }
+                }
+                update_site_option( "dashboard_blog", $dashboard_blog_id );
+                $options = array( 'registrationnotification', 'registration', 'add_new_users', 'menu_items', 'mu_media_buttons', 'upload_space_check_disabled', 'blog_upload_space', 'upload_filetypes', 'site_name', 'first_post', 'first_page', 'first_comment', 'first_comment_url', 'first_comment_author', 'welcome_email', 'welcome_user_email', 'fileupload_maxk', 'admin_notice_feed' );
+                foreach( $options as $option_name ) {
+                        $value = stripslashes_deep( $_POST[ $option_name ] );
+                        update_site_option( $option_name, $value );
+                }
+
+                $site_admins = explode( ' ', str_replace( ",", " ", $_POST['site_admins'] ) );
+                if ( is_array( $site_admins ) ) {
+                        $mainblog_id = $wpdb->get_var( "SELECT blog_id FROM {$wpdb->blogs} WHERE domain='{$current_site->domain}' AND path='{$current_site->path}'" );
+                        if( $mainblog_id ) {
+                                reset( $site_admins );
+                                foreach( (array) $site_admins as $site_admin ) {
+                                        $uid = $wpdb->get_var( "SELECT ID FROM {$wpdb->users} WHERE user_login='{$site_admin}'" );
+                                        if( $uid )
+                                                add_user_to_blog( $mainblog_id, $uid, 'administrator' );
+                                }
+                        }
+                        update_site_option( 'site_admins' , $site_admins );
+                }
+
+                // Update more options here
+                do_action( 'update_wpmu_options' );
+
+                wp_redirect( add_query_arg( "updated", "true", 'wpmu-options.php' ) );
+                exit();
+        break;
+        case "addblog":
+                check_admin_referer('add-blog');
+
+                if( is_array( $_POST[ 'blog' ] ) == false ) {
+                        wp_die( "Can't create an empty blog." );
+                }
+                $blog = $_POST['blog'];
+                $domain = sanitize_user( str_replace( '/', '', $blog[ 'domain' ] ) );
+                $email = sanitize_email( $blog[ 'email' ] );
+                $title = $blog[ 'title' ];
+
+                if ( empty($domain) || empty($email))
+                        wp_die( __('Missing blog address or email address.') );
+                if( !is_email( $email ) )
+                        wp_die( __('Invalid email address') );
+
+                if( constant( 'VHOST' ) == 'yes' ) {
+                        $newdomain = $domain.".".$current_site->domain;
+                        $path = $base;
+                } else {
+                        $newdomain = $current_site->domain;
+                        $path = $base.$domain.'/';
+                }
+
+                $password = 'N/A';
+                $user_id = email_exists($email);
+                if( !$user_id ) { // Create a new user with a random password
+                        $password = generate_random_password();
+                        $user_id = wpmu_create_user( $domain, $password, $email );
+                        if(false == $user_id) {
+                                wp_die( __('There was an error creating the user') );
+                        } else {
+                                wp_new_user_notification($user_id, $password);
+                        }
+                }
+
+                $wpdb->hide_errors();
+                $id = wpmu_create_blog($newdomain, $path, $title, $user_id , array( "public" => 1 ), $current_site->id);
+                $wpdb->show_errors();
+                if( !is_wp_error($id) ) {
+                        $dashboard_blog = get_dashboard_blog();
+                        if( get_user_option( 'primary_blog', $user_id ) == $dashboard_blog->blog_id )
+                                update_user_option( $user_id, 'primary_blog', $id, true );
+                        $content_mail = sprintf( __( "New blog created by %1s\n\nAddress: http://%2s\nName: %3s"), $current_user->user_login , $newdomain.$path, stripslashes( $title ) );
+                        wp_mail( get_site_option('admin_email'), sprintf(__('[%s] New Blog Created'), $current_site->site_name), $content_mail, 'From: "Site Admin" <' . get_site_option( 'admin_email' ) . '>' );
+                        wpmu_welcome_notification( $id, $user_id, $password, $title, array( "public" => 1 ) );
+                        wp_redirect( add_query_arg( array('updated' => 'true', 'action' => 'add-blog'), $_SERVER['HTTP_REFERER'] ) );
+                        exit();
+                } else {
+                        wp_die( $id->get_error_message() );
+                }
+        break;
+
+        case "updateblog":
+                check_admin_referer('editblog');
+                if( empty( $_POST ) )
+                        wp_die( __('You probably need to go back to the <a href="wpmu-blogs.php">blogs page</a>') );
+
+                // themes
+                if( is_array( $_POST[ 'theme' ] ) ) {
+                        $_POST[ 'option' ][ 'allowedthemes' ] = $_POST[ 'theme' ];
+                } else {
+                        $_POST[ 'option' ][ 'allowedthemes' ] = '';
+                }
+
+                switch_to_blog( $id );
+                if( is_array( $_POST[ 'option' ] ) ) {
+                        $c = 1;
+                        $count = count( $_POST[ 'option' ] );
+                        foreach ( (array) $_POST['option'] as $key => $val ) {
+                                if( $key === 0 )
+                                        continue; // Avoids "0 is a protected WP option and may not be modified" error when edit blog options
+                                if( $c == $count ) {
+                                        update_option( $key, $val );
+                                } else {
+                                        update_option( $key, $val, false ); // no need to refresh blog details yet
+                                }
+                                $c++;
+                        }
+                }
+
+                if( $_POST['update_home_url'] == 'update' ) {
+                        if( get_option( 'siteurl' ) != 'http://' . $_POST['blog']['domain'] . $_POST['blog']['path'] )
+                                update_option( 'siteurl', 'http://' . $_POST['blog']['domain'] . $_POST['blog']['path'] );
+
+                        if( get_option( 'home' ) != 'http://' . $_POST['blog']['domain'] . $_POST['blog']['path'] )
+                                update_option( 'home', 'http://' . $_POST['blog']['domain'] . $_POST['blog']['path'] );
+                }
+                        
+                $wp_rewrite->flush_rules();
+
+                // update blogs table
+                $result = $wpdb->query( "UPDATE {$wpdb->blogs} SET
+                                domain = '".$_POST[ 'blog' ][ 'domain' ]."',
+                                path = '".$_POST[ 'blog' ][ 'path' ]."',
+                                registered = '".$_POST[ 'blog' ][ 'registered' ]."',
+                                public = '".$_POST[ 'blog' ][ 'public' ]."',
+                                archived = '".$_POST[ 'blog' ][ 'archived' ]."',
+                                mature = '".$_POST[ 'blog' ][ 'mature' ]."',
+                                deleted = '".$_POST[ 'blog' ][ 'deleted' ]."',
+                                spam = '".$_POST[ 'blog' ][ 'spam' ]."'
+                        WHERE blog_id = '$id'" );
+
+                update_blog_status( $id, 'spam', $_POST[ 'blog' ][ 'spam' ] );
+                update_option( 'blog_public', $_POST[ 'blog' ][ 'public' ] );
+
+                // get blog prefix
+                $blog_prefix = $wpdb->get_blog_prefix( $id );
+                // user roles
+                if( is_array( $_POST[ 'role' ] ) == true ) {
+                        $newroles = $_POST[ 'role' ];
+                        reset( $newroles );
+                        foreach ( (array) $newroles as $userid => $role ) {
+                                $role_len = strlen( $role );
+                                $existing_role = $wpdb->get_var( "SELECT meta_value FROM $wpdb->usermeta WHERE user_id = '$userid' AND meta_key = '" . $blog_prefix. "capabilities'" );
+                                if( false == $existing_role ) {
+                                        $wpdb->query( "INSERT INTO " . $wpdb->usermeta . "( `umeta_id` , `user_id` , `meta_key` , `meta_value` ) VALUES ( NULL, '$userid', '" . $blog_prefix . "capabilities', 'a:1:{s:" . strlen( $role ) . ":\"" . $role . "\";b:1;}')" );
+                                } elseif( $existing_role != "a:1:{s:" . strlen( $role ) . ":\"" . $role . "\";b:1;}" ) {
+                                        $wpdb->query( "UPDATE $wpdb->usermeta SET meta_value = 'a:1:{s:" . strlen( $role ) . ":\"" . $role . "\";b:1;}' WHERE user_id = '$userid' AND meta_key = '" . $blog_prefix . "capabilities'" );
+                                }
+
+                        }
+                }
+
+                // remove user
+                if( is_array( $_POST[ 'blogusers' ] ) ) {
+                        reset( $_POST[ 'blogusers' ] );
+                        foreach ( (array) $_POST[ 'blogusers' ] as $key => $val )
+                                remove_user_from_blog( $key, $id );
+                }
+
+                // change password
+                if( is_array( $_POST[ 'user_password' ] ) ) {
+                        reset( $_POST[ 'user_password' ] );
+                        $newroles = $_POST[ 'role' ];
+                        foreach ( (array) $_POST[ 'user_password' ] as $userid => $pass ) {
+                                unset( $_POST[ 'role' ] );
+                                $_POST[ 'role' ] = $newroles[ $userid ];
+                                if( $pass != '' ) {
+                                        $cap = $wpdb->get_var( "SELECT meta_value FROM {$wpdb->usermeta} WHERE user_id = '{$userid}' AND meta_key = '{$blog_prefix}capabilities' AND meta_value = 'a:0:{}'" );
+                                        $userdata = get_userdata($userid);
+                                        $_POST[ 'pass1' ] = $_POST[ 'pass2' ] = $pass;
+                                        $_POST[ 'email' ] = $userdata->user_email;
+                                        $_POST[ 'rich_editing' ] = $userdata->rich_editing;
+                                        edit_user( $userid );
+                                        if( $cap == null )
+                                                $wpdb->query( "DELETE FROM {$wpdb->usermeta} WHERE user_id = '{$userid}' AND meta_key = '{$blog_prefix}capabilities' AND meta_value = 'a:0:{}'" );
+                                }
+                        }
+                        unset( $_POST[ 'role' ] );
+                        $_POST[ 'role' ] = $newroles;
+                }
+
+                // add user?
+                if( $_POST[ 'newuser' ] != '' ) {
+                        $newuser = $_POST[ 'newuser' ];
+                        $userid = $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM " . $wpdb->users . " WHERE user_login = %s", $newuser ) );
+                        if( $userid ) {
+                                $user = $wpdb->get_var( "SELECT user_id FROM " . $wpdb->usermeta . " WHERE user_id='$userid' AND meta_key='wp_" . $id . "_capabilities'" );
+                                if( $user == false )
+                                        add_user_to_blog($id, $userid, $_POST[ 'new_role' ]);
+                        }
+                }
+                do_action( 'wpmu_update_blog_options' );
+                restore_current_blog();
+                wpmu_admin_do_redirect( "wpmu-blogs.php?action=editblog&updated=true&id=".$id );
+        break;
+
+        case "deleteblog":
+                check_admin_referer('deleteblog');
+                if( $id != '0' && $id != $current_site->blog_id )
+                        wpmu_delete_blog( $id, true );
+
+                wp_redirect( add_query_arg( array('updated' => 'true', 'action' => 'delete'), $_POST[ 'ref' ] ) );
+                exit();
+        break;
+
+        case "allblogs":
+                check_admin_referer('allblogs');
+                foreach ( (array) $_POST[ 'allblogs' ] as $key => $val ) {
+                        if( $val != '0' && $val != $current_site->blog_id ) {
+                                if ( isset($_POST['allblog_delete']) ) {
+                                        $blogfunction = 'all_delete';
+                                        wpmu_delete_blog( $val, true );
+                                } elseif ( isset($_POST['allblog_spam']) ) {
+                                        $blogfunction = 'all_spam';
+                                        update_blog_status( $val, "spam", '1', 0 );
+                                        set_time_limit(60);
+                                } elseif ( isset($_POST['allblog_notspam']) ) {
+                                        $blogfunction = 'all_notspam';
+                                        update_blog_status( $val, "spam", '0', 0 );
+                                        set_time_limit(60);
+                                }
+                        }
+                }
+
+                wp_redirect( add_query_arg( array('updated' => 'true', 'action' => $blogfunction), $_SERVER['HTTP_REFERER'] ) );
+                exit();
+        break;
+
+        case "archiveblog":
+                check_admin_referer('archiveblog');
+                update_blog_status( $id, "archived", '1' );
+                do_action( "archive_blog", $id );
+                wp_redirect( add_query_arg( array('updated' => 'true', 'action' => 'archive'), $_POST['ref'] ) );
+                exit();
+        break;
+
+        case "unarchiveblog":
+                check_admin_referer('unarchiveblog');
+                do_action( "unarchive_blog", $id );
+                update_blog_status( $id, "archived", '0' );
+                wp_redirect( add_query_arg( array('updated' => 'true', 'action' => 'unarchive'), $_POST['ref'] ) );
+                exit();
+        break;
+
+        case "activateblog":
+                check_admin_referer('activateblog');
+                update_blog_status( $id, "deleted", '0' );
+                do_action( "activate_blog", $id );
+                wp_redirect( add_query_arg( "updated", array('updated' => 'true', 'action' => 'activate'), $_POST['ref'] ) );
+                exit();
+        break;
+
+        case "deactivateblog":
+                check_admin_referer('deactivateblog');
+                do_action( "deactivate_blog", $id );
+                update_blog_status( $id, "deleted", '1' );
+                wp_redirect( add_query_arg( array('updated' => 'true', 'action' => 'deactivate'), $_POST['ref'] ) );
+                exit();
+        break;
+
+        case "unspamblog":
+                check_admin_referer('unspamblog');
+                update_blog_status( $id, "spam", '0' );
+                wp_redirect( add_query_arg( array('updated' => 'true', 'action' => 'unspam'), $_POST['ref'] ) );
+                exit();
+        break;
+
+        case "spamblog":
+                check_admin_referer('spamblog');
+                update_blog_status( $id, "spam", '1' );
+                wp_redirect( add_query_arg( array('updated' => 'true', 'action' => 'spam'), $_POST['ref'] ) );
+                exit();
+        break;
+
+        case "mature":
+                update_blog_status( $id, 'mature', '1' );
+                do_action( 'mature_blog', $id );
+                wp_redirect( add_query_arg( array('updated' => 'true', 'action' => 'mature'), $_POST['ref'] ) );
+                exit();
+        break;
+
+        case "unmature":
+                update_blog_status( $id, 'mature', '0' );
+                do_action( 'unmature_blog', $id );
+
+                wp_redirect( add_query_arg( array('updated' => 'true', 'action' => 'umature'), $_POST['ref'] ) );
+                exit();
+        break;
+
+        // Themes
+ case "updatethemes":
+         if( is_array( $_POST['theme'] ) ) {
+                        $themes = get_themes();
+                        reset( $themes );
+                        foreach( (array) $themes as $key => $theme ) {
+                                if( $_POST['theme'][ wp_specialchars( $theme['Stylesheet'] ) ] == 'enabled' )
+                                        $allowed_themes[ wp_specialchars( $theme['Stylesheet'] ) ] = true;
+                        }
+                        update_site_option( 'allowedthemes', $allowed_themes );
+                }
+                wp_redirect( add_query_arg( array('updated' => 'true', 'action' => 'themes'), $_SERVER['HTTP_REFERER'] ) );
+                exit();
+        break;
+
+        // Common
+        case "confirm":
+                $referrer = ( isset($_GET['ref']) ) ? stripslashes($_GET['ref']) : $_SERVER['HTTP_REFERER'];
+                $referrer = clean_url($referrer);
+                if( !headers_sent() ){
+                        nocache_headers();
+                        header( 'Content-Type: text/html; charset=utf-8' );
+                }
+                ?>
+                <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+                <html xmlns="http://www.w3.org/1999/xhtml" <?php if ( function_exists('language_attributes') ) language_attributes(); ?>>
+                        <head>
+                                <title><?php _e("WordPress MU &rsaquo; Confirm your action"); ?></title>
+
+                                <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+                                <?php wp_admin_css( 'install', true ); ?>
+                        </head>
+                        <body id="error-page">
+                                <h1 id="logo"><img alt="WordPress" src="images/wordpress-logo.png" /></h1>
+                                <form action='wpmu-edit.php?action=<?php echo wp_specialchars( $_GET[ 'action2' ] ) ?>' method='post'>
+                                        <input type='hidden' name='action' value='<?php echo wp_specialchars( $_GET['action2'] ) ?>' />
+                                        <input type='hidden' name='id' value='<?php echo wp_specialchars( $id ); ?>' />
+                                        <input type='hidden' name='ref' value='<?php echo $referrer; ?>' />
+                                        <?php wp_nonce_field( $_GET['action2'] ) ?>
+                                        <p><?php echo wp_specialchars( stripslashes($_GET['msg']) ); ?></p>
+                                        <p class="submit"><input class="button" type='submit' value='<?php _e("Confirm"); ?>' /></p>                                                
+                                </form>
+                        </body>
+                </html>
+                <?php
+        break;
+
+        // Users (not used any more)
+        case "deleteuser":
+                check_admin_referer('deleteuser');
+                if( $id != '0' && $id != '1' )
+                        wpmu_delete_user($id);
+
+                wp_redirect( add_query_arg( array('updated' => 'true', 'action' => 'delete'), $_POST['ref'] ) );
+                exit();
+        break;
+
+        case "allusers":
+                check_admin_referer('allusers');
+                if ( isset($_POST['alluser_delete']) ) {
+                        require_once('admin-header.php');
+                        echo '<div class="wrap" style="position:relative;">';
+                        confirm_delete_users( $_POST['allusers'] );
+                        echo '</div>';
+                } elseif( isset( $_POST[ 'alluser_transfer_delete' ] ) ) {
+                        if( is_array( $_POST[ 'blog' ] ) && !empty( $_POST[ 'blog' ] ) ) {
+                                foreach( $_POST[ 'blog' ] as $id => $users ) {
+                                        foreach( $users as $blogid => $user_id ) {
+                                                remove_user_from_blog( $id, $blogid, $user_id );
+                                        }
+                                }
+                        }
+                        if( is_array( $_POST[ 'user' ] ) && !empty( $_POST[ 'user' ] ) )
+                                foreach( $_POST[ 'user' ] as $id )
+                                        wpmu_delete_user( $id );
+
+                        wp_redirect( add_query_arg( array('updated' => 'true', 'action' => 'all_delete'), 'wpmu-users.php' ) );
+                } else {
+                        foreach ( (array) $_POST['allusers'] as $key => $val ) {
+                                if( $val == '' || $val == '0' ) {
+                                        continue;
+                                }
+                                $user = new WP_User( $val );
+                                if ( in_array( $user->user_login, get_site_option( 'site_admins', array( 'admin' ) ) ) ) {
+                                        wp_die( sprintf( __( 'Warning! User cannot be modified. The user %s is a site admnistrator.' ), $user->user_login ) );
+                                }
+                                if ( isset($_POST['alluser_spam']) ) {
+                                        $userfunction = 'all_spam';
+                                        $blogs = get_blogs_of_user( $val, true );
+                                        foreach ( (array) $blogs as $key => $details ) {
+                                                if ( $details->userblog_id == $current_site->blog_id ) { continue; } // main blog not a spam !
+                                                update_blog_status( $details->userblog_id, "spam", '1' );
+                                        }
+                                        update_user_status( $val, "spam", '1', 1 );
+                                } elseif ( isset($_POST['alluser_notspam']) ) {
+                                        $userfunction = 'all_notspam';
+                                        $blogs = get_blogs_of_user( $val, true );
+                                        foreach ( (array) $blogs as $key => $details ) {
+                                                update_blog_status( $details->userblog_id, "spam", '0' );
+                                        }
+                                        update_user_status( $val, "spam", '0', 1 );
+                                }
+                        }
+                        wp_redirect( add_query_arg( array('updated' => 'true', 'action' => $userfunction), $_SERVER['HTTP_REFERER'] ) );
+                }
+                exit();
+        break;
+
+        case "adduser":
+                check_admin_referer('add-user');
+
+                if( is_array( $_POST[ 'user' ] ) == false ) {
+                        wp_die( __( "Cannot create an empty user." ) );
+                }
+                $user = $_POST['user'];
+                if ( empty($user['username']) && empty($user['email']) ) {
+                        wp_die( __('Missing username and email.') );
+                } elseif ( empty($user['username']) ) {
+                        wp_die( __('Missing username.') );
+                } elseif ( empty($user['email']) ) {
+                        wp_die( __('Missing email.') );
+                }
+
+                $password = generate_random_password();
+                $user_id = wpmu_create_user(wp_specialchars( strtolower( $user['username'] ) ), $password, wp_specialchars( $user['email'] ) );
+
+                if( false == $user_id ) {
+                         wp_die( __('Duplicated username or email address.') );
+                } else {
+                        wp_new_user_notification($user_id, $password);
+                }
+                if ( get_site_option( 'dashboard_blog' ) == false ) {
+                        add_user_to_blog( $current_site->blog_id, $user_id, get_site_option( 'default_user_role', 'subscriber' ) );
+                } else {
+                        add_user_to_blog( get_site_option( 'dashboard_blog' ), $user_id, get_site_option( 'default_user_role', 'subscriber' ) );
+                }
+
+                wp_redirect( add_query_arg( array('updated' => 'true', 'action' => 'add'), $_SERVER['HTTP_REFERER'] ) );
+                exit();
+        break;
+
+        default:
+                wpmu_admin_do_redirect( "wpmu-admin.php" );
+        break;
+}
+?>
</ins><span class="cx">Property changes on: trunk/wp-admin/ms-edit.php
</span><span class="cx">___________________________________________________________________
</span><span class="cx">Name: svn:executable
</span><span class="cx"> + *
</span></span></pre></div>
<a id="trunkwpadminmsoptionsphp"></a>
<div class="addfile"><h4>Added: trunk/wp-admin/ms-options.php (0 => 12603)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/wp-admin/ms-options.php         (rev 0)
+++ trunk/wp-admin/ms-options.php        2010-01-06 04:02:57 UTC (rev 12603)
</span><span class="lines">@@ -0,0 +1,294 @@
</span><ins>+<?php
+require_once('admin.php');
+$title = __('WordPress MU &rsaquo; Admin &rsaquo; Site Options');
+$parent_file = 'wpmu-admin.php';
+
+include('admin-header.php');
+
+if( is_site_admin() == false ) {
+ wp_die( __('You do not have permission to access this page.') );
+}
+
+if (isset($_GET['updated'])) {
+        ?>
+        <div id="message" class="updated fade"><p><?php _e('Options saved.') ?></p></div>
+        <?php
+}
+?>
+
+<div class="wrap">
+        <h2><?php _e('Site Options') ?></h2>
+        <form method="post" action="wpmu-edit.php?action=siteoptions">
+                <?php wp_nonce_field( "siteoptions" ); ?>
+                <h3><?php _e('Operational Settings <em>(These settings cannot be modified by blog owners)</em>') ?></h3>
+                <table class="form-table">
+                        <tr valign="top">
+                                <th scope="row"><?php _e('Site Name') ?></th>
+                                <td>
+                                        <input name="site_name" type="text" id="site_name" style="width: 95%" value="<?php echo $current_site->site_name ?>" size="45" />
+                                        <br />
+                                        <?php _e('What you would like to call this website.') ?>
+                                </td>
+                        </tr>
+
+                        <tr valign="top">
+                                <th scope="row"><?php _e('Site Admin Email') ?></th>
+                                <td>
+                                        <input name="admin_email" type="text" id="admin_email" style="width: 95%" value="<?php echo stripslashes( get_site_option('admin_email') ) ?>" size="45" />
+                                        <br />
+                                        <?php printf( __( 'Registration and support mails will come from this address. Make it generic like "support@%s"' ), $current_site->domain ); ?>
+                                </td>
+                        </tr>
+
+                        <tr valign="top">
+                                <th scope="row"><?php _e('Allow new registrations') ?></th>
+                                <?php
+                                if( !get_site_option('registration') )
+                                        update_site_option( 'registration', 'all' );
+                                ?>
+                                <td>
+                                        <label><input name="registration" type="radio" id="registration1" value='none' <?php echo get_site_option('registration') == 'none' ? 'checked="checked"' : ''; ?> /> <?php _e('Disabled'); ?></label><br />
+                                        <label><input name="registration" type="radio" id="registration2" value='all' <?php echo get_site_option('registration') == 'all' ? 'checked="checked"' : ''; ?> /> <?php _e('Enabled. Blogs and user accounts can be created.'); ?></label><br />
+                                        <label><input name="registration" type="radio" id="registration3" value='user' <?php echo get_site_option('registration') == 'user' ? 'checked="checked"' : ''; ?> /> <?php _e('Only user account can be created.'); ?></label><br />
+                                        <label><input name="registration" type="radio" id="registration4" value='blog' <?php echo get_site_option('registration') == 'blog' ? 'checked="checked"' : ''; ?> /> <?php _e('Only logged in users can create new blogs.'); ?></label><br />
+                                        <p><?php _e('Disable or enable registration and who or what can be registered. (Default=all)'); ?></p>
+                                        <?php if( constant( 'VHOST' ) == 'yes' ) {
+                                                echo "<p>" . __('If registration is disabled, please set "NOBLOGREDIRECT" in wp-config.php to a url you will redirect visitors to if they visit a non existant blog.') . "</p>";
+                                        } ?>
+                                </td>
+                        </tr>
+
+                        <tr valign="top">
+                                <th scope="row"><?php _e('Registration notification') ?></th>
+                                <?php
+                                if( !get_site_option('registrationnotification') )
+                                        update_site_option( 'registrationnotification', 'yes' );
+                                ?>
+                                <td>
+                                        <input name="registrationnotification" type="radio" id="registrationnotification1" value='yes' <?php echo get_site_option('registrationnotification') == 'yes' ? 'checked="checked"' : ''; ?> /> <?php _e('Yes'); ?><br />
+                                        <input name="registrationnotification" type="radio" id="registrationnotification2" value='no' <?php echo get_site_option('registrationnotification') == 'no' ? 'checked="checked"' : ''; ?> /> <?php _e('No'); ?><br />
+                                        <?php _e('Send the site admin an email notification every time someone registers a blog or user account.') ?>
+                                </td>
+                        </tr>
+
+                        <tr valign="top">
+                                <th scope="row"><?php _e('Add New Users') ?></th>
+                                <td>
+                                        <a name='addnewusers'></a>
+                                        <input name="add_new_users" type="radio" id="add_new_users1" value='1' <?php echo get_site_option('add_new_users') == 1 ? 'checked="checked"' : ''; ?> /> <?php _e('Yes'); ?><br />
+                                        <input name="add_new_users" type="radio" id="add_new_users2" value='0' <?php echo get_site_option('add_new_users') == 0 ? 'checked="checked"' : ''; ?> /> <?php _e('No'); ?><br />
+                                        <?php _e('Allow blog administrators to add new users to their blog via the Users->Add New page.') ?>
+                                </td>
+                        </tr>
+
+                        <tr valign="top">
+                                <th scope="row"><?php _e('Dashboard Blog') ?></th>
+                                <td>
+                                        <?php
+                                        if ( $dashboard_blog = get_site_option( 'dashboard_blog' ) ) {
+                                                $details = get_blog_details( $dashboard_blog );
+                                                $blogname = untrailingslashit( sanitize_user( str_replace( '.', '', str_replace( $current_site->domain . $current_site->path, '', $details->domain . $details->path ) ) ) );
+                                        } else {
+                                                $blogname = '';
+                                        }?>
+                                        <input name="dashboard_blog_orig" type="hidden" id="dashboard_blog_orig" value="<?php echo $blogname; ?>" />
+                                        <input name="dashboard_blog" type="text" id="dashboard_blog" value="<?php echo $blogname; ?>" size="30" />
+                                        <br />
+                                        <?php _e( "Blogname ('dashboard', 'control', 'manager', etc) or blog id.<br />New users are added to this blog as subscribers (or the user role defined below) if they don't have a blog. Leave blank for the main blog. 'Subscriber' users on old blog will be moved to the new blog if changed. New blog will be created if it does not exist." ); ?>
+                                </td>
+                        </tr>
+                        <tr valign="top">
+                                <th scope="row"><?php _e('Dashboard User Default Role') ?></th>
+                                <td>
+                                        <select name="default_user_role" id="role"><?php
+                                        wp_dropdown_roles( get_site_option( 'default_user_role', 'subscriber' ) );
+                                        ?>
+                                        </select>
+                                        <br />
+                                        <?php _e( "The default role for new users on the Dashboard blog. This should probably be 'Subscriber' or maybe 'Contributor'." ); ?>
+                                </td>
+                        </tr>
+
+                        <tr valign="top">
+                                <th scope="row"><?php _e('Banned Names') ?></th>
+                                <td>
+                                        <input name="illegal_names" type="text" id="illegal_names" style="width: 95%" value="<?php echo implode( " ", get_site_option('illegal_names') ); ?>" size="45" />
+                                        <br />
+                                        <?php _e('Users are not allowed to register these blogs. Separate names by spaces.') ?>
+                                </td>
+                        </tr>
+
+                        <tr valign="top">
+                                <th scope="row"><?php _e('Limited Email Registrations') ?></th>
+                                <td>
+                                        <?php $limited_email_domains = get_site_option('limited_email_domains');
+                                        $limited_email_domains = str_replace( ' ', "\n", $limited_email_domains ); ?>
+                                        <textarea name="limited_email_domains" id="limited_email_domains" cols='40' rows='5'><?php echo $limited_email_domains == '' ? '' : @implode( "\n", $limited_email_domains ); ?></textarea>
+                                        <br />
+                                        <?php _e('If you want to limit blog registrations to certain domains. One domain per line.') ?>
+                                </td>
+                        </tr>
+
+                        <tr valign="top">
+                                <th scope="row"><?php _e('Banned Email Domains') ?></th>
+                                <td>
+                                        <textarea name="banned_email_domains" id="banned_email_domains" cols='40' rows='5'><?php echo get_site_option('banned_email_domains') == '' ? '' : @implode( "\n", get_site_option('banned_email_domains') ); ?></textarea>
+                                        <br />
+                                        <?php _e('If you want to ban certain email domains from blog registrations. One domain per line.') ?>
+                                </td>
+                        </tr>
+
+                        <tr valign="top">
+                                <th scope="row"><?php _e('Welcome Email') ?></th>
+                                <td>
+                                        <textarea name="welcome_email" id="welcome_email" rows='5' cols='45' style="width: 95%"><?php echo stripslashes( get_site_option('welcome_email') ) ?></textarea>
+                                        <br />
+                                        <?php _e('The welcome email sent to new blog owners.') ?>
+                                </td>
+                        </tr>
+                        <tr valign="top">
+                                <th scope="row"><?php _e('Welcome User Email') ?></th>
+                                <td>
+                                         <textarea name="welcome_user_email" id="welcome_user_email" rows='5' cols='45' style="width: 95%"><?php echo stripslashes( get_site_option('welcome_user_email') ) ?></textarea>
+                                        <br />
+                                        <?php _e('The welcome email sent to new users.') ?>
+                                </td>
+                        </tr>
+                        <tr valign="top">
+                                <th scope="row"><?php _e('First Post') ?></th>
+                                <td>
+                                        <textarea name="first_post" id="first_post" rows='5' cols='45' style="width: 95%"><?php echo stripslashes( get_site_option('first_post') ) ?></textarea>
+                                        <br />
+                                        <?php _e('First post on a new blog.') ?>
+                                </td>
+                        </tr>
+                        <tr valign="top">
+                                <th scope="row"><?php _e('First Page') ?></th>
+                                <td>
+                                        <textarea name="first_page" id="first_page" rows='5' cols='45' style="width: 95%"><?php echo stripslashes( get_site_option('first_page') ) ?></textarea>
+                                        <br />
+                                        <?php _e('First page on a new blog.') ?>
+                                </td>
+                        </tr>
+                        <tr valign="top">
+                                <th scope="row"><?php _e('First Comment') ?></th>
+                                <td>
+                                        <textarea name="first_comment" id="first_comment" rows='5' cols='45' style="width: 95%"><?php echo stripslashes( get_site_option('first_comment') ) ?></textarea>
+                                        <br />
+                                        <?php _e('First comment on a new blog.') ?>
+                                </td>
+                        </tr>
+                        <tr valign="top">
+                                <th scope="row"><?php _e('First Comment Author') ?></th>
+                                <td>
+                                        <input type="text" size='40' name="first_comment_author" id="first_comment_author" value="<?php echo get_site_option('first_comment_author') ?>" />
+                                        <br />
+                                        <?php _e('Author of first comment on a new blog.') ?>
+                                </td>
+                        </tr>
+                        <tr valign="top">
+                                <th scope="row"><?php _e('First Comment URL') ?></th>
+                                <td>
+                                        <input type="text" size='40' name="first_comment_url" id="first_comment_url" value="<?php echo get_site_option('first_comment_url') ?>" />
+                                        <br />
+                                        <?php _e('URL on first comment on a new blog.') ?>
+                                </td>
+                        </tr>
+
+                        <tr valign="top">
+                                <th scope="row"><?php _e('Upload media button') ?></th>
+                                <?php $mu_media_buttons = get_site_option( 'mu_media_buttons', array() ); ?>
+                                <td><label><input type='checkbox' id="mu_media_buttons_image" name="mu_media_buttons[image]" value='1' <?php if( $mu_media_buttons[ 'image' ] ) { echo 'checked=checked '; } ?>/> <?php _e( 'Images' ); ?></label><br />
+                                <label><input type='checkbox' id="mu_media_buttons_video" name="mu_media_buttons[video]" value='1' <?php if( $mu_media_buttons[ 'video' ] ) { echo 'checked=checked '; } ?>/> <?php _e( 'Videos' ); ?></label><br />
+                                <label><input type='checkbox' id="mu_media_buttons_audio" name="mu_media_buttons[audio]" value='1' <?php if( $mu_media_buttons[ 'audio' ] ) { echo 'checked=checked '; } ?>/> <?php _e( 'Music' ); ?></label><br />
+                                <?php _e( 'The media upload buttons to display on the "Write Post" page. Make sure you update the "Upload File Types" below as well.' ); ?></td>
+                        </tr>
+                        <tr valign="top">
+                                <th scope="row"><?php _e('Blog upload space check') ?></th>
+                                <td>
+                                <label><input type='radio' id="upload_space_check_disabled" name="upload_space_check_disabled" value='0' <?php if( !get_site_option( 'upload_space_check_disabled' ) ) { echo 'checked=checked '; } ?>/> <?php _e( 'Enabled' ); ?></label><br />
+                                <label><input type='radio' id="upload_space_check_disabled" name="upload_space_check_disabled" value='1' <?php if( get_site_option( 'upload_space_check_disabled' ) ) { echo 'checked=checked '; } ?>/> <?php _e( 'Disabled' ); ?></label><br />
+                                <?php _e( 'By default there is a limit on the total size of files uploaded but it can be disabled here.' ); ?></td>
+                        </tr>
+                        <tr valign="top">
+                                <th scope="row"><?php _e('Blog upload space') ?></th>
+                                <td><input name="blog_upload_space" type="text" id="blog_upload_space" value="<?php echo get_site_option('blog_upload_space', 10) ?>" size="3" /> MB</td>
+                        </tr>
+
+                        <tr valign="top">
+                                <th scope="row"><?php _e('Upload File Types') ?></th>
+                                <td><input name="upload_filetypes" type="text" id="upload_filetypes" value="<?php echo get_site_option('upload_filetypes', 'jpg jpeg png gif') ?>" size="45" /></td>
+                        </tr>
+
+                        <tr valign="top">
+                                <th scope="row"><?php _e('Max upload file size') ?></th>
+                                <td><input name="fileupload_maxk" type="text" id="fileupload_maxk" value="<?php echo get_site_option('fileupload_maxk', 300) ?>" size="5" /> KB</td>
+                        </tr>
+                        <tr valign="top">
+                                <th scope="row"><?php _e('Admin Notice Feed') ?></th>
+                                <td><input name="admin_notice_feed" style="width: 95%" type="text" id="admin_notice_feed" value="<?php echo get_site_option( 'admin_notice_feed' ) ?>" size="80" /><br />
+                                <?php _e( 'Display the latest post from this RSS or Atom feed on all blog dashboards. Leave blank to disable.' ); ?><br />
+                                <?php if( get_site_option( 'admin_notice_feed' ) != 'http://' . $current_site->domain . $current_site->path . 'feed/' )
+                                        echo __( "A good one to use would be the feed from your main blog: " ) . 'http://' . $current_site->domain . $current_site->path . 'feed/'; ?></td>
+                        </tr>
+                </table>
+
+                <h3><?php _e('Administration Settings') ?></h3>
+                <table class="form-table">
+                        <tr valign="top">
+                                <th scope="row"><?php _e('Site Admins') ?></th>
+                                <td>
+                                        <input name="site_admins" type="text" id="site_admins" style="width: 95%" value="<?php echo implode(' ', get_site_option( 'site_admins', array( 'admin' ) ) ) ?>" size="45" />
+                                        <br />
+                                        <?php _e('These users may login to the main blog and administer the site. Space separated list of usernames.') ?>
+                                </td>
+                        </tr>
+                </table>
+
+                <h3><?php _e('Site Wide Settings <em>(These settings may be overridden by blog owners)</em>') ?></h3>
+                <table class="form-table">
+                        <?php
+                        if( is_dir( ABSPATH . LANGDIR ) && $dh = opendir( ABSPATH . LANGDIR ) )
+                                while( ( $lang_file = readdir( $dh ) ) !== false )
+                                        if( substr( $lang_file, -3 ) == '.mo' )
+                                                $lang_files[] = $lang_file;
+                        $lang = get_site_option('WPLANG');
+                        if( is_array($lang_files) && !empty($lang_files) ) {
+                                ?>
+                                <tr valign="top">
+                                        <th width="33%"><?php _e('Default Language') ?></th>
+                                        <td>
+                                                <select name="WPLANG" id="WPLANG">
+                                                        <?php mu_dropdown_languages( $lang_files, get_site_option('WPLANG') ); ?>
+                                                </select>
+                                        </td>
+                                </tr>
+                                <?php
+                        } // languages
+                        ?>
+                </table>
+
+                <h3><?php _e('Menus <em>(Enable or disable WP Backend Menus)</em>') ?></h3>
+                <table class="form-table">
+                        <tr>
+                                <th scope="row"><?php _e("Menu"); ?></th>
+                                <th scope="row"><?php _e("Enabled"); ?></th>
+                        </tr>
+                        <a name='menu'></a>
+                        <?php
+                        $menu_perms = get_site_option( "menu_items" );
+                        $menu_items = apply_filters( 'mu_menu_items', array('plugins' => __('Plugins')) );                        
+                        foreach ( (array) $menu_items as $key => $val ) {
+                                echo "<tr><th scope='row'>" . wp_specialchars($val) . "</th><td><input type='checkbox' name='menu_items[" . $key . "]' value='1'" . (( $menu_perms[$key] == '1' ) ? ' checked="checked"' : '') . " /></td></tr>";
+                        }
+                        ?>
+                </table>
+
+                <?php do_action( 'wpmu_options' ); // Add more options here ?>
+
+                <p class="submit">
+                        <input type="submit" name="Submit" value="<?php _e('Update Options') ?>" /></p>
+        </form>
+</div>
+
+<?php include('./admin-footer.php'); ?>
</ins><span class="cx">Property changes on: trunk/wp-admin/ms-options.php
</span><span class="cx">___________________________________________________________________
</span><span class="cx">Name: svn:executable
</span><span class="cx"> + *
</span></span></pre></div>
<a id="trunkwpadminmssitesphp"></a>
<div class="addfile"><h4>Added: trunk/wp-admin/ms-sites.php (0 => 12603)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/wp-admin/ms-sites.php         (rev 0)
+++ trunk/wp-admin/ms-sites.php        2010-01-06 04:02:57 UTC (rev 12603)
</span><span class="lines">@@ -0,0 +1,613 @@
</span><ins>+<?php
+require_once('admin.php');
+
+$title = __('WordPress MU &rsaquo; Admin &rsaquo; Blogs');
+$parent_file = 'wpmu-admin.php';
+
+wp_enqueue_script( 'admin-forms' );
+
+require_once('admin-header.php');
+if( is_site_admin() == false ) {
+ wp_die( __('You do not have permission to access this page.') );
+}
+$id = intval( $_GET['id'] );
+$protocol = is_ssl() ? 'https://' : 'http://';
+
+if ( $_GET['updated'] == 'true' ) {
+        ?>
+        <div id="message" class="updated fade"><p>
+                <?php
+                switch ($_GET['action']) {
+                        case 'all_notspam':
+                                _e('Blogs mark as not spam !');
+                        break;
+                        case 'all_spam':
+                                _e('Blogs mark as spam !');
+                        break;
+                        case 'all_delete':
+                                _e('Blogs deleted !');
+                        break;
+                        case 'delete':
+                                _e('Blog deleted !');
+                        break;
+                        case 'add-blog':
+                                _e('Blog added !');
+                        break;
+                        case 'archive':
+                                _e('Blog archived !');
+                        break;
+                        case 'unarchive':
+                                _e('Blog unarchived !');
+                        break;
+                        case 'activate':
+                                _e('Blog activated !');
+                        break;
+                        case 'deactivate':
+                                _e('Blog deactivated !');
+                        break;
+                        case 'unspam':
+                                _e('Blog mark as not spam !');
+                        break;
+                        case 'spam':
+                                _e('Blog mark as spam !');
+                        break;
+                        case 'umature':
+                                _e('Blog mark as not mature !');
+                        break;
+                        case 'mature':
+                                _e('Blog mark as mature !');
+                        break;
+                        default:
+                                _e('Options saved !');
+                        break;
+                }
+                ?>
+        </p></div>
+        <?php
+}
+
+switch( $_GET['action'] ) {
+        // Edit blog
+        case "editblog":
+                $blog_prefix = $wpdb->get_blog_prefix( $id );
+                $options = $wpdb->get_results( "SELECT * FROM {$blog_prefix}options WHERE option_name NOT LIKE '_transient_rss%' AND option_name NOT LIKE '%user_roles'", ARRAY_A );
+                $details = $wpdb->get_row( "SELECT * FROM {$wpdb->blogs} WHERE blog_id = '{$id}'", ARRAY_A );
+                $editblog_roles = get_blog_option( $id, "{$blog_prefix}user_roles" );
+                ?>
+                <div class="wrap">
+                <h2><?php _e('Edit Blog'); ?> - <a href='http://<?php echo $details['domain'].$details['path']; ?>'>http://<?php echo $details['domain'].$details['path']; ?></a></h2>
+                <form method="post" action="wpmu-edit.php?action=updateblog">
+                        <?php wp_nonce_field('editblog'); ?>
+                        <input type="hidden" name="id" value="<?php echo $id ?>" />
+                        <div class='metabox-holder' style='width:49%;float:left;'>
+                        <div id="blogedit_bloginfo" class="postbox " >
+                        <h3 class='hndle'><span><?php _e('Blog info (wp_blogs)'); ?></span></h3>
+                        <div class="inside">
+                                <table class="form-table">
+                                                        <tr class="form-field form-required">
+                                                                <th scope="row"><?php _e('Domain') ?></th>
+                                                                <td>http://<input name="blog[domain]" type="text" id="domain" value="<?php echo $details['domain'] ?>" size="33" /></td>
+                                                        </tr>
+                                                        <tr class="form-field form-required">
+                                                                <th scope="row"><?php _e('Path') ?></th>
+                                                                <td><input name="blog[path]" type="text" id="path" value="<?php echo $details['path'] ?>" size="40" style='margin-bottom:5px;' />
+                                                                <br /><input type='checkbox' style='width:20px;' name='update_home_url' value='update' <?php if( get_blog_option( $id, 'siteurl' ) == preg_replace('|/+$|', '', 'http://' . $details['domain'] . $details['path']) || get_blog_option( $id, 'home' ) == preg_replace('|/+$|', '', 'http://' . $details['domain'] . $details['path']) ) echo 'checked="checked"'; ?> /> <?php _e( "Update 'siteurl' and 'home' as well." ); ?></td>
+                                                        </tr>
+                                                        <tr class="form-field">
+                                                                <th scope="row"><?php _e('Registered') ?></th>
+                                                                <td><input name="blog[registered]" type="text" id="blog_registered" value="<?php echo $details['registered'] ?>" size="40" /></td>
+                                                        </tr>
+                                                        <tr class="form-field">
+                                                                <th scope="row"><?php _e('Last Updated') ?></th>
+                                                                <td><input name="blog[last_updated]" type="text" id="blog_last_updated" value="<?php echo $details['last_updated'] ?>" size="40" /></td>
+                                                        </tr>
+                                                        <tr class="form-field">
+                                                                <th scope="row"><?php _e('Public') ?></th>
+                                                                <td>
+                                                                        <input type='radio' style='width:20px;' name='blog[public]' value='1' <?php if( $details['public'] == '1' ) echo 'checked="checked"'; ?> /> <?php _e('Yes') ?>
+                                                                        <input type='radio' style='width:20px;' name='blog[public]' value='0' <?php if( $details['public'] == '0' ) echo 'checked="checked"'; ?> /> <?php _e('No') ?>
+                                                                </td>
+                                                        </tr>
+                                                        <tr class="form-field">
+                                                                <th scope="row"><?php _e( 'Archived' ); ?></th>
+                                                                <td>
+                                                                        <input type='radio' style='width:20px;' name='blog[archived]' value='1' <?php if( $details['archived'] == '1' ) echo 'checked="checked"'; ?> /> <?php _e('Yes') ?>
+                                                                        <input type='radio' style='width:20px;' name='blog[archived]' value='0' <?php if( $details['archived'] == '0' ) echo 'checked="checked"'; ?> /> <?php _e('No') ?>
+                                                                </td>
+                                                        </tr>
+                                                        <tr class="form-field">
+                                                                <th scope="row"><?php _e( 'Mature' ); ?></th>
+                                                                <td>
+                                                                        <input type='radio' style='width:20px;' name='blog[mature]' value='1' <?php if( $details['mature'] == '1' ) echo 'checked="checked"'; ?> /> <?php _e('Yes') ?>
+                                                                        <input type='radio' style='width:20px;' name='blog[mature]' value='0' <?php if( $details['mature'] == '0' ) echo 'checked="checked"'; ?> /> <?php _e('No') ?>
+                                                                </td>
+                                                        </tr>
+                                                        <tr class="form-field">
+                                                                <th scope="row"><?php _e( 'Spam' ); ?></th>
+                                                                <td>
+                                                                        <input type='radio' style='width:20px;' name='blog[spam]' value='1' <?php if( $details['spam'] == '1' ) echo 'checked="checked"'; ?> /> <?php _e('Yes') ?>
+                                                                        <input type='radio' style='width:20px;' name='blog[spam]' value='0' <?php if( $details['spam'] == '0' ) echo 'checked="checked"'; ?> /> <?php _e('No') ?>
+                                                                </td>
+                                                        </tr>
+                                                        <tr class="form-field">
+                                                                <th scope="row"><?php _e( 'Deleted' ); ?></th>
+                                                                <td>
+                                                                        <input type='radio' style='width:20px;' name='blog[deleted]' value='1' <?php if( $details['deleted'] == '1' ) echo 'checked="checked"'; ?> /> <?php _e('Yes') ?>
+                                                                        <input type='radio' style='width:20px;' name='blog[deleted]' value='0' <?php if( $details['deleted'] == '0' ) echo 'checked="checked"'; ?> /> <?php _e('No') ?>
+                                                                </td>
+                                                        </tr>
+                                                </table>
+                                                <p class="submit" style="margin:-15px 0 -5px 230px;"><input type="submit" name="Submit" value="<?php _e('Update Options &raquo;') ?>" /></p>
+                        </div></div>
+                        
+                        <div id="blogedit_blogoptions" class="postbox " >
+                        <h3 class='hndle'><span><?php printf( __('Blog options (wp_%s_options)'), $id ); ?></span></h3>
+                        <div class="inside">
+                                <table class="form-table">
+                                                        <?php
+                                                        $editblog_default_role = 'subscriber';
+                                                        foreach ( $options as $key => $val ) {
+                                                                if( $val['option_name'] == 'default_role' ) {
+                                                                        $editblog_default_role = $val['option_value'];
+                                                                }
+                                                                $disabled = '';
+                                                                if ( is_serialized($val['option_value']) ) {
+                                                                        if ( is_serialized_string($val['option_value']) ) {
+                                                                                $val['option_value'] = wp_specialchars(maybe_unserialize($val['option_value']), 'single');
+                                                                        } else {
+                                                                                $val['option_value'] = "SERIALIZED DATA";
+                                                                                $disabled = ' disabled="disabled"';
+                                                                        }
+                                                                }
+                                                                if ( stristr($val['option_value'], "\r") || stristr($val['option_value'], "\n") || stristr($val['option_value'], "\r\n") ) {
+                                                                ?>
+                                                                        <tr class="form-field">
+                                                                                <th scope="row"><?php echo ucwords( str_replace( "_", " ", $val['option_name'] ) ) ?></th>
+                                                                                <td><textarea rows="5" cols="40" name="option[<?php echo $val['option_name'] ?>]" type="text" id="<?php echo $val['option_name'] ?>"<?php echo $disabled ?>><?php echo wp_specialchars( stripslashes( $val['option_value'] ), 1 ) ?></textarea></td>
+                                                                        </tr>
+                                                                <?php
+                                                                } else {
+                                                                ?>
+                                                                        <tr class="form-field">
+                                                                                <th scope="row"><?php echo ucwords( str_replace( "_", " ", $val['option_name'] ) ) ?></th>
+                                                                                <td><input name="option[<?php echo $val['option_name'] ?>]" type="text" id="<?php echo $val['option_name'] ?>" value="<?php echo wp_specialchars( stripslashes( $val['option_value'] ), 1 ) ?>" size="40" <?php echo $disabled ?> /></td>
+                                                                        </tr>
+                                                                <?php
+                                                                }
+                                                        } // End foreach
+                                                        ?>
+                                                </table>
+                                                <p class="submit" style="margin:-15px 0 -5px 230px;"><input type="submit" name="Submit" value="<?php _e('Update Options &raquo;') ?>" /></p>
+                        </div></div>
+                        </div>
+                        
+                        <div class='metabox-holder' style='width:49%;float:right;'>
+                        <?php
+                                        // Blog Themes
+                                        $themes = get_themes();
+                                        $blog_allowed_themes = wpmu_get_blog_allowedthemes( $id );
+                                        $allowed_themes = get_site_option( "allowedthemes" );
+                                        if( $allowed_themes == false ) {
+                                                $allowed_themes = array_keys( $themes );
+                                        }
+                                        $out = '';
+                                        foreach( $themes as $key => $theme ) {
+                                                $theme_key = wp_specialchars( $theme['Stylesheet'] );
+                                                if( isset($allowed_themes[$theme_key] ) == false ) {
+                                                        $checked = ( isset($blog_allowed_themes[ $theme_key ]) ) ? 'checked="checked"' : '';
+                                                        $out .= '<tr class="form-field form-required">
+                                                                        <th title="'.htmlspecialchars( $theme["Description"] ).'" scope="row">'.$key.'</th>
+                                                                        <td><input name="theme['.$theme_key.']" type="checkbox" style="width:20px;" value="on" '.$checked.'/>' . __( 'Active' ) . '</td>
+                                                                </tr>';
+                                                }
+                                        }
+                                        
+                                        if ( $out != '' ) {
+                        ?>
+                        <div id="blogedit_blogthemes" class="postbox">
+                        <h3 class='hndle'><span><?php _e('Blog Themes'); ?></span></h3>
+                        <div class="inside">
+                                <table class="form-table">
+                                        <tr><th style="font-weight:bold;"><?php _e('Theme'); ?></th></tr>
+                                        <?php echo $out; ?>
+                                </table>
+                                <p class="submit" style="margin:-15px 0 -5px 230px;"><input type="submit" name="Submit" value="<?php _e('Update Options &raquo;') ?>" /></p>
+                        </div></div>
+                        <?php } ?>
+                        
+                        <?php
+                                        // Blog users
+                                        $blogusers = get_users_of_blog( $id );
+                                        if( is_array( $blogusers ) ) {
+                                                echo '<div id="blogedit_blogusers" class="postbox"><h3 class="hndle"><span>' . __('Blog Users') . '</span></h3><div class="inside">';
+                                                echo '<table class="form-table">';
+                                                echo "<tr><th>" . __('User') . "</th><th>" . __('Role') . "</th><th>" . __('Password') . "</th><th>" . __('Remove') . "</th></tr>";
+                                                reset($blogusers);
+                                                foreach ( (array) $blogusers as $key => $val ) {
+                                                        $t = @unserialize( $val->meta_value );
+                                                        if( is_array( $t ) ) {
+                                                                reset( $t );
+                                                                $existing_role = key( $t );
+                                                        }
+                                                        echo '<tr><td><a href="user-edit.php?user_id=' . $val->user_id . '">' . $val->user_login . '</a></td>';
+                                                        if( $val->user_id != $current_user->data->ID ) {
+                                                                ?>
+                                                                <td>
+                                                                        <select name="role[<?php echo $val->user_id ?>]" id="new_role"><?php
+                                                                                foreach( $editblog_roles as $role => $role_assoc ){
+                                                                                        $name = translate_with_context($role_assoc['name']);
+                                                                                        $selected = ( $role == $existing_role ) ? 'selected="selected"' : '';
+                                                                                        echo "<option {$selected} value=\"{$role}\">{$name}</option>";
+                                                                                }
+                                                                                ?>
+                                                                        </select>
+                                                                </td>
+                                                                <td>
+                                                                                <input type='text' name='user_password[<?php echo $val->user_id ?>]' />
+                                                                </td>
+                                                                <?php
+                                                                echo '<td><input title="' . __('Click to remove user') . '" type="checkbox" name="blogusers[' . $val->user_id . ']" /></td>';
+                                                        } else {
+                                                                echo "<td><strong>" . __ ('N/A') . "</strong></td><td><strong>" . __ ('N/A') . "</strong></td><td><strong>" . __('N/A') . "</strong></td>";
+                                                        }
+                                                        echo '</tr>';
+                                                }
+                                                echo "</table>";
+                                                echo '<p class="submit" style="margin:-15px 0 -5px 230px;"><input type="submit" name="Submit" value="' . __('Update Options &raquo;') . '" /></p>';
+                                                echo "</div></div>";
+                                        }
+                        ?>
+                        
+                        <div id="blogedit_blogadduser" class="postbox">
+                        <h3 class='hndle'><span><?php _e('Add a new user'); ?></span></h3>
+                        <div class="inside">
+                                <p style="margin:10px 0 0px;padding:0px 10px 10px;border-bottom:1px solid #DFDFDF;"><?php _e('Enter the username of an existing user and hit <em>Update Options</em> to add the user.') ?></p>
+                                <table class="form-table">
+                                                <tr>
+                                                        <th scope="row"><?php _e('User&nbsp;Login:') ?></th>
+                                                        <td><input type="text" name="newuser" id="newuser" /></td>
+                                                </tr>
+                                                <tr>
+                                                        <th scope="row"><?php _e('Role:') ?></th>
+                                                        <td>
+                                                                <select name="new_role" id="new_role">
+                                                                <?php
+                                                                reset( $editblog_roles );
+                                                                foreach( $editblog_roles as $role => $role_assoc ){
+                                                                        $name = translate_with_context($role_assoc['name']);
+                                                                        $selected = ( $role == $editblog_default_role ) ? 'selected="selected"' : '';
+                                                                        echo "<option {$selected} value=\"{$role}\">{$name}</option>";
+                                                                }
+                                                                ?>
+                                                                </select>
+                                                        </td>
+                                                </tr>
+                                        </table>
+                                <p class="submit" style="margin:-15px 0 -5px 230px;"><input type="submit" name="Submit" value="<?php _e('Update Options &raquo;') ?>" /></p>
+                        </div></div>
+                        
+                        <div id="blogedit_miscoptions" class="postbox">
+                        <h3 class='hndle'><span><?php _e('Misc Blog Actions') ?></span></h3>
+                        <div class="inside">
+                                <table class="form-table">
+                                                <?php do_action( 'wpmueditblogaction', $id ); ?>
+                                        </table>
+                                <p class="submit" style="margin:-15px 0 -5px 230px;"><input type="submit" name="Submit" value="<?php _e('Update Options &raquo;') ?>" /></p>
+                        </div></div>
+                        
+                        </div>
+                        
+                        <div style="clear:both;"></div>
+                </form>
+                </div>
+                <?php
+        break;
+
+        // List blogs
+        default:
+                $apage = isset( $_GET['apage'] ) ? intval( $_GET['apage'] ) : 1;
+                $num = isset( $_GET['num'] ) ? intval( $_GET['num'] ) : 15;
+                $s = wp_specialchars( trim( $_GET[ 's' ] ) );
+
+                $query = "SELECT * FROM {$wpdb->blogs} WHERE site_id = '{$wpdb->siteid}' ";
+
+                if( isset($_GET['blog_name']) ) {
+                        $query .= " AND ( {$wpdb->blogs}.domain LIKE '%{$s}%' OR {$wpdb->blogs}.path LIKE '%{$s}%' ) ";
+                } elseif( isset($_GET['blog_id']) ) {
+                        $query .= " AND blog_id = '".intval($_GET['s'])."' ";
+                } elseif( isset($_GET['blog_ip']) ) {
+                        $query = "SELECT *
+                                FROM {$wpdb->blogs}, {$wpdb->registration_log}
+                                WHERE site_id = '{$wpdb->siteid}'
+                                AND {$wpdb->blogs}.blog_id = {$wpdb->registration_log}.blog_id
+                                AND {$wpdb->registration_log}.IP LIKE ('%{$s}%')";
+                }
+
+                if( isset( $_GET['sortby'] ) == false ) {
+                        $_GET['sortby'] = 'id';
+                }
+
+                if( $_GET['sortby'] == 'registered' ) {
+                        $query .= ' ORDER BY registered ';
+                } elseif( $_GET['sortby'] == 'id' ) {
+                        $query .= ' ORDER BY ' . $wpdb->blogs . '.blog_id ';
+                } elseif( $_GET['sortby'] == 'lastupdated' ) {
+                        $query .= ' ORDER BY last_updated ';
+                } elseif( $_GET['sortby'] == 'blogname' ) {
+                        $query .= ' ORDER BY domain ';
+                }
+
+                $query .= ( $_GET['order'] == 'DESC' ) ? 'DESC' : 'ASC';
+
+                if( !empty($s) ) {
+                        $total = $wpdb->get_var( str_replace('SELECT *', 'SELECT COUNT(blog_id)', $query) );
+                } else {
+                        $total = $wpdb->get_var( "SELECT COUNT(blog_id) FROM {$wpdb->blogs} WHERE site_id = '{$wpdb->siteid}' ");
+                }
+
+                $query .= " LIMIT " . intval( ( $apage - 1 ) * $num) . ", " . intval( $num );
+                $blog_list = $wpdb->get_results( $query, ARRAY_A );
+
+                // Pagination
+                $url2 = "&amp;order=" . $_GET['order'] . "&amp;sortby=" . $_GET['sortby'] . "&amp;s=";
+                if( $_GET[ 'blog_ip' ] ) {
+                        $url2 .= "&amp;ip_address=" . urlencode( $s );
+                } else {
+                        $url2 .= $s . "&amp;ip_address=" . urlencode( $s );
+                }
+                $blog_navigation = paginate_links( array(
+                        'base' => add_query_arg( 'apage', '%#%' ).$url2,
+                        'format' => '',
+                        'total' => ceil($total / $num),
+                        'current' => $apage
+                ));
+                ?>
+
+                <div class="wrap" style="position:relative;">
+                <h2><?php _e('Blogs') ?></h2>
+
+                <form action="wpmu-blogs.php" method="get" id="wpmu-search">
+                        <input type="hidden" name="action" value="blogs" />
+                        <input type="text" name="s" value="<?php if (isset($_GET['s'])) echo stripslashes( wp_specialchars( $s, 1 ) ); ?>" size="17" />
+                        <input type="submit" class="button" name="blog_name" value="<?php _e('Search blogs by name') ?>" />
+                        <input type="submit" class="button" name="blog_id" value="<?php _e('by blog ID') ?>" />
+                        <input type="submit" class="button" name="blog_ip" value="<?php _e('by IP address') ?>" />
+                </form>
+
+                <form id="form-blog-list" action="wpmu-edit.php?action=allblogs" method="post">
+
+                <div class="tablenav">
+                        <?php if ( $blog_navigation ) echo "<div class='tablenav-pages'>$blog_navigation</div>"; ?>
+
+                        <div class="alignleft">
+                                <input type="submit" value="<?php _e('Delete') ?>" name="allblog_delete" class="button-secondary delete" />
+                                <input type="submit" value="<?php _e('Mark as Spam') ?>" name="allblog_spam" class="button-secondary" />
+                                <input type="submit" value="<?php _e('Not Spam') ?>" name="allblog_notspam" class="button-secondary" />
+                                <?php wp_nonce_field( 'allblogs' ); ?>
+                                <br class="clear" />
+                        </div>
+                </div>
+
+                <br class="clear" />
+
+                <?php if( isset($_GET['s']) && !empty($_GET['s']) ) : ?>
+                        <p><a href="wpmu-users.php?action=users&s=<?php echo urlencode( stripslashes( $s ) ) ?>"><?php _e('Search Users:') ?> <strong><?php echo stripslashes( $s ); ?></strong></a></p>
+                <?php endif; ?>
+
+                <?php
+                // define the columns to display, the syntax is 'internal name' => 'display name'
+                $blogname_columns = ( constant( "VHOST" ) == 'yes' ) ? __('Domain') : __('Path');
+                $posts_columns = array(
+                        'id' => __('ID'),
+                        'blogname' => $blogname_columns,
+                        'lastupdated' => __('Last Updated'),
+                        'registered' => __('Registered'),
+                        'users' => __('Users')
+                );
+                
+                if( has_filter( 'wpmublogsaction' ) )
+                        $posts_columns['plugins'] = __('Actions');
+                        
+                $posts_columns = apply_filters('wpmu_blogs_columns', $posts_columns);
+
+                $sortby_url = "s=";
+                if( $_GET[ 'blog_ip' ] ) {
+                        $sortby_url .= "&ip_address=" . urlencode( $s );
+                } else {
+                        $sortby_url .= urlencode( $s ) . "&ip_address=" . urlencode( $s );
+                }
+                ?>
+
+                <table width="100%" cellpadding="3" cellspacing="3" class="widefat">
+                        <thead>
+                                <tr>
+                                <th scope="col" class="check-column"></th>
+                                <?php foreach($posts_columns as $column_id => $column_display_name) {
+                                        $column_link = "<a href='wpmu-blogs.php?{$sortby_url}&amp;sortby={$column_id}&amp;";
+                                        if( $_GET['sortby'] == $column_id ) {
+                                                $column_link .= $_GET[ 'order' ] == 'DESC' ? 'order=ASC&amp;' : 'order=DESC&amp;';
+                                        }
+                                        $column_link .= "apage={$apage}'>{$column_display_name}</a>";
+
+                                        $col_url = ($column_id == 'users' || $column_id == 'plugins') ? $column_display_name : $column_link;
+                                        ?>
+                                        <th scope="col"><?php echo $col_url ?></th>
+                                <?php } ?>
+                                </tr>
+                        </thead>
+                        <tbody id="the-list">
+                        <?php
+                        if ($blog_list) {
+                                $bgcolor = $class = '';
+                                $status_list = array( "archived" => "#fee", "spam" => "#faa", "deleted" => "#f55" );
+                                foreach ($blog_list as $blog) {
+                                        $class = ('alternate' == $class) ? '' : 'alternate';
+                                        reset( $status_list );
+
+                                        $bgcolour = "";
+                                        foreach ( $status_list as $status => $col ) {
+                                                if( get_blog_status( $blog['blog_id'], $status ) == 1 ) {
+                                                        $bgcolour = "style='background: $col'";
+                                                }
+                                        }
+                                        echo "<tr $bgcolour class='$class'>";
+
+                                        $blogname = ( constant( "VHOST" ) == 'yes' ) ? str_replace('.'.$current_site->domain, '', $blog['domain']) : $blog['path'];
+                                        foreach( $posts_columns as $column_name=>$column_display_name ) {
+                                                switch($column_name) {
+                                                        case 'id': ?>
+                                                                <th scope="row" class="check-column">
+                                                                        <input type='checkbox' id='blog_<?php echo $blog['blog_id'] ?>' name='allblogs[]' value='<?php echo $blog['blog_id'] ?>' />
+                                                                </th>
+                                                                <th scope="row">
+                                                                        <?php echo $blog['blog_id'] ?>
+                                                                </th>
+                                                        <?php
+                                                        break;
+
+                                                        case 'blogname': ?>
+                                                                <td valign="top">
+                                                                        <a href="wpmu-blogs.php?action=editblog&amp;id=<?php echo $blog['blog_id'] ?>" class="edit"><?php echo $blogname; ?></a>
+                                                                        <br/>
+                                                                        <?php
+                                                                        $controlActions        = array();
+                                                                        $controlActions[]        = '<a href="wpmu-blogs.php?action=editblog&amp;id=' . $blog['blog_id'] . '" class="edit">' . __('Edit') . '</a>';
+                                                                        $controlActions[]        = "<a href='{$protocol}{$blog['domain']}{$blog['path']}wp-admin/' class='edit'>" . __('Backend') . '</a>';
+                                                                        
+                                                                        if( get_blog_status( $blog['blog_id'], "deleted" ) == '1' )
+                                                                                $controlActions[]        = '<a class="delete" href="wpmu-edit.php?action=confirm&amp;action2=activateblog&amp;ref=' . urlencode( $_SERVER['REQUEST_URI'] ) . '&amp;id=' . $blog['blog_id'] . '&amp;msg=' . urlencode( sprintf( __( "You are about to activate the blog %s" ), $blogname ) ) . '">' . __('Activate') . '</a>';
+                                                                        else
+                                                                                $controlActions[]        = '<a class="delete" href="wpmu-edit.php?action=confirm&amp;action2=deactivateblog&amp;ref=' . urlencode( $_SERVER['REQUEST_URI'] ) . '&amp;id=' . $blog['blog_id'] . '&amp;msg=' . urlencode( sprintf( __( "You are about to deactivate the blog %s" ), $blogname ) ) . '">' . __('Deactivate') . '</a>';
+                                                                        
+                                                                        if( get_blog_status( $blog['blog_id'], "archived" ) == '1' )
+                                                                                $controlActions[]        = '<a class="delete" href="wpmu-edit.php?action=confirm&amp;action2=unarchiveblog&amp;id=' . $blog['blog_id'] . '&amp;msg=' . urlencode( sprintf( __( "You are about to unarchive the blog %s" ), $blogname ) ) . '">' . __('Unarchive') . '</a>';
+                                                                        else
+                                                                                $controlActions[]        = '<a class="delete" href="wpmu-edit.php?action=confirm&amp;action2=archiveblog&amp;id=' . $blog['blog_id'] . '&amp;msg=' . urlencode( sprintf( __( "You are about to archive the blog %s" ), $blogname ) ) . '">' . __('Archive') . '</a>';
+                                                                        
+                                                                        if( get_blog_status( $blog['blog_id'], "spam" ) == '1' )
+                                                                                $controlActions[]        = '<a class="delete" href="wpmu-edit.php?action=confirm&amp;action2=unspamblog&amp;id=' . $blog['blog_id'] . '&amp;msg=' . urlencode( sprintf( __( "You are about to unspam the blog %s" ), $blogname ) ) . '">' . __('Not Spam') . '</a>';
+                                                                        else
+                                                                                $controlActions[]        = '<a class="delete" href="wpmu-edit.php?action=confirm&amp;action2=spamblog&amp;id=' . $blog['blog_id'] . '&amp;msg=' . urlencode( sprintf( __( "You are about to mark the blog %s as spam" ), $blogname ) ) . '">' . __("Spam") . '</a>';
+                                                                        
+                                                                        $controlActions[]        = '<a class="delete" href="wpmu-edit.php?action=confirm&amp;action2=deleteblog&amp;id=' . $blog['blog_id'] . '&amp;msg=' . urlencode( sprintf( __( "You are about to delete the blog %s" ), $blogname ) ) . '">' . __("Delete") . '</a>';
+                                                                        
+                                                                        $controlActions[]        = "<a href='http://{$blog['domain']}{$blog['path']}' rel='permalink'>" . __('Visit') . '</a>';
+                                                                        ?>
+                                                                        
+                                                                        <?php if (count($controlActions)) : ?>
+                                                                        <div class="row-actions">
+                                                                                <?php echo implode(' | ', $controlActions); ?>
+                                                                        </div>
+                                                                        <?php endif; ?>
+                                                                </td>
+                                                        <?php
+                                                        break;
+
+                                                        case 'lastupdated': ?>
+                                                                <td valign="top">
+                                                                        <?php echo ( $blog['last_updated'] == '0000-00-00 00:00:00' ) ? __("Never") : mysql2date(__('Y-m-d \<\b\r \/\> g:i:s a'), $blog['last_updated']); ?>
+                                                                </td>
+                                                        <?php
+                                                        break;
+                                                        case 'registered': ?>
+                                                                <td valign="top">
+                                                                        <?php echo mysql2date(__('Y-m-d \<\b\r \/\> g:i:s a'), $blog['registered']); ?>
+                                                                </td>
+                                                        <?php
+                                                        break;
+
+                                                        case 'users': ?>
+                                                                <td valign="top">
+                                                                        <?php
+                                                                        $blogusers = get_users_of_blog( $blog['blog_id'] );
+                                                                        if ( is_array( $blogusers ) ) {
+                                                                                $blogusers_warning = '';
+                                                                                if ( count( $blogusers ) > 5 ) {
+                                                                                        $blogusers = array_slice( $blogusers, 0, 5 );
+                                                                                        $blogusers_warning = __( 'Only showing first 5 users.' ) . ' <a href="' . $protocol . $blog[ 'domain' ] . $blog[ 'path' ] . 'wp-admin/users.php">' . __( 'More' ) . '</a>';
+                                                                                }
+                                                                                foreach ( $blogusers as $key => $val ) {
+                                                                                        echo '<a href="user-edit.php?user_id=' . $val->user_id . '">' . $val->user_login . '</a> ('.$val->user_email.')<br />';
+                                                                                }
+                                                                                if( $blogusers_warning != '' ) {
+                                                                                        echo '<strong>' . $blogusers_warning . '</strong><br />';
+                                                                                }
+                                                                        }
+                                                                        ?>
+                                                                </td>
+                                                        <?php
+                                                        break;
+
+                                                        case 'plugins': ?>
+                                                                <?php if( has_filter( 'wpmublogsaction' ) ) { ?>
+                                                                <td valign="top">
+                                                                        <?php do_action( "wpmublogsaction", $blog['blog_id'] ); ?>
+                                                                </td>
+                                                                <?php } ?>
+                                                        <?php break;
+
+                                                        default: ?>
+                                                                <?php if( has_filter( 'manage_blogs_custom_column' ) ) { ?>
+                                                                <td valign="top">
+                                                                        <?php do_action('manage_blogs_custom_column', $column_name, $blog['blog_id']); ?>
+                                                                </td>
+                                                                <?php } ?>
+                                                        <?php break;
+                                                }
+                                        }
+                                        ?>
+                                        </tr>
+                                        <?php
+                                }
+                        } else { ?>
+                                <tr style='background-color: <?php echo $bgcolor; ?>'>
+                                        <td colspan="8"><?php _e('No blogs found.') ?></td>
+                                </tr>
+                        <?php
+                        } // end if ($blogs)
+                        ?>
+
+                        </tbody>
+                </table>
+                </form>
+                </div>
+
+                <div class="wrap">
+                        <a name="form-add-blog"></a>
+                        <h2><?php _e('Add Blog') ?></h2>
+                        <form method="post" action="wpmu-edit.php?action=addblog">
+                                <?php wp_nonce_field('add-blog') ?>
+                                <table class="form-table">
+                                        <tr class="form-field form-required">
+                                                <th style="text-align:center;" scope='row'><?php _e('Blog Address') ?></th>
+                                                <td>
+                                                <?php if ( constant( "VHOST" ) == 'yes' ) { ?>
+                                                        <input name="blog[domain]" type="text" title="<?php _e('Domain') ?>"/>.<?php echo $current_site->domain;?>
+                                                <?php } else {
+                                                        echo $current_site->domain . $current_site->path ?><input name="blog[domain]" type="text" title="<?php _e('Domain') ?>"/>
+                                                <?php }
+                                                echo "<p>" . __( 'Only the characters a-z and 0-9 recommended.' ) . "</p>";
+                                                ?>
+                                                </td>
+                                        </tr>
+                                        <tr class="form-field form-required">
+                                                <th style="text-align:center;" scope='row'><?php _e('Blog Title') ?></th>
+                                                <td><input name="blog[title]" type="text" size="20" title="<?php _e('Title') ?>"/></td>
+                                        </tr>
+                                        <tr class="form-field form-required">
+                                                <th style="text-align:center;" scope='row'><?php _e('Admin Email') ?></th>
+                                                <td><input name="blog[email]" type="text" size="20" title="<?php _e('Email') ?>"/></td>
+                                        </tr>
+                                        <tr class="form-field">
+                                                <td colspan='2'><?php _e('A new user will be created if the above email address is not in the database.') ?><br /><?php _e('The username and password will be mailed to this email address.') ?></td>
+                                        </tr>
+                                </table>
+                                <p class="submit">
+                                        <input class="button" type="submit" name="go" value="<?php _e('Add Blog') ?>" /></p>
+                        </form>
+                </div>
+                <?php
+        break;
+} // end switch( $action )
+
+include('admin-footer.php'); ?>
</ins><span class="cx">Property changes on: trunk/wp-admin/ms-sites.php
</span><span class="cx">___________________________________________________________________
</span><span class="cx">Name: svn:executable
</span><span class="cx"> + *
</span></span></pre></div>
<a id="trunkwpadminmsupgradesitephp"></a>
<div class="addfile"><h4>Added: trunk/wp-admin/ms-upgrade-site.php (0 => 12603)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/wp-admin/ms-upgrade-site.php         (rev 0)
+++ trunk/wp-admin/ms-upgrade-site.php        2010-01-06 04:02:57 UTC (rev 12603)
</span><span class="lines">@@ -0,0 +1,62 @@
</span><ins>+<?php
+require_once('admin.php');
+require_once( ABSPATH . WPINC . '/http.php' );
+
+$title = __('WordPress MU &rsaquo; Admin &rsaquo; Upgrade Site');
+$parent_file = 'wpmu-admin.php';
+require_once('admin-header.php');
+
+if( is_site_admin() == false ) {
+ wp_die( __('You do not have permission to access this page.') );
+}
+
+echo '<div class="wrap">';
+echo '<h2>'.__('Upgrade Site').'</h2>';
+switch( $_GET['action'] ) {
+        case "upgrade":
+                $n = ( isset($_GET['n']) ) ? intval($_GET['n']) : 0;
+
+                if ( $n < 5 ) {
+                        global $wp_db_version;
+                        update_site_option( 'wpmu_upgrade_site', $wp_db_version );
+                }
+
+                $blogs = $wpdb->get_results( "SELECT * FROM {$wpdb->blogs} WHERE site_id = '{$wpdb->siteid}' AND spam = '0' AND deleted = '0' AND archived = '0' ORDER BY registered DESC LIMIT {$n}, 5", ARRAY_A );
+                if( is_array( $blogs ) ) {
+                        echo "<ul>";
+                        foreach( (array) $blogs as $details ) {
+                                if( $details['spam'] == 0 && $details['deleted'] == 0 && $details['archived'] == 0 ) {
+                                        $siteurl = $wpdb->get_var("SELECT option_value from {$wpdb->base_prefix}{$details['blog_id']}_options WHERE option_name = 'siteurl'");
+                                        echo "<li>$siteurl</li>";
+                                        $response = wp_remote_get( trailingslashit( $siteurl ) . "wp-admin/upgrade.php?step=1", array( 'timeout' => 120, 'httpversion' => '1.1' ) );
+                                        if( is_wp_error( $response ) ) {
+                                                wp_die( "<strong>Warning!</strong> Problem upgrading {$siteurl}. Your server may not be able to connect to blogs running on it.<br /> Error message: <em>" . $response->get_error_message() ."</em>" );
+                                        }
+                                        do_action( 'after_mu_upgrade', $response );
+                                        do_action( 'wpmu_upgrade_site', $details[ 'blog_id' ] );
+                                }
+                        }
+                        echo "</ul>";
+                        ?><p><?php _e("If your browser doesn't start loading the next page automatically click this link:"); ?> <a class="button" href="wpmu-upgrade-site.php?action=upgrade&amp;n=<?php echo ($n + 5) ?>"><?php _e("Next Blogs"); ?></a></p>
+                        <script type='text/javascript'>
+                        <!--
+                        function nextpage() {
+                                location.href = "wpmu-upgrade-site.php?action=upgrade&n=<?php echo ($n + 5) ?>";
+                        }
+                        setTimeout( "nextpage()", 250 );
+                        //-->
+                        </script><?php
+                } else {
+                        echo '<p>'.__('All Done!').'</p>';
+                }
+        break;
+        default:
+                ?><p><?php _e("You can upgrade all the blogs on your site through this page. It works by calling the upgrade script of each blog automatically. Hit the link below to upgrade."); ?></p>
+                <p><a class="button" href="wpmu-upgrade-site.php?action=upgrade"><?php _e("Upgrade Site"); ?></a></p><?php
+                do_action( 'wpmu_upgrade_page' );
+        break;
+}
+?>
+</div>
+
+<?php include('admin-footer.php'); ?>
</ins><span class="cx">Property changes on: trunk/wp-admin/ms-upgrade-site.php
</span><span class="cx">___________________________________________________________________
</span><span class="cx">Name: svn:executable
</span><span class="cx"> + *
</span></span></pre></div>
<a id="trunkwpadminmsusersphp"></a>
<div class="addfile"><h4>Added: trunk/wp-admin/ms-users.php (0 => 12603)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/wp-admin/ms-users.php         (rev 0)
+++ trunk/wp-admin/ms-users.php        2010-01-06 04:02:57 UTC (rev 12603)
</span><span class="lines">@@ -0,0 +1,301 @@
</span><ins>+<?php
+require_once('admin.php');
+
+$title = __('WordPress MU &rsaquo; Admin &rsaquo; Users');
+$parent_file = 'wpmu-admin.php';
+
+wp_enqueue_script( 'admin-forms' );
+
+require_once('admin-header.php');
+
+if( is_site_admin() == false ) {
+        wp_die( __('You do not have permission to access this page.') );
+}
+
+if ( $_GET['updated'] == 'true' ) {
+        ?>
+        <div id="message" class="updated fade"><p>
+                <?php
+                switch ($_GET['action']) {
+                        case 'delete':
+                                _e('User deleted !');
+                        break;
+                        case 'all_spam':
+                                _e('Users marked as spam !');
+                        break;
+                        case 'all_notspam':
+                                _e('Users marked as not spam !');
+                        break;
+                        case 'all_delete':
+                                _e('Users deleted !');
+                        break;
+                        case 'add':
+                                _e('User added !');
+                        break;
+                }
+                ?>
+        </p></div>
+        <?php
+}
+?>
+
+<div class="wrap" style="position:relative;">
+        <?php
+        $apage = isset( $_GET['apage'] ) ? intval( $_GET['apage'] ) : 1;
+        $num = isset( $_GET['num'] ) ? intval( $_GET['num'] ) : 15;
+        $s = wp_specialchars( trim( $_GET[ 's' ] ) );
+
+        $query = "SELECT * FROM {$wpdb->users}";
+
+        if( !empty( $s ) ) {
+                $search = '%' . trim( $s ) . '%';
+                $query .= " WHERE user_login LIKE '$search' OR user_email LIKE '$search'";
+        }
+
+        if( !isset($_GET['sortby']) ) {
+                $_GET['sortby'] = 'id';
+        }
+
+        if( $_GET['sortby'] == 'email' ) {
+                $query .= ' ORDER BY user_email ';
+        } elseif( $_GET['sortby'] == 'id' ) {
+                $query .= ' ORDER BY ID ';
+        } elseif( $_GET['sortby'] == 'login' ) {
+                $query .= ' ORDER BY user_login ';
+        } elseif( $_GET['sortby'] == 'name' ) {
+                $query .= ' ORDER BY display_name ';
+        } elseif( $_GET['sortby'] == 'registered' ) {
+                $query .= ' ORDER BY user_registered ';
+        }
+
+        $query .= ( $_GET['order'] == 'DESC' ) ? 'DESC' : 'ASC';
+
+        if( !empty( $s )) {
+                $total = $wpdb->get_var( str_replace('SELECT *', 'SELECT COUNT(ID)', $query) );
+        } else {
+                $total = $wpdb->get_var( "SELECT COUNT(ID) FROM {$wpdb->users}");
+        }
+
+        $query .= " LIMIT " . intval( ( $apage - 1 ) * $num) . ", " . intval( $num );
+
+        $user_list = $wpdb->get_results( $query, ARRAY_A );
+
+        // Pagination
+        $user_navigation = paginate_links( array(
+                'total' => ceil($total / $num),        
+                'current' => $apage,
+                'base' => add_query_arg( 'apage', '%#%' ),
+                'format' => ''
+        ));
+        
+        if ( $user_navigation ) {
+                $user_navigation = sprintf( '<span class="displaying-num">' . __( 'Displaying %s&#8211;%s of %s' ) . '</span>%s',
+                        number_format_i18n( ( $apage - 1 ) * $num + 1 ),
+                        number_format_i18n( min( $apage * $num, $total ) ),
+                        number_format_i18n( $total ),
+                        $user_navigation
+                );
+        }
+        
+        ?>
+        <div class="wrap">
+        <h2><?php _e( $current_site->site_name ); ?> <?php _e("Users"); ?></h2>
+        <form action="wpmu-users.php" method="get" class="search-form">
+                <p class="search-box">
+                <input type="text" name="s" value="<?php if (isset($_GET['s'])) _e( stripslashes( $s ) ); ?>" class="search-input" id="user-search-input" />
+                <input type="submit" id="post-query-submit" value="<?php _e('Search Users') ?>" class="button" />
+                </p>
+        </form>
+        </div>
+
+        <form id="form-user-list" action='wpmu-edit.php?action=allusers' method='post'>
+                <div class="tablenav">
+                        <?php if ( $user_navigation ) echo "<div class='tablenav-pages'>$user_navigation</div>"; ?>
+
+                        <div class="alignleft actions">
+                                <input type="submit" value="<?php _e('Delete') ?>" name="alluser_delete" class="button-secondary delete" />
+                                <input type="submit" value="<?php _e('Mark as Spammers') ?>" name="alluser_spam" class="button-secondary" />
+                                <input type="submit" value="<?php _e('Not Spam') ?>" name="alluser_notspam" class="button-secondary" />
+                                <?php wp_nonce_field( 'allusers' ); ?>
+                                <br class="clear" />
+                        </div>
+                </div>
+
+                <?php if( isset($_GET['s']) && $_GET['s'] != '' ) : ?>
+                        <p><a href="wpmu-blogs.php?action=blogs&amp;s=<?php echo urlencode( stripslashes( $s ) ); ?>&blog_name=Search+blogs+by+name"><?php _e('Search Blogs for') ?> <strong><?php echo stripslashes( $s ) ?></strong></a></p>
+                <?php endif; ?>
+
+                <?php
+                // define the columns to display, the syntax is 'internal name' => 'display name'
+                $posts_columns = array(
+                        'checkbox'         => '',
+                        'login' => __('Username'),
+                        'name' => __('Name'),
+                        'email' => __('E-mail'),
+                        'registered' => __('Registered'),
+                        'blogs' => ''
+                );
+                $posts_columns = apply_filters('wpmu_users_columns', $posts_columns);
+                ?>
+                <table class="widefat" cellspacing="0">
+                        <thead>
+                        <tr>
+                                <?php foreach( (array) $posts_columns as $column_id => $column_display_name) {
+                                        if( $column_id == 'blogs' ) {
+                                                echo '<th scope="col">'.__('Blogs').'</th>';
+                                        } elseif( $column_id == 'checkbox') {
+                                                echo '<th scope="col" class="check-column"><input type="checkbox" /></th>';
+                                        } else { ?>
+                                                <th scope="col"><a href="wpmu-users.php?sortby=<?php echo $column_id ?>&amp;<?php if( $_GET['sortby'] == $column_id ) { if( $_GET['order'] == 'DESC' ) { echo "order=ASC&amp;" ; } else { echo "order=DESC&amp;"; } } ?>apage=<?php echo $apage ?>"><?php echo $column_display_name; ?></a></th>
+                                        <?php } ?>
+                                <?php } ?>
+                        </tr>
+                        </thead>
+                        <tbody id="users" class="list:user user-list">
+                        <?php if ($user_list) {
+                                $bgcolor = '';
+                                foreach ( (array) $user_list as $user) {
+                                        $class = ('alternate' == $class) ? '' : 'alternate';
+                                        
+                                        $status_list = array( "spam" => "#faa", "deleted" => "#f55" );
+                                        
+                                        $bgcolour = "";
+                                        foreach ( $status_list as $status => $col ) {
+                                                if( $user[$status] ) {
+                                                        $bgcolour = "style='background: $col'";
+                                                }
+                                        }
+
+                                        ?>
+
+                                        <tr <?php echo $bgcolour; ?> class="<?php echo $class; ?>">
+                                        <?php
+                                        foreach( (array) $posts_columns as $column_name=>$column_display_name) :
+                                                switch($column_name) {
+                                                        case 'checkbox': ?>
+                                                                <th scope="row" class="check-column"><input type='checkbox' id='user_<?php echo $user['ID'] ?>' name='allusers[]' value='<?php echo $user['ID'] ?>' /></th>
+                                                        <?php
+                                                        break;
+
+                                                        case 'login':
+                                                                $avatar        = get_avatar( $user['user_email'], 32 );
+                                                                $edit        = clean_url( add_query_arg( 'wp_http_referer', urlencode( clean_url( stripslashes( $_SERVER['REQUEST_URI'] ) ) ), "user-edit.php?user_id=".$user['ID'] ) );
+                                                                // @todo Make delete link work like delete button with transfering users (in wpmu-edit.php)
+                                                                //$delete        = clean_url( add_query_arg( 'wp_http_referer', urlencode( clean_url( stripslashes( $_SERVER['REQUEST_URI'] ) ) ), wp_nonce_url( 'wpmu-edit.php', 'deleteuser' ) . '&amp;action=deleteuser&amp;id=' . $user['ID'] ) );
+                                                                ?>
+                                                                <td class="username column-username">
+                                                                        <?php echo $avatar; ?><strong><a href="<?php echo $edit; ?>" class="edit"><?php echo stripslashes($user['user_login']); ?></a></strong>
+                                                                        <br/>
+                                                                        <div class="row-actions">
+                                                                                <span class="edit"><a href="<?php echo $edit; ?>">Edit</a></span>
+                                                                                <?php /*<span class="delete"><a href="<?php echo $delete; ?>" class="delete">Delete</a></span> */ ?>
+                                                                        </div>
+                                                                </td>
+                                                        <?php
+                                                        break;
+
+                                                        case 'name': ?>
+                                                                <td class="name column-name"><?php echo $user['display_name'] ?></td>
+                                                        <?php
+                                                        break;
+
+                                                        case 'email': ?>
+                                                                <td class="email column-email"><a href="mailto:<?php echo $user['user_email'] ?>"><?php echo $user['user_email'] ?></a></td>
+                                                        <?php
+                                                        break;
+
+                                                        case 'registered': ?>
+                                                                <td><?php echo mysql2date(__('Y-m-d \<\b\r \/\> g:i a'), $user['user_registered']); ?></td>
+                                                        <?php
+                                                        break;
+
+                                                        case 'blogs':
+                                                                $blogs = get_blogs_of_user( $user['ID'], true );
+                                                                ?>
+                                                                <td>
+                                                                        <?php
+                                                                        if( is_array( $blogs ) ) {
+                                                                                foreach ( (array) $blogs as $key => $val ) {
+                                                                                        $path        = ($val->path == '/') ? '' : $val->path;
+                                                                                        echo '<a href="wpmu-blogs.php?action=editblog&amp;id=' . $val->userblog_id . '">' . str_replace( '.' . $current_site->domain, '', $val->domain . $path ) . '</a>';
+                                                                                        echo ' <small class="row-actions">';
+                                                                                        
+                                                                                        // Edit
+                                                                                        echo '<a href="wpmu-blogs.php?action=editblog&amp;id=' . $val->userblog_id . '">' . __('Edit') . '</a> | ';
+                                                                                        
+                                                                                        // View
+                                                                                        echo '<a ';
+                                                                                        if( get_blog_status( $val->userblog_id, 'spam' ) == 1 )
+                                                                                                echo 'style="background-color: #f66" ';
+                                                                                        echo 'target="_new" href="http://'.$val->domain . $val->path.'">' . __('View') . '</a>';
+                                                                                        
+                                                                                        echo '</small><br />';
+                                                                                }
+                                                                        }
+                                                                        ?>
+                                                                </td>
+                                                        <?php
+                                                        break;
+
+                                                        default: ?>
+                                                                <td><?php do_action('manage_users_custom_column', $column_name, $user['ID']); ?></td>
+                                                        <?php
+                                                        break;
+                                                }
+                                        endforeach
+                                        ?>
+                                        </tr>
+                                        <?php
+                                }
+                        } else {
+                        ?>
+                                <tr style='background-color: <?php echo $bgcolor; ?>'>
+                                        <td colspan="<?php echo (int) count($posts_columns); ?>"><?php _e('No users found.') ?></td>
+                                </tr>
+                                <?php
+                        } // end if ($users)
+                        ?>
+                        </tbody>
+                </table>
+                
+                <div class="tablenav">
+                        <?php if ( $user_navigation ) echo "<div class='tablenav-pages'>$user_navigation</div>"; ?>
+
+                        <div class="alignleft">
+                                <input type="submit" value="<?php _e('Delete') ?>" name="alluser_delete" class="button-secondary delete" />
+                                <input type="submit" value="<?php _e('Mark as Spammers') ?>" name="alluser_spam" class="button-secondary" />
+                                <input type="submit" value="<?php _e('Not Spam') ?>" name="alluser_notspam" class="button-secondary" />
+                                <?php wp_nonce_field( 'allusers' ); ?>
+                                <br class="clear" />
+                        </div>
+                </div>
+        </form>
+</div>
+
+<?php
+if( apply_filters('show_adduser_fields', true) ) :
+?>
+<div class="wrap">
+        <h2><?php _e('Add user') ?></h2>
+        <form action="wpmu-edit.php?action=adduser" method="post">
+        <table class="form-table">
+                <tr class="form-field form-required">
+                        <th scope='row'><?php _e('Username') ?></th>
+                        <td><input type="text" name="user[username]" /></td>
+                </tr>
+                <tr class="form-field form-required">
+                        <th scope='row'><?php _e('Email') ?></th>
+                        <td><input type="text" name="user[email]" /></td>
+                </tr>
+                <tr class="form-field">
+                        <td colspan='2'><?php _e('Username and password will be mailed to the above email address.') ?></td>
+                </tr>
+        </table>
+        <p class="submit">
+                <?php wp_nonce_field('add-user') ?>
+                <input class="button" type="submit" name="Add user" value="<?php _e('Add user') ?>" /></p>
+        </form>
+</div>
+<?php endif; ?>
+
+<?php include('admin-footer.php'); ?>
</ins><span class="cx">Property changes on: trunk/wp-admin/ms-users.php
</span><span class="cx">___________________________________________________________________
</span><span class="cx">Name: svn:executable
</span><span class="cx"> + *
</span></span></pre></div>
<a id="trunkwpcontentblogsphp"></a>
<div class="addfile"><h4>Added: trunk/wp-content/blogs.php (0 => 12603)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/wp-content/blogs.php         (rev 0)
+++ trunk/wp-content/blogs.php        2010-01-06 04:02:57 UTC (rev 12603)
</span><span class="lines">@@ -0,0 +1,129 @@
</span><ins>+<?php
+define( 'SHORTINIT', true ); // this prevents most of WP from being loaded
+require_once( dirname( dirname( __FILE__) ) . '/wp-load.php' ); // absolute includes are faster
+
+if ( $current_blog->archived == '1' || $current_blog->spam == '1' || $current_blog->deleted == '1' ) {
+        status_header( 404 );
+        die('404 &#8212; File not found.');
+}
+
+if ( !function_exists('wp_check_filetype') ) :
+function wp_check_filetype($filename, $mimes = null) {
+        // Accepted MIME types are set here as PCRE unless provided.
+        $mimes = is_array($mimes) ? $mimes : array (
+                'jpg|jpeg|jpe' => 'image/jpeg',
+                'gif' => 'image/gif',
+                'png' => 'image/png',
+                'bmp' => 'image/bmp',
+                'tif|tiff' => 'image/tiff',
+                'ico' => 'image/x-icon',
+                'asf|asx|wax|wmv|wmx' => 'video/asf',
+                'avi' => 'video/avi',
+                'mov|qt' => 'video/quicktime',
+                'mpeg|mpg|mpe' => 'video/mpeg',
+                'txt|c|cc|h' => 'text/plain',
+                'rtx' => 'text/richtext',
+                'css' => 'text/css',
+                'htm|html' => 'text/html',
+                'mp3|mp4' => 'audio/mpeg',
+                'ra|ram' => 'audio/x-realaudio',
+                'wav' => 'audio/wav',
+                'ogg' => 'audio/ogg',
+                'mid|midi' => 'audio/midi',
+                'wma' => 'audio/wma',
+                'rtf' => 'application/rtf',
+                'js' => 'application/javascript',
+                'pdf' => 'application/pdf',
+                'doc' => 'application/msword',
+                'pot|pps|ppt' => 'application/vnd.ms-powerpoint',
+                'wri' => 'application/vnd.ms-write',
+                'xla|xls|xlt|xlw' => 'application/vnd.ms-excel',
+                'mdb' => 'application/vnd.ms-access',
+                'mpp' => 'application/vnd.ms-project',
+                'swf' => 'application/x-shockwave-flash',
+                'class' => 'application/java',
+                'tar' => 'application/x-tar',
+                'zip' => 'application/zip',
+                'gz|gzip' => 'application/x-gzip',
+                'exe' => 'application/x-msdownload'
+        );
+
+        $type = false;
+        $ext = false;
+
+        foreach ( (array)$mimes as $ext_preg => $mime_match ) {
+                $ext_preg = '!\.(' . $ext_preg . ')$!i';
+                if ( preg_match($ext_preg, $filename, $ext_matches) ) {
+                        $type = $mime_match;
+                        $ext = $ext_matches[1];
+                        break;
+                }
+        }
+
+        return compact('ext', 'type');
+}
+endif;
+
+
+$file = BLOGUPLOADDIR . str_replace( '..', '', $_GET[ 'file' ] );
+if ( !is_file( $file ) ) {
+        status_header( 404 );
+        die('404 &#8212; File not found.');
+}
+
+$mime = wp_check_filetype( $_SERVER[ 'REQUEST_URI' ] );
+if( $mime[ 'type' ] === false && function_exists( 'mime_content_type' ) )
+                $mime[ 'type' ] = mime_content_type( $file );
+
+if( $mime[ 'type' ] != false ) {
+        $mimetype = $mime[ 'type' ];
+} else {
+        $ext = substr( $_SERVER[ 'REQUEST_URI' ], strrpos( $_SERVER[ 'REQUEST_URI' ], '.' ) + 1 );
+        $mimetype = "image/$ext";
+}
+@header( 'Content-type: ' . $mimetype ); // always send this
+if ( false === strpos( $_SERVER['SERVER_SOFTWARE'], 'Microsoft-IIS' ) )
+        @header( 'Content-Length: ' . filesize( $file ) );
+
+// Optional support for X-Sendfile and X-Accel-Redirect
+if ( defined('WPMU_ACCEL_REDIRECT') && WPMU_ACCEL_REDIRECT ) {
+        @header( 'X-Accel-Redirect: ' . str_replace( WP_CONTENT_DIR, '', $file ) );
+        exit;
+} elseif ( defined('WPMU_SENDFILE') && WPMU_SENDFILE ) {
+        @header( 'X-Sendfile: ' . $file );
+        exit;
+}
+
+$last_modified = gmdate('D, d M Y H:i:s', filemtime( $file ));
+$etag = '"' . md5($last_modified) . '"';
+@header( "Last-Modified: $last_modified GMT" );
+@header( 'ETag: ' . $etag );
+@header( 'Expires: ' . gmdate('D, d M Y H:i:s', time() + 100000000) . ' GMT' );
+
+// Support for Conditional GET
+if (isset($_SERVER['HTTP_IF_NONE_MATCH']))
+        $client_etag = stripslashes($_SERVER['HTTP_IF_NONE_MATCH']);
+else
+        $client_etag = false;
+
+if( !isset( $_SERVER['HTTP_IF_MODIFIED_SINCE'] ) )
+        $_SERVER['HTTP_IF_MODIFIED_SINCE'] = false;
+$client_last_modified = trim( $_SERVER['HTTP_IF_MODIFIED_SINCE']);
+// If string is empty, return 0. If not, attempt to parse into a timestamp
+$client_modified_timestamp = $client_last_modified ? strtotime($client_last_modified) : 0;
+
+// Make a timestamp for our most recent modification...        
+$modified_timestamp = strtotime($last_modified);
+
+if ( ($client_last_modified && $client_etag) ?
+         (($client_modified_timestamp >= $modified_timestamp) && ($client_etag == $etag)) :
+         (($client_modified_timestamp >= $modified_timestamp) || ($client_etag == $etag)) ) {
+        status_header( 304 );
+        exit;
+}
+
+// If we made it this far, just serve the file
+
+readfile( $file );
+
+?>
</ins><span class="cx">Property changes on: trunk/wp-content/blogs.php
</span><span class="cx">___________________________________________________________________
</span><span class="cx">Name: svn:executable
</span><span class="cx"> + *
</span></span></pre></div>
<a id="trunkwpincludesgettextphp"></a>
<div class="addfile"><h4>Added: trunk/wp-includes/gettext.php (0 => 12603)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/wp-includes/gettext.php         (rev 0)
+++ trunk/wp-includes/gettext.php        2010-01-06 04:02:57 UTC (rev 12603)
</span><span class="lines">@@ -0,0 +1,400 @@
</span><ins>+<?php
+/**
+ * PHP-Gettext External Library: gettext_reader class
+ *
+ * @package External
+ * @subpackage PHP-gettext
+ *
+ * @internal
+         Copyright (c) 2003 Danilo Segan <danilo@kvota.net>.
+         Copyright (c) 2005 Nico Kaiser <nico@siriux.net>
+
+         This file is part of PHP-gettext.
+
+         PHP-gettext is free software; you can redistribute it and/or modify
+         it under the terms of the GNU General Public License as published by
+         the Free Software Foundation; either version 2 of the License, or
+         (at your option) any later version.
+
+         PHP-gettext is distributed in the hope that it will be useful,
+         but WITHOUT ANY WARRANTY; without even the implied warranty of
+         MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+         GNU General Public License for more details.
+
+         You should have received a copy of the GNU General Public License
+         along with PHP-gettext; if not, write to the Free Software
+         Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+*/
+
+/**
+ * Provides a simple gettext replacement that works independently from
+ * the system's gettext abilities.
+ * It can read MO files and use them for translating strings.
+ * The files are passed to gettext_reader as a Stream (see streams.php)
+ *
+ * This version has the ability to cache all strings and translations to
+ * speed up the string lookup.
+ * While the cache is enabled by default, it can be switched off with the
+ * second parameter in the constructor (e.g. whenusing very large MO files
+ * that you don't want to keep in memory)
+ */
+class gettext_reader {
+        //public:
+         var $error = 0; // public variable that holds error code (0 if no error)
+
+         //private:
+        var $BYTEORDER = 0; // 0: low endian, 1: big endian
+        var $STREAM = NULL;
+        var $short_circuit = false;
+        var $enable_cache = false;
+        var $originals = NULL; // offset of original table
+        var $translations = NULL; // offset of translation table
+        var $pluralheader = NULL; // cache header field for plural forms
+        var $select_string_function = NULL; // cache function, which chooses plural forms
+        var $total = 0; // total string count
+        var $table_originals = NULL; // table for original strings (offsets)
+        var $table_translations = NULL; // table for translated strings (offsets)
+        var $cache_translations = NULL; // original -> translation mapping
+
+
+        /* Methods */
+
+
+        /**
+         * Reads a 32bit Integer from the Stream
+         *
+         * @access private
+         * @return Integer from the Stream
+         */
+        function readint() {
+                if ($this->BYTEORDER == 0) {
+                        // low endian
+                        $low_end = unpack('V', $this->STREAM->read(4));
+                        return array_shift($low_end);
+                } else {
+                        // big endian
+                        $big_end = unpack('N', $this->STREAM->read(4));
+                        return array_shift($big_end);
+                }
+        }
+
+        /**
+         * Reads an array of Integers from the Stream
+         *
+         * @param int count How many elements should be read
+         * @return Array of Integers
+         */
+        function readintarray($count) {
+        if ($this->BYTEORDER == 0) {
+                        // low endian
+                        return unpack('V'.$count, $this->STREAM->read(4 * $count));
+                } else {
+                        // big endian
+                        return unpack('N'.$count, $this->STREAM->read(4 * $count));
+                }
+        }
+
+        /**
+         * Constructor
+         *
+         * @param object Reader the StreamReader object
+         * @param boolean enable_cache Enable or disable caching of strings (default on)
+         */
+        function gettext_reader($Reader, $enable_cache = true) {
+                // If there isn't a StreamReader, turn on short circuit mode.
+                if (! $Reader || isset($Reader->error) ) {
+                        $this->short_circuit = true;
+                        return;
+                }
+
+                // Caching can be turned off
+                $this->enable_cache = $enable_cache;
+
+                // $MAGIC1 = (int)0x950412de; //bug in PHP 5.0.2, see https://savannah.nongnu.org/bugs/?func=detailitem&item_id=10565
+                $MAGIC1 = (int) - 1794895138;
+                // $MAGIC2 = (int)0xde120495; //bug
+                $MAGIC2 = (int) - 569244523;
+                // 64-bit fix
+                $MAGIC3 = (int) 2500072158;
+
+                $this->STREAM = $Reader;
+                $magic = $this->readint();
+                if ($magic == $MAGIC1 || $magic == $MAGIC3) { // to make sure it works for 64-bit platforms
+                        $this->BYTEORDER = 0;
+                } elseif ($magic == ($MAGIC2 & 0xFFFFFFFF)) {
+                        $this->BYTEORDER = 1;
+                } else {
+                        $this->error = 1; // not MO file
+                        return false;
+                }
+
+                // FIXME: Do we care about revision? We should.
+                $revision = $this->readint();
+
+                $this->total = $this->readint();
+                $this->originals = $this->readint();
+                $this->translations = $this->readint();
+        }
+
+        /**
+         * Loads the translation tables from the MO file into the cache
+         * If caching is enabled, also loads all strings into a cache
+         * to speed up translation lookups
+         *
+         * @access private
+         */
+        function load_tables() {
+                if (is_array($this->cache_translations) &&
+                        is_array($this->table_originals) &&
+                        is_array($this->table_translations))
+                        return;
+
+                /* get original and translations tables */
+                $this->STREAM->seekto($this->originals);
+                $this->table_originals = $this->readintarray($this->total * 2);
+                $this->STREAM->seekto($this->translations);
+                $this->table_translations = $this->readintarray($this->total * 2);
+
+                if ($this->enable_cache) {
+                        $this->cache_translations = array ();
+                        /* read all strings in the cache */
+                        for ($i = 0; $i < $this->total; $i++) {
+                                $this->STREAM->seekto($this->table_originals[$i * 2 + 2]);
+                                $original = $this->STREAM->read($this->table_originals[$i * 2 + 1]);
+                                $this->STREAM->seekto($this->table_translations[$i * 2 + 2]);
+                                $translation = $this->STREAM->read($this->table_translations[$i * 2 + 1]);
+                                $this->cache_translations[$original] = $translation;
+                        }
+                }
+        }
+
+        /**
+         * Returns a string from the "originals" table
+         *
+         * @access private
+         * @param int num Offset number of original string
+         * @return string Requested string if found, otherwise ''
+         */
+        function get_original_string($num) {
+                $length = $this->table_originals[$num * 2 + 1];
+                $offset = $this->table_originals[$num * 2 + 2];
+                if (! $length)
+                        return '';
+                $this->STREAM->seekto($offset);
+                $data = $this->STREAM->read($length);
+                return (string)$data;
+        }
+
+        /**
+         * Returns a string from the "translations" table
+         *
+         * @access private
+         * @param int num Offset number of original string
+         * @return string Requested string if found, otherwise ''
+         */
+        function get_translation_string($num) {
+                $length = $this->table_translations[$num * 2 + 1];
+                $offset = $this->table_translations[$num * 2 + 2];
+                if (! $length)
+                        return '';
+                $this->STREAM->seekto($offset);
+                $data = $this->STREAM->read($length);
+                return (string)$data;
+        }
+
+        /**
+         * Binary search for string
+         *
+         * @access private
+         * @param string string
+         * @param int start (internally used in recursive function)
+         * @param int end (internally used in recursive function)
+         * @return int string number (offset in originals table)
+         */
+        function find_string($string, $start = -1, $end = -1) {
+                if (($start == -1) or ($end == -1)) {
+                        // find_string is called with only one parameter, set start end end
+                        $start = 0;
+                        $end = $this->total;
+                }
+                if (abs($start - $end) <= 1) {
+                        // We're done, now we either found the string, or it doesn't exist
+                        $txt = $this->get_original_string($start);
+                        if ($string == $txt)
+                                return $start;
+                        else
+                                return -1;
+                } else if ($start > $end) {
+                        // start > end -> turn around and start over
+                        return $this->find_string($string, $end, $start);
+                } else {
+                        // Divide table in two parts
+                        $half = (int)(($start + $end) / 2);
+                        $cmp = strcmp($string, $this->get_original_string($half));
+                        if ($cmp == 0)
+                                // string is exactly in the middle => return it
+                                return $half;
+                        else if ($cmp < 0)
+                                // The string is in the upper half
+                                return $this->find_string($string, $start, $half);
+                        else
+                                // The string is in the lower half
+                                return $this->find_string($string, $half, $end);
+                }
+        }
+
+        /**
+         * Translates a string
+         *
+         * @access public
+         * @param string string to be translated
+         * @return string translated string (or original, if not found)
+         */
+        function translate($string) {
+                if ($this->short_circuit)
+                        return $string;
+                $this->load_tables();
+
+                if ($this->enable_cache) {
+                        // Caching enabled, get translated string from cache
+                        if (array_key_exists($string, $this->cache_translations))
+                                return $this->cache_translations[$string];
+                        else
+                                return $string;
+                } else {
+                        // Caching not enabled, try to find string
+                        $num = $this->find_string($string);
+                        if ($num == -1)
+                                return $string;
+                        else
+                                return $this->get_translation_string($num);
+                }
+        }
+
+        /**
+         * Get possible plural forms from MO header
+         *
+         * @access private
+         * @return string plural form header
+         */
+        function get_plural_forms() {
+                // lets assume message number 0 is header
+                // this is true, right?
+                $this->load_tables();
+
+                // cache header field for plural forms
+                if (! is_string($this->pluralheader)) {
+                        if ($this->enable_cache) {
+                                $header = $this->cache_translations[""];
+                        } else {
+                                $header = $this->get_translation_string(0);
+                        }
+                        $header .= "\n"; //make sure our regex matches
+                        if (eregi("plural-forms: ([^\n]*)\n", $header, $regs))
+                                $expr = $regs[1];
+                        else
+                                $expr = "nplurals=2; plural=n == 1 ? 0 : 1;";
+
+                        // add parentheses
+                         // important since PHP's ternary evaluates from left to right
+                         $expr.= ';';
+                         $res= '';
+                         $p= 0;
+                         for ($i= 0; $i < strlen($expr); $i++) {
+                                $ch= $expr[$i];
+                                switch ($ch) {
+                                        case '?':
+                                                $res.= ' ? (';
+                                                $p++;
+                                                break;
+                                        case ':':
+                                                $res.= ') : (';
+                                                break;
+                                        case ';':
+                                                $res.= str_repeat( ')', $p) . ';';
+                                                $p= 0;
+                                                break;
+                                        default:
+                                                $res.= $ch;
+                                }
+                        }
+                        $this->pluralheader = $res;
+                }
+
+                return $this->pluralheader;
+        }
+
+        /**
+         * Detects which plural form to take
+         *
+         * @access private
+         * @param n count
+         * @return int array index of the right plural form
+         */
+        function select_string($n) {
+                if (is_null($this->select_string_function)) {
+                        $string = $this->get_plural_forms();
+                        if (preg_match("/nplurals\s*=\s*(\d+)\s*\;\s*plural\s*=\s*(.*?)\;+/", $string, $matches)) {
+                                $nplurals = $matches[1];
+                                $expression = $matches[2];
+                                $expression = str_replace("n", '$n', $expression);
+                        } else {
+                                $nplurals = 2;
+                                $expression = ' $n == 1 ? 0 : 1 ';
+                        }
+                        $func_body = "
+                                \$plural = ($expression);
+                                return (\$plural <= $nplurals)? \$plural : \$plural - 1;";
+                        $this->select_string_function = create_function('$n', $func_body);
+                }
+                return call_user_func($this->select_string_function, $n);
+        }
+
+        /**
+         * Plural version of gettext
+         *
+         * @access public
+         * @param string single
+         * @param string plural
+         * @param string number
+         * @return translated plural form
+         */
+        function ngettext($single, $plural, $number) {
+                if ($this->short_circuit) {
+                        if ($number != 1)
+                                return $plural;
+                        else
+                                return $single;
+                }
+
+                // find out the appropriate form
+                $select = $this->select_string($number);
+
+                // this should contains all strings separated by NULLs
+                $key = $single.chr(0).$plural;
+
+
+                if ($this->enable_cache) {
+                        if (! array_key_exists($key, $this->cache_translations)) {
+                                return ($number != 1) ? $plural : $single;
+                        } else {
+                                $result = $this->cache_translations[$key];
+                                $list = explode(chr(0), $result);
+                                return $list[$select];
+                        }
+                } else {
+                        $num = $this->find_string($key);
+                        if ($num == -1) {
+                                return ($number != 1) ? $plural : $single;
+                        } else {
+                                $result = $this->get_translation_string($num);
+                                $list = explode(chr(0), $result);
+                                return $list[$select];
+                        }
+                }
+        }
+
+}
+
+?>
</ins><span class="cx">Property changes on: trunk/wp-includes/gettext.php
</span><span class="cx">___________________________________________________________________
</span><span class="cx">Name: svn:executable
</span><span class="cx"> + *
</span></span></pre></div>
<a id="trunkwpincludesmsdefaultfiltersphp"></a>
<div class="addfile"><h4>Added: trunk/wp-includes/ms-default-filters.php (0 => 12603)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/wp-includes/ms-default-filters.php         (rev 0)
+++ trunk/wp-includes/ms-default-filters.php        2010-01-06 04:02:57 UTC (rev 12603)
</span><span class="lines">@@ -0,0 +1,46 @@
</span><ins>+<?php
+// Users
+add_filter ( 'wpmu_validate_user_signup', 'signup_nonce_check' );
+add_action ( 'init', 'maybe_add_existing_user_to_blog' );
+add_filter ( 'xmlrpc_methods', 'attach_wpmu_xmlrpc' );
+add_filter ( 'wp_authenticate_user', 'wordpressmu_authenticate_siteadmin', 10, 2 );
+add_action ( 'wpmu_new_user', 'newuser_notify_siteadmin' );
+add_action ( 'wpmu_activate_user', 'add_new_user_to_blog', 10, 3 );
+add_action ( 'sanitize_user', 'strtolower_usernames', 10, 3 );
+
+// Blogs
+add_filter ( 'wpmu_validate_blog_signup', 'signup_nonce_check' );
+add_action ( 'wpmu_new_blog', 'wpmu_log_new_registrations', 10, 2 );
+add_action ( 'wpmu_new_blog', 'newblog_notify_siteadmin', 10, 2 );
+
+// Register Nonce
+add_action ( 'signup_hidden_fields', 'signup_nonce_fields' );
+
+// Locale
+add_filter ( 'locale', 'mu_locale' );
+
+// Template
+add_action ( 'template_redirect', 'maybe_redirect_404' );
+add_filter ( 'allowed_redirect_hosts', 'redirect_this_site' );
+
+// Administration
+add_filter ( 'mce_buttons_2', 'remove_tinymce_media_button' );
+add_filter ( 'term_id_filter', 'global_terms', 10, 2 );
+add_action ( 'publish_post', 'update_posts_count' );
+add_action ( 'delete_post', 'wpmu_update_blogs_date' );
+add_action ( 'private_to_published', 'wpmu_update_blogs_date' );
+add_action ( 'publish_phone', 'wpmu_update_blogs_date' );
+add_action ( 'publish_post', 'wpmu_update_blogs_date' );
+
+// Files
+add_filter ( 'wp_upload_bits', 'upload_is_file_too_big' );
+add_filter ( 'import_upload_size_limit', 'fix_import_form_size' );
+add_filter ( 'upload_mimes', 'check_upload_mimes' );
+add_filter ( 'upload_dir', 'fix_upload_details' );
+
+// Mail
+add_filter ( 'wp_mail_from', 'wordpressmu_wp_mail_from' );
+
+
+add_action( "phpmailer_init", "fix_phpmailer_messageid" );
+?>
</ins><span class="cx">Property changes on: trunk/wp-includes/ms-default-filters.php
</span><span class="cx">___________________________________________________________________
</span><span class="cx">Name: svn:executable
</span><span class="cx"> + *
</span></span></pre></div>
<a id="trunkwpincludesmsfunctionsphp"></a>
<div class="addfile"><h4>Added: trunk/wp-includes/ms-functions.php (0 => 12603)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/wp-includes/ms-functions.php         (rev 0)
+++ trunk/wp-includes/ms-functions.php        2010-01-06 04:02:57 UTC (rev 12603)
</span><span class="lines">@@ -0,0 +1,2407 @@
</span><ins>+<?php
+/*
+        Helper functions for WPMU
+*/
+function load_muplugin_textdomain($domain, $path = false) {
+        $locale = get_locale();
+        if ( empty($locale) )
+                $locale = 'en_US';
+
+        if ( false === $path )
+                $path = WPMU_PLUGIN_DIR;
+
+        $mofile = WPMU_PLUGIN_DIR . "/$domain-$locale.mo";
+        load_textdomain($domain, $mofile);
+}
+
+function wpmu_update_blogs_date() {
+        global $wpdb;
+
+        $wpdb->update( $wpdb->blogs, array('last_updated' => current_time('mysql', true)), array('blog_id' => $wpdb->blogid) );
+        refresh_blog_details( $wpdb->blogid );
+
+        do_action( 'wpmu_blog_updated', $wpdb->blogid );
+}
+
+function get_blogaddress_by_id( $blog_id ) {
+        $bloginfo = get_blog_details( (int) $blog_id, false ); // only get bare details!
+        return clean_url("http://" . $bloginfo->domain . $bloginfo->path);
+}
+
+function get_blogaddress_by_name( $blogname ) {
+        global $current_site;
+
+        if( defined( "VHOST" ) && constant( "VHOST" ) == 'yes' ) {
+                if( $blogname == 'main' )
+                        $blogname = 'www';
+                return clean_url( "http://" . $blogname . "." . $current_site->domain . $current_site->path );
+        } else {
+                return clean_url( "http://" . $current_site->domain . $current_site->path . $blogname . '/' );
+        }
+}
+
+function get_blogaddress_by_domain( $domain, $path ){
+        if( defined( "VHOST" ) && constant( "VHOST" ) == 'yes' ) {
+                $url = "http://".$domain.$path;
+        } else {
+                if( $domain != $_SERVER['HTTP_HOST'] ) {
+                        $blogname = substr( $domain, 0, strpos( $domain, '.' ) );
+                        if( $blogname != 'www.' ) {
+                                $url = 'http://' . substr( $domain, strpos( $domain, '.' ) + 1 ) . $path . $blogname . '/';
+                        } else { // we're installing the main blog
+                                $url = 'http://' . substr( $domain, strpos( $domain, '.' ) + 1 ) . $path;
+                        }
+                } else { // main blog
+                        $url = 'http://' . $domain . $path;
+                }
+        }
+        return clean_url($url);
+}
+
+function get_sitestats() {
+        global $wpdb;
+
+        $stats['blogs'] = get_blog_count();
+
+        $count_ts = get_site_option( "get_user_count_ts" );
+        if( time() - $count_ts > 3600 ) {
+                $count = $wpdb->get_var( "SELECT COUNT(ID) FROM {$wpdb->users}" );
+                update_site_option( "user_count", $count );
+                update_site_option( "user_count_ts", time() );
+        } else {
+                $count = get_site_option( "user_count" );
+        }
+        $stats['users'] = $count;
+        return $stats;
+}
+
+function get_admin_users_for_domain( $sitedomain = '', $path = '' ) {
+        global $wpdb;
+        
+        if( $sitedomain == '' ) {
+                $site_id = $wpdb->siteid;
+        } else {
+                $site_id = $wpdb->get_var( $wpdb->prepare("SELECT id FROM $wpdb->site WHERE domain = %s AND path = %s", $sitedomain, $path) );
+        }
+
+        if( $site_id != false ) {
+                return $wpdb->get_results( $wpdb->prepare("SELECT u.ID, u.user_login, u.user_pass FROM $wpdb->users AS u, $wpdb->sitemeta AS sm WHERE sm.meta_key = 'admin_user_id' AND u.ID = sm.meta_value AND sm.site_id = %d", $site_id), ARRAY_A );
+        }
+        return false;
+}
+
+function get_user_details( $username ) {
+        global $wpdb;
+        return $wpdb->get_row( $wpdb->prepare("SELECT * FROM $wpdb->users WHERE user_login = %s", $username) );
+}
+
+function is_main_blog() {
+        global $current_blog, $current_site;
+        if( $current_blog->domain == $current_site->domain && $current_blog->path == $current_site->path )
+                return true;
+        return false;
+}
+
+function get_id_from_blogname( $name ) {
+        global $wpdb, $current_site;
+        $blog_id = wp_cache_get( "get_id_from_blogname_" . $name, 'blog-details' );
+        if( $blog_id )
+                return $blog_id;
+
+        if( constant( 'VHOST' ) == 'yes' ) {
+                $domain = $name . '.' . $current_site->domain;
+                $path = $current_site->path;
+        } else {
+                $domain = $current_site->domain;
+                $path = $current_site->path . $name . '/';
+        }
+        $blog_id = $wpdb->get_var( $wpdb->prepare("SELECT blog_id FROM {$wpdb->blogs} WHERE domain = %s AND path = %s", $domain, $path) );
+        wp_cache_set( 'get_id_from_blogname_' . $name, $blog_id, 'blog-details' );
+        return $blog_id;
+}
+
+function get_blog_details( $id, $getall = true ) {
+        global $wpdb;
+
+        if( !is_numeric( $id ) ) {
+                $id = get_id_from_blogname( $id );
+        }
+        $all = $getall == true ? '' : 'short';
+        $details = wp_cache_get( $id . $all, 'blog-details' );
+
+        if ( $details ) {
+                if ( $details == -1 )
+                        return false;
+                elseif ( !is_object($details) ) // Clear old pre-serialized objects. Cache clients do better with that.
+                        wp_cache_delete( $id . $all, 'blog-details' );
+                else
+                        return $details;
+        }
+
+        $details = $wpdb->get_row( $wpdb->prepare("SELECT * FROM $wpdb->blogs WHERE blog_id = %d /* get_blog_details */", $id) );
+        if ( !$details ) {
+                wp_cache_set( $id . $all, -1, 'blog-details' );
+                return false;
+        }
+
+        if ( !$getall ) {
+                wp_cache_set( $id . $all, $details, 'blog-details' );
+                return $details;
+        }
+
+        $wpdb->suppress_errors();
+        switch_to_blog( $id );
+        $details->blogname = get_option( 'blogname' );
+        $details->siteurl = get_option( 'siteurl' );
+        $details->post_count = get_option( 'post_count' );
+        restore_current_blog();
+        $wpdb->suppress_errors( false );
+
+        $details = apply_filters('blog_details', $details);
+
+        wp_cache_set( $id . $all, $details, 'blog-details' );
+
+        $key = md5( $details->domain . $details->path );
+        wp_cache_set( $key, $details, 'blog-lookup' );
+
+        return $details;
+}
+
+function refresh_blog_details( $id ) {
+        $id = (int) $id;
+        $details = get_blog_details( $id, false );
+
+        wp_cache_delete( $id , 'blog-details' );
+        wp_cache_delete( $id . 'short' , 'blog-details' );
+        wp_cache_delete( md5( $details->domain . $details->path ) , 'blog-lookup' );
+        wp_cache_delete( 'current_blog_' . $details->domain, 'site-options' );
+        wp_cache_delete( 'current_blog_' . $details->domain . $details->path, 'site-options' );
+}
+
+function get_current_user_id() {
+        global $current_user;
+        return $current_user->ID;
+}
+
+function is_site_admin( $user_login = false ) {
+        global $current_user;
+
+        if ( !$current_user && !$user_login )
+                return false;
+
+        if ( $user_login ) {
+                $user_login = sanitize_user( $user_login );
+        } elseif( isset( $current_user->user_login ) ) {
+                $user_login = $current_user->user_login;
+        } else {
+                return false;
+        }
+
+        $site_admins = get_site_option( 'site_admins', array('admin') );
+        if( is_array( $site_admins ) && in_array( $user_login, $site_admins ) )
+                return true;
+
+        return false;
+}
+
+/**
+ * Retrieve option value based on setting name and blog_id.
+ *
+ * If the option does not exist or does not have a value, then the return value
+ * will be false. This is useful to check whether you need to install an option
+ * and is commonly used during installation of plugin options and to test
+ * whether upgrading is required.
+ *
+ * There is a filter called 'blog_option_$option' with the $option being
+ * replaced with the option name. The filter takes two parameters. $value and
+ * $blog_id. It returns $value.
+ * The 'option_$option' filter in get_option() is not called.
+ *
+ * @since NA
+ * @package WordPress MU
+ * @subpackage Option
+ * @uses apply_filters() Calls 'blog_option_$optionname' with the option name value.
+ *
+ * @param int $blog_id is the id of the blog.
+ * @param string $setting Name of option to retrieve. Should already be SQL-escaped
+ * @param string $default (optional) Default value returned if option not found.
+ * @return mixed Value set for the option.
+ */
+function get_blog_option( $blog_id, $setting, $default = false ) {
+        global $wpdb;
+
+        $key = $blog_id."-".$setting."-blog_option";
+        $value = wp_cache_get( $key, "site-options" );
+        if ( $value == null ) {
+                $blog_prefix = $wpdb->get_blog_prefix( $blog_id );
+                $row = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$blog_prefix}options WHERE option_name = %s", $setting ) );
+                if ( is_object( $row ) ) { // Has to be get_row instead of get_var because of funkiness with 0, false, null values
+                        $value = $row->option_value;
+                        if ( $value == false ) {
+                                wp_cache_set( $key, 'falsevalue', 'site-options' );
+                        } else {
+                                wp_cache_set( $key, $value, 'site-options' );
+                        }
+                } else { // option does not exist, so we must cache its non-existence
+                        wp_cache_set( $key, 'noop', 'site-options' );
+                        $value = $default;
+                }
+        } elseif( $value == 'noop' ) {
+                $value = $default;
+        } elseif( $value == 'falsevalue' ) {
+                $value = false;
+        }
+        // If home is not set use siteurl.
+        if ( 'home' == $setting && '' == $value )
+                return get_blog_option( $blog_id, 'siteurl' );
+
+        if ( 'siteurl' == $setting || 'home' == $setting || 'category_base' == $setting )
+                $value = preg_replace( '|/+$|', '', $value );
+
+        if (! @unserialize( $value ) )
+                $value = stripslashes( $value );
+
+        return apply_filters( 'blog_option_' . $setting, maybe_unserialize( $value ), $blog_id );
+}
+
+function add_blog_option( $id, $key, $value ) {
+        $id = (int) $id;
+        
+        switch_to_blog($id);
+        add_option( $key, $value );
+        restore_current_blog();
+        wp_cache_set( $id."-".$key."-blog_option", $value, 'site-options' );
+}
+
+function delete_blog_option( $id, $key ) {
+        $id = (int) $id;
+        
+        switch_to_blog($id);
+        delete_option( $key );
+        restore_current_blog();
+        wp_cache_set( $id."-".$key."-blog_option", '', 'site-options' );
+}
+
+function update_blog_option( $id, $key, $value, $refresh = true ) {
+        $id = (int) $id;
+        
+        switch_to_blog($id);
+        update_option( $key, $value );
+        restore_current_blog();
+
+        if( $refresh == true )
+                refresh_blog_details( $id );
+        wp_cache_set( $id."-".$key."-blog_option", $value, 'site-options');
+}
+
+function switch_to_blog( $new_blog ) {
+        global $wpdb, $table_prefix, $blog_id, $switched, $switched_stack, $wp_roles, $current_user, $wp_object_cache;
+
+        if ( empty($new_blog) )
+                $new_blog = $blog_id;
+
+        if ( empty($switched_stack) )
+                $switched_stack = array();
+
+        $switched_stack[] = $blog_id;
+
+        /* If we're switching to the same blog id that we're on,
+        * set the right vars, do the associated actions, but skip
+        * the extra unnecessary work */
+        if ( $blog_id == $new_blog ) {
+                do_action( 'switch_blog', $blog_id, $blog_id );
+                $switched = true;
+                return true;
+        }
+
+        $wpdb->set_blog_id($new_blog);
+        $table_prefix = $wpdb->prefix;
+        $prev_blog_id = $blog_id;
+        $blog_id = $new_blog;
+
+        if( is_object( $wp_roles ) ) {
+                $wpdb->suppress_errors();
+                if ( method_exists( $wp_roles ,'_init' ) ) {
+                        $wp_roles->_init();
+                } elseif( method_exists( $wp_roles, '__construct' ) ) {
+                        $wp_roles->__construct();
+                }
+                $wpdb->suppress_errors( false );
+        }
+
+        if ( is_object( $current_user ) )
+                $current_user->_init_caps();
+
+        if ( is_object( $wp_object_cache ) ) {
+                $global_groups = $wp_object_cache->global_groups;
+        } else {
+                $global_groups = false;
+        }
+        wp_cache_init();
+        if ( function_exists('wp_cache_add_global_groups') ) {
+                if ( is_array( $global_groups ) ) {
+                        wp_cache_add_global_groups( $global_groups );
+                } else {
+                        wp_cache_add_global_groups( array( 'users', 'userlogins', 'usermeta', 'site-options', 'site-lookup', 'blog-lookup', 'blog-details', 'rss', 'site-transient', 'global-posts' ) );
+                }
+                wp_cache_add_non_persistent_groups(array( 'comment', 'counts', 'plugins' ));
+        }
+
+        do_action('switch_blog', $blog_id, $prev_blog_id);
+        $switched = true;
+        return true;
+}
+
+function restore_current_blog() {
+        global $table_prefix, $wpdb, $blog_id, $switched, $switched_stack, $wp_roles, $current_user, $wp_object_cache;
+
+        if ( !$switched )
+                return false;
+
+        if ( !is_array( $switched_stack ) )
+                return false;
+
+        $blog = array_pop( $switched_stack );
+        if ( $blog_id == $blog ) {
+                do_action( 'switch_blog', $blog, $blog );
+                /* If we still have items in the switched stack, consider ourselves still 'switched' */
+                $switched = ( is_array( $switched_stack ) && count( $switched_stack ) > 0 );
+                return true;
+        }
+
+        $wpdb->set_blog_id($blog);
+        $prev_blog_id = $blog_id;
+        $blog_id = $blog;
+        $table_prefix = $wpdb->prefix;
+
+        if( is_object( $wp_roles ) ) {
+                $wpdb->suppress_errors();
+                if ( method_exists( $wp_roles ,'_init' ) ) {
+                        $wp_roles->_init();
+                } elseif( method_exists( $wp_roles, '__construct' ) ) {
+                        $wp_roles->__construct();
+                }
+                $wpdb->suppress_errors( false );
+        }
+
+        if ( is_object( $current_user ) )
+                $current_user->_init_caps();
+
+        if ( is_object( $wp_object_cache ) ) {
+                $global_groups = $wp_object_cache->global_groups;
+        } else {
+                $global_groups = false;
+        }
+        wp_cache_init();
+        if ( function_exists('wp_cache_add_global_groups') ) {
+                if ( is_array( $global_groups ) ) {
+                        wp_cache_add_global_groups( $global_groups );
+                } else {
+                        wp_cache_add_global_groups( array( 'users', 'userlogins', 'usermeta', 'site-options', 'site-lookup', 'blog-lookup', 'blog-details', 'rss', 'site-transient' ) );
+                }
+                wp_cache_add_non_persistent_groups(array( 'comment', 'counts', 'plugins' ));
+        }
+
+        do_action('switch_blog', $blog_id, $prev_blog_id);
+
+        /* If we still have items in the switched stack, consider ourselves still 'switched' */
+        $switched = ( is_array( $switched_stack ) && count( $switched_stack ) > 0 );
+        return true;
+}
+
+function get_blogs_of_user( $id, $all = false ) {
+        global $wpdb;
+
+        $cache_suffix = $all ? '_all' : '_short';
+        $return = wp_cache_get( 'blogs_of_user_' . $id . $cache_suffix, 'users' );
+        if ( $return ) {
+                return apply_filters( 'get_blogs_of_user', $return, $id, $all );
+        }
+
+        $user = get_userdata( (int) $id );
+        if ( !$user )
+                return false;
+
+        $blogs = $match = array();
+        foreach ( (array) $user as $key => $value ) {
+                if ( false !== strpos( $key, '_capabilities') && 0 === strpos( $key, $wpdb->base_prefix ) && preg_match( '/' . $wpdb->base_prefix . '(\d+)_capabilities/', $key, $match ) ) {
+                        $blog = get_blog_details( $match[1] );
+                        if ( $blog && isset( $blog->domain ) && ( $all == true || $all == false && ( $blog->archived == 0 && $blog->spam == 0 && $blog->deleted == 0 ) ) ) {
+                                $blogs[$match[1]]->userblog_id = $match[1];
+                                $blogs[$match[1]]->blogname = $blog->blogname;
+                                $blogs[$match[1]]->domain = $blog->domain;
+                                $blogs[$match[1]]->path = $blog->path;
+                                $blogs[$match[1]]->site_id = $blog->site_id;
+                                $blogs[$match[1]]->siteurl = $blog->siteurl;
+                        }
+                }
+        }
+
+        wp_cache_add( 'blogs_of_user_' . $id . $cache_suffix, $blogs, 'users', 5 );
+        return apply_filters( 'get_blogs_of_user', $blogs, $id, $all );
+}
+
+function get_active_blog_for_user( $user_id ) { // get an active blog for user - either primary blog or from blogs list
+        global $wpdb;
+        $blogs = get_blogs_of_user( $user_id );
+        if ( empty( $blogs ) ) {
+                $details = get_dashboard_blog();
+                add_user_to_blog( $details->blog_id, $user_id, 'subscriber' );
+                update_usermeta( $user_id, 'primary_blog', $details->blog_id );
+                wp_cache_delete( $user_id, 'users' );
+                return $details;
+        }
+
+        $primary_blog = get_usermeta( $user_id, "primary_blog" );
+        $details = get_dashboard_blog();
+        if ( $primary_blog ) {
+                $blogs = get_blogs_of_user( $user_id );
+                if ( isset( $blogs[ $primary_blog ] ) == false ) {
+                        add_user_to_blog( $details->blog_id, $user_id, 'subscriber' );
+                        update_usermeta( $user_id, 'primary_blog', $details->blog_id );
+                        wp_cache_delete( $user_id, 'users' );
+                } else {
+                        $details = get_blog_details( $primary_blog );
+                }
+        } else {
+                add_user_to_blog( $details->blog_id, $user_id, 'subscriber' ); // Add subscriber permission for dashboard blog
+                update_usermeta( $user_id, 'primary_blog', $details->blog_id );
+        }
+
+        if ( ( is_object( $details ) == false ) || ( is_object( $details ) && $details->archived == 1 || $details->spam == 1 || $details->deleted == 1 ) ) {
+                $blogs = get_blogs_of_user( $user_id, true ); // if a user's primary blog is shut down, check their other blogs.
+                $ret = false;
+                if ( is_array( $blogs ) && count( $blogs ) > 0 ) {
+                        foreach( (array) $blogs as $blog_id => $blog ) {
+                                if ( $blog->site_id != $wpdb->siteid )
+                                        continue;
+                                $details = get_blog_details( $blog_id );
+                                if ( is_object( $details ) && $details->archived == 0 && $details->spam == 0 && $details->deleted == 0 ) {
+                                        $ret = $blog;
+                                        $changed = false;
+                                        if ( get_usermeta( $user_id , 'primary_blog' ) != $blog_id ) {
+                                                update_usermeta( $user_id, 'primary_blog', $blog_id );
+                                                $changed = true;
+                                        }
+                                        if ( !get_usermeta($user_id , 'source_domain') ) {
+                                                update_usermeta( $user_id, 'source_domain', $blog->domain );
+                                                $changed = true;
+                                        }
+                                        if ( $changed )
+                                                wp_cache_delete( $user_id, 'users' );
+                                        break;
+                                }
+                        }
+                } else {
+                        // Should never get here
+                        $dashboard_blog = get_dashboard_blog();
+                        add_user_to_blog( $dashboard_blog->blog_id, $user_id, 'subscriber' ); // Add subscriber permission for dashboard blog
+                        update_usermeta( $user_id, 'primary_blog', $dashboard_blog->blog_id );
+                        return $dashboard_blog;
+                }
+                return $ret;
+        } else {
+                return $details;
+        }
+}
+
+function is_user_member_of_blog( $user_id, $blog_id = 0 ) {
+        $user_id = (int) $user_id;
+        $blog_id = (int) $blog_id;
+        
+        if( $blog_id == 0 ) {
+                global $wpdb;
+                $blog_id = $wpdb->blogid;
+        }
+        
+        $blogs = get_blogs_of_user( $user_id );
+        if( is_array( $blogs ) ) {
+                return array_key_exists( $blog_id, $blogs );
+        } else {
+                return false;
+        }
+}
+
+function is_archived( $id ) {
+        return get_blog_status($id, 'archived');
+}
+
+function update_archived( $id, $archived ) {
+        update_blog_status($id, 'archived', $archived);
+        return $archived;
+}
+
+function update_blog_status( $id, $pref, $value, $refresh = 1 ) {
+        global $wpdb;
+
+        if ( !in_array( $pref, array( 'site_id', 'domain', 'path', 'registered', 'last_updated', 'public', 'archived', 'mature', 'spam', 'deleted', 'lang_id') ) )
+                return $value;
+
+        $wpdb->update( $wpdb->blogs, array($pref => $value, 'last_updated' => current_time('mysql', true)), array('blog_id' => $id) );
+        if( $refresh == 1 )
+                refresh_blog_details($id);
+
+        if( $pref == 'spam' ) {
+                if( $value == 1 ) {
+                        do_action( "make_spam_blog", $id );
+                } else {
+                        do_action( "make_ham_blog", $id );
+                }
+        }
+
+        return $value;
+}
+
+function get_blog_status( $id, $pref ) {
+        global $wpdb;
+
+        $details = get_blog_details( $id, false );
+        if( $details ) {
+                return $details->$pref;
+        }
+        return $wpdb->get_var( $wpdb->prepare("SELECT $pref FROM {$wpdb->blogs} WHERE blog_id = %d", $id) );
+}
+
+function get_last_updated( $deprecated = '', $start = 0, $quantity = 40 ) {
+        global $wpdb;
+        return $wpdb->get_results( $wpdb->prepare("SELECT blog_id, domain, path FROM $wpdb->blogs WHERE site_id = %d AND public = '1' AND archived = '0' AND mature = '0' AND spam = '0' AND deleted = '0' AND last_updated != '0000-00-00 00:00:00' ORDER BY last_updated DESC limit %d, %d", $wpdb->siteid, $start, $quantity ) , ARRAY_A );
+}
+
+function get_most_active_blogs( $num = 10, $display = true ) {
+        $most_active = get_site_option( "most_active" );
+        $update = false;
+        if( is_array( $most_active ) ) {
+                if( ( $most_active['time'] + 60 ) < time() ) { // cache for 60 seconds.
+                        $update = true;
+                }
+        } else {
+                $update = true;
+        }
+
+        if( $update == true ) {
+                unset( $most_active );
+                $blogs = get_blog_list( 0, 'all', false ); // $blog_id -> $details
+                if( is_array( $blogs ) ) {
+                        reset( $blogs );
+                        foreach ( (array) $blogs as $key => $details ) {
+                                $most_active[ $details['blog_id'] ] = $details['postcount'];
+                                $blog_list[ $details['blog_id'] ] = $details; // array_slice() removes keys!!
+                        }
+                        arsort( $most_active );
+                        reset( $most_active );
+                        foreach ( (array) $most_active as $key => $details ) {
+                                $t[ $key ] = $blog_list[ $key ];
+                        }
+                        unset( $most_active );
+                        $most_active = $t;
+                }
+                update_site_option( "most_active", $most_active );
+        }
+
+        if( $display == true ) {
+                if( is_array( $most_active ) ) {
+                        reset( $most_active );
+                        foreach ( (array) $most_active as $key => $details ) {
+                                $url = clean_url("http://" . $details['domain'] . $details['path']);
+                                echo "<li>" . $details['postcount'] . " <a href='$url'>$url</a></li>";
+                        }
+                }
+        }
+        return array_slice( $most_active, 0, $num );
+}
+
+function get_blog_list( $start = 0, $num = 10, $deprecated = '' ) {
+        global $wpdb;
+
+        $blogs = get_site_option( "blog_list" );
+        $update = false;
+        if( is_array( $blogs ) ) {
+                if( ( $blogs['time'] + 60 ) < time() ) { // cache for 60 seconds.
+                        $update = true;
+                }
+        } else {
+                $update = true;
+        }
+
+        if( $update == true ) {
+                unset( $blogs );
+                $blogs = $wpdb->get_results( $wpdb->prepare("SELECT blog_id, domain, path FROM $wpdb->blogs WHERE site_id = %d AND public = '1' AND archived = '0' AND mature = '0' AND spam = '0' AND deleted = '0' ORDER BY registered DESC", $wpdb->siteid), ARRAY_A );
+
+                foreach ( (array) $blogs as $details ) {
+                        $blog_list[ $details['blog_id'] ] = $details;
+                        $blog_list[ $details['blog_id'] ]['postcount'] = $wpdb->get_var( "SELECT COUNT(ID) FROM " . $wpdb->base_prefix . $details['blog_id'] . "_posts WHERE post_status='publish' AND post_type='post'" );
+                }
+                unset( $blogs );
+                $blogs = $blog_list;
+                update_site_option( "blog_list", $blogs );
+        }
+
+        if( false == is_array( $blogs ) )
+                return array();
+
+        if( $num == 'all' ) {
+                return array_slice( $blogs, $start, count( $blogs ) );
+        } else {
+                return array_slice( $blogs, $start, $num );
+        }
+}
+
+function get_user_count() {
+        global $wpdb;
+
+        $count_ts = get_site_option( "user_count_ts" );
+        if( time() - $count_ts > 3600 ) {
+                $count = $wpdb->get_var( $wpdb->prepare("SELECT COUNT(ID) as c FROM $wpdb->users WHERE spam = '0' AND deleted = '0'") );
+                update_site_option( "user_count", $count );
+                update_site_option( "user_count_ts", time() );
+        }
+
+        $count = get_site_option( "user_count" );
+
+        return $count;
+}
+
+function get_blog_count( $id = 0 ) {
+        global $wpdb;
+
+        if( $id == 0 )
+                $id = $wpdb->siteid;
+
+        $count_ts = get_site_option( "blog_count_ts" );
+        if( time() - $count_ts > 3600 ) {
+                $count = $wpdb->get_var( $wpdb->prepare("SELECT COUNT(blog_id) as c FROM $wpdb->blogs WHERE site_id = %d AND spam = '0' AND deleted = '0' and archived = '0'", $id) );
+                update_site_option( "blog_count", $count );
+                update_site_option( "blog_count_ts", time() );
+        }
+
+        $count = get_site_option( "blog_count" );
+
+        return $count;
+}
+
+function get_blog_post( $blog_id, $post_id ) {
+        global $wpdb;
+
+        $key = $blog_id . "-" . $post_id;
+        $post = wp_cache_get( $key, "global-posts" );
+        if( $post == false ) {
+                $post = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM " . $wpdb->get_blog_prefix( $blog_id ) . "posts WHERE ID = %d", $post_id ) );
+                wp_cache_add( $key, $post, "global-posts" );
+        }
+
+        return $post;
+}
+
+function clear_global_post_cache( $post_id ) {
+        global $wpdb;
+
+        wp_cache_delete( $wpdb->blogid . '-' . $post_id, 'global-posts' );
+}
+add_action( 'publish_post', 'clear_global_post_cache' );
+add_action( 'delete_post', 'clear_global_post_cache' );
+
+function add_user_to_blog( $blog_id, $user_id, $role ) {
+        switch_to_blog($blog_id);
+
+        $user = new WP_User($user_id);
+
+        if ( empty($user) )
+                return new WP_Error('user_does_not_exist', __('That user does not exist.'));
+
+        if ( !get_usermeta($user_id, 'primary_blog') ) {
+                update_usermeta($user_id, 'primary_blog', $blog_id);
+                $details = get_blog_details($blog_id);
+                update_usermeta($user_id, 'source_domain', $details->domain);
+        }
+
+        $user->set_role($role);
+
+        do_action('add_user_to_blog', $user_id, $role, $blog_id);
+        wp_cache_delete( $user_id, 'users' );
+        restore_current_blog();
+        return true;
+}
+
+function remove_user_from_blog($user_id, $blog_id = '', $reassign = '') {
+        global $wpdb;
+        switch_to_blog($blog_id);
+        $user_id = (int) $user_id;
+        do_action('remove_user_from_blog', $user_id, $blog_id);
+
+        // If being removed from the primary blog, set a new primary if the user is assigned
+        // to multiple blogs.
+        $primary_blog = get_usermeta($user_id, 'primary_blog');
+        if ( $primary_blog == $blog_id ) {
+                $new_id = '';
+                $new_domain = '';
+                $blogs = get_blogs_of_user($user_id);
+                foreach ( (array) $blogs as $blog ) {
+                        if ( $blog->userblog_id == $blog_id )
+                                continue;
+                        $new_id = $blog->userblog_id;
+                        $new_domain = $blog->domain;
+                        break;
+                }
+
+                update_usermeta($user_id, 'primary_blog', $new_id);
+                update_usermeta($user_id, 'source_domain', $new_domain);
+        }
+
+        // wp_revoke_user($user_id);
+        $user = new WP_User($user_id);
+        $user->remove_all_caps();
+
+        $blogs = get_blogs_of_user($user_id);
+        if ( count($blogs) == 0 ) {
+                update_usermeta($user_id, 'primary_blog', '');
+                update_usermeta($user_id, 'source_domain', '');
+        }
+
+        if( $reassign != '' ) {
+                $reassign = (int) $reassign;
+                $wpdb->query( $wpdb->prepare("UPDATE $wpdb->posts SET post_author = %d WHERE post_author = %d", $reassign, $user_id) );
+                $wpdb->query( $wpdb->prepare("UPDATE $wpdb->links SET link_owner = %d WHERE link_owner = %d", $reassign, $user_id) );
+        }
+
+        restore_current_blog();
+}
+
+function create_empty_blog( $domain, $path, $weblog_title, $site_id = 1 ) {
+        $domain = addslashes( $domain );
+        $weblog_title = addslashes( $weblog_title );
+
+        if( empty($path) )
+                $path = '/';
+
+        // Check if the domain has been used already. We should return an error message.
+        if ( domain_exists($domain, $path, $site_id) )
+                return __('error: Blog URL already taken.');
+
+        // Need to backup wpdb table names, and create a new wp_blogs entry for new blog.
+        // Need to get blog_id from wp_blogs, and create new table names.
+        // Must restore table names at the end of function.
+
+        if ( ! $blog_id = insert_blog($domain, $path, $site_id) )
+                return __('error: problem creating blog entry');
+
+        switch_to_blog($blog_id);
+        install_blog($blog_id);
+        restore_current_blog();
+
+        return $blog_id;
+}
+
+function get_blog_permalink( $_blog_id, $post_id ) {
+        $key = "{$_blog_id}-{$post_id}-blog_permalink";
+        $link = wp_cache_get( $key, 'site-options' );
+        if( $link == false ) {
+                switch_to_blog( $_blog_id );
+                $link = get_permalink( $post_id );
+                restore_current_blog();
+                wp_cache_add( $key, $link, 'site-options', 360 );
+        }
+        return $link;
+}
+
+function get_blog_id_from_url( $domain, $path = '/' ) {
+        global $wpdb;
+
+        $domain = strtolower( $wpdb->escape( $domain ) );
+        $path = strtolower( $wpdb->escape( $path ) );
+        $id = wp_cache_get( md5( $domain . $path ), 'blog-id-cache' );
+
+        if( $id == -1 ) { // blog does not exist
+                return 0;
+        } elseif( $id ) {
+                return (int)$id;
+        }
+
+        $id = $wpdb->get_var( "SELECT blog_id FROM $wpdb->blogs WHERE domain = '$domain' and path = '$path' /* get_blog_id_from_url */" );
+
+        if ( !$id ) {
+                wp_cache_set( md5( $domain . $path ), -1, 'blog-id-cache' );
+                return false;
+        }
+        wp_cache_set( md5( $domain . $path ), $id, 'blog-id-cache' );
+
+        return $id;
+}
+
+// wpmu admin functions
+
+function wpmu_admin_do_redirect( $url = '' ) {
+        $ref = '';
+        if ( isset( $_GET['ref'] ) )
+                $ref = $_GET['ref'];
+        if ( isset( $_POST['ref'] ) )
+                $ref = $_POST['ref'];
+
+        if( $ref ) {
+                $ref = wpmu_admin_redirect_add_updated_param( $ref );
+                wp_redirect( $ref );
+                exit();
+        }
+        if( empty( $_SERVER['HTTP_REFERER'] ) == false ) {
+                wp_redirect( $_SERVER['HTTP_REFERER'] );
+                exit();
+        }
+
+        $url = wpmu_admin_redirect_add_updated_param( $url );
+        if( isset( $_GET['redirect'] ) ) {
+                if( substr( $_GET['redirect'], 0, 2 ) == 's_' ) {
+                        $url .= "&action=blogs&s=". wp_specialchars( substr( $_GET['redirect'], 2 ) );
+                }
+        } elseif( isset( $_POST['redirect'] ) ) {
+                $url = wpmu_admin_redirect_add_updated_param( $_POST['redirect'] );
+        }
+        wp_redirect( $url );
+        exit();
+}
+
+function wpmu_admin_redirect_add_updated_param( $url = '' ) {
+        if( strpos( $url, 'updated=true' ) === false ) {
+                if( strpos( $url, '?' ) === false ) {
+                        return $url . '?updated=true';
+                } else {
+                        return $url . '&updated=true';
+                }
+        }
+        return $url;
+}
+
+function is_blog_user( $blog_id = 0 ) {
+        global $current_user, $wpdb;
+
+        if ( !$blog_id )
+                $blog_id = $wpdb->blogid;
+
+        $cap_key = $wpdb->base_prefix . $blog_id . '_capabilities';
+
+        if ( is_array($current_user->$cap_key) && in_array(1, $current_user->$cap_key) )
+                return true;
+
+        return false;
+}
+
+function validate_email( $email, $check_domain = true) {
+ if (ereg('^[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+'.'@'.
+ '[-!#$%&\'*+\\/0-9=?A-Z^_`a-z{|}~]+\.'.
+ '[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+$', $email))
+ {
+ if ($check_domain && function_exists('checkdnsrr')) {
+ list (, $domain) = explode('@', $email);
+
+ if (checkdnsrr($domain.'.', 'MX') || checkdnsrr($domain.'.', 'A')) {
+ return true;
+ }
+ return false;
+ }
+ return true;
+ }
+ return false;
+}
+
+function is_email_address_unsafe( $user_email ) {
+        $banned_names = get_site_option( "banned_email_domains" );
+        if ($banned_names && !is_array( $banned_names )) {
+                $banned_names = explode( "\n", $banned_names);
+        }
+        if ( is_array( $banned_names ) && empty( $banned_names ) == false ) {
+                $email_domain = strtolower( substr( $user_email, 1 + strpos( $user_email, '@' ) ) );
+                foreach( (array) $banned_names as $banned_domain ) {
+                        if( $banned_domain == '' )
+                                continue;
+                        if (
+                                strstr( $email_domain, $banned_domain ) ||
+                                (
+                                        strstr( $banned_domain, '/' ) &&
+                                        preg_match( $banned_domain, $email_domain )
+                                )
+                        )
+                        return true;
+                }
+        }
+        return false;
+}
+
+function wpmu_validate_user_signup($user_name, $user_email) {
+        global $wpdb;
+
+        $errors = new WP_Error();
+
+        $user_name = preg_replace( "/\s+/", '', sanitize_user( $user_name, true ) );
+        $user_email = sanitize_email( $user_email );
+
+        if ( empty( $user_name ) )
+                 $errors->add('user_name', __("Please enter a username"));
+
+        $maybe = array();
+        preg_match( "/[a-z0-9]+/", $user_name, $maybe );
+
+        if( $user_name != $maybe[0] ) {
+         $errors->add('user_name', __("Only lowercase letters and numbers allowed"));
+        }
+
+        $illegal_names = get_site_option( "illegal_names" );
+        if( is_array( $illegal_names ) == false ) {
+                $illegal_names = array( "www", "web", "root", "admin", "main", "invite", "administrator" );
+                add_site_option( "illegal_names", $illegal_names );
+        }
+        if( in_array( $user_name, $illegal_names ) == true ) {
+         $errors->add('user_name', __("That username is not allowed"));
+        }
+
+        if( is_email_address_unsafe( $user_email ) )
+                $errors->add('user_email', __("You cannot use that email address to signup. We are having problems with them blocking some of our email. Please use another email provider."));
+
+        if( strlen( $user_name ) < 4 ) {
+         $errors->add('user_name', __("Username must be at least 4 characters"));
+        }
+
+        if ( strpos( " " . $user_name, "_" ) != false )
+                $errors->add('user_name', __("Sorry, usernames may not contain the character '_'!"));
+
+        // all numeric?
+        $match = array();
+        preg_match( '/[0-9]*/', $user_name, $match );
+        if ( $match[0] == $user_name )
+                $errors->add('user_name', __("Sorry, usernames must have letters too!"));
+
+        if ( !is_email( $user_email ) )
+         $errors->add('user_email', __("Please enter a correct email address"));
+
+        if ( !validate_email( $user_email ) )
+                $errors->add('user_email', __("Please check your email address."));
+
+        $limited_email_domains = get_site_option( 'limited_email_domains' );
+        if ( is_array( $limited_email_domains ) && empty( $limited_email_domains ) == false ) {
+                $emaildomain = substr( $user_email, 1 + strpos( $user_email, '@' ) );
+                if( in_array( $emaildomain, $limited_email_domains ) == false ) {
+                        $errors->add('user_email', __("Sorry, that email address is not allowed!"));
+                }
+        }
+
+        // Check if the username has been used already.
+        if ( username_exists($user_name) )
+                $errors->add('user_name', __("Sorry, that username already exists!"));
+
+        // Check if the email address has been used already.
+        if ( email_exists($user_email) )
+                $errors->add('user_email', __("Sorry, that email address is already used!"));
+
+        // Has someone already signed up for this username?
+        $signup = $wpdb->get_row( $wpdb->prepare("SELECT * FROM $wpdb->signups WHERE user_login = %s", $user_name) );
+        if ( $signup != null ) {
+                $registered_at = mysql2date('U', $signup->registered);
+                $now = current_time( 'timestamp', true );
+                $diff = $now - $registered_at;
+                // If registered more than two days ago, cancel registration and let this signup go through.
+                if ( $diff > 172800 ) {
+                        $wpdb->query( $wpdb->prepare("DELETE FROM $wpdb->signups WHERE user_login = %s", $user_name) );
+                } else {
+                        $errors->add('user_name', __("That username is currently reserved but may be available in a couple of days."));
+                }
+                if( $signup->active == 0 && $signup->user_email == $user_email )
+                        $errors->add('user_email_used', __("username and email used"));
+        }
+
+        $signup = $wpdb->get_row( $wpdb->prepare("SELECT * FROM $wpdb->signups WHERE user_email = %s", $user_email) );
+        if ( $signup != null ) {
+                $diff = current_time( 'timestamp', true ) - mysql2date('U', $signup->registered);
+                // If registered more than two days ago, cancel registration and let this signup go through.
+                if ( $diff > 172800 ) {
+                        $wpdb->query( $wpdb->prepare("DELETE FROM $wpdb->signups WHERE user_email = %s", $user_email) );
+                } else {
+                        $errors->add('user_email', __("That email address has already been used. Please check your inbox for an activation email. It will become available in a couple of days if you do nothing."));
+                }
+        }
+
+        $result = array('user_name' => $user_name, 'user_email' => $user_email,        'errors' => $errors);
+
+        return apply_filters('wpmu_validate_user_signup', $result);
+}
+
+function wpmu_validate_blog_signup($blogname, $blog_title, $user = '') {
+        global $wpdb, $domain, $base, $current_site;
+
+        $blogname = preg_replace( "/\s+/", '', sanitize_user( $blogname, true ) );
+        $blog_title = strip_tags( $blog_title );
+        $blog_title = substr( $blog_title, 0, 50 );
+
+        $errors = new WP_Error();
+        $illegal_names = get_site_option( "illegal_names" );
+        if( $illegal_names == false ) {
+         $illegal_names = array( "www", "web", "root", "admin", "main", "invite", "administrator" );
+         add_site_option( "illegal_names", $illegal_names );
+        }
+
+        if ( empty( $blogname ) )
+         $errors->add('blogname', __("Please enter a blog name"));
+
+        $maybe = array();
+        preg_match( "/[a-z0-9]+/", $blogname, $maybe );
+        if( $blogname != $maybe[0] ) {
+         $errors->add('blogname', __("Only lowercase letters and numbers allowed"));
+        }
+        if( in_array( $blogname, $illegal_names ) == true ) {
+         $errors->add('blogname', __("That name is not allowed"));
+        }
+        if( strlen( $blogname ) < 4 && !is_site_admin() ) {
+         $errors->add('blogname', __("Blog name must be at least 4 characters"));
+        }
+
+        if ( strpos( " " . $blogname, "_" ) != false )
+                $errors->add('blogname', __("Sorry, blog names may not contain the character '_'!"));
+
+        // do not allow users to create a blog that conflicts with a page on the main blog.
+        if ( constant( "VHOST" ) == 'no' && $wpdb->get_var( $wpdb->prepare( "SELECT post_name FROM " . $wpdb->get_blog_prefix( $current_site->blog_id ) . "posts WHERE post_type = 'page' AND post_name = %s", $blogname ) ) ) {
+                $errors->add( 'blogname', __( "Sorry, you may not use that blog name" ) );
+        }
+
+        // all numeric?
+        $match = array();
+        preg_match( '/[0-9]*/', $blogname, $match );
+        if ( $match[0] == $blogname )
+                $errors->add('blogname', __("Sorry, blog names must have letters too!"));
+
+        $blogname = apply_filters( "newblogname", $blogname );
+
+        $blog_title = stripslashes( $blog_title );
+
+        if ( empty( $blog_title ) )
+         $errors->add('blog_title', __("Please enter a blog title"));
+
+        // Check if the domain/path has been used already.
+        if( constant( "VHOST" ) == 'yes' ) {
+                $mydomain = "$blogname.$domain";
+                $path = $base;
+        } else {
+                $mydomain = "$domain";
+                $path = $base.$blogname.'/';
+        }
+        if ( domain_exists($mydomain, $path) )
+                $errors->add('blogname', __("Sorry, that blog already exists!"));
+
+        if ( username_exists( $blogname ) ) {
+                if ( is_object( $user ) == false || ( is_object($user) && ( $user->user_login != $blogname ) ) )
+                        $errors->add( 'blogname', __( "Sorry, that blog is reserved!" ) );
+        }
+
+        // Has someone already signed up for this domain?
+        $signup = $wpdb->get_row( $wpdb->prepare("SELECT * FROM $wpdb->signups WHERE domain = %s AND path = %s", $mydomain, $path) ); // TODO: Check email too?
+        if ( ! empty($signup) ) {
+                $diff = current_time( 'timestamp', true ) - mysql2date('U', $signup->registered);
+                // If registered more than two days ago, cancel registration and let this signup go through.
+                if ( $diff > 172800 ) {
+                        $wpdb->query( $wpdb->prepare("DELETE FROM $wpdb->signups WHERE domain = %s AND path = %s", $mydomain, $path) );
+                } else {
+                        $errors->add('blogname', __("That blog is currently reserved but may be available in a couple days."));
+                }
+        }
+
+        $result = array('domain' => $mydomain, 'path' => $path, 'blogname' => $blogname, 'blog_title' => $blog_title, 'errors' => $errors);
+        return apply_filters('wpmu_validate_blog_signup', $result);
+}
+
+// Record signup information for future activation. wpmu_validate_signup() should be run
+// on the inputs before calling wpmu_signup().
+function wpmu_signup_blog($domain, $path, $title, $user, $user_email, $meta = '') {
+        global $wpdb;
+
+        $key = substr( md5( time() . rand() . $domain ), 0, 16 );
+        $meta = serialize($meta);
+        $domain = $wpdb->escape($domain);
+        $path = $wpdb->escape($path);
+        $title = $wpdb->escape($title);
+                                        
+        $wpdb->insert( $wpdb->signups, array(
+                'domain' => $domain,
+                'path' => $path,
+                'title' => $title,
+                'user_login' => $user,
+                'user_email' => $user_email,
+                'registered' => current_time('mysql', true),
+                'activation_key' => $key,
+                'meta' => $meta
+        ) );
+
+        wpmu_signup_blog_notification($domain, $path, $title, $user, $user_email, $key, $meta);
+}
+
+function wpmu_signup_user($user, $user_email, $meta = '') {
+        global $wpdb;
+
+        // Format data
+        $user = preg_replace( "/\s+/", '', sanitize_user( $user, true ) );
+        $user_email = sanitize_email( $user_email );
+        $key = substr( md5( time() . rand() . $user_email ), 0, 16 );
+        $meta = serialize($meta);
+                                        
+        $wpdb->insert( $wpdb->signups, array(
+                'domain' => '',
+                'path' => '',
+                'title' => '',
+                'user_login' => $user,
+                'user_email' => $user_email,
+                'registered' => current_time('mysql', true),
+                'activation_key' => $key,
+                'meta' => $meta
+        ) );
+
+        wpmu_signup_user_notification($user, $user_email, $key, $meta);
+}
+
+// Notify user of signup success.
+function wpmu_signup_blog_notification($domain, $path, $title, $user, $user_email, $key, $meta = '') {
+        global $current_site;
+
+        if( !apply_filters('wpmu_signup_blog_notification', $domain, $path, $title, $user, $user_email, $key, $meta) )
+                return false;
+
+        // Send email with activation link.
+        if( constant( "VHOST" ) == 'no' || $current_site->id != 1 ) {
+                $activate_url = "http://" . $current_site->domain . $current_site->path . "wp-activate.php?key=$key";
+        } else {
+                $activate_url = "http://{$domain}{$path}wp-activate.php?key=$key";
+        }
+        $activate_url = clean_url($activate_url);
+        $admin_email = get_site_option( "admin_email" );
+        if( $admin_email == '' )
+                $admin_email = 'support@' . $_SERVER['SERVER_NAME'];
+        $from_name = get_site_option( "site_name" ) == '' ? 'WordPress' : wp_specialchars( get_site_option( "site_name" ) );
+        $message_headers = "MIME-Version: 1.0\n" . "From: \"{$from_name}\" <{$admin_email}>\n" . "Content-Type: text/plain; charset=\"" . get_option('blog_charset') . "\"\n";
+        $message = sprintf( apply_filters( 'wpmu_signup_blog_notification_email', __( "To activate your blog, please click the following link:\n\n%s\n\nAfter you activate, you will receive *another email* with your login.\n\nAfter you activate, you can visit your blog here:\n\n%s" ) ), $activate_url, clean_url( "http://{$domain}{$path}" ), $key );
+        // TODO: Don't hard code activation link.
+        $subject = sprintf( apply_filters( 'wpmu_signup_blog_notification_subject', __( '[%1s] Activate %2s' ) ), $from_name, clean_url( 'http://' . $domain . $path ) );
+        wp_mail($user_email, $subject, $message, $message_headers);
+        return true;
+}
+
+function wpmu_signup_user_notification($user, $user_email, $key, $meta = '') {
+        global $current_site;
+
+        if( !apply_filters('wpmu_signup_user_notification', $user, $user_email, $key, $meta) )
+                return false;
+
+        // Send email with activation link.
+        $admin_email = get_site_option( "admin_email" );
+        if( $admin_email == '' )
+                $admin_email = 'support@' . $_SERVER['SERVER_NAME'];
+        $from_name = get_site_option( "site_name" ) == '' ? 'WordPress' : wp_specialchars( get_site_option( "site_name" ) );
+        $message_headers = "MIME-Version: 1.0\n" . "From: \"{$from_name}\" <{$admin_email}>\n" . "Content-Type: text/plain; charset=\"" . get_option('blog_charset') . "\"\n";
+        $message = sprintf( apply_filters( 'wpmu_signup_user_notification_email', __( "To activate your user, please click the following link:\n\n%s\n\nAfter you activate, you will receive *another email* with your login.\n\n" ) ), site_url( "wp-activate.php?key=$key" ), $key );
+        // TODO: Don't hard code activation link.
+        $subject = sprintf( __( apply_filters( 'wpmu_signup_user_notification_subject', '[%1s] Activate %2s' ) ), $from_name, $user);
+        wp_mail($user_email, $subject, $message, $message_headers);
+        return true;
+}
+
+function wpmu_activate_signup($key) {
+        global $wpdb, $current_site;
+
+        $signup = $wpdb->get_row( $wpdb->prepare("SELECT * FROM $wpdb->signups WHERE activation_key = %s", $key) );
+
+        if ( empty($signup) )
+                return new WP_Error('invalid_key', __('Invalid activation key.'));
+
+        if ( $signup->active )
+                return new WP_Error('already_active', __('The blog is already active.'), $signup);
+
+        $meta = unserialize($signup->meta);
+        $user_login = $wpdb->escape($signup->user_login);
+        $user_email = $wpdb->escape($signup->user_email);
+        wpmu_validate_user_signup($user_login, $user_email);
+        $password = generate_random_password();
+
+        $user_id = username_exists($user_login);
+
+        if ( ! $user_id )
+                $user_id = wpmu_create_user($user_login, $password, $user_email);
+        else
+                $user_already_exists = true;
+
+        if ( ! $user_id )
+                return new WP_Error('create_user', __('Could not create user'), $signup);
+
+        $now = current_time('mysql', true);
+
+        if ( empty($signup->domain) ) {
+                $wpdb->update( $wpdb->signups, array('active' => 1, 'activated' => $now), array('activation_key' => $key) );
+                if ( isset( $user_already_exists ) )
+                        return new WP_Error( 'user_already_exists', __( 'That username is already activated.' ), $signup);
+                wpmu_welcome_user_notification($user_id, $password, $meta);
+                $user_site = get_site_option( 'dashboard_blog', $current_site->blog_id );
+                if ( $user_site == false ) {
+                        add_user_to_blog( '1', $user_id, get_site_option( 'default_user_role', 'subscriber' ) );
+                } else {
+                        add_user_to_blog( $user_site, $user_id, get_site_option( 'default_user_role', 'subscriber' ) );
+                }
+                add_new_user_to_blog( $user_id, $user_email, $meta );
+                do_action('wpmu_activate_user', $user_id, $password, $meta);
+                return array('user_id' => $user_id, 'password' => $password, 'meta' => $meta);
+        }
+
+        wpmu_validate_blog_signup($signup->domain, $signup->title);
+        $blog_id = wpmu_create_blog( $signup->domain, $signup->path, $signup->title, $user_id, $meta, $wpdb->siteid );
+
+        // TODO: What to do if we create a user but cannot create a blog?
+        if ( is_wp_error($blog_id) ) {
+                // If blog is taken, that means a previous attempt to activate this blog failed in between creating the blog and
+                // setting the activation flag. Let's just set the active flag and instruct the user to reset their password.
+                if ( 'blog_taken' == $blog_id->get_error_code() ) {
+                        $blog_id->add_data( $signup );
+                        $wpdb->update( $wpdb->signups, array( 'active' => 1, 'activated' => $now ), array( 'activation_key' => $key ) );
+                }
+
+                return $blog_id;
+        }
+
+        $wpdb->update( $wpdb->signups, array('active' => 1, 'activated' => $now), array('activation_key' => $key) );
+
+        wpmu_welcome_notification($blog_id, $user_id, $password, $signup->title, $meta);
+
+        do_action('wpmu_activate_blog', $blog_id, $user_id, $password, $signup->title, $meta);
+
+        return array('blog_id' => $blog_id, 'user_id' => $user_id, 'password' => $password, 'title' => $signup->title, 'meta' => $meta);
+}
+
+function generate_random_password( $len = 8 ) {
+        $random_password = substr(md5(uniqid(microtime())), 0, intval( $len ) );
+        $random_password = apply_filters('random_password', $random_password);
+        return $random_password;
+}
+
+function wpmu_create_user( $user_name, $password, $email) {
+        $user_name = preg_replace( "/\s+/", '', sanitize_user( $user_name, true ) );
+        if ( username_exists($user_name) )
+                return false;
+
+        // Check if the email address has been used already.
+        if ( email_exists($email) )
+                return false;
+
+        $user_id = wp_create_user( $user_name, $password, $email );
+        $user = new WP_User($user_id);
+
+        // Newly created users have no roles or caps until they are added to a blog.
+        update_user_option($user_id, 'capabilities', '');
+        update_user_option($user_id, 'user_level', '');
+
+        do_action( 'wpmu_new_user', $user_id );
+
+        return $user_id;
+}
+
+function wpmu_create_blog($domain, $path, $title, $user_id, $meta = '', $site_id = 1) {
+        $domain = preg_replace( "/\s+/", '', sanitize_user( $domain, true ) );
+        if( constant( 'VHOST' ) == 'yes' )
+                $domain = str_replace( '@', '', $domain );
+        $title = strip_tags( $title );
+        $user_id = (int) $user_id;
+
+        if( empty($path) )
+                $path = '/';
+
+        // Check if the domain has been used already. We should return an error message.
+        if ( domain_exists($domain, $path, $site_id) )
+                return new WP_Error('blog_taken', __('Blog already exists.'));
+
+        if ( !defined("WP_INSTALLING") )
+                define( "WP_INSTALLING", true );
+
+        if ( ! $blog_id = insert_blog($domain, $path, $site_id) )
+                return new WP_Error('insert_blog', __('Could not create blog.'));
+
+        switch_to_blog($blog_id);
+
+        install_blog($blog_id, $title);
+
+        install_blog_defaults($blog_id, $user_id);
+
+        add_user_to_blog($blog_id, $user_id, 'administrator');
+
+        if ( is_array($meta) ) foreach ($meta as $key => $value) {
+                if( $key == 'public' || $key == 'archived' || $key == 'mature' || $key == 'spam' || $key == 'deleted' || $key == 'lang_id' ) {
+                        update_blog_status( $blog_id, $key, $value );
+                } else {
+                        update_option( $key, $value );
+                }
+        }
+
+        add_option( 'WPLANG', get_site_option( 'WPLANG' ) );
+
+        update_option( 'blog_public', $meta['public'] );
+
+        if ( !is_site_admin() && get_usermeta( $user_id, 'primary_blog' ) == get_site_option( 'dashboard_blog', 1 ) )
+                update_usermeta( $user_id, 'primary_blog', $blog_id );
+
+        restore_current_blog();
+
+        do_action( 'wpmu_new_blog', $blog_id, $user_id );
+
+        return $blog_id;
+}
+
+function newblog_notify_siteadmin( $blog_id, $deprecated = '' ) {
+        global $current_site;
+        if( get_site_option( 'registrationnotification' ) != 'yes' )
+                return false;
+                
+        $email = get_site_option( 'admin_email' );
+        if( is_email($email) == false )
+                return false;
+        
+        $options_site_url = clean_url("http://{$current_site->domain}{$current_site->path}wp-admin/wpmu-options.php");
+
+        switch_to_blog( $blog_id );
+        $blogname = get_option( 'blogname' );
+        $siteurl = get_option( 'siteurl' );
+        restore_current_blog();
+        
+        $msg = sprintf( __( "New Blog: %1s
+URL: %2s
+Remote IP: %3s
+
+Disable these notifications: %4s"), $blogname, $siteurl, $_SERVER['REMOTE_ADDR'], $options_site_url);
+        $msg = apply_filters( 'newblog_notify_siteadmin', $msg );
+        
+        wp_mail( $email, sprintf( __( "New Blog Registration: %s" ), $siteurl ), $msg );
+        return true;
+}
+
+function newuser_notify_siteadmin( $user_id ) {
+        global $current_site;
+        if( get_site_option( 'registrationnotification' ) != 'yes' )
+                return false;
+                
+        $email = get_site_option( 'admin_email' );
+        if( is_email($email) == false )
+                return false;
+        $user = new WP_User($user_id);
+
+        $options_site_url = clean_url("http://{$current_site->domain}{$current_site->path}wp-admin/wpmu-options.php");
+        $msg = sprintf(__("New User: %1s
+Remote IP: %2s
+
+Disable these notifications: %3s"), $user->user_login, $_SERVER['REMOTE_ADDR'], $options_site_url);
+        
+        $msg = apply_filters( 'newuser_notify_siteadmin', $msg );
+        wp_mail( $email, sprintf(__("New User Registration: %s"), $user->user_login), $msg );
+        return true;
+}
+
+function domain_exists($domain, $path, $site_id = 1) {
+        global $wpdb;
+        return $wpdb->get_var( $wpdb->prepare("SELECT blog_id FROM $wpdb->blogs WHERE domain = %s AND path = %s AND site_id = %d", $domain, $path, $site_id) );
+}
+
+function insert_blog($domain, $path, $site_id) {
+        global $wpdb;
+
+        $path = trailingslashit($path);
+        $site_id = (int) $site_id;
+
+        $result = $wpdb->insert( $wpdb->blogs, array('site_id' => $site_id, 'domain' => $domain, 'path' => $path, 'registered' => current_time('mysql')) );
+        if ( ! $result )
+                return false;
+
+        refresh_blog_details($wpdb->insert_id);
+        return $wpdb->insert_id;
+}
+
+// Install an empty blog. wpdb should already be switched.
+function install_blog($blog_id, $blog_title = '') {
+        global $wpdb, $table_prefix, $wp_roles;
+        $wpdb->suppress_errors();
+
+        // Cast for security
+        $blog_id = (int) $blog_id;
+
+        require_once( ABSPATH . 'wp-admin/includes/upgrade.php');
+
+        if ( $wpdb->get_results("SELECT ID FROM $wpdb->posts") )
+                die(__('<h1>Already Installed</h1><p>You appear to have already installed WordPress. To reinstall please clear your old database tables first.</p>') . '</body></html>');
+        $wpdb->suppress_errors( false);
+
+        $url = get_blogaddress_by_id($blog_id);
+
+        // Set everything up
+        make_db_current_silent();
+        populate_options();
+        populate_roles();
+        $wp_roles->_init();
+
+        // fix url.
+        update_option('siteurl', $url);
+        update_option('home', $url);
+        update_option('fileupload_url', $url . "files" );
+        update_option('upload_path', "wp-content/blogs.dir/" . $blog_id . "/files");
+        update_option('blogname', stripslashes( $blog_title ) );
+        update_option('admin_email', '');
+        $wpdb->update( $wpdb->options, array('option_value' => ''), array('option_name' => 'admin_email') );
+
+        // Default category
+        $wpdb->insert( $wpdb->terms, array('term_id' => 1, 'name' => __('Uncategorized'), 'slug' => sanitize_title(__('Uncategorized')), 'term_group' => 0) );
+        $wpdb->insert( $wpdb->term_taxonomy, array('term_id' => 1, 'taxonomy' => 'category', 'description' => '', 'parent' => 0, 'count' => 1) );
+
+        // Default link category
+        $cat_name = __('Blogroll');
+        $cat_slug = sanitize_title($cat_name);
+        
+        $blogroll_id = $wpdb->get_var( $wpdb->prepare( "SELECT cat_ID FROM {$wpdb->sitecategories} WHERE category_nicename = %s", $cat_slug ) );
+        if( $blogroll_id == null ) {
+                $wpdb->insert( $wpdb->sitecategories, array('cat_ID' => 0, 'cat_name' => $cat_name, 'category_nicename' => $cat_slug, 'last_updated' => current_time('mysql', true)) );
+                $blogroll_id = $wpdb->insert_id;
+        }
+        $wpdb->insert( $wpdb->terms, array('term_id' => $blogroll_id, 'name' => $cat_name, 'slug' => $cat_slug, 'term_group' => 0) );
+        $wpdb->insert( $wpdb->term_taxonomy, array('term_id' => $blogroll_id, 'taxonomy' => 'link_category', 'description' => '', 'parent' => 0, 'count' => 2) );
+        update_option('default_link_category', $blogroll_id);
+
+        // remove all perms
+        $wpdb->query( $wpdb->prepare("DELETE FROM $wpdb->usermeta WHERE meta_key = %s", $table_prefix.'user_level') );
+        $wpdb->query( $wpdb->prepare("DELETE FROM $wpdb->usermeta WHERE meta_key = %s", $table_prefix.'capabilities') );
+
+        $wpdb->suppress_errors( false );
+}
+
+// should be switched already as $blog_id is ignored.
+function install_blog_defaults($blog_id, $user_id) {
+        global $wpdb, $wp_rewrite, $current_site, $table_prefix;
+
+        $wpdb->suppress_errors();
+
+        // Cast for security
+        $user_id = (int) $user_id;
+        $blog_id = (int) $blog_id;
+
+        // Default links
+        $wpdb->insert( $wpdb->links, array( 'link_url' => 'http://wordpress.com/', 'link_name' => 'WordPress.com', 'link_owner' => $user_id, 'link_rss' => 'http://en.blog.wordpress.com/feed/', 'link_notes' => '' ) );
+        $wpdb->insert( $wpdb->links, array( 'link_url' => 'http://wordpress.org/', 'link_name' => 'WordPress.org', 'link_owner' => $user_id, 'link_rss' => 'http://wordpress.org/development/feed/', 'link_notes' => '' ) );
+        $wpdb->insert( $wpdb->term_relationships, array('object_id' => 1, 'term_taxonomy_id' => 2));
+        $wpdb->insert( $wpdb->term_relationships, array('object_id' => 2, 'term_taxonomy_id' => 2));
+
+        // First post
+        $now = date('Y-m-d H:i:s');
+        $now_gmt = gmdate('Y-m-d H:i:s');
+        $first_post = get_site_option( 'first_post' );
+        if( $first_post == false ) {
+                $first_post = stripslashes( __( 'Welcome to <a href="SITE_URL">SITE_NAME</a>. This is your first post. Edit or delete it, then start blogging!' ) );
+        }
+        $first_post = str_replace( "SITE_URL", clean_url("http://" . $current_site->domain . $current_site->path), $first_post );
+        $first_post = str_replace( "SITE_NAME", $current_site->site_name, $first_post );
+        $wpdb->insert( $wpdb->posts, array(
+                'post_author' => $user_id,
+                'post_date' => $now,
+                'post_date_gmt' => $now_gmt,
+                'post_content' => stripslashes( $first_post ),
+                'post_excerpt' => '',
+                'post_title' => __('Hello world!'),
+                'post_name' => __('hello-world'),
+                'post_modified' => $now,
+                'post_modified_gmt' => $now_gmt,
+                'comment_count' => 1,
+                'to_ping' => '',
+                'pinged' => '',
+                'post_content_filtered' => ''
+        ) );
+        $wpdb->insert( $wpdb->term_relationships, array('object_id' => 1, 'term_taxonomy_id' => 1));
+        update_option( "post_count", 1 );
+
+        // First page
+        $wpdb->insert( $wpdb->posts, array(
+                'post_author' => $user_id,
+                'post_date' => $now,
+                'post_date_gmt' => $now_gmt,
+                'post_content' => get_site_option( 'first_page' ),
+                'post_excerpt' => '',
+                'post_title' => __('About'),
+                'post_name' => __('about'),
+                'post_modified' => $now,
+                'post_modified_gmt' => $now_gmt,
+                'post_status' => 'publish',
+                'post_type' => 'page',
+                'to_ping' => '',
+                'pinged' => '',
+                'post_content_filtered' => ''
+        ) );
+        
+        // Flush rules to pick up the new page.
+        $wp_rewrite->init();
+        $wp_rewrite->flush_rules();
+
+        // Default comment
+        $wpdb->insert( $wpdb->comments, array(
+                'comment_post_ID' => '1',
+                'comment_author' => __( get_site_option( 'first_comment_author' ) ),
+                'comment_author_email' => '',
+                'comment_author_url' => get_site_option( 'first_comment_url' ),
+                'comment_author_IP' => '127.0.0.1',
+                'comment_date' => $now,
+                'comment_date_gmt' => $now_gmt,
+                'comment_content' => __( get_site_option( 'first_comment' ) )
+        ) );
+        
+        $user = new WP_User($user_id);
+        $wpdb->update( $wpdb->options, array('option_value' => $user->user_email), array('option_name' => 'admin_email') );
+
+        // Remove all perms except for the login user.
+        $wpdb->query( $wpdb->prepare("DELETE FROM $wpdb->usermeta WHERE user_id != %d AND meta_key = %s", $user_id, $table_prefix.'user_level') );
+        $wpdb->query( $wpdb->prepare("DELETE FROM $wpdb->usermeta WHERE user_id != %d AND meta_key = %s", $user_id, $table_prefix.'capabilities') );
+        
+        // Delete any caps that snuck into the previously active blog. (Hardcoded to blog 1 for now.) TODO: Get previous_blog_id.
+        if ( !is_site_admin( $user->user_login ) && $user_id != 1 )
+                $wpdb->query( $wpdb->prepare("DELETE FROM $wpdb->usermeta WHERE user_id = %d AND meta_key = %s", $user_id, $wpdb->base_prefix.'1_capabilities') );
+
+        $wpdb->suppress_errors( false );
+}
+
+function wpmu_welcome_notification($blog_id, $user_id, $password, $title, $meta = '') {
+        global $current_site;
+
+        if( !apply_filters('wpmu_welcome_notification', $blog_id, $user_id, $password, $title, $meta) )
+                return false;
+
+        $welcome_email = stripslashes( get_site_option( 'welcome_email' ) );
+        if( $welcome_email == false )
+                $welcome_email = stripslashes( __( "Dear User,
+
+Your new SITE_NAME blog has been successfully set up at:
+BLOG_URL
+
+You can log in to the administrator account with the following information:
+Username: USERNAME
+Password: PASSWORD
+Login Here: BLOG_URLwp-login.php
+
+We hope you enjoy your new weblog.
+Thanks!
+
+--The WordPress Team
+SITE_NAME" ) );
+
+        $url = get_blogaddress_by_id($blog_id);
+        $user = new WP_User($user_id);
+
+        $welcome_email = str_replace( "SITE_NAME", $current_site->site_name, $welcome_email );
+        $welcome_email = str_replace( "BLOG_TITLE", $title, $welcome_email );
+        $welcome_email = str_replace( "BLOG_URL", $url, $welcome_email );
+        $welcome_email = str_replace( "USERNAME", $user->user_login, $welcome_email );
+        $welcome_email = str_replace( "PASSWORD", $password, $welcome_email );
+
+        $welcome_email = apply_filters( "update_welcome_email", $welcome_email, $blog_id, $user_id, $password, $title, $meta);
+        $admin_email = get_site_option( "admin_email" );
+        if( $admin_email == '' )
+                $admin_email = 'support@' . $_SERVER['SERVER_NAME'];
+        $from_name = get_site_option( "site_name" ) == '' ? 'WordPress' : wp_specialchars( get_site_option( "site_name" ) );
+        $message_headers = "MIME-Version: 1.0\n" . "From: \"{$from_name}\" <{$admin_email}>\n" . "Content-Type: text/plain; charset=\"" . get_option('blog_charset') . "\"\n";
+        $message = $welcome_email;
+        if( empty( $current_site->site_name ) )
+                $current_site->site_name = "WordPress MU";
+        $subject = apply_filters( 'update_welcome_subject', sprintf(__('New %1$s Blog: %2$s'), $current_site->site_name, stripslashes( $title ) ) );
+        wp_mail($user->user_email, $subject, $message, $message_headers);
+        return true;
+}
+
+function wpmu_welcome_user_notification($user_id, $password, $meta = '') {
+        global $current_site;
+
+        if( !apply_filters('wpmu_welcome_user_notification', $user_id, $password, $meta) )
+                return false;
+
+        $welcome_email = get_site_option( 'welcome_user_email' );
+
+        $user = new WP_User($user_id);
+
+        $welcome_email = apply_filters( "update_welcome_user_email", $welcome_email, $user_id, $password, $meta);
+        $welcome_email = str_replace( "SITE_NAME", $current_site->site_name, $welcome_email );
+        $welcome_email = str_replace( "USERNAME", $user->user_login, $welcome_email );
+        $welcome_email = str_replace( "PASSWORD", $password, $welcome_email );
+        $welcome_email = str_replace( "LOGINLINK", wp_login_url(), $welcome_email );
+
+        $admin_email = get_site_option( "admin_email" );
+        if( $admin_email == '' )
+                $admin_email = 'support@' . $_SERVER['SERVER_NAME'];
+        $from_name = get_site_option( "site_name" ) == '' ? 'WordPress' : wp_specialchars( get_site_option( "site_name" ) );
+        $message_headers = "MIME-Version: 1.0\n" . "From: \"{$from_name}\" <{$admin_email}>\n" . "Content-Type: text/plain; charset=\"" . get_option('blog_charset') . "\"\n";
+        $message = $welcome_email;
+        if( empty( $current_site->site_name ) )
+                $current_site->site_name = "WordPress MU";
+        $subject = apply_filters( 'update_welcome_user_subject', sprintf(__('New %1$s User: %2$s'), $current_site->site_name, $user->user_login) );
+        wp_mail($user->user_email, $subject, $message, $message_headers);
+        return true;
+}
+
+function get_current_site() {
+        global $current_site;
+        return $current_site;
+}
+
+function get_user_id_from_string( $string ) {
+        global $wpdb;
+
+        $user_id = 0;
+        if ( is_email( $string ) ) {
+                $user = get_user_by_email($string);
+                if ( $user )
+                        $user_id = $user->ID;
+        } elseif ( is_numeric( $string ) ) {
+                $user_id = $string;
+        } else {
+                $user = get_userdatabylogin($string);
+                if ( $user )
+                        $user_id = $user->ID;
+        }
+
+        return $user_id;
+}
+
+function get_most_recent_post_of_user( $user_id ) {
+        global $wpdb;
+
+        $user_blogs = get_blogs_of_user( (int) $user_id );
+        $most_recent_post = array();
+
+        // Walk through each blog and get the most recent post
+        // published by $user_id
+        foreach ( (array) $user_blogs as $blog ) {
+                $recent_post = $wpdb->get_row( $wpdb->prepare("SELECT ID, post_date_gmt FROM {$wpdb->base_prefix}{$blog->userblog_id}_posts WHERE post_author = %d AND post_type = 'post' AND post_status = 'publish' ORDER BY post_date_gmt DESC LIMIT 1", $user_id ), ARRAY_A);
+
+                // Make sure we found a post
+                if ( isset($recent_post['ID']) ) {
+                        $post_gmt_ts = strtotime($recent_post['post_date_gmt']);
+
+                        // If this is the first post checked or if this post is
+                        // newer than the current recent post, make it the new
+                        // most recent post.
+                        if (
+                                !isset($most_recent_post['post_gmt_ts'])
+                                || ($post_gmt_ts > $most_recent_post['post_gmt_ts'])
+                        ) {
+                                $most_recent_post = array(
+                                        'blog_id'                => $blog->userblog_id,
+                                        'post_id'                => $recent_post['ID'],
+                                        'post_date_gmt'        => $recent_post['post_date_gmt'],
+                                        'post_gmt_ts'        => $post_gmt_ts
+                                );
+                        }
+                }
+        }
+
+        return $most_recent_post;
+}
+
+/* Misc functions */
+function fix_upload_details( $uploads ) {
+        $uploads['url'] = str_replace( UPLOADS, "files", $uploads['url'] );
+        $uploads['baseurl'] = str_replace( UPLOADS, "files", $uploads['baseurl'] );
+        return $uploads;
+}
+
+function get_dirsize( $directory ) {
+        $dirsize = get_transient( 'dirsize_cache' );
+        if ( is_array( $dirsize ) && isset( $dirsize[ $directory ][ 'size' ] ) ) {
+                return $dirsize[ $directory ][ 'size' ];
+        }
+        if ( false == is_array( $dirsize ) ) {
+                $dirsize = array();
+        }
+        $dirsize[ $directory ][ 'size' ] = recurse_dirsize( $directory );
+
+        set_transient( 'dirsize_cache', $dirsize, 3600 );
+        return $dirsize[ $directory ][ 'size' ];
+}
+
+function clear_dirsize_cache( $file = true ) {
+        delete_transient( 'dirsize_cache' );
+        return $file;
+}
+add_filter( 'wp_handle_upload', 'clear_dirsize_cache' );
+add_action( 'delete_attachment', 'clear_dirsize_cache' );
+
+function recurse_dirsize( $directory ) {
+        $size = 0;
+        if(substr($directory,-1) == '/') $directory = substr($directory,0,-1);
+        if(!file_exists($directory) || !is_dir($directory) || !is_readable($directory)) return false;
+        if($handle = opendir($directory)) {
+                while(($file = readdir($handle)) !== false) {
+                        $path = $directory.'/'.$file;
+                        if($file != '.' && $file != '..') {
+                                if(is_file($path)) {
+                                        $size += filesize($path);
+                                } elseif(is_dir($path)) {
+                                        $handlesize = recurse_dirsize($path);
+                                        if($handlesize >= 0) {
+                                                $size += $handlesize;
+                                        } else {
+                                                return false;
+                                        }
+                                }
+                        }
+                }
+                closedir($handle);
+        }
+        return $size;
+}
+
+function upload_is_user_over_quota( $echo = true ) {
+        if ( get_site_option( 'upload_space_check_disabled' ) ) {
+                return true;
+        }
+        $spaceAllowed = get_space_allowed();
+        if(empty($spaceAllowed) || !is_numeric($spaceAllowed))
+                $spaceAllowed = 10;        // Default space allowed is 10 MB
+        
+        $dirName = BLOGUPLOADDIR;
+        $size = get_dirsize($dirName) / 1024 / 1024;
+        
+        if( ($spaceAllowed-$size) < 0 ) {
+                if( $echo )
+                        _e( "Sorry, you have used your space allocation. Please delete some files to upload more files." ); //No space left
+                return true;
+        } else {
+                return false;
+        }
+}
+
+function check_upload_mimes($mimes) {
+        $site_exts = explode( " ", get_site_option( "upload_filetypes" ) );
+        foreach ( $site_exts as $ext ) {
+                foreach ( $mimes as $ext_pattern => $mime ) {
+                        if( $ext != '' && strpos( $ext_pattern, $ext ) !== false ) {
+                                $site_mimes[$ext_pattern] = $mime;
+                        }
+                }
+        }
+        return $site_mimes;
+}
+
+function update_posts_count( $deprecated = '' ) {
+        global $wpdb;
+        update_option( "post_count", (int) $wpdb->get_var( "SELECT COUNT(ID) FROM {$wpdb->posts} WHERE post_status = 'publish' and post_type = 'post'" ) );
+}
+
+function wpmu_log_new_registrations( $blog_id, $user_id ) {
+        global $wpdb;
+        $user = new WP_User( (int) $user_id );
+        $wpdb->insert( $wpdb->registration_log, array('email' => $user->user_email, 'IP' => preg_replace( '/[^0-9., ]/', '',$_SERVER['REMOTE_ADDR'] ), 'blog_id' => $blog_id, 'date_registered' => current_time('mysql')) );
+}
+
+function fix_import_form_size( $size ) {
+        if( upload_is_user_over_quota( false ) == true ) {
+                return 0;
+        }
+        
+        $spaceAllowed = 1024 * 1024 * get_space_allowed();
+        $dirName = BLOGUPLOADDIR;
+        $dirsize = get_dirsize($dirName) ;
+        if( $size > $spaceAllowed - $dirsize ) {
+                return $spaceAllowed - $dirsize; // remaining space
+        } else {
+                return $size; // default
+        }
+}
+
+if ( !function_exists('graceful_fail') ) :
+function graceful_fail( $message ) {
+        $message = apply_filters('graceful_fail', $message);
+        $message_template = apply_filters( 'graceful_fail_template',
+'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"><head profile="http://gmpg.org/xfn/11">
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<title>Error!</title>
+<style type="text/css">
+img {
+        border: 0;
+}
+body {
+line-height: 1.6em; font-family: Georgia, serif; width: 390px; margin: auto;
+text-align: center;
+}
+.message {
+        font-size: 22px;
+        width: 350px;
+        margin: auto;
+}
+</style>
+</head>
+<body>
+<p class="message">%s</p>
+</body>
+</html>' );
+        die( sprintf( $message_template, $message ) );
+}
+endif;
+
+/* Delete blog */
+class delete_blog {
+        function delete_blog() {
+                $this->reallydeleteblog = false;
+                add_action('admin_menu', array(&$this, 'admin_menu'));
+                add_action('admin_footer', array(&$this, 'admin_footer'));
+        }
+
+        function admin_footer() {
+                global $wpdb, $current_blog, $current_site;
+                if( $current_blog->domain . $current_blog->path == $current_site->domain . $current_site->path )
+                        return false;
+
+                if( $this->reallydeleteblog == true ) {
+                        wpmu_delete_blog( $wpdb->blogid );
+                }
+        }
+
+        function admin_menu() {
+                global $current_blog, $current_site;
+                if( $current_blog->domain . $current_blog->path != $current_site->domain . $current_site->path )
+                        add_submenu_page('options-general.php', __('Delete Blog'), __('Delete Blog'), 'manage_options', 'delete-blog', array(&$this, 'plugin_content'));
+        }
+
+        function plugin_content() {
+                global $current_blog, $current_site;
+                $this->delete_blog_hash = get_settings('delete_blog_hash');
+                echo '<div class="wrap"><h2>' . __('Delete Blog') . '</h2>';
+                if( $_POST['action'] == "deleteblog" && $_POST['confirmdelete'] == '1' ) {
+                        $hash = substr( md5( $_SERVER['REQUEST_URI'] . time() ), 0, 6 );
+                        update_option( "delete_blog_hash", $hash );
+                        $url_delete = get_option( "siteurl" ) . "/wp-admin/options-general.php?page=delete-blog&h=" . $hash;
+                        $msg = __("Dear User,
+You recently clicked the 'Delete Blog' link on your blog and filled in a
+form on that page.
+If you really want to delete your blog, click the link below. You will not
+be asked to confirm again so only click this link if you are 100% certain:
+URL_DELETE
+
+If you delete your blog, please consider opening a new blog here
+some time in the future! (But remember your current blog and username
+are gone forever.)
+
+Thanks for using the site,
+Webmaster
+SITE_NAME
+");
+                        $msg = str_replace( "URL_DELETE", $url_delete, $msg );
+                        $msg = str_replace( "SITE_NAME", $current_site->site_name, $msg );
+                        wp_mail( get_option( "admin_email" ), "[ " . get_option( "blogname" ) . " ] ".__("Delete My Blog"), $msg );
+                        ?>
+                        <p><?php _e('Thank you. Please check your email for a link to confirm your action. Your blog will not be deleted until this link is clicked.') ?></p>
+                        <?php
+                } elseif( isset( $_GET['h'] ) && $_GET['h'] != '' && get_option('delete_blog_hash') != false ) {
+                        if( get_option('delete_blog_hash') == $_GET['h'] ) {
+                                $this->reallydeleteblog = true;
+                                echo "<p>" . sprintf(__('Thank you for using %s, your blog has been deleted. Happy trails to you until we meet again.'), $current_site->site_name) . "</p>";
+                        } else {
+                                $this->reallydeleteblog = false;
+                                echo "<p>" . __("I'm sorry, the link you clicked is stale. Please select another option.") . "</p>";
+                        }
+                } else {
+?>
+                        <p><?php printf(__('If you do not want to use your %s blog any more, you can delete it using the form below. When you click <strong>Delete My Blog</strong> you will be sent an email with a link in it. Click on this link to delete your blog.'), $current_site->site_name); ?></p>
+                        <p><?php _e('Remember, once deleted your blog cannot be restored.') ?></p>
+                        <form method='post' name='deletedirect'>
+                        <input type="hidden" name="page" value="<?php echo $_GET['page'] ?>" />
+                        <input type='hidden' name='action' value='deleteblog' />
+                        <p><input id='confirmdelete' type='checkbox' name='confirmdelete' value='1' /> <label for='confirmdelete'><strong><?php printf( __("I'm sure I want to permanently disable my blog, and I am aware I can never get it back or use %s again."), $current_blog->domain); ?></strong></label></p>
+                        <p class="submit"><input type='submit' value='<?php _e('Delete My Blog Permanently &raquo;') ?>' /></p>
+                        </form>
+<?php
+                }
+                echo "</div>";
+        }
+}
+$delete_blog_obj = new delete_blog();
+
+/* Global Categories */
+function global_terms( $term_id, $deprecated = '' ) {
+        global $wpdb;
+
+        $term_id = intval( $term_id );
+        $c = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->terms WHERE term_id = %d", $term_id ) );
+
+        $global_id = $wpdb->get_var( $wpdb->prepare( "SELECT cat_ID FROM $wpdb->sitecategories WHERE category_nicename = %s", $c->slug ) );
+        if ( $global_id == null ) {
+                $wpdb->insert( $wpdb->sitecategories, array('cat_name' => $c->name, 'category_nicename' => $c->slug) );
+                $global_id = $wpdb->insert_id;
+        }
+
+        if ( $global_id == $term_id )
+                return $global_id;
+
+        if( get_option( 'default_category' ) == $term_id )
+                update_option( 'default_category', $global_id );
+
+        $wpdb->update( $wpdb->terms, array('term_id' => $global_id), array('term_id' => $term_id) );
+        $wpdb->update( $wpdb->term_taxonomy, array('term_id' => $global_id), array('term_id' => $term_id) );
+        $wpdb->update( $wpdb->term_taxonomy, array('parent' => $global_id), array('parent' => $term_id) );
+
+        clean_term_cache($term_id);
+
+        return $global_id;
+}
+
+function redirect_this_site( $deprecated = '' ) {
+        global $current_site;
+        return array( $current_site->domain );
+}
+
+function upload_is_file_too_big( $upload ) {
+        if( is_array( $upload ) == false || defined( 'WP_IMPORTING' ) )
+                return $upload;
+        if( strlen( $upload[ 'bits' ] ) > ( 1024 * get_site_option( 'fileupload_maxk', 1500 ) ) ) {
+                return sprintf(__( "This file is too big. Files must be less than %dKb in size.<br />" ), get_site_option( 'fileupload_maxk', 1500 ));
+        }
+
+        return $upload;
+}
+
+function wordpressmu_authenticate_siteadmin( $user, $password = '' ) {
+        if( is_site_admin( $user->user_login ) == false && ( $primary_blog = get_usermeta( $user->user_id, "primary_blog" ) ) ) {
+                $details = get_blog_details( $primary_blog );
+                if( is_object( $details ) && $details->spam == 1 ) {
+                        return new WP_Error('blog_suspended', __('Blog Suspended.'));
+                }
+        }
+        return $user;
+}
+
+function wordpressmu_wp_mail_from( $email ) {
+        if( strpos( $email, 'wordpress@' ) !== false )
+                $email = get_option( 'admin_email' );
+        return $email;
+}
+
+/*
+XMLRPC getUsersBlogs() for a multiblog environment
+http://trac.mu.wordpress.org/attachment/ticket/551/xmlrpc-mu.php
+*/
+function wpmu_blogger_getUsersBlogs($args) {
+        global $current_blog;
+        $domain = $current_blog->domain;
+        $path = $current_blog->path . 'xmlrpc.php';
+
+        $rpc = new IXR_Client("http://{$domain}{$path}");
+        $rpc->query('wp.getUsersBlogs', $args[1], $args[2]);
+        $blogs = $rpc->getResponse();
+
+        if ( isset($blogs['faultCode']) ) {
+                return new IXR_Error($blogs['faultCode'], $blogs['faultString']);
+        }
+
+        if ( $_SERVER['HTTP_HOST'] == $domain && $_SERVER['REQUEST_URI'] == $path ) {
+                return $blogs;
+        } else {
+                foreach ( (array) $blogs as $blog ) {
+                        if ( strpos($blog['url'], $_SERVER['HTTP_HOST']) )
+                                return array($blog);
+                }
+                return array();
+        }
+}
+
+function attach_wpmu_xmlrpc($methods) {
+        $methods['blogger.getUsersBlogs'] = 'wpmu_blogger_getUsersBlogs';
+        return $methods;
+}
+
+function mu_locale( $locale ) {
+        if( defined('WP_INSTALLING') == false ) {
+                $mu_locale = get_option('WPLANG');
+                if( $mu_locale === false )
+                        $mu_locale = get_site_option('WPLANG');
+
+                if( $mu_locale !== false )
+                        return $mu_locale;
+        }
+        return $locale;
+}
+
+function signup_nonce_fields() {
+        $id = mt_rand();
+        echo "<input type='hidden' name='signup_form_id' value='{$id}' />";
+        wp_nonce_field('signup_form_' . $id, '_signup_form', false);
+}
+
+function signup_nonce_check( $result ) {
+        if( !strpos( $_SERVER[ 'PHP_SELF' ], 'wp-signup.php' ) )
+                return $result;
+
+        if ( wp_create_nonce('signup_form_' . $_POST[ 'signup_form_id' ]) != $_POST['_signup_form'] )
+                wp_die( __('Please try again!') );
+
+        return $result;
+}
+
+function maybe_redirect_404() {
+        global $current_site;
+        if( is_main_blog() && is_404() && defined( 'NOBLOGREDIRECT' ) && constant( 'NOBLOGREDIRECT' ) != '' ) {
+                $destination = constant( 'NOBLOGREDIRECT' );
+                if ( $destination == '%siteurl%' )
+                        $destination = $current_site->domain . $current_site->path;
+                wp_redirect( $destination );
+                exit();
+        }
+}
+
+function remove_tinymce_media_button( $buttons ) {
+        unset( $buttons[ array_search( 'media', $buttons ) ] );
+        return $buttons;
+}
+
+function maybe_add_existing_user_to_blog() {
+        if ( false === strpos( $_SERVER[ 'REQUEST_URI' ], '/newbloguser/' ) ) {
+                return false;
+        }
+
+        $parts = explode( '/', $_SERVER[ 'REQUEST_URI' ] );
+        $key = array_pop( $parts );
+        if ( $key == '' )
+                $key = array_pop( $parts );
+        $details = get_option( "new_user_" . $key );
+        add_existing_user_to_blog( $details );
+        delete_option( 'new_user_' . $key );
+        wp_die( sprintf(__('You have been added to this blog. Please visit the <a href="%s">homepage</a> or <a href="%s">login</a> using your username and password.'), site_url(), admin_url() ) );
+}
+
+function add_existing_user_to_blog( $details = false ) {
+        if ( is_array( $details ) ) {
+                add_user_to_blog( '', $details[ 'user_id' ], $details[ 'role' ] );
+                do_action( "added_existing_user", $details[ 'user_id' ] );
+        }
+}
+
+function add_new_user_to_blog( $user_id, $email, $meta ) {
+        global $current_site;
+        if( $meta[ 'add_to_blog' ] ) {
+                $blog_id = $meta[ 'add_to_blog' ];
+                $role = $meta[ 'new_role' ];
+                remove_user_from_blog($user_id, $current_site->blogid); // remove user from main blog.
+                add_user_to_blog( $blog_id, $user_id, $role );
+                update_usermeta( $user_id, 'primary_blog', $blog_id );
+        }
+}
+
+function fix_phpmailer_messageid( $phpmailer ) {
+        global $current_site;
+        $phpmailer->Hostname = $current_site->domain;
+}
+
+function is_user_spammy( $username = 0 ) {
+        if( $username == 0 ) {
+                global $current_user;
+                $user_id = $current_user->ID;
+        } else {
+                $user_id = get_user_id_from_string( $username );
+        }
+        $u = new WP_User( $user_id );
+        if( $u->spam == 1 )
+                return true;
+        return false;
+}
+
+function login_spam_check( $user, $password ) {
+        if( is_user_spammy( $user->ID ) )
+                return new WP_Error('invalid_username', __('<strong>ERROR</strong>: your account has been marked as a spammer.'));
+        return $user;
+}
+add_action( 'wp_authenticate_user', 'login_spam_check', 10, 2 );
+
+function update_blog_public( $old_value, $value ) {
+        global $wpdb;
+        do_action('update_blog_public');
+        update_blog_status( $wpdb->blogid, 'public', (int) $value );
+}
+add_action('update_option_blog_public', 'update_blog_public', 10, 2);
+
+function strtolower_usernames( $username, $raw, $strict ) {
+        return strtolower( $username );
+}
+
+/* Short circuit the update checks. Make sure update informtion is
+ stored in wp_sitemeta rather than the options table of individual blogs */
+
+// update_plugins (transient)
+function site_delete_update_plugins() {
+        return update_site_option( 'update_plugins', false );
+}
+add_action( 'delete_transient_update_plugins', 'site_delete_update_plugins' );
+
+function site_pre_update_plugins() {
+        return get_site_option( 'update_plugins' );
+}
+add_filter( 'pre_transient_update_plugins', 'site_pre_update_plugins' );
+
+function site_pre_set_transient_update_plugins( $value ) {
+        update_site_option( 'update_plugins', $value );
+        return $value;
+}
+add_filter( 'pre_set_transient_update_plugins', 'site_pre_set_transient_update_plugins' );
+
+add_action( 'add_option__transient_update_plugins', 'site_add_option__transient_update');
+
+// update_themes (transient)
+function site_delete_update_themes() {
+        return update_site_option( 'update_themes', false );
+}
+add_action( 'delete_transient_update_themes', 'site_delete_update_themes' );
+
+function site_pre_update_themes() {
+        return get_site_option( 'update_themes' );
+}
+add_filter( 'pre_transient_update_themes', 'site_pre_update_themes' );
+
+function site_pre_set_transient_update_themes( $value ) {
+        update_site_option( 'update_themes', $value );
+        return $value;
+}
+add_filter( 'pre_set_transient_update_themes', 'site_pre_set_transient_update_themes' );
+
+add_action( 'add_option__transient_update_themes', 'site_add_option__transient_update');
+
+// update_core (transient)
+function site_delete_update_core() {
+        return update_site_option( 'update_core', false );
+}
+add_action( 'delete_transient_update_core', 'site_delete_update_core' );
+
+function site_pre_update_core() {
+        return get_site_option( 'update_core' );
+}
+add_filter( 'pre_transient_update_core', 'site_pre_update_core' );
+
+function site_pre_set_transient_update_core( $value ) {
+        update_site_option( 'update_core', $value );
+        return $value;
+}
+add_filter( 'pre_set_transient_update_core', 'site_pre_set_transient_update_core' );
+
+add_action( 'add_option__transient_update_core', 'site_add_option__transient_update');
+
+// dismissed_update_core (option, not a transient)
+function site_pre_dismissed_update_core() {
+        return get_site_option( 'dismissed_update_core' );
+}
+add_filter( 'pre_option_dismissed_update_core', 'site_pre_dismissed_update_core' );
+
+function site_pre_update_option_dismissed_update_core( $newvalue, $oldvalue ) {
+        update_site_option( 'dismissed_update_core', $newvalue );
+        delete_option('dismissed_update_core');
+        // Return the old value so the update_option() call is aborted after this filter is run. It's in sitemeta now.
+        return $oldvalue;
+}
+add_filter( 'pre_update_option_dismissed_update_core', 'site_pre_update_option_dismissed_update_core', 10, 2 );
+
+
+
+function site_add_option__transient_update($name) {
+        delete_option($name);
+}
+
+/* Redirect all hits to "dashboard" blog to wp-admin/ Dashboard. */
+function redirect_mu_dashboard() {
+        global $current_site, $current_blog;
+
+        $dashboard_blog = get_dashboard_blog();
+        if ( $current_blog->blog_id == $dashboard_blog->blog_id && $dashboard_blog->blog_id != $current_site->blog_id ) {
+                $protocol = ( is_ssl() ? 'https://' : 'http://' );
+                wp_redirect( $protocol . $dashboard_blog->domain . trailingslashit( $dashboard_blog->path ) . 'wp-admin/' );
+                die();
+        }
+}
+add_action( 'template_redirect', 'redirect_mu_dashboard' );
+
+function get_dashboard_blog() {
+        global $current_site;
+
+        if ( get_site_option( 'dashboard_blog' ) == false ) {
+                return get_blog_details( $current_site->blog_id );
+        } else {
+                return get_blog_details( get_site_option( 'dashboard_blog' ) );
+        }
+}
+
+function is_user_option_local( $key, $user_id = 0, $blog_id = 0 ) {
+        global $current_user, $wpdb;
+
+        if( $user_id == 0 )
+                $user_id = $current_user->ID;
+        if( $blog_id == 0 )
+                $blog_id = $wpdb->blogid;
+        
+        $local_key = $wpdb->base_prefix . $blog_id . "_" . $key;
+        if( isset( $current_user->$local_key ) )
+                return true;
+        return false;
+}
+
+function fix_active_plugins( $value ) {
+        if( false == is_array( $value ) )
+                $value = array();
+        return $value;
+}
+add_filter( "option_active_plugins", "fix_active_plugins" );
+
+if ( !function_exists('rss_gc') ) :
+function rss_gc() {
+        global $wpdb;
+        // Garbage Collection
+        $rows = $wpdb->get_results( "SELECT meta_key FROM {$wpdb->sitemeta} WHERE meta_key LIKE 'rss\_%\_ts' AND meta_value < unix_timestamp( date_sub( NOW(), interval 7200 second ) )" );
+        if( is_array( $rows ) ) {
+                foreach( $rows as $row ) {
+                        $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->sitemeta} WHERE meta_key = %s", $row->meta_key ) );
+                        $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->sitemeta} WHERE meta_key = %s", str_replace( '_ts', '', $row->meta_key ) ) );
+                }
+        }
+}
+endif;
+add_action( 'wp_rss_gc', 'rss_gc' );
+
+function retrieve_password_sitename( $title ) {
+        global $current_site;
+        return sprintf( __( '[%s] Password Reset' ), $current_site->site_name );
+}
+add_filter( 'retrieve_password_title', 'retrieve_password_sitename' );
+
+function reset_password_sitename( $title ) {
+        global $current_site;
+        return sprintf( __( '[%s] Your new password' ), $current_site->site_name );
+}
+add_filter( 'password_reset_title', 'reset_password_sitename' );
+
+function lowercase_username( $username, $raw_username, $strict ) {
+        return strtolower( $username );
+}
+add_filter( 'sanitize_user', 'lowercase_username', 10, 3 );
+
+function mu_upload_dir( $uploads ) {
+        $dir = $uploads[ 'basedir' ];
+        if( defined( 'BLOGUPLOADDIR' ) )
+                $dir = constant( 'BLOGUPLOADDIR' );
+        $dir = untrailingslashit( $dir ) . $uploads[ 'subdir' ];
+        $uploads[ 'path' ] = $dir;
+
+        return $uploads;
+}
+add_filter( 'upload_dir', 'mu_upload_dir' );
+
+function users_can_register_signup_filter() {
+        $registration = get_site_option('registration');
+        if ( $registration == 'all' || $registration == 'user' ) {
+                return true;
+        } else {
+                return false;
+        }
+}
+add_filter('option_users_can_register', 'users_can_register_signup_filter');
+
+function welcome_user_msg_filter( $text ) {
+        if ( !$text ) {
+                return __( "Dear User,
+
+Your new account is set up.
+
+You can log in with the following information:
+Username: USERNAME
+Password: PASSWORD
+LOGINLINK
+
+Thanks!
+
+--The Team @ SITE_NAME" );
+        }
+        return $text;
+}
+add_filter( 'site_option_welcome_user_email', 'welcome_user_msg_filter' );
+
+function first_page_filter( $text ) {
+        if ( !$text ) {
+                return __( "This is an example of a WordPress page, you could edit this to put information about yourself or your site so readers know where you are coming from. You can create as many pages like this one or sub-pages as you like and manage all of your content inside of WordPress." );
+        }
+        return $text;
+}
+add_filter( 'site_option_first_page', 'first_page_filter' );
+
+function first_comment_filter( $text ) {
+        if ( !$text ) {
+                return __( "This is an example of a WordPress comment, you could edit this to put information about yourself or your site so readers know where you are coming from. You can create as many comments like this one or sub-comments as you like and manage all of your content inside of WordPress." );
+        }
+        return $text;
+}
+add_filter( 'site_option_first_comment', 'first_comment_filter' );
+
+function first_comment_author_filter( $text ) {
+        if ( !$text ) {
+                return __( "Mr WordPress" );
+        }
+        return $text;
+}
+add_filter( 'site_option_first_comment_author', 'first_comment_author_filter' );
+
+function first_comment_url_filter( $text ) {
+        global $current_site;
+        if ( !$text ) {
+                return 'http://' . $current_site->domain . $current_site->path;
+        }
+        return $text;
+}
+add_filter( 'site_option_first_comment_url', 'first_comment_url_filter' );
+
+function mu_filter_plugins_list( $active_plugins ) {
+        $active_sitewide_plugins = get_site_option( 'active_sitewide_plugins' );
+
+        if ( !$active_sitewide_plugins )
+                return $active_plugins;
+        
+        $plugins = array_merge( (array) $active_plugins, array_keys( (array) $active_sitewide_plugins ) );
+        sort( $plugins );
+        return $plugins;
+}
+add_filter( 'active_plugins', 'mu_filter_plugins_list' );
+
+ /**
+ * Whether to force SSL on content.
+ *
+ * @since 2.8.5
+ *
+ * @param string|bool $force
+ * @return bool True if forced, false if not forced.
+ */
+function force_ssl_content( $force = '' ) {
+ static $forced_content;
+
+ if ( '' != $force ) {
+ $old_forced = $forced_content;
+ $forced_content = $force;
+ return $old_forced;
+ }
+ return $forced_content;
+}
+
+/**
+ * Formats an String URL to use HTTPS if HTTP is found.
+ * Useful as a filter.
+ *
+ * @since 2.8.5
+ **/
+function filter_SSL( $url) {
+        if ( !is_string( $url ) ) {
+                return get_bloginfo( 'url' ); //return home blog url with proper scheme
+        }
+
+        $arrURL = parse_url( $url );
+
+        if ( force_ssl_content() && is_ssl() ) {
+                if ( 'http' === $arrURL['scheme'] && 'https' !== $arrURL['scheme'] ) {
+                        $url = str_replace( $arrURL['scheme'], 'https', $url );
+                }
+        }
+
+        return $url;
+}
+
+function maybe_cancel_post_by_email() {
+        if ( false == defined( 'POST_BY_EMAIL' ) ) {
+                die( __( 'This action has been disabled by the administrator' ) );
+        }
+}
+add_action( 'wp-mail.php', 'maybe_cancel_post_by_email' );
+
+?>
</ins><span class="cx">Property changes on: trunk/wp-includes/ms-functions.php
</span><span class="cx">___________________________________________________________________
</span><span class="cx">Name: svn:executable
</span><span class="cx"> + *
</span></span></pre></div>
<a id="trunkwpincludesstreamsphp"></a>
<div class="addfile"><h4>Added: trunk/wp-includes/streams.php (0 => 12603)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/wp-includes/streams.php         (rev 0)
+++ trunk/wp-includes/streams.php        2010-01-06 04:02:57 UTC (rev 12603)
</span><span class="lines">@@ -0,0 +1,191 @@
</span><ins>+<?php
+/**
+ * PHP-Gettext External Library: StreamReader classes
+ *
+ * @package External
+ * @subpackage PHP-gettext
+ *
+ * @internal
+ Copyright (c) 2003, 2005 Danilo Segan <danilo@kvota.net>.
+
+ This file is part of PHP-gettext.
+
+ PHP-gettext is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ PHP-gettext is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with PHP-gettext; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+ */
+
+
+// Simple class to wrap file streams, string streams, etc.
+// seek is essential, and it should be byte stream
+class StreamReader {
+ // should return a string [FIXME: perhaps return array of bytes?]
+ function read($bytes) {
+ return false;
+ }
+
+ // should return new position
+ function seekto($position) {
+ return false;
+ }
+
+ // returns current position
+ function currentpos() {
+ return false;
+ }
+
+ // returns length of entire stream (limit for seekto()s)
+ function length() {
+ return false;
+ }
+}
+
+class StringReader {
+ var $_pos;
+ var $_str;
+
+ function StringReader($str='') {
+ $this->_str = $str;
+ $this->_pos = 0;
+ // If string functions are overloaded, we need to use the mb versions
+ $this->is_overloaded = ((ini_get("mbstring.func_overload") & 2) != 0) && function_exists('mb_substr');
+ }
+
+ function _substr($string, $start, $length) {
+        if ($this->is_overloaded) {
+                return mb_substr($string,$start,$length,'ascii');
+        } else {
+                return substr($string,$start,$length);
+        }
+ }
+
+ function _strlen($string) {
+        if ($this->is_overloaded) {
+                return mb_strlen($string,'ascii');
+        } else {
+                return strlen($string);
+        }
+ }
+
+ function read($bytes) {
+         $data = $this->_substr($this->_str, $this->_pos, $bytes);
+ $this->_pos += $bytes;
+ if ($this->_strlen($this->_str)<$this->_pos)
+ $this->_pos = $this->_strlen($this->_str);
+
+ return $data;
+ }
+
+ function seekto($pos) {
+ $this->_pos = $pos;
+ if ($this->_strlen($this->_str)<$this->_pos)
+ $this->_pos = $this->_strlen($this->_str);
+ return $this->_pos;
+ }
+
+ function currentpos() {
+ return $this->_pos;
+ }
+
+ function length() {
+ return $this->_strlen($this->_str);
+ }
+}
+
+
+class FileReader {
+ var $_pos;
+ var $_fd;
+ var $_length;
+
+ function FileReader($filename) {
+ if (file_exists($filename)) {
+
+ $this->_length=filesize($filename);
+ $this->_pos = 0;
+ $this->_fd = fopen($filename,'rb');
+ if (!$this->_fd) {
+        $this->error = 3; // Cannot read file, probably permissions
+        return false;
+ }
+ } else {
+ $this->error = 2; // File doesn't exist
+ return false;
+ }
+ }
+
+ function read($bytes) {
+ if ($bytes) {
+ fseek($this->_fd, $this->_pos);
+
+ // PHP 5.1.1 does not read more than 8192 bytes in one fread()
+ // the discussions at PHP Bugs suggest it's the intended behaviour
+ while ($bytes > 0) {
+ $chunk = fread($this->_fd, $bytes);
+ $data .= $chunk;
+ $bytes -= strlen($chunk);
+ }
+ $this->_pos = ftell($this->_fd);
+
+ return $data;
+ } else return '';
+ }
+
+ function seekto($pos) {
+ fseek($this->_fd, $pos);
+ $this->_pos = ftell($this->_fd);
+ return $this->_pos;
+ }
+
+ function currentpos() {
+ return $this->_pos;
+ }
+
+ function length() {
+ return $this->_length;
+ }
+
+ function close() {
+ fclose($this->_fd);
+ }
+
+}
+
+// Preloads entire file in memory first, then creates a StringReader
+// over it (it assumes knowledge of StringReader internals)
+class CachedFileReader extends StringReader {
+ function CachedFileReader($filename) {
+ parent::StringReader();
+
+ if (file_exists($filename)) {
+
+ $length=filesize($filename);
+ $fd = fopen($filename,'rb');
+
+ if (!$fd) {
+ $this->error = 3; // Cannot read file, probably permissions
+ return false;
+ }
+ $this->_str = fread($fd, $length);
+         fclose($fd);
+
+ } else {
+ $this->error = 2; // File doesn't exist
+ return false;
+ }
+ }
+}
+
+
+?>
</ins><span class="cx">Property changes on: trunk/wp-includes/streams.php
</span><span class="cx">___________________________________________________________________
</span><span class="cx">Name: svn:executable
</span><span class="cx"> + *
</span></span></pre></div>
<a id="trunkwpsignupphp"></a>
<div class="addfile"><h4>Added: trunk/wp-signup.php (0 => 12603)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/wp-signup.php         (rev 0)
+++ trunk/wp-signup.php        2010-01-06 04:02:57 UTC (rev 12603)
</span><span class="lines">@@ -0,0 +1,439 @@
</span><ins>+<?php
+
+/** Sets up the WordPress Environment. */
+require( dirname(__FILE__) . '/wp-load.php' );
+
+add_action( 'wp_head', 'signuppageheaders' ) ;
+
+require( 'wp-blog-header.php' );
+require_once( ABSPATH . WPINC . '/registration.php' );
+
+if( is_array( get_site_option( 'illegal_names' )) && $_GET[ 'new' ] != '' && in_array( $_GET[ 'new' ], get_site_option( 'illegal_names' ) ) == true ) {
+        wp_redirect( "http://{$current_site->domain}{$current_site->path}" );
+        die();
+}
+
+function do_signup_header() {
+        do_action("signup_header");
+}
+add_action( 'wp_head', 'do_signup_header' );
+
+function signuppageheaders() {
+        echo "<meta name='robots' content='noindex,nofollow' />\n";
+}
+
+if( $current_blog->domain . $current_blog->path != $current_site->domain . $current_site->path ) {
+        wp_redirect( "http://" . $current_site->domain . $current_site->path . "wp-signup.php" );
+        die();
+}
+
+function wpmu_signup_stylesheet() {
+        ?>
+        <style type="text/css">        
+                .mu_register { width: 90%; margin:0 auto; }
+                .mu_register form { margin-top: 2em; }
+                .mu_register .error { font-weight:700; padding:10px; color:#333333; background:#FFEBE8; border:1px solid #CC0000; }
+                .mu_register input[type="submit"],
+                        .mu_register #blog_title,
+                        .mu_register #user_email,
+                        .mu_register #blogname,
+                        .mu_register #user_name { width:100%; font-size: 24px; margin:5px 0; }        
+                .mu_register .prefix_address,
+                        .mu_register .suffix_address {font-size: 18px;display:inline; }                        
+                .mu_register label { font-weight:700; font-size:15px; display:block; margin:10px 0; }
+                .mu_register label.checkbox { display:inline; }
+                .mu_register .mu_alert { font-weight:700; padding:10px; color:#333333; background:#ffffe0; border:1px solid #e6db55; }
+        </style>
+        <?php
+}
+
+add_action( 'wp_head', 'wpmu_signup_stylesheet' );
+get_header();
+?>
+<div id="content" class="widecolumn">
+<div class="mu_register">
+<?php
+function show_blog_form($blogname = '', $blog_title = '', $errors = '') {
+        global $current_site;
+        // Blog name
+        if( constant( "VHOST" ) == 'no' )
+                echo '<label for="blogname">' . __('Blog Name:') . '</label>';
+        else
+                echo '<label for="blogname">' . __('Blog Domain:') . '</label>';
+
+        if ( $errmsg = $errors->get_error_message('blogname') ) { ?>
+                <p class="error"><?php echo $errmsg ?></p>
+        <?php }
+
+        if( constant( "VHOST" ) == 'no' ) {
+                echo '<span class="prefix_address">' . $current_site->domain . $current_site->path . '</span><input name="blogname" type="text" id="blogname" value="'.$blogname.'" maxlength="50" /><br />';
+        } else {
+                echo '<input name="blogname" type="text" id="blogname" value="'.$blogname.'" maxlength="50" /><span class="suffix_address">.' . $current_site->domain . $current_site->path . '</span><br />';
+        }
+        if ( !is_user_logged_in() ) {
+                print '(<strong>' . __( 'Your address will be ' );
+                if( constant( "VHOST" ) == 'no' ) {
+                        print $current_site->domain . $current_site->path . __( 'blogname' );
+                } else {
+                        print __( 'domain.' ) . $current_site->domain . $current_site->path;
+                }
+                echo '.</strong> ' . __( 'Must be at least 4 characters, letters and numbers only. It cannot be changed so choose carefully!)' ) . '</p>';
+        }
+
+        // Blog Title
+        ?>
+        <label for="blog_title"><?php _e('Blog Title:') ?></label>        
+        <?php if ( $errmsg = $errors->get_error_message('blog_title') ) { ?>
+                <p class="error"><?php echo $errmsg ?></p>
+        <?php }
+        echo '<input name="blog_title" type="text" id="blog_title" value="'.wp_specialchars($blog_title, 1).'" /></p>';
+        ?>
+
+        <div id="privacy">
+ <p class="privacy-intro">
+ <label for="blog_public_on"><?php _e('Privacy:') ?></label>
+ <?php _e('I would like my blog to appear in search engines like Google and Technorati, and in public listings around this site.'); ?>
+ <div style="clear:both;"></div>
+ <label class="checkbox" for="blog_public_on">
+ <input type="radio" id="blog_public_on" name="blog_public" value="1" <?php if( !isset( $_POST['blog_public'] ) || $_POST['blog_public'] == '1' ) { ?>checked="checked"<?php } ?> />
+ <strong><?php _e( 'Yes' ); ?></strong>
+ </label>
+ <label class="checkbox" for="blog_public_off">
+ <input type="radio" id="blog_public_off" name="blog_public" value="0" <?php if( isset( $_POST['blog_public'] ) && $_POST['blog_public'] == '0' ) { ?>checked="checked"<?php } ?> />
+ <strong><?php _e( 'No' ); ?></strong>
+ </label>
+ </p>
+        </div>
+        
+        <?php
+        do_action('signup_blogform', $errors);
+}
+
+function validate_blog_form() {
+        $user = '';
+        if ( is_user_logged_in() )
+                $user = wp_get_current_user();
+
+        return wpmu_validate_blog_signup($_POST['blogname'], $_POST['blog_title'], $user);
+}
+
+function show_user_form($user_name = '', $user_email = '', $errors = '') {
+        // User name
+        echo '<label for="user_name">' . __('Username:') . '</label>';
+        if ( $errmsg = $errors->get_error_message('user_name') ) {
+                echo '<p class="error">'.$errmsg.'</p>';
+        }
+        echo '<input name="user_name" type="text" id="user_name" value="'.$user_name.'" maxlength="50" /><br />';
+        _e('(Must be at least 4 characters, letters and numbers only.)');
+        ?>
+
+        <label for="user_email"><?php _e('Email&nbsp;Address:') ?></label>
+        <?php if ( $errmsg = $errors->get_error_message('user_email') ) { ?>
+                <p class="error"><?php echo $errmsg ?></p>
+        <?php } ?>                
+        <input name="user_email" type="text" id="user_email" value="<?php echo wp_specialchars($user_email, 1) ?>" maxlength="200" /><br /><?php _e('(We&#8217;ll send your password to this address, so <strong>triple-check it</strong>.)') ?>
+        <?php
+        if ( $errmsg = $errors->get_error_message('generic') ) {
+                echo '<p class="error">'.$errmsg.'</p>';
+        }
+        do_action( 'signup_extra_fields', $errors );
+}
+
+function validate_user_form() {
+        return wpmu_validate_user_signup($_POST['user_name'], $_POST['user_email']);
+}
+
+function signup_another_blog($blogname = '', $blog_title = '', $errors = '') {
+        global $current_user, $current_site;
+        
+        if ( ! is_wp_error($errors) ) {
+                $errors = new WP_Error();
+        }
+
+        // allow definition of default variables
+        $filtered_results = apply_filters('signup_another_blog_init', array('blogname' => $blogname, 'blog_title' => $blog_title, 'errors' => $errors ));
+        $blogname = $filtered_results['blogname'];
+        $blog_title = $filtered_results['blog_title'];
+        $errors = $filtered_results['errors'];
+
+        echo '<h2>' . sprintf( __('Get <em>another</em> %s blog in seconds'), $current_site->site_name ) . '</h2>';
+
+        if ( $errors->get_error_code() ) {
+                echo "<p>" . __('There was a problem, please correct the form below and try again.') . "</p>";
+        }
+        ?>
+        <p><?php printf(__("Welcome back, %s. By filling out the form below, you can <strong>add another blog to your account</strong>. There is no limit to the number of blogs you can have, so create to your heart's content, but blog responsibly."), $current_user->display_name) ?></p>
+        
+        <?php
+        $blogs = get_blogs_of_user($current_user->ID);        
+        if ( !empty($blogs) ) { ?>
+                <p>
+                        <?php _e('Blogs you are already a member of:') ?>
+                        <ul>
+                                <?php foreach ( $blogs as $blog ) {
+                                        echo "<li><a href='http://" . $blog->domain . $blog->path . "'>" . $blog->domain . $blog->path . "</a></li>";
+                                } ?>
+                        </ul>
+                </p>
+        <?php } ?>
+        
+        <p><?php _e("If you&#8217;re not going to use a great blog domain, leave it for a new user. Now have at it!") ?></p>
+        <form id="setupform" method="post" action="wp-signup.php">
+                <input type="hidden" name="stage" value="gimmeanotherblog" />
+                <?php do_action( "signup_hidden_fields" ); ?>
+                <?php show_blog_form($blogname, $blog_title, $errors); ?>
+                <p class="submit"><input type="submit" name="submit" class="submit" value="<?php _e('Create Blog &raquo;') ?>" /></p>
+        </form>
+        <?php
+}
+
+function validate_another_blog_signup() {
+        global $wpdb, $current_user, $blogname, $blog_title, $errors, $domain, $path;
+        $current_user = wp_get_current_user();
+        if( !is_user_logged_in() )
+                die();
+
+        $result = validate_blog_form();
+        extract($result);
+
+        if ( $errors->get_error_code() ) {
+                signup_another_blog($blogname, $blog_title, $errors);
+                return false;
+        }
+
+        $public = (int) $_POST['blog_public'];
+        $meta = apply_filters('signup_create_blog_meta', array ('lang_id' => 1, 'public' => $public)); // depreciated
+        $meta = apply_filters( "add_signup_meta", $meta );
+
+        wpmu_create_blog( $domain, $path, $blog_title, $current_user->id, $meta, $wpdb->siteid );
+        confirm_another_blog_signup($domain, $path, $blog_title, $current_user->user_login, $current_user->user_email, $meta);
+        return true;
+}
+
+function confirm_another_blog_signup($domain, $path, $blog_title, $user_name, $user_email = '', $meta = '') {
+        ?>
+        <h2><?php printf(__('The blog %s is yours.'), "<a href='http://{$domain}{$path}'>{$blog_title}</a>" ) ?></h2>
+        <p>
+                <?php printf(__('<a href="http://%1$s">http://%2$s</a> is your new blog. <a href="%3$s">Login</a> as "%4$s" using your existing password.'), $domain.$path, $domain.$path, "http://" . $domain.$path . "wp-login.php", $user_name) ?>
+        </p>
+        <?php
+        do_action('signup_finished');
+}
+
+function signup_user($user_name = '', $user_email = '', $errors = '') {
+        global $current_site, $active_signup;
+
+        if ( !is_wp_error($errors) )
+                $errors = new WP_Error();
+        if( isset( $_POST[ 'signup_for' ] ) ) {
+                $signup[ wp_specialchars( $_POST[ 'signup_for' ] ) ] = 'checked="checked"';
+        } else {
+                $signup[ 'blog' ] = 'checked="checked"';
+        }
+
+        // allow definition of default variables
+        $filtered_results = apply_filters('signup_user_init', array('user_name' => $user_name, 'user_email' => $user_email, 'errors' => $errors ));
+        $user_name = $filtered_results['user_name'];
+        $user_email = $filtered_results['user_email'];
+        $errors = $filtered_results['errors'];
+
+        ?>
+        
+        <h2><?php printf( __('Get your own %s account in seconds'), $current_site->site_name ) ?></h2>
+        <form id="setupform" method="post" action="wp-signup.php">
+                <input type="hidden" name="stage" value="validate-user-signup" />
+                <?php do_action( "signup_hidden_fields" ); ?>
+                <?php show_user_form($user_name, $user_email, $errors); ?>
+                
+                <p>
+                <?php if( $active_signup == 'blog' ) { ?>
+                        <input id="signupblog" type="hidden" name="signup_for" value="blog" />
+                <?php } elseif( $active_signup == 'user' ) { ?>
+                        <input id="signupblog" type="hidden" name="signup_for" value="user" />
+                <?php } else { ?>
+                        <input id="signupblog" type="radio" name="signup_for" value="blog" <?php echo $signup['blog'] ?> />
+                        <label class="checkbox" for="signupblog"><?php _e('Gimme a blog!') ?></label>        
+                        <br />                        
+                        <input id="signupuser" type="radio" name="signup_for" value="user" <?php echo $signup['user'] ?> />                        
+                        <label class="checkbox" for="signupuser"><?php _e('Just a username, please.') ?></label>
+                <?php } ?>
+                </p>
+                
+                <p class="submit"><input type="submit" name="submit" class="submit" value="<?php _e('Next &raquo;') ?>" /></p>
+        </form>
+        <?php
+}
+
+function validate_user_signup() {
+        $result = validate_user_form();
+        extract($result);
+
+        if ( $errors->get_error_code() ) {
+                signup_user($user_name, $user_email, $errors);
+                return false;
+        }
+
+        if ( 'blog' == $_POST['signup_for'] ) {
+                signup_blog($user_name, $user_email);
+                return false;
+        }
+
+        wpmu_signup_user($user_name, $user_email, apply_filters( "add_signup_meta", array() ) );
+
+        confirm_user_signup($user_name, $user_email);
+        return true;
+}
+
+function confirm_user_signup($user_name, $user_email) {
+        ?>
+        <h2><?php printf(__('%s is your new username'), $user_name) ?></h2>
+        <p><?php _e('But, before you can start using your new username, <strong>you must activate it</strong>.') ?></p>
+        <p><?php printf(__('Check your inbox at <strong>%1$s</strong> and click the link given.'), $user_email) ?></p>
+        <p><?php _e('If you do not activate your username within two days, you will have to sign up again.'); ?></p>
+        <?php
+        do_action('signup_finished');
+}
+
+function signup_blog($user_name = '', $user_email = '', $blogname = '', $blog_title = '', $errors = '') {
+        if ( !is_wp_error($errors) )
+                $errors = new WP_Error();
+
+        // allow definition of default variables
+        $filtered_results = apply_filters('signup_blog_init', array('user_name' => $user_name, 'user_email' => $user_email, 'blogname' => $blogname, 'blog_title' => $blog_title, 'errors' => $errors ));
+        $user_name = $filtered_results['user_name'];
+        $user_email = $filtered_results['user_email'];
+        $blogname = $filtered_results['blogname'];
+        $blog_title = $filtered_results['blog_title'];
+        $errors = $filtered_results['errors'];
+
+        if ( empty($blogname) )
+                $blogname = $user_name;
+        ?>
+        <form id="setupform" method="post" action="wp-signup.php">
+                <input type="hidden" name="stage" value="validate-blog-signup" />
+                <input type="hidden" name="user_name" value="<?php echo $user_name ?>" />
+                <input type="hidden" name="user_email" value="<?php echo $user_email ?>" />
+                <?php do_action( "signup_hidden_fields" ); ?>
+                <?php show_blog_form($blogname, $blog_title, $errors); ?>
+                <p class="submit"><input type="submit" name="submit" class="submit" value="<?php _e('Signup &raquo;') ?>" /></p>
+        </form>
+        <?php
+}
+
+function validate_blog_signup() {
+        // Re-validate user info.
+        $result = wpmu_validate_user_signup($_POST['user_name'], $_POST['user_email']);
+        extract($result);
+
+        if ( $errors->get_error_code() ) {
+                signup_user($user_name, $user_email, $errors);
+                return false;
+        }
+
+        $result = wpmu_validate_blog_signup($_POST['blogname'], $_POST['blog_title']);
+        extract($result);
+
+        if ( $errors->get_error_code() ) {
+                signup_blog($user_name, $user_email, $blogname, $blog_title, $errors);
+                return false;
+        }
+
+        $public = (int) $_POST['blog_public'];
+        $meta = array ('lang_id' => 1, 'public' => $public);
+        $meta = apply_filters( "add_signup_meta", $meta );
+
+        wpmu_signup_blog($domain, $path, $blog_title, $user_name, $user_email, $meta);
+        confirm_blog_signup($domain, $path, $blog_title, $user_name, $user_email, $meta);
+        return true;
+}
+
+function confirm_blog_signup($domain, $path, $blog_title, $user_name = '', $user_email = '', $meta) {
+        ?>
+        <h2><?php printf(__('Congratulations! Your new blog, %s, is almost ready.'), "<a href='http://{$domain}{$path}'>{$blog_title}</a>" ) ?></h2>
+        
+        <p><?php _e('But, before you can start using your blog, <strong>you must activate it</strong>.') ?></p>
+        <p><?php printf(__('Check your inbox at <strong>%s</strong> and click the link given. It should arrive within 30 minutes.'), $user_email) ?></p>
+        <p><?php _e('If you do not activate your blog within two days, you will have to sign up again.'); ?></p>
+        <h2><?php _e('Still waiting for your email?'); ?></h2>
+        <p>
+                <?php _e("If you haven't received your email yet, there are a number of things you can do:") ?>
+                <ul id="noemail-tips">
+                        <li><p><strong><?php _e('Wait a little longer. Sometimes delivery of email can be delayed by processes outside of our control.') ?></strong></p></li>
+                        <li><p><?php _e('Check the junk email or spam folder of your email client. Sometime emails wind up there by mistake.') ?></p></li>
+                        <li><?php printf(__("Have you entered your email correctly? We think it's %s but if you've entered it incorrectly, you won't receive it."), $user_email) ?></li>
+                </ul>
+        </p>
+        <?php
+        do_action('signup_finished');
+}
+
+// Main
+$active_signup = get_site_option( 'registration' );
+if( !$active_signup )
+        $active_signup = 'all';
+
+$active_signup = apply_filters( 'wpmu_active_signup', $active_signup ); // return "all", "none", "blog" or "user"
+
+if( is_site_admin() )
+        echo '<div class="mu_alert">' . sprintf( __( "Greetings Site Administrator! You are currently allowing '%s' registrations. To change or disable registration go to your <a href='wp-admin/wpmu-options.php'>Options page</a>." ), $active_signup ) . '</div>';
+
+$newblogname = isset($_GET['new']) ? strtolower(preg_replace('/^-|-$|[^-a-zA-Z0-9]/', '', $_GET['new'])) : null;
+
+$current_user = wp_get_current_user();
+if( $active_signup == "none" ) {
+        _e( "Registration has been disabled." );
+} elseif( $active_signup == 'blog' && !is_user_logged_in() ){
+        if( is_ssl() ) {
+                $proto = 'https://';
+        } else {
+                $proto = 'http://';
+        }
+        $login_url = site_url( 'wp-login.php?redirect_to=' . urlencode($proto . $_SERVER['HTTP_HOST'] . '/wp-signup.php' ));
+        echo sprintf( __( "You must first <a href=\"%s\">login</a>, and then you can create a new blog."), $login_url );
+} else {
+        switch ($_POST['stage']) {
+                case 'validate-user-signup' :
+                        if( $active_signup == 'all' || $_POST[ 'signup_for' ] == 'blog' && $active_signup == 'blog' || $_POST[ 'signup_for' ] == 'user' && $active_signup == 'user' )
+                                validate_user_signup();
+                        else
+                                _e( "User registration has been disabled." );
+                break;
+                case 'validate-blog-signup':
+                        if( $active_signup == 'all' || $active_signup == 'blog' )
+                                validate_blog_signup();
+                        else
+                                _e( "Blog registration has been disabled." );
+                        break;
+                case 'gimmeanotherblog':
+                        validate_another_blog_signup();
+                        break;
+                default :
+                        $user_email = $_POST[ 'user_email' ];
+                        do_action( "preprocess_signup_form" ); // populate the form from invites, elsewhere?
+                        if ( is_user_logged_in() && ( $active_signup == 'all' || $active_signup == 'blog' ) ) {
+                                signup_another_blog($newblogname);
+                        } elseif( is_user_logged_in() == false && ( $active_signup == 'all' || $active_signup == 'user' ) ) {
+                                signup_user( $newblogname, $user_email );
+                        } elseif( is_user_logged_in() == false && ( $active_signup == 'blog' ) ) {
+                                _e( "I'm sorry. We're not accepting new registrations at this time." );
+                        } else {
+                                _e( "You're logged in already. No need to register again!" );
+                        }
+                        if ($newblogname) {
+                                if( constant( "VHOST" ) == 'no' )
+                                        $newblog = 'http://' . $current_site->domain . $current_site->path . $newblogname . '/';
+                                else
+                                        $newblog = 'http://' . $newblogname . '.' . $current_site->domain . $current_site->path;
+                                if ($active_signup == 'blog' || $active_signup == 'all')
+                                        printf(__("<p><em>The blog you were looking for, <strong>%s</strong> doesn't exist but you can create it now!</em></p>"), $newblog );
+                                else
+                                        printf(__("<p><em>The blog you were looking for, <strong>%s</strong> doesn't exist.</em></p>"), $newblog );
+                        }
+                        break;
+        }
+}
+?>
+</div>
+</div>
+
+<?php get_footer(); ?>
</ins><span class="cx">Property changes on: trunk/wp-signup.php
</span><span class="cx">___________________________________________________________________
</span><span class="cx">Name: svn:executable
</span><span class="cx"> + *
</span></span></pre>
</div>
</div>
</body>
</html>